gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 01:23:40 26 4
gpt4 key购买 nike

跟进 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);
}
?>

最佳答案

您必须更进一步并实现 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 变量之前验证和清理它们。

编辑

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

  • 仔细阅读变量引用。您可以使用几个字段来识别订阅(自定义、发票、商品编号)。
  • 您将在订阅的多个阶段收到多个 IPN,包括订阅本身、第一笔付款、后续付款以及订阅终止时。
  • 随每种付款方式变化而传递的变量。您必须彻底查阅文档,以确定您应该为每种类型的 IPN 检查哪些字段。

关于php - 当我收到 PayPal IPN 时,我应该在哪里执行 UPDATE 查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9562753/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com