La API de Stripe para crear nuestra pasarela de pagos con PHP puro y CodeIgniter
- Andrés Cruz
En esta entrega de PHP vamos a ver cómo emplear la poderosa librería de Stripe para nuestros proyectos webs empleando PHP; veremos la lógica para crear un pago, también veremos conceptos claves para poder crear un sistema de suscripción, y daremos varias referencia a la API de Stripe para poder emplear esta plataforma de pagos con nuestros proyectos en PHP como un experto; también daremos un pequeño bonus de como integrar esta librería de pagos en un proyecto en CodeIgniter fácilmente.
Registrándose en el panel de Stripe
Lo primero que debemos hacer es irnos a la web oficial del Stripe en:
StripeComo vemos es un sistema que nos recuerda algo a PayPal que ya lo hemos tratado en otras entradas:
Y a la final lo que queremos nosotros es tener un sitio en donde podamos realizar pagos de manera sencilla y segura desde nuestra plataforma y que tengamos muchas opciones, como las tiene Stripe, solo que algunas cosas pueden resultar algo confusas y para eso es esta entrada.
Descargando la API de Stripe para PHP
Ya metiéndonos en el desarrollo de software con PHP y Stripe, lo primero que tenemos que hacer es lo normal, irnos a s repositorio en GItHub y hacernos con nuestra versión de Stripe PHP:
GitHub: Stripe PHP bindingsTambién la podemos instalar vía Composer como detalla la documentación.
Configurando la aplicación PHP con Stripe
Luego de descargada y descomprimida la API de Stripe, nos volvemos al panel web en donde nos creamos la cuenta momentos antes para empezar a trabajar con Stripe e integrarlo en nuestras aplicaciones en PHP nativo u otros proyectos como CodeIgniter como veremos un poco más adelante; luego desde este panel tenemos que al apartado de Developers y en API keys y hacernos con una clave que emplearemos para poder referenciar la cuenta de usuario que creamos anteriormente en nuestro proyecto en PHP:
Desde PHP nos basta crear un archivo sencillo e incluir el siguiente archivo:
require_once('./stripenew/lib/Stripe.php');
Ya con esto integramos la API de Stripe en una app PHP, o en nuestro archivo para ser más exactos; ahora como paso fundamental es indicar la API de Stripe con la cual vamos a trabajar; para ello:
\Stripe\Stripe::setApiKey("Mi-Clave-Stripe");
Allí es un buen lugar para colocar la clave; ya queda de ti registrar la clave en la base de datos, en un archivo aparte, una variable global o lo que quieras; otro punto importante es que si no cuentas con un certificado SSL, es decir, conexión HTTPS o conexión seguro, entonces debes establecer la siguiente función en false
:
\Stripe\Stripe::setVerifySslCerts(false);
Creando un pago desde Stripe con PHP
Lo primero que seguramente quieres hacer es un sencillo pago, es decir, tienes un producto o servicio en tu aplicación web y quieres venderlo y por lo tanto recibir un pago por ello; para esto desde Stripe tenemos el siguiente método:
\Stripe\Payout::create([ "amount" => 400, "currency" => "usd", ]);
Y listo, con esto realizamos un pago de algún servicio o lo que sea que represente el pago; por supuesto, ya queda por parte de nosotros colocarle el resto de la lógica y registrarlo en la base de datos; Stripe nos devuelve muchísima información la cual podemos emplear para conectarnos y traernos más datos, como generar reportes etc; un ejemplo de la data devuelta sería:
Stripe\Payout JSON: { "id": "tr_10340J2eZvKYlo2Cg42HilbB", "object": "payout", "amount": 5687, "arrival_date": 1386374400, "automatic": true, "balance_transaction": "txn_19XJJ02eZvKYlo2ClwuJ1rbA", "created": 1386212146, "currency": "usd", "description": "STRIPE PAYOUT", "destination": NULL, "failure_balance_transaction": NULL, "failure_code": NULL, "failure_message": NULL, "livemode": false, "metadata": { "orderId": "6735", "order_id": "6735" }, "method": "standard", "source_type": "card", "statement_descriptor": NULL, "status": "paid", "type": "bank_account" }
Esto es tomado de la documentación oficial, puedes consultar los links que les dejo al final de esta entrada y ver todo los que nos ofrece Stripe para crear nuestra pasarela de pagos fácilmente.
Creando un sistema de suscripción con Stripe
El otro caso que quería traerles, es como crear un sistema de suscripión; típicamente las suscripciones a los sistemas tienen un mes de duración en base a un plan y es asignado a un usuario que les interese nuestros servicios; para ello Stripe nos ofrece un poderosos y sencillos métodos para crear nuestro sistema de suscripción como veremos en la siguiente sección de esta entrada.
Creando un plan de Stripe con PHP
Desde la plataforma no me ha quedado muy claro en donde creamos un plan ya que aunque la plataforma de Stripe indica que es un Plan, en realidad es un producto y cuando intentamos referenciar un poco más adelante en esta entrada, pues nos da un error; por tal motivo, crearemos el plan desde PHP empleando la API de Stripe que ya configuramos previamente:
\Stripe\Plan::create(array( "amount" => 5000, "interval" => "month", "product" => array( "name" => "Gold special" ), "currency" => "usd", "id" => "gold-special" ));
Cómo puedes darte cuenta, es muy fácil crear nuestro propio módulo para administrar, todo o prácticamente todo para que nuestra tienda funcione, o nuestra aplicación realice los pagos que queramos; todo está muy bien organizado y mediante un plan que lo puedes asociar a tus usuarios puedes realizar el cobro, los datos que tenemos que mantener de Stripe son mínimos, prácticamente los ID de todos, los IDs del plan en este caso y del customerStripe
y lo demás que nos pueda interesar.
Con el código anterior creamos un plan con identificador gold-special
identificadores que no quedan así de presentables si los creas desde el panel de Stripe; lo siguiente que debemos hacer es crear al usuario al que va a pagar ese Plan.
Creando un usuario en Stripe con PHP
Este puede ser otro de las cosas que se nos puede hacer difícil de entender, ya que tenemos que registrar al usuario en Stripe, pero no tan así es registrar a nuestro usuario de nuestra app en PHP en nuestro módulo de Stripe; para ello empleamos la siguiente función:
$customer = \Stripe\Customer::create(array( 'email' => $_POST['stripeEmail'], 'source' => $_POST['stripeToken'] ));
Esto tiene que estar acompañado de un formulario en PHP que es el que envía el POST, ya que como ves hay datos como el email de Stripe y un token; todo esto es generado por Stripe y nosotros solo tenemos que recibirlo; el formulario de Stripe es el siguiente:
<form action="/create_subscription.php" method="POST"> <script src="https://checkout.stripe.com/checkout.js" class="stripe-button" data-key="pk_test_TYooMQauvdEDq54NiTphI7jx" data-image="/images/marketplace.png" data-name="My App Name" data-description="Subscription for 1 month box" data-amount="5000" data-label="Sign Me Up!"> </script> </form>
Que luce de la siguiente forma:
Recuerda modificar el action
del formulario para que apunte a tu archivo PHP o controlador y su acción.
Este formulario es tomado de la documentación oficial cuyo link dejo al final de esta entrada.
Muy importante, o algo que debes de tomar en cuenta, es guardar el id del customer que nos genera, para poder atarlo a nuestro modelo de datos y referenciar cuando necesites; para obtener el id del customer Stripe nada más fácil:
$customer_id = $customer->id;
Creando la suscripción en Stripe con PHP
Finalmente, ya tenemos nuestro Plan, el usuario customer de Stripe, y un formulario para crear el usuario de Stripe, ahora con todo esto, podemos crear nuestra suscripción a nuestro usuario:
$subscription = \Stripe\Subscription::create(array( 'customer' => $customer_id, 'items' => array(array('plan' => $plan->plan_stripe_id));
Cómo ves, como piezas fundamentales necesitamos el customer de Stripe y el ID del plan, y ya todo tiene sentido; aquí al ser una suscripción y si o quieres estar consultando la API de Stripe en cada momento para que tu app haga algo, deberíamos guardar varios datos, como el id del la suscripción, las fechas de inicio y de finalización y el ID del plan entre demás data que veas necesaria:
$data = array( 'start' => date("Y-m-d H:i:s", $subscription->current_period_start), 'end' => date("Y-m-d H:i:s", $subscription->current_period_end), 'plan_id' => $plan_id, 'suscription_paid' => $subscription->id, 'fc_user_id' => $_SESSION['fc_session_user_id'] );
Aquí también le agregamos el id de una sesión de usuario, aunque este código es opcional, y este ID NO es de Stripe si no de nuestra aplicación.
Extra: Integrando la librería de pagos en CodeIgniter
Por supuesto no podíamos hablar de de una pasarela de pago y algún sistema tan poderoso como Stripe y dejar un framework por fuera, nuestro framework estrella que ya anda por la versión 4; CodeIgniter; para poder usar cómodamente Stripe en nuestras aplicaciones podemos crear una librería llamada Stripe o algo por el estilo y hacemos el siguiente include:
require_once APPPATH."third_party/stripe/init.php";
Una vez creada la librería la importamos y luego vuelve al inicio de la entrada y prueba todo el código sin problemas.
Recursos y conclusiones
Este es un ejemplo muy bueno que nos permite conocer cómo trabajar con Stripe y las suscripciones, es básicamente lo que vimos antes pero con la documentación oficial:
Stripe: Building a Subscription Signup FormBásicamente narra mediante un ejemplo de una granja como realizar una suscripción por una semana en esa plataforma.
Aquí podemos ver todos los eventos que podemos obtener de Stripe:
Stripe: API ReferenceAquí hay para realizar conexiones para todo, y creeme todo hay muchísimas cosas que podemos hacer, la gestión de productos, refunds, disputas, customers, balance, invoices o facturas, cupones, planes suscripciones, y un largo etc, con esto puedes hacerte mejor a la idea de todo lo que nos ofrece Stripe y porqué es ya una plataforma tan conocida, nos permite crear una completa y compleja pasarela de pago para nuestros clientes muy fácilmente; todo está bien especificado y lo puedes ver en el enlace anterior; puedes tomar lo explicado en esta entrada y editarlo para que se adapte a lo que deseas realizar.
Recuerda también que todo llamado a la API de Stripe, esta plataforma nos devuelve una respuesta con la cual puedes validar la data devuelta.
Desarrollo con Laravel, Django, Flask, CodeIgniter, HTML5, CSS3, MySQL, JavaScript, Vue, Android, iOS, Flutter