Cómo obtener transacciones de usuarios con APIs de Open Finance: una guía técnica completa

João Santana
João Santana
Author
June 4, 2024
7
min reading time

¿Interesado en integrar múltiples cuentas financieras usando APIs de Open Finance? En este artículo, explico los pasos detallados y las mejores prácticas para lograr una agregación eficiente y segura. 💡 Descubre cómo optimizar tus desarrollos y mejorar la experiencia del usuario.

Requisitos previos

Dentro de un ecosistema de Open Finance, se dispone de un Marco de Confianza (Trust Framework), que asegura la integridad técnica entre las instituciones participantes, tanto emisoras como receptoras. Cualquier servicio de Iniciación de Pagos (PISP) o de agregación de cuentas debe estar debidamente registrado en el directorio central para garantizar su conformidad y operatividad dentro del marco regulatorio establecido.

Crear una solicitud de consentimiento de cuenta

Para acceder a las transacciones del usuario, necesitamos crear una solicitud de cuenta con uno de esos dos permisos:

    ACCOUNTS_READ

    ACCOUNTS_TRANSACTIONS_READ

    RESOURCES_READ

El banco protege sus endpoints con OAuth 2, incluso el punto final de creación de consentimiento, lo que significa que necesitará un token de acceso para crear el objeto de consentimiento.

Para crear el token de acceso:

curl -X POST https://matls.as.aisp/token \
-H "Content-Type: application/x-www-form-urlencoded" \
-d "grant_type=client_credentials&scope=consents&client_assertion=eyJraWQiOiJlbUUtNmZWcEpDU0dBN2gwSHFybzNFX1djR0NOM3hod29ENVpoQl85THE0IiwiYWxnIjoiUFMyNTYifQ.eyJzdWIiOiI1YWFlZjhlZS05YTM0LTRlNTMtYTg3OS04ZDM0OGE0ZDA0MGQiLCJhdWQiOiJodHRwczovL2tleWNsb2FrLm10bHMuMTAuMC4wLjEwMC5uaXAuaW8vb2YtYXV0aC9yZWFsbXMvdGVzdGluZy9wcm90b2NvbC9vcGVuaWQtY29ubmVjdC9leHQvdG9rZW4iLCJpc3MiOiI1YWFlZjhlZS05YTM0LTRlNTMtYTg3OS04ZDM0OGE0ZDA0MGQiLCJleHAiOjE3MDk5MDg1OTgsImlhdCI6MTcwOTkwODUzOCwianRpIjoiZTA4cklHVWFlbXpmbzhZVEVrYjkifQ.Ng3tnzZW0lV3fz5lo15cCHuy6qHgwXTVxDP9CvU6ArIznTLxWVCduYkkj3nI6quvECL52YIiWJHB2W6DpeN4rWQ8tiQQLUAqE4a7eThNLQ1R3kslu_R32MBpLT5Qod1OKuu85yUUcgYYBOJTb3gwh0R5X-j3KAarFt9A5dBkYDPamcgc7H10LcDlqfMeobnKDVAUaR_JR2sthqcPwCHVpxRPqwvw0vrwdTdczwkeeTvNmrIIh9Z8aeZKQMEXPqZbPeObpGd1bt8tE6Z1rYrxofa4yCPfsW8_cirn6fmMplx_UjW7Sn2AZYNlGbU5w5eUEYJZiKQXoInFWv0QFpJ_8g&client_assertion_type=urn%3Aietf%3Aparams%3Aoauth%3Aclient-assertion-type%3Ajwt-bearer"

Como respuesta:

