当我收到 PayPal IPN 时,我应该在哪里执行 UPDATE 查询?

     2023-02-22     280

关键词:

【中文标题】当我收到 PayPal IPN 时,我应该在哪里执行 UPDATE 查询?【英文标题】:Where should I execute an UPDATE query when I receive PayPal IPN? 【发布时间】:2012-03-22 16:40:48 【问题描述】:

跟进my previous newbie question about Paypal,我有一个新的新手问题。

我已经成功地设置了一个 Paypal 沙箱,并在我的服务器上实现了一个 PHP“侦听器”,当我测试我的 Paypal 支付按钮时,一切似乎都运行良好。所以看来我已经掌握了支付系统的基本骨架。

现在我有点困惑如何将它带到下一步根据我的需要进行定制。

为了设置监听器,我复制了the code offered on Paypal's site。我的希望和假设是,我可以在该代码中找到 Paypal 告诉我付款已到的位置。

但是,我不清楚这一点在哪里。如果我根据付费或未付费设置某种“if”语句,我看不出我会测试什么值。

我想要做的就是如果 Paypal 告诉我此人已付款,那么我的 MySQL 数据库中的一个标志将被标记为“已付款”。应该是定期付款,所以如果下次自动付款失败,那么数据库中的标志应该被标记为“未付款”。

他们的代码中是否有一个地方可以用作添加我自己的自定义操作的起点?还是我需要完全使用其他代码库?

作为参考,这里是有问题的 PHP 代码:

<?php

error_reporting(E_ALL ^ E_NOTICE);
$email = $_GET['ipn_email'];
$header = "";
$emailtext = "";
// Read the post from PayPal and add 'cmd'
$req = 'cmd=_notify-validate';
if (function_exists('get_magic_quotes_gpc'))

    $get_magic_quotes_exists = true;

foreach ($_POST as $key => $value)
// Handle escape characters, which depends on setting of magic quotes

    if ($get_magic_quotes_exists == true && get_magic_quotes_gpc() == 1)
    
        $value = urlencode(stripslashes($value));
    
    else
    
        $value = urlencode($value);
    
    $req .= "&$key=$value";

// Post back to PayPal to validate
$header .= "POST /cgi-bin/webscr HTTP/1.0\r\n";
$header .= "Content-Type: application/x-www-form-urlencoded\r\n";
$header .= "Content-Length: " . strlen($req) . "\r\n\r\n";
$fp = fsockopen('ssl://www.paypal.com', 443, $errno, $errstr, 30);


// Process validation from PayPal
// TODO: This sample does not test the HTTP response code. All
// HTTP response codes must be handles or you should use an HTTP
// library, such as cUrl

if (!$fp)
 // HTTP ERROR

else

// NO HTTP ERROR
    fputs($fp, $header . $req);
    while (!feof($fp))
    
        $res = fgets($fp, 1024);
        if (strcmp($res, "VERIFIED") == 0)
        
            // TODO:
            // Check the payment_status is Completed
            // Check that txn_id has not been previously processed
            // Check that receiver_email is your Primary PayPal email
            // Check that payment_amount/payment_currency are correct
            // Process payment
            // If 'VERIFIED', send an email of IPN variables and values to the
            // specified email address
            foreach ($_POST as $key => $value)
            
                $emailtext .= $key . " = " . $value . "\n\n";
            
            mail($email, "Live-VERIFIED IPN", $emailtext . "\n\n" . $req);
        
        else if (strcmp($res, "INVALID") == 0)
        
            // If 'INVALID', send an email. TODO: Log for manual investigation.
            foreach ($_POST as $key => $value)
            
                $emailtext .= $key . " = " . $value . "\n\n";
            
            mail($email, "Live-INVALID IPN", $emailtext . "\n\n" . $req);
        
    
    fclose($fp);

?>

【问题讨论】:

【参考方案1】:

您必须更进一步并实施 TODO 步骤。

