Ver Mensaje Individual
  #3 (permalink)  
Antiguo 14/01/2013, 13:42
Avatar de zalito12
zalito12
 
Fecha de Ingreso: noviembre-2011
Ubicación: Coruña, España
Mensajes: 430
Antigüedad: 13 años
Puntos: 67
Respuesta: Tutorial: Saca provecho a tu Web (PayPal y más)

3. Retroceso automático:

Para configurar una url de retroceso automático por defecto:



Le damos a activar a ambas casillas, ponemos nuestra URL por defecto y le damos a guardar.
Como vimos antes en cada botón podemos especificar una si queremos cambiarla.
Os aparecerá un mensaje arriba con vuestro código de identidad, guardadlo, lo necesitaremos, es vuestro auth_token para pedir los datos a PayPal y poder mostrarselos al usuario.
Fijaos que os vienen unos requisitos, debeis mostrar la id de la transacción, decir como fue todo y mandar un correo. Lo del correo no sé si es 100% obligatorio, aquí no me meteré en eso, lo dejo a nivel personal.

Ahora elaboramos nuestra url de retorno, lo llamaremos return.php, pero debe ser igual que la url que acabamos de poner o la que pongamos en el valor return de nuestro botón.
return.php
Código PHP:
<?php
$ip_remote 
$_SERVER['REMOTE_ADDR'];    //Para el LOG
$comentario '';

// Nuestro string debe comenzar con cmd=_notify-synch para indicarle a PayPal que tipo de petición es
//Esta vez recibimos el código de transacción por GET, 
//NO confundir con el id de transacción, ese nos lo dará más adelante si los datos son correctos
$tx_token $_GET['tx'];
$auth_token "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"//Vuestro Auth Token
$req 'cmd=_notify-synch';
$req .= "&tx=".urlencode($tx_token)."&at=".urlencode($auth_token); //La cebecera que pasaremos por GET

//********ENVIO DE INFO
$ch curl_init('https://www.paypal.com/cgi-bin/webscr');   // Esta URL debe variar dependiendo si usamos SandBox o no. Si no lo usamos, se queda así.
curl_setopt($chCURLOPT_HTTP_VERSIONCURL_HTTP_VERSION_1_1);
curl_setopt($chCURLOPT_POST1);
curl_setopt($chCURLOPT_RETURNTRANSFER,1);
curl_setopt($chCURLOPT_POSTFIELDS$req);
curl_setopt($chCURLOPT_SSL_VERIFYPEER1);
curl_setopt($chCURLOPT_SSL_VERIFYHOST2);
curl_setopt($chCURLOPT_FORBID_REUSE1);
curl_setopt($chCURLOPT_HTTPHEADER, array('Connection: Close'));

if( !(
$res curl_exec($ch)) ) {
    
//Erro con la petición Curl
    
curl_close($ch);
    
$comentario "Error Curl RETURN";
    
//GUARDO datos en LOG en la DB
    
exit;
}
curl_close($ch);

//Si no hay error proceso la info que nos envía PayPal en la respuesta
$res 'status='.str_replace("\r"""$res);
$lines explode("\n"$res); 

$values =array();
foreach (
$lines as $key=>$value) {
    
$key_values explode("="$value);
    
$values[$key_values[0]] = $key_values[1];
}
/**Los datos se gaurdará en el array $values
 *Por ejemplo $values['txn_id'] es el Id de transacción
 *La mayoría de las variables coinciden con la IPN  
 **/ 
if (strcmp ($values['status'], "SUCCESS") == 0) { //Estado Correcto
    //Ahora ya puedes evaluar lo que necesites de tu transacción
    //Y termina informando al usuario de que todo ha ido bien y ya tiene su servicio
    /**
     *Si al hacer la IPN alamcenamos el id de transacción en la DB aquí
     *podríamos comprobar que existe en la DB
     *
     *Además aquí es dónde debemos informar al usuario de que todo ha ido bien
     *Mostrarle su id de transacción               
     **/              
    //Por ejemplo
    
echo 'Todo ha ido correctamente, su Id de transacción es: '.$values['txn_id'];
}elseif (
strcmp ($values['status'], "FAIL") == 0){ //Hubo un error
    //Podemos hacer unas pequeñas comprobaciones
    //Si esta variable no está vacía cabe la posibilidad que se tratase de una compra real
    
if(!empty($tx_token)){          
        
$mensaje '<strong><font color="red">Ha ocurrido un problema con tu donación</font></strong><br><br>
        <strong>Visita la sección de soluciones.</strong>'
;   
        
$comentario "Fallo en la transación (FAIL RETURN)";
        
//Guardamos un LOG en la DB con el $comentario, el $tx_token y la ip
    
}else{
        
//Si esa variable está vacía no se pasó por Get, seguramente se trate de un acceso directo, redireccionamos
        
header('Location: index.html');
    }
}
?>
Para ver todas las variables del PDT visita el enlace (4) de las fuentes o puedes hacer un var_dump de la variables $lines.
También podemos usar esta página como la página de cancelaciones, pasándole por GET una variable en que indicamos que se trata de una cancelación y en el código si está esa variable mostramos el texto pertinente.

¡Hasta aquí la guía de PayPal! Espero que no haya sido muy pesado y que sea legible. La parte de micropagos por SMS la dejaré para cuando sepa si esta guía es aceptada o no, no vaya a ser que escriba para nada.

Espero que no os surjan muchas dudas y errores, seguramente alguno habrá por ahí al escribir aquí, copiar, pegar, etc.

Aquí os dejo las tan mencionadas fuentes:
(1)Enlace 1
(2)Enlace 1
(3)Enlace 3
(4)Enlace 4

Otros:
http://blog.osusnet.com/2008/04/13/c...paypal-con-php
http://www.codigonexo.com/blog/php/t...ipn-de-paypal/

Nada más decir que si queremos hacer pruebas con las sandbox de PayPal deberemos cambiar en el botón, el IPN y el PDT todos las direcciones añadiendo el subdominio sandbox.
Por ejemplo: https://www.sandbox.paypal.com/cgi-bin/webscr