贝宝IPN返回HTTP / 1.1 200 OK
-
25-09-2019 - |
题
我测试集成了一个网站,贝宝,使用Web标准支付和HTML变量。
我已经写一个简单的PHP脚本来处理IPN通知。
按照贝宝文档一>,贝宝服务器响应以一个简单的 '的 VERIFIED 强>' 或 '的 INVALID 强>' 响应,一旦你ping到接收到的数据回PayPal。
在我的处理程序中,我做这些两个关键字的情况下,敏感的字符串比较,如果未发现这些已知的关键字中的任一个,那么它被视为错误。
<?php
$fp = fsockopen ($socket_url, 80, $errno, $errstr, 10);
if (!$fp){
// SOCKET ERROR
return false;
}
else {
fputs ($fp, $header . $req);
$is_ok = false;
while (!feof($fp)) {
$res = fgets ($fp, 1024);
if (strcmp("VERIFIED",$this->ipn_response)==0) {
//do something ...
}
// if the IPN POST was 'INVALID'
else if (strcmp ($res, "INVALID") == 0) {
fclose ($fp);
return false;
}
else {
echo "Unknown response from Paypal: $res";
fclose ($fp);
return false;
}
}
fclose ($fp);
return true;
}
?>
我的错误消息显示,我接收来自贝宝一个 'HTTP / 1.1 200 OK' 响应。
从贝宝未知响应: 'HTTP / 1.1 200 OK'
的贝宝API改变,还是我做错了什么?
解决方案
PayPal的响应是在HTTP响应的主体中。你需要处理的HTTP标头,然后才能在身体得到。或者,交替,只是不停地念台词,直到找到一个空行,下一行定身。
其他提示
对不起,我的原始响应真的严重措词:)
与fgets仅读取一行行,第一行是所述HTTP响应。你的代码永远不会给人机会继续读书,但是,作为第一线处理后,你会出错误,。
我倾向于喜欢的东西来代替while循环:
while (!feof($fp)) {
$res = trim(fgets($fp, 1024));
if (strcmp($res, "VERIFIED")==0) {
//do something ...
}
else if (strcmp($res, "INVALID") == 0) {
fclose ($fp);
return false;
}
}
由于@Mike说,你看整个身体 - 你的情况,你只是测试,如果VERIFIED
或INVALID
出现在第一个1024个字节的答复,这可能是头部的
顺便说一句,你不需要使用fsockopen()
,大多数人做的,因为贝宝使用它,这样它在旧箱的设置提供了一个例子。卷曲或用HTTP POST方面会做的工作就好了file_get_contents
,这里是一个例子,我编码的的 phunction PHP框架 强>:
public static function PayPal($email, $status = 'Completed', $sandbox = false)
{
if (preg_match('~^(?:.+[.])?paypal[.]com$~', gethostbyaddr($_SERVER['REMOTE_ADDR'])) > 0)
{
$url = ($sandbox !== true) ? '' : '.sandbox';
$result = self::CURL('https://www' . $url . '.paypal.com/cgi-bin/webscr/', array_merge(array('cmd' => '_notify-validate'), $_POST), 'POST');
if ($result == 'VERIFIED')
{
$email = strlen($email) * strcasecmp($email, $_POST['receiver_email']);
$status = strlen($status) * strcasecmp($status, $_POST['payment_status']);
if (($email == 0) && ($status == 0))
{
return true;
}
}
}
return false;
}
不隶属于 StackOverflow