mysql - Paypal IPN监听页面多次插入MySQL数据

标签 mysql paypal paypal-sandbox paypal-ipn

我一整天都在沙盒模式下试验 PayPal IPN 监听器,尝试调整示例代码以供我自己使用。我对得到的结果感到困惑 - 如果为发送到监听器脚本的每个 IPN 插入 6 行数据,则 MySQL 查询将在底部运行。我已经更改了查询并复制了一个典型的数据库插入来说明我的观点 - 请参见代码下方的表格。有任何想法吗?我确定我记得以前使用其他一些 API 时发生过这种情况,但可以肯定这将是导致它的根本原因。一旦我可以验证表单是否正常工作,我当然会正确地转义数据。

<?php
$dbc = mysqli_connect ('host', 'user', 'pass', 'db');

// read the post from PayPal system and add 'cmd'
$req = 'cmd=_notify-validate';
foreach ($_POST as $key => $value) {
$value = urlencode(stripslashes($value));
$req .= "&$key=$value";
}
// post back to PayPal system 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 ('www.sandbox.paypal.com', 80, $errno, $errstr, 30);


if (!$fp) {
// HTTP ERROR
} else {
fputs ($fp, $header . $req);
while (!feof($fp)) {
$res = fgets ($fp, 1024);
if ((stristr ($res, "VERIFIED") == 0) &&
($_POST['payment_status'] == 'Completed'))
{

// PAYMENT VALIDATED & VERIFIED!
$email = $_POST['payer_email'];

$next = mysqli_query($dbc, "INSERT INTO users (email, password) VALUES('$email', NOW() ) ");  

$to      = $email;
$subject = 'Download Area | Login credentials';
$message = '

Thank you for your purchase

Your account information
-------------------------
Email: '.$email.'
Password: 
-------------------------

You can now login at http://yourwebsite.com/PayPal/';
$headers = 'From:noreply@downloadarea.com' . "\r\n";

mail($to, $subject, $message, $headers);

}

我从一个IPN得到的数据如下:

+----+-------------------+---------------------+
| id | email             | password            |
+----+-------------------+---------------------+
| 25 | testing@gmail.com | 2013-07-03 17:15:58 |
+----+-------------------+---------------------+
| 26 | testing@gmail.com | 2013-07-03 17:15:58 |
+----+-------------------+---------------------+
| 27 | testing@gmail.com | 2013-07-03 17:15:58 |
+----+-------------------+---------------------+
| 28 | testing@gmail.com | 2013-07-03 17:15:58 |
+----+-------------------+---------------------+
| 29 | testing@gmail.com | 2013-07-03 17:15:59 |
+----+-------------------+---------------------+
| 30 | testing@gmail.com | 2013-07-03 17:15:59 |
+----+-------------------+---------------------+

为什么要为此 IPN 多次插入数据?

最佳答案

如果您的脚本没有向 PayPal 返回 200 OK 响应,他们的系统将继续向您的脚本发送相同的数据,直到它收到一个响应。如果您的脚本成功运行,除了末尾的一些小错误外,它可能会导致您在实际插入数据的地方看到的结果,但随后 PayPal 会继续发送通知,因此它会不断添加它。

您需要确保您的脚本返回 200 OK。在沙盒帐户中检查您的 IPN 历史记录以查看它在那里显示的内容。

我喜欢在浏览器中进行测试,这样我就可以在屏幕上看到结果并排除任何问题。为此,创建一个基本的 HTML 表单,其中包含与您希望从 IPN 返回的字段相匹配的隐藏字段。将表单的操作设置为您的 IPN 脚本,然后您可以加载它并在浏览器中提交它,这样您就可以在屏幕上看到结果。一旦你成功地完成了这项工作,并且只将一个项目插入到数据库中,那么你就可以放心,它将以与 PayPal 相同的方式工作。

请记住,在以这种方式进行测试时,数据将未经验证,因为它实际上并非来自 PayPal,因此您需要相应地调整代码(取决于您处理未经验证的 IPN 的方式)以进行测试目的。

关于mysql - Paypal IPN监听页面多次插入MySQL数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17453442/

相关文章:

mysql - 加入具有多个引用和两个要添加的值的两个表

php - Paypal信用卡支付整合问题

javascript - 安全 header 在 PayPal Mass Payments 中无效

php - Paypal IPN 回调不适用于沙箱

android - 解析JSONArray并在android中的ListView中显示数据

Mysql子字符串并将诸如...之类的字符附加到结果命令

java - 无法连接到 mysql 中的特定模式

paypal - 如何检查输入的电子邮件 ID 是否已在 Paypal 注册?

paypal - 如何使用新的 PayPal 结帐页面?

Paypal 立即购买按钮进入沙盒帐户登录页面