我正在实施PayPal IPN&太平洋夏令时。经过一番头痛之后在沙箱中的时间,IPN运行良好,PDT返回正确的$ _GET数据。实施如下:
一切运作良好,除了当使用PayPal就绪的PDT代码进行返回POST时,页面挂起。用户永远不会回到我的网站。我没有获得失败状态,只是一无所获。有趣的是,一旦发生未知错误,我的测试域会在短时间内无响应。
代码(PHP):https://www.paypal.com/us/cgi-bin/webscr?cmd=p/xcl/rec/pdt-code-outside
如果我将POST注释回来,一切正常。一旦代码进入while {}循环,我就可以解决问题。不幸的是,我没有足够的经验从头开始为PayPal代码编写替代品,所以非常感谢任何可能出错的想法。
POST回到ssl://www.sandbox.paypal.com,我正在使用按钮代码和授权令牌,这些都是通过沙箱测试帐户创建的。
提前致谢。
更新
我已将问题缩小到这一行:$line = fgets($fp, 1024);
它只是挂起,我不知道为什么。
答案 0 :(得分:1)
<强>解决:强>
切换到cURL可以解决所有问题。这是代码,以防有人来到这里,并像我一样绝望:
// Prepare data
$req = 'cmd=_notify-synch';
$tx_token = $_GET['tx'];
$auth_token = '<-- your token (sandbox or live) -->';
$req .= '&tx='.$tx_token.'&at='.$auth_token;
// Post back to PayPal to validate
$c = curl_init('https://www.sandbox.paypal.com/cgi-bin/webscr'); // SANDBOX
curl_setopt($c, CURLOPT_POST, true);
curl_setopt($c, CURLOPT_POSTFIELDS, $req);
curl_setopt($c, CURLOPT_RETURNTRANSFER, true);
$contents = curl_exec($c);
$response_code = curl_getinfo($c, CURLINFO_HTTP_CODE);
curl_close($c);
if(!$contents || $response_code != 200) {
// HTTP error or bad response, do something
} else {
// Check PayPal verification (FAIL or SUCCESS)
$status = substr($contents, 0, 4);
if($status == 'FAIL') {
// Do fail stuff
} elseif($status == 'SUCC') {
// Do success stuff
}
}
从技术上讲,substr()不检查“SUCCESS”而是“SUCC”。但是,鉴于只有“SUCCESS”或“FAIL”是可能的值,它并不重要。
同样的代码也适用于IPN,并有明显的微小修改。