{ "access_token":"eyJhbGciOiJQUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJxSENIeEpCM01FNVhyRTRFV1M5NlN4NlVjQXNtbUtuR1NSS1Q0MUtmaUU4In0.eyJleHAiOjE3MDk5MDg4NDIsImlhdCI6MTcwOTkwODU0MiwianRpIjoiZWFlNjY5ZWQtNWY2Ny00ZWNhLTk0YzctMzY3YTBkOWFjNTM2IiwiaXNzIjoiaHR0cHM6Ly9rZXljbG9hay50bHMuMTAuMC4wLjEwMC5uaXAuaW8vb2YtYXV0aC9yZWFsbXMvdGVzdGluZyIsImF1ZCI6IjVhYWVmOGVlLTlhMzQtNGU1My1hODc5LThkMzQ4YTRkMDQwZCIsInN1YiI6ImNmYjY3OTY3LTI0MWEtNDJlNi1hZmY0LTAxNzU0ZDk0MDEyZSIsInR5cCI6IkJlYXJlciIsImF6cCI6IjVhYWVmOGVlLTlhMzQtNGU1My1hODc5LThkMzQ4YTRkMDQwZCIsImFjciI6IjEiLCJjbmYiOnsieDV0I1MyNTYiOiI4dWhmaTAwNWUwSWxMZXlXQmdJRE1hTnZYWlZIemxsZHpKN3dobWNqdnlzIn0sInNjb3BlIjoiY29uc2VudHMgcmVzb3VyY2VzIiwiY2xpZW50SG9zdCI6IjEwLjAuMC41IiwiY2xpZW50QWRkcmVzcyI6IjEwLjAuMC41IiwiY2xpZW50X2lkIjoiNWFhZWY4ZWUtOWEzNC00ZTUzLWE4NzktOGQzNDhhNGQwNDBkIn0.b9NqdSxHAxBjyae0UAgDR1Ekg0CrIoIdLaMy_CBsTLBxBle70NdiW_RhRS581HZp1O3TwJMV68vKnET-NoI5i1Xm2FZQSMIv2Wqm3gPKltGUs2bzyyciFpXr7XtGgf8Ay-9IUBnB08YpgHHIVrtlGVEachLnSGKi1cYCyiccub0DQ7QlSjtQmR14ZqFgzjtSg1zrPW6siXZgd-5RJFormYvzFqxvsdEOTV_8KYT2S12Hh5NA0I8wu1dCGHAGhrwUxxLhTQCSw5CNEtL8eS5gyfv_HDgCd2v7-syglBh5fPmkxJVNkpSYnZ8mzMwBLGJUP0NhTdownd52NLzrXW5gQg", "expires_in":300, "refresh_expires_in":0, "token_type":"Bearer", "not-before-policy":0, "scope":"consents resources" }

Ahora puedes usarlo para crear el consentimiento de acceso a la cuenta:

curl -X POST https://matls.rs.aisp/v1/consents \
-H "Authorization: Bearer eyJhbGciOiJQUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJxSENIeEpCM01FNVhyRTRFV1M5NlN4NlVjQXNtbUtuR1NSS1Q0MUtmaUU4In0.eyJleHAiOjE3MDk5MDg4NDIsImlhdCI6MTcwOTkwODU0MiwianRpIjoiZWFlNjY5ZWQtNWY2Ny00ZWNhLTk0YzctMzY3YTBkOWFjNTM2IiwiaXNzIjoiaHR0cHM6Ly9rZXljbG9hay50bHMuMTAuMC4wLjEwMC5uaXAuaW8vb2YtYXV0aC9yZWFsbXMvdGVzdGluZyIsImF1ZCI6IjVhYWVmOGVlLTlhMzQtNGU1My1hODc5LThkMzQ4YTRkMDQwZCIsInN1YiI6ImNmYjY3OTY3LTI0MWEtNDJlNi1hZmY0LTAxNzU0ZDk0MDEyZSIsInR5cCI6IkJlYXJlciIsImF6cCI6IjVhYWVmOGVlLTlhMzQtNGU1My1hODc5LThkMzQ4YTRkMDQwZCIsImFjciI6IjEiLCJjbmYiOnsieDV0I1MyNTYiOiI4dWhmaTAwNWUwSWxMZXlXQmdJRE1hTnZYWlZIemxsZHpKN3dobWNqdnlzIn0sInNjb3BlIjoiY29uc2VudHMgcmVzb3VyY2VzIiwiY2xpZW50SG9zdCI6IjEwLjAuMC41IiwiY2xpZW50QWRkcmVzcyI6IjEwLjAuMC41IiwiY2xpZW50X2lkIjoiNWFhZWY4ZWUtOWEzNC00ZTUzLWE4NzktOGQzNDhhNGQwNDBkIn0.b9NqdSxHAxBjyae0UAgDR1Ekg0CrIoIdLaMy_CBsTLBxBle70NdiW_RhRS581HZp1O3TwJMV68vKnET-NoI5i1Xm2FZQSMIv2Wqm3gPKltGUs2bzyyciFpXr7XtGgf8Ay-9IUBnB08YpgHHIVrtlGVEachLnSGKi1cYCyiccub0DQ7QlSjtQmR14ZqFgzjtSg1zrPW6siXZgd-5RJFormYvzFqxvsdEOTV_8KYT2S12Hh5NA0I8wu1dCGHAGhrwUxxLhTQCSw5CNEtL8eS5gyfv_HDgCd2v7-syglBh5fPmkxJVNkpSYnZ8mzMwBLGJUP0NhTdownd52NLzrXW5gQg" \
-H "Content-Type: application/json" \
-H "x-fapi-auth-date: Fri, 08 Mar 2024 14:35:42 GMT" \
-H "x-fapi-interaction-id: aE5e78Db-C9e2-44Dc-984D-566161e14C25" \
-H "Accept: application/json" \
-d '{
  "data": {
    "loggedUser": {
      "document": {
        "identification": "11111111111",
        "rel": "ID"
      }
    },
    "permissions": [
      "ACCOUNTS_READ",
      "ACCOUNTS_TRANSACTIONS_READ",
      "RESOURCES_READ"
    ]
  },
  "expirationDateTime": "2024-03-08T16:35:42Z"
}'

