это мой код для интерпретации уведомления PayPal. Я продолжаю получать «INVALID» из PayPal. Мне жаль, что этот вопрос – это всего лишь фрагмент кода, но я долгое время работаю над ним и не вижу никакого прогресса.
Если у кого-то есть какие-то идеи, но вам нужно увидеть некоторую отладочную информацию, то способ, которым я получаю это, – через функцию php mail (), – так что просто спросите, и я могу ее получить.
<?php $debugmessage = ""; require($_SERVER['DOCUMENT_ROOT'] . '/xxxx.php'); mysql_connect("$server", "$user", "$password") or die(mysql_error()); mysql_select_db("$database") or die(mysql_error()); // read the post from PayPal system and add 'cmd' $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 echo "http error"; } else { fputs ($fp, $header . $req); while (!feof($fp)) { $res = fgets ($fp, 1024); $debugmessage .= "|".$res; $debugmessage .= "|".strlen($req); if (strcmp ($res, "VERIFIED") == 0) { // PAYMENT VALIDATED & VERIFIED! $debugmessage .= "|"+"payment VALID"; $email = $_POST['payer_email']; $password = mt_rand(100000, 999999); mysql_query("INSERT INTO users (email, password) VALUES('". mysql_escape_string($email) ."', '".md5($password)."' ) ") or die(mysql_error()); $to = $email; $subject = 'Download Area | Login Credentials'; $message = ' Thank you for your purchase! Your account information ------------------------- Email: '.$email.' Password: '.$password.' ------------------------- You can now login at xxxxxxxxxxxx'; $headers = 'From:xxxxxxx@xxxxxxx.com' . "\r\n"; mail($to, $subject, $message, $headers); } else if (strcmp ($res, "INVALID") == 0) { $debugmessage .= "|"."payment INvalid"; // PAYMENT INVALID & INVESTIGATE MANUALY! $to = 'xxxxxx@xxxxxxx.com'; $subject = 'Download Area | Invalid Payment'; $message = ' Dear Administrator, A payment has been made but is flagged as INVALID. Please verify the payment manualy and contact the buyer. Buyer Email: '.$email.' '; $headers = 'From:xxxxxx@xxxxxxx.com' . "\r\n"; mail($to, $subject, $message, $headers); } } fclose ($fp); } mail("xxxxxxx@gmail.com",$debugmessage,""); ?>
На всякий случай, если кто-нибудь поймет этот ужасный беспорядок, $debugmessage
содержит это, как только скрипт запущен:
|HTTP/1.0 200 OK |840|X-Frame-Options: SAMEORIGIN |840|Strict-Transport-Security: max-age=14400 |840|Strict-Transport-Security: max-age=14400 |840|Content-Type: text/html; charset=UTF-8 |840|Date: Tue, 05 Mar 2013 04:42:09 GMT |840|Content-Length: 7 |840|Connection: close |840| |840|INVALID|840|payment INvalid
Я читал, что не использовал fsockopen
а также использовал что-то под названием «CURL», но я не слишком уверен в этом.
Любая помощь могла бы быть полезна.
5 часов спустя … Мое решение состояло в том, чтобы вытолкнуть код и повторить его с помощью этого урока .
Настоятельно рекомендуется.
Это может показаться очевидным для многих, но я потратил некоторое время на это. Запросы симулятора IPN были ПРОВЕРЕНЫ, но IPN из истории были INVALID. На самом деле симы работают только с песочницей, а история работает только с обычным URL-адресом. Вы не можете тестировать исторические IPN-сообщения с помощью песочницы.
Вы можете попробовать тестовые инструменты PayPal Sandbox (Instant Motion Notification (IPN) Simulator) для тестирования IPN. В файле IPN вы можете записать файл с данными POST и проверить, что не так.