paypal api php
Enviar formulario a través de cURL y redirigir navegador a PayPal (3)
ADVERTENCIA: esta respuesta tiene un déficit de seguridad. La transferencia de datos confidenciales (como el artículo y el precio) a través del cliente permite al cliente modificar la transacción. es decir. cambiar el artículo, o cambiar el precio. Consulte la documentación de PayPal sobre cómo implementar IPN .
Debe redirigir al usuario con la función de header
php y enviar las variables como GET no POST.
// Process PayPal payment
if ($method == ''PayPal'') {
// Prepare GET data
$query = array();
$query[''notify_url''] = ''http://jackeyes.com/ipn'';
$query[''cmd''] = ''_cart'';
$query[''upload''] = ''1'';
$query[''business''] = ''[email protected]'';
$query[''address_override''] = ''1'';
$query[''first_name''] = $first_name;
$query[''last_name''] = $last_name;
$query[''email''] = $email;
$query[''address1''] = $ship_to_address;
$query[''city''] = $ship_to_city;
$query[''state''] = $ship_to_state;
$query[''zip''] = $ship_to_zip;
$query[''item_name_''.$i] = $item[''description''];
$query[''quantity_''.$i] = $item[''quantity''];
$query[''amount_''.$i] = $item[''info''][''price''];
// Prepare query string
$query_string = http_build_query($query);
header(''Location: https://www.paypal.com/cgi-bin/webscr?'' . $query_string);
}
Estoy desarrollando un sitio donde los clientes tienen varias opciones de pago, incluido PayPal Payments Standard. Dado que estoy recopilando una buena cantidad de datos sobre el cliente, me gustaría procesar el formulario en mi servidor antes de enviar al usuario al servidor de PayPal. Una opción es concatenar los datos en una sola cadena, asignar la cadena al campo custom
y luego procesarlo en la respuesta de IPN, pero me parece que esta es una solución muy poco elegante. En su lugar, después de recopilar los datos del usuario, estoy intentando usar cURL para enviar un formulario HTML estándar de PayPal. ¿Cómo puedo redirigir al usuario a PayPal para completar el proceso de pago?
// Process PayPal payment
if ($method == ''PayPal'') {
// Prepare POST data
$query = array();
$query[''notify_url''] = ''http://example.com/ipn'';
$query[''cmd''] = ''_cart'';
$query[''upload''] = ''1'';
$query[''business''] = ''[email protected]'';
$query[''address_override''] = ''1'';
$query[''first_name''] = $first_name;
$query[''last_name''] = $last_name;
$query[''email''] = $email;
$query[''address1''] = $ship_to_address;
$query[''city''] = $ship_to_city;
$query[''state''] = $ship_to_state;
$query[''zip''] = $ship_to_zip;
$query[''item_name_''.$i] = $item[''description''];
$query[''quantity_''.$i] = $item[''quantity''];
$query[''amount_''.$i] = $item[''info''][''price''];
// Prepare query string
$query_string = '''';
foreach ($query as $key=>$value) {
$query_string .= $key.''=''.urlencode($value).''&'';
}
$query_string = rtrim($query_string, ''&'');
// Open connection
$ch = curl_init();
//set the url, number of POST vars, POST data
curl_setopt($ch,CURLOPT_URL, ''https://www.paypal.com/cgi-bin/webscr'');
curl_setopt($ch,CURLOPT_POST, count($query));
curl_setopt($ch,CURLOPT_POSTFIELDS, $query_string);
// Execute post
$result = curl_exec($ch);
// Close connection
curl_close($ch);
}
En lugar de intentar publicar todos los datos en PayPal y viceversa, debe mantener los datos en su servidor y enviar solo un token de identificación. Cualquier información que envíe a PayPal (a través del navegador del usuario) puede ser interceptada y modificada. Este es un grave peligro para la seguridad.
Si solo envías el token no hay posibilidad de manipulación.
Lea la especificación de PayPal, tiene pautas sobre cómo implementar estas cosas.
Debe utilizar IPN o un procesamiento posterior similar, ya que PayPal es el único que sabe si realmente se realizó un pago. No confíe en ningún dato que reciba del usuario.
haciendo curl hará llamadas de extremo a extremo en el backend, no se reflejará en el comportamiento del frontend.
tienes que hacer un formulario con campo oculto y javascript para enviar automáticamente el formulario una vez que se haya cargado la página.