Como respuesta:

{
  "data": {
    "consentId": "urn:sensedia:b1bbe786-0c75-48e5-8c71-4c98a8d763c1",
    "permissions": [
      "RESOURCES_READ",
      "ACCOUNTS_READ",
      "ACCOUNTS_TRANSACTIONS_READ"
    ],
    "expirationDateTime": "2024-03-08T16:35:42Z",
    "status": "AWAITING_AUTHORISATION",
    "createdDate": "2024-03-08T14:35:43Z",
    "statusUpdateDateTime": "2024-03-08T14:35:43Z"
  },
  "links": {
    "self": "http://localhost/urn:sensedia:b1bbe786-0c75-48e5-8c71-4c98a8d763c1"
  },
  "meta": {
    "requestDateTime": "2024-03-08T14:35:43Z",
    "totalPages": 1,
    "totalRecords": 1
  }
}

El banco le devolverá el objeto de consentimiento que creó. Es por eso que verá los mismos reclamos que solicitó. Aunque el banco agregó algunos nuevos en la respuesta, que serán importantes para el resto del flujo:

ConsentId: una identificación para nuestro consentimiento. Es un valor importante ya que necesitaremos adjuntarlo a todas las solicitudes posteriores del flujo. Lo mejor es guardarlo en un lugar seguro y de fácil acceso.

Status: el estado del consentimiento. Como lo acaba de crear, se espera que tenga el estado AWAITING_AUTHORISATION, lo que significa que el consentimiento está esperando la autorización del usuario ahora. Esto es lo que vamos a hacer en el siguiente paso.

Autenticación y consentimiento con el banco

Para autorizar el consentimiento el usuario debe estar autenticado en el banco, para ello el flujo debe seguir los estándares PAR (Pushed Authorization Request). El propósito de este flujo es redirigir al usuario al proveedor de autenticación del banco utilizando la información de consentimiento creada previamente.

Crear una solicitud de autorización PAR

curl -X POST https://matls.as.aisp/par \
-H "Content-Type: application/x-www-form-urlencoded;charset=UTF-8" \
-d "client_id=5aaef8ee-9a34-4e53-a879-8d348a4d040d&redirect_uri=https%3A%2F%2Fconformance-suite.tls.10.0.0.100.nip.io%2Ftest%2Fa%2FSensedia-POC-Auth-Server%2Fcallback&scope=openid+resources+consents+consent%3Aurn%3Asensedia%3Ab1bbe786-0c75-48e5-8c71-4c98a8d763c1&state=AI9OlHTEPx&nonce=PULSikA2sA&response_type=code&code_challenge=12XIbTGk6M_wU1KBHL0hORE1N78qDN3fR8LYJAuSxT0&code_challenge_method=S256&client_assertion=eyJraWQiOiJlbUUtNmZWcEpDU0dBN2gwSHFybzNFX1djR0NOM3hod29ENVpoQl85THE0IiwiYWxnIjoiUFMyNTYifQ.eyJzdWIiOiI1YWFlZjhlZS05YTM0LTRlNTMtYTg3OS04ZDM0OGE0ZDA0MGQiLCJhdWQiOiJodHRwczovL2tleWNsb2FrLnRscy4xMC4wLjAuMTAwLm5pcC5pby9vZi1hdXRoL3JlYWxtcy90ZXN0aW5nIiwiaXNzIjoiNWFhZWY4ZWUtOWEzNC00ZTUzLWE4NzktOGQzNDhhNGQwNDBkIiwiZXhwIjoxNzA5OTA4NjAzLCJpYXQiOjE3MDk5MDg1NDMsImp0aSI6ImNMdEhtbmJ5ZXNZOFJ0U0tFYTFIIn0.ZGuv7v0wxAY_4IAwOsWnC6oly3emlJ-mX3XeoHifFdBLA5vQ-JIf9wlM6uX5FCh4JNmc5oDQBXI2-j_cpz6z3dYhSFdgeT4NLkquR49h2iAO7lVEKuWxvgcdXULPPZF5Yj5EKqJIx1xkL0b9ftbrQPmVqdWyUdbyrsL4_7OHg2vs-RmMCww0J_XlSp_gCTwZTJrvo-qA5-uMZG1BWkVUa51Aw-Hw3MBVZWBuBLc3dh2Y2Xf_2b5VlFZr4L8Jp8XKNVlNg_QZdJCLmJHsq8A1hLNuRb9NpLNN4QMwvBogzRzU8-h63GOEeIBQUyI6T_egs1CIiqYmrFUpkeQWKmjKUA&client_assertion_type=urn%3Aietf%3Aparams%3Aoauth%3Aclient-assertion-type%3Ajwt-bearer"

