¿Configurar la URL de retorno de PayPal y hacer que sea de retorno automático?

127

Esta es una pregunta de seguimiento para: PHP: ¿Una forma fácil de iniciar el pago de PayPal?

Entonces, mi problema es que estoy especificando la URL de retorno. Sin embargo, después de pagar con PayPal, termino en una pantalla que dice:

Usted acaba de completar su pago. XXXX, acabas de completar tu pago. Su ID de transacción para este pago es: XXXXXXXXXXXXX.

Le enviaremos un correo electrónico de confirmación a [email protected]. Esta transacción aparecerá en su estado de cuenta como PAYPAL.

Go to PayPal account overview

Necesito que no muestre esta pantalla e ir directamente a la URL de retorno. Yo tengo:

  • Establecer la variable "retorno"
  • Establezca la variable "rm" en: 2 (que según la guía = " el navegador del comprador se redirige a la URL de retorno mediante el método POST, y se incluyen todas las variables de pago ")

De hecho, aquí está mi forma completa:

<form method="post" action="https://www.sandbox.paypal.com/cgi-bin/webscr">
  <input type="hidden" value="_xclick" name="cmd">
  <input type="hidden" value="[email protected]" name="business">
  <!-- <input type="hidden" name="undefined_quantity" value="1" /> -->
  <input type="hidden" value="Order at The Greek Merchant:&lt;Br /&gt;Goldfish Flock BLG&lt;br /&gt;" name="item_name">
  <input type="hidden" value="NA" name="item_number">
  <input type="hidden" value="22.16" name="amount">
  <input type="hidden" value="5.17" name="shipping">
  <input type="hidden" value="0" name="discount_amount">        
  <input type="hidden" value="0" name="no_shipping">
  <input type="hidden" value="No comments" name="cn">
  <input type="hidden" value="USD" name="currency_code">
  <input type="hidden" value="http://XXX/XXX/XXX/paypal/return" name="return">
  <input type="hidden" value="2" name="rm">      
  <input type="hidden" value="11255XXX" name="invoice">
  <input type="hidden" value="US" name="lc">
  <input type="hidden" value="PP-BuyNowBF" name="bn">
  <input type="submit" value="Place Order!" name="finalizeOrder" id="finalizeOrder" class="submitButton">
</form>

¿Alguna idea de cómo puedo hacer que vuelva automáticamente? Alternativamente, ¿cómo obtengo el resultado del pago en mi sitio web para poder actualizar la base de datos? ¿Qué es el IPN?

coderama
fuente
Tenga en cuenta que el host entrante en su parámetro de devolución personalizado debe ser el mismo que el configurado en su cuenta de PayPal.
Andreas

Respuestas:

199

Debe habilitar el retorno automático en su cuenta PayPal, de lo contrario, ignorará el returncampo.

De la documentación (actualizada para reflejar el nuevo diseño de enero de 2019):

El retorno automático está desactivado de manera predeterminada. Para activar el retorno automático:

  1. Inicie sesión en su cuenta PayPal en https://www.paypal.com o https://www.sandbox.paypal.com . Aparece la página Descripción general de mi cuenta.
  2. Haz clic en el ícono de ajustes arriba a la derecha. Aparece la página Resumen del perfil.
  3. Haga clic en el enlace Mis preferencias de venta en la columna izquierda.
  4. En la sección Venta en línea, haga clic en el enlace Actualizar en la fila de Preferencias del sitio web. Aparece la página de Preferencias de pago del sitio web
  5. En Devolución automática para pagos del sitio web, haga clic en el botón de opción Activado para habilitar la devolución automática.
  6. En el campo URL de retorno, ingrese la URL a la que desea que sus pagadores sean redirigidos después de completar sus pagos. NOTA: PayPal verifica la URL de retorno que ingresó. Si la URL no está formateada correctamente o no se puede validar, PayPal no activará la devolución automática.
  7. Desplácese hasta la parte inferior de la página y haga clic en el botón Guardar.

IPN es para notificación de pago instantáneo. Le dará información más confiable / útil que la que obtendrá de la devolución automática.

La documentación para IPN está aquí: https://www.x.com/sites/default/files/ipnguide.pdf

