我正在使用通过PDT和IPN执行的以下功能(出于可靠性考虑,我同时使用这两种方法,即如果客户未自动返回我的网站,则PDT无法使用,这就是为什么我将IPN方法用作后备)。
function paypal_verify() {
global $CONFIG;
$txn_id = isset($_GET['tx']) ? $_GET['tx'] : ''; /* come via PDT */
if (isset($_POST['txn_id'])) {
$txn_id = $_POST['txn_id']; /* come via IPN */
}
if (!preg_match('#^[a-z\d]{17}$#iD', $txn_id)) {
return false;
}
if ($CONFIG['test']) {
$pp_hostname = 'www.sandbox.paypal.com';
} else {
$pp_hostname = 'www.paypal.com';
}
$req = "cmd=_notify-synch&tx={$txn_id}&at={$CONFIG['identity_token']}";
$header = "POST /cgi-bin/webscr HTTP/1.1\r\n";
$header .= "Content-Type: application/x-www-form-urlencoded\r\n";
$header .= "Host: {$pp_hostname}\r\n";
$header .= "Connection: close\r\n";
$header .= "Content-Length: " . strlen($req) . "\r\n\r\n";
$fp = fsockopen("ssl://{$pp_hostname}", 443, $errno, $errstr, 30);
if (!$fp) {
return false;
} else {
fputs ($fp, $header . $req);
$res = '';
$header_done = false;
while (!feof($fp)) {
$line = fgets ($fp, 1024);
if (strcmp($line, "\r\n") == 0) {
$header_done = true;
} elseif ($header_done) {
$res .= $line;
}
}
//validate $res here...
//etc.
}
现在问题是$ res返回“错误:失败错误:4003”。我已确保PDT身份令牌正确无误,并已收到有效的交易ID。
我的网站没有很多客户/流量,并且该代码以前运行正常。但是,当客户付款但由于代码失败而导致我的数据库未更新时,出现了问题。我已经检查了PayPal的IPN历史记录工具,可以正常访问执行该功能的页面,而且我还尝试让PayPal多次重新访问它,而我尝试进行调试但仍得到相同的错误响应。
有什么想法吗?