Foros del Web » Programando para Internet » PHP »

Duda con IPN Paypal

Estas en el tema de Duda con IPN Paypal en el foro de PHP en Foros del Web. 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 ...
  #1 (permalink)  
Antiguo 16/05/2017, 11:07
Avatar de Middrel  
Fecha de Ingreso: abril-2005
Mensajes: 835
Antigüedad: 19 años, 6 meses
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!!
  #2 (permalink)  
Antiguo 16/05/2017, 18:31
Avatar de Turdo  
Fecha de Ingreso: julio-2005
Ubicación: .:Guadalajara:.
Mensajes: 398
Antigüedad: 19 años, 4 meses
Puntos: 23
Respuesta: Duda con IPN Paypal

Cita:
Iniciado por Middrel Ver Mensaje
$ch = curl_init('https://www.paypal.com/cgi-bin/webscr'); // Si no usamos SandBox, debemos usar esta otra linea en su lugar.
curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $req);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
curl_setopt($ch, CURLOPT_FORBID_REUSE, 1);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Connection: Close'));
Primero que nada saludos, si te fijas usan curl esto hace peticiones o emula una petición post y sin usar botones tu puedes hacer eso mismo.

En el código la variable $req es donde esta la información de allí saca los datos. No necesitas mandar a ningún lado los datos en el mismo archivo puedes guardar los datos

Lo que me queda la duda es
Código PHP:
Ver original
  1. $sqlUpdatePaypal = mysqli_query($conn, "Update shop_pedido Set ped_total =" . $_GET['amt'] . " Where ped_id_user = " . $_SESSION['user'] . " and ped_switch = 1");
  2.             $sqlUpdatePaypal = mysqli_query($conn, "Update shop_pedido Set ped_estado ='1' Where ped_id_user = " . $_SESSION['user'] . " and ped_switch = 1");
  3.             $sqlUpdatePaypal = mysqli_query($conn, "Update shop_pedido Set ped_trasid_paypal ='" . $_GET['tx'] . "' Where ped_id_user = " . $_SESSION['user'] . " and ped_switch = 1");

Esos datos son los que vas a guardar o lo que hay en $req?
mysqli_query ya es el query se supone que allí ya debe haber actualizado los datos.

Aquy te dejo como comprobar si hay errores en la conexión de la base de datos o el mismo query:
Código PHP:
Ver original
  1. $sqlUpdatePaypal = mysqli_query($conn, "Update shop_pedido Set ped_total =" . $_GET['amt'] . " Where ped_id_user = " . $_SESSION['user'] . " and ped_switch = 1") or die (mysqli_error($conn));


Saludos!
__________________
Un buen programa depende de la imaginación.
  #3 (permalink)  
Antiguo 18/05/2017, 10:16
Avatar de Middrel  
Fecha de Ingreso: abril-2005
Mensajes: 835
Antigüedad: 19 años, 6 meses
Puntos: 27
Respuesta: Duda con IPN Paypal

Hola Turdo, gracias por tu respuesta!!

Disculpa responder tan tarde, estaba tan metido en este tema que se me olvido regresar al foro a ver los comentarios.

Y si, en efecto, ya vi que no necesito nada más para enviar la información, las consultas que están citadas son las que uso para actualizar mi tabla de pedidos. Por el momento ya está funcionando, hice algunas pruebas a "pelo" (es decir con compras reales en una cuenta real) y todo pasó muy bien.

Te agradezco por tus comentarios :D

Saludos!!

Etiquetas: ipn, mysql, paypal, sql, url, variable
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 14:07.