Documentación en línea para IPN: https://developer.paypal.com/docs/classic/ipn/gs_IPN/

El procedimiento general es que pase un notify_urlparámetro con la solicitud, y configure una página que maneje y valide las notificaciones IPN, y PayPal enviará solicitudes a esa página para notificarle cuando los pagos / reembolsos / etc. atravesar. Esa página de controlador de IPN sería el lugar correcto para actualizar la base de datos para marcar los pedidos como pagados.

Kevin Stricker
fuente
2
Eche un vistazo aquí paypal.com/cgi-bin/webscr?cmd=p/mer/…
Desarrollador el
55
Con el nuevo diseño del sitio web de Paypal, esto ya no es exactamente exacto. Paso 3) Haga clic en el My Selling Tools Paso 4) Haga clic Website PreferencesdebajoSelling Online
Webnet
2
IPN debe usarse para verificar que PayPal haya manejado correctamente el pedido, sin embargo, aún necesita la URL de devolución para mostrarle al usuario que conoce el éxito. Muchas veces los usuarios no reciben el correo electrónico que envías, por lo que es bueno si pueden obtener acceso al producto (descarga, etc.) de inmediato.
pcunite
1
@Kevin Stricker ¿Cómo podemos configurar la URL de retorno para 2 sitios diferentes? por ejemplo, si uso una cuenta de paypal para 2 sitios web, pero solo puedo agregar una URL como URL de retorno usando sus pasos. ¿Cómo puedo usar eso para 2 sitios?
Gaurav
44
No es del todo exacto que "debe habilitar el retorno automático en su cuenta PayPal, de lo contrario, ignorará el returncampo". Cualquier returnparámetro de URL que pase al finalizar la compra se aceptará y anulará cualquier URL de devolución automática (o falta de ella) configurada en el perfil de la cuenta PayPal del vendedor, pero si no tienen habilitada la devolución automática allí, el comprador deberá hacer clic manualmente más allá de fin del pago para ser redirigido a esa URL, en lugar de ser redirigido automáticamente.
SubGothius
42

Formulario de muestra usando PHP para pagos directos.

<form action="https://www.paypal.com/cgi-bin/webscr" method="post">
    <input type="hidden" name="cmd" value="_cart">
    <input type="hidden" name="upload" value="1">
    <input type="hidden" name="business" value="[email protected]">

    <input type="hidden" name="item_name_' . $x . '" value="' . $product_name . '">
    <input type="hidden" name="amount_' . $x . '" value="' . $price . '">
    <input type="hidden" name="quantity_' . $x . '" value="' . $each_item['quantity'] . '"> 
    <input type="hidden" name="custom" value="' . $product_id_array . '">
    <input type="hidden" name="notify_url" value="https://www.yoursite.com/my_ipn.php">
    <input type="hidden" name="return" value="https://www.yoursite.com/checkout_complete.php">
    <input type="hidden" name="rm" value="2">
    <input type="hidden" name="cbt" value="Return to The Store">
    <input type="hidden" name="cancel_return" value="https://www.yoursite.com/paypal_cancel.php">
    <input type="hidden" name="lc" value="US">
    <input type="hidden" name="currency_code" value="USD">
    <input type="image" src="http://www.paypal.com/en_US/i/btn/x-click-but01.gif" name="submit" alt="Make payments with PayPal - its fast, free and secure!">
</form>

amablemente vaya a través de los campos notify_url, return, cancel_return

código de muestra para manejar ipn (my_ipn.php) que es solicitado por paypal después de que se haya realizado el pago.

Para obtener más información sobre cómo crear una IPN, consulte este enlace.

<?php
// Check to see there are posted variables coming into the script
if ($_SERVER['REQUEST_METHOD'] != "POST")
    die("No Post Variables");
