pasarela pagos pago metodo integrar developer con boton application php paypal paypal-ipn paypal-sandbox

php - pagos - paypal com api



La producción de PayPal funciona de forma diferente a la caja de arena (1)

Esencialmente, la solución aquí es una de dos opciones:

  1. Cree un método secundario de finalización; en otras palabras, el IPN no es la primera línea de defensa para una actualización comprada de software. Todo en mi lado está funcionando, sin embargo, el tiempo de la llamada IPN (notify_url) es demasiado lento para hacer actualizaciones instantáneas no exactamente instantáneas. Devuélvalos a una página que realice la actualización y luego redireccione.

  2. Almacene las funciones actualizadas detrás de una ruta diferente; esta fue la sugerencia de PayPal. Básicamente, tiene app.com/basic y app.com/upgraded. Esto no es realmente ideal, ni lo sugeriría como una solución permanente.

En resumen, este es un problema conocido con PayPal. Los flujos de trabajo de sandbox y producción son básicamente diferentes, no por función o API, sino por uso: la cuenta del nivel de producción se está volviendo más golpeada, y el tiempo que lleva procesar las notificaciones es mucho más lento.

Espero que esto ayude a alguien.

He creado una aplicación que envía una URL de notificación con el GUID del usuario conectado a PayPal, y una vez completada la compra, se llama a la url y, después de la verificación, la entrada de la base de datos de usuario actualiza la columna purchased de 0 a 1.

Luego, el usuario hace clic en el botón Volver a la aplicación y la funcionalidad premium se muestra en función de la columna purchased .

He estado probando esto durante los últimos meses en la caja de arena. El 100% de las veces evaluadas (incluso después de este problema), la pestaña premium aparece después de la finalización de la compra.

El cliente está encantado y le da el visto bueno para pasar a la producción. Configuré IPN con exactamente la misma URL , no cambié literalmente nada, excepto cambiar de www.sandbox.paypal.com a www.paypal.com y cambiar la cuenta del negocio de la zona de pruebas al negocio personal.

La cuestión es que el botón ahora no aparece, hasta que actualiza la pantalla. Al hacer clic en el botón "regresar a la aplicación", que anteriormente funcionaba como se esperaba, ahora no se muestra la pestaña premium. Una vez que hago clic en actualizar, aparece. Si cambio todo a la configuración de la caja de arena, boom - funciona bien de nuevo.

Aquí está el código del botón BuyNow con cuenta de producción:

<form action="https://www.paypal.com/cgi-bin/webscr" method="post" id="buynowForm" target="_top"> <input type="hidden" name="cmd" value="_xclick"> <input type="hidden" name="business" value="ACCOUNT EMAIL"> <input type="hidden" name="lc" value="US"> <input type="hidden" name="item_name" value="Product"> <input type="hidden" name="amount" value="10.00"> <input type="hidden" name="currency_code" value="USD"> <input type="hidden" name="button_subtype" value="services"> <input type="hidden" name="no_note" value="1"> <input type="hidden" name="no_shipping" value="1"> <input type=''hidden'' name=''notify_url'' value=''http://app.com/purchase/<?php echo $data[0][''uid''] ?>''> <input type=''hidden'' name=''return'' value=''http://app.com/''> <input type="hidden" name="rm" value="1"> <input type="hidden" name="cbt" value="Return to Product Plus"> <input type="hidden" name="bn" value="PP-BuyNowBF:btn_buynowCC_LG.gif:NonHosted"> <input type="submit" class="hidden-print visible-print" border="0" name="buysubmit" value="Click For Product Plus" alt="Click for Product Plus"> <img alt="" border="0" src="https://www.paypal.com/en_US/i/scr/pixel.gif" width="1" height="1">

Y aquí está la ruta de procesamiento llamada arriba:

$app->post(''/purchase/:uid'', function ($uid) use ($app) { $request = Slim::getInstance()->request(); $inputs = json_decode($request->getBody()); $db_conn = conn(); $req = ''cmd=_notify-validate''; foreach ($_POST as $key => $value) { if (get_magic_quotes_gpc()) { $_POST[$key] = stripslashes($value); $value = stripslashes($value); } $value = urlencode($value); $req .= "&$key=$value"; } $url = "https://www.paypal.com/cgi-bin/webscr"; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL,$url); curl_setopt($ch, CURLOPT_FAILONERROR, 1); curl_setopt($ch, CURLOPT_RETURNTRANSFER,1); curl_setopt($ch, CURLOPT_TIMEOUT, 3); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $req); $result = curl_exec($ch); curl_close($ch); if (strcmp ($result, "VERIFIED") == 0) { $sql_st = ''UPDATE `user_data` SET `purchased` = 1 WHERE uid=:uid''; $sql = $db_conn->prepare($sql_st); if ($sql->execute(array(''uid''=>$uid))) { $data = array(''status'' => "Ok"); } else { $data = array(''status'' => print_r(mysql_error())); } } else { // Did Not Process IPN Properly } });

REALMENTE espero que esto sea algo increíblemente tonto de mi parte. Cualquier ayuda / guía es apreciada.