收到 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 后如何更新数据库的主要内容,如果未能解决你的问题,请参考以下文章