Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] Paypal + Web PHP personalizada

Estas en el tema de Paypal + Web PHP personalizada en el foro de PHP en Foros del Web. 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 ...
  #1 (permalink)  
Antiguo 21/06/2017, 01:59
 
Fecha de Ingreso: julio-2009
Mensajes: 64
Antigüedad: 14 años, 9 meses
Puntos: 0
Paypal + Web PHP personalizada

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 />";

}

Última edición por PJ100; 21/06/2017 a las 02:11
  #2 (permalink)  
Antiguo 21/06/2017, 07:09
 
Fecha de Ingreso: noviembre-2003
Ubicación: Zaragoza, España
Mensajes: 1.257
Antigüedad: 20 años, 5 meses
Puntos: 154
Respuesta: Paypal + Web PHP personalizada

Hola PJ100,

No me he enterado de casi nada porque eso de leer código sin highlight es un dolor, pero lo que sí veo que escondes los posibles errores con @ delante de casi todo, así no puedes saber qué errores tienes porque los estás escondiendo, por lo tanto, lo primero que yo haría es quitar todas esas @ e ir depurando el código paso a paso a ver dónde te aparece el error.

Espero que te sirva...

Etiquetas: paypal, personalizada, select, 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 12:22.