0

Al recibir la respuesta de el ipn de paypal guardo un log en un archivo de texto y veo que acá si llega el item_name_x donde x es el número pero cuando lo capturo en mi var $item_nam = $_POST['item_name']; para luego guardarlo en mi DB este se inserta vacío, ¿alguien sabe por qué me pueda estar pasando esto? Este es mi listener:

<?php 

/*echo "<pre>";
print_r($_POST);
echo "</pre>";*/
/**
 * summary
 */
class Paypay_IPN 
{
    /**
     * summary
     */
    public function __construct($mode = 'live')
    {
        if ($mode == 'live') 
        {
            $this->_url = 'https://www.paypal.com/cgi-bin/webscr';
        }

        else
        {
            $this->_url = 'https://www.sandbox.paypal.com/cgi-bin/webscr';
        }

    }

    public function run()
    {
        include '../clases/DB.php';
        $dbh = new MYSQL();
        //call paypal

        $item_name        = $_POST['item_name'];
        $item_number      = $_POST['item_number'];
        $payment_status   = $_POST['payment_status'];
        $payment_date   = $_POST['payment_date'];
        $payment_amount   = $_POST['mc_gross'];
        $payment_currency = $_POST['mc_currency'];
        $txn_id           = $_POST['txn_id'];
        $receiver_email   = $_POST['receiver_email'];
        $payer_email      = $_POST['payer_email'];
        $first_name      = $_POST['first_name'];
        $record_id      = $_POST['custom'];
        $pdt_identity_token = 'TOKEN';

        $request = curl_init();

            // Set request options
            curl_setopt_array($request, array
                (
                  CURLOPT_URL => $this->_url,
                  CURLOPT_POST => TRUE,
                  CURLOPT_POSTFIELDS => http_build_query(array
                      (
                        'cmd' => '_notify-synch',
                        'tx' => $txn_id,
                        'at' => $pdt_identity_token,
                      )
                  ),
                  CURLOPT_RETURNTRANSFER => TRUE,
                  CURLOPT_HEADER => FALSE,
                  // CURLOPT_SSL_VERIFYPEER => TRUE,
                  // CURLOPT_CAINFO => 'cacert.pem',
                )
            );



            $response = curl_exec($request);
            $status   = curl_getinfo($request, CURLINFO_HTTP_CODE);

            // Cerrar la conexión
            curl_close($request);
            flush();
            ob_flush();
            sleep(2);
            $fh = fopen('ok.txt', 'w');
            fwrite($fh, $response .'--'. CURLOPT_POSTFIELDS);
            fclose($fh);

            $inser = "INSERT INTO compras_tickets (email_comprador,fecha_compra,status,numero,id_transaccion)
            VALUES('$payer_email','$payment_date','$payment_status','$item_name','$txn_id')";
            //echo $update;
            $result = $dbh->prepare($inser);
            $result->execute();
            if ($result) 
            {
                $select_vendedor = "SELECT * FROM vendedores WHERE email = '$payer_email' ";
                //echo $update;
                $result = $dbh->prepare($select_vendedor);
                $result->execute();
                if ($result->rowCount() > 0 ) 
                {   
                    while($rows = $result->fetch())
                    {       

                       $idvendedor = $rows['id'];

                    }
                    $select = "SELECT * FROM compras_xasociacion_tickets WHERE id_vendedor = '$idvendedor' ";
                    //echo $update;
                    $result = $dbh->prepare($select);
                    $result->execute();
                    while($rows = $result->fetch())
                    {       

                       $id_vendedor = $rows['id_vendedor'];
                       $fecha_venta = $rows['fecha_venta'];
                       $email_comprador = $rows['billing_email'];                       

                    }
                    $update = "UPDATE compras_xasociacion_tickets SET id_transaccion = '$txn_id' WHERE id_vendedor = '$id_vendedor' and fecha_venta = '$fecha_venta' ";
                    //echo $update;
                    $result = $dbh->prepare($update);
                    $result->execute();

                }
                else
                {
                   console.log('no es vendedor');
                }
            }
        if ($response == 'SUCCESS') 
        {

                $postFields = 'cmd=_notify-validate';

                foreach ($_POST as $key => $value) 
                {

                    $postFields .= "&$key=".urlencode($value);
                }

                $ch = curl_init();
                curl_setopt_array($ch, array(
                    CURLOPT_URL => $this->_url,
                    CURLOPT_RETURNTRANSFER =>true,
                    CURLOPT_SSL_VERIFYPEER =>false,
                    CURLOPT_POST =>true,
                    CURLOPT_POSTFIELDS =>$postFields
                ));
                $result = curl_exec($ch);

                curl_close($ch);
                if ($result == "VERIFIED") 
                {  

                    // assign posted variables to local variables
                        $item_name = $_POST['item_namex'];
                        $item_number = $_POST['item_number'];
                        $payment_status = $_POST['payment_status'];
                        $payment_amount = $_POST['mc_gross'];
                        $payment_currency = $_POST['mc_currency'];
                        $txn_id = $_POST['txn_id'];
                        $receiver_email = $_POST['receiver_email'];
                        $payer_email = $_POST['payer_email'];                  
                    flush();
                    ob_flush();
                    sleep(2);
                    $fhf = fopen('okfaa.txt', 'w');
                    fwrite($fhf, $result .'--'. $postFields);
                    fclose($fhf);

                    $update_status_shop = "UPDATE compras_tickets SET status = '$payment_status', numero = '$item_name' WHERE id_transaccion = '$txn_id' ";
                    //echo $update;
                    $result = $dbh->prepare($update_status_shop);
                    $result->execute();
                    $emaildestino=  $email_comprador;
                    $asunto= 'Compra ticket Algasainmob';//'queja';
                    $texto ='Usted ha adquirido satisfactoriamente los tickets '.$_POST['item_nameX'];
                    $emailorigen='MAIL';


                    //$request = curl_init();

                        // Set request options
                        $ch = curl_init();
                        $urlmail = "../send-mail.php?emaildestino=".$emaildestino."&asunto=".urlencode($asunto)."&texto=".urlencode($texto)."&emailorigen=".$emailorigen." ";
                        curl_setopt($ch, CURLOPT_URL,$urlmail);
                        curl_exec($ch);
                        curl_getinfo($ch, CURLINFO_HTTP_CODE);

                        // Cerrar la conexión
                    curl_close($ch);



                 }   
        }

        else if ($result == "INVALID")
        {
            $fh = fopen('faild.txt', 'w');
            fwrite($fh, $result .'--'. $postFields);
            fclose($fh);
            $updateboletos = "UPDATE boletos SET status = '0' WHERE numero = '$item_name' ";
            //echo $update;
            $result = $dbh->prepare($updateboletos);
            $result->execute();
        }            


        //echo $result;
    }
}
  • 1
    ¿Por qué a veces lees `$_POST["item_name"]`, otras `$_POST["item_namex"]` y otras `$_POST["item_nameX"]`?¿Son tres variables diferentes o es eso un error en el código?¿Cuál de las ramas es la que te da error? Aparte, y no relacionado con la pregunta en sí: tu código es vulnerable a ataques de inyección SQL y no deberías usarlo en aplicaciones de cara a Internet. Lee sobre [inyección SQL y cómo evitarla](http://es.stackoverflow.com/q/10518/250). – Alvaro Montoro Sep 20 '16 at 15:38

1 Answers1

1

primero te refiero este link para que leas las posibles variables que te envia PAYPAL Variables IPN Paypal

Sin embargo te aclaro que el campo item_name en realidad se repite iterando según la cantidad de productos, si por ejemplo vendiste 3 productos, recibes 3 campos llamados item_name1,item_name2,item_name3

eso depende mucho de como configuraste el formulario, si es una venta sencilla solo recibiras el campo item_name.

Deberias revisar la respuesta y almacenarla en un archivo para verificar cuales campos estas recibiendo.

Una ultima recomendacion: deberias escapar toda la información que viene en la petición antes de insertar para evitar inyeccion SQL. Aqui una función de php muy útil: mysqli-real-scape-string

Saludos.

Alfredo Gt
  • 425
  • 2
  • 11