2011-12-15 10 views
5

Po wielu godzinach rozmyślania i próbach skonfigurowania tego, co powinno być stosunkowo prostym procesem wysyłania płatności na stronę www.sandbox.paypal.com i przekierowaniem z powrotem do strony w mojej witrynie z transakcją id w querystringu, w końcu to osiągnąłem.Błąd PayP PDT 4003

Otrzymuję teraz komunikat o błędzie "FAIL Error 4003".

Oto kod, którego używam. Jest niemal tak samo jak paypal przykład (wszystko co zrobili jest echo z odpowiedzi):

<?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. 

I zadbali, aby potwierdzić adresy e-mail dla obu moich piaskownicy kont firmowych i nabywcy oraz włączona PDT.

Klient zostaje przekierowany poprawnie z powrotem do mojej strony „dziękuję” z następującymi paramaters kwerendy - ?tx=4FU63684496248523&st=Pending&amt=29.90&cc=EUR&cm=&item_number=

Czy ktoś napotkał ten komunikat o błędzie? Jeśli tak, jakie są zwykle przyczyny?

+0

I rzeczywiście nazywa paypal temat tego błędu i dali mi tajemniczą odpowiedź, mówiąc, że błąd pochodzi z jakiejś złej konfiguracji w moim koszyku (używam ubercart). Niezbyt pomocna ... – Jukebox

+1

Oto kolejna często zadawana pytanie, którą należy zgłosić: https://ppmts.custhelp.com/app/answers/detail/a_id/13 – Jukebox

+1

Korzystam z prostego formularza do przesyłania żądania zapłaty do paypal i używam ich własnego kodu do przetworzenia odpowiedzi. Rozwijam strony internetowe i aplikacje przez dość długi czas, ale przez większość czasu udało mi się uniknąć paypal. Jestem zdumiony tym, jak zła jest ich dokumentacja, konfiguracja testów i ogólna usługa. – TGuimond

Odpowiedz

6

Problem polegał na tym, że wysyłałem moje zapytanie testowe http do strony paypal.com zamiast piaskownicy.paypal.com. Odpowiedź była w FAQ pozostawionym przez Jukebox.

Sprawdź script.When transferu testowania danych na temat płatności (PDT) w Sandbox, upewnij się, że PDT POST script Powrót Informacje na www.sandbox.paypal.com. Jeśli testujesz na stronie Live PayPal, upewnij się, że dane dotyczące skryptu POSTs są ponownie przesyłane na stronę www.paypal.com. Obecnie cały przykładowy kod w witrynach Live i Sandbox "wskazuje" z powrotem na stronę PayPal na żywo.

Mam nadzieję, że pomoże to komuś innemu wstać i działać szybciej niż ja. Przechodzę teraz do następnego problemu, który jest zwracany jako pusty, a nie jako błąd .. wzdychanie ..

3

Upewnij się, że identyfikator transakcji nie wygasł. Kod błędu 4003 PDT pojawia się również, gdy identyfikator transakcji wygasł.

+0

Czy masz więcej informacji na temat wygaśnięcia ID transakcji? Łatwe powtórzenie tego pytania, jeśli masz: http://stackoverflow.com/questions/23862124/paypal-pdt-transaction-id-expiration-period –

+0

jak się masz? AFAIK, identyfikator transakcji PayPal nigdy nie wygasa. – Vimalnath

1

Oto co rozwiązać go dla mnie ...

w przycisk Kup teraz, miałem adres e-biznes związany z mojego konta PayPal LIVE natomiast muszę korzystać z adresu e-mail biznes powiązany z moim kontem PayPal Sandbox w:

<input type="hidden" name="business" value="[email protected]"> 

Atrybut wartości potrzebny do odzwierciedlenia biznesowego adresu e-mail powiązanego z moim kontem sandbox.

Nawiasem mówiąc, tutaj jest alternatywna wersja PHP cURL powyższego skryptu, który również wystarcza do wywołania odpowiedzi od piaskownicy 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'])) 
0

Tożsamość Reklamowe mojego konta Test sprzedającego zmianie bez powiadomienia. Użycie nowego (poprawnego) tokena tożsamości rozwiązało problem.

0
$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']; 

}