Cómo configurar pagos recurrentes

Es probable que, en algún momento, desee implementar pagos recurrentes o de suscripción para un SaaS u otro servicio. Afortunadamente, PayPal ofrece las herramientas que necesitamos para implementar una solución de pago de suscripción totalmente integrada..


Lo que vamos a construir

Nota: Estoy usando Laravel en este tutorial, pero puedes aplicar estos conceptos a otros lenguajes y marcos..

Configuraremos PayPal para aceptar pagos de suscripción y configurar nuestro servicio de escucha de notificación de pago instantáneo (IPN). Una vez que completemos el componente de registro, veremos el proceso de cancelación a través de la API de PayPal. Estoy empezando con una aplicación barebones Laravel con registro e inicio de sesión simples, y agregaremos los componentes que necesitamos para introducir los pagos de suscripción a medida que avanzamos en el tutorial.


Paso 1: Configuración de sus botones de suscripción

PayPal proporciona un campo personalizado que podemos usar para pasar la identificación del usuario.

Antes de comenzar, asegúrese de tener una cuenta comercial de PayPal. Es gratis, pero debe tener una cuenta comercial para implementar los pagos de suscripción en su sitio.

PayPal ofrece varios tipos de botones que podemos usar, incluyendo: Comprar ahora, Suscribirse y Facturación automática. Hoy, vamos a ver el botón de suscripción. Los botones de suscripción le permiten establecer el monto de facturación, así como el período de pago recurrente. También puede configurar un período de prueba y dejar que PayPal cree la cuenta de usuario cuando haga ping a su servidor.

Primero, ingrese a su cuenta de PayPal y navegue a Perfil -> Mis preferencias de venta. Entonces busca el Botones de PayPal sección y seleccione Suscripciones de la lista desplegable. Asegúrate de completar el resto de la información..

Recomiendo dejar la casilla "Hacer que PayPal cree nombres de usuario y contraseñas para los clientes" sin marcar y seleccionar la opción "Usar mi ID de cuenta de vendedor segura".

Vamos a permitir que los usuarios se registren para obtener una cuenta gratuita y luego se actualicen más adelante..

Crea tu botón y copia el código generado; lo usaras en tu aplicacion.

Pasando información adicional

Como estamos vinculando las suscripciones a las cuentas, necesitamos saber quién realiza un pago. La forma más sencilla de hacerlo es hacer coincidir la dirección de correo electrónico de la transacción de PayPal con la cuenta de correo electrónico utilizada para iniciar sesión en nuestra aplicación. Sin embargo, esto no es infalible porque muchas personas usan diferentes direcciones de correo electrónico. Así que tenemos que pasar la identificación del usuario de nuestra aplicación a PayPal.

Afortunadamente, PayPal proporciona un campo personalizado que podemos usar para pasar la identificación del usuario. Tiene un límite de 256 caracteres. Así que voy a usar una estructura JSON, que nos permite pasar información adicional en caso de que necesitemos.

Asegúrese de revisar la lista completa de variables HTML aceptadas.


Paso 2: Preparando su aplicación

Primero debemos configurar nuestra tabla de pagos, donde almacenaremos nuestras transacciones. Vamos a crearlo con las siguientes columnas:

  • carné de identidad: Un entero de incremento automático y nuestra clave principal.
  • txn_id: Nuestra identificación de transacción que PayPal nos dará. Establece esto como una varchar.
  • user_id: Usaremos esto para configurar nuestra relación con la tabla de usuarios, un entero lo hará.
  • paypal_id: El ID de perfil de PayPal que necesitaremos para manejar las cancelaciones más adelante. Establece esto como una varchar.
  • Creado en: Usaremos esto para ver cuándo se completa la transacción y comenzar la suscripción.

Además, agregue un suscripción columna a tu usuario mesa. Voy a configurar esto como un entero para permitir múltiples niveles: uno, dos y tres para desbloquear funciones adicionales. También he seguido adelante y he creado el modelo que nos permitirá interactuar con la tabla de pagos..


Paso 3: Escribiendo a tu oyente

PayPal proporciona una solución simple para notificarnos cuando un pago ha sido procesado; lo llaman Notificaciones de pago instantáneo (IPN). Para aprovechar la IPN, necesitamos crear un servicio de escucha de IPN para nuestra aplicación. El oyente valida los datos, los inserta en nuestra tabla de pagos y establece el nivel de suscripción del usuario..

