C贸mo integramos el sistema de pago en el proyecto ruso

imagen

Hace cinco meses, publicamos un m贸dulo NPM para trabajar con la nueva versi贸n de Yandex.Kassa, que se lanz贸 en octubre de 2017. Nuestro m贸dulo cay贸 en la documentaci贸n oficial y ya se ha descargado m谩s de 1300 veces.

imagen

En Habr茅, junto con colegas de Yandex, ya hablamos sobre la experiencia de crear el m贸dulo, pero nuestra experiencia que obtuvimos cuando nos enfrentamos a la integraci贸n del sistema de pago para los clientes rusos se qued贸 atr谩s.

Por lo tanto, hoy queremos decir c贸mo, para uno de nuestros clientes nacionales, pasamos de integrar sistemas de pago extranjeros que nos son familiares a los an谩logos rusos, qu茅 dificultades encontramos y c贸mo se resolvieron.

C贸mo trabajaron con los sistemas de pago


Anteriormente, solo trabaj谩bamos con sistemas de pago de clientes extranjeros. Tuvimos experiencia en la integraci贸n con Authorize.net, Paypal, Braintree, Stripe, Payoneer, Wirecard y Svea.

Con estos sistemas de pago es f谩cil interactuar e implementar diversas funciones. Por ejemplo, cuando est谩bamos trabajando en un servicio de carga en Europa, integramos varios sistemas de pago en el proyecto y escribimos un algoritmo: implementaba una l贸gica compleja de operaciones monetarias. Cuando un usuario solicit贸 un servicio, el sistema transfiri贸 dinero de la cuenta del cliente a la cuenta del servicio, y el algoritmo realiz贸 transacciones: recalcul贸 el pago en caso de problemas de entrega, lo convirti贸 a la moneda, realiz贸 un reembolso y reprogramaci贸n de pagos, cancel贸 el porcentaje de uso del servicio.

Los mejores representantes de los sistemas de pago le permiten comenzar el desarrollo en el sandbox incluso sin registrarse. Muchos tienen una excelente documentaci贸n, y casi todos ayudan a resolver problemas sin la participaci贸n activa del soporte. Los desarrolladores pueden administrar los derechos y el acceso desde una cuenta personal. Los sistemas de pago tienen un SDK para las plataformas m谩s populares, que ahora es el est谩ndar no escrito.

Para integrar un sistema de pago, un desarrollador necesita:

  1. Reg铆strese en el sitio y obtenga acceso al sandbox.
  2. Descargue el SDK y con茅ctelo. Inserte llamadas a las funciones del sistema de pago en los lugares correctos de la aplicaci贸n.
  3. Pruebe todos los escenarios y aseg煤rese de que todo funcione correctamente.
  4. Participe en otras tareas mientras el cliente resuelve problemas financieros y legales.
  5. En el momento adecuado, cambie la aceptaci贸n del pago al modo "combate".

Lo que ha cambiado


Hace un a帽o, comenzamos a trabajar en el mercado interno. Uno de los primeros proyectos fue la aplicaci贸n Sellsay . Ayuda a los usuarios a desarrollar habilidades en las negociaciones y tambi茅n es una plataforma para la asistencia profesional mutua.

La aplicaci贸n tiene muchas caracter铆sticas adem谩s de las funciones est谩ndar: autorizaci贸n y registro, creaci贸n y edici贸n de proyectos. A trav茅s del servicio puedes contactar
a un entrenador de negocios. Si tiene los conocimientos necesarios, puede obtener un certificado y convertirse en un entrenador independiente, participar en eventos y capacitaciones
de los creadores de la aplicaci贸n, ganar dinero.

Para poder pagar en el servicio, era necesario integrar un sistema de pago, uno en el que pueda pagar en rublos y d贸lares, transferir el plazo de pago y hacer un reembolso, guardar tarjetas y no ingresar datos al realizar compras repetidas, use Apple y Android Pay. Para implementar esto, elegimos el sistema Braintree.

Y luego hicimos un gran feil. Acordamos e implementamos la funcionalidad b谩sica de trabajar con el sistema de pago, pero no tomamos en cuenta un detalle importante. Lo supimos dos semanas antes del lanzamiento, cuando estaban preparando el proyecto para su lanzamiento. No tomamos en cuenta que Braintree no trabaja con empresas de Rusia. Registrar una empresa en los estados no es una opci贸n. Todav铆a tenemos una salida: reemplazar el sistema de pago lo antes posible.

Yandex.Kassa: trabajando con la primera versi贸n de la API


Despu茅s de analizar los sistemas, nos decidimos por Yandex.Cash: el servicio nos permiti贸 implementar casi toda la funcionalidad, era adecuado para el cliente a un precio y resolvi贸 el problema de 54 FZ al conectar una caja en l铆nea.

