Integración
Uno de los principales puntos de interacción con la Anchor Platform es notificar a la Anchor Platform sobre eventos relacionados con la transacción.
En general, querrás proporcionar actualizaciones para los siguientes eventos:
- Tu negocio está procesando la información KYC proporcionada por el usuario
- Tu negocio está listo para recibir fondos del usuario
- Tu negocio ha recibido fondos del usuario
- Tu negocio ha enviado fondos al usuario
- Tu negocio ha procesado un reembolso para la transacción del usuario
- Tu negocio experimentó un error inesperado
Esto se realiza haciendo solicitudes JSON-RPC al endpoint de la Platform API. Las solicitudes JSON-RPC te permiten actualizar el estado de la transacción. Para mover la transacción a un estado específico, es necesario realizar la solicitud JSON-RPC correspondiente y pasar los datos requeridos por este método RPC.
La API JSON-RPC de Anchor Platform está diseñada para notificar a la plataforma sobre cambios en el estado de la transacción. Dado eso, la API se llamará cada vez que un usuario o el anchor realice alguna acción que avance el estado de la transacción en el flujo.
La comunicación desde la Anchor Platform sobre actualizaciones de transacciones, actualizaciones de clientes y creación de cotizaciones se maneja a través del servicio de eventos. Esta es una función opcional que debe configurarse por separado de la integración SEP-6. Para más información, consulta [Manejo de Eventos][event-handling].
Puedes aprender más sobre el flujo de transacciones y sus estados en el documento del protocolo SEP-24
Devoluciones de llamada
La Anchor Platform depende del servidor del negocio para proporcionar y almacenar información sobre cotizaciones.
Cotizaciones y Tarifas
Para soportar el intercambio de activos no equivalentes, la Anchor Platform expone una API compatible con SEP-38 para proporcionar cotizaciones para el exchange. La API de cotizaciones se usa para proporcionar al usuario la cantidad esperada del activo que recibirá a cambio del activo que está enviando. La API de cotizaciones también se utiliza para informar al usuario sobre las tarifas esperadas para la transacción. Por lo tanto, tu servidor de negocio debe implementar la [API de tasas][rate-callback] para proporcionar cotizaciones a la Anchor Platform.
Seguridad de la Platform API
Por defecto, los endpoints de la API de la Plataforma, como GET /transactions
y GET /transactions/:id
, no están protegidos y son accesibles por cualquier persona que tenga acceso al servidor, incluidas las billeteras.
Se recomienda que el servidor de la Plataforma sea accesible solo desde la red privada. Sin embargo, es posible que desees agregar una capa adicional de protección asegurando la API.
Uso de la clave API
Para habilitar la autenticación con clave de API, modifica tu archivo dev.env
:
- bash
# dev.env
PLATFORM_SERVER_AUTH_TYPE=api_key
# Will be used as API key
SECRET_PLATFORM_API_AUTH_SECRET="your API key that business server will use"
Una vez habilitado, todas las solicitudes deben incluir un encabezado válido X-Api-Key
, configurado con la clave de API establecida.
Uso de JWT
Para habilitar la autenticación JWT, modifica tu archivo dev.env
:
- bash
# dev.env
PLATFORM_SERVER_AUTH_TYPE=jwt
# Will be used to sign the JWT token
SECRET_PLATFORM_API_AUTH_SECRET="your secret that business server will use"
Anchor Platform utiliza el algoritmo HMAC SHA-256 (HS256) para firmar los tokens JWT. Asegúrate de que SECRET_PLATFORM_API_AUTH_SECRET
tenga al menos 32 caracteres de longitud por motivos de seguridad.
Una vez habilitado, todas las solicitudes deben incluir un encabezado Authorization
válido con el formato Bearer <JWT token>
.
Realizando solicitudes JSON-RPC
Antes de hacer solicitudes JSON-RPC, primero vamos a crear una plantilla para hacer una solicitud a la Anchor Platform.
- bash
# call-json-rpc.sh
#!/usr/bin/env bash
curl localhost:8085 \
-X POST \
-H 'Content-Type: application/json' \
--data "@$1"
Este pequeño script hará una solicitud JSON-RPC a la Anchor Platform alojada en el puerto predeterminado (8085). Los datos de transacción JSON almacenados en el archivo proporcionado se utilizarán como cuerpo (las solicitudes deben ser un array).
Solicitud JSON-RPC
El objeto Request debe contener los siguientes atributos:
ATRIBUTOTIPO DE DATO
DESCRIPCIÓN
jsonrpccadena
Una cadena que especifica la versión del protocolo JSON-RPC. MUST be exactly "2.0"
métodocadena
Una cadena que contiene el nombre del método a invocar. La lista de métodos disponibles que puedes ver en [Métodos JSON-RPC][json-rpc-methods]
paramsobjeto
A Structured value that holds the parameter values, corresponding to method call, to be used during the invocation of the method
idcadena
Un identificador establecido por el cliente. The Server will reply with the same value in the Response object
Es posible proporcionar múltiples actualizaciones en una sola solicitud JSON-RPC (colocando múltiples objetos de solicitud JSON-RPC). Cuando se realiza una actualización de esta manera, todas las actualizaciones se realizarán de forma secuencial.
Lo más importante, cada solicitud JSON-RPC no es atómica. Si una actualización falla, todas las actualizaciones anteriores SE APLICARÁN y todas las actualizaciones posteriores SE PROCESARÁN y APLICARÁN también.
Respuesta JSON-RPC
La respuesta se expresa como un único objeto JSON, con los siguientes atributos:
ATRIBUTOTIPO DE DATO
DESCRIPCIÓN
jsonrpccadena
Una cadena que especifica la versión del protocolo JSON-RPC. Está configurado en "2.0"
resultadoobjeto
Un valor estructurado que contiene los detalles de la transacción actualizada
idcadena
Un identificador enviado por el cliente
errorobjeto
Un valor estructurado que contiene los detalles del error
Mostrar atributos secundarios
idcadena
Id único de la transacción para la cual ocurrió un error
códigonúmero
Un número que indica el tipo de error que ocurrió. Por favor, consulta una lista de códigos de error a continuación
mensajecadena
Una cadena que proporciona una breve descripción del error
datoscadena
Un valor primitivo o estructurado que contiene información adicional sobre el error
Códigos de error
Código de error | Significado |
---|---|
-32600 | El JSON enviado no es un objeto Request válido |
-32601 | El método no existe / no está disponible |
-32602 | Invalid method parameter(s) |
-32603 | Error interno de JSON-RPC |
También haremos referencia a una variable $transaction_id
. Esta es una identificación de la transacción que se devuelve desde el Anchor Platform en una solicitud de inicio de retirada de fondos o depósito. Puedes obtener el ID de la transacción conectando la billetera de prueba a tu instancia local de Anchor Platform.
Actualizando la transacción de depósito vía JSON-RPC
El diagrama del flujo de depósito SEP-24 define la secuencia/reglas de transición del estado de la transacción y un conjunto de métodos JSON-RPC que deben llamarse para cambiar ese estado. No puedes definir el estado que deseas establecer para una transacción específica en tus solicitudes. Cada método JSON-RPC define las estructuras de datos que espera en la solicitud. Si la solicitud no contiene los atributos requeridos, la Anchor Platform devolverá un error y no cambiará el estado de la transacción.
Los estados en verde son obligatorios y definen el camino más corto.
Los estados en amarillo son opcionales y pueden ser omitidos.
Los estados en rojo significan que la transacción está en un estado de error o ha caducado.
Listo para recibir fondos
El primer paso del flujo de depósito después de iniciar el depósito en sí es recopilar KYC. Generalmente se realiza en la web-app, pero también puede ser proporcionado opcionalmente por la aplicación de billetera, usando SEP-9. Una vez que se recopila el KYC necesario, se debe realizar una solicitud JSON-RPC request_offchain_funds
.
- JSON
// request-offchain-funds.json
[
{
"id": 1,
"jsonrpc": "2.0",
"method": "request_offchain_funds",
"params": {
"transaction_id": "<transaction_id>",
"message": "Request offchain funds",
"amount_in": {
"amount": 10,
"asset": "iso4217:USD"
},
"amount_out": {
"amount": 9,
"asset": "stellar:USDC:GBBD47IF6LWK7P7MDEVSCWR7DPUWV3NY3DTQEVFL4NAT4AQH3ZLLFLA5"
},
"amount_fee": {
"amount": 1,
"asset": "iso4217:USD"
},
"amount_expected": {
"amount": 10
}
}
}
]
amount_in
es la cantidad que el usuario debe enviar al negocio.amount_out
es la cantidad que el usuario recibirá.amount_fee
es la cantidad total de tarifas cobradas por el negocio.asset
es parte del campoamount_x
y está en formato SEP-38. En este ejemplo, se establece en USD, asumiendo que el usuario realizó una transferencia bancaria al sistema usando USD.
La información sobre las cantidades (entrada/salida/tarifa) es necesaria si deseas mover la transacción del estado incomplete
al estado pending_user_transfer_start
. Si el estado de la transacción cambia de pending_anchor
a pending_user_transfer_start
, puedes omitir la definición de las cantidades.
Para ejecutar esto, necesitas correr:
- bash
./call-json-rpc.sh request-offchain-funds.json
Cuando el proceso KYC es largo (por ejemplo, verificación de identificación), se recomienda primero establecer el estado de la transacción a pending_anchor
usando la solicitud JSON-RPC notify_interactive_flow_completed
. Esto indicará al usuario que el KYC está siendo procesado.
Procesando información KYC
Este paso es opcional. La mayoría de los negocios no lo utilizan. Puedes omitirlo e ir al siguiente paso.
Se recomienda usar este estado cuando la verificación KYC pueda necesitar realizarse de forma asíncrona.
Debes especificar los campos amount_x
.
- JSON
// kyc-in-process.json
[
{
"id": 1,
"jsonrpc": "2.0",
"method": "notify_interactive_flow_completed",
"params": {
"transaction_id": "<transaction_id>",
"message": "Interactive flow completed.",
"amount_in": {
"amount": 10,
"asset": "iso4217:USD"
},
"amount_out": {
"amount": 9,
"asset": "stellar:USDC:GBBD47IF6LWK7P7MDEVSCWR7DPUWV3NY3DTQEVFL4NAT4AQH3ZLLFLA5"
},
"amount_fee": {
"amount": 1,
"asset": "iso4217:USD"
},
"amount_expected": {
"amount": 10
}
}
}
]
Para ejecutar esto, necesitas correr:
- bash
./call-json-rpc.sh kyc-in-process.json
Fondos recibidos
Si se recibieron fondos fuera de cadena, querrás proporcionar información actualizada de la transacción.
- JSON
// offchain-funds-received.json
[
{
"id": 1,
"jsonrpc": "2.0",
"method": "notify_offchain_funds_received",
"params": {
"transaction_id": "<transaction_id>",
"message": "Offchain funds received",
"funds_received_at": "2023-07-04T12:34:56Z",
"external_transaction_id": "7...9",
"amount_in": {
"amount": 10
},
"amount_out": {
"amount": 9
},
"amount_fee": {
"amount": 1
},
"amount_expected": {
"amount": 10
}
}
}
]
funds_received_at
es la fecha y hora de recepción de los fondosexternal_transaction_id
es el ID de la transacción en la red externa
Los campos de cantidad son opcionales. Si se omiten, se tomarán los valores de las solicitudes JSON-RPC previas.
Para ejecutar esto, necesitas correr:
- bash
./call-json-rpc.sh offchain-funds-received.json
Esperando fondos del usuario
En el mundo real, el proceso de confirmación de la transferencia puede tomar tiempo. En tales casos, las transacciones deberían establecerse en un nuevo estado que indique que se ha recibido la confirmación de la transferencia pero que los fondos aún no se han recibido.
- JSON
// offchain-funds-sent.json
[
{
"id": 1,
"jsonrpc": "2.0",
"method": "notify_offchain_funds_sent",
"params": {
"transaction_id": "<transaction_id>",
"message": "Offchain funds sent",
"funds_received_at": "2023-07-04T12:34:56Z",
"external_transaction_id": "7...9"
}
}
]
Para ejecutar esto, necesitas correr:
- bash
./call-json-rpc.sh offchain-funds-sent.json
Enviando fondos onchain
Luego, envía una transacción en la red Stellar para cumplir la solicitud del usuario. Después de completar la transacción, es necesario enviar la solicitud JSON-RPC notify_onchain_funds_sent
para notificar al usuario que los fondos fueron enviados correctamente.
- JSON
// onchain-funds-sent.json
[
{
"id": 1,
"jsonrpc": "2.0",
"method": "notify_onchain_funds_sent",
"params": {
"transaction_id": "<transaction_id>",
"message": "Onchain funds sent",
"stellar_transaction_id": "7...9"
}
}
]
stellar_transaction_id
es el ID de la transacción en la red Stellar de la transferencia
Para ejecutar esto, necesitas correr:
- bash
./call-json-rpc.sh onchain-funds-sent.json
Después de esta solicitud JSON-RPC, la transacción cambiará al estado completed
.
Enviando pago a través de un servicio de custodia
La Anchor Platform ofrece la posibilidad de enviar un pago mediante servicios de custodia, como Fireblocks. Para realizar un pago a través del servicio de custodia, es necesario hacer la siguiente solicitud JSON-RPC:
- JSON
// do-stellar-payment.json
[
{
"id": 1,
"jsonrpc": "2.0",
"method": "do_stellar_payment",
"params": {
"transaction_id": "<transaction_id>",
"message": "Custody payment started"
}
}
]
Para ejecutar esto, necesitas correr:
- bash
./call-json-rpc.sh do-stellar-payment.json
Después del procesamiento exitoso del pago en un servicio de custodia, la Anchor Platform automáticamente hará la solicitud JSON-RPC notify_onchain_funds_sent
y el estado de la transacción cambiará a completed
.
Una cuenta de usuario puede no estar lista para recibir fondos. Puedes verificar que la cuenta ha establecido una trustline. De lo contrario, puedes establecer el estado de la transacción a pending_trust
para indicar que el anchor está esperando que el usuario establezca la trustline.
Si la integración con custodia está habilitada, la Anchor Platform realizará esta validación automáticamente.
Pendiente de trust
Este estado debe establecerse si un pago requiere una trustline de activo que no fue configurada por el usuario. Hay dos maneras en que la transacción puede pasar al estado pending_trust
. La primera es el procesamiento de un pago a través del servicio de custodia en caso de que se detecte que la trustline no está configurada. La segunda es cuando el negocio detecta que falta la trustline y quiere notificar al usuario que debe configurarla. Para mover la transacción al estado pending_trust
, es necesario realizar la siguiente solicitud JSON-RPC:
- JSON
// request-trust.json
[
{
"id": 1,
"jsonrpc": "2.0",
"method": "request_trust",
"params": {
"transaction_id": "<transaction_id>",
"message": "Asset trustine not configured"
}
}
]
Para ejecutar esto, necesitas correr:
- bash
./call-json-rpc.sh request-trust.json
El pago a través del servicio de custodia verifica periódicamente si la trustline fue configurada. Si fue configurada, enviará automáticamente un pago al servicio de custodia y cambiará el estado de la transacción a pending_stellar
.
Trust Set
Este estado debe establecerse si el negocio ha detectado que la trustline fue o no configurada por el usuario.
- JSON
// trust-set.json
[
{
"id": 1,
"jsonrpc": "2.0",
"method": "notify_trust_set",
"params": {
"transaction_id": "<transaction_id>",
"message": "Asset trustine set",
"success": "true"
}
}
]
- El flag
success
que define si la trustline fue o no configurada por el usuario
Para ejecutar esto, necesitas correr:
- bash
./call-json-rpc.sh trust-set.json
Dependiendo del flag success
, el estado de la transacción cambiará a pending_stellar
si la trustline fue configurada, o a pending_anchor
si no lo fue.
Enviando reembolso vía servicio de custodia
Existe la posibilidad de devolver fondos al usuario (reembolso). Puedes reembolsar la suma completa (reembolso total) o hacer varios reembolsos parciales. Además, si el usuario envió más dinero del esperado, puedes devolverle una parte y enviar el resto como fondos onchain.
- JSON
// refund-sent.json
[
{
"id": 1,
"jsonrpc": "2.0",
"method": "notify_refund_sent",
"params": {
"transaction_id": "<transaction_id>",
"message": "Refund sent",
"refund": {
"id": "1c186184-09ee-486c-82a6-aa7a0ab1119c",
"amount": {
"amount": 10,
"asset": "iso4217:USD"
},
"amount_fee": {
"amount": 1,
"asset": "iso4217:USD"
}
}
}
}
]
Para ejecutar esto, necesitas correr:
- bash
./call-json-rpc.sh refund-sent.json
Si la suma de reembolsos es menor que amount_in
, el estado de la transacción se establecerá en pending_anchor
. Solo si la suma de reembolsos es igual a amount_in
, el estado de la transacción se establecerá en refunded
.
Reembolso pendiente
Es similar a Reembolso enviado, pero maneja un caso cuando un reembolso ha sido enviado a la red externa pero aún no está confirmado. El estado de la transacción se establece en pending_external
. Este es el estado que se establecerá cuando se espera que una transacción de Bitcoin u otra red de cripto externa se complete, o cuando se espera una transferencia bancaria.
Error en la transacción
Si encuentras un error irrecuperable al procesar la transacción, es necesario establecer el estado de la transacción a error
. Puedes usar el campo mensaje para describir los detalles del error.
- JSON
// transaction-error.json
[
{
"id": 1,
"jsonrpc": "2.0",
"method": "notify_transaction_error",
"params": {
"transaction_id": "<transaction_id>",
"message": "Error occurred"
}
}
]
Para ejecutar esto, necesitas correr:
- bash
./call-json-rpc.sh transaction-error.json
Si un usuario ha realizado una transferencia, deberías hacer una recuperación de transacción y luego puedes reintentar procesar la transacción o iniciar un reembolso.
Transacción caducada
Tu negocio puede querer caducar transacciones que hayan sido abandonadas por el usuario después de cierto tiempo. Es una buena práctica limpiar transacciones inactivas en el estado incomplete
. Para hacerlo, simplemente cambia el estado de la transacción a expired
.
- JSON
// transaction-expired.json
[
{
"id": 1,
"jsonrpc": "2.0",
"method": "notify_transaction_expired",
"params": {
"transaction_id": "<transaction_id>",
"message": "Transaction expired"
}
}
]
Para ejecutar esto, necesitas correr:
- bash
./call-json-rpc.sh transaction-expired.json
Este método JSON-RPC no puede usarse después de que el usuario haya realizado una transferencia.
Transacción en espera
En casos raros, puede que desees pausar la transacción actual y solicitar más información del usuario (después de que se haya recibido la transferencia). Esto podría usarse para casos de cumplimiento normativo.
- JSON
// transaction-hold.json
[
{
"id": 1,
"jsonrpc": "2.0",
"method": "notify_transaction_on_hold",
"params": {
"transaction_id": "<transaction_id>",
"message": "Transaction is on hold. Please contact customer support to resolve the hold."
}
}
]
Para ejecutar esto, necesitas correr:
- bash
./call-json-rpc.sh transaction-hold.json
Recuperación de transacción
El estado de la transacción puede cambiar de error/expired
a pending_anchor
. Después de la recuperación, puedes reembolsar los activos recibidos o proceder con el procesamiento de la transacción. Para recuperar una transacción, es necesario realizar la siguiente solicitud JSON-RPC:
- JSON
// transaction-recovery.json
[
{
"id": 1,
"jsonrpc": "2.0",
"method": "notify_transaction_recovery",
"params": {
"transaction_id": "<transaction_id>",
"message": "Transaction recovered"
}
}
]
Para ejecutar esto, necesitas correr:
- bash
./call-json-rpc.sh transaction-recovery.json
Actualizando la transacción de retirada de fondos vía JSON-RPC
Este diagrama define una secuencia/reglas de transición del estado de la transacción para el flujo de retirada SEP-24.
Los estados en verde son obligatorios y definen el camino más corto.
Los estados en amarillo son opcionales y pueden ser omitidos.
Los estados en rojo significan que la transacción está en un estado de error o ha caducado.
Una vez finalizado el flujo de depósito, implementar la retirada es sencillo. Algunas partes del flujo son similares y pueden reutilizarse.
El punto de partida tanto para la retirada como para el depósito es el mismo.
Listo para recibir fondos
Similar al depósito, el siguiente paso es notificar al usuario que el anchor está listo para recibir fondos. Sin embargo, como tu servicio recibirá transacciones a través de la red Stellar, la actualización será diferente.
- JSON
// request-onchain-funds.json
[
{
"id": 1,
"jsonrpc": "2.0",
"method": "request_onchain_funds",
"params": {
"transaction_id": "<transaction_id>",
"message": "Request onchain funds",
"amount_in": {
"amount": 10,
"asset": "stellar:USDC:GBBD47IF6LWK7P7MDEVSCWR7DPUWV3NY3DTQEVFL4NAT4AQH3ZLLFLA5"
},
"amount_out": {
"amount": 9,
"asset": "iso4217:USD"
},
"amount_fee": {
"amount": 1,
"asset": "stellar:USDC:GBBD47IF6LWK7P7MDEVSCWR7DPUWV3NY3DTQEVFL4NAT4AQH3ZLLFLA5"
},
"amount_expected": {
"amount": 10
},
"destination_account": "GD...G",
"memo": "12345",
"memo_type": "id"
}
}
]
memo
Valor del memo para adjuntar a la transacciónmemo_type
Tipo de memo que el anchor debe adjuntar a la transaccióndestination_account
Cuenta de destino
Para ejecutar esto, necesitas correr:
- bash
./call-json-rpc.sh request-onchain-funds.json
Establecer memo
, memo_type
y destination_account
es opcional.
Si la integración con un custodio externo está activada, la Anchor Platform puede generar memo
, memo_type
y destination_address
si se elige el tipo correspondiente de deposit_info_generator_type
. También puedes proporcionar memo
y memo_type
a la solicitud como se muestra arriba. Ten en cuenta que el memo debe ser único, esto ayuda a asociar las transacciones Stellar con las transacciones SEP.
Si tu negocio gestiona los activos, la Anchor Platform puede generar memos para ti. Cuando el estado cambia a pending_user_transfer_start
, la Anchor Platform establece automáticamente memo
y memo_type
(solo si no están incluidos en la solicitud).
La cuenta Stellar que se usará para recibir fondos debe estar configurada.
Procesando información KYC
Este paso es opcional, y es similar a Procesando información KYC del flujo de depósito.
Fondos recibidos
Si se recibieron fondos onchain, necesitas proporcionar las cantidades y cambiar el estado de la transacción a pending_anchor
.
- JSON
// onchain-funds-received.json
[
{
"id": 1,
"jsonrpc": "2.0",
"method": "notify_onchain_funds_received",
"params": {
"transaction_id": "<transaction_id>",
"message": "Onchain funds received",
"stellar_transaction_id": "7...9",
"amount_in": {
"amount": 10
},
"amount_out": {
"amount": 9
},
"amount_fee": {
"amount": 1
}
}
}
]
Para ejecutar esto, necesitas correr:
- bash
./call-json-rpc.sh onchain-funds-received.json
Este método será llamado automáticamente por el servidor de custodia si la integración de custodia está habilitada.
Cantidad actualizada
Si se recibieron fondos onchain, pero por alguna razón amount_in
difiere de lo especificado en el flujo interactivo (amount_expected
), puedes actualizar amount_out
y amount_fee
para que correspondan al amount_in
real. El estado de la transacción en este caso no cambiará y será igual a pending_anchor
.
- JSON
// amounts-updated.json
[
{
"id": 1,
"jsonrpc": "2.0",
"method": "notify_amounts_updated",
"params": {
"transaction_id": "<transaction_id>",
"message": "Amounts updated",
"amount_out": {
"amount": 9
},
"amount_fee": {
"amount": 1
}
}
}
]
Para ejecutar esto, necesitas correr:
- bash
./call-json-rpc.sh amounts-updated.json
Solo amount_out
y amount_fee
pueden actualizarse usando esta solicitud JSON-RPC, y no necesitas especificar los activos de las cantidades.
Fondos fuera de cadena enviados
Para completar la transacción y cambiar su estado a completed
, necesitas hacer la solicitud JSON-RPC notify_offchain_funds_sent
.
- JSON
// offchain-funds-sent.json
[
{
"id": 1,
"jsonrpc": "2.0",
"method": "notify_offchain_funds_sent",
"params": {
"transaction_id": "<transaction_id>",
"message": "Offchain funds sent",
"funds_sent_at": "2023-07-04T12:34:56Z",
"external_transaction_id": "a...c"
}
}
]
Para ejecutar esto, necesitas correr:
- bash
./call-json-rpc.sh offchain-funds-sent.json
Fondos fuera de cadena disponibles
Puedes mover el estado de la transacción a pending_user_transfer_complete
si se enviaron fondos fuera de cadena y si está listo para que el usuario/receptor los recoja.
- JSON
// offchain-funds-available.json
[
{
"id": 1,
"jsonrpc": "2.0",
"method": "notify_offchain_funds_available",
"params": {
"transaction_id": "<transaction_id>",
"message": "Offchain funds available",
"external_transaction_id": "a...c"
}
}
]
Para ejecutar esto, necesitas correr:
- bash
./call-json-rpc.sh offchain-funds-available.json
Fondos fuera de cadena pendientes
Otra opción es mover el estado de la transacción a pending_external
. Este estado significa que el pago ha sido enviado a una red externa pero aún no está confirmado.
- JSON
// offchain-funds-pending.json
[
{
"id": 1,
"jsonrpc": "2.0",
"method": "notify_offchain_funds_pending",
"params": {
"transaction_id": "<transaction_id>",
"message": "Offchain funds pending",
"external_transaction_id": "a...c"
}
}
]
Para ejecutar esto, necesitas correr:
- bash
./call-json-rpc.sh offchain-funds-pending.json
Reembolso enviado
La lógica de reembolso funciona de la misma manera que para el flujo de depósito. Para más detalles, consulta Reembolso enviado del flujo de depósito.
Enviando reembolso vía servicio de custodia
La integración con un servicio de custodia te permite hacer un reembolso mediante un servicio de custodia, como Fireblocks.
- JSON
// do-stellar-refund.json
[
{
"id": 1,
"jsonrpc": "2.0",
"method": "do_stellar_refund",
"params": {
"transaction_id": "<transaction_id>",
"message": "Do stellar refund",
"refund": {
"amount": {
"amount": 9,
"asset": "stellar:USDC:GBBD47IF6LWK7P7MDEVSCWR7DPUWV3NY3DTQEVFL4NAT4AQH3ZLLFLA5"
},
"amount_fee": {
"amount": 1,
"asset": "stellar:USDC:GBBD47IF6LWK7P7MDEVSCWR7DPUWV3NY3DTQEVFL4NAT4AQH3ZLLFLA5"
}
}
}
}
]
Para ejecutar esto, necesitas correr:
- bash
./call-json-rpc.sh do-stellar-refund.json
Similar al flujo de depósito, puedes hacer un reembolso completo o varios reembolsos parciales. La transacción permanecerá en estado pending_anchor
hasta que la suma de reembolsos sea menor que amount_in
. Si la suma de reembolsos es igual a amount_in
, la Anchor Platform cambiará automáticamente el estado de la transacción a refunded
.
Error en la transacción
Funciona de la misma manera que para el flujo de depósito. Para más detalles, consulta Error en la transacción del flujo de depósito.
Transacción caducada
Funciona de la misma manera que para el flujo de depósito. Para más detalles, consulta Transacción caducada del flujo de depósito.
Transacción en espera
Funciona de la misma manera que para el flujo de depósito. Para más detalles, consulta Transacción en espera del flujo de depósito.
Recuperación de transacción
Funciona de la misma manera que para el flujo de depósito. Para más detalles, consulta Recuperación de transacción del flujo de depósito.
Seguimiento de transacciones Stellar
Usar el Payment Observer te permite delegar este paso a la Anchor Platform. Para habilitar el Payment Observer, usa la bandera --stellar-observer
en la sección de comandos del archivo de composición.
El Payment Observer rastreará todas las transacciones enviadas a la cuenta de distribución. Cuando se detecte la transacción con el memo esperado en la red, el estado cambiará automáticamente a pending_anchor
y se emitirá el evento (si se usa Kafka).
Para actualizar los estados de la transacción, el observador hace las solicitudes JSON-RPC correspondientes a la plataforma. Debería usar la siguiente URL.
- bash
# dev.env
PLATFORM_API_BASE_URL=http://platform-server:8085
El Payment Observer no validará los montos. Es tu responsabilidad verificar que el monto enviado por el usuario sea correcto.
Si ya tienes un sistema que monitorea pagos, asegúrate de que la lógica del sistema iguale la descripción a continuación:
Primero, espera a que la transacción se incluya en el ledger (usando un SDK). Esta transacción debe tener el memo esperado y la dirección de destino (cuenta de distribución). Una vez que se haya detectado y verificado esta transacción, notifica al usuario que los fondos han sido recibidos utilizando la solicitud JSON-RPC notify_onchain_funds_received.
El servicio de custodia de Fireblocks rastreará automáticamente las transacciones y notificará al usuario que los fondos han sido recibidos. Consulta la documentación del servicio de custodia de Fireblocks para más detalles.