Integrar transferencias

Fintoc usa el objeto Payment Intent para representar una transferencia bancaria.

Para realizar una transferencia debes seguir los siguientes pasos:

Crea un Paymentlntent

Desde tu servidor crea un PaymentIntent con el monto, moneda y recipiente del pago. Siempre crea el PaymentIntent desde tu servidor, o si no un usuario malicioso podría cambiar cualquiera de esos campos.

Acá te dejamos un ejemplo:

curl --request POST "https://api.fintoc.com/v1/payment_intents" \
-- header 'Authorization: sk_live_0000000000000000' \
-- header 'Content-Type: application/json' \
--data-raw '{
  "amount": 1000,
  "currency": "CLP",
  "recipient_account": {
    "holder_id": "111111111",
    "number": "123123123",
    "type": "checking_account",
    "institution_id": "cl_banco_de_chile"
  }
}'
const fetch = require('node-fetch');

const payment_intent = {
  amount: 1000,
  recipient_accout: {
    holder_id: "111111111",
    number: "123123123",
    type: "checking_account",
    institution_id: "cl_banco_de_chile"
  },
}

fetch('https://api.fintoc.com/v1/payment_intents', {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json'
      'Authorization': 'sk_live_000000000000'
    },
    body: JSON.stringify(payment_intent),
  },
)
import requests

payment_intent = {
  'amount': 1000,
  'currency': 'clp',
  'recipient_account': {
    'holder_id': '111111111',
    'number': '123123123',
    'type': 'checking_account',
    'institution_id': 'cl_banco_de_chile'
  }
}

headers = {
  'Accept': 'application/json', 'Authorization': 'sk_live_000000000000'
}

r = requests.post(
  'https://api.fintoc.com/v1/payment_intents',
  data=payment_intent,
  headers=headers
)
require 'net/http'
require 'uri'
require 'json'

payment_intent = {
  amount: 1000,
  currency: 'clp',
  recipient_account: {
    holder_id: '111111111',
    number: '123123123',
    type: 'checking_account',
    institution_id: 'cl_banco_de_chile'
  }
}

header = {
  Accept: 'application/json', Authorization: 'sk_live_000000000000'
}

http = Net::HTTP.new(uri.host, uri.port)
request = Net::HTTP::Post.new(uri.request_uri, header)
request.body = payment_intent.to_json

response = http.request(request)

La respuesta que recibirás será parecida a esta:

{
  "id": "pi_BO381oEATXonG6bj",
  "object": "payment_intent",
  "amount": 1000,
  "currency": "CLP",
  "widget_token": "pi_BO381oEATXonG6bj_sec_a4xK32BanKWYn",
  "status": "created",
  "reference_id": null,
  "recipient_account": {
    "holder_id": "183917137",
    "number": "123456",
    "type": "checking_account",
    "institution_id": "cl_banco_de_chile"
  },
  "sender_account": null,
  "created_at": "2021-10-15T15:23:11.474Z",
}

Al crear un PaymentIntent también se crea un widget_token (único por transferencia), el cual tienes que ocupar para completar el proceso de pago desde el Widget. Te lo explicamos en la siguiente sección.

Configura el widget

Una vez que creas el PaymentIntent debes enviar el widget_token creado a tu frontend. Usa el widget_token para configurar el widget y el flujo que debe hacer el usuario.

Ejemplo widget configurado con un widget_token.

<head>
  <script src="https://js.fintoc.com/v1/"></script>
</head>

<body>
  <script>
    const widget = Fintoc.create({
      holderType: 'individual',
      widgetToken: 'pi_XXXXXXXX_sec_YYYYYYYY',
      product: 'payments',
      publicKey: 'pk_live_0000000000',
      onSuccess: () => {},
    })
    </script>
</body>

📘

widget token

Usando el widget_token, Fintoc configura todos los detalles del intento de pago: monto, moneda y recipiente.

El widget_token es temporal y expira luego de 10 minutos.

Para ver más detalles sobre el widget y su configuración puedes ir a la sección del Widget.

Finalización de la transferencia

Cuando una transferencia se complete te enviaremos un evento de tipo payment_intent por webhook.

Para suscribirte al evento debes crear un objeto WebhookEndpoint en Fintoc y asignarle los eventos que quieres recibir.

Es muy importante que te suscribas a estos eventos porque así podrás identificar las transferencias exitosas como las no exitosas.

Recuerda que con el objeto PaymentIntent te podremos enviar 3 eventos por webhook:

Evento

Descripción

payment_intent.succeeded

Evento que se ejecuta cuando una transferencia es validada como exitosa.

payment_intent.failed

Evento que se ejecuta cuando una transferencia falla debido a un problema del banco o de Fintoc.

payment_intent.rejected

Evento que se ejecuta cuando una transferencia es rechazada por el usuario. Rechaza el MFA o ingresa incorrectamente el MFA.

📘

Webhooks vs onSuccess Widget

Es muy importante que esperes el evento para finalizar el flujo y no debes basarte únicamente en el callback onSuccess del Widget porque tus usuarios pueden cerrar el widget antes de que el callback se ejecute.

El evento de transferencia no exitosa puede existir cuando la transferencia demore más de lo común en ejecutarse o si el usuario cierra el Widget antes de tiempo.

Nuevamente te recomendamos esperar la llegada del evento antes de realizar cualquier acción post-pago, como por ejemplo: enviar email de confirmación a tu usuario desde tus servidores o ingresar la venta a tu base de datos o empezar el proceso de envío de productos.

Para suscribirte al evento, puedes leer la sección de webhooks de nuestra documentación. Recuerda que el evento se llama payment_intent.