Hola a todos, tengo este código para realizar pagos a través de PAYPAL en mi tienda online personalizada en PHP. El código funciona bien en el entorno de pruebas Sandbox, pero devolviendome el valor payment_status=Pending y todas las variables y valores ($req .= "&$key=$value";), ya que haciendo un echo a $req se puede comprobar.
Pero en el entorno real de Paypal no me devuelve todas las variables y valores.
¿Que puede estar pasando?
- ¿Puede que en esta línea me falte algo?: curl_setopt($ch, CURLOPT_HTTPHEADER, array('Connection: Close'));
- Tambien he llegado a pensar que puede que me falte enviar las claves de API que me da PAYPAL, pero en ese caso, ¿donde las colocaría?
Muchas gracias de antemano.
Formulario de envío de datos a PAYPAL:
echo "<input type='hidden' name='cmd' value='_xclick'>
<input type='hidden' name='business' value='[email protected]'>
<input type='hidden' name='item_name' value='".$num_pedido."'>
<input type='hidden' name='currency_code' value='EUR'>
<input type='hidden' name='amount' value='".$amount."'>
<input type='hidden' name='return' value='https://www.miweb.com/pagina?paypal=ok'>
<input type='hidden' name='notify_url' value='https://www.miweb.com/pagina?paypal=ok'>
<input type='hidden' name='rm' value='2'>
<input type='image' src='checkout-logo-small-es-2x.png' name='submit' style='width: 100%;'>";
Código que hay en la dirección --> https://www.miweb.com/pagina?paypal=ok
if(@$_POST){//Deben existir variables POST
//Selecciono el numero de pedido en la base de datos para comprobarlo con el que recibo de PAYPAL
$sql="SELECT num_pedido FROM cesta WHERE id='455'";
$r=@mysqli_query($conexion,$sql);
$dato=@mysqli_fetch_row($r);
$num_pedido_BD=@$dato[0];
// 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';
$tx_token=@$_GET['tx'];
$auth_token= "Codigo personal de Identidad Paypal";
$req .= "&tx=$tx_token&at=$auth_token";
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)) ) {
// 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) {
echo "<br />ESTADO VERIFICADO<br />";
/**
* 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
*/
$estado_pago=@$_POST['payment_status'];
$num_pedido_recibido=@$_POST['item_name'];
$email_vendedor=@$_POST['receiver_email'];
$id_transaccion=@$_POST['txn_id'];
//El estado del pago deberá ser completado para ejecutar operaciones en la base de datos
if ($estado_pago==="Completed" && $num_pedido_POST===$num_pedido_BD && $email_vendedor==="[email protected]"){
// Después de las comprobaciones, toca el procesamiento de los datos.
/* En este punto tratamos la información. Podemos hacer con ella muchas cosas.*/
}else{
echo "No Completado";
}
} else if (strcmp ($res, "INVALID") == 0) {
echo "<br />ESTADO INVALIDO<br />";
}
}else{//Si no hay datos $_POST
echo "<br />INCIDENCIA<br />";
}