Como respuesta:

{
  "request_uri": "urn:ietf:params:oauth:request_uri:118a824c-7f02-44b6-85ca-846e8cbf331a",
  "expires_in": 60
}

Envío al endpoint de autorización

La siguiente URL debe ejecutarse en un navegador como ejemplo de nuestro flujo.

https://keycloak.tls.10.0.0.100.nip.io/of-auth/realms/testing/protocol/openid-connect/auth? / request_uri=urn:ietf:params:oauth:request_uri:118a824c-7f02-44b6-85ca-846e8cbf331a& / client_id=5aaef8ee-9a34-4e53-a879-8d348a4d040d& / redirect_uri=https://callback&scope=openid%20resources%20consents%20consent:urn:sensedia:b1bbe786-0c75-48e5-8c71-4c98a8d763c1& / response_type=code

Autorización de consentimiento

Ahora el usuario se autentica y autoriza el consentimiento al banco. Si todo va bien, el banco redirigirá al usuario a su URI de redireccionamiento.

El flujo regresa al receptor con la información necesaria para generar el token de acceso a las API regulatorias, se debe utilizar el código devuelto.

https://receptora/callback?state=RKJ3Nlk5nIb4BBKXRPsVvfOBlLxliZTSK3gpNSjai7xHg7nb9s21ZBbwN2HJwRt3l9yy28ArjRLpYHLwPZ7b1A8rVeXPIDXsOwwHdMBFL3mNofqXSjP5hSz5f7tc-._~& / session_state=7855a18b-4e08-465e-a459-150e81f68a06& / iss=https%3A%2F%2Fkeycloak.tls.10.0.0.100.nip.io%2Fof-auth%2Frealms%2Ftesting& / code=d105c568-050c-40c1-b67f-214ece948a94.7855a18b-4e08-465e-a459-150e81f68a06.14d6e297-264c-45db-8004-c8f07cac844d

Intercambia el código

Ahora, se debe utilizar el código devuelto:

curl -X POST https://matls.as.aisp/token \
-H "Content-Type: application/x-www-form-urlencoded;charset=UTF-8" \
-d "grant_type=authorization_code&code=d105c568-050c-40c1-b67f-214ece948a94.7855a18b-4e08-465e-a459-150e81f68a06.14d6e297-264c-45db-8004-c8f07cac844d&redirect_uri=https%3A%2F%2Fconformance-suite.tls.10.0.0.100.nip.io%2Ftest%2Fa%2FSensedia-POC-Auth-Server%2Fcallback&client_assertion=eyJraWQiOiJlbUUtNmZWcEpDU0dBN2gwSHFybzNFX1djR0NOM3hod29ENVpoQl85THE0IiwiYWxnIjoiUFMyNTYifQ.eyJzdWIiOiI1YWFlZjhlZS05YTM0LTRlNTMtYTg3OS04ZDM0OGE0ZDA0MGQiLCJhdWQiOiJodHRwczovL2tleWNsb2FrLm10bHMuMTAuMC4wLjEwMC5uaXAuaW8vb2YtYXV0aC9yZWFsbXMvdGVzdGluZy9wcm90b2NvbC9vcGVuaWQtY29ubmVjdC9leHQvdG9rZW4iLCJpc3MiOiI1YWFlZjhlZS05YTM0LTRlNTMtYTg3OS04ZDM0OGE0ZDA0MGQiLCJleHAiOjE3MDk5MTIyNjgsImlhdCI6MTcwOTkxMjIwOCwianRpIjoiSnhKblJOWkhxZlVSdG1HRDcwSEIifQ.ec5o7sawrGK4qu1GmI-u14nMThFOeCLc6RrEmT1mt3qiZ4vNoNEK4S1cj8fIEj01bWOJ8F8Un5sOsIZQ9L8Np50SN1ZRHtInB8fyUr9aEcW4APRCLfHn-XYp1Klsf5vs8rl3rvob456t8NvbeaN7Znz2Z_pR2uo5QdRxajCz8zNVVEHgQkwEJeUrdHwXoxV3SIIlLPPIdqtBcNjWKZSuiUpvuUtPjc58EkrDVnU2RbnjK_nz1PKe4m23CBC7StuyZ2rQAHOHiDOw14lYOluzG5f1Ngurh_MNVCfSrA37uJGa2OYO9ZCLC_Cp3Wx6nw9zQwbLb_J-j7hzAolXJb4aNg&client_assertion_type=urn%3Aietf%3Aparams%3Aoauth%3Aclient-assertion-type%3Ajwt-bearer&code_verifier=Z2mL4RJAiM7MEJPz.fqxTqxNG8jOu1GL77gS_-MomS4iFoHmhxkPOKGBn4Rq~O-~mCbAJHWHKXI~sThwsumt5TawQQcNHpDw2RAg6UNSnk_OQudt4a21lk.cS6xO7S-f"

