2010-03-12 22 views
21

Quiero crear una transacción simple en mi sitio web donde después de que se complete la transacción de la persona, quiero que PayPal redirija al usuario para ir a un lugar en mi sitio y quiero que PayPal me proporcione con detalles para que pueda usar PHP para analizarlo y enviarles un correo electrónico con el enlace a su compra. No estoy seguro de lo que hace notify_url? GraciasObtener información de PayPal después de una transacción

Respuesta

55

PayPal funciona así:

Tiene un formulario con un botón de "comprar". Cuando se hace clic en él, envía información (producto, precio, nombre de su cuenta, etc.) a PayPal.

El comprador acepta pagarle y, cuando se completa la transacción, PayPal envía un "IPN" (notificación de pago instantánea) a su URL de notificación: envía datos POST a esa URL para que su servidor procese. Usted responde a PayPal para preguntar si le enviaron los datos POST (en lugar de un impostor) y si luego responden que se trata de una transacción real, puede lanzar el producto al cliente. Tenga en cuenta que todo esto sucede en el fondo mientras su comprador todavía está "en" el sitio web de PayPal.

Hay una etapa opcional final, que es que PayPal devuelve al comprador a su sitio web. En este caso, envían al comprador a su url de "devolución" y pueden (opcionalmente) volver a transmitir los datos de la transacción (llaman a este PDT). Y puede consultar nuevamente con Paypal si se trata de una transacción válida y proporcionar una descarga, etc. en ese punto.

La parte más difícil que nadie explica es que el comprador no se redirige a su URL de notificación. es decir, el "visitante" de la URL de notificación de su sitio web es PayPal, , no el comprador, por lo que esto no sucede como parte de la sesión de su comprador. Si desea continuar una sesión en las tres partes de este proceso, debe crear un medio de seguimiento del comprador en su formulario y pasarlo a PayPal en un campo del formulario denominado "personalizado". Estos datos se le pasan a usted en los datos de IPN y PDT, y puede usarlos para restablecer una conexión con la sesión de usuario original.

Realmente necesita implementar tanto IPN como PDT: si el correo electrónico IPN falla, entonces tiene PDT como respaldo. Y si el usuario cierra su navegador web antes de que sean redirigidos a su página PDT, entonces ha enviado un correo electrónico IPN como copia de seguridad.

Busque en IPN y PDT y encontrará mucha información. PayPal también tienen documentación completa y scripts de ejemplo.

+0

Tal vez estoy malentendido, pero pensé que se trataba de una cosa o de otra.Pensé que puede tener PDT en su perfil de comerciante, o IPN, pero no ambos. ¿Puede mostrarme cómo configurar tanto PDT como IPN al mismo tiempo? – Volomike

+0

@Volomike: lea los dos últimos párrafos [aquí (paypal)] (https://cms.paypal.com/uk/cgi-bin/?cmd=_render-content&content_ID=developer/e_howto_admin_IPNIntro) y otras respuestas de SO como [this uno] (http://stackoverflow.com/questions/2836779/paypal-ipn-vs-pdt) –

+0

@JasonWilliams El enlace parece roto. –

6

Notificar URL debe conducir a la secuencia de comandos que guarda los datos devueltos por PayPal, tales como:

/** Fetch order from PayPal (IPN reply) 
    * @return int received ID of inserted row if received correctly, 0 otherwise 
    */ 
    function FetchOrder() 
    { 
    $transactionID=$_POST["txn_id"]; 
    $item=$_POST["item_name"]; 
    $amount=$_POST["mc_gross"]; 
    $currency=$_POST["mc_currency"]; 
    $datefields=explode(" ",$_POST["payment_date"]); 
    $time=$datefields[0]; 
    $date=str_replace(",","",$datefields[2])." ".$datefields[1]." ".$datefields[3]; 
    $timestamp=strtotime($date." ".$time); 
    $status=$_POST["payment_status"]; 
    $firstname=$_POST["first_name"]; 
    $lastname=$_POST["last_name"]; 
    $email=$_POST["payer_email"]; 
    $custom=$_POST["option_selection1"]; 
    if ($transactionID AND $amount) 
     { 
     // query to save data 
     return $this->insertID; 
     } 
    else 
     { 
     return 0; 
     } 
    } 

También puede elegir para verificar una orden más adelante:

/** Verify PayPal order (IPN) 
    * PayPal returns VERIFIED or INVALID on request 
    * @return bool verified 1 if verified, 0 if invalid 
    */ 
    function VerifyOrder() 
    { 
    $_POST["cmd"]="_notify-validate"; 
    $ch=curl_init(); 
    curl_setopt($ch,CURLOPT_HEADER,0); 
    curl_setopt($ch,CURLOPT_RETURNTRANSFER,1); 
    curl_setopt($ch,CURLOPT_USERAGENT,"your agent - replace"); 
    curl_setopt($ch,CURLOPT_URL,"https://www.paypal.com/cgi-bin/webscr"); 
    curl_setopt($ch,CURLOPT_POST, 1); 
    foreach ($_POST as $key=>$value) 
     { 
     $string.="&".$key."=".urlencode(stripslashes($value)); 
     } 
    curl_setopt($ch, CURLOPT_POSTFIELDS, $string); 
    $result=curl_exec($ch); 
    if ($result=="VERIFIED") return 1; 
    else return 0; 
    } 
2
$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

Al analizar la respuesta PDT estoy usando parse_str. Puesto que el cuerpo de la respuesta es URL codificada que es sólo una cuestión de reemplazar los saltos de línea con ampersands- como esto

$result = curl_exec($ch);  
//replace the breaks with '&' 
$r_string = str_replace("\n", "&", $result); 
//parse the response into a key->value array 
        parse_str($r_string, $this->details); 
        if(!isset($this->details['SUCCESS'])){ 
       //the "SUCCESS" or "FAIL" response is the first key 
    return FALSE; 
        } 
        else{ 
//the values of the response are now in an array 
         return TRUE; 

        } 

dependiendo de la aplicación que puede incluso dejar de lado el segundo parámetro ($ this > Detalles del) y los valores se establecen como variables globales.

Cuestiones relacionadas