Saltar al contenido principal

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 hace haciendo solicitudes JSON-RPC al endpoint de la API de la Platform. 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 hacer la solicitud JSON-RPC correspondiente y pasar los datos requeridos por este método RPC.

La API JSON-RPC de la Anchor Platform está diseñada para notificar a la plataforma sobre cambios en el estado de la transacción. Por lo tanto, la API será llamada cada vez que un usuario o el anchor realice alguna acción que progrese 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 característica opcional que debe configurarse por separado de la integración SEP-6. Para más información, consulta Gestión de Eventos.

Puedes conocer más sobre el flujo y estados de la transacción en el documento del protocolo SEP-24

Callbacks

La Anchor Platform depende del servidor de negocio para proporcionar y almacenar información sobre cotizaciones.

Cotizaciones y Tarifas

Para admitir el intercambio de activos no equivalentes, la Anchor Platform expone una API compatible con SEP-38 para proporcionar cotizaciones para el intercambio. La API de cotización se utiliza para proporcionar al usuario la cantidad esperada del activo que recibirá a cambio del activo que está enviando. La API de cotización también se usa para mostrar al usuario las tarifas esperadas para la transacción. Por lo tanto, tu servidor de negocio debe implementar la API de tarifas para proporcionar cotizaciones a la Anchor Platform.

Seguridad de la API de la Platform

advertencia

Por defecto, los endpoints de la API de la Plataforma como GET /transactions y GET /transactions/:id no están protegidos y son accesibles para cualquier persona que tenga acceso al servidor, incluidas las aplicaciones de wallet.

información

Se recomienda mantener el servidor de la Plataforma accesible solo desde la red privada. Sin embargo, es posible que quieras añadir una capa adicional de protección asegurando la API.

Uso de API Key

Para habilitar la autenticación mediante clave API, modifica tu archivo dev.env:

# dev.env
PLATFORM_API_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 X-Api-Key válido, configurado con la clave API correspondiente.

Uso de JWT

Para habilitar la autenticación JWT, modifica tu archivo dev.env:

# dev.env
PLATFORM_API_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 para mayor seguridad.

Una vez habilitado, todas las solicitudes deben incluir un encabezado Authorization válido con el formato Bearer <token JWT>.

Realizando solicitudes JSON-RPC

Antes de hacer solicitudes JSON-RPC, primero vamos a crear una plantilla para hacer una solicitud a la Plataforma Anchor.