Como respuesta:

{
  "access_token": "eyJhbGciOiJQUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJxSENIeEpCM01FNVhyRTRFV1M5NlN4NlVjQXNtbUtuR1NSS1Q0MUtmaUU4In0.eyJleHAiOjE3MDk5MTI1MDksImlhdCI6MTcwOTkxMjIwOSwiYXV0aF90aW1lIjoxNzA5OTEyMjA4LCJqdGkiOiIwYjViMzNmYS0wYmE3LTRjNDgtODRlYS1hODZlMTBkYWM2N2QiLCJpc3MiOiJodHRwczovL2tleWNsb2FrLnRscy4xMC4wLjAuMTAwLm5pcC5pby9vZi1hdXRoL3JlYWxtcy90ZXN0aW5nIiwiYXVkIjoiNWFhZWY4ZWUtOWEzNC00ZTUzLWE4NzktOGQzNDhhNGQwNDBkIiwic3ViIjoiZmYzNTU2NTctOTY0ZC00ZjE5LWExYmEtNGI5NzI4NzJlZjBmIiwidHlwIjoiQmVhcmVyIiwiYXpwIjoiNWFhZWY4ZWUtOWEzNC00ZTUzLWE4NzktOGQzNDhhNGQwNDBkIiwibm9uY2UiOiIwYVZWMlJuUTZMIiwic2Vzc2lvbl9zdGF0ZSI6ImJhYjVjMTY2LTYwZjgtNDk3Mi1iOGE3LWUyN2JlZGJhZDdhMiIsImFjciI6IjEiLCJjbmYiOnsieDV0I1MyNTYiOiI4dWhmaTAwNWUwSWxMZXlXQmdJRE1hTnZYWlZIemxsZHpKN3dobWNqdnlzIn0sInNjb3BlIjoib3BlbmlkIGNvbnNlbnRzIGNvbnNlbnQ6dXJuOnNlbnNlZGlhOjI0NGMxNDZiLWU1ZTQtNDFlYS1iZGFlLTczYjcwNmIyODljMSByZXNvdXJjZXMiLCJzaWQiOiJiYWI1YzE2Ni02MGY4LTQ5NzItYjhhNy1lMjdiZWRiYWQ3YTIiLCJvcGVuYmFua2luZ19pbnRlbnRfaWQiOiJ1cm46c2Vuc2VkaWE6MjQ0YzE0NmItZTVlNC00MWVhLWJkYWUtNzNiNzA2YjI4OWMxIn0.cr75sBYH4tuP2K4GYts3q3TFt_A_PWCyELRUfCxOYtlLIRP9aA82jShMKYBZ-gVkvyPe9jS6fq77Z0k56VGxII2J_M_PYXY2dt3sqQGEJsj-YYvuWlcZuyVCt9hLyQ1doLo2StXcXRE3QVAsI1j0nhE-bOLjzf--sYLL4UE_lfRNr7r0x4VrZDV2_H5Z05dE62DfO5PMuQGnv4wiCdi2rWpfNIEEwCo8huQYZLLeOT9nFSL9qbuuC1zFaF2oVVkbc92XjdB978S9s03SQy9dL7mTd4bAXExh0NpeiV92W3qkhz102i7SAkgKeszw3GGsfkWPMpJfQqNZ8MkLsAogIQ",
  "expires_in": 300,
  "refresh_expires_in": 7200,
  "refresh_token": "eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJiMWY0OTM4Mi1hN2E2LTQzYjEtOTJkNC04MWZmNTVmZjE1ZWUifQ.eyJleHAiOjE3MDk5MTk0MDksImlhdCI6MTcwOTkxMjIwOSwianRpIjoiMDhkMjY4N2YtNDM0Zi00MWFhLTg5ZTItMGFhZmU1M2JjODI4IiwiaXNzIjoiaHR0cHM6Ly9rZXljbG9hay50bHMuMTAuMC4wLjEwMC5uaXAuaW8vb2YtYXV0aC9yZWFsbXMvdGVzdGluZyIsImF1ZCI6Imh0dHBzOi8va2V5Y2xvYWsudGxzLjEwLjAuMC4xMDAubmlwLmlvL29mLWF1dGgvcmVhbG1zL3Rlc3RpbmciLCJzdWIiOiJmZjM1NTY1Ny05NjRkLTRmMTktYTFiYS00Yjk3Mjg3MmVmMGYiLCJ0eXAiOiJSZWZyZXNoIiwiYXpwIjoiNWFhZWY4ZWUtOWEzNC00ZTUzLWE4NzktOGQzNDhhNGQwNDBkIiwibm9uY2UiOiIwYVZWMlJuUTZMIiwic2Vzc2lvbl9zdGF0ZSI6ImJhYjVjMTY2LTYwZjgtNDk3Mi1iOGE3LWUyN2JlZGJhZDdhMiIsImNuZiI6eyJ4NXQjUzI1NiI6Ijh1aGZpMDA1ZTBJbExleVdCZ0lETWFOdlhaVkh6bGxkeko3d2htY2p2eXMifSwic2NvcGUiOiJvcGVuaWQgY29uc2VudHMgY29uc2VudDp1cm46c2Vuc2VkaWE6MjQ0YzE0NmItZTVlNC00MWVhLWJkYWUtNzNiNzA2YjI4OWMxIHJlc291cmNlcyIsInNpZCI6ImJhYjVjMTY2LTYwZjgtNDk3Mi1iOGE3LWUyN2JlZGJhZDdhMiJ9.UqkO0sCaCTWD_xdQ7eFNK1G8YLvwZU2XjuryPIFB7Gs",
  "token_type": "Bearer",
  "id_token": "eyJhbGciOiJQUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJxSENIeEpCM01FNVhyRTRFV1M5NlN4NlVjQXNtbUtuR1NSS1Q0MUtmaUU4In0.eyJleHAiOjE3MDk5MTI1MDksImlhdCI6MTcwOTkxMjIwOSwiYXV0aF90aW1lIjoxNzA5OTEyMjA4LCJqdGkiOiI5OTdkYjQzZi05NzQ0LTQ3YjEtYTQ2Mi01OTUyZDliNTNhYjQiLCJpc3MiOiJodHRwczovL2tleWNsb2FrLnRscy4xMC4wLjAuMTAwLm5pcC5pby9vZi1hdXRoL3JlYWxtcy90ZXN0aW5nIiwiYXVkIjoiNWFhZWY4ZWUtOWEzNC00ZTUzLWE4NzktOGQzNDhhNGQwNDBkIiwic3ViIjoiZmYzNTU2NTctOTY0ZC00ZjE5LWExYmEtNGI5NzI4NzJlZjBmIiwidHlwIjoiSUQiLCJhenAiOiI1YWFlZjhlZS05YTM0LTRlNTMtYTg3OS04ZDM0OGE0ZDA0MGQiLCJub25jZSI6IjBhVlYyUm5RNkwiLCJzZXNzaW9uX3N0YXRlIjoiYmFiNWMxNjYtNjBmOC00OTcyLWI4YTctZTI3YmVkYmFkN2EyIiwiYXRfaGFzaCI6IlBZV3Y5czR2anRVd3hrOWhsQjgxcHciLCJhY3IiOiIxIiwic2lkIjoiYmFiNWMxNjYtNjBmOC00OTcyLWI4YTctZTI3YmVkYmFkN2EyIiwib3BlbmJhbmtpbmdfaW50ZW50X2lkIjoidXJuOnNlbnNlZGlhOjI0NGMxNDZiLWU1ZTQtNDFlYS1iZGFlLTczYjcwNmIyODljMSJ9.UB7kt8kMkjrFLBr_foKO4gRpYt8gdjXFyqM3aWXOcnLZnLfsexFMKvsKs12X6csEEWPEkoakpck5Ew3JIBe3v9dMt-V3UwKK43YslBk9e1b0r5YLrpTK1_P3YBY1UfBtBUThcD0yXgtcJGJWLvzJRRS_hryuMTo9INciiokpCZWr8-fEfyYRRGb9Oj4jinYGWONHkCrY-qNC6Jf__wrZalQ0XwnzIOSiS3zefy7-PCQtOwAQY8wgmR2SPFElh_GAlxnHcpyyuID1JqH2ab2MH0zhMQHlv1OqZb7lT54FRL3Okrh3YXbN5PJ33blCbQ9A_kWxDaK8IG0SZ02wjNFi0A",
  "not-before-policy": 0,
  "session_state": "bab5c166-60f8-4972-b8a7-e27bedbad7a2",
  "scope": "openid consents consent:urn:sensedia:244c146b-e5e4-41ea-bdae-73b706b289c1 resources"
}

