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($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'));
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...
}
$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!!