Un poco m谩s tarde, nos dimos cuenta de que nuestra visi贸n de integraci贸n es fundamentalmente diferente de la visi贸n de Yandex.Kassa y su servicio de seguridad. Toda la etapa de integraci贸n fue recordada m谩s por contratos interminables, formularios y llamadas telef贸nicas, en lugar de escribir c贸digo.

Por lo tanto, para obtener claves de prueba, debe proporcionar un enlace a la aplicaci贸n en Apple Store o Google Play. 驴D贸nde obtuvimos el enlace si la aceptaci贸n del pago es un requisito previo para publicar la aplicaci贸n? Logramos resolver este problema, pero hubo situaciones en las que fue necesario implementar y publicar la funcionalidad para su activaci贸n por parte del administrador.

S铆, casi todas las solicitudes se resuelven mediante comunicaci贸n con un gerente personal. Pero si las preguntas en su cuenta personal llegan a su gerente personal, entonces cuando llama, hay una alta probabilidad de llegar a un administrador libre y aleatorio en la l铆nea y obtener una respuesta completamente aleatoria. Despu茅s de un tiempo, busque otro gerente y obtenga la respuesta opuesta a la misma pregunta.

Otra desventaja: Yandex admite API de m煤ltiples generaciones. Incluso Yandex.Kassi tiene varios subsistemas que usan documentaci贸n diferente, autenticaci贸n, etc. Como resultado, debe implementar simult谩neamente API no relacionadas. Por ejemplo, est谩 aceptando pagos, y para la cancelaci贸n debe comenzar de nuevo: aplicaciones, contratos, llamadas, estudio e integraci贸n de API.

Las 煤ltimas semanas antes del lanzamiento se convirtieron en un infierno. Para comenzar el proyecto a tiempo, tuvimos que fortalecer el equipo y trabajar horas extras, y Yandex.Cash, mientras tanto, no perdi贸 la oportunidad de dejarnos poner nerviosos.

Comparaci贸n de Yandex.Kassa con Stripe


En la comunidad de desarrolladores, Stripe es l铆der en facilidad de integraci贸n y trabajo con el sistema de pago. Son los primeros en cuidar a los programadores y hacer que el sistema de pago sea lo m谩s conveniente y flexible posible. Esto permiti贸 a los desarrolladores no solo dar un suspiro de alivio, sino acelerar y reducir el costo del proceso de integraci贸n.

Puedes encontrar mucho en com煤n entre Yandex.Kassa y Stripe. Por ejemplo, ambos sistemas se basan en principios similares a REST, usan c贸digos de respuesta HTTP, admiten CORS (y las respuestas vienen en JSON), ambos admiten idempotencia. Hay una "caja de arena": una copia completa de la tienda real, y la transici贸n entre los modos es solo un reemplazo de las claves: no es necesario cambiar la API o la URL.

Pero al mismo tiempo, son muy diferentes, y para mostrar c贸mo estos sistemas tienen diferentes enfoques, consideraremos la implementaci贸n de algunas etapas utilizando ejemplos concretos.

Como la parte del servidor se implement贸 en Node.js en este proyecto, le dar茅 ejemplos.

Nos conectamos al proyecto .

Raya:

var stripe = require('stripe')('sk_test_...'); 

Yandex.Cash:

  ,    ;   

Solicitar detalles de la tarjeta

Raya:

Conecte la biblioteca del cliente de la misma manera y solicite un token con la pantalla del formulario para ingresar la tarjeta.

 var stripe = Stripe('pk_test_6pRNASCoBOKtIshFeQd4XMUh'); var elements = stripe.elements(); // Create an instance of the card Element var card = elements.create('card', { style: style }); // Add an instance of the card Element into the `card-element` <div> card.mount('#card-element'); // On form submit stripe.createToken(card).then(function(result) { // Send the token to your server stripeTokenHandler(result.token); } ); 