Los datos en el ecosistema Open Finance están disponibles con identificadores de recursos únicos; por ejemplo, una cuenta tiene un identificador único 25cac914-d8ae-6789-b215-650a6215820d. El receptor debe consultar los identificadores en la API de Resources.

curl -X GET https://matls.rs.aisp/open-finance/v1/resources \
-H "Authorization: Bearer eyJhbGciOiJQUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJxSENIeEpCM01FNVhyRTRFV1M5NlN4NlVjQXNtbUtuR1NSS1Q0MUtmaUU4In0.eyJleHAiOjE3MDk5MTI1MDksImlhdCI6MTcwOTkxMjIwOSwiYXV0aF90aW1lIjoxNzA5OTEyMjA4LCJqdGkiOiIwYjViMzNmYS0wYmE3LTRjNDgtODRlYS1hODZlMTBkYWM2N2QiLCJpc3MiOiJodHRwczovL2tleWNsb2FrLnRscy4xMC4wLjAuMTAwLm5pcC5pby9vZi1hdXRoL3JlYWxtcy90ZXN0aW5nIiwiYXVkIjoiNWFhZWY4ZWUtOWEzNC00ZTUzLWE4NzktOGQzNDhhNGQwNDBkIiwic3ViIjoiZmYzNTU2NTctOTY0ZC00ZjE5LWExYmEtNGI5NzI4NzJlZjBmIiwidHlwIjoiQmVhcmVyIiwiYXpwIjoiNWFhZWY4ZWUtOWEzNC00ZTUzLWE4NzktOGQzNDhhNGQwNDBkIiwibm9uY2UiOiIwYVZWMlJuUTZMIiwic2Vzc2lvbl9zdGF0ZSI6ImJhYjVjMTY2LTYwZjgtNDk3Mi1iOGE3LWUyN2JlZGJhZDdhMiIsImFjciI6IjEiLCJjbmYiOnsieDV0I1MyNTYiOiI4dWhmaTAwNWUwSWxMZXlXQmdJRE1hTnZYWlZIemxsZHpKN3dobWNqdnlzIn0sInNjb3BlIjoib3BlbmlkIGNvbnNlbnRzIGNvbnNlbnQ6dXJuOnNlbnNlZGlhOjI0NGMxNDZiLWU1ZTQtNDFlYS1iZGFlLTczYjcwNmIyODljMSByZXNvdXJjZXMiLCJzaWQiOiJiYWI1YzE2Ni02MGY4LTQ5NzItYjhhNy1lMjdiZWRiYWQ3YTIiLCJvcGVuYmFua2luZ19pbnRlbnRfaWQiOiJ1cm46c2Vuc2VkaWE6MjQ0YzE0NmItZTVlNC00MWVhLWJkYWUtNzNiNzA2YjI4OWMxIn0.cr75sBYH4tuP2K4GYts3q3TFt_A_PWCyELRUfCxOYtlLIRP9aA82jShMKYBZ-gVkvyPe9jS6fq77Z0k56VGxII2J_M_PYXY2dt3sqQGEJsj-YYvuWlcZuyVCt9hLyQ1doLo2StXcXRE3QVAsI1j0nhE-bOLjzf--sYLL4UE_lfRNr7r0x4VrZDV2_H5Z05dE62DfO5PMuQGnv4wiCdi2rWpfNIEEwCo8huQYZLLeOT9nFSL9qbuuC1zFaF2oVVkbc92XjdB978S9s03SQy9dL7mTd4bAXExh0NpeiV92W3qkhz102i7SAkgKeszw3GGsfkWPMpJfQqNZ8MkLsAogIQ" \
-H "x-fapi-auth-date: Fri, 08 Mar 2024 15:36:49 GMT" \
-H "x-fapi-customer-ip-address: 198.51.100.119" \
-H "x-fapi-interaction-id: 3cC0bBe7-3E8d-4025-80F9-d81229F80d45"

