我正在使用MAMP通过PayPal沙盒进行开发和测试,从而获得了无效的IPN回报。
我已经审查了几十个与此问题相关的最新帖子,但没有找到成功的建议。
我的MAMP设置通过了PayPal测试,符合TLS 1.2和HTTP / 1.1的要求 我将2019年5月的casert.pem软件包与侦听器放在同一目录中。
“立即付款”按钮中的所有交易变量都是整数,money_format或urlencoded文本。 交易已完成。自从我开始此测试以来,沙盒IPN历史记录一直不可用,因此HTTP代码和其他数据不可用。 (其他人可以访问沙箱中的IPN历史记录吗?)
设置本质上与使用SSL在生产站点上运行的实时应用程序相同。因此,明显的区别是:MAMP而不是SSL(notify_url和返回URL是http而不是https)。但是,几个月前,我在MAMP中运行了类似的代码,没有任何问题。
通过在浏览器中打开侦听器文件并在收到正确的“返回” PDT数据后刷新它,可以快速解决此错误。实时发布时,代码会发送有关错误的电子邮件。
我的代码(保留了IPN验证后运行的应用程序代码)几乎是示例代码的副本。
<?php
$paypal_url = “'https://www.sandbox.paypal.com/cgi-bin/webscr';
$raw_post_data = file_get_contents('php://input');
$raw_post_array = explode('&', $raw_post_data);
$myPost = array();
foreach ($raw_post_array as $keyval) {
$keyval = explode ('=', $keyval);
if (count($keyval) == 2)
$myPost[$keyval[0]] = urldecode($keyval[1]);
}
// read the post from PayPal system and add 'cmd'
$req = 'cmd=_notify-validate';
if(function_exists('get_magic_quotes_gpc')) {
$get_magic_quotes_exists = true;
}
foreach ($myPost as $key => $value) {
if($get_magic_quotes_exists == true && get_magic_quotes_gpc() == 1) {
$value = urlencode(stripslashes($value));
} else {
$value = urlencode($value);
}
$req .= "&$key=$value";
}
$ch = curl_init($paypal_url);
curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $req);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
curl_setopt($ch, CURLOPT_CAINFO, dirname(__FILE__) . '/cacert.pem');
curl_setopt($ch, CURLOPT_FORBID_REUSE, 1);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Connection: Close'));
if( !($res = curl_exec($ch)) ) {
echo "curl_error($ch)";
exit:
}
if (strcmp ($res, "VERIFIED") == 0) {
echo "VERIFIED";
} elseif (strcmp ($res, “INVALID”) == 0) {
echo “INVALID”;
}
else {
echo “NO IPN”;
}
?>