现在,PayPal 有一个名为 item_number 的标准传递字段。您可以使用该字段来传递数据库的订单 ID:

<input type="hidden" name="item_number" value="<?php echo $OrderID ?>">

由于它是一个传递变量,因此 PayPal 将在 IPN 中回显此变量的值。因此,在您验证 IPN 并查看 TODO 列表后,请更新您的数据库:

// if ($_POST["payment_status"] == "Completed"
// &&  $_POST["receiver_email"] == the_email_you_use_in_business_field
// &&  etc etc
// )
"UPDATE Orders SET paid = 1 WHERE OrderID = $_POST[item_number]"

在数据库查询中使用 POST 变量之前对其进行验证和清理。

HTML Variables for Website Payments Standard -- 您通过 HTML 表单发送到 PayPal 的变量 IPN and PDT Variables -- 您在 IPN 中收到的变量

编辑

我现在看到您想要处理定期付款。看起来并不直截了当:

仔细检查变量引用。您可以使用几个字段来识别订阅(custom、invoice、item_number)。 您将在订阅的多个阶段收到多个 IPN,包括订阅本身、首次付款、后续付款以及订阅终止的时间。 随着每种类型的付款更改传递的变量。您必须彻底查阅文档,以确定应针对每种类型的 IPN 检查哪些字段。

【讨论】:

【参考方案2】:

把你的数据库相关代码放在里面:

if (strcmp($res, "VERIFIED") == 0) //your database query here

【讨论】:

【参考方案3】:

你有这个cmets:

> // TODO:
>             // Check the payment_status is Completed
>             // Check that txn_id has not been previously processed
>             // Check that receiver_email is your Primary PayPal email
>             // Check that payment_amount/payment_currency are correct
>             // Process payment
>             // If 'VERIFIED', send an email of IPN variables and values to the
>             // specified email address

把你的代码放在这里:

   if (strcmp($res, "VERIFIED") == 0)
   

    ...

    

【讨论】:

PayPal 难以捉摸的 IPN 历史在哪里?

...以进行验证。我正在使用IPN模拟器对其进行测试,它总是收到INVALID。所以我已经完成了大部分工 查看详情

PayPal IPN - 排队

...付款,直到今天它们都很好。我没有收到来自paypal的IPN,当我查看IPN通知历史记录时,所有消息都显示为Queued如果我重新发送状态为已发送的IPN,我会收到罚款但没有新的通过。我检查了服务器上的错误日志,没有收到任何编码... 查看详情

PayPal 订阅 - 缺少 PDT 发票

