Implementar compras in-app con GooglePlay & AppleStore en tu API

A la hora de añadir compras in-app en nuestras aplicaciones, tendremos que decidir si queremos abordar este proceso en su totalidad desde el front-end, o si queremos que el back-end (en caso de que contemos con uno) participe en la validación y procesamiento de las compras.

Hoy, en este post, vamos a abordar la segunda de las opciones, es decir, una implementación mixta que involucre tanto front-end como back-end. Nos vamos a centrar sobre todo en el back-end, dado que es el área que más domino, aunque aun así vamos a hablar de ciertos requisitos a afrontar desde el front-end.

A partir de ahora, nos vamos a referir a las compras in-app como IAP (del ingles in-app purchase).

Apple Store

Para esta integración, nos ayudaremos de la documentación de Apple.

CONFIGURACIÓN PREVIA & FRONTEND 
Antes de empezar, asegúrate de haber configurado los datos bancarios y firmado el “Paid Applications Agreement” en App Store Connect. También deberas crear algún producto que vender dentro de la configuración del App Store Connect. Una vez hecho lo anterior solo te quedara integrar las vistas de la tienda en tu aplicación con la ayuda de StoreKit y podrás ofrecer compras & suscripciones a tus usuarios.

Teniendo las IAP funcionando en nuestro frontal, podremos abordar la parte de backend de esta implementación. Para ello vamos a asegurarnos de que hemos habilitado las “App Store Server Notifications” y hemos añadido las URLs de nuestros diferentes entornos en SANDBOX y en Producción en la configuración de App Store Connect.

¿Qué hemos logrado con esto? 

Cada vez que un usuario realice una compra o una modificación de una suscripción vamos a recibir en la URL que hemos configurado una llamada con un objeto JSON que incluye información actualizada de la transacción.
Estas notificaciones, deberán ser validadas e interpretadas por nuestro backend, ademas, debemos responder al HTTP POST con un 200 OK, de lo contrario seguirán enviando la misma notificación porque se entenderá como no recibida.

VALIDACIÓN

Para validar una App Store Server Notifications debemos comprobar que la propiedad signedPayload recibido en el JSON es un token JWT valido firmado por Apple. Para ello podemos implementar código propio ayudándonos de la guía sobre JWTs de mi compañero Mangel o usar una librería externa que se encargue de ello como este ejemplo en Node. También adjunto la propia documentación de Apple que describe el JWT que se recibe en la llamada.

INTERPRETACIÓN

El primer paso a seguir es desencriptar el payload del JWT recibido. Una vez completado este paso, tendremos un objeto que Apple llama “responseBodyV2DecodedPayload”. Nos interesarán los campos “notificationType” y “subtype” ya que el conjunto de estos dos estado nos permitirá identificar la acción realizada por el usuario (compra, subscripción, renovación automática, etc…).

Ademas también haremos uso del campo “data”, este a su vez incluye un campo llamado “signedTransactionInfo”, que es un JWT que incluye información adicional sobre la transacción.

Una vez lo desencriptemos, tendremos un objeto que incluye campos que nos pueden ser utiles para gestionar las suscripciones, como podría ser el appAccountToken, el expiresDate, el productId, etc…

No hay una forma ideal de manejar suscripciones y compras en Apple Store, al final cada implementación tendrá sus requisitos únicos y es nuestra labor como desarrolladores llevar a cabo un análisis y crear una solución personalizada que se ajuste a nuestras necesidades. En caso de que todo lo que te he contado en los párrafos anteriores te suene a chino, siempre puedes hacer uso de una librería de terceros para gestionar estos procesos, como por ejemplo este proyecto de GitHub, que cuenta con bastantes colaboradores y actualizan con frecuencia.

GooglePlay

Para esta integración, haremos uso de la documentación de Google.

CONFIGURACIÓN PREVIA & FRONTEND 
Antes de empezar, asegúrate de configurar una cuenta en Google Payments Center y asociarla a tu cuenta de Google Play Developer. Deberás integrar en tu app la Google Play Billing Library y crear las vistas necesarias para ofrecer una gran experiencia de compra a tus usuarios. No te olvides de crear algún producto / suscripción que vender en Google Play Console.

Teniendo las IAP funcionando en nuestro frontal, podemos abordar la parte de backend de esta implementación. Para ello debemos configurar las Real-time developer notifications (RTDN) y crear en Cloud Pub/Sub una suscripción al topic que hayamos configurado. Dicha suscripción debe ser de tipo Push y le indicaremos una URL de nuestro servidor al que queremos que lleguen las llamadas con la información sobre las transacciones de nuestros usuarios.  Aquí hay un post muy bueno en StackOverflow que indica cómo hacer esto último.

También deberemos configurar el Google Play Developer API en nuestro backend, para poder validar y obtener información sobre las transacciones realizadas por los usuarios. La documentación de Google explica bastante bien el proceso en la entrada de Getting Started with Google Play Developer API y en a entrada Using OAuth 2.0 Server to Server Applications. También existen librerías que ya se encargan de realizar esto por nosotros, como por ejemplo este proyecto oficial de Google.

question

¿Qué hemos logrado con esto?

Cada vez que un usuario realice una compra o una modificación de una suscripción vamos a recibir en la URL que hemos configurado una llamada con un objeto JSON que incluye información actualizada de la transacción.

Estas notificaciones, deberán ser validadas e interpretadas por nuestro backend, ademas, debemos responder al HTTP POST con un 200 OK, de lo contrario seguirán enviando la misma notificación porque se entenderá como no recibida.

VALIDACIÓN

Para validar un RTDN debemos desencriptar el campo data, del objeto recibido en la llamada de Google. Este va traer solo uno de los siguientes campos (ya que son mutuamente excluyentes), subscriptionNotificationoneTimeProductNotificationvoidedPurchaseNotification o testNotification. Todos ellos traen el campo purchaseToken, que es el que nos interesa de momento. Con ese token tenemos que hacer un HTTP GET a la Google Play Developer API para obtener toda la metadata relativa a la compra. Por lo tanto, podremos saber de primera mano que la información es verídica, ya que nosotros mismos haremos la llamada para obtener los datos.

INTERPRETACIÓN

El HTTP GET a la Google Play Developer API, realizada con el token recibido en la RTDN, nos devolverá un objeto SubscriptionPurchaseV2. Este objeto incluye toda la información necesaria para gestionar las compras y suscripciones en nuestro backend. Al igual que en la integración con Apple, podemos elegir procesar nosotros esta información, o dejar en manos de una librería de terceros dichas gestiones. Aquí un ejemplo de librería que puede ayudarnos a realizar gran parte de estas gestiones.

codigo

En este post hemos descrito a grandes rasgos el proceso de integración de las compras IAP, este proceso tiene muchos mas detalles de los que he explicado y además cada caso de uso tendrá unos requisitos especiales. Mi recomendación es que uses este post a modo de guía y profundices sobre el funcionamiento de las compras en ambas plataformas hasta ser capaz de diseñar una solución a medida.

Full-Stack

Picture of Marius Serban

Marius Serban

Soy un manitas, me gustan los retos.
Picture of Marius Serban

Marius Serban

Soy un manitas, me gustan los retos.

We are HIRING!

What Can We Do