Sandbox

Descripción

El entorno Sandbox sirve como espacio seguro para que los usuarios prueben a fondo las llamadas a la API bancaria, centrándose principalmente en los métodos de transacción. Su principal objetivo es permitir a los desarrolladores experimentar con la API, simular escenarios reales, generar demos rápidamente y verificar sus aplicaciones cliente sin incurrir en ningún gasto real.

Objetivos

  1. Entorno de pruebas : El espacio Sandbox está diseñado para ser un entorno de pruebas real que refleja la API real pero evita el scraping del sitio web de origen, lo que permite a los usuarios validar su integración con la API bancaria con confianza.
  2. Coste-eficiencia : Al utilizar el Sandbox, los usuarios pueden evitar cualquier coste inesperado asociado a las llamadas a la API en vivo, garantizando que sus pruebas sigan siendo rentables.
  3. Simulaciones realistas : Permite generar datos realistas, aunque sintéticos, emulando las respuestas reales de la API, incluyendo tanto los resultados satisfactorios como los erróneos. Los mismos datos simulados pueden obtenerse varias veces utilizando una cabecera especial en la solicitud.

El espacio Sandbox está habilitado para un subconjunto seleccionado de puntos finales. La lista de servicios disponibles se publicará en breve

Cabeceras HTTP especiales

Para configurar eficazmente una llamada Sandbox, es necesario incluir en la solicitud cabeceras específicas adaptadas al entorno Sandbox:

  • x-demo-type : Utilice esta cabecera para definir el tipo de respuesta deseado, de acuerdo con los siguientes valores:
    • demo_ok : Este valor produce una respuesta Código 200 con "Status": "OK" . Simula una llamada a la API correcta.
    • demo_error : Este valor produce una respuesta Código 400 con JSON en "Status": "ERROR" y un ErrorCode aleatorio. Esto simula una petición que encuentra un error.
  • x-demo-items (opcional): Esta cabecera le permite especificar el número de transacciones que desea recibir como parte de la respuesta de la API. Puede establecer el valor entre 0 y 100, en función de sus requisitos de prueba.
  • x-demo-seed (opcional): Si proporciona un valor de semilla para este encabezado, se utilizará como fuente para generar datos falsos. Si se reutiliza el mismo valor de semilla, se generará sistemáticamente el mismo conjunto de transacciones. Si omite esta cabecera, su identificador de cliente (gestionado internamente por Khipu) se utilizará como semilla por defecto.
  • x-demo-sleep (opcional): Esta cabecera le permite definir el número de segundos durante los cuales la llamada a la API debe retrasar intencionadamente su respuesta. Esto puede ser beneficioso cuando se simulan escenarios que implican tiempos de procesamiento más largos, o servicios que se sabe que consumen mucho tiempo. El tiempo máximo de espera es de 60 segundos. Si no establece esta cabecera, la respuesta se generará inmediatamente.

Si utiliza estos encabezados de forma eficaz, podrá controlar el comportamiento del entorno Sandbox y adaptar sus pruebas a casos de uso específicos.

Resultado

La respuesta API del entorno Sandbox tiene la misma estructura que una respuesta normal, pero puede identificarse por el elemento AdditionalInformation, que indicará la naturaleza simulada de los datos con el texto SANDBOX_GENERATED_RESPONSE. Véanse ejemplos en la sección siguiente.

Ejemplos

Aquí hay un ejemplo de cómo hacer una llamada sandboxed usando curl para obtener un estado OK:

Copy
Copied
curl -X POST 'https://api.khipu.com/v1/cl/banking/personal/<BANK_TRANSACTIONS_ENDPOINT>' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  -H 'x-demo-type: demo_ok' \
  -H 'x-demo-items: 4' \
  -H 'x-demo-seed: test_seed' \
  --data-raw '{
    "RequestData": {
      "AccountCredential": {
        "Username": "<USERNAME>",
        "Password": "<PASSWORD>"
      },
      "AccountNumber": "0000"
    }
  }'

Respuesta:

