Cómo obtener transacciones de usuarios con APIs de Open Finance: una guía técnica completa
¿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.
Contenido relacionado
La combinación perfecta de experiencia, personal y plataforma para gestionar sus API.
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.