收到 PayPal IPN 后如何更新数据库

Posted

技术标签:

【中文标题】收到 PayPal IPN 后如何更新数据库【英文标题】:How to update database after receiving PayPal IPN 【发布时间】:2020-05-05 14:45:10 【问题描述】:

在收到 PayPal IPN 后,我正在尝试一个简单的侦听器来更新我的用户信息数据库(例如将他们的帐户类型从免费设置为高级)。检查 IPN 历史记录后,IPN 已成功发送到我的侦听器,但似乎无法更新我的数据库。我想在 VERIFIED 部分使用我的用户正在使用的 SESSION ID 更新用户的帐户类型。我使用的 listener.php 来自我关注的教程视频。

代码如下:

session_start();

require 'scr/db.inc.php';

header('HTTP:/1.1 200 OK');

$resp = "cmd=_notify-validate";
foreach ($_POST as $parm => $var) 
    $var = urlencode (stripslashes($var));
    $resp .= "&$parm=$var";


$item_name          = $_POST['item_name'];
$item_number        = $_POST['$item_number'];
$payment_status     = $_POST['$payment_status'];
$payment_amount     = $_POST['$payment_amount'];
$payment_currency   = $_POST['$payment_currency'];
$txn_id             = $_POST['$txn_id'];
$receiver_email     = $_POST['$receiver_email'];
$payer_email        = $_POST['$payer_email'];
$record_id          = $_POST['$record_id'];

$httphead = "POST /cgi-bin/webscr HTTP/1.0\r\n";
$httphead .= "Content-Type: application/x-www-form-urlencoded\r\n";
$httphead .= "Content-Length: " .strlen($resp) . "\r\n\r\n";

$errno = '';
$errstr = '';

$fh = fsockopen ('ssl:www.paypal.com',443,$errno,$errstr,30);

if (!$fh) 

 else 
    fputs ($fh, $httphead . $resp);
    while (!feof($fh)) 
        $readresp = fgets ($fh, 1024);
        if(strcmp ($readresp, "VERIFIED") == 0 ) 

           $handler = new Dbh();

           $sql = 'UPDATE `users` SET `type` = "PREMIUM" WHERE `id`  = :id ';
           $query = $handler->connect()->prepare($sql);
           $query->execute(array(':id'=>$_SESSION['log_id']));

         else if (strcmp ($readresp, "INVALID") == 0) 

        
    
fclose($fh);        



?>

我只是在其中添加了几行以希望更新数据库。这些是那些行:

session start();
require 'scr/db.inc.php';
.
.
.
.
$handler = new Dbh(); // used to connect to database

$sql = 'UPDATE `users` SET `type` = "PREMIUM" WHERE `id`  = :id ';
$query = $handler->connect()->prepare($sql);
$query->execute(array(':id'=>$_SESSION['log_id']));
.
.
.
.

【问题讨论】:

什么是$Dbh变量? @GiacomoM Dbh 是我使用处理程序调用的类以连接到我的数据库 由于您无法更新数据库,因此问题可能就在那里。编辑您的问题以添加信息,否则我们无法帮助您 【参考方案1】:

当 PayPal 服务器调用您的 IPN 侦听器时,它会在自己和您的网络服务器之间启动自己的迷你“会话”。您的用户的 Web 浏览器不是 PayPal 和您的服务器之间的这种直接 HTTP 通信的一方,因此您的用户浏览器与您的服务器的任何 Web 会话详细信息都将不可用。

如果您需要在处理 IPN 时提供 ID,则需要使用 INVNUM 或 CUSTOM 等变量将其作为交易的一部分传递给 PayPal。

当您写入数据库时​​,您需要从$_POST 的 IPN 消息正文中获取适当的变量(来自$_SESSION,这绝对没有任何价值)


旁注:每当我看到 IPN 在服务器上像这样异步使用时,我不禁注意到一个更好、更健壮的集成是集成一个服务器端模式,该模式从服务器端同步捕获,因此得到事务成功/失败的即时 API 响应,用户 $_SESSION 处于活动状态。这是一个 demo pattern of the UI 和后端 v2/orders server-side calls

【讨论】:

我使用自定义来传递变量并且它有效!谢谢!

以上是关于收到 PayPal IPN 后如何更新数据库的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 paypal IPN 并更新 sql 查询?

PayPal IPN 有时不更新数据库

Django-Paypal IPN 403 错误

Paypal 订阅 IPN 自定义变量

PayPal IPN 更新以适应 HTTP1.1 - 对等方重置连接

PayPal IPN SSL 协议版本