# 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 Plataforma Anchor alojada en el puerto predeterminado (8085). Los datos de la transacción JSON almacenados en el archivo proporcionado se usarán como cuerpo (las solicitudes deben ser un arreglo).

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. DEBE ser exactamente "2.0"

  • methodcadena

    Una cadena que contiene el nombre del método a invocar. La lista de métodos disponibles puede verse en [Métodos JSON-RPC][json-rpc-methods]

  • paramsobjeto

    Un valor estructurado que contiene los parámetros correspondientes a la llamada del método, que se usarán durante la invocación del método.

  • idcadena

    Un identificador establecido por el cliente. El Servidor responderá con el mismo valor en el objeto Response.

  • consejo

    Es posible proporcionar varias actualizaciones en una sola solicitud JSON-RPC (colocando varios objetos de solicitud JSON-RPC). Cuando una actualización se realiza de esta forma, todas las actualizaciones se harán secuencialmente.

    Lo más importante es que 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 también se procesarán y APLICARÁN.

    Respuesta JSON-RPC

    La respuesta se expresa como un solo objeto JSON, con los siguientes atributos:

  • ATRIBUTOTIPO DE DATO

    DESCRIPCIÓN

  • jsonrpccadena

    Una cadena que especifica la versión del protocolo JSON-RPC. Está establecido en "2.0"

  • resultobjeto

    Un valor estructurado que contiene los detalles actualizados de la transacción

  • 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

  • codenúmero

    Un número que indica el tipo de error que ocurrió. Por favor ve una lista de códigos de error abajo

  • messagecadena

    Una cadena que proporciona una breve descripción del error

  • datacadena

    Un valor primitivo o estructurado que contiene información adicional sobre el error

  • Códigos de error

    Código de errorSignificado
    -32600El JSON enviado no es un objeto Request válido
    -32601El método no existe o no está disponible
    -32602Parámetro(s) del método no válido(s)
    -32603Error interno JSON-RPC
    consejo

    También haremos referencia a una variable $transaction_id. Esta es una identificación de la transacción que se devuelve desde la Plataforma Anchor en una solicitud de inicio de retiro o depósito. Puedes obtener el ID de la transacción conectando la cartera de prueba a tu instancia local de la Plataforma Anchor.

    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 la transición del estado de la transacción y un conjunto de métodos JSON-RPC que deben ser llamados 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 atributos requeridos, la Anchor Platform devolverá un error y no cambiará el estado de la transacción.

    flujo de depósito SEP24

    consejo

    Los estados en verde son obligatorios y definen el camino más corto.

    Los estados en amarillo son opcionales y pueden omitirse.

    Los estados en rojo significan que la transacción está en un estado de error o ha expirado.

    Listo para recibir fondos

    El primer paso del flujo de depósito después de iniciar el depósito es recopilar KYC. Generalmente se hace en la aplicación web, 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 hacer una solicitud JSON-RPC request_offchain_funds.

    // 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"
    },
    "fee_details": {
    "total": 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á.
    • fee_details es el monto total de las tarifas cobradas por el negocio.
    • asset es parte del campo amount_x y está en formato SEP-38. En este ejemplo, está establecido en USD, asumiendo que el usuario realizó una transferencia bancaria al sistema usando USD.

    La información sobre las cantidades (entrada/salida/fee) es necesaria si quieres mover la transacción desde el estado incomplete a 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 cantidades.

    Para ejecutar esto, necesitas correr:

    ./call-json-rpc.sh request-offchain-funds.json
    consejo

    Cuando el proceso de KYC es largo (por ejemplo, verificación de ID), 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

    consejo

    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 manera asíncrona.

    Debes especificar los campos amount_x.

    // 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"
    },
    "fee_details": {
    "total": 1,
    "asset": "iso4217:USD"
    },
    "amount_expected": {
    "amount": 10
    }
    }
    }
    ]

    Para ejecutar esto, necesitas correr:

    ./call-json-rpc.sh kyc-in-process.json

    Fondos recibidos

    Si se recibieron fondos offchain, querrás proporcionar información actualizada de la transacción.

    // 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
    },
    "fee_details": {
    "total": 1
    },
    "amount_expected": {
    "amount": 10
    }
    }
    }
    ]
    • funds_received_at es la fecha y hora de recepción de los fondos
    • external_transaction_id es el ID de la transacción en la red externa

    Los campos de monto son opcionales. Si se omiten, se tomarán los valores de las solicitudes JSON-RPC previas.

    Para ejecutar esto, necesitas correr:

    ./call-json-rpc.sh offchain-funds-received.json

    Esperando fondos del usuario

    En el mundo real, el proceso de confirmación de transferencia puede tomar tiempo. En tales casos, las transacciones deben establecerse a un nuevo estado que indique que se ha recibido la confirmación de la transferencia, pero los fondos aún no se han recibido.

    // 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:

    ./call-json-rpc.sh offchain-funds-sent.json

    Enviando fondos onchain

    Luego, envía una transacción en la red Stellar para cumplir con 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 con éxito.

    // 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:

    ./call-json-rpc.sh onchain-funds-sent.json

    Después de esta solicitud JSON-RPC, la transacción pasará al estado completed.

    Pendiente de confianza

    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 cuando el servidor de negocio detecta que la trustline no está configurada. La segunda es cuando el negocio mismo detecta que falta la trustline y quiere notificar al usuario que debe configurarla. Para mover la transacción al estado pending_trust, es necesario hacer la siguiente solicitud JSON-RPC:

    // 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:

    ./call-json-rpc.sh request-trust.json
    información

    El servidor de negocio verifica periódicamente si la trustline fue configurada. Si fue así, puede enviar un pago y cambiar el estado de la transacción a pending_stellar.

    Trust Set

    Este estado debe establecerse si el negocio ha detectado si la trustline fue o no configurada por el usuario.

    // 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:

    ./call-json-rpc.sh trust-set.json
    información

    Dependiendo del flag success, el estado de la transacción será cambiado a pending_stellar si la trustline fue configurada, o a pending_anchor si no fue así.

    Enviando reembolso

    Existe la posibilidad de enviar fondos de regreso al usuario (reembolso). Puedes reembolsar la suma completa (reembolso total) o realizar varios reembolsos parciales. Además, si el usuario envió más dinero del esperado, puedes reembolsar una parte de la suma al usuario y enviar el resto como fondos onchain.

    // 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:

    ./call-json-rpc.sh refund-sent.json
    información

    Si la suma de los reembolsos es menor que amount_in, el estado de la transacción se establecerá en pending_anchor. Solo si la suma de los reembolsos es igual a amount_in, el estado de la transacción será refunded.

    Reembolso pendiente

    Es similar a Reembolso enviado, pero maneja el 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 establece al esperar que la red de Bitcoin u otra red de criptomonedas externa complete una transacción, 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.

    // 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:

    ./call-json-rpc.sh transaction-error.json
    consejo

    Si un usuario ha hecho una transferencia, debes hacer una recuperación de la transacción y luego puedes reintentar procesar la transacción o iniciar un reembolso.

    Transacción expirada

    Tu negocio puede querer manejar transacciones abandonadas expirando aquellas que hayan permanecido inactivas por cierto período. Para lograr esto, verifica el estado de la transacción usando el endpoint GET /transactions y ordena los resultados por la marca de tiempo user_action_required_by. Si la marca de tiempo ha pasado, ejecuta manualmente la lógica apropiada, como expirar la transacción o iniciar un auto-reembolso, basado en el estado actual de la transacción. Por ejemplo, para expirar una transacción, el negocio debe cambiar el estado de la transacción a expired:

    // 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:

    ./call-json-rpc.sh transaction-expired.json
    consejo

    Este método JSON-RPC no puede usarse después de que el usuario haya hecho una transferencia.

    Transacción en espera

    En casos raros, puedes querer pausar la transacción actual y solicitar más información al usuario (después de que se haya recibido la transferencia). Esto podría usarse para casos de cumplimiento.

    // 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:

    ./call-json-rpc.sh transaction-hold.json

    Recuperación de transacción

    El estado de la transacción puede cambiarse de error/expired a pending_anchor. Después de la recuperación, puedes reembolsar los activos recibidos o continuar con el procesamiento de la transacción. Para recuperar una transacción, es necesario realizar la siguiente solicitud JSON-RPC:

    // 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:

    ./call-json-rpc.sh transaction-recovery.json

    Actualizando la transacción de retirada vía JSON-RPC

    Este diagrama define la secuencia/reglas de transición del estado de una transacción para el flujo de retirada SEP-24.

    flujo de retirada SEP24

    consejo

    Los estados en verde son obligatorios y definen el camino más corto.

    Los estados en amarillo son opcionales y pueden omitirse.

    Los estados en rojo significan que la transacción está en un estado de error o ha expirado.

    Una vez que el flujo de depósito ha finalizado, 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, dado que tu servicio recibirá transacciones a través de la red Stellar, la actualización se verá diferente.

    // 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"
    },
    "fee_details": {
    "total": 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ón
    • memo_type Tipo de memo que el anchor debería adjuntar a la transacción
    • destination_account Cuenta destino

    Para ejecutar esto, necesitas correr:

    ./call-json-rpc.sh request-onchain-funds.json
    consejo

    Establecer memo, memo_type y destination_account es opcional.

    Si la integración con un custodio externo está habilitada, la Anchor Platform puede generar memo, memo_type y destination_address si se elige el tipo de generador de información de depósito correspondiente. También puedes proporcionar memo y memo_type en la solicitud como se muestra arriba. Ten en cuenta que el memo debe ser único, esto es lo que ayuda a asociar las transacciones Stellar con las transacciones SEP.

    Si tu negocio administra los activos, la Anchor Platform puede generar los memos por ti. Cuando el estado cambia a pending_user_transfer_start, la Anchor Platform establece automáticamente el memo y memo_type (solo si no están incluidos en la solicitud).

    nota

    La cuenta Stellar que se usará para recibir fondos debe estar configurada.

    Procesando información KYC

    Este paso es opcional y es similar a Procesar información KYC del flujo de depósito.

    Fondos recibidos

    Si se recibieron fondos onchain, necesitas proporcionar los montos y cambiar el estado de la transacción a pending_anchor.

    // 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
    },
    "fee_details": {
    "total": 1
    }
    }
    }
    ]

    Para ejecutar esto, necesitas correr:

    ./call-json-rpc.sh onchain-funds-received.json
    consejo

    Este método será llamado automáticamente por el observador de pagos Stellar cuando detecte que se han recibido fondos onchain.

    Monto actualizado

    Si se recibieron fondos onchain, pero por alguna razón amount_in difiere del especificado en el flujo interactivo (amount_expected), puedes actualizar amount_out y fee_details para que correspondan al amount_in real. El estado de la transacción en este caso no cambiará y será igual a pending_anchor.

    // amounts-updated.json
    [
    {
    "id": 1,
    "jsonrpc": "2.0",
    "method": "notify_amounts_updated",
    "params": {
    "transaction_id": "<transaction_id>",
    "message": "Amounts updated",
    "amount_out": {
    "amount": 9
    },
    "fee_details": {
    "total": 1
    }
    }
    }
    ]

    Para ejecutar esto, necesitas correr:

    ./call-json-rpc.sh amounts-updated.json
    nota

    Solo amount_out y fee_details pueden actualizarse usando esta solicitud JSON-RPC, y no necesitas especificar los activos de las cantidades.

    Fondos offchain enviados

    Para completar la transacción y cambiar su estado a completed, necesitas hacer la solicitud JSON-RPC notify_offchain_funds_sent.

    // 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:

    ./call-json-rpc.sh offchain-funds-sent.json

    Fondos offchain disponibles

    Puedes mover el estado de la transacción a pending_user_transfer_complete si se enviaron fondos offchain y está listo para que el usuario/beneficiario los recoja.

    // 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:

    ./call-json-rpc.sh offchain-funds-available.json

    Fondos offchain 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.

    // 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:

    ./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.

    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 expirada

    Funciona de la misma manera que para el flujo de depósito. Para más detalles, consulta Transacción expirada 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.

    Rastreando transacciones Stellar

    Usar el Payment Observer te permite delegar este paso a la Anchor Platform. Para habilitar el Payment Observer, usa el flag --stellar-observer en la sección de comandos del archivo compose.

    El Payment Observer rastreará todas las transacciones enviadas a la cuenta de distribución. Cuando se detecta la transacción con el memo esperado en la red, el estado cambiará automáticamente a pending_anchor y se emitirá un evento (si se usa Kafka).

    Para actualizar los estados de la transacción, el observer realiza las solicitudes JSON-RPC correspondientes a la plataforma. Debe usar la siguiente URL.

    # dev.env
    PLATFORM_API_BASE_URL=http://platform-server:8085
    advertencia

    El Payment Observer no validará los montos. Es tu responsabilidad verificar que el monto enviado por el usuario sea correcto.

    información

    Si ya tienes un sistema que monitorea pagos, asegúrate de que la lógica del sistema coincida con la descripción a continuación:

    Primero, espera a que la transacción sea incluida en el libro mayor (usando un SDK). Esta transacción debe tener el memo esperado y la dirección de destino (cuenta de distribución). Una vez que esta transacción haya sido detectada y verificada, notifica al usuario que los fondos han sido recibidos usando la solicitud JSON-RPC notify_onchain_funds_received.