Я попытался написать небольшой обработчик IPN PayPal, но я всегда получаю "INVALID" при использовании симулятора IPN https://developer.paypal.com/webapps/developer/applications/ipn_simulator. Я не уверен, что о URL-адресе, который я отправляю обратно, является неправильным. Я рассматривал некоторых Гистов для этой темы, но все они кажутся немного длинными. Их документы на этом находятся здесь https://developer.paypal.com/webapps/developer/docs/classic/ipn/integration-guide/IPNIntro/#protocol_and_arch, и я думаю, что я выполнил все шаги для протокола. Любая помощь приветствуется
<?php
/**
* Validates a PayPal IPN notification
* @param array $req The $_POST variable for the request
* @return String Returns the validity: 'VALID' or 'INVALID'
*/
function verifyPayPalIPN($req) {
// Base URL for the php validation
$baseURL = 'https://www.paypal.com/cgi-bin/webscr?cmd=_notify-validate';
// Loop through the POST parameters to
// create the validaton URL
$postVars = '';
foreach ($req as $key => $value) {
$postVars .= $key . '=' . urlencode($value) . '&';
}
// Strip the last & off of the URL
$postVars = substr($postVars, 0, -1);
// Send the request to PayPal to confirm
// whether the request to the script is
// from PayPal
$requestValidity = system("curl --data '$postVars' $baseURL");
return $requestValidity;
}
file_put_contents('/tmp/result.txt', verifyPayPalIPN($_POST));
?>
во-первых, проверьте, является ли ваша платная среда и проверяющая среда одинаковой (как sandbox
и обе production
), если это не так, скажите, что ваш клиент оплатил заказ в production
среде, но затем ваш код PHP пытается запросить конечную точку среды sandbox
для проверки запроса IPN, он всегда будет заканчиваться как INVALIDE
cmd=_notify-validate
должен быть частью вашей строки postVars
$baseURL = 'https://www.paypal.com/cgi-bin/webscr';
// Loop through the POST parameters to
// create the validaton URL
$postVars = 'cmd=_notify-validate';
foreach ($req as $key => $value) {
$postVars .= $key . '=' . urlencode($value) . '&';
}
Код, который я использовал в прошлом, следующий:
$req = 'cmd=_notify-validate';
foreach ($_POST as $key => $value) {
$value = urlencode(stripslashes($value));
$req .= "&$key=$value";
}
// post back to PayPal system to validate
$header = "POST /cgi-bin/webscr HTTP/1.0\r\n";
$header .= "Content-Type: application/x-www-form-urlencoded\r\n";
$header .= "Content-Length: " . strlen($req) . "\r\n\r\n";
$fp = fsockopen ("ssl://www.paypal.com", 443, $errno, $errstr, 30);
if (!$fp) {
// HTTP ERROR
} else {
fputs ($fp, $header . $req);
while (!feof($fp)) {
$res = fgets ($fp, 1024);
if (strcmp ($res, "VERIFIED") == 0) {
} else if (strcmp ($res, "INVALID") == 0) {
}
}
fclose($fp);
}
Обратите внимание на номер порта. 443 также