Como respuesta:

{
  "data": [
    {
      "resourceId": "25cac914-d8ae-6789-b215-650a6215820d",
      "type": "ACCOUNT",
      "status": "AVAILABLE"
    },
    {
      "resourceId": "543ac914-dfae-8976-54sg-650a62158890f",
      "type": "CREDIT_CARD_ACCOUNT",
      "status": "AVAILABLE"
    }
  ]
}

Obtenga las transacciones

Existe un tipo de recurso para cada producto disponible en el ecosistema (ACCOUNT, CREDIT_CARD_ACCOUNT). En nuestro ejemplo queremos consultar los datos de una cuenta, por eso usaremos el tipo ACCOUNT. Usaremos el resourceId (25cac914-d8ae-6789-b215-650a6215820d) para acceder a los datos de cuenta deseados.

curl -X GET https://matls.rs.aisp/open-finance/v1/accounts/25cac914-d8ae-6789-b215-650a6215820d/transactions \
-H "Authorization: Bearer eyJhbGciOiJQUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJxSENIeEpCM01FNVhyRTRFV1M5NlN4NlVjQXNtbUtuR1NSS1Q0MUtmaUU4In0.eyJleHAiOjE3MDk5MTI1MDksImlhdCI6MTcwOTkxMjIwOSwiYXV0aF90aW1lIjoxNzA5OTEyMjA4LCJqdGkiOiIwYjViMzNmYS0wYmE3LTRjNDgtODRlYS1hODZlMTBkYWM2N2QiLCJpc3MiOiJodHRwczovL2tleWNsb2FrLnRscy4xMC4wLjAuMTAwLm5pcC5pby9vZi1hdXRoL3JlYWxtcy90ZXN0aW5nIiwiYXVkIjoiNWFhZWY4ZWUtOWEzNC00ZTUzLWE4NzktOGQzNDhhNGQwNDBkIiwic3ViIjoiZmYzNTU2NTctOTY0ZC00ZjE5LWExYmEtNGI5NzI4NzJlZjBmIiwidHlwIjoiQmVhcmVyIiwiYXpwIjoiNWFhZWY4ZWUtOWEzNC00ZTUzLWE4NzktOGQzNDhhNGQwNDBkIiwibm9uY2UiOiIwYVZWMlJuUTZMIiwic2Vzc2lvbl9zdGF0ZSI6ImJhYjVjMTY2LTYwZjgtNDk3Mi1iOGE3LWUyN2JlZGJhZDdhMiIsImFjciI6IjEiLCJjbmYiOnsieDV0I1MyNTYiOiI4dWhmaTAwNWUwSWxMZXlXQmdJRE1hTnZYWlZIemxsZHpKN3dobWNqdnlzIn0sInNjb3BlIjoib3BlbmlkIGNvbnNlbnRzIGNvbnNlbnQ6dXJuOnNlbnNlZGlhOjI0NGMxNDZiLWU1ZTQtNDFlYS1iZGFlLTczYjcwNmIyODljMSByZXNvdXJjZXMiLCJzaWQiOiJiYWI1YzE2Ni02MGY4LTQ5NzItYjhhNy1lMjdiZWRiYWQ3YTIiLCJvcGVuYmFua2luZ19pbnRlbnRfaWQiOiJ1cm46c2Vuc2VkaWE6MjQ0YzE0NmItZTVlNC00MWVhLWJkYWUtNzNiNzA2YjI4OWMxIn0.cr75sBYH4tuP2K4GYts3q3TFt_A_PWCyELRUfCxOYtlLIRP9aA82jShMKYBZ-gVkvyPe9jS6fq77Z0k56VGxII2J_M_PYXY2dt3sqQGEJsj-YYvuWlcZuyVCt9hLyQ1doLo2StXcXRE3QVAsI1j0nhE-bOLjzf--sYLL4UE_lfRNr7r0x4VrZDV2_H5Z05dE62DfO5PMuQGnv4wiCdi2rWpfNIEEwCo8huQYZLLeOT9nFSL9qbuuC1zFaF2oVVkbc92XjdB978S9s03SQy9dL7mTd4bAXExh0NpeiV92W3qkhz102i7SAkgKeszw3GGsfkWPMpJfQqNZ8MkLsAogIQ" \
-H "x-fapi-auth-date: Fri, 08 Mar 2024 15:36:49 GMT" \
-H "x-fapi-customer-ip-address: 198.51.100.119" \
-H "x-fapi-interaction-id: 3cC0bBe7-3E8d-4025-80F9-d81229F80d45" 

