Paypal PDT ошибка 4003 - PullRequest
       33

Paypal PDT ошибка 4003

5 голосов
/ 15 декабря 2011

После многих часов возни и попыток настроить относительно простой процесс отправки платежа на www.sandbox.paypal.com и перенаправления обратно на страницу моего сайта с идентификатором транзакции в строке запроса.Я наконец достиг этого.

Теперь я получаю сообщение об ошибке «Ошибка 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.

Я удостоверился, что подтвердил адреса электронной почты для моих аккаунтов продавца и покупателя в песочнице и включилТИХООКЕАНСКОЕ ЛЕТНЕЕ ВРЕМЯ.

Клиент правильно перенаправлен обратно на мою страницу «Спасибо» со следующими параметрами строки запроса - ?tx=4FU63684496248523&st=Pending&amt=29.90&cc=EUR&cm=&item_number=

Кто-нибудь еще сталкивался с этим сообщением об ошибке?Если да, то каковы обычные причины?

Ответы [ 6 ]

6 голосов
/ 16 декабря 2011

Проблема заключалась в том, что я отправлял свой тестовый http-запрос на paypal.com, а не на sandbox.paypal.com. Ответ был в FAQ, оставленном Jukebox.

Проверьте скрипт. При тестировании Transfer Data Transfer (PDT) в Песочница, убедитесь, что ваш скрипт PDT отправляет информацию обратно www.sandbox.paypal.com. Если вы проводите тестирование на сайте Live PayPal, убедитесь, что скрипт отправляет данные обратно на www.paypal.com. В настоящее время все образцы код на сайтах Live и Sandbox «указывает» обратно на живой PayPal сайт.

Надеюсь, это поможет кому-то еще встать и бежать быстрее, чем я. Теперь я перехожу к своей следующей проблеме, в которой токен возвращается как пустой, а не как ошибка.

3 голосов
/ 22 марта 2012

Убедитесь, что ваш идентификатор транзакции не истек.Код ошибки 4003 PDT также появляется при истечении срока действия идентификатора транзакции.

1 голос
/ 19 мая 2012

Вот что для меня решило ...

В кнопке "Купить сейчас" у меня был служебный адрес электронной почты, связанный с моей учетной записью LIVE PayPal, тогда как мне нужно использовать служебный адрес электронной почты, связанный с моей учетной записью SANDBOX PayPal, как в:

<input type="hidden" name="business" value="user@host.com">

Атрибут value, необходимый для отображения адреса электронной почты предприятия, связанного с моей учетной записью песочницы.

Кстати, вот альтернативная версия PHP cURL вышеупомянутого скрипта, которая также помогает получить ответ из песочницы PayPal:

<code>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 '
'; } // end if (isset ($ _ GET ['tx']))
0 голосов
/ 02 июля 2013

Дополнительную информацию о PTD Paypal можно найти здесь: http://www.secure -ebook.com / help / payment: paypal: fail_4003

0 голосов
/ 02 июля 2013
$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']; 

}
0 голосов
/ 28 января 2013

Идентификационный токен моего тестового аккаунта продавца изменился без уведомления. Использование нового (правильного) Identity Token устранило проблему.

...