Я использую приведенную ниже функцию, которая выполняется через 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 правильный, и что я получаю действительный идентификатор транзакции.
На моем веб-сайте не так много клиентов / трафик, и код ранее работал нормально.Однако проблема возникла, когда клиент сделал платеж, но моя база данных не была обновлена из-за сбоя кода.Я проверил инструмент истории IPN PayPal, и страница, которая выполняет функцию, была открыта нормально, с тех пор я получил от PayPal повторную обработку его несколько раз, пока я пытался отлаживать, но все равно получал тот же ответ об ошибке.
Есть мысли, пожалуйста?