После многих часов беспорядков и попыток настроить то, что должно быть относительно простым процессом отправки платежа на www.sandbox.paypal.com и перенаправляться обратно на страницу моего сайта с идентификатором транзакции в строке запроса, у меня есть наконец, достиг этого.
Теперь я получаю сообщение об ошибке «FAIL Error 4003».
Вот код, который я использую. Это почти то же самое, что и пример paypal (все, что я сделал, это отклик на ответы):
<?php // read the post from PayPal system and add 'cmd' $req = 'cmd=_notify-synch'; $tx_token = $_GET['tx']; $auth_token = "ZdoN6q4GLiRniR2BbOzEEF22GJOWHpVOXRtP7fAhBpvwwm5GyWcTzO_sSSO"; $req .= "&tx=$tx_token&at=$auth_token"; // 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 ('www.paypal.com', 80, $errno, $errstr, 30); // If possible, securely post back to paypal using HTTPS // Your PHP server will need to be SSL enabled // $fp = fsockopen ('ssl://www.paypal.com', 443, $errno, $errstr, 30); if (!$fp) { // HTTP ERROR echo "HTTP Error"; } else { fputs ($fp, $header . $req); // read the body data $res = ''; $headerdone = false; while (!feof($fp)) { $line = fgets ($fp, 1024); if (strcmp($line, "\r\n") == 0) { // read the header $headerdone = true; } else if ($headerdone) { // header has been read. now read the contents $res .= $line; echo $line; } } // parse the data $lines = explode("\n", $res); $keyarray = array(); if (strcmp ($lines[0], "SUCCESS") == 0) { for ($i=1; $i<count($lines);$i++) { list($key,$val) = explode("=", $lines[$i]); $keyarray[urldecode($key)] = urldecode($val); } // check the payment_status is Completed // check that txn_id has not been previously processed // check that receiver_email is your Primary PayPal email // check that payment_amount/payment_currency are correct // process payment $firstname = $keyarray['first_name']; $lastname = $keyarray['last_name']; $itemname = $keyarray['item_name']; $amount = $keyarray['payment_gross']; echo ("<p><h3>Thank you for your purchase!</h3></p>"); echo ("<b>Payment Details</b><br>\n"); echo ("<li>Name: $firstname $lastname</li>\n"); echo ("<li>Item: $itemname</li>\n"); echo ("<li>Amount: $amount</li>\n"); echo (""); } else if (strcmp ($lines[0], "FAIL") == 0) { echo "Failure: " . $lines[0]; // log for manual investigation } } fclose ($fp); ?> <br /> Thank you for your payment. Your transaction has been completed, and a receipt for your purchase has been emailed to you. You may log into your account at <a href="http://www.sandbox.paypal.com/ie">www.sandbox.paypal.com/ie</a> to view details of this transaction.
Я убедился, что вы подтверждаете адреса электронной почты как для моих продавцов, так и для покупателей, и включили PDT.
Клиент перенаправляется правильно на мою страницу «спасибо» со следующими параметрами querystring – ?tx=4FU63684496248523&st=Pending&amt=29.90&cc=EUR&cm=&item_number=
Кто-нибудь еще столкнулся с этим сообщением об ошибке? Если да, каковы обычные причины?
Проблема заключалась в том, что я отправлял свой тестовый http-запрос на paypal.com, а не в sandbox.paypal.com. Ответ был в FAQ, оставленном Jukebox.
Проверьте скрипт. При тестировании переноса денежных переводов (PDT) в песочнице убедитесь, что ваш сценарий PDT отправляет информацию на http://www.sandbox.paypal.com. Если вы тестируете на сайте Live PayPal, убедитесь, что данные POST-данных скрипта вернулись на сайт http://www.paypal.com. В настоящее время все примеры кода на сайтах Live и Sandbox «указывают» на сайт Live PayPal.
Надеюсь, что это поможет кому-то еще подняться и бежать быстрее, чем я. Теперь я нахожусь в следующем выпуске, в котором токен возвращается как пустой, а не ошибка .. вздох ..
Убедитесь, что идентификатор транзакции не истек. Код ошибки PDT 4003 также появляется, когда идентификатор транзакции истек.
Вот что мне удалось решить …
В кнопке «Купить сейчас» у меня был адрес электронной почты для бизнеса, связанный с моей учетной записью LIVE PayPal, тогда как мне нужно использовать адрес электронной почты для бизнеса, связанный с моей учетной записью SANDBOX PayPal, как в:
<input type="hidden" name="business" value="user@host.com">
Атрибут value должен соответствовать бизнес-адресу электронной почты, связанному с моей учетной записью sandbox.
Кстати, вот альтернатива PHP cURL-версии вышеупомянутого скрипта, которая также делает трюк, вызывающий ответ от песочницы PayPal:
if (isset($_GET['tx'])) { $tx = $_GET['tx']; $identity_token = "INSERT_YOUR_IDENTITY_TOKEN_HERE"; //echo $tx; $url = 'https://www.sandbox.paypal.com/cgi-bin/webscr'; $nvpString="cmd=_notify-synch". "&tx=$tx". "&at=$identity_token"; //echo $nvpString; //define where the data is going to $curl = curl_init($url); //tell cURL to fail if an error occurs curl_setopt($curl, CURLOPT_FAILONERROR, 1); //allow for redirects curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1); //assign the returned data to a variable curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); //set the timeout curl_setopt($curl, CURLOPT_TIMEOUT, 60); //use POST curl_setopt($curl, CURLOPT_POST, 1); //set the POST data curl_setopt($curl, CURLOPT_POSTFIELDS, $nvpString); //execute the transaction $response = curl_exec($curl); //show errors curl_error($curl); //close the connection curl_close($curl); echo '<pre>'; print_r($response); echo '</pre>'; }//end if (isset($_GET['tx']))
Идентификатор идентичности моей учетной записи продавца продавца изменился без уведомления. Проблема с использованием нового (правильного) тождества идентичности.
Более подробную информацию о PTD Paypal можно найти здесь: http://www.secure-ebook.com/help/payment:paypal:fail_4003
$tx=$_REQUEST['tx']; $paypal_url='https://www.paypal.com/cgi-bin/webscr?cmd=_notify-synch&tx='.$tx.'&at=token here'; $curl = curl_init($paypal_url); $data = array( "cmd" => "_notify-synch", "tx" => $tx, "at" => "token here" ); $data_string = json_encode($data); curl_setopt ($curl, CURLOPT_HEADER, 0); curl_setopt ($curl, CURLOPT_POST, 1); curl_setopt ($curl, CURLOPT_POSTFIELDS, $data_string); curl_setopt ($curl, CURLOPT_SSL_VERIFYPEER, 0); curl_setopt ($curl, CURLOPT_RETURNTRANSFER, 1); curl_setopt ($curl, CURLOPT_SSL_VERIFYHOST, 1); $headers = array ( 'Content-Type: application/x-www-form-urlencoded', 'Host: www.paypal.com', 'Connection: close' ); curl_setopt ($curl, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1); curl_setopt ($curl, CURLOPT_HTTPHEADER, $headers); $response = curl_exec($curl); $lines = explode("\n", $response); $keyarray = array(); if (strcmp ($lines[0], "SUCCESS") == 0) { for ($i=1; $i<count($lines);$i++){ list($key,$val) = explode("=", $lines[$i]); $keyarray[urldecode($key)] = urldecode($val); } $first_name=$keyarray['first_name']; $last_name=$keyarray['last_name']; $payment_status=$keyarray['payment_status']; $business=$keyarray['business']; $payer_email=$keyarray['payer_email']; $payment_gross=$keyarray['payment_gross']; $mc_currency=$keyarray['mc_currency']; }