这是我第一次使用Paypal处理付款。我已经设置了一个开发者帐户,创建了一些测试商家/买家帐户并成功创建了一个我发送到paypal沙箱的购物车。在这里,使用我的一个买家帐户,我可以再次成功完成购买。在paypal的帐户历史记录中,它显示交易已完成。一切都好到现在。
问题出现在返回网址中,我获得了IPN。这是我从paypal网站复制的代码。
<?php
include($_SERVER['WROOT'].'core/init.php');
//Put together postback info
$postback = 'cmd=_notify-validate';
foreach($_POST as $key =>$value){
$postback .= "&$key=$value";
}
// EMAIL $postback
// 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";
// also tried with $fp = fsockopen ('ssl://www.sandbox.paypal.com', 443, $errno, $errstr, 30);
$fp = fsockopen ('www.sandbox.paypal.com', 80, $errno, $errstr, 30);
if(!$fp){ //no conn
die();
}
//post data back
fputs($fp, $header . $postback);
while(!feof($fp)){
$res=stream_get_contents($fp, 1024);
if((strcmp($res, "VERIFIED")) == 0){
// EMAIL with a success notification
// update the database - THIS IS ONLY A SMALL TEST TO SEE IF THE TRANSACTION IS SUCCESSFUL -
$new = $dbh->prepare(" ISNERT INTO orders(txn_id) VALUES(:txn_id) ");
$new->execute(array( 'txn_id' => $_POST['txn_id'] ));
} else if ( strcmp ($res, "INVALID") == 0 ) {
// EMAIL with a error notification
// LOG THE ERROR TO A FILE
}
}
?>
好的,首先我不做任何检查,看看电子邮件,总金额和其他参数是否有效,这是我在解决这个问题后会做的事情。
无论如何,在买家支付后,我的数据库应该更新,但事实并非如此。
我做了什么?
首先,我会在创建$postback
变量后立即通过电子邮件将其发送给我。我收到了大量回复的电子邮件,所有数据都是正确的。
但$res
变量不是VERIFIED
或INVALID
,因此fsockopen()
之后的任何内容都不起作用。
正如我所说,paypal网站上的付款是成功的。文档相当差,我无法得到答案。
我想添加的一件事是我的网站没有SSL证书,但我不存储任何客户数据,所有内容都在安全的paypal网站上处理。我需要SSL证书吗?
最后一件事。我尝试使用此类https://github.com/Quixotix/PHP-PayPal-IPN,错误日志消息为Invalid response status: 302