我正在把paypal结账放到我的网站上,但是我被听众摔倒了。对于那些不熟悉Paypal IPN系统的人来说,基本上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.1rn";
$header .= "Host: www.sandbox.paypal.comrn";
$header .= "Content-Type: application/x-www-form-urlencodedrn";
$header .= "Content-Length: " . strlen($postback) . "rnrn";
$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);
}
}
}
?>
提前感谢!
切换到使用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);
所以我想我找到了一个解决方案。事实证明,连接到ssl://sandbox....没有问题,它实际上是在检索答案。代码被挂在
上while(!feof($fp)){
$res=fgets($fp,1024);
}
。我所做的只是将它替换为:
$res=stream_get_contents($fp, 1024);
第一次就成功了!现在我可以继续我的生活了。再次感谢你的帮助
可能原始代码丢失了:$header .= "Connection: closernrn";
注意,Paypal示例代码使用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和HTTPS的端口是不同的,80而不是443。我不太熟悉Paypal的API,但我可以看看它,因为我看到你正在使用80。
PayPal测试服务器移至:
$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以上。
访问链接