Como respuesta:

{
  "data": [
    {
      "transactionId": "TXpRMU9UQTROMWhZV2xSU1FUazJSMDl",
      "completedAuthorisedPaymentType": "TRANSACAO_EFETIVADA",
      "creditDebitType": "DEBITO",
      "transactionName": "TRANSFCWAR5TXHCX5I9IDBHML8082N8NEO30M6LNNG7ANAYIJYRM00ZBZPU8",
      "type": "PIX",
      "transactionAmount": {
        "amount": "1000.0400",
        "currency": "BRL"
      },
      "transactionDate": "2021-01-07",
      "transactionDateTime": "2016-01-29T12:29:03.374Z"
    }
  ],
  "links": {
    "self": "https://api.banco.com.br/open-banking/api/v1/resource",
    "first": "https://api.banco.com.br/open-banking/api/v1/resource",
    "prev": "https://api.banco.com.br/open-banking/api/v1/resource",
    "next": "https://api.banco.com.br/open-banking/api/v1/resource"
  },
  "meta": {
    "requestDateTime": "2021-05-21T08:30:00Z"
  }
}

Conclusión

Como vio, tener un flujo de autorización que involucre a tres partes no es trivial. Es necesario que todas las partes se comuniquen en una relación 1-1 antes de poder consumir las API. Usamos el acceso a una cuenta como ejemplo. De hecho, el concepto se puede reutilizar para cualquier tipo de API. Una vez que implementes el flujo de forma genérica, podrás reutilizarlo varias veces.

Inicie su transformación con nosotros

Sensedia está especializada en soluciones de arquitectura basada en eventos, con experiencia desde la creación de estrategias hasta su implementación.

Su arquitectura digital es más integrada, ágil y escalable.

Acelere la entrega de sus iniciativas digitales a través de APIs, Microservicios e Integraciones menos complejas y más eficientes que impulsen su negocio.