Copy
Copied
{
    "OperationId": "d9d82287-96f3-498e-8632-a2c8fc7c8674",
    "Status": "OK",
    "Data": {
        "Transaction": [
            {
                "AccountId": "2932798040",
                "BookingDateTime": "2023-09-06T00:00:00-0300",
                "CreditDebitIndicator": "Debit",
                "Status": "Booked",
                "TransactionInformation": "Traspaso a Victoria Sonia Valenzuela Riquelme",
                "Amount": {
                    "Amount": 837,
                    "Currency": "CLP"
                },
                "BankTransactionCode": {
                    "Code": "ICDT",
                    "SubCode": "DMCT"
                },
                "DebtorAccount": {
                    "Identification": "2932798040",
                    "Name": "Juan Fernández"
                },
                "DebtorAgent": {
                    "Name": "Banco Falabella"
                },
                "SupplementaryData": {
                    "DebtorId": "9.123.845-4"
                }
            },
            {
                "AccountId": "2932798040",
                "BookingDateTime": "2023-06-28T00:00:00-0400",
                "CreditDebitIndicator": "Debit",
                "Status": "Booked",
                "TransactionInformation": "Transferencia a Carlos Faúndez Lara",
                "Amount": {
                    "Amount": 949,
                    "Currency": "CLP"
                },
                "BankTransactionCode": {
                    "Code": "ICDT",
                    "SubCode": "DMCT"
                },
                "DebtorAccount": {
                    "Identification": "2932798040",
                    "Name": "Juan Fernández"
                },
                "DebtorAgent": {
                    "Name": "Banco Falabella"
                },
                "SupplementaryData": {
                    "DebtorId": "9.123.845-4"
                }
            },
            {
                "AccountId": "2932798040",
                "BookingDateTime": "2023-07-29T00:00:00-0400",
                "CreditDebitIndicator": "Debit",
                "Status": "Booked",
                "TransactionInformation": "Pago de servicios",
                "Amount": {
                    "Amount": 26,
                    "Currency": "CLP"
                },
                "BankTransactionCode": {
                    "Code": "ICDT",
                    "SubCode": "DMCT"
                },
                "DebtorAccount": {
                    "Identification": "2932798040",
                    "Name": "Juan Fernández"
                },
                "DebtorAgent": {
                    "Name": "Banco Falabella"
                },
                "SupplementaryData": {
                    "DebtorId": "9.123.845-4"
                }
            },
            {
                "AccountId": "2932798040",
                "BookingDateTime": "2023-02-03T00:00:00-0300",
                "CreditDebitIndicator": "Debit",
                "Status": "Booked",
                "TransactionInformation": "Transferencia a Matías Francisco Montenegro Varas",
                "Amount": {
                    "Amount": 713,
                    "Currency": "CLP"
                },
                "BankTransactionCode": {
                    "Code": "ICDT",
                    "SubCode": "DMCT"
                },
                "DebtorAccount": {
                    "Identification": "2932798040",
                    "Name": "Juan Fernández"
                },
                "DebtorAgent": {
                    "Name": "Banco Falabella"
                },
                "SupplementaryData": {
                    "DebtorId": "9.123.845-4"
                }
            }
        ]
    },
    "AdditionalInformation": "SANDBOX_GENERATED_RESPONSE",
    "Error": null,
    "LifeSpan": null
}

Ejemplo que simula una respuesta incorrecta:

Copy
Copied
curl -X POST 'https://api.khipu.com/v1/cl/banking/personal/<BANK_TRANSACTIONS_ENDPOINT>' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  -H 'x-demo-type: demo_error' \
  --data-raw '{
    "RequestData": {
      "AccountCredential": {
        "Username": "<USERNAME>",
        "Password": "<PASSWORD>"
      },
      "AccountNumber": "0000"
    }
  }'

Respuesta:

Copy
Copied
{
    "OperationId": "64996c85-c735-4d81-a9da-a0df8cae74bd",
    "Status": "ERROR",
    "Data": null,
    "AdditionalInformation": "SANDBOX_GENERATED_ERROR",
    "Error": {
        "Code": "E301",
        "Type": "DO_NOT_RETRY",
        "Description": "No existen registros para el periodo seleccionado."
    },
    "LifeSpan": null
}

Recuerda sustituir YOUR_API_KEY por tu clave real, y también utilizar la misma estructura RequestData que se menciona en la documentación del método. Ten en cuenta que la carga útil no se valida, por lo que no necesitas utilizar credenciales reales.

Un comentario final: Si intentas llamar a un método que aún no está protegido, obtendrás una respuesta como esta:

Copy
Copied
{
    "OperationId": "160b5061-f6b3-4f4f-803f-b555e8096d3b",
    "Status": "OK",
    "Data": {
        "PostProcessorInfo": {
            "Message": "Demo response is not available for this endpoint yet."
        }
    },
    "AdditionalInformation": "SANDBOX_GENERATED_RESPONSE",
    "Error": null,
    "LifeSpan": null
}