Saltar al contenido principal
Migo Docs

Cheat Sheet de Sandbox

Todo lo que necesitas para realizar tu primera transacción de Payment Link de extremo a extremo en Sandbox, en una sola página. Guárdala en favoritos cuando inicies una integración.

Dos sandboxes, dos superficies
  • Middleware Sandbox (https://sb-mw.migopayments.com) — Payment Links, webview hospedado, tokenización, cobros. Es lo que llamas para obtener una URL para tu cliente.
  • Wallet Gateway QA (https://ali-qa.ali.app/rest) — billetera, tarjetas, usuarios. Credenciales y flujo distintos; consulta Inicio rápido y Entornos.

Esta página se enfoca en el Middleware Sandbox porque ahí viven los Payment Links.

URLs base (Middleware)

SuperficieSandboxProducción
Host de la APIhttps://sb-mw.migopayments.comhttps://mw.migopayments.com
Webview hospedadohttps://sandbox.migopayments.comhttps://web.migopayments.com
Referencia OpenAPI/api-reference/migo-apila misma — cambia el servidor en la UI de Scalar

Checklist de credenciales

Antes de poder llamar a POST /transactions (Payment Links) o POST /api/v1/integrations/transactions (Pagos Alternativos), necesitas:

ElementoA qué se pareceCómo conseguirlo
Slug clientString corto, por ejemplo migoDeveloperSe crea cuando Migo da de alta tu aplicación
Merchant token64 caracteres hexadecimales, por ejemplo b6a615d8...0ba65c1Se entrega junto con el slug del cliente. El mismo token autentica tanto Payment Links como Pagos Alternativos — solo cambia el formato del header por endpoint.
(Alternativa) privateKey + publicKeyPar con forma de UUIDSe entrega para integraciones browser-side con /transactions-hook

El formato del header depende del endpoint

EndpointValor del header
POST /transactions (Payment Link)Authorization: <token>sin prefijo Bearer
POST /api/v1/integrations/transactions[…] (Pagos Alternativos)Authorization: Bearer <token>Bearer requerido

Consulta Autenticación → Formato de header por endpoint para la matriz canónica.

Slugs de cliente conocidos en Sandbox

SlugPaísRieles comúnmente habilitados en Sandbox
migoDeveloperGuatemalazigi, akisiQR, bamPaymentButton, quickPayQR, bancoIndustrial, pronet

Confirma los rieles habilitados para tu slug leyendo data.paymentMethods en la respuesta de POST /api/v1/integrations/transactions — ese array es la fuente de verdad.

Solicitud mínima

curl -X POST https://sb-mw.migopayments.com/transactions \
-H 'Content-Type: application/json' \
-H 'Authorization: <your-sandbox-merchant-token>' \
-d '{
"amount": 1,
"userId": "+50224865444",
"channel": "wa",
"client": "<your-client-slug>",
"ads": []
}'

Respuesta esperada:

{
"uid": "Ypo5z2zTpLqWoe3eVvZMH",
"reference": "CLIENT020007SB",
"URL": "https://sandbox.migopayments.com/?orderId=Ypo5z2zTpLqWoe3eVvZMH"
}

El campo URL está en mayúsculas. Ábrelo en un navegador para renderizar el webview hospedado.

Solicitud mínima — Pagos Alternativos (akisiQR)

Para el flujo APM directo (renderizar el QR tú mismo en lugar de abrir el webview), reutiliza el mismo merchant token pero agrega el prefijo Bearer :

# 1) Crear transacción
curl -X POST 'https://sb-mw.migopayments.com/api/v1/integrations/transactions' \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer <your-sandbox-merchant-token>' \
-d '{
"amount": 50,
"channel": "web",
"client": "migoDeveloper",
"userId": "+50224865444",
"customKeys": { "orderId": "demo-1" }
}'
# → 201 { "data": { "uid": "...", "paymentMethods": ["akisiQR","zigi","quickPayQR","pronet"], "expireAt": 11999 } }

# 2) Procesar akisiQR — usa el uid del paso 1
curl -X POST 'https://sb-mw.migopayments.com/api/v1/integrations/transactions/<uid>/payments' \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer <your-sandbox-merchant-token>' \
-d '{ "processor": "akisiQR", "data": {} }'
# → 200 { "data": { "type": "base64", "data": "data:image/png;base64,…" } }

El valor data.data es un URI completo data:image/png;base64,… — colócalo en <img src=...>. Consulta Recetas → Guatemala → Akisi QR para el recorrido completo por riel.

Recetario de campos

CampoValor amigable para SandboxNotas
amount1 para la prueba más económica, o cualquier valor dentro del rango configurado de tu clienteFuera del rango → ownCode 2003
userIdTeléfono E.164, por ejemplo +50224865444 (Guatemala)El Sandbox no entrega realmente SMS / WhatsApp, pero el formato debe ser parseable
channelwa, sms, email, web, appDepende de lo que esté habilitado por cliente. Valores desconocidos → ownCode 5000
clientTu slugSlug equivocado → ownCode 5004
currencyGTQ, USD, MXN, CRC, HNL, DOP, COP, SVCSi se omite, Migo usa la primera moneda configurada de tu cliente
externalIdCualquier string que controles, por ejemplo WEB-${Date.now()}Se devuelve en el payload del Merchant Generic Callback
ads[]Reservado — siempre envía el array vacío si no se usa

Tarjetas de prueba dentro del webview

Una vez que el cliente abre la URL, el webview hospedado le solicita los datos de la tarjeta. Las tarjetas de prueba que funcionan dependen del procesador de tarjeta configurado para tu cliente (para Guatemala es Cybersource). Algunos ejemplos comunes de Cybersource:

PANMarcaComportamiento
4111111111111111VisaVálida (aprueba)
4456530000001096VisaVálida con reto 3DS
4000000000000002VisaDeclina la transacción

Usa cualquier vencimiento futuro y cualquier CVV válido (4 dígitos para Amex, 3 en los demás casos). El resultado de aprobación/rechazo (incluido el comportamiento de 3DS) lo determina la tarjeta de prueba que uses, no un campo de la solicitud.

La lista completa y autoritativa de tarjetas por procesador (Cybersource, FAC 2, Visa Epay, PusPayment, …) vive en Prueba tu integración → Tarjetas de prueba. Confirma qué procesador aplica a tu cliente antes de elegir una tarjeta.

Recibir el resultado

El estado terminal llega a tu backend mediante el Merchant Generic Callback — un POST desde Migo a una URL que registraste con soporte. Payload estándar:

{
"reference": "CLIENT020007SB",
"uid": "Ypo5z2zTpLqWoe3eVvZMH",
"country": "GT",
"currency": "GTQ",
"channel": "WhatsApp",
"status": "approved",
"amount": 1,
"externalId": "ext_auth_123",
"createdAt": "06/05/2026 09:31:00",
"transactionId": "txn_1029384756",
"paymentMethodType": "credit_card"
}

Autentica la solicitud con el header estático que registraste con Migo (sin HMAC). Detalles completos en Merchant Generic Callback.

Errores comunes en Sandbox

HTTPownCodeCausa probableSolución rápida
4012007Token enviado con prefijo Bearer, o credenciales del entorno equivocadoEnvía el token crudo; verifica Sandbox vs. Producción
4095000Falta un campo requerido, tipo equivocado o channel desconocidoVerifica que el cuerpo coincida con el schema en Crear un Payment Link
4095004Slug client equivocadoCopia el slug tal como Migo lo proporcionó (distingue mayúsculas/minúsculas)
4002003amount fuera del rango configuradoPrueba con amount: 1; solicita a Migo el min/max configurado

Catálogo completo: Catálogo de errores → Payment Link / Middleware ownCodes.

Qué copiar a tu .env

MIGO_BASE_URL=https://sb-mw.migopayments.com
MIGO_CLIENT=<your-client-slug>
MIGO_MERCHANT_TOKEN=<your-sandbox-merchant-token>
MIGO_DEFAULT_CHANNEL=web
MIGO_DEFAULT_CURRENCY=GTQ

Nunca los subas al control de versiones. Para integraciones en el navegador usa el flujo alternativo de par de llaves descrito en Crear un Payment Link → endpoint alternativo, y restringe las llaves al rango de monto más pequeño que puedas.

Salir a producción

Cuando Sandbox esté en verde, recorre la Lista de verificación para salir a producción. Las credenciales de producción, las URLs base y los receptores de webhooks son distintos — ninguno de los valores de Sandbox anteriores se transfiere.