Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Paypal IPN侦听器页面多次插入MySQL数据_Mysql_Paypal_Paypal Sandbox_Paypal Ipn - Fatal编程技术网

Paypal IPN侦听器页面多次插入MySQL数据

Paypal IPN侦听器页面多次插入MySQL数据,mysql,paypal,paypal-sandbox,paypal-ipn,Mysql,Paypal,Paypal Sandbox,Paypal Ipn,我整天都在沙箱模式下使用PayPal IPN侦听器进行实验,试图调整示例代码以供我自己使用。我对我得到的结果感到困惑——如果为发送到侦听器脚本的每个IPN插入6行数据,那么将在底部运行MySQL查询。我已经更改了查询,并复制了一个典型的数据库插入来说明我的观点——请参见代码下的表格。有什么想法吗?我肯定我记得以前在使用其他API时发生过这种情况,但肯定是一些根本原因导致了这种情况。一旦我可以验证表单是否正常工作,我当然会正确地转义数据 <?php $dbc = mysqli_connect

我整天都在沙箱模式下使用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的数据?

如果您的脚本没有向PayPal返回200 OK响应,他们的系统将继续向您的脚本发送相同的数据,直到它收到一个响应为止。如果您的脚本成功运行,除了最后出现一些小错误,可能会导致您看到的数据实际正确插入的位置,但是PayPal会不断发送通知,因此它会一次又一次地添加它

您需要确保脚本返回200 OK。在沙箱帐户中检查您的IPN历史记录,查看它在那里显示了什么

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


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

谢谢@Andrew Angell我会尝试一下,并在这里报告,即使您返回200,也可以获得副本。你必须自己检查是否有重复的。
+----+-------------------+---------------------+
| 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 |
+----+-------------------+---------------------+