...示“感谢购买!”页面和IPN以维护订阅状态。一切顺利。当我收到PDT和IPN回调时,PayPal会向我发送一条成功消息(更改值以保护无辜者 查看详情

Paypal IPN - 区分定期付款和初始付款

...我已在Paypal上创建了定期付款资料,并设置了初始付款。当我收到IPN时,初始付款和定期付款的txn_id相同。我想知道是否有办法区分它们。我注意到,当我收到定期付款时,有这个变量“pe 查看详情

PayPal IPN 已验证握手但 IPN 无效

...【问题描述】:我在使用“旧”PayPalIPN代码时遇到问题。当我使用PayPalIPN模拟器时,我收到消息IPNwassentandthehandshakewasverified.,但在我的日志中我可以看到IPN消息是Invalid我已经检查了以下内容: 查看详情

Paypal Ipn 取消撤销

...何东西,然后我想问一下。问题在于Canceled_Reversal状态。当我得到这个状态时,我如何检查我们是赢了还是输了?因为我发现这意味着胜利/失败当我得到这个状态之后会不会有一个完整的状态?我认为我应该做什么我需要它是因... 查看详情

在哪里使用新的 Paypal UI 为 Paypal 定期付款设置 IPN URL?

】在哪里使用新的PaypalUI为Paypal定期付款设置IPNURL?【英文标题】:WheretosetIPNURLforPypalRecurringpaymentsusingnewPaypalUI?【发布时间】:2018-09-1614:14:31【问题描述】:我发现应该在Paypal帐户设置中设置定期付款的IPNURL。我找到了旧的Paypal... 查看详情

PayPal IPN 沙盒不工作,但模拟器可以

...:2013-12-0600:58:39【问题描述】:更新#1:我找到了问题,当我使用模拟器时,$res变量的字符串应该是“已验证”,因为它是从标题中分解出来的当我使用沙箱时,情况似乎并非如此,标题保留在该变量中。我能做什么?我已使用... 查看详情

在 PayPal Sandbox 中没有收到对侦听器的 IPN 响应

】在PayPalSandbox中没有收到对侦听器的IPN响应【英文标题】:NotgettingIPNresponsetolistenerinPayPalSandbox【发布时间】:2015-06-1120:34:10【问题描述】:我在PayPal沙盒按钮中创建了一个递归支付按钮。但是在付款后从PayPal支付返回测试账户... 查看详情

Paypal 自适应支付和 IPN

...。除了IPN,一切都很好。在沙盒模式下使用Paypal时,我会收到一条通知到我的URL。但是,一旦我上线,我就没有收到对我的服务器的IPNPOST请求。我检查了我的Apacheaccess.log。我需要在 查看详情

无法接收 PayPal IPN - PayPal 总是收到 403 错误

】无法接收PayPalIPN-PayPal总是收到403错误【英文标题】:CannotreceivePayPalIPN-PayPalalwaysgetsa403error【发布时间】:2015-11-3005:57:27【问题描述】:我正在尝试在wordpress应用程序中接收IPN消息(以了解付款发生的时间)。Wordpress在linux/apach... 查看详情

Paypal IPN:如果我的听众在收到 IPN 后没有发回确认,会发生啥?

】PaypalIPN:如果我的听众在收到IPN后没有发回确认,会发生啥?【英文标题】:PaypalIPN:Whathappensifmylistenerdoesn\'tsendbackacknowledgementuponreceivingtheIPN?PaypalIPN:如果我的听众在收到IPN后没有发回确认,会发生什么?【发布时间】:2021-1... 查看详情

在 PHP 中使用 PayPal IPN 访问被拒绝的 Renspose

...此服务器上的“/cgi-bin/webscr”。实际上我处于沙盒模式,当我进入IPN模拟器时,答案是成功 查看详情

PayPal 没有向听众发送 IPN

...【问题描述】:我在我的沙盒帐户的通知下设置了IPNURL。当我测试付款时,在IPN历史记录下没有发现任何东西。似乎SandboxPayPal没有将IPN发送给听众。当我使用IPN模拟器进行测试时,它工作正常。任何提示为什么它不工作【问题... 查看详情

从 PayPal 的沙盒 IPN 获得无效响应

...线支付系统,但是我已经尝试了我所知道的一切,但仍然收到无效响应。我知道这并不简单,因为我在使用IPN模拟器时会收到VERIFIED响应。我已经尝试先将这些项目放入一个字典中,我已经尝试修复编 查看详情

用于电子支票的 PayPal IPN

...送IPN通知?我正在PayPalSandbox中测试电子支票交易。应用收到电子支票交易通知,payment_status为“Pending”。从PayPal帐户手动清除交易后,该应用没有收到任何通知。我期待第二个IPN通知,其txn_i 查看详情

PayPal IPN 反复运行

...子邮件通知)。我的插件的一些用户报告说他们在几天内收到了多份此电子邮件通知。我在开发插件时很早就发现了这个问题,我找到的解决方案是立即向P 查看详情

Django-Paypal IPN 403 错误

...pn模拟器收到403错误-有人知道为什么会发生这种情况吗?当我直接导航到监听器url时没有错误。我向侦听器添加了@c 查看详情