En el servidor

 stripe.charges.create({ amount: 2000, currency: "usd", source: "token from previous step", // obtained with Stripe.js description: "Charge for william.brown@example.com" }, function(err, charge) { // asynchronously called }); 

Yandex.Cash:

   :    ,   .   : <a href="https://money.yandex.ru/eshop.xml?shopId=12345&scid=1234566&sum=3000&customerNumber=73">https://money.yandex.ru/eshop.xml?shopId=12345&scid=1234566&sum=3000&customerNumber=73</a> 

En verdad, debe haber un formulario de pago en el sitio. Cuando el usuario hace clic en "Pagar", este formulario se env铆a a la direcci贸n anterior y pasa los par谩metros utilizando el m茅todo POST. Pero tenemos una aplicaci贸n m贸vil, as铆 que tuve que abandonar el formulario y formar un enlace en el lado del servidor con la apertura en WebView.

Este enlace se proporciona al cliente para ingresar los detalles de la tarjeta y confirmar el pago. Pero aqu铆 nos encontramos con otra sorpresa: a finales de 2017, Yandex.Kassa no admite el dise帽o receptivo. Varias manipulaciones con la configuraci贸n no produjeron resultados.

imagen
El dise帽o no se adapta a la aplicaci贸n m贸vil.

Result贸 que para cambiar la apariencia de la p谩gina de pago al modo adaptativo, debe dejar una solicitud en su cuenta personal. Tuvimos que contactar al soporte t茅cnico nuevamente.

imagen
隆Hurra, dise帽o adaptado para un tel茅fono m贸vil en 2017!

Pero solo para pago con tarjeta de cr茅dito

Comprueba el hecho del pago

Raya:

El pago se verifica durante el proceso de pago y, en caso de error, la funci贸n API devolver谩 la excepci贸n correspondiente.

Yandex.Cash:

Los usuarios realizan pagos en el lado de Yandex.Cash, pero la aplicaci贸n del usuario a煤n no conoce el hecho del pago. Por lo tanto, Yandex.Kassa debe informar al servidor que se ha realizado el pago. Para hacer esto, los desarrolladores deben crear un WebHook y configurar Yandex.Cash, para que pueda usar direcciones de WebHook para transmitir el hecho del pago.

La notificaci贸n de pago del servidor ocurre en 2 etapas:

  • Comprobando la posibilidad de pago. Nuestro servidor verifica todo, permite o niega deducir fondos, por ejemplo, verifica los saldos de los productos o la exactitud de los precios.
  • Cumplimiento de pago. Yandex.Kassa informa a nuestro servidor que el dinero ha sido cargado y el pago fue exitoso. En este punto, es necesario corregir el hecho del pago en la base de datos.

Pero aqu铆 nos esperan sorpresas:

  1. Para cambiar la direcci贸n, debe enviar una solicitud al gerente y esperar nuevamente.
  2. Es necesario implementar un algoritmo especial para verificar la validez de los datos de Yandex.Kassa.
  3. El servidor debe devolver XML generado a medida. Pudimos encontrar un m贸dulo listo para generar la respuesta correcta.

Cancelar el pago

Raya:

 stripe.refunds.create({ charge: "ch_1BTuEo2eZvKYlo2CSGqKz76n" }, function(err, refund) { // asynchronously called }); 

Yandex.Cash:

     X.509    MWS.     .,        .. 

Como puede suponer, la coordinaci贸n y la conexi贸n tomaron un tiempo. Suavemente fue m谩s all谩 de los l铆mites de la fecha l铆mite.

Guardar tarjetas

Raya:

 stripe.customers.create({ email: "paying.user@example.com", source: "src_18eYalAHEMiOZZp1l9ZTjSU0", }, function(err, customer) { // asynchronously called }); 

Yandex.Cash:

Describimos las reglas para cancelar el almacenamiento de tarjetas e implementamos la capacidad de eliminar. Luego enviamos la solicitud para su revisi贸n al servicio de seguridad Yandex.Kassa y esperamos una respuesta.

Si la respuesta es s铆, es posible guardar tarjetas despu茅s de un pago exitoso y realizar pagos repetidos utilizando el protocolo MWS.

Ejemplo de solicitud de la documentaci贸n:

 POST https://server:port/webservice/mws/api/repeatCardPayment DATA: clientOrderId=123456789&invoiceId=2000000123&amount=10.00&cvv=643 

Como puede ver en los ejemplos, Stripe es m谩s adecuado para desarrolladores y tiene una amplia variedad de funciones y capacidades. Pero hay una gran PERO: Stripe, como Braintree, no funciona en Rusia, aunque puede aceptar pagos de diferentes pa铆ses. El propietario de una cuenta en Stripe debe ser residente de los pa铆ses accesibles para 茅l: Rusia no se encuentra entre ellos.

Que como resultado


Incluso teniendo en cuenta el hecho de que ten铆amos que hacer mucho trabajo adicional y comunicarnos con el soporte, no solo logramos completar casi todo a tiempo, sino que tambi茅n realizamos trabajo adicional. Una semana antes del lanzamiento, se lanz贸 una nueva versi贸n de la API Yandex.Kassi y creamos un m贸dulo NPM y reescribimos el c贸digo.

Cuando descubrimos la nueva versi贸n de la API, nos sorprendi贸 gratamente: los desarrolladores claramente observaron an谩logos extranjeros y aplicaron las mejores pr谩cticas. Se han resuelto algunos problemas de la versi贸n anterior. La documentaci贸n para la nueva API no ten铆a un SDK para Node.js. Planeamos seguir trabajando en el mercado ruso y necesitaremos dicha herramienta. Por lo tanto, decidimos crear un m贸dulo NPM, que cualquiera puede integrar independientemente en su proyecto.

Source: https://habr.com/ru/post/es412643/


All Articles