// Initialize the $req variable and add CMD key value pair
$req = 'cmd=_notify-validate';
// Read the post from PayPal
foreach ($_POST as $key => $value) {
    $value = urlencode(stripslashes($value));
    $req .= "&$key=$value";
}
// Now Post all of that back to PayPal's server using curl, and validate everything with PayPal
// We will use CURL instead of PHP for this for a more universally operable script (fsockopen has issues on some environments)
//$url = "https://www.sandbox.paypal.com/cgi-bin/webscr";
$url = "https://www.paypal.com/cgi-bin/webscr";
$curl_result = $curl_err = '';
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $req);
curl_setopt($ch, CURLOPT_HTTPHEADER, array("Content-Type: application/x-www-form-urlencoded", "Content-Length: " . strlen($req)));
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_VERBOSE, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_TIMEOUT, 30);
$curl_result = @curl_exec($ch);
$curl_err = curl_error($ch);
curl_close($ch);

$req = str_replace("&", "\n", $req);  // Make it a nice list in case we want to email it to ourselves for reporting
// Check that the result verifies
if (strpos($curl_result, "VERIFIED") !== false) {
    $req .= "\n\nPaypal Verified OK";
} else {
    $req .= "\n\nData NOT verified from Paypal!";
    mail("[email protected]", "IPN interaction not verified", "$req", "From: [email protected]");
    exit();
}

/* CHECK THESE 4 THINGS BEFORE PROCESSING THE TRANSACTION, HANDLE THEM AS YOU WISH
  1. Make sure that business email returned is your business email
  2. Make sure that the transaction�s payment status is �completed�
  3. Make sure there are no duplicate txn_id
  4. Make sure the payment amount matches what you charge for items. (Defeat Price-Jacking) */

// Check Number 1 ------------------------------------------------------------------------------------------------------------
$receiver_email = $_POST['receiver_email'];
if ($receiver_email != "[email protected]") {
//handle the wrong business url
    exit(); // exit script
}
// Check number 2 ------------------------------------------------------------------------------------------------------------
if ($_POST['payment_status'] != "Completed") {
    // Handle how you think you should if a payment is not complete yet, a few scenarios can cause a transaction to be incomplete
}

// Check number 3 ------------------------------------------------------------------------------------------------------------
$this_txn = $_POST['txn_id'];
//check for duplicate txn_ids in the database
// Check number 4 ------------------------------------------------------------------------------------------------------------
$product_id_string = $_POST['custom'];
$product_id_string = rtrim($product_id_string, ","); // remove last comma
// Explode the string, make it an array, then query all the prices out, add them up, and make sure they match the payment_gross amount
// END ALL SECURITY CHECKS NOW IN THE DATABASE IT GOES ------------------------------------
////////////////////////////////////////////////////
// Homework - Examples of assigning local variables from the POST variables
$txn_id = $_POST['txn_id'];
$payer_email = $_POST['payer_email'];
$custom = $_POST['custom'];
// Place the transaction into the database
// Mail yourself the details
mail("[email protected]", "NORMAL IPN RESULT YAY MONEY!", $req, "From: [email protected]");
?>

La siguiente imagen lo ayudará a comprender el proceso de PayPal. Flujo de proceso de PayPal

Para más información, consulte los siguientes enlaces;

Espero que esto te ayude..:)

Prashanth Pratapagiri
fuente
1
¿Alguien sabe si esto todavía es válido con las API de PayPal de hoy? Veo que la pregunta tiene 2 años.
Matt Welander
1
Las URL 'return' y 'cancel_return' se usan para proporcionar comentarios inmediatos de la transacción al comprador, y pueden usar variables PDT para eso. Sin embargo, PP solo intenta una vez con ellos, por lo que no se puede confiar en ellos para el cumplimiento de pedidos críticos (por ejemplo, el comprador cierra el navegador después del pago, pero aún en PP). Para eso, es posible que también desee realizar una copia de seguridad con el proceso confiable de IPN, a través de 'notify_url', procesando el estado 'Completado' como mínimo (suponga que cualquier otra cosa es un error, tal vez requiera una negociación manual). El procesamiento de su servidor PDT e IPN deberá garantizar que el pedido solo se complete una vez.
Patanjali
Creo que las cosas han cambiado y Paypal success.php ahora solo funciona con variables GET. Ver aquí: stackoverflow.com/questions/45671366/…
Sol
23

Una forma que he encontrado:

intente insertar este campo en su código de formulario generado:

<input type='hidden' name='rm' value='2'>

rm significa método de retorno ;

2 medios (post)

Después de que el usuario compra y regresa a la URL de su sitio, esa URL también obtiene los parámetros POST

ps si usa php, intente insertar var_dump($_POST);en su url de retorno (script), luego realice una compra de prueba y cuando regrese a su sitio verá qué variables se encuentran en su url.

T.Todua
fuente
¿De verdad usaste esto?
Simon Gibbs
Esto fue genial. Mientras la transferencia de datos de pago esté desactivada en PayPal, recibirá todas las configuraciones de publicación que se envían a la URL de retorno.
JulianJ
4

Compartir esto ya que recientemente encontré problemas similares a este hilo

Durante mucho tiempo, mi script funcionó bien (formulario de pago básico) y devolvió las variables POST a mi página success.php y los datos de IPN como variables POST también. Sin embargo, últimamente, noté que la página de retorno (success.php) ya no recibía ninguna variable POST. ¡Probé en Sandbox y vivo y estoy bastante seguro de que PayPal ha cambiado algo!

Notify_url aún recibe los datos IPN correctos que me permiten actualizar DB, pero no he podido mostrar un mensaje de éxito en mi página de URL de retorno (success.php).

A pesar de intentar muchas combinaciones para activar y desactivar las opciones en las preferencias de pago del sitio web de PayPal e IPN, tuve que hacer algunos cambios en mi script para asegurarme de que aún pueda procesar un mensaje. He logrado esto activando PDT y Auto Return, después de seguir esta excelente guía .

Ahora todo funciona bien, pero el único problema es que la URL de retorno contiene todas las variables PDT, ¡lo cual es feo!

También puede encontrar esto útil

Sol
fuente
3

¡Creo que la idea de establecer los valores de Retorno automático como se describe anteriormente por Kevin es un poco extraña!

Supongamos, por ejemplo, que tiene varios sitios web que utilizan la misma cuenta de PayPal para gestionar sus pagos, o que tiene una serie de secciones en un sitio web que realizan diferentes tareas de compra y requieren diferentes direcciones de devolución cuando el pago esta completado. Si pongo un botón en mi página como se describe arriba en la sección 'Formulario de muestra usando PHP para pagos directos', puede ver que hay una línea allí:

input type="hidden" name="return" value="https://www.yoursite.com/checkout_complete.php"

donde establece el valor de retorno individual. ¿Por qué tiene que configurarse en general, también en la sección de perfil?!?!

Además, debido a que solo puede establecer un valor en la Sección de perfil, significa (AFAIK) que no puede usar el Retorno automático en un sitio con múltiples acciones.

Comentarios por favor?

Tim Makins
fuente
3
el parámetro de retorno se puede pasar para cada formulario anulando la configuración de url de retorno automático en la configuración de paypal
DropHit
1
Sí, lo que dijo DropHit, ese es solo el valor de retorno automático predeterminado, en caso de que olvides pasarlo como parámetro. si lo pasa como parámetro, usará su URL de retorno para cada uno de sus sitios web.
Hamish
¿esto ayuda? codeseekah.com/2012/02/11/…
hamish
@DropHit ¿PDT todavía funciona con returnvalores anulados por botón entonces? ¿Entonces puedo tener diferentes páginas de retorno que todavía recibirán datos PDT?
Dai
Perdón por la respuesta tardía: no estoy seguro de que funcione, PERO mis integraciones actuales siguen funcionando como se esperaba, aunque eso no garantiza que su caso de uso funcione como el mío
DropHit
1

en la página de pago, busque el elemento de formulario oculto 'cancel_return':

establezca el valor del elemento de formulario cancel_return en la URL a la que desea volver:

Rahul Shinde
fuente
En realidad, 'cancelar devolución' solo se usa cuando la transacción falla. También DEBE proporcionar una URL de 'devolución' para manejar transacciones completadas con éxito; de lo contrario, se utilizará la URL predeterminada para ellas.
Patanjali
No cuando la transacción falla, sino más bien, cuando el comprador hace clic en el enlace "Cancelar y volver al [nombre del comerciante]" durante el proceso de pago para abandonar la finalización de su pedido.
SubGothius