2013-07-03 62 views
0

我一直在沙箱模式下一直在试用PayPal IPN侦听器,试图调整我自己使用的示例代码。我对我得到的结果感到困惑 - 如果为发送到侦听器脚本的每个IPN插入6行数据,MySQL查询将在底部运行。我已经改变了查询,并重现了一个典型的数据库插入来说明我的观点 - 请参阅代码下方的表格。有任何想法吗?我确信我还记得以前发生过的其他一些API,但确定它会是造成它的根本原因。一旦我可以验证表单正在工作,我当然会将数据正确地转义出来。Paypal IPN监听器页面多次插入MySQL数据

<?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:[email protected]' . "\r\n"; 

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

} 

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

+----+-------------------+---------------------+ 
| id | email    | password   | 
+----+-------------------+---------------------+ 
| 25 | [email protected] | 2013-07-03 17:15:58 | 
+----+-------------------+---------------------+ 
| 26 | [email protected] | 2013-07-03 17:15:58 | 
+----+-------------------+---------------------+ 
| 27 | [email protected] | 2013-07-03 17:15:58 | 
+----+-------------------+---------------------+ 
| 28 | [email protected] | 2013-07-03 17:15:58 | 
+----+-------------------+---------------------+ 
| 29 | [email protected] | 2013-07-03 17:15:59 | 
+----+-------------------+---------------------+ 
| 30 | [email protected] | 2013-07-03 17:15:59 | 
+----+-------------------+---------------------+ 

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

回答

2

如果您的脚本没有将200 OK响应返回给PayPal,他们的系统将继续将相同的数据发布到您的脚本,直到它获得一个。如果你的脚本运行成功,除了最后的一些小错误,它可能会导致你所看到的数据实际插入的位置正确,但是PayPal会不断发送通知,以便一直重复添加。

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

我喜欢在浏览器中进行测试,以便在屏幕上看到结果并清除任何问题。为此,请创建一个隐藏字段的基本HTML表单,该字段与您希望从IPN获取的字段相匹配。将表单的动作设置为您的IPN脚本,然后您可以加载并在浏览器中提交,以便您可以在屏幕上看到结果。一旦你有这个工作没有失败,只有一个项目插入数据库,那么你可以放心,它将以同样的方式从贝宝工作。

请记住,在测试数据时,由于数据并非实际来自PayPal,所以您需要根据您的代码(取决于您如何处理未验证的IPN)对数据进行相应的验证测试目的。

+0

谢谢@Andrew Angell我会试试看,并在这里报告 – Welly

+0

即使你返回200,你也可以获得重复。你必须自己检查重复。 – EJP