Por suerte no tenemos que reinventar la rueda gracias a esta práctica clase. Usaremos el IpnListener clase para verificar rápidamente los datos, y luego podemos procesarlos para insertarlos en nuestra base de datos. Con Laravel, podemos colocar la clase en nuestra carpeta de bibliotecas, lo que hace que sea una carga automática para nosotros.

Cree un nuevo controlador o ruta y agregue el siguiente código:

$ listener = new IpnListener (); intente $ verified = $ listener-> processIpn ();  catch (Exception $ e) exit (0);  if ($ verificado) // La respuesta de IPN fue "VERIFICADA" else else // La respuesta de IPN fue "NO VÁLIDA"

Llamé a mi archivo ipn.php, y lo mapearé para / ipn. No olvides que PayPal se enviará a esta URL; así que si estás usando verbos HTTP / REST, configúralo en consecuencia. Desde aquí podemos procesar nuestros datos:

$ listener = new IpnListener (); intente $ verified = $ listener-> processIpn ();  catch (Exception $ e) return Log :: error ($ e-> getMessage ());  si ($ verificado) $ datos = $ _POST; $ user_id = json_decode ($ data ['custom']) -> user_id; $ suscripción = ($ datos ['mc_gross_1'] == '10')? 2: 1; $ txn = array ('txn_id' => $ data ['txn_id'], 'user_id' => $ user_id, 'paypal_id' => $ data ['subscr_id'], 'suscripción' => $ suscripción, 'expira' => fecha ('Ymd H: i: s', strtotime ('+ 1 Month')),); Pago :: crear ($ txn);  else Log :: error ('Transacción no verificada'); 

En este código, primero decodificamos el JSON pasado a nuestro campo personalizado, lo que nos permite acceder fácilmente a la ID de usuario. Luego, establecemos el nivel de suscripción según el monto de la transacción y lo almacenamos en la base de datos. También registramos cualquier error usando la clase Log de Laravel. También podría ser bueno enviar un recibo al usuario, pero se lo dejaré a usted..


Paso 4: habilitar IPN

A continuación, debemos habilitar IPN y configurar PayPal para hacer ping a nuestro oyente. Debido a que el panel de administración de PayPal puede ser difícil de navegar, he incluido las siguientes capturas de pantalla como guía. Ir Perfil -> Preferencias de venta:

Entonces busca Notificaciones de pago instantáneo:

A continuación, haga clic en Elija la configuración de IPN:

Y luego ingrese la URL a su oyente:


Paso 5: obtener su nombre de usuario, contraseña y firma de API

Mientras estamos en el panel de control, vale la pena obtener nuestras credenciales de API antes de ordenar nuestro proceso de cancelación. Ir Perfil -> Preferencias de venta:

Buscar Acceso API:

Seleccionar opcion 2:

Solicitar una firma API:

Y toma nota de tus credenciales:


Paso 6: Manejo de cancelaciones

Debe tener una cuenta de negocios para implementar los pagos de suscripción.

Nota: Necesitará un certificado SSL para manejar las cancelaciones o PayPal con un error de lanzamiento..

Para proporcionar la mejor experiencia de usuario, es probable que desee manejar las cancelaciones dentro de su aplicación o servicio. PayPal proporciona algunas API que nos permiten hacer esto: NVP o SOAP. Recomiendo ir con NVP.

La documentación de PayPal parece complicar en exceso las cosas, pero NVP (Nombre-Valor-Par) es esencialmente una cadena codificada en URL que podemos restringir..

El método que nos interesa es ManageRecurringPaymentsProfileStatus. Podemos cambiar el estado de la suscripción seleccionando una de las siguientes tres acciones:

  • Cancelar: Solo las suscripciones activas o suspendidas pueden ser canceladas. La elección de esta acción evita que el usuario se reactive más tarde.
  • Suspender: Solo las suscripciones activas pueden ser suspendidas. Esta acción permite a los usuarios reactivar su suscripción posteriormente..
  • Reactivar: Solo se pueden reactivar las suscripciones suspendidas, reinstalando la suscripción.

Vamos a utilizar la acción de cancelación, ya que nuestros botones de suscripción crean una suscripción completamente nueva si el usuario desea volver a activarla más adelante. Así que nuestra solicitud se vería algo así:

$ input = Input :: all (); $ req = array ('USER' => 'YOUR_API_USER', 'PASSWORD' => 'YOUR_API_PASSWORD', 'SIGNATURE' => 'YOUR_API_SIGNATURE', 'VERSION' => '76 .0 ',' METHOD '=>' ManageRecurringPPPP.Print 'PROFILEID' => urlencode ($ input ['paypal_id']), 'ACTION' => 'Cancel', 'NOTE' => 'User cancel on website',); $ ch = curl_init (); // Intercambie estos si está probando con el sandbox // curl_setopt ($ ch, CURLOPT_URL, 'https://api-3t.sandbox.paypal.com/nvp'); curl_setopt ($ ch, CURLOPT_URL, 'https://api-3t.paypal.com/nvp'); curl_setopt ($ ch, CURLOPT_VERBOSE, 1); curl_setopt ($ ch, CURLOPT_SSL_VERIFYPEER, FALSE); curl_setopt ($ ch, CURLOPT_SSL_VERIFYHOST, FALSE); curl_setopt ($ ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt ($ ch, CURLOPT_POST, 1); curl_setopt ($ ch, CURLOPT_POSTFIELDS, http_build_query ($ req)); curl_exec ($ ch); curl_close ($ ch); return Redirect :: to ('settings') -> with ('cancelled', true);

Ahora podemos cancelar fácilmente la suscripción, pero por alguna razón, PayPal optó por no enviar una solicitud de IPN. Sin embargo, esto no es un problema, ya que configuramos nuestra aplicación para incluir un expira columna. Así que podemos revisar ese campo para determinar si el usuario está suscrito..


Paso 7: Jugando en el arenero

PayPal proporciona una caja de arena para que podamos probar nuestra implementación. Si no ha usado esto antes, deberá crear una cuenta gratuita. Desde allí, podrá realizar pruebas con múltiples usuarios y transacciones para asegurarse de que su código funciona como se esperaba..

Vamos a probar a nuestro oyente, asegurándonos de que funcione correctamente sin tener que realizar transacciones reales. Antes de hacer algo en la zona de pruebas, debemos configurar nuestro servicio de escucha de IPN para hacer ping a la zona de pruebas en lugar del servidor en vivo.

$ listener-> use_sandbox = true;

Ahora dirígete a la zona de pruebas de PayPal, inicia sesión, haz clic Herramientas de prueba A la izquierda y abre el simulador de IPN..

Ingrese la URL de su oyente y seleccione Chequeo rápido Desde el desplegable. Puede usar la mayoría de los detalles predeterminados, pero no olvide colocar su JSON en el campo personalizado hacia la parte inferior de la página..


Paso 8: Comprobación de la suscripción

Así que configuramos nuestra suscripción y permitimos a los usuarios cancelar el servicio, ahora, ¿cómo comprobamos esto? Laravel lo hace fácil, y su método se traduce en muchos lenguajes y marcos. Voy a añadir un método a mi Usuario Modelo que nos da acceso a la suscripción utilizando la clase Auth de Laravel:

función pública suscripción () return Payment :: where ('user_id', '=', Auth :: user () -> id) -> where ('expires', '>', date ('Ymd H: i: s ', time ())) -> first (array (' abono ',' caduca ',' paypal_id ',' txn_id ')); 

Ahora podemos acceder a esto y verlo dentro de nuestros controladores y vistas muy fácilmente. Por ejemplo:

suscripción(); si ($ sub && $ sub-> suscripción == 1) echo 'Estás en el plan estándar';  elseif ($ sub && $ sub-> suscripción == 2) echo 'Estás en el plan premium';  else echo 'No estás suscrito'; ?>

En conclusión

Esperamos que este tutorial le haya dado una idea de lo fácil que es configurar pagos recurrentes o de suscripción en sus aplicaciones. PayPal no es de ninguna manera el único procesador de pagos, pero es uno de los más reconocidos y ampliamente utilizados..

Desde aquí, puede agregar recibos, recordatorios de pago y notificaciones de cancelación para crear una solución totalmente integrada.