我一直在沙盒模式下使用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多次插入数据?
答案 0 :(得分:2)
如果您的脚本没有将200 OK响应返回给PayPal,他们的系统将继续将相同的数据发布到您的脚本,直到它获得一个。如果您的脚本成功运行,除了最后的一些小错误,它可能会导致您看到数据实际正确插入的位置,但随后PayPal会不断发送通知,以便一次又一次地添加它。
您需要确保您的脚本返回200 OK。检查沙箱帐户中的IPN历史记录,查看它在那里显示的内容。
我喜欢在浏览器中测试,因此我可以在屏幕上看到结果并清除任何问题。为此,请创建一个基本HTML表单,其中包含与您希望从IPN返回的字段匹配的隐藏字段。将表单的操作设置为您的IPN脚本,然后您可以加载它并在浏览器中提交它,以便您可以在屏幕上看到结果。一旦你没有失败地工作并且只将一个项目插入数据库,那么你可以放心它将从PayPal以相同的方式工作。
在测试时,请记住数据未经验证,因为它实际上并非来自PayPal,因此您需要相应地调整代码(取决于您处理未经验证的IPN的方式)以进行测试目的。