2011-12-15 36 views
5

Después de muchas horas de jugar e intentar configurar lo que debería ser el proceso relativamente simple de enviar un pago a www.sandbox.paypal.com y ser redirigido a una página en mi sitio con una transacción id en la cadena de consulta, finalmente lo logré.Paypal PDT error 4003

Aparece el mensaje de error 'FAIL Error 4003'.

Aquí está el código que estoy usando. Es más o menos lo mismo que el ejemplo paypal (lo único que han hecho es eco de las respuestas):

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

Me he asegurado que confirmar las direcciones de correo electrónico para mis dos mercantes y el comprador cuentas de caja de arena y habilitado PDT.

El cliente se redirige correctamente de nuevo a mi 'gracias' de página con los siguientes parametros de cadena de consulta - ?tx=4FU63684496248523&st=Pending&amt=29.90&cc=EUR&cm=&item_number=

Alguien más ha encontrado con este mensaje de error? Si es así, ¿cuáles son las causas habituales?

+0

De hecho, me llamaron paypal sobre ese error y me dieron una respuesta críptica, diciendo que el error proviene de alguna mala configuración en mi carrito (estoy usando ubercart). No es muy útil en absoluto ... – Jukebox

+1

Aquí hay otras preguntas frecuentes para incluir en la mezcla: https://ppmts.custhelp.com/app/answers/detail/a_id/13 – Jukebox

+1

Estoy usando un formulario simple para enviar la solicitud de pago a PayPal y en realidad estoy usando su propio código para procesar la respuesta. He estado desarrollando sitios web y aplicaciones por un tiempo bastante largo, pero he logrado mantenerme alejado de PayPal la mayor parte del tiempo. Estoy sorprendido de lo mal que es su documentación, instalación de prueba y servicio general. – TGuimond

Respuesta

6

El problema era que estaba enviando mi solicitud http de prueba a paypal.com en lugar de a sandbox.paypal.com. La respuesta estaba en las preguntas frecuentes dejadas por Jukebox.

Comprobar la transferencia de datos de pago script.When prueba (PDT) en el recinto de seguridad , asegúrese de que sus mensajes de guión PDT espalda información para www.sandbox.paypal.com. Si prueba en el sitio de Live PayPal, asegúrese de los datos POSTs del script en www.paypal.com. Actualmente, todos los códigos de muestra en los sitios Live y Sandbox "apuntan" al sitio en vivo de PayPal .

Espero que ayude a alguien más a ponerse en marcha más rápido que yo. Ahora estoy en mi próximo número, que es el token que se devuelve como vacío en lugar de como un error ... suspire ...

3

Asegúrese de que su ID de transacción no haya caducado. El código de error 4003 PDT también aparece cuando su ID de transacción ha caducado.

+0

¿Tiene más información sobre cuándo caduca una identificación de transacción? También es fácil hacer esta pregunta si tienes: http://stackoverflow.com/questions/23862124/paypal-pdt-transaction-id-expiration-period –

+0

¿Cuán seguro estás? AFAIK, la identificación de la transacción de PayPal nunca expira. – Vimalnath

1

Esto es lo resuelto por mí ...

En el botón Comprar ahora, tuve una dirección de correo electrónico de negocios asociada a mi cuenta de PayPal VIVO mientras que necesito para utilizar la dirección de correo electrónico de negocios asociada a mi cuenta de PayPal SALVADERA como en:

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

El atributo de valor necesario para reflejar la dirección de correo electrónico comercial asociada con mi cuenta de espacio aislado.

Por cierto, aquí es una versión alternativa de PHP cURL del script anterior, que también hace el truco de provocar una respuesta del recinto de seguridad de 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

El personal de identidad de mi cuenta de vendedor de prueba modificados sin notificación. El uso del nuevo identificador de identidad (correcto) solucionó el problema.

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

} 
Cuestiones relacionadas