未收到PayPal IPN沙箱的回复
-
25-10-2019 - |
题
我正在将贝宝结帐到我的网站上,但正在与听众崩溃。对于那些不熟悉PayPal IPN系统的人,基本上,PayPal将您的脚本发送有关交易的消息,您将其发送回几个位。如果PayPal收到了正确的答复,则会以“验证”回复,如果没有,则说“无效”。
我已经成功了。我的代码能够从PayPal接收信息,添加附加功能并将其发布回。但是,我没有从沙盒中得到的回应,说“已验证”或“无效”。我几乎从PayPal网站复制了我的代码。
这是代码。没什么特别的,它实际上只是获取信息,调整它,将其传递回去并读取响应(它没有得到或没有意识到它正在得到)
<?php
$debug=true;
//Put together postback info
$postback = 'cmd=_notify-validate';
foreach($_POST as $key =>$value){
$postback .= "&$key=$value";
}
// build the header string to post back to PayPal system to validate
$header = "POST /cgi-bin/webscr HTTP/1.1\r\n";
$header .= "Host: www.sandbox.paypal.com\r\n";
$header .= "Content-Type: application/x-www-form-urlencoded\r\n";
$header .= "Content-Length: " . strlen($postback) . "\r\n\r\n";
$fp = fsockopen ('www.sandbox.paypal.com', 80, $errno, $errstr, 30);//open the connection
if(!$fp){ //no conn
die();
}
//post data back
fputs($fp, $header . $postback);
while(!feof($fp)){
$res=fgets ($fp, 1024);
if((strcmp($res, "VERIFIED")) == 0){ //verified!
if($debug){
$filename = 'debug/debug5_verified.txt'; //create a file telling me we're verified
$filehandle=fopen($filename, 'w');
fwrite($filehandle,'VERIFIED!');
fclose($filehandle);
}
}
}
?>
提前致谢!
解决方案 2
所以我想我找到了解决方案。事实证明,连接到ssl:// sandbox ....实际上是在检索答案并没有麻烦。代码挂在
while(!feof($fp)){
$res=fgets($fp,1024);
}
少量。我所做的就是将其替换为:
$res=stream_get_contents($fp, 1024);
它第一次工作!现在我可以继续生活。再次感谢您对此的所有帮助。
其他提示
切换到使用HTTPS URL,我不确定什么时候,但是最近我的所有测试脚本都开始在普通的HTTP版本上失败。他们看起来正在迁移。
我正在使用与您相同的PayPal示例代码:
$fp = fsockopen ('ssl://www.sandbox.paypal.com', 443, $errno, $errstr, 30);
或者
$fp = fsockopen ('ssl://www.paypal.com', 443, $errno, $errstr, 30);
也许原始代码丢失了:$header .= "Connection: close\r\n\r\n";
请注意贝宝 示例代码 使用HTTP/1.0,因此没有该行。 HTTP/1.1很好,但可能需要该行。
在另一个问题上,沙箱可能不再支持端口80。我将302重定向到 https://www.sandbox.paypal.com.
我注意到您发布的URL与下面有所不同,是吗?
这是来自IPN测试帮助页面:
检查您是否正在发布对正确URL的响应,即 https://www.sandbox.paypal.com/cgi-bin/webscr 或者 https://www.paypal.com/cgi-bin/webscr, ,取决于您是在沙箱中测试还是分别是现场测试。
验证您的响应是否包含相同的IPN变量和相同顺序的值,然后再用cmd = _notify-validate。
确保您编码响应字符串,并使用与原始消息相同的字符编码。
编辑:对不起,我还想提及HTTP和HTTP的端口不同,而443.我对PayPal API并不熟悉,但是当我看到您使用80时,我可以研究它。
贝宝测试服务器移至:
$fp = fsockopen('ssl://ipnpb.paypal.com', 443, $errno, $errstr, 30);
检查PHP版本TLS插座。从沙箱帐户中获取响应应该是TLS 1.2。将PHP版本升级到5.5,以获取TLS 1.2套接字。
PayPal已禁用SSLV3的服务,并更改为TLS 1.2。
如果您需要获得响应,则PHP版本必须需要TLS 1.2,才能将TLS 1.2 PHP升级到5.5或更多。
参观 关联.