Ver Mensaje Individual
  #1 (permalink)  
Antiguo 16/05/2017, 11:07
Avatar de Middrel
Middrel
 
Fecha de Ingreso: abril-2005
Mensajes: 835
Antigüedad: 19 años
Puntos: 27
Duda con IPN Paypal

Hola, buenos días

Tengo una duda al tratar la información que me envía Paypal cuando se completa un pago que fue emitido por una tienda en línea. Paypal me envía esta información:

amt=5.00&cc=MXN&st=Completed&tx=50S8781201554992W

que son el monto total, la moneda, el estado del pedido y el id de transacción.

Viendo la documentación de Paypal y guías en línea indican que en mi página destino (dominio.com/tienda/success.php), debo incluir el siguiente código:

Código PHP:
if($_POST){
        
// Obtenemos los datos en formato variable1=valor1&variable2=valor2&...
        
$raw_post_data file_get_contents('php://input');
 
        
// Los separamos en un array
        
$raw_post_array explode('&',$raw_post_data);
 
        
// Separamos cada uno en un array de variable y valor
        
$myPost = array();
        foreach(
$raw_post_array as $keyval){
            
$keyval explode("=",$keyval);
            if(
count($keyval) == 2)
                
$myPost[$keyval[0]] = urldecode($keyval[1]);
        }
 
        
// Nuestro string debe comenzar con cmd=_notify-validate
        
$req 'cmd=_notify-validate';
        if(
function_exists('get_magic_quotes_gpc')){
            
$get_magic_quotes_exists true;
        }
        foreach(
$myPost as $key => $value){
            
// Cada valor se trata con urlencode para poder pasarlo por GET
            
if($get_magic_quotes_exists == true && get_magic_quotes_gpc() == 1) {
                
$value urlencode(stripslashes($value)); 
            } else {
                
$value urlencode($value);
            }
 
            
//Añadimos cada variable y cada valor
            
$req .= "&$key=$value";
        }
        
        
//$ch = curl_init('https://www.sandbox.paypal.com/cgi-bin/webscr');   // Esta URL debe variar dependiendo si usamos SandBox o no. Si lo usamos, se queda así.
        
$ch curl_init('https://www.paypal.com/cgi-bin/webscr');         // Si no usamos SandBox, debemos usar esta otra linea en su lugar.
        
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)) ) {
            
// Ooops, error. Deberiamos guardarlo en algún log o base de datos para examinarlo después.
            
curl_close($ch);
            exit;
        }
        
curl_close($ch);
        
        if (
strcmp ($res"VERIFIED") == 0) {
            
/**
             * A partir de aqui, deberiamos hacer otras comprobaciones rutinarias antes de continuar. Son opcionales, pero recomiendo al menos las dos primeras. Por ejemplo:
             * 
             * * Comprobar que $_POST["payment_status"] tenga el valor "Completed", que nos confirma el pago como completado.
             * * Comprobar que no hemos tratado antes la misma id de transacción (txd_id)
             * * Comprobar que el email al que va dirigido el pago sea nuestro email principal de PayPal
             * * Comprobar que la cantidad y la divisa son correctas
             */
            
 
            // Después de las comprobaciones, toca el procesamiento de los datos.
 
               
$sqlUpdatePaypal mysqli_query($conn"Update shop_pedido Set ped_total =" $_GET['amt'] . " Where ped_id_user = " $_SESSION['user'] . " and ped_switch = 1");
            
$sqlUpdatePaypal mysqli_query($conn"Update shop_pedido Set ped_estado ='1' Where ped_id_user = " $_SESSION['user'] . " and ped_switch = 1");
            
$sqlUpdatePaypal mysqli_query($conn"Update shop_pedido Set ped_trasid_paypal ='" $_GET['tx'] . "' Where ped_id_user = " $_SESSION['user'] . " and ped_switch = 1");
           
        } else if (
strcmp ($res"INVALID") == 0) {
            
// El estado que devuelve es INVALIDO, la información no ha sido enviada por PayPal. Deberías guardarla en un log para comprobarlo después
        

    } else {    
// Si no hay datos $_POST
        // Podemos guardar la incidencia en un log, redirigir a una URL...
    

Al cuál le agregué lo siguiente:

$sqlUpdatePaypal = mysqli_query($conn, "Update shop_pedido Set ped_total =" . $_GET['amt'] . " Where ped_id_user = " . $_SESSION['user'] . " and ped_switch = 1");
$sqlUpdatePaypal = mysqli_query($conn, "Update shop_pedido Set ped_estado ='1' Where ped_id_user = " . $_SESSION['user'] . " and ped_switch = 1");
$sqlUpdatePaypal = mysqli_query($conn, "Update shop_pedido Set ped_trasid_paypal ='" . $_GET['tx'] . "' Where ped_id_user = " . $_SESSION['user'] . " and ped_switch = 1");

Bueno, es un echo de que no guardará la información por arte de magia, mi duda es, ¿como puedo hacer que la información se envíe a la base de datos? Tratándose de PHP, la información se envía una vez que alguien hace alguna acción, como darle click a un botón, pero aquí la información viene de Paypal y solo nos muestra por argumentos datos del pedido.

Sé que debe estar faltándome algún proceso, pero no sé cuál.

¿Alguien que me pudiera apoyar en este tema?

De antemano, gracias por sus comentarios. Sigo investigando.

Saludos!!