# Autenticación Source: https://docs.pay-me.com/api-de-pagos/autenticacion Genera un Access Token para autenticar requests a la API de Pay-me. Genera un **Access Token** usando tus credenciales `client_id` y `client_secret`.\ Todos los endpoints requieren este token para ser consumidos. [https://auth.preprod.alignet.io/token](https://auth.preprod.alignet.io/token) [https://auth.alignet.io/token](https://auth.alignet.io/token) Este endpoint sigue el flujo OAuth 2.0 `client_credentials`. Genera el token una vez y reutilízalo mientras siga vigente. *** ## Scopes disponibles Define los permisos asociados al token. Obligatorio para generar tokens. Crear cargos y autorizaciones. Consultar transacciones. Cancelar transacciones. *** ## Request ### Headers | Campo | Descripción | Valor | Tipo | Obligatorio | | :- | :- | :- | :- | :- | | `Content-Type` | Formato del request | `application/json` | String | SI | | `ALG-API-VERSION` | Versión del API | `1709847567` | String | SI | ```bash theme={"system"} Content-Type: application/json ALG-API-VERSION: 1709847567 ``` *** ### Body | Campo | Descripción | Ejemplo | Tipo | Obligatorio | | :- | :- | :- | :- | :- | | `action` | Acción a ejecutar | `authorize` | String | SI | | `grant_type` | Método de autorización | `client_credentials` | String | SI | | `audience` | URL base del API | `{{base_url}}` | String | SI | | `client_id` | Identificador del cliente | Credencial | String | SI | | `client_secret` | Secreto del cliente | Credencial | String | SI | | `scope` | Permisos solicitados | `create:token post:charges` | String | SI | *** ### Ejemplo (JSON) ```json theme={"system"} { "action": "authorize", "grant_type": "client_credentials", "audience": "{{base_url_del_ambiente}}", "client_id": "your_client_id", "client_secret": "your_client_secret", "scope": "create:token post:charges get:charges delete:charges" } ``` *** ## Response ### Body | Campo | Descripción | Tipo | | :- | :- | :- | | `action` | Acción ejecutada | String | | `success` | Resultado del proceso | Boolean | | `access_token` | Token generado | String | | `scope` | Permisos del token | String | | `expires_in` | Tiempo de expiración (segundos) | Integer | | `token_type` | Tipo de token (`Bearer`) | String | | `authorization` | Metadata del flujo | Object | *** ### Ejemplo (JSON) ```json theme={"system"} { "action": "authorize", "success": true, "access_token": "eyJhbGciOiJIUzI1NiIs...", "scope": "create:token api-test:create:token", "expires_in": 8600, "token_type": "Bearer", "authorization": { "meta": { "status": { "code": "00", "message_ilgn": [ { "locale": "es_PE", "value": "Access Token creado" } ] } } } } ``` *** ## Usar el token en requests Incluye el token en el header `Authorization`: ```bash theme={"system"} Authorization: Bearer {access_token} Content-Type: application/json ALG-API-VERSION: 1709847567 ``` *** ## Buenas prácticas * Reutiliza el token mientras esté vigente. * No generes un token por cada transacción. * Renuévalo antes de su expiración. * Centraliza su gestión en backend. * Usa caché para optimizar rendimiento. * Controla concurrencia para evitar múltiples generaciones simultáneas. *** ## Errores comunes Token inválido, expirado o no enviado correctamente en el header. El token no tiene los scopes necesarios para el endpoint. No expongas el Access Token en frontend, logs o herramientas sin enmascaramiento. *** ## Siguiente paso Aprende a crear tu primera transacción. # Buenas prácticas Source: https://docs.pay-me.com/api-de-pagos/buenas-practicas Recomendaciones para integrar directamente con la API de Pagos de forma segura y consistente. Aplica estas recomendaciones cuando integres directamente con la **API de Pagos** mediante server-to-server. ## Seguridad y PCI Si enviarás datos sensibles de tarjeta en requests `POST`, tu comercio debe contar con cumplimiento **PCI**. Si no cuentas con PCI, utiliza tokenización, SDK o checkout alojado. * Guarda `client_id`, `client_secret` y tokens fuera del frontend. * Usa variables de entorno o gestores de secretos. * Separa credenciales de Pre-Producción y Producción. * Reutiliza el token mientras esté vigente. * Renueva antes de expiración. * Controla concurrencia para no generar tokens innecesarios. * No imprimas PAN, CVV ni payloads completos en logs. * Enmascara información de tarjeta y comprador. * Restringe acceso a trazas, monitoreo y herramientas externas. ## Consistencia transaccional Usa identificadores únicos por operación para evitar duplicados ante reintentos. No cierres una orden con una respuesta preliminar. Confirma con consulta o notificación. Implementa endpoint S2S seguro y responde rápido con `HTTP 200`. Registra operación, estado, timestamp y código de respuesta para soporte. ## Antes de producción * Validar aprobados, denegados, pendientes y expirados. * Probar reintentos, timeouts y errores de autenticación. * Confirmar manejo de métodos asíncronos. * Preparar monitoreo mínimo para el go-live. Revisa el checklist específico para API de Pagos. # Checklist de integración Source: https://docs.pay-me.com/api-de-pagos/checklist-de-integracion Validaciones recomendadas para completar una integración server-to-server con la API de Pagos. Usa este checklist como una guía rápida antes de pedir validación final de una integración **API de Pagos**. Esta guía aplica para integraciones server-to-server con PayIn, Pagos Recurrentes, Devoluciones y Onboarding de Comercios. ## Panorama general Credenciales, ambientes, módulo de integración y alcance funcional definidos antes de desarrollar. Autenticación, headers, payloads, identificadores únicos y validaciones implementadas. Operaciones aprobadas, rechazadas, pendientes y asíncronas probadas en Pre-Producción. Evidencias listas, credenciales productivas revisadas y monitoreo mínimo definido. ## Ruta sugerida Confirma credenciales, Base URL, módulo a implementar y métodos de pago o operaciones habilitadas. Genera y reutiliza el `Access Token` con el [API de Autenticación](/api-de-pagos/autenticacion). Envía headers, montos, moneda, identificadores y campos obligatorios con formato válido. Ejecuta escenarios aprobados, rechazados, pendientes y errores controlados usando [Datos de prueba](/pagos/datos-de-prueba). Implementa consulta, cancelación o notificaciones Server-to-Server según el flujo que uses. Cuando el flujo esté estable, prepara evidencias y coordina la revisión con el equipo de integraciones. ## Checklist base * Credenciales activas para Pre-Producción. * Base URL correcta por ambiente configurada. * Módulo a implementar definido: PayIn, recurrentes, devoluciones u onboarding. * Métodos de pago u operaciones habilitadas confirmadas para el comercio. * `Access Token` generado y renovado correctamente. * Credenciales protegidas fuera del frontend y repositorios públicos. * Cumplimiento PCI validado si enviarás datos sensibles de tarjeta en requests `POST`. * Headers obligatorios enviados en todos los requests. * Manejo de expiración, reintentos y errores `401` / `403` implementado. * Requests enviados en JSON con `Content-Type: application/json`. * Identificadores únicos definidos por operación. * Montos enviados en centavos y moneda en formato esperado. * Validación de campos obligatorios, longitudes y catálogos completada. * Operación aprobada validada de extremo a extremo. * Operación rechazada validada con manejo funcional. * Operaciones pendientes o asíncronas probadas si están habilitadas. * Consulta, cancelación o devolución revisadas si forman parte del flujo. * Endpoint S2S accesible y seguro si el flujo usa notificaciones. * Estados conciliados entre tu sistema y la API. * Idempotencia, duplicados y reintentos contemplados. * Logs mínimos disponibles para seguimiento y soporte. * Pruebas de Pre-Producción completadas con evidencia. * Credenciales productivas revisadas y protegidas. * Monitoreo mínimo definido para el go-live. * Integración lista para operación real. ## Puntos por módulo Valida creación de cargos por método de pago y manejo de estados. Confirma el resultado final con consulta o notificación Server-to-Server. * Revisar [PayIn](/payin/introduccion). * Implementar [API de Autorización](/payin/autorizacion). * Confirmar estados con [API de Consulta](/payin/consulta). * Configurar [Notificaciones](/payin/notificaciones) si aplica. Valida creación, consulta y actualización de afiliaciones. Valida generación de cobros y reporte de resultados. * Revisar [Pagos Recurrentes](/pagos-recurrentes/introduccion). * Validar [Afiliaciones](/pagos-recurrentes/afiliaciones). * Validar [Cobros](/pagos-recurrentes/cobros). * Revisar códigos de respuesta propios del módulo. Valida registro de devoluciones totales o parciales. Confirma el estado final con consulta unitaria o masiva. * Revisar [Devoluciones](/devoluciones/introduccion). * Implementar [API de Devoluciones](/devoluciones/api-de-devoluciones). * Validar [Consulta Unitaria](/devoluciones/consulta-unitaria). * Validar [Consulta Masiva](/devoluciones/consulta-masiva) si aplica. Valida alta y actualización de comercios individuales. Valida estructura de carga y respuesta por lote. * Revisar [Onboarding](/onboarding/introduccion). * Validar [Registro Individual](/onboarding/registro-individual). * Validar [Registro Masivo](/onboarding/registro-masivo). * Confirmar permisos y alcance si operas como Facilitador de Pago. ## Criterio mínimo de aprobación Token generado, reutilizado y renovado sin exponer credenciales sensibles. Al menos un escenario exitoso y uno rechazado o fallido revisados correctamente. Estados conciliados entre la API, tu backend y la operación del comercio. ## Guías relacionadas Genera el token base de la integración. Revisa el módulo de cobros y autorizaciones. Usa escenarios sandbox para validar tus operaciones. Consulta estados, códigos y detalles operativos del módulo PayIn. # API de Pagos Source: https://docs.pay-me.com/api-de-pagos/introduccion Conoce la API de Orquestador de Pay-me — un único punto de integración para procesar pagos en múltiples métodos y países. La API de Orquestador de Pay-me es una solución que te permite integrar pagos a través de un único punto de conexión. Con esta API puedes procesar transacciones en múltiples países y métodos de pago — como tarjetas, transferencias, billeteras digitales y más — sin necesidad de integrarte con cada proveedor por separado. Incluye capacidades de: * Orquestación de pagos * Evaluación de riesgo * Autenticación 3DS *** ## ¿Qué puedes hacer? Acepta pagos con múltiples métodos: tarjeta, QR, transferencia, Yape, Cuotéalo y más. Automatiza cobros periódicos mediante afiliaciones y ejecuciones programadas. Gestiona reembolsos totales o parciales de transacciones procesadas. Registra comercios de forma individual o masiva — exclusivo para Facilitadores de Pago. *** ## Ambientes | Ambiente | Base URL | | :- | :- | | Pre-Producción | `https://api.preprod.alignet.io/` | | Producción | `https://api.alignet.io/` | Utiliza el ambiente de **Pre-Producción** para realizar pruebas antes de pasar a Producción. *** ## Flujo de integración Genera un token de acceso usando el [API de Autenticación](/api-de-pagos/autenticacion). Selecciona el módulo que necesitas — [PayIn](/payin/introduccion), [Pagos Recurrentes](/pagos-recurrentes/introduccion), [Devoluciones](/devoluciones/introduccion) u [Onboarding](/onboarding/introduccion). Ejecuta un request en Pre-Producción utilizando los [Datos de prueba](/pagos/datos-de-prueba) disponibles. Implementa tu endpoint para recibir [Notificaciones Server-to-Server](/payin/notificaciones). Una vez validadas tus pruebas, cambia la Base URL al ambiente de Producción. *** ## Consideraciones generales Todos los montos se expresan en **centavos**. Ejemplo: S/. 10.50 → `"1050"`. El Access Token tiene una duración limitada. Renuévalo antes de que expire para evitar errores de autenticación. Todas las fechas devueltas por la API están en formato **UTC** y **Unix time**. Todos los requests deben enviarse en formato **JSON** utilizando el header `Content-Type: application/json`. Si te integras directamente por API de Pagos y envías datos sensibles de tarjeta en requests `POST`, tu comercio debe contar con cumplimiento **PCI**. Si no cuentas con PCI, utiliza flujos con tokenización, SDK o checkout alojado. *** ## Siguiente paso Genera tu Access Token para comenzar a usar la API. Revisa las validaciones técnicas recomendadas antes de solicitar aprobación final. Revisa recomendaciones de seguridad, PCI, notificaciones y consistencia operativa. # Buenas prácticas Source: https://docs.pay-me.com/checkout-web/buenas-practicas Recomendaciones para integrar Checkout Web y Pay-me Flex de forma segura, clara y trazable. Aplica estas recomendaciones cuando integres **Checkout Web** con Pay-me Flex. ## Responsabilidades del flujo Genera tokens, solicita el `nonce`, valida estados finales y actualiza pedidos. Inicializa Flex, muestra el checkout y captura callbacks para mejorar la experiencia del usuario. No cierres una orden solo con la respuesta visual del navegador. Confirma el estado final desde backend, especialmente en métodos asíncronos. ## Seguridad * Genera el `Access Token` y el `nonce` desde backend. * No expongas credenciales ni tokens en JavaScript, HTML, logs o analítica. * Renueva credenciales temporales cuando expiren. * Usa `responseCallback` para experiencia de usuario. * Usa `trackingCallback` para trazabilidad del flujo. * Usa `onErrorCallback` para mensajes controlados y soporte. * Para QR, transferencia, Cuotéalo o PagoEfectivo, confirma por consulta o notificación. * Maneja estados pendientes, expirados y denegados. * Evita duplicar órdenes ante reintentos del usuario. ## UX recomendada * Muestra mensajes claros para pago aprobado, rechazado, pendiente o cancelado. * Conserva el número de operación para soporte. * Valida Flex en desktop y mobile. * Prueba idioma, botón de cierre y métodos visibles antes de producción. Revisa el checklist específico para Checkout Web. # Checklist de integración Source: https://docs.pay-me.com/checkout-web/checklist-de-integracion Validaciones recomendadas para completar una integración Checkout Web con Flex. Usa este checklist como una guía rápida antes de pedir validación final del flujo **Checkout Web**. Esta guía está orientada a implementaciones con **Flex**, incluyendo frontend, generación de `nonce`, respuesta del pago y validación final del resultado. ## Panorama general Requisitos de negocio, credenciales, ambiente sandbox y dominios listos para comenzar. Nonce operativo, librerías cargadas y parámetros enviados con el formato correcto. Compra aprobada, rechazada y comportamiento post-pago revisados de extremo a extremo. Configuración productiva revisada y evidencias mínimas listas para validación final. ## Ruta sugerida Confirma requisitos de negocio, credenciales activas para sandbox y URLs de retorno o callbacks definidas. Verifica que la autenticación para generar `nonce` funcione correctamente y que Flex cargue sin errores en tu checkout. Ejecuta una compra aprobada y una rechazada, validando mensajes, respuesta visual y continuidad del usuario. Revisa la respuesta en frontend y confirma el estado final desde backend para evitar cerrar la orden con un resultado preliminar. Cuando el flujo esté estable en sandbox, prepara evidencias y coordina la validación con el equipo de integraciones. ## Checklist base * Requisitos de negocio y técnicos revisados. * Credenciales y ambiente de pruebas disponibles. * Dominio, páginas de retorno y callbacks definidos. * Flujo de Checkout Web confirmado para el comercio. * Autenticación operativa para generar `token` o `nonce`. * Librerías o componentes frontend cargados correctamente. * Parámetros obligatorios enviados con formato correcto. * Estilos y experiencia visual revisados dentro del checkout. * Transacción aprobada completada correctamente. * Transacción rechazada validada con manejo de errores. * Respuesta de autorización procesada en frontend. * Métodos asíncronos probados si están habilitados. * Estado final confirmado desde backend o mediante consulta. * Duplicados y reintentos manejados de forma segura. * Orden o pago actualizado correctamente en tu sistema. * Logs mínimos disponibles para soporte y diagnóstico. * Sandbox completado con evidencia mínima de pruebas. * Configuración productiva revisada por ambiente. * Flujos críticos probados con el equipo de integraciones. * Integración lista para salida a vivo. ## Criterio mínimo de aprobación Al menos un flujo aprobado validado de extremo a extremo. Validación completa del manejo de rechazo y mensaje para el usuario. Confirmación entre frontend, backend y estado final del pago antes de salir a producción. ## Guías relacionadas Revisa el flujo principal de Checkout Web con Flex. Genera el `nonce` desde backend para inicializar el formulario. Usa tarjetas y escenarios sandbox para validar tu integración. Confirma desde backend el estado final de la operación. # API Nonce Source: https://docs.pay-me.com/checkout-web/flex/api-nonce Genera el Nonce necesario para inicializar Pay-me Flex después de autenticarte. Genera un **Nonce** temporal para inicializar Pay-me Flex en el frontend.\ Este valor debe solicitarse desde backend usando un `Bearer Token` vigente. *** ## Endpoint [https://auth.preprod.alignet.io/nonce](https://auth.preprod.alignet.io/nonce) [https://auth.alignet.io/nonce](https://auth.alignet.io/nonce) Antes de llamar a este endpoint, genera un `Access Token` con [Autenticación](/api-de-pagos/autenticacion). El token debe enviarse en el header `Authorization`. *** ## Scope requerido Define el permiso asociado al `nonce`. Permite inicializar Flex para crear cargos y autorizaciones. El token enviado en `Authorization` debe estar vigente y habilitado para solicitar este permiso. *** ## Request ### Headers | Campo | Descripción | Valor | Tipo | Obligatorio | | :- | :- | :- | :- | :- | | `Content-Type` | Formato del request | `application/json` | String | SI | | `ALG-API-VERSION` | Versión del API | `1709847567` | String | SI | | `Authorization` | Token de autenticación | `Bearer {access_token}` | String | SI | ```bash theme={"system"} Content-Type: application/json ALG-API-VERSION: 1709847567 Authorization: Bearer {access_token} ``` *** ### Body | Campo | Descripción | Ejemplo | Tipo | Obligatorio | | :- | :- | :- | :- | :- | | `action` | Acción a ejecutar | `create.nonce` | String | SI | | `audience` | URL base del API según ambiente | `https://api.preprod.alignet.io/` | String | SI | | `client_id` | Identificador público del comercio | `your_client_id` | String | SI | | `scope` | Permiso solicitado para el nonce | `post:charges` | String | SI | El valor de `audience` debe coincidir con el ambiente que usarás para autorizar el pago: `https://api.preprod.alignet.io/` para Pre-Producción o `https://api.alignet.io/` para Producción. *** ### Ejemplo (JSON) ```json theme={"system"} { "action": "create.nonce", "audience": "https://api.preprod.alignet.io/", "client_id": "your_client_id", "scope": "post:charges" } ``` *** ### Ejemplo (cURL) ```bash theme={"system"} curl --request POST 'https://auth.preprod.alignet.io/nonce' \ --header 'Content-Type: application/json' \ --header 'ALG-API-VERSION: 1709847567' \ --header 'Authorization: Bearer {access_token}' \ --data '{ "action": "create.nonce", "audience": "https://api.preprod.alignet.io/", "client_id": "your_client_id", "scope": "post:charges" }' ``` *** ## Response ### Body | Campo | Descripción | Tipo | | :- | :- | :- | | `action` | Acción ejecutada | String | | `success` | Resultado de la operación | Boolean | | `nonce` | Código temporal para inicializar Flex | String | | `scope` | Permiso asociado al nonce | String | | `expires_in` | Tiempo de vigencia en segundos | Integer | | `nonce_creation` | Metadata del resultado | Object | | `nonce_creation.meta.status.code` | Código interno del resultado | String | | `nonce_creation.meta.status.message_ilgn[].locale` | Idioma del mensaje | String | | `nonce_creation.meta.status.message_ilgn[].value` | Mensaje del resultado | String | *** ### Ejemplo (JSON) ```json theme={"system"} { "action": "create.nonce", "success": true, "nonce": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9...", "scope": "post:charges", "expires_in": 30, "nonce_creation": { "meta": { "status": { "code": "00", "message_ilgn": [ { "locale": "es_PE", "value": "Código Nonce creado" } ] } } } } ``` *** ## Usar el Nonce en Flex Después de recibir el `nonce`, envíalo al frontend e inclúyelo en la inicialización del componente junto con el `payload`. ```js theme={"system"} var paymentForm = new FlexPaymentForms({ nonce, payload, settings: { display_result_screen: true, show_close_button: true, show_border: false, show_operation_number: true }, display_settings: { methods: ["QR", "BANK_TRANSFER", "CARD"] }, i18n: { mode: "multi", default_language: "es", languages: ["es", "en"] } }); ``` *** ## Flujo recomendado Consume el API de Seguridad desde backend. Envía `action`, `audience`, `client_id` y `scope` al endpoint `POST /nonce`. Usa el `nonce` en `FlexPaymentForms` junto con el `payload` de pago. Confirma la operación desde backend usando notificaciones o API de consulta. *** ## Buenas prácticas * Solicita el `nonce` desde backend. * Usa el mismo ambiente para `auth`, `audience`, librerías Flex y APIs de pago. * No expongas `client_id`, tokens ni metadata sensible en logs públicos. * Genera un nuevo `nonce` si el anterior expiró antes de inicializar Flex. * Controla reintentos para evitar múltiples solicitudes innecesarias. *** ## Errores comunes El body está incompleto, el `action` no es válido o el `audience` no corresponde al ambiente. El `Bearer Token` no fue enviado, expiró o tiene un formato incorrecto. El token no cuenta con el scope necesario para solicitar el `nonce`. Ocurrió un error temporal en el servicio. Reintenta de forma controlada desde backend. El `nonce` no reemplaza la validación backend del resultado. Después de la respuesta de Flex, confirma el estado de la operación con tu backend. *** ## Siguiente paso Continúa con la inclusión del CSS y JS del ambiente antes de inicializar el formulario. # Capturar funciones callback Source: https://docs.pay-me.com/checkout-web/flex/capturar-funciones-callback Procesa los callbacks de Pay-me Flex y relaciona responseCallback con la respuesta de PayIn según el método usado. Cuando llamas `paymentForm.init(...)`, Flex te permite capturar tres funciones callback. La más importante para el resultado del frontend es `responseCallback(response)`. Toma `responseCallback(response)` como la entrada principal del resultado en frontend. El JSON que recibes ahí reutiliza la misma estructura del **API de Autorización - ecommerce** para el método de pago elegido dentro de Flex. ## Callbacks disponibles Se ejecuta cuando el proceso llega a un resultado de negocio y te entrega el JSON de respuesta. Se ejecuta por cada evento del flujo, como cambio de método, clics o avance del usuario dentro del formulario. Se ejecuta cuando ocurre un error técnico durante la carga o ejecución del componente. ## Ejemplo de implementación ```javascript theme={"system"} function responseCallback(response) { console.log("-------Respuesta-------"); console.log({response}); } function trackingCallback(trackdata) { console.log("-------Tracking de Eventos-------"); console.log({trackdata}); } function onErrorCallback(error) { console.log("-------Error en el proceso-------"); console.log({error}); } paymentForm.init( document.querySelector("#demo"), responseCallback, trackingCallback, onErrorCallback ); ``` ## Cómo interpretar responseCallback El campo `response.payment_method` te indica qué referencia de PayIn debes usar para interpretar el JSON de respuesta devuelto por Flex. No uses `response.meta.status.code` como validador de pago aprobado o denegado. Este código solo indica el resultado del procesamiento del servicio o si la respuesta fue generada correctamente. Para validar el resultado del pago, revisa `response.transaction.state` y confirma desde backend con [Consulta](/payin/consulta) o [Notificaciones](/payin/notificaciones), según el método de pago. El objeto `response` sigue el contrato del [API de Autorización con Tarjeta](/payin/autorizacion-tarjeta). Si tu flujo usa redirect o autenticación 3DS fuera de la misma pantalla, complementa esta lectura con [Consideraciones para métodos con Redirect](/payin/autorizacion-metodos-con-redirect). El objeto `response` sigue el contrato del [API de Autorización con Yape](/payin/autorizacion-yape). Aunque el resultado llegue por `responseCallback`, valida también la consistencia operativa desde backend antes de confirmar el pedido. El objeto `response` sigue el contrato del [API de Autorización con Transferencia Bancaria](/payin/autorizacion-transferencia-bancaria). Este método puede requerir confirmación posterior. No tomes el frontend como única fuente de verdad: apóyate en [Consulta](/payin/consulta-transferencia-bancaria) o [Notificaciones](/payin/notificaciones). El objeto `response` sigue el contrato del [API de Autorización con QR](/payin/autorizacion-qr). Generar el QR o mostrar una respuesta inicial no equivale a un pago final confirmado. Usa [Consulta](/payin/consulta-qr) o [Notificaciones](/payin/notificaciones) para cerrar la lógica de negocio. El objeto `response` sigue el contrato del [API de Autorización con Cuotéalo](/payin/autorizacion-cuotealo). Por tratarse de un flujo con redirección o seguimiento, confirma el estado final con [Consulta](/payin/consulta-cuotealo) o [Notificaciones](/payin/notificaciones). El objeto `response` sigue el contrato del [API de Autorización con PagoEfectivo](/payin/autorizacion-pagoefectivo). La generación del CIP o del enlace de pago no significa que el dinero ya fue recibido. Confirma el resultado con [Consulta](/payin/consulta-pagoefectivo) o [Notificaciones](/payin/notificaciones). `trackingCallback` sirve para observabilidad y `onErrorCallback` para fallos técnicos. Ninguno reemplaza la lógica de negocio que debes construir sobre `responseCallback` y la confirmación backend. ## Referencias relacionadas Referencia principal del contrato de respuesta que Flex reutiliza en `responseCallback`. Valida desde backend el estado final de la operación antes de cerrar la orden. Usa este canal si tu integración también confirma resultados desde backend mediante notificaciones. # Construcción del payload Source: https://docs.pay-me.com/checkout-web/flex/construccion-del-payload Arma el payload que Pay-me Flex utilizará para iniciar el flujo de autorización. El `payload` de Flex reutiliza la estructura del **API de Autorización - ecommerce**, con una diferencia importante: debes enviar `payment_method` en el objeto raíz, pero como un objeto vacío `{}`, porque el cliente elegirá el método dentro del formulario. Piensa este paso como la preparación del request de `POST /charges` para Flex. Lo que construyes aquí será la base de la operación que luego terminarás leyendo en `responseCallback(response)`. ## Qué se conserva y qué cambia Mantienes `action`, `channel`, `merchant_code`, `merchant_operation_number`, `payment_method` y `payment_details`. En Flex, `payment_method` viaja como `{}` vacío porque el método real se resuelve en el frontend según lo que el usuario seleccione. ## Estructura del payload Expande cada bloque para revisar qué campos pertenecen a cada nivel del objeto que enviarás a Flex. Contiene la información general de la operación y enlaza con `payment_details`, donde viaja el detalle del cobro. | Campo | Descripción | Ejemplo | Tipo | Obligatorio | | :- | :- | :- | :- | :- | | `action` | Acción a ejecutar | `authorize` | String | SI | | `channel` | Canal donde se ejecutará la transacción | `ecommerce` | String | SI | | `merchant_code` | Identificador del comercio | Cadena alfanumérica | String | SI | | `merchant_operation_number` | Número de pedido de la operación | Cadena numérica entre 6 y 12 dígitos | String | SI | | `payment_method` | Objeto reservado para Flex. Debe enviarse vacío | `{}` | Object | SI | | `payment_details` | Objeto con información de la transacción | Object | Object | SI | Agrupa el monto, moneda y subobjetos operativos del comprador, facturación y envío. | Campo | Descripción | Ejemplo | Tipo | Obligatorio | | :- | :- | :- | :- | :- | | `payment_details.amount` | Monto en centavos de la operación | `1050` | String | SI | | `payment_details.currency` | Código [ISO 4217](https://www.iso.org/iso-4217-currency-codes.html) de la moneda de la operación | `604` | String | SI | | `payment_details.additional_fields` | Diccionario para enviar campos y valores personalizados según `key:value` | `external_id:5468724` | Dictionary | NO | | `payment_details.customer` | Objeto con información del cliente que realiza la compra | Object | Object | NO | | `payment_details.billing` | Objeto con información de facturación | Object | Object | SI | | `payment_details.shipping` | Objeto con información de envío | Object | Object | NO | Define los datos opcionales del cliente que realiza la compra, útiles para identificación y contexto de riesgo. | Campo | Descripción | Tipo | Obligatorio | | :- | :- | :- | :- | | `payment_details.customer.first_name` | Nombres | String | NO | | `payment_details.customer.last_name` | Apellidos | String | NO | | `payment_details.customer.email` | Correo electrónico | String | NO | | `payment_details.customer.phone` | Objeto con información del teléfono | Object | NO | | `payment_details.customer.phone.country_code` | Código del país del teléfono | String | NO | | `payment_details.customer.phone.subscriber` | Número del teléfono | String | NO | | `payment_details.customer.identity_document` | Objeto con información del documento de identidad | Object | NO | | `payment_details.customer.identity_document.country` | País del documento | String | NO | | `payment_details.customer.identity_document.type` | Tipo de documento | String | NO | | `payment_details.customer.identity_document.identifier` | Número de documento | String | NO | | `payment_details.customer.location` | Objeto con información de ubicación | Object | NO | | `payment_details.customer.location.line_1` | Dirección 1 | String | NO | | `payment_details.customer.location.line_2` | Dirección 2 | String | NO | | `payment_details.customer.location.city` | Ciudad | String | NO | | `payment_details.customer.location.state` | Estado | String | NO | | `payment_details.customer.location.country` | País | String | NO | Contiene los datos obligatorios de facturación que Flex necesita para procesar la operación. | Campo | Descripción | Tipo | Obligatorio | | :- | :- | :- | :- | | `payment_details.billing.first_name` | Nombres | String | SI | | `payment_details.billing.last_name` | Apellidos | String | SI | | `payment_details.billing.email` | Correo electrónico | String | SI | | `payment_details.billing.phone` | Objeto con información del teléfono | Object | SI | | `payment_details.billing.phone.country_code` | Código del país del teléfono | String | SI | | `payment_details.billing.phone.subscriber` | Número del teléfono | String | SI | | `payment_details.billing.location` | Objeto con información de ubicación | Object | SI | | `payment_details.billing.location.line_1` | Dirección 1 | String | SI | | `payment_details.billing.location.line_2` | Dirección 2 | String | NO | | `payment_details.billing.location.city` | Ciudad | String | SI | | `payment_details.billing.location.state` | Estado | String | SI | | `payment_details.billing.location.country` | País | String | SI | Incluye la información de envío cuando tu flujo de negocio la necesite para complementar la operación. | Campo | Descripción | Tipo | Obligatorio | | :- | :- | :- | :- | | `payment_details.shipping.first_name` | Nombres | String | NO | | `payment_details.shipping.last_name` | Apellidos | String | NO | | `payment_details.shipping.email` | Correo electrónico | String | NO | | `payment_details.shipping.phone` | Objeto con información del teléfono | Object | NO | | `payment_details.shipping.phone.country_code` | Código del país del teléfono | String | NO | | `payment_details.shipping.phone.subscriber` | Número del teléfono | String | NO | | `payment_details.shipping.location` | Objeto con información de ubicación | Object | NO | | `payment_details.shipping.location.line_1` | Dirección 1 | String | NO | | `payment_details.shipping.location.line_2` | Dirección 2 | String | NO | | `payment_details.shipping.location.city` | Ciudad | String | NO | | `payment_details.shipping.location.state` | Estado | String | NO | | `payment_details.shipping.location.country` | País | String | NO | Para S/. 10.50 se debe enviar `1050` y en `currency` el valor `604` para Soles. En Flex, el objeto raíz debe incluir explícitamente `payment_method: {}` aunque el método final todavía no haya sido seleccionado por el usuario. ## Ejemplo completo ```javascript theme={"system"} var payload = { "action": "authorize", "channel": "ecommerce", "merchant_code": "b0deb6f3-e51a-48a7-9268-f1441d46f7bd", "merchant_operation_number": "221354", "payment_method": {}, "payment_details": { "amount": "7000", "currency": "604", "billing": { "first_name": "Levis", "last_name": "Silvestre", "email": "levis.silvestre@alignet.com", "phone": { "country_code": "+51", "subscriber": "958435685" }, "location": { "line_1": "Av. San Borja Norte 1743", "line_2": "", "city": "Lima", "state": "Lima", "country": "PE" } }, "shipping": { "first_name": "Levis", "last_name": "Silvestre", "email": "levis.silvestre@alignet.com", "phone": { "country_code": "+51", "subscriber": "958435685" }, "location": { "line_1": "Av. San Borja Norte 1743", "line_2": "", "city": "Lima", "state": "Lima", "country": "PE" } }, "customer": { "first_name": "Levis", "last_name": "Silvestre", "email": "levis.silvestre@alignet.com", "phone": { "country_code": "+51", "subscriber": "958435685" }, "identity_document": { "country": "PER", "type": "DNI", "identifier": "72661927" }, "location": { "line_1": "Av. San Borja Norte 1743", "line_2": "", "city": "Lima", "state": "Lima", "country": "PE" } } } } ``` ## Siguiente paso Usa este `payload` junto con tu `nonce` para crear la instancia de `FlexPaymentForms`. Toma esta referencia como contrato base del request que estás reutilizando en Flex. # Funcionalidad de cobros Source: https://docs.pay-me.com/checkout-web/flex/funcionalidad-de-cobros Recorre el flujo de cobro en Pay-me Flex: payload, inicialización y callbacks. El flujo de cobro en Flex conviene trabajarlo en tres pasos separados: construir el `payload`, inicializar el componente y capturar los `callbacks` del proceso. En Checkout Web Flex, el método de pago se elige dentro del formulario. Por eso el `payload` reutiliza la estructura del API de autorización enviando `payment_method: {}` en el objeto raíz. ## Panorama general Arma la información de la operación, comprador, facturación y envío usando el mismo contrato base de PayIn. Crea la instancia de `FlexPaymentForms`, envía `nonce`, `payload` y define cómo mostrar el formulario. Procesa `responseCallback`, `trackingCallback` y `onErrorCallback` según el resultado del flujo. ## Secuencia recomendada Prepara la operación con el mismo request de autorización ecommerce, incluyendo `payment_method: {}` porque Flex resolverá el método real en pantalla. Inicializa `FlexPaymentForms` con el `nonce` vigente y el `payload` ya validado desde backend. Usa `paymentForm.init(...)` para renderizar el componente dentro del elemento del DOM donde quieres mostrar el checkout. Toma el resultado desde `responseCallback(response)` y usa ese JSON como referencia principal del frontend. Para cerrar la orden o marcar el pago como final, complementa con [API de Consulta](/payin/consulta) y, si aplica, con [Notificaciones](/payin/notificaciones). ## Qué respuesta debes tomar El objeto `response` recibido en `responseCallback` reutiliza el contrato del [API de Autorización - ecommerce](/payin/autorizacion). La referencia exacta depende del método que el cliente eligió dentro de Flex. No cierres la orden usando solo el frontend en métodos asíncronos como `BANK_TRANSFER`, `QR`, `CUOTEALO` o `PAGOEFECTIVO`. Confirma siempre el estado final desde backend. ## Guías del flujo Revisa la estructura completa del request que Flex necesita para iniciar una operación. Aprende a crear la instancia, definir métodos visibles y renderizar el formulario. Entiende cómo leer `responseCallback` y cómo relacionarlo con cada método de PayIn. Usa consulta como segunda validación backend antes de confirmar el resultado final al negocio. # Funcionalidad Débito Automática Source: https://docs.pay-me.com/checkout-web/flex/funcionalidad-debito-automatica Inicializa y muestra el formulario de débito automático de Pay-me Flex Esta funcionalidad se encuentra en desarrollo. La documentación, parámetros y flujos pueden cambiar antes de su disponibilidad final. ## Inicializar componente Débito Automático Cuando se crea una nueva instancia del componente es necesario un objeto de configuración con las propiedades **nonce**, **payload** y **settings**. ### Parámetros | Campo | Tipo | Obligatorio | Descripción | | - | - | - | - | | `action` | String | SI | Acción a ejecutar. Valores: `subscribe` / `update_subscription` | | `merchant_affiliation_code` | String | SI | Código de afiliación generado por el comercio. | | `merchant_code` | String | SI | Código del comercio que inicia la afiliación. | | `type` | String | SI | Tipo de afiliación. Solo se permite `MANUAL`. | | `frequency` | String | NO | Frecuencia de los cobros de la afiliación. | | `amount` | String | NO | Monto de los cobros en centavos. | | `maxAmount` | String | NO | Monto máximo para los pagos recurrentes en centavos. | | `currency` | String (ISO 4217) | SI | Moneda de los cobros. Ej.: `604` = PEN. | | Campo | Tipo | Obligatorio | Descripción | | - | - | - | - | | `beneficiary.first_name` | String | SI | Nombres del beneficiario. | | `beneficiary.last_name` | String | SI | Apellidos del beneficiario. | | `beneficiary.email` | String | SI | Correo electrónico del beneficiario. | | `beneficiary.phone.country_code` | String | SI | Código de país del teléfono. Ej.: `51`. | | `beneficiary.phone.subscriber` | String | SI | Número de teléfono del beneficiario. | | `beneficiary.identity_document.type` | String | NO | Tipo de documento de identidad. Ej.: `DNI`. | | `beneficiary.identity_document.identifier` | String | NO | Número del documento de identidad. | | `beneficiary.identity_document.country` | String (ISO-3166) | NO | País de emisión del documento. Ej.: `PE`. | | `beneficiary.location.line_1` | String | SI | Dirección principal. | | `beneficiary.location.line_2` | String | NO | Dirección complementaria. | | `beneficiary.location.city` | String | SI | Ciudad de residencia. | | `beneficiary.location.state` | String | SI | Departamento o región. | | `beneficiary.location.country` | String (ISO-3166) | SI | Código ISO del país. Ej.: `PE`. | | Campo | Tipo | Obligatorio | Descripción | | - | - | - | - | | `additional_fields.FACTURACION_ID` | String | NO | ID del cliente o contrato para facturación. | | `additional_fields.PLAN` | String | NO | Nombre o código del plan al que se afilia el beneficiario. | | `wallet.user_id` | String | NO | ID del usuario en el wallet para asociar una tarjeta a la afiliación. | ### Flujos disponibles Muestra un formulario de pago con los diferentes métodos habilitados para el comercio. Muestra el formulario de afiliación para registrar un nuevo débito automático. Muestra un formulario para actualizar una afiliación existente. *** ## Mostrar Pay-me Flex Débito Automático Este es el paso final. Se indica dentro de qué **elemento del DOM** se debe mostrar el formulario y las funciones **callback** para ejecutarse durante el proceso. ### Callbacks Se ejecuta cuando el componente entrega una respuesta del proceso. Se ejecuta por cada evento disparado durante el proceso. Se ejecuta cuando hay un error durante el proceso. No uses `meta.status.code` como validador de pago autorizado o denegado. Este código solo indica el resultado del procesamiento del servicio. Para una autorización, valida el estado de la transacción y confirma el resultado desde backend antes de cerrar la orden. ### Casos de uso ```json theme={"system"} { "action": "authorize", "channel": "ecommerce", "merchant_code": "your_merchant_code", "merchant_operation_number": "976867", "payment_details": { "amount": "387000", "currency": "604", "billing": { "first_name": "Mateo", "last_name": "Zayas Meza", "email": "Mateo_ZayasMeza85@yahoo.com", "phone": { "country_code": "51", "subscriber": "945831902" }, "location": { "line_1": "Poblado Concepción 7", "line_2": "Puerta 249", "city": "LIMA", "state": "LIMA", "country": "PE" } }, "wallet": { "user_id": "72661927" } } } ``` ```json theme={"system"} { "action": "subscribe", "merchant_affiliation_code": "122947_RPS_USER", "merchant_code": "your_merchant_code", "type": "MANUAL", "currency": "604", "beneficiary": { "first_name": "Pilar", "last_name": "Ordóñez Tirado", "email": "Pilar.OrdonezTirado61@gmail.com", "phone": { "country_code": "51", "subscriber": "965097539" }, "identity_document": { "type": "DNI", "identifier": "38216803", "country": "PE" }, "location": { "line_1": "Colonia Victor Manuel 2498", "city": "LIMA", "state": "LIMA", "country": "PE" } }, "additional_fields": { "FACTURACION_ID": "133445", "PLAN": "POST PAGO 250" } } ``` ```json theme={"system"} { "action": "subscribe", "merchant_affiliation_code": "023007_RPS_USER", "merchant_code": "your_merchant_code", "type": "MANUAL", "currency": "604", "beneficiary": { "first_name": "Mónica", "last_name": "Duarte Deleón", "email": "Monica.DuarteDeleon89@nearbpo.com", "phone": { "country_code": "51", "subscriber": "944169494" }, "identity_document": { "type": "DNI", "identifier": "41134394", "country": "PE" }, "location": { "line_1": "Ferrocarril Pilar Quintairos 45", "city": "LIMA", "state": "LIMA", "country": "PE" } }, "additional_fields": { "FACTURACION_ID": "133445", "PLAN": "POST PAGO 250" }, "wallet": { "user_id": "72661927" } } ``` ```json theme={"system"} { "action": "update_subscription", "merchant_affiliation_code": "10011_LEVIS", "merchant_code": "your_merchant_code" } ``` ```json theme={"system"} { "action": "update_subscription", "merchant_affiliation_code": "10011_LEVIS", "merchant_code": "your_merchant_code", "wallet": { "user_id": "72661927" } } ``` ### Response de afiliación | Campo | Tipo | Obligatorio | Descripción | | - | - | - | - | | `success` | Boolean | SI | Indica si el proceso se realizó correctamente. | | `affiliation.affiliation_id` | String (UUID) | SI | ID de la afiliación generado por el sistema. | | `affiliation.merchant_affiliation_code` | String | SI | Código de afiliación generado por el comercio. | | `affiliation.merchant_code` | String (UUID) | SI | Código del comercio. | | `affiliation.state` | String | SI | Estado de la afiliación. Ej.: `ACTIVE`. | | `affiliation.type` | String | SI | Tipo de afiliación. Ej.: `MANUAL`. | | `affiliation.frequency` | String | NO | Frecuencia de los cobros. | | `affiliation.amount` | String | NO | Monto de la afiliación en centavos. | | `affiliation.max_amount` | String | NO | Monto máximo permitido. | | `affiliation.currency` | String (ISO 4217) | SI | Moneda de los cobros. | | Campo | Tipo | Obligatorio | Descripción | | - | - | - | - | | `affiliation.beneficiary.first_name` | String | SI | Nombres del beneficiario. | | `affiliation.beneficiary.last_name` | String | SI | Apellidos del beneficiario. | | `affiliation.beneficiary.email` | String | SI | Correo electrónico. | | `affiliation.beneficiary.phone.country_code` | String | SI | Código del país del teléfono. | | `affiliation.beneficiary.phone.subscriber` | String | SI | Número de teléfono. | | `affiliation.beneficiary.identity_document.type` | String | NO | Tipo de documento. | | `affiliation.beneficiary.identity_document.identifier` | String | NO | Número de documento. | | `affiliation.beneficiary.identity_document.country` | String | NO | País del documento. | | `affiliation.beneficiary.location.line_1` | String | SI | Dirección principal. | | `affiliation.beneficiary.location.city` | String | SI | Ciudad. | | `affiliation.beneficiary.location.state` | String | SI | Departamento o región. | | `affiliation.beneficiary.location.country` | String | SI | País. | | Campo | Tipo | Obligatorio | Descripción | | - | - | - | - | | `affiliation.card.token` | String | SI | Token de la tarjeta afiliada. | | `affiliation.card.brand` | String | SI | Marca de la tarjeta. Ej.: VISA, MSCD. | | `affiliation.card.bin` | String | SI | BIN de la tarjeta. | | `affiliation.card.last_pan` | String | SI | Últimos 4 dígitos de la tarjeta. | | `affiliation.card.issuer_name` | String | NO | Nombre del emisor de la tarjeta. | | `affiliation.card.card_holder_name` | String | SI | Nombre del titular de la tarjeta. | | `meta.status.code` | String | SI | Código de resultado técnico del procesamiento. No valida si un pago fue autorizado o denegado. | | `meta.status.message_ilgn[].locale` | String | SI | Idioma del mensaje de respuesta. | | `meta.status.message_ilgn[].value` | String | SI | Descripción del resultado. | # Inicializar el componente Source: https://docs.pay-me.com/checkout-web/flex/inicializar-el-componente Crea la instancia de Pay-me Flex, monta el formulario y adáptalo a celular y web. Con el `payload` construido y un `nonce` vigente, crea la instancia de `FlexPaymentForms` y monta el formulario en tu DOM. Necesitas un `nonce` vigente del [API Nonce](/checkout-web/flex/api-nonce) y el `payload` de [Construcción del payload](/checkout-web/flex/construccion-del-payload) antes de continuar. ## Parámetros del constructor Expande cada bloque para revisar los campos que puedes enviar al constructor. | Campo | Tipo | Descripción | | :- | :- | :- | | `nonce` | Alfanumérico | Código encriptado generado en backend mediante el [API Nonce](/checkout-web/flex/api-nonce). | | `payload` | Objeto JSON | Detalles de la compra y del comprador preparados en [Construcción del payload](/checkout-web/flex/construccion-del-payload). | Controla el comportamiento visual general del componente. | Campo | Tipo | Descripción | | :- | :- | :- | | `settings.display_result_screen` | Boolean | Muestra la pantalla de resultado al finalizar el proceso. | | `settings.show_close_button` | Boolean | Muestra el botón para cerrar el componente. | | `settings.show_border` | Boolean | Activa o desactiva el borde visual del componente. | | `settings.show_operation_number` | Boolean | Muestra el número de operación dentro del flujo. | Define los medios de pago que Flex mostrará al comprador. | Campo | Tipo | Descripción | | :- | :- | :- | | `display_settings.methods` | Array de String | Lista necesaria para la visualización. Acepta `CARD`, `YAPE`, `QR`, `BANK_TRANSFER`, `CUOTEALO` o `PAGOEFECTIVO`. | Debes enviar `display_settings.methods` con los métodos de pago que necesitas visualizar en Flex. Configura los idiomas disponibles dentro del formulario. | Campo | Tipo | Descripción | | :- | :- | :- | | `i18n.mode` | String | Modo de idiomas. Para este flujo se usa `multi`. | | `i18n.default_language` | String | Idioma predeterminado: `es` o `en`. | | `i18n.languages` | Array de String | Lista de idiomas habilitados. Actualmente se soportan `es` y `en`. | ## Inicializar y montar Flex Envía el `nonce`, el `payload` y la configuración que necesite tu integración. ```javascript theme={"system"} const paymentForm = new FlexPaymentForms({ nonce, payload, settings: { display_result_screen: true, show_close_button: true, show_border: false, show_operation_number: true }, display_settings: { methods: ["QR", "BANK_TRANSFER", "CARD"] }, i18n: { mode: "multi", default_language: "es", languages: ["es", "en"] } }); ``` Agrega al HTML el elemento donde Flex generará su DOM. ```html theme={"system"}
```
Monta la instancia y entrega las funciones que procesarán la respuesta, el seguimiento y los errores. ```javascript theme={"system"} paymentForm.init( document.querySelector("#flex-container"), responseCallback, trackingCallback, onErrorCallback ); ```
Si defines `i18n.default_language`, utiliza uno de los idiomas incluidos en `i18n.languages`. `#flex-container` es solo un ejemplo. Puedes usar otro selector, siempre que el elemento exista antes de ejecutar `paymentForm.init(...)`. ## Comportamiento responsive Flex conserva su estructura interna mientras el contenedor externo calcula una escala adecuada para el viewport. Mantiene la escala original cuando el formulario cabe en la ventana. Reduce el formulario proporcionalmente para evitar cortes horizontales. Recalcula la altura cuando Flex cambia de paso o método de pago. ### Ejemplo de implementación Este ejemplo visual usa una presentación popup. La inicialización, los callbacks y el desmontaje descritos más adelante también aplican a las presentaciones embebida y expandida. ```html theme={"system"} ``` ```css theme={"system"} :root { --flex-responsive-scale: 1; --flex-natural-width: 415px; --flex-natural-height: 656px; } .flex-modal { position: fixed; inset: 0; z-index: 1000; display: none; padding: 15px 20px; overflow: hidden; background: rgb(0 18 37 / 48%); } .flex-modal.is-open { display: flex; align-items: center; justify-content: center; } .flex-modal__content { width: var(--flex-natural-width); height: var(--flex-natural-height); max-width: calc(100vw - 40px); max-height: calc(100vh - 30px); max-height: calc(100dvh - 30px); transform: scale(var(--flex-responsive-scale)); transform-origin: center; } #flex-container { width: 100%; height: 100%; } ``` ```javascript theme={"system"} const FLEX_RESPONSIVE_LAYOUT = { naturalWidth: 415, naturalHeight: 656, viewportPaddingHorizontal: 40, // 20 px a cada lado viewportPaddingVertical: 30, // 15 px arriba y abajo minimumScale: 0.25 }; function calculateResponsiveScale() { const viewportWidth = window.visualViewport?.width ?? window.innerWidth; const viewportHeight = window.visualViewport?.height ?? window.innerHeight; const availableWidth = viewportWidth - FLEX_RESPONSIVE_LAYOUT.viewportPaddingHorizontal; const availableHeight = viewportHeight - FLEX_RESPONSIVE_LAYOUT.viewportPaddingVertical; return Math.max( FLEX_RESPONSIVE_LAYOUT.minimumScale, Math.min( 1, availableWidth / FLEX_RESPONSIVE_LAYOUT.naturalWidth, availableHeight / FLEX_RESPONSIVE_LAYOUT.naturalHeight ) ); } function updateResponsiveScale() { const responsiveScale = calculateResponsiveScale(); document.documentElement.style.setProperty( "--flex-responsive-scale", String(responsiveScale) ); } // Aplica la escala inicial y la recalcula cuando cambia el viewport. updateResponsiveScale(); window.addEventListener("resize", updateResponsiveScale); window.visualViewport?.addEventListener("resize", updateResponsiveScale); // Muestra el modal. const paymentModal = document.querySelector("#payment-modal"); paymentModal.classList.add("is-open"); paymentModal.setAttribute("aria-hidden", "false"); // Inicializa Flex. paymentForm.init( document.querySelector("#flex-container"), responseCallback, trackingCallback, onErrorCallback ); ``` ```javascript theme={"system"} function unmountFlex() { window.removeEventListener("resize", updateResponsiveScale); window.visualViewport?.removeEventListener("resize", updateResponsiveScale); paymentForm.terminate?.(); const flexContainer = document.querySelector("#flex-container"); flexContainer.innerHTML = ""; } ``` ## Ciclo de vida de la instancia `paymentForm.terminate?.()` finaliza los procesos internos, listeners y recursos que mantiene la instancia de Flex. Esta operación es diferente de eliminar el formulario del DOM (`flexContainer.innerHTML = ""`) y aplica a cualquier tipo de presentación. El operador `?.` ejecuta `terminate()` solo cuando el método existe. Esto evita un error si la versión cargada de Flex no implementa ese método. ### Cuándo desmontar según la presentación | Presentación | Cuándo desmontar | Acción visual posterior | | :- | :- | :- | | Embebida | Cuando ocultas el checkout, cambias de sección o navegas a otra pantalla. | Retira o reemplaza el contenido donde estaba Flex. | | Popup (modal) | Cuando el comprador cierra el popup o termina el flujo. | Oculta el overlay y devuelve el foco a la interfaz principal. | | Expandida | Cuando contraes el checkout o abandonas la vista expandida. | Contrae el panel o restaura el layout anterior. | En los tres casos, primero procesa cualquier resultado pendiente y luego ejecuta `unmountFlex()` antes de actualizar la presentación visual. No modifiques los estilos internos de Flex. Ejecuta `unmountFlex()` cuando retires el formulario, sin importar si está embebido, dentro de un popup o en una vista expandida. ### Pantalla de resultado propia Cuando configuras `settings.display_result_screen: false`, Flex no presenta su pantalla final. Tu aplicación debe recibir el `response`, evaluar el estado de la transacción y mostrar una pantalla de resultado propia. `paymentForm.init(...)` renderiza Flex dentro del contenedor. Flex ejecuta `responseCallback(response)`. Lee el resultado desde `response.transaction.state` y realiza las validaciones de negocio correspondientes. Guarda el `response` en el estado de tu aplicación y navega o renderiza la pantalla de resultado del comercio. Cuando el resultado ya fue procesado, ejecuta `terminate()`, limpia el contenedor y actualiza la presentación embebida, popup o expandida. ```javascript theme={"system"} const paymentForm = new FlexPaymentForms({ nonce, payload, settings: { display_result_screen: false } }); const flexContainer = document.querySelector("#flex-container"); paymentForm.init( flexContainer, (response) => { const transactionState = response.transaction?.state; // Procesa y conserva la respuesta antes de desmontar Flex. showMerchantResultScreen({ transactionState, response }); unmountFlex(); }, (tracking) => { console.log("Evento de seguimiento", tracking); }, (error) => { console.error("Error de Flex", error); } ); ``` No ejecutes `terminate()` antes de recibir y procesar `responseCallback(response)`. Si finalizas la instancia antes, puedes interrumpir el flujo y perder el resultado que Flex todavía no ha entregado. ### Limpieza reutilizable Encapsula la inicialización y el desmontaje en un controlador independiente del framework. Puedes usarlo desde JavaScript puro o conectarlo al ciclo de vida de React, Vue, Angular u otra tecnología. ```javascript theme={"system"} function createFlexController({ container, configuration, onResult, onTracking, onError }) { let instance = null; function mount() { // Evita conservar una instancia anterior al volver a abrir Flex. destroy(); instance = new FlexPaymentForms(configuration); instance.init(container, onResult, onTracking, onError); } function destroy() { instance?.terminate?.(); instance = null; container.replaceChildren(); } return { mount, destroy }; } const flexController = createFlexController({ container: document.querySelector("#flex-container"), configuration: { nonce, payload, settings: { display_result_screen: false } }, onResult: responseCallback, onTracking: trackingCallback, onError: onErrorCallback }); // Abre o vuelve a crear el formulario. flexController.mount(); // Finaliza la instancia al cerrar, navegar o retirar la presentación. // flexController.destroy(); ``` Ejecuta `destroy()` antes de retirar el contenedor de la página. Conecta `destroy()` al cambio de ruta o al desmontaje de la vista. Ejecútalo al ocultar el bloque embebido, cerrar el popup o contraer la vista expandida. `container.replaceChildren()` vacía el contenido de forma equivalente a `container.innerHTML = ""`, sin depender de un framework específico. `terminate()` no devuelve la respuesta del pago. El resultado siempre llega mediante el primer callback de `paymentForm.init(...)`. Revisa [Capturar funciones callback](/checkout-web/flex/capturar-funciones-callback) para interpretar y confirmar la operación. ### Gestionar el cierre con show\_close\_button Configura `settings.show_close_button: true` para mostrar el botón de cierre nativo de Flex. Esta opción funciona en las presentaciones embebida, popup y expandida. ```javascript theme={"system"} const paymentForm = new FlexPaymentForms({ nonce, payload, settings: { show_close_button: true } }); ``` Cuando el comprador pulsa el botón, Flex envía el mensaje `cerro el carrito` mediante `onErrorCallback`. Aunque utiliza el callback de error, este mensaje representa una acción voluntaria del comprador y no un fallo técnico. Activa `show_close_button` dentro de `settings`. Identifica el mensaje exacto `cerro el carrito` en `onErrorCallback`. Ejecuta `onClose()` para desmontar Flex y actualizar la interfaz. Implementa una rama exclusiva para el cierre voluntario y conserva los demás mensajes como errores técnicos: ```javascript theme={"system"} function getFlexErrorMessage(error) { if (typeof error === "string") return error; return error?.message ?? ""; } function onErrorCallback(error) { const errorMessage = getFlexErrorMessage(error).trim(); if (errorMessage === "cerro el carrito") { onClose(); return; } // Los demás mensajes se procesan como errores técnicos. handleFlexError(error); } function onClose() { unmountFlex(); // Oculta el popup, retira el bloque embebido o contrae la vista expandida. hideFlexPresentation(); } ``` El flujo de cierre es `show_close_button` → `onErrorCallback` → `onClose()` → `unmountFlex()`. `hideFlexPresentation()` representa la lógica visual de tu aplicación: retirar el bloque embebido, ocultar el popup o contraer la vista expandida. Ejecuta `onClose()` solo cuando el mensaje completo sea `cerro el carrito`. Cualquier otro valor recibido en `onErrorCallback` debe continuar por el manejo de errores técnicos. ## Antes de publicar Comprueba el componente en estos escenarios: | Escenario | Resultado esperado | | :- | :- | | Web con viewport amplio | El formulario conserva la escala `1` y queda centrado. | | Celular vertical y horizontal | No aparece scroll horizontal ni contenido cortado. | | Cambio de orientación | La escala se recalcula sin reinicializar Flex. | | Cambio de paso o método | La nueva altura permanece dentro del viewport. | | Teclado virtual abierto | Los campos activos continúan visibles y utilizables. | Los callbacks no reemplazan la confirmación del pago desde backend. Continúa con la guía de callbacks para interpretar el resultado. ## Siguiente paso Define `responseCallback`, `trackingCallback` y `onErrorCallback` para reaccionar correctamente al flujo. Si todavía no armaste el objeto de la operación, vuelve a la guía del `payload`. # Introducción Source: https://docs.pay-me.com/checkout-web/flex/introduccion Integra fácilmente un formulario de pago en tu aplicación web con Pay-me Flex. Pay-me Flex permite integrar un formulario de pago en aplicaciones web usando una sola interfaz para múltiples métodos de pago. El flujo recomendado combina autenticación, generación de `nonce`, construcción del `payload`, inicialización del componente y captura del resultado desde `responseCallback`. Revisa las mejoras recientes de visualización, multidioma, cierre del checkout, Yape UX y número de operación. *** ## Flujo inicial Primero genera el `Access Token` desde el API de Seguridad. Sin ese token no podrás solicitar el `nonce`. Con el `Access Token` vigente solicita el `nonce` que se usará para inicializar Flex. Después de obtener el `nonce`, incluye el CSS y JS del ambiente y continúa con la inicialización del formulario. En Flex, el orden correcto es `Autenticación` → `API Nonce` → inclusión de librería y luego la inicialización del componente. ## Implementación del cobro Arma el `payload` reutilizando la estructura del API de autorización y enviando `payment_method: {}` en el objeto raíz. Crea la instancia de `FlexPaymentForms`, define métodos visibles y monta el formulario en tu DOM. Procesa `responseCallback`, `trackingCallback` y `onErrorCallback` según el método de pago seleccionado. En Flex, el resultado visible para el frontend entra por `responseCallback(response)`, y ese `response` reutiliza el contrato del API de PayIn correspondiente al método de pago usado. ## ¿Por qué Pay-me Flex? Una misma interfaz de captura para todos los métodos de pago disponibles. Elimina la complejidad de administrar flujos de pago independientes. Autenticación 3DS integrada y transmisión segura de datos. ## Métodos de pago disponibles Visa, Mastercard, Amex y Diners con autenticación 3D Secure. Billetera digital con el número de teléfono del cliente. Pago escaneando un código QR desde cualquier app bancaria. Pago directo desde banca en línea. Pago en cuotas sin necesidad de tarjeta de crédito. PagoEfectivo y Powerpay en camino. # Librería y estilos básicos Source: https://docs.pay-me.com/checkout-web/flex/libreria-y-estilos-basicos Incluye la librería de Pay-me Flex en tu aplicación web Para usar Pay-me Flex hay que incluir el siguiente código en el HTML de la página según el ambiente: ```html theme={"system"} ``` ```html theme={"system"} ``` Estilos predeterminados del formulario de pago. Incluir antes del cierre del ``. Librería principal de Pay-me Flex. Incluir después del CSS en el ``. Asegúrate de incluir primero el CSS y luego el JS para garantizar que los estilos se apliquen correctamente antes de que el formulario se inicialice. # Últimas mejoras Source: https://docs.pay-me.com/checkout-web/flex/ultimas-mejoras Mejoras recientes de visualización y experiencia de usuario en Pay-me Flex. Pay-me Flex incorpora mejoras visuales y de experiencia para que el checkout sea más claro, moderno y fácil de usar para el comprador. Estas mejoras aplican sobre la experiencia visual del componente Flex. La disponibilidad final puede depender de la versión de librería usada y de la configuración habilitada para el comercio. Mejoras en la visualización de Pay-me Flex ## Dónde se configuran Estas mejoras se ven según la versión del componente y la configuración enviada al inicializar Flex. Si tu comercio ya tiene Flex activo, revisa esta tabla para saber qué debes añadir o validar en tu integración. | Mejora | Qué debes revisar | Parámetro o guía | | :- | :- | :- | | Logo configurable | El comercio debe compartir la URL pública del logo que desea mostrar en la parte superior izquierda del checkout. | Configuración habilitada por el equipo de integraciones | | Multidioma | Añade la configuración de idiomas si quieres mostrar el selector `ES` / `EN`. | [`i18n.mode`, `i18n.default_language`, `i18n.languages`](/checkout-web/flex/inicializar-el-componente) | | Botón de cerrar | Activa el botón si necesitas que el comprador pueda salir del checkout desde la interfaz. | [`settings.show_close_button`](/checkout-web/flex/inicializar-el-componente) | | Tarjeta más visual | Valida que el método `CARD` esté habilitado y que el payload envíe los datos de comprador requeridos. | [`display_settings.methods`](/checkout-web/flex/inicializar-el-componente) y [Construcción del payload](/checkout-web/flex/construccion-del-payload) | | Bordes y estilos | Define si el contenedor se muestra con borde visual o si tu layout externo ya lo maneja. | [`settings.show_border`](/checkout-web/flex/inicializar-el-componente) | | Yape UX | Asegura que `YAPE` esté disponible para el comercio y, si limitas métodos, inclúyelo en la lista visible. | [`display_settings.methods`](/checkout-web/flex/inicializar-el-componente) y [Datos de prueba](/pagos/datos-de-prueba) | | Número de operación | Activa la visualización del número de operación cuando necesites trazabilidad para soporte. | [`settings.show_operation_number`](/checkout-web/flex/inicializar-el-componente) | Si no envías `display_settings.methods`, Flex mostrará los métodos habilitados para tu comercio por defecto. Si sí envías la lista, debes incluir explícitamente los métodos que quieres mostrar, por ejemplo `CARD` o `YAPE`. El logo configurable no se envía dentro del objeto de inicialización. Para habilitarlo, el comercio debe compartir con el equipo de integraciones una URL pública HTTPS del logo que se mostrará en el checkout. ## Mejoras en la visualización Personalización del logo superior izquierdo del checkout. El comercio debe enviar la URL del logo al equipo de integraciones para configurarlo. Selector de idioma `ES` / `EN` para ofrecer una experiencia más clara según el idioma del usuario. Nuevo botón de cierre visible para salir del checkout de forma rápida, clara y controlada. Mejora en la visualización de tarjeta, mostrando logos de marca, nombre del tarjetahabiente y fecha de vencimiento. Bordes redondeados y estilos visuales consistentes para una experiencia más moderna y limpia. Flujo integrado y mejorado para pagos con Yape, con campos y mensajes más claros para el usuario. Visualización del número de operación para mejorar trazabilidad y soporte durante el pago. ## Detalle por mejora * Permite personalizar el logo que aparece en la parte superior izquierda del checkout. * El comercio debe compartir la URL pública HTTPS del logo que desea mostrar. * La URL debe apuntar directamente al archivo de imagen y estar disponible sin autenticación. * La activación se coordina con el equipo de integraciones; no se configura desde `settings`, `display_settings` ni `i18n`. * Selector de idioma visible dentro del checkout. * Soporte inicial para `ES` y `EN`. * Ayuda a comercios con compradores que prefieren una experiencia bilingüe. * Se configura en [Inicializar el componente](/checkout-web/flex/inicializar-el-componente), dentro del objeto `i18n`. * Botón de cierre más visible en la interfaz. * Permite salir del checkout sin ambigüedad. * Mejora el control del usuario durante el proceso de pago. * Se activa con `settings.show_close_button` en [Inicializar el componente](/checkout-web/flex/inicializar-el-componente). * Tarjeta renderizada de forma más visual. * Logos de marca visibles cuando corresponda. * Campos principales organizados para facilitar la lectura. * Revisa `CARD` en `display_settings.methods` y los datos enviados en [Construcción del payload](/checkout-web/flex/construccion-del-payload). * Bordes redondeados en contenedores y campos. * Separación visual más clara entre métodos de pago y formulario. * Apariencia más limpia y consistente entre flujos. * Se controla con `settings.show_border` en [Inicializar el componente](/checkout-web/flex/inicializar-el-componente). * Pantalla de Yape más directa. * Campo de celular y código de aprobación mejor diferenciados. * Mensajes de ayuda orientados a reducir errores del comprador. * Revisa que `YAPE` esté habilitado en `display_settings.methods` y usa [Datos de prueba](/pagos/datos-de-prueba) para validar el flujo. * El checkout muestra el número de operación asociado al pago. * Facilita trazabilidad para soporte, conciliación y revisión operativa. * Ayuda al comercio y al comprador a identificar el intento de pago. * Se activa con `settings.show_operation_number` en [Inicializar el componente](/checkout-web/flex/inicializar-el-componente). ## Recomendación Si ya tienes una integración Flex activa, revisa estas mejoras en Pre-Producción antes de habilitarlas en Producción. Valida especialmente logo configurable, idioma, cierre del checkout, Yape y visualización de tarjeta en los navegadores soportados por tu comercio. ## Guías relacionadas Configura `settings`, `display_settings.methods` e `i18n` para activar o limitar estas mejoras. Revisa los datos de operación y comprador que Flex usa para renderizar el flujo correctamente. Procesa respuestas, eventos y errores durante el flujo de pago. Valida tarjeta, Yape y otros métodos en Pre-Producción antes de habilitar Producción. # Introducción Source: https://docs.pay-me.com/checkout-web/introduccion Guía de integración de Pay-me Checkout Intégrate a los Formularios y APIs del V-POS Flex, los cuales te permitirán realizar los procesos de Tokenización y/o Autorización. Revisa las validaciones recomendadas para Flex antes de certificar tu integración. Revisa recomendaciones de seguridad, backend y confirmación final para tu integración. # Requisitos de negocio Source: https://docs.pay-me.com/checkout-web/requisitos-de-negocio Requisitos para iniciar en Pay-me Requisitos para iniciar en Pay-me: * Contar con Razón Social en Perú (Ficha RUC 20 o 10) * Tener una página web y/o estar desarrollándolo. Si no tiene página web, por lo menos redes sociales activas. * La web debe tener certificación SSL. * Tener una cuenta bancaria a nombre de la Razón Social. * Contar con mínimo una persona encargada de la integración (programador/desarrollador). # API de Devoluciones Source: https://docs.pay-me.com/devoluciones/api-de-devoluciones Envía solicitudes de devolución total o parcial sobre transacciones liquidadas. El **API de Devoluciones** permite enviar una o más transacciones en estado `LIQUIDADO` a devolver. Solo está disponible para los métodos `CARD`, `YAPE` y `CUOTEALO`. [https://api.preprod.alignet.io/refund](https://api.preprod.alignet.io/refund) [https://api.alignet.io/refund](https://api.alignet.io/refund) La devolución se procesa después del estado `AUTORIZADO`, cuando la transacción ya se encuentra en `LIQUIDADO`. Si la operación aún no fue liquidada, el mecanismo correcto es el extorno, no la devolución. *** ## Request ### Headers | Campo | Descripción | Valor | Tipo | Obligatorio | | :- | :- | :- | :- | :- | | `Authorization` | Token de identificación para uso del API creado previamente en API de Seguridad | `Bearer ` | String | SI | | `ALG-API-VERSION` | Versión del API a usar | `1709847567` | String | SI | | `payment-facilitator-code` | Identificador del PF, obligatorio para Payment Facilitator | Cadena alfanumérica | String | NO | ### Body | Campo | Descripción | Ejemplo | Tipo | Obligatorio | | :- | :- | :- | :- | :- | | `merchant_code` | Identificador del comercio | `41bb301e-3c37-4332-accb-ed5ec19081e4` | String | SI | | `operations` | Array que contiene objetos de transacciones a devolver | Array | Array | SI | | `operations[].type` | Tipo de devolución | `TOTAL`, `PARTIAL` | String | SI | | `operations[].merchant_operation_number` | Número de pedido de la operación | `239766` | String | SI | | `operations[].transaction_id` | Código alfanumérico de la transacción | `bko66gpi8czns4tcde93q96vd` | String | NO | | `operations[].refund_amount` | Monto a devolver en centavos | `1050` | String | SI | | `operations[].additional_fields` | Diccionario para enviar campos y valores personalizados como `key:value` | `external_id:21871054` | Dictionary | NO | Para S/. 10.50 debes enviar `1050`. La separación de decimales se aplica según la moneda. ### Ejemplo (JSON) ```json theme={"system"} { "merchant_code": "41bb301e-3c37-4332-accb-ed5ec19081e4", "operations": [ { "type": "TOTAL", "merchant_operation_number": "239766", "transaction_id": null, "refund_amount": "1050", "additional_fields": { "canal": "WEB", "reason": "cliente no reconoció el consumo", "description": "solicitud por desconocimiento" } } ] } ``` *** ## Siguiente paso Consulta una solicitud puntual usando `merchant_code` y `merchant_operation_number`. Lista devoluciones por rango de fechas y filtros operativos. *** ## Response | Campo | Descripción | Ejemplo | Tipo | Obligatorio | | :- | :- | :- | :- | :- | | `success` | Indica si el proceso se realizó correctamente | `true`, `false` | String | SI | | `action` | Acción ejecutada | `refund` | String | SI | | `merchant_code` | Identificador del comercio | `41bb301e-3c37-4332-accb-ed5ec19081e4` | String | SI | | `operations` | Array que contiene objetos de transacciones a devolver | Array | Array | SI | | `operations[].refund_id` | UUID único de la devolución | UUID | String | SI | | `operations[].state` | Estado de la solicitud | `REGISTERED`, `REJECTED` | String | SI | | `operations[].refund_reason` | Motivo o detalle asociado al estado | `Solicitud recibida y validada` | String | SI | | `operations[].type` | Tipo de devolución | `TOTAL`, `PARTIAL` | String | SI | | `operations[].merchant_operation_number` | Número de pedido de la operación | `239766` | String | SI | | `operations[].transaction_id` | Código alfanumérico de la transacción | `bko66gpi8czns4tcde93q96vd` | String | SI | | `operations[].refund_amount` | Monto a devolver en centavos | `1050` | String | SI | | `operations[].transaction_amount` | Monto original de la transacción en centavos | `1050` | String | SI | | `operations[].currency` | Código ISO 4217 de la moneda de la transacción | `604` | String | SI | | `operations[].additional_fields` | Diccionario con campos personalizados enviados en el request | Dictionary | Dictionary | NO | | `operations[].payment_method` | Objeto relacionado al medio y procesador de pago | Object | Object | SI | | `operations[].payment_method.name` | Nombre del método de pago | `CARD`, `YAPE`, `CUOTEALO` | String | SI | | `operations[].payment_method.brand` | Marca de la tarjeta | `VISA`, `MSCD`, `AMEX`, `DINC` | String | SI | | `operations[].payment_method.masked_pan` | Tarjeta enmascarada | `447411******2240` | String | SI | | `operations[].lifecycle` | Array con el listado de estados por los que pasó la devolución | Array | Array | SI | | `operations[].lifecycle[].state` | Estado de la devolución | `REGISTERED`, `REJECTED` | String | SI | | `operations[].lifecycle[].date` | Objeto con la fecha del cambio de estado | Object | Object | SI | | `operations[].lifecycle[].date.utc_time` | Fecha en UTC | `2025-05-26T06:06:45` | String | SI | | `operations[].lifecycle[].date.unix_time` | Fecha en unix time | `1748239605` | Integer | SI | | `meta.status` | Objeto que contiene el resultado del flujo ejecutado | Object | Object | SI | | `meta.status.code` | Código que representa el resultado del flujo ejecutado | `00` | String | SI | | `meta.status.message_ilgn` | Objeto que contiene el mensaje resultante del flujo | Object | Object | SI | | `meta.status.message_ilgn[].locale` | Localidad a nivel de lenguaje para el mensaje del flujo ejecutado | `es_PE` | String | SI | | `meta.status.message_ilgn[].value` | Mensaje resultante del flujo ejecutado | `Se procesó correctamente la petición` | String | SI | ### Ejemplo (JSON) ```json theme={"system"} { "success": "true", "action": "refund", "merchant_code": "41bb301e-3c37-4332-accb-ed5ec19081e4", "operations": [ { "refund_id": "922178aa-ce4c-4c5f-8190-82fa7e009425", "state": "REGISTERED", "refund_reason": "Solicitud recibida y validada", "type": "TOTAL", "merchant_operation_number": "239766", "transaction_id": "bko66gpi8czns4tcde93q96vd", "refund_amount": "1050", "transaction_amount": "1050", "currency": "604", "payment_method": { "name": "CARD", "brand": "VISA", "masked_pan": "447411******2240" }, "additional_fields": { "canal": "WEB", "reason": "cliente no reconoció el consumo", "description": "solicitud por desconocimiento" }, "lifecycle": [ { "state": "REGISTERED", "date": { "utc_time": "2025-05-26T06:06:45", "unix_time": 1748239605 } } ] } ], "meta": { "status": { "code": "00", "message_ilgn": [ { "locale": "es_PE", "value": "Se procesó correctamente la petición" } ] } } } ``` # Códigos de Respuesta - Devoluciones Source: https://docs.pay-me.com/devoluciones/codigos-de-respuesta Códigos válidos del objeto meta para las APIs del módulo de Devoluciones. Los códigos de respuesta válidos en el objeto `meta` para todos los APIs de **Devolución** son los siguientes: | Código | Descripción | | :- | :- | | `00` | Se procesó correctamente la petición | | `01` | Algunas operaciones fueron rechazadas | | `03` | Ocurrió un error | | `05` | No se encontró el pedido | | `06` | Algunos datos no fueron enviados correctamente | *** ## Cómo interpretarlos Usa `00` cuando la petición fue procesada correctamente a nivel del flujo. Usa `01` cuando el request fue aceptado, pero una o más operaciones fueron rechazadas dentro del lote. Usa `05` y `06` para errores de negocio o datos incompletos que deben corregirse antes de reintentar. Usa `03` para fallas no controladas o errores de procesamiento del flujo. *** ## Consejos de integración Aunque `meta.status.code` resume el resultado del request, también debes revisar `operations[].state` y `operations[].refund_reason` para conocer el resultado real de cada devolución. Que una devolución quede en `REGISTERED` no significa que ya terminó. Usa las APIs de consulta para seguir su avance hasta `RESOLVED` o `REJECTED`. Cuando recibas `01`, procesa el detalle por operación. No asumas que todo el batch falló ni que todo el batch fue aceptado. Guarda `refund_id`, `merchant_operation_number` y `transaction_id` para conciliación, soporte y reprocesos. Antes de solicitar una devolución, confirma que la transacción original esté en `LIQUIDADO` y que el monto cumpla con tus reglas internas para devoluciones totales o parciales. *** ## Recomendación operativa Para integraciones backend, lo más seguro es tratar `POST /refund` como una solicitud inicial y luego confirmar el estado definitivo con la consulta unitaria o masiva cuando tu flujo necesite conciliación o seguimiento. # API de Consulta Masiva de Devolución Source: https://docs.pay-me.com/devoluciones/consulta-masiva Consulta una o más solicitudes de devolución mediante filtros. El **API de Consulta Masiva de Devolución** permite consultar mediante filtros una o más solicitudes de devolución generadas anteriormente por el **API de Devoluciones**. [https://api.preprod.alignet.io/refund](https://api.preprod.alignet.io/refund) [https://api.alignet.io/refund](https://api.alignet.io/refund) Esta consulta trabaja por filtros. `date_start` y `date_end` son obligatorios, mientras que el resto de parámetros ayudan a acotar la búsqueda para conciliación y seguimiento operativo. *** ## Request ### Query Params | Campo | Descripción | Ejemplo | Tipo | Obligatorio | | :- | :- | :- | :- | :- | | `date_start` | Fecha de cuando se realizó el refund | `2025-05-26` | String | SI | | `date_end` | Fecha final de cuando se realizó el refund | `2025-05-26` | String | SI | | `merchant_code` | Código único del comercio | `41bb301e-3c37-4332-accb-ed5ec19081e4` | String | NO | | `merchant_operation_number` | Número de operación de un pedido | `239766` | String | NO | | `transaction_id` | UUID único de una transacción | `bko66gpi8czns4tcde93q96vd` | String | NO | | `refund_state` | Estado del refund | `REGISTERED`, `IN_PROCESS`, `RESOLVED`, `REJECTED` | String | NO | ### Headers | Campo | Descripción | Valor | Tipo | Obligatorio | | :- | :- | :- | :- | :- | | `Authorization` | Token de identificación para uso del API creado previamente en API de Seguridad | `Bearer ` | String | SI | | `ALG-API-VERSION` | Versión del API a usar | `1709847567` | String | SI | | `payment-facilitator-code` | Identificador del PF, obligatorio para Payment Facilitator | Cadena alfanumérica | String | NO | *** ## Response | Campo | Descripción | Ejemplo | Tipo | Obligatorio | | :- | :- | :- | :- | :- | | `success` | Indica si el proceso se realizó correctamente | `true`, `false` | String | SI | | `merchant_code` | Identificador del comercio | `41bb301e-3c37-4332-accb-ed5ec19081e4` | String | SI | | `operations_count` | Cantidad de operaciones encontradas | `1` | String | SI | | `operations` | Array que contiene objetos de transacciones a devolver | Array | Array | SI | | `operations[].refund_id` | UUID único de la devolución | UUID | String | SI | | `operations[].state` | Estado de la solicitud | `REGISTERED`, `IN_PROCESS`, `RESOLVED`, `REJECTED` | String | SI | | `operations[].refund_reason` | Motivo o detalle asociado al estado | `Solicitud recibida y validada` | String | SI | | `operations[].merchant_operation_number` | Número de pedido de la operación | `239766` | String | SI | | `operations[].type` | Tipo de devolución | `TOTAL`, `PARTIAL` | String | SI | | `operations[].transaction_id` | Código alfanumérico de la transacción | `bko66gpi8czns4tcde93q96vd` | String | SI | | `operations[].refund_amount` | Monto a devolver en centavos | `1050` | String | SI | | `operations[].transaction_amount` | Monto original de la transacción en centavos | `1050` | String | SI | | `operations[].currency` | Código ISO 4217 de la moneda de la transacción | `604` | String | SI | | `operations[].additional_fields` | Diccionario para enviar campos y valores personalizados como `key:value` | Dictionary | Dictionary | NO | | `operations[].payment_method` | Objeto relacionado al medio y procesador de pago | Object | Object | SI | | `operations[].payment_method.name` | Nombre del método de pago | `CARD`, `YAPE`, `CUOTEALO` | String | SI | | `operations[].payment_method.brand` | Marca de la tarjeta | `VISA`, `MSCD`, `AMEX`, `DINC` | String | SI | | `operations[].payment_method.masked_pan` | Tarjeta enmascarada | `447411******2240` | String | SI | | `operations[].lifecycle` | Array que contiene listado de los estados por los que pasó la devolución | Array | Array | SI | | `operations[].lifecycle[].state` | Estado de la devolución | `REGISTERED`, `IN_PROCESS`, `RESOLVED`, `REJECTED` | String | SI | | `operations[].lifecycle[].date` | Objeto que contiene la fecha en la que se realizó el cambio de estado | Object | Object | SI | | `operations[].lifecycle[].date.utc_time` | Fecha en UTC | `2025-05-26T06:06:45` | String | SI | | `operations[].lifecycle[].date.unix_time` | Fecha en unix time | `1748239605` | Integer | SI | | `meta` | Objeto que contiene metadatos del flujo ejecutado | Object | Object | SI | | `meta.status` | Objeto que contiene el resultado del flujo ejecutado | Object | Object | SI | | `meta.status.code` | Código que representa el resultado del flujo ejecutado | `00` | String | SI | | `meta.status.message_ilgn` | Objeto que contiene el mensaje resultante del flujo | Object | Object | SI | | `meta.status.message_ilgn[].locale` | Localidad a nivel de lenguaje para el mensaje del flujo ejecutado | `es_PE` | String | SI | | `meta.status.message_ilgn[].value` | Mensaje resultante del flujo ejecutado | `Se procesó correctamente la petición` | String | SI | ### Ejemplo (JSON) ```json theme={"system"} { "success": "true", "merchant_code": "41bb301e-3c37-4332-accb-ed5ec19081e4", "operations_count": "1", "operations": [ { "refund_id": "922178aa-ce4c-4c5f-8190-82fa7e009425", "state": "REGISTERED", "refund_reason": "Solicitud recibida y validada", "type": "TOTAL", "merchant_operation_number": "239766", "transaction_id": "bko66gpi8czns4tcde93q96vd", "refund_amount": "1050", "transaction_amount": "1050", "currency": "604", "payment_method": { "name": "CARD", "brand": "VISA", "masked_pan": "447411******2240" }, "additional_fields": { "canal": "WEB", "reason": "cliente no reconoció el consumo", "description": "solicitud por desconocimiento" }, "lifecycle": [ { "state": "REGISTERED", "date": { "utc_time": "2025-05-26T06:06:45", "unix_time": 1748239605 } } ] } ], "meta": { "status": { "code": "00", "message_ilgn": [ { "locale": "es_PE", "value": "Se procesó correctamente la petición" } ] } } } ``` *** ## Siguiente paso Usa la consulta unitaria cuando ya conozcas el `merchant_operation_number` exacto. Revisa cómo interpretar `meta.status.code` para todas las APIs del módulo. # API de Consulta Unitaria de Devolución Source: https://docs.pay-me.com/devoluciones/consulta-unitaria Consulta una devolución generada previamente por el API de Devoluciones. El **API de Consulta Unitaria de Devolución** permite consultar una devolución generada anteriormente por el **API de Devoluciones**. [https://api.preprod.alignet.io/refund/\{merchant\_code}/\{merchant\_operation\_number}](https://api.preprod.alignet.io/refund/\{merchant_code}/\{merchant_operation_number}) [https://api.alignet.io/refund/\{merchant\_code}/\{merchant\_operation\_number}](https://api.alignet.io/refund/\{merchant_code}/\{merchant_operation_number}) Esta consulta devuelve el detalle de las devoluciones asociadas a una operación del comercio. El resultado incluye `operations_count`, el listado encontrado y el `lifecycle` de cada devolución. *** ## Request ### Path | Campo | Descripción | Tipo | | :- | :- | :- | | `merchant_code` | Identificador del comercio | String | | `merchant_operation_number` | Número de operación | String | ### Headers | Campo | Descripción | Valor | Tipo | Obligatorio | | :- | :- | :- | :- | :- | | `Authorization` | Token de identificación para uso del API creado previamente en API de Seguridad | `Bearer ` | String | SI | | `ALG-API-VERSION` | Versión del API a usar | `1709847567` | String | SI | | `payment-facilitator-code` | Identificador del PF, obligatorio para Payment Facilitator | Cadena alfanumérica | String | NO | *** ## Response | Campo | Descripción | Ejemplo | Tipo | Obligatorio | | :- | :- | :- | :- | :- | | `success` | Indica si el proceso se realizó correctamente | `true`, `false` | String | SI | | `merchant_code` | Identificador del comercio | `41bb301e-3c37-4332-accb-ed5ec19081e4` | String | SI | | `operations_count` | Cantidad de operaciones encontradas | `1` | String | SI | | `operations` | Array que contiene objetos de transacciones a devolver | Array | Array | SI | | `operations[].refund_id` | UUID único de la devolución | UUID | String | SI | | `operations[].state` | Estado de la solicitud | `REGISTERED`, `IN_PROCESS`, `RESOLVED`, `REJECTED` | String | SI | | `operations[].refund_reason` | Motivo o detalle asociado al estado | `Solicitud recibida y validada` | String | SI | | `operations[].merchant_operation_number` | Número de pedido de la operación | `239766` | String | SI | | `operations[].type` | Tipo de devolución | `TOTAL`, `PARTIAL` | String | SI | | `operations[].transaction_id` | Código alfanumérico de la transacción | `bko66gpi8czns4tcde93q96vd` | String | SI | | `operations[].refund_amount` | Monto a devolver en centavos | `1050` | String | SI | | `operations[].transaction_amount` | Monto original de la transacción en centavos | `1050` | String | SI | | `operations[].currency` | Código ISO 4217 de la moneda de la transacción | `604` | String | SI | | `operations[].additional_fields` | Diccionario para enviar campos y valores personalizados como `key:value` | Dictionary | Dictionary | NO | | `operations[].payment_method` | Objeto relacionado al medio y procesador de pago | Object | Object | SI | | `operations[].payment_method.name` | Nombre del método de pago | `CARD`, `YAPE`, `CUOTEALO` | String | SI | | `operations[].payment_method.brand` | Marca de la tarjeta | `VISA`, `MSCD`, `AMEX`, `DINC` | String | SI | | `operations[].payment_method.masked_pan` | Tarjeta enmascarada | `447411******2240` | String | SI | | `operations[].lifecycle` | Array que contiene listado de los estados por los que pasó la devolución | Array | Array | SI | | `operations[].lifecycle[].state` | Estado de la devolución | `REGISTERED`, `IN_PROCESS`, `RESOLVED`, `REJECTED` | String | SI | | `operations[].lifecycle[].date` | Objeto que contiene la fecha en la que se realizó el cambio de estado | Object | Object | SI | | `operations[].lifecycle[].date.utc_time` | Fecha en UTC | `2025-05-26T06:06:45` | String | SI | | `operations[].lifecycle[].date.unix_time` | Fecha en unix time | `1748239605` | Integer | SI | | `meta` | Objeto que contiene metadatos del flujo ejecutado | Object | Object | SI | | `meta.status` | Objeto que contiene el resultado del flujo ejecutado | Object | Object | SI | | `meta.status.code` | Código que representa el resultado del flujo ejecutado | `00` | String | SI | | `meta.status.message_ilgn` | Objeto que contiene el mensaje resultante del flujo | Object | Object | SI | | `meta.status.message_ilgn[].locale` | Localidad a nivel de lenguaje para el mensaje del flujo ejecutado | `es_PE` | String | SI | | `meta.status.message_ilgn[].value` | Mensaje resultante del flujo ejecutado | `Se procesó correctamente la petición` | String | SI | ### Ejemplo (JSON) ```json theme={"system"} { "success": "true", "merchant_code": "41bb301e-3c37-4332-accb-ed5ec19081e4", "operations_count": "1", "operations": [ { "refund_id": "922178aa-ce4c-4c5f-8190-82fa7e009425", "state": "REGISTERED", "refund_reason": "Solicitud recibida y validada", "type": "TOTAL", "merchant_operation_number": "239766", "transaction_id": "bko66gpi8czns4tcde93q96vd", "refund_amount": "1050", "transaction_amount": "1050", "currency": "604", "payment_method": { "name": "CARD", "brand": "VISA", "masked_pan": "447411******2240" }, "additional_fields": { "canal": "WEB", "reason": "cliente no reconoció el consumo", "description": "solicitud por desconocimiento" }, "lifecycle": [ { "state": "REGISTERED", "date": { "utc_time": "2025-05-26T06:06:45", "unix_time": 1748239605 } } ] } ], "meta": { "status": { "code": "00", "message_ilgn": [ { "locale": "es_PE", "value": "Se procesó correctamente la petición" } ] } } } ``` *** ## Siguiente paso Usa el `POST /refund` para registrar nuevas solicitudes de devolución. Vuelve al overview del módulo para revisar el resto de APIs del flujo. # Devoluciones Source: https://docs.pay-me.com/devoluciones/introduccion Panorama general del módulo de Devoluciones y de las APIs disponibles para transacciones liquidadas. Pay-me ofrece a los comercios la funcionalidad de **Devoluciones**, permitiendo automatizar la gestión de devoluciones por medio de APIs especializadas. Las capacidades contempladas en este módulo son: * `API de Devoluciones` * `API de Consulta Unitaria de Devolución` * `API de Consulta Masiva de Devolución` * `Códigos de Respuesta - Devoluciones` *** ## Momento del ciclo Se aplica sobre transacciones `AUTORIZADO`, antes de la liquidación. Se aplica después de la autorización, únicamente sobre transacciones en estado `LIQUIDADO`. La devolución no reemplaza al extorno. Operativamente corresponde a una etapa posterior del ciclo de vida del pago. *** ## APIs del módulo Permite registrar una o más solicitudes de devolución total o parcial para transacciones liquidadas. Permite revisar el detalle y lifecycle de una solicitud específica de devolución. Permite consultar múltiples solicitudes de devolución para control operativo y conciliación. Resume los códigos funcionales y mensajes que debes interpretar en las respuestas del módulo. *** ## Métodos de pago soportados Tarjetas de crédito y débito liquidadas. Operaciones liquidadas procesadas con Yape. Operaciones liquidadas procesadas con Cuotéalo. *** ## Reglas base La devolución solo se efectúa sobre transacciones en estado `LIQUIDADO`. Puedes enviar una o más operaciones en un mismo request. El tipo de devolución soportado es `TOTAL` o `PARTIAL`. Conserva `merchant_operation_number` y `transaction_id` para trazabilidad y conciliación. *** ## Consejos de integración Toma `REGISTERED` como recepción de la solicitud. Usa las APIs de consulta para confirmar si la devolución avanza a `RESOLVED` o termina en `REJECTED`. Si integras devoluciones parciales o varias operaciones en un mismo request, revisa cada resultado individual y no solo el código global del `meta`. Verifica que la transacción origen esté en `LIQUIDADO`, que el método sea soportado y que el monto a devolver cumpla tus reglas internas. Conserva `refund_id`, `merchant_operation_number` y `transaction_id` para conciliación, auditoría y soporte. *** ## Siguiente paso Revisa el endpoint `POST /refund`, la estructura del request, la respuesta y el ejemplo base del flujo. # Buenas prácticas Source: https://docs.pay-me.com/e-commerce/buenas-practicas Recomendaciones para operar plugins y módulos e-commerce de Pay-me de forma segura y consistente. Aplica estas recomendaciones cuando integres Pay-me mediante **WooCommerce**, **PrestaShop** o **VTEX**. ## Seguridad y credenciales * Usa credenciales sandbox solo para pruebas. * No mezcles credenciales de Pre-Producción y Producción. * Restringe el acceso administrativo al panel donde se configuran llaves. * Mantén actualizado el CMS, plugin, módulo y dependencias. * Usa usuarios administrativos individuales, no cuentas compartidas. * Revisa logs sin exponer datos sensibles del comprador. ## Operación del pedido El estado del pedido debe reflejar el estado real del pago, no solo la pantalla que vio el cliente. Para QR, transferencia, Cuotéalo o PagoEfectivo, espera confirmación final antes de liberar el pedido. Conserva número de operación, estado y fecha para trazabilidad con el equipo de integraciones. Valida aprobados, rechazados y pendientes en sandbox antes de pasar a producción. ## Antes de salir a vivo * Revisa que el plugin o módulo esté en modo productivo solo cuando corresponda. * Confirma que los métodos habilitados coincidan con lo afiliado para el comercio. * Valida correos, páginas de retorno, mensajes al comprador y estados del pedido. * Prepara evidencia mínima de pruebas para revisión final. Revisa el checklist específico para integraciones e-commerce. # Checklist de integración Source: https://docs.pay-me.com/e-commerce/checklist-de-integracion Validaciones recomendadas para completar una integración E-commerce con WooCommerce, PrestaShop o VTEX. Usa este checklist como una guía rápida antes de pedir validación final al equipo de integraciones. Esta guía aplica para implementaciones CMS con **WooCommerce**, **PrestaShop** y **VTEX**. ## Panorama general Credenciales, accesos administrativos y métodos de pago correctamente habilitados. Plugin o módulo instalado, llaves configuradas y ambiente sandbox activo. Compra aprobada, rechazada y flujo post-pago revisados de extremo a extremo. Flujo validado con el equipo y listo para pasar a credenciales productivas. ## Ruta sugerida Confirma que ya recibiste credenciales, accesos al backoffice y afiliación de métodos de pago. Instala el plugin o módulo correcto y carga las credenciales del ambiente de pruebas. Valida escenarios aprobados, rechazados y asíncronos según los medios habilitados. Verifica estados del pedido, logs, notificaciones y consistencia entre tienda y pasarela. Una vez completadas las pruebas, coordina la revisión final con el equipo de integraciones. ## Checklist base * Credenciales recibidas para el ambiente que usarás. * Comercio configurado con los métodos de pago habilitados. * Acceso administrativo a tu plataforma CMS. * Plugin o módulo correcto disponible para instalar. * Llaves y credenciales ingresadas sin errores. * URLs de retorno y páginas de confirmación revisadas. * Moneda, país y medios de pago configurados correctamente. * Modo sandbox activo antes de validar compras. * Compra aprobada validada de extremo a extremo. * Compra rechazada validada con mensaje visible para el cliente. * Métodos asíncronos probados si están habilitados. * Confirmación de pedido alineada con el estado real del pago. * Estados del pedido revisados desde el panel administrativo. * Logs o registros del plugin disponibles para soporte. * Reversas, extornos o devoluciones revisados si aplican. * Correos, mensajes o páginas post-pago revisados. * Sandbox validado antes de usar credenciales productivas. * Flujo productivo controlado revisado con el equipo. * Medios de pago habilitados coinciden con lo afiliado. * Integración lista para salida a vivo. ## Puntos por plataforma Verifica instalación, activación del plugin y configuración correcta de llaves. Revisa que el checkout muestre medios válidos y que el pedido cambie de estado correctamente. * Validar compra aprobada con redirección o confirmación final correcta. * Validar compra rechazada con mensaje claro para el cliente. * Confirmar logs del plugin disponibles para soporte. * Revisar comportamiento de métodos asíncronos si están activos. Confirma que el módulo esté activo y disponible en el checkout correcto. Revisa que el pedido refleje el estado del pago luego de la respuesta o notificación. * Validar instalación y configuración del módulo desde Back Office. * Confirmar experiencia del cliente en pago aprobado, pendiente y rechazado. * Revisar actualización automática de estados y registros del módulo. * Probar extorno o validación operativa si el flujo lo contempla. Revisa credenciales, condiciones de pago y configuración del conector por ambiente. Verifica que el checkout de VTEX complete el pago y refleje correctamente el resultado. * Validar configuración de métodos de pago y condiciones en VTEX. * Revisar compra aprobada y comportamiento de reintentos o rechazos. * Confirmar consistencia entre orden, pago y respuesta de la pasarela. * Completar pruebas funcionales antes de homologación final. ## Criterio mínimo de aprobación Al menos un flujo aprobado y uno rechazado revisados correctamente. Estados del pedido, mensajes y registros alineados entre tienda y pasarela. El comercio puede pasar a revisión final y programación de salida a producción. ## Guías relacionadas Revisa el flujo completo para WordPress. Revisa el flujo completo para PrestaShop. Revisa el flujo completo para VTEX. # E-commerce Source: https://docs.pay-me.com/e-commerce/introduccion Conoce las opciones de integración CMS disponibles para comercios e-commerce. La integración **E-commerce** está pensada para comercios que operan con plataformas CMS y necesitan salir rápido a producción con una implementación guiada. Aquí encontrarás las rutas disponibles para las plataformas actualmente soportadas por Pay-me: Plugin para WordPress con configuración administrativa y flujo guiado. Integración modular para activar pagos dentro de tu checkout existente. Flujo orientado a ecommerce empresarial con configuración por ambiente. *** ## ¿Cuándo elegir esta ruta? * Cuando tu tienda ya opera sobre un CMS soportado. * Cuando buscas una activación más rápida y con menor esfuerzo técnico. * Cuando prefieres usar un plugin o configuración guiada antes que una integración por API. ## Siguiente paso Si ya elegiste tu plataforma, continúa con su guía específica desde las tarjetas superiores. Revisa las validaciones mínimas recomendadas antes de pasar a pruebas finales o producción. Revisa recomendaciones para operar plugins y módulos e-commerce de forma segura. # Introducción Source: https://docs.pay-me.com/index Una integración. Más formas de pagar. Conoce Pay-me y encuentra el camino para integrar tu negocio.

PAY-ME · PAGOS VIRTUALES

Una integración.
Más formas
de pagar.

Conecta tu negocio con una infraestructura de pagos diseñada para acompañar tu crecimiento.

Tecnología de Alignet. Conexión directa.

Marcas prioritarias
Métodos de pago
BilleteraTransferenciaCompra ahora, paga despuésCódigo YapeG Pay
Diseñado para conectarAdquirencia directa3-D SecureTokenización

01 / TU PUNTO DE PARTIDA

Tu negocio. Tu forma de integrar.

Elige el camino que mejor se adapte
a tu canal y a tu equipo.

\ ¿Buscas la referencia técnica? Explora API Docs→

CÓMO SE CONECTA TODO

Distintos canales.
Un punto de conexión.

Tu tienda, sitio web o app se conecta a Pay-me para ofrecer los métodos de pago habilitados para tu comercio.

Elige tu integración →
UN SOLO PUNTO DE CONEXIÓN↗
Tienda onlineWebApp
↗Pay-meInfraestructura de pagos
▤Tarjetas◫Billeteras⇄Transferencias▥Efectivo
Una experiencia conectada, de principio a fin

02 / LA BASE DE CADA PAGO

La confianza también
se integra.

Alignet es adquirente directo y proveedor oficial de tecnología 3-D Secure. Pay-me conecta tu operación con esta infraestructura de pagos.

Conoce las buenas prácticas →
01

Conexión directa

Procesa tus pagos con menos intermediarios técnicos.

02

Seguridad en cada transacción

Autenticación 3-D Secure y tokenización para proteger la experiencia de pago.

03

Visibilidad de tu operación

Consulta transacciones, gestiona devoluciones y concilia tus pagos.

03 / DE LA GUÍA A PRODUCCIÓN

El siguiente paso está aquí.

# Onboarding de Comercios Source: https://docs.pay-me.com/onboarding/introduccion Registra comercios de forma individual o masiva en Pay-me — exclusivo para Facilitadores de Pago. El módulo de Onboarding de Comercios permite a los **Facilitadores de Pago (PF)** registrar nuevos comercios en la plataforma de Pay-me, habilitando sus métodos de pago y generando sus credenciales de acceso. Este módulo es de uso **exclusivo para Facilitadores de Pago**. Si eres un comercio directo, este módulo no aplica para tu integración. *** ## Modalidades de registro Registra un comercio en tiempo real mediante una solicitud `POST`. Ideal para integraciones backend donde el alta debe ser inmediata. Registra múltiples comercios cargando un archivo Excel a S3. Ideal para altas en volumen donde la inmediatez no es crítica. *** ## ¿Cuál modalidad usar? | Criterio | Individual | Masivo | | :- | :- | :- | | Volumen de registros | Uno a la vez | Cientos por archivo | | Tipo de respuesta | Síncrona — inmediata | Asíncrona — archivo de resultados | | Canal de envío | API REST `POST` | Archivo Excel → S3 | | Caso de uso típico | Alta en tiempo real | Migración o carga inicial | *** ## Requisitos previos Contar con un Access Token vigente del [API de Autenticación](/api-de-pagos/autenticacion). Tener configurado tu `payment-facilitator-code` — el UUID de tu organización como Facilitador de Pago. Para registro masivo: tener acceso al bucket S3 asignado a tu organización. *** ## Credenciales generadas Las credenciales `client_id` y `client_secret` de cada comercio se generan **una sola vez** — en la respuesta del `POST` para el registro individual, o en el archivo de salida para el registro masivo. Almacénalas de forma segura de inmediato — no pueden recuperarse posteriormente. En operaciones `UPDATE`, las credenciales no se regeneran — se conservan las creadas en el `INSERT` original. *** ## Siguiente paso Registra un comercio en tiempo real mediante el API REST. # Registro Individual Source: https://docs.pay-me.com/onboarding/registro-individual Registra un comercio en tiempo real mediante el API REST de Pay-me — exclusivo para Facilitadores de Pago. El registro individual permite dar de alta un comercio de forma inmediata mediante una solicitud `POST`. El sistema valida los datos, habilita los métodos de pago configurados y retorna las credenciales del comercio en la misma respuesta. *** ## Endpoint | Ambiente | URL | Método | | :- | :- | :- | | Desarrollo | `https://gz9zkw23la.execute-api.us-east-1.amazonaws.com/dev/onboarding/merchant` | `POST` | | Producción | Por definir | `POST` | *** ## Headers requeridos | Campo | Valor | Obligatorio | | :- | :- | :- | | `Content-Type` | `application/json` | SI | | `Authorization` | `Bearer ` | SI | | `payment-facilitator-code` | UUID del Facilitador de Pago | SI | *** ## Operaciones soportadas Registra un nuevo comercio. Retorna `client_id` y `client_secret` en la respuesta. Actualiza datos de un comercio existente usando su `merchant_code`. No regenera credenciales ni permite modificar datos fiscales. *** ## Datos requeridos Nombre, MCC, razón social y datos fiscales (RUC, tipo de documento, país). País, ciudad, estado, código postal y dirección legal del comercio. Representante legal y contacto operativo — nombre, documento, cargo, email y teléfono. Canal, código del método, monedas permitidas y marcas habilitadas (VISA, MSCD, etc.). *** ## Consideraciones Si algún método de pago falla durante el registro, el comercio se crea igualmente. Los métodos fallidos se reportan en el campo `payment_methods_failed` de la respuesta. En operaciones `UPDATE`, los datos fiscales (`tax_information`) no son modificables. *** ## Referencia técnica Esquema JSON · Campos · Ejemplos INSERT y UPDATE · Colección Postman *** ## Siguiente paso Registra múltiples comercios en un solo archivo Excel. # Registro Masivo Source: https://docs.pay-me.com/onboarding/registro-masivo Registra múltiples comercios en un solo archivo Excel mediante carga a S3 — exclusivo para Facilitadores de Pago. El registro masivo permite dar de alta o actualizar cientos de comercios en un solo proceso, cargando un archivo Excel a un bucket S3 asignado a tu organización. El sistema procesa cada fila de forma asíncrona y genera un archivo de resultados con el detalle de cada operación. *** ## Ambientes | Ambiente | Bucket S3 entrada | Bucket S3 salida | | :- | :- | :- | | Desarrollo | `adq-massive-onboarding/payment-facilitator/{PF_CODE}/IN/` | `adq-massive-onboarding/payment-facilitator/{PF_CODE}/OUT/` | | Producción | `adq-massive-onboarding/payment-facilitator/{PF_CODE}/IN/` | `adq-massive-onboarding/payment-facilitator/{PF_CODE}/OUT/` | El nombre del archivo debe seguir el formato: `OMasivo_*.xlsx` *** ## Flujo de registro masivo Completa el archivo de entrada con los datos de cada comercio. Cada fila puede ser `INSERT` para nuevos comercios o `UPDATE` para actualizar existentes. Carga el archivo en la carpeta `/IN/` del bucket S3 asignado a tu organización. Pay-me procesa cada fila de forma asíncrona — valida los datos, registra los comercios y habilita sus métodos de pago. Una vez procesado, el archivo de salida aparece en la carpeta `/OUT/` con el resultado de cada fila — exitosos, fallidos y credenciales generadas. *** ## Operaciones soportadas por fila Crea un nuevo comercio. Genera `client_id` y `client_secret` incluidos en el archivo de salida. Actualiza datos de un comercio existente usando su `merchant_code`. No regenera credenciales ni modifica datos fiscales. *** ## Estructura del archivo de salida El archivo de salida incluye todas las columnas del archivo de entrada más los siguientes campos de resultado: | Campo | Descripción | | :- | :- | | `status` | `success` o `error` por fila | | `message` | Detalle del resultado o motivo del error | | `merchant_code` | UUID asignado al comercio | | `merchant_credentials` | `client_id` y `client_secret` generados — solo en `INSERT` | | `payment_methods_enabled` | Métodos habilitados exitosamente | | `payment_methods_failed` | Métodos que fallaron durante el registro | *** ## Consideraciones Si una fila tiene errores de validación, el campo `status` será `error` y `message` describirá el motivo — por ejemplo: `"RUC inválido"` o `"marca no permitida"`. En operaciones `UPDATE`, los datos fiscales no son modificables y las credenciales no se regeneran. *** ## Referencia técnica Estructura de entrada · Estructura de salida · Archivos de ejemplo # Afiliaciones Source: https://docs.pay-me.com/pagos-recurrentes/afiliaciones Crea, consulta y actualiza afiliaciones de clientes para el módulo de Pagos Recurrentes de Pay-me. Una afiliación registra el método de pago de un cliente de forma segura, generando un identificador único que se usará en los cobros recurrentes futuros. No es necesario que el cliente ingrese sus datos de pago en cada cobro. *** ## Operaciones disponibles Registra un nuevo cliente y su método de pago. Retorna un identificador único de afiliación. Obtén el estado y los datos de una afiliación existente por su identificador. Modifica los datos de una afiliación existente — método de pago, estado u otros campos permitidos. Descarga el reporte de afiliaciones procesadas en el día para reconciliación. *** ## Consideraciones El identificador de afiliación generado al crear es **único e irrepetible**. Almacénalo en tu sistema — es requerido para ejecutar cobros recurrentes. En el método `PUT` de actualización, los datos fiscales (`tax_information`) no son modificables una vez creada la afiliación. Una afiliación inactiva o cancelada no puede usarse para procesar cobros. Verifica el estado antes de cargar un archivo de cobros. *** ## Referencia técnica La especificación completa — endpoints de creación, consulta y actualización, esquemas JSON, estructura del reporte diario y colección Postman — está publicada en GitHub. Crear · Consultar · Actualizar · Reporte diario *** ## Siguiente paso Carga archivos de cobros para procesar múltiples transacciones recurrentes. # Cobros Source: https://docs.pay-me.com/pagos-recurrentes/cobros Procesa cobros recurrentes en lote y consulta los resultados de cada operación en Pay-me. El módulo de Cobros permite procesar múltiples transacciones recurrentes en un solo envío mediante la carga de un archivo. Cada cobro se ejecuta contra una afiliación previamente registrada. *** ## Operaciones disponibles Envía un archivo con las operaciones a cobrar. Cada fila referencia una afiliación activa y el monto a procesar. Descarga el reporte con el resultado detallado de cada cobro procesado — exitosos, rechazados y pendientes. *** ## Flujo de un cobro recurrente Genera el archivo con las operaciones a procesar. Cada fila debe incluir el identificador de afiliación y el monto en centavos. Envía el archivo al endpoint de carga de cobros. El sistema lo procesa en modo batch de forma asíncrona. Una vez procesado, descarga el reporte de resultados para verificar el estado de cada operación y reconciliar con tu sistema. *** ## Consideraciones Los cobros se procesan en modo **batch asíncrono**. El resultado no es inmediato — usa el reporte de cobros para verificar el estado de cada operación. Solo se pueden procesar cobros contra afiliaciones en estado **activo**. Verifica el estado de cada afiliación antes de incluirla en el archivo. Los montos deben expresarse en **centavos**. Ejemplo: S/. 10.50 → `"1050"`. *** ## Referencia técnica La especificación completa — estructura del archivo de carga, parámetros, formato del reporte y ejemplos — está publicada en GitHub. Carga de cobros · Reporte de resultados · Ejemplos *** ## Siguiente paso Consulta los códigos de respuesta específicos del módulo de Pagos Recurrentes. # Códigos de Respuesta Source: https://docs.pay-me.com/pagos-recurrentes/codigos-de-respuesta Códigos de respuesta del módulo de Pagos Recurrentes de Pay-me. Códigos retornados en los campos `result_code`, `result_description` y `meta.status.code` en todos los endpoints de Pagos Recurrentes. *** ## Códigos | Código | Descripción | | :- | :- | | `00` | Se procesó correctamente la petición | | `01` | Ocurrió un error | | `02` | Algunos datos no fueron enviados correctamente | | `03` | Comercio no existente | | `04` | Comercio requiere configuración | | `05` | La afiliación se encuentra registrada | | `06` | La afiliación no se encuentra registrada | | `07` | Afiliación requiere activación | | `08` | Usuario abandonó la afiliación | | `09` | Token de la tarjeta está vencido | *** ## Consideraciones El código `00` es el único que indica éxito. Cualquier otro código representa un estado que requiere atención. Los códigos `05` y `06` son mutuamente excluyentes — verifica el estado de la afiliación antes de ejecutar un cobro. *** ## Siguiente paso Registra comercios de forma individual o masiva — exclusivo para Facilitadores de Pago. # Pagos Recurrentes Source: https://docs.pay-me.com/pagos-recurrentes/introduccion Automatiza cobros periódicos con el módulo de Pagos Recurrentes de Pay-me. El módulo de Pagos Recurrentes permite a los comercios automatizar la gestión de cobros periódicos, ofreciendo a los consumidores una experiencia de pago ágil y sin interrupciones. *** ## ¿Cómo funciona? Registra al cliente y su método de pago mediante el [API de Afiliaciones](/pagos-recurrentes/afiliaciones). Esto genera un identificador único que se usará en los cobros futuros. Carga el archivo de cobros con las operaciones a procesar usando el [API de Cobros](/pagos-recurrentes/cobros). Puedes procesar múltiples cobros en un solo archivo. Obtén el reporte de cobros realizados para reconciliar los resultados de cada operación procesada. *** ## Componentes del módulo Crea, consulta y actualiza afiliaciones de clientes. Cada afiliación almacena el método de pago de forma segura para cobros futuros. Carga archivos de cobros para procesar múltiples transacciones en un solo envío. Obtén reportes detallados de resultados. *** ## Consideraciones Los Pagos Recurrentes requieren que el comercio tenga habilitado este módulo. Contacta a tu asesor comercial para activarlo. Cada afiliación genera un identificador único que debe almacenarse en tu sistema — es requerido para ejecutar los cobros posteriores. Los cobros se procesan en modo batch. El resultado no es inmediato — consulta el reporte de cobros para verificar el estado de cada operación. *** ## Siguiente paso Registra y gestiona las afiliaciones de tus clientes. # Datos de Prueba Source: https://docs.pay-me.com/pagos/datos-de-prueba Utiliza estas credenciales para simular transacciones en nuestro ambiente de Sandbox. Estos datos son ficticios y solo funcionan en el ambiente de **Sandbox**. No intentes procesar transacciones reales con ellos. ## Tarjetas de Crédito y Débito Utiliza las siguientes tarjetas para probar los flujos de pagos exitosos y rechazados. Haz clic en el número para copiarlo rápidamente. **Número:** `4474118355632240`\ **Exp:** 03/28 | **CVV:** 111 **Número:** `4551708161768059`\ **Exp:** 03/28 | **CVV:** 111 **Número:** `4140682013946809`\ **Exp:** 03/28 | **CVV:** 111 **Número:** `4041650444437900`\ **Exp:** 03/28 | **CVV:** 111 **Número:** `5455460920094260`\ **Exp:** 03/28 | **CVV:** 111 **Número:** `5160030000000310`\ **Cod. Acción:** 000 | **CVV:** 111 **Número:** `5115422225052734`\ **Exp:** 03/28 | **CVV:** 111 **Número:** `371064649323968`\ **CVV:** 1111 **Número:** `371327381068590`\ **CVV:** 1111 **Número:** `36006616055724`\ **CVV:** 111 **Número:** `36344311372031`\ **CVV:** 111 ## Métodos Alternativos Simula pagos con billeteras digitales y transferencias bancarias. Para realizar pruebas con `QR` y `PagoEfectivo` mediante simuladoras, contacta al [equipo de integraciones](mailto:equipo.integraciones@pay-me.com). El equipo te indicará el flujo y los escenarios disponibles para tu comercio. Valida escenarios rápidos de aprobación y rechazo con número de teléfono y código. Simula autenticación y respuesta final con credenciales de prueba controladas. Prueba el flujo de financiamiento con un escenario sandbox disponible. Requiere coordinación con el equipo de integraciones para usar la simuladora correspondiente. Requiere coordinación con el equipo de integraciones para usar la simuladora correspondiente. **Teléfono:** `969929157`\ **Código de aprobación:** `557454` **Teléfono:** `999999999`\ **Código de aprobación:** `284563` **Tarjeta:** `123456`\ **Clave:** `123456`\ **Doc. Identidad:** `123456`\ **Token:** `123456` **Tarjeta:** `123456`\ **Clave:** `123456`\ **Doc. Identidad:** `123456`\ **Token:** `222222` **DNI:** `46699676`\ **Tarjeta:** `4557885801589196`\ **Clave:** `111111`\ **Monto (PEN):** `100.00` *** ### Tips de Integración * **Ambiente:** Asegúrate de que tu endpoint esté apuntando a `sandbox.api.tu-servicio.com`. * **CVV:** Para la mayoría de tarjetas en Sandbox, puedes usar `111` (o `1111` para Amex). * **Logs:** Revisa la consola de desarrollador para ver los códigos de respuesta detallados. # API de Autorización - ecommerce Source: https://docs.pay-me.com/payin/autorizacion Overview del API de autorización para los métodos de pago ecommerce disponibles en PayIn. El API de autorización es el punto de entrada para iniciar un cobro en PayIn. Desde aquí puedes procesar pagos ecommerce con tarjeta, Yape, QR, transferencia bancaria, Cuotéalo y PagoEfectivo. [https://api.preprod.alignet.io/charges](https://api.preprod.alignet.io/charges) [https://api.alignet.io/charges](https://api.alignet.io/charges) Usa el mismo endpoint base `POST /charges` para todos los métodos de autorización. El comportamiento final depende del método de pago y del flujo configurado. Si integras Checkout Web (Flex), la respuesta que recibes en `responseCallback` sigue la misma estructura documentada en esta sección de autorización. Usa esta misma referencia para interpretar estados, `payment_method`, `processor_response`, `meta` y variaciones por método cuando recibas el resultado final desde Flex. `meta.status.code` no debe usarse para decidir si un pago fue autorizado o denegado. Ese código confirma el resultado técnico del request o del servicio. La validación de negocio debe hacerse con `transaction.state` y, cuando aplique, con [Consulta](/payin/consulta) o [Notificaciones](/payin/notificaciones). *** ## Métodos disponibles ### Flujos síncronos Flujo síncrono para pagos con tarjeta en ecommerce. Flujo síncrono para cobros con billetera Yape. ### Flujos asíncronos Flujo asíncrono con redirección a banca en línea. Flujo asíncrono con generación del QR en la misma respuesta. Flujo asíncrono con experiencia de pago en cuotas. Flujo asíncrono para pagos fuera de la sesión principal. Reglas comunes para CARD cuando usa Redirect, transferencia bancaria y Cuotéalo. *** ## ¿Qué cubre esta sección? Tarjeta y Yape responden dentro de la misma sesión de pago, aunque la validación final siempre debe hacerse desde backend. CARD cuando usa Redirect, Transferencia Bancaria y Cuotéalo comparten reglas de redirección y retorno al comercio. Para métodos asíncronos, confirma el estado final con [Notificaciones](/payin/notificaciones) o con el [API de Consulta](/payin/consulta). Todos los importes se envían en centavos y el detalle de respuesta puede variar según el método de pago. El `payload` de Flex reutiliza la estructura del request de autorización enviando `payment_method: {}` en raíz, y `responseCallback` reutiliza la respuesta de autorización. Si no cuentas con PCI, utiliza flujos con tokenización o checkout alojado. *** ## PCI y manejo de datos sensibles Si tu integración consume APIs que envían o reciben datos sensibles de pago, debes cumplir con los estándares de seguridad PCI. ### Requisitos generales * Protección de datos en tránsito y en reposo * Enmascaramiento de información sensible * No exposición en frontend, logs o herramientas externas *** ### Facilitadores de pago (PF) Los facilitadores de pago pueden utilizar la integración por API, pero asumen responsabilidades adicionales en el manejo de datos sensibles. El PF asume responsabilidad directa sobre sus subcomercios y su cumplimiento PCI. Debe garantizar almacenamiento, transmisión y protección segura de los datos sensibles. El PF procesa directamente los pagos y gestiona la información sensible. El PF delega el manejo de datos sensibles a Pay-me para reducir su alcance PCI. *** ## Siguiente paso Revisa el primer flujo específico por método para iniciar tu integración. # API de Autorización con Cuotéalo Source: https://docs.pay-me.com/payin/autorizacion-cuotealo Inicia pagos con Cuotéalo usando el API de autorización de PayIn. Usa este flujo para iniciar operaciones en cuotas con Cuotéalo desde el API de autorización de PayIn. Este flujo utiliza el mismo endpoint base de autorización. Revisa los ambientes y la configuración general en el [Overview](/payin/autorizacion). *** ## Características del flujo Asíncrono. Permite iniciar cobros ecommerce con Cuotéalo. El usuario continúa el flujo de pago fuera de tu checkout. El resultado final debe confirmarse por backend con notificación o consulta. *** ## Consideraciones Este flujo requiere `redirect_url` para retornar al comercio cuando finalice la autorización y permite enviar `callback_url` para notificación host to host. Si trabajas con redirect, revisa también las [Consideraciones para métodos con Redirect](/payin/autorizacion-metodos-con-redirect). No tomes como final la respuesta inicial del `POST /charges`. Confirma el resultado con [Notificaciones](/payin/notificaciones) o con [Consulta](/payin/consulta-cuotealo). *** ## Request Antes de consumir este endpoint, solicita tu `Access Token` en [Autenticación](/autenticacion#param-post-token). ### Headers | Campo | Descripción | Valor | Tipo | Obligatorio | | :- | :- | :- | :- | :- | | `Authorization` | Token Bearer obtenido desde autenticación | `Bearer {access_token}` | String | SI | | `Content-Type` | Formato del request | `application/json` | String | SI | | `ALG-API-VERSION` | Versión del API | `1709847567` | String | SI | ```bash theme={"system"} Authorization: Bearer {access_token} Content-Type: application/json ALG-API-VERSION: 1709847567 ``` *** ### Body #### Objeto raíz del request | Campo | Descripción | Ejemplo | Tipo | Obligatorio | | :- | :- | :- | :- | :- | | `action` | Acción a ejecutar | `authorize` | String | SI | | `channel` | Canal de la operación | `ecommerce` | String | SI | | `merchant_code` | Código del comercio | `your_merchant_code` | String | SI | | `merchant_operation_number` | Identificador único de la operación en el comercio. **Debe ser diferente en cada transacción.** | `5974483` | String | SI | | `payment_method` | Objeto con la información del método de pago | Object | Object | SI | | `payment_details` | Objeto con el detalle del pago y datos del cliente | Object | Object | SI | *** #### Objeto `payment_method` | Campo | Descripción | Ejemplo | Tipo | Obligatorio | | :- | :- | :- | :- | :- | | `method_name` | Nombre del método de pago | `CUOTEALO` | String | SI | | `method_details` | Objeto con la información específica de Cuotéalo | Object | Object | SI | *** #### Objeto `payment_method.method_details` | Campo | Descripción | Ejemplo | Tipo | Obligatorio | | :- | :- | :- | :- | :- | | `redirect_url` | URL donde se realizará el redirect cuando finalice la autorización | `https://pay-me.com` | String | SI | | `callback_url` | URL donde se realizará la notificación host to host (server to server) | `https://pay-me.com/callback` | String | NO | `redirect_url` debe apuntar a una ruta de tu comercio preparada para recibir el retorno del usuario. Si envías `callback_url`, asegúrate de que sea accesible desde backend. *** #### Objeto `payment_details` | Campo | Descripción | Ejemplo | Tipo | Obligatorio | | :- | :- | :- | :- | :- | | `amount` | Monto de la operación en centavos | `15000` | String | SI | | `currency` | Código de la moneda | `604` | String | SI | | `billing` | Datos de facturación | Object | Object | SI | | `shipping` | Datos de envío | Object | Object | SI | | `customer` | Datos del cliente | Object | Object | SI | | `product_details` | Lista de productos asociados a la operación | `[]` | Array | SI | Para `billing`, `shipping` y `customer`, usa la estructura ecommerce estándar con `first_name`, `last_name`, `email`, `phone` y `location`. *** ### Ejemplo de request ```json theme={"system"} { "action": "authorize", "channel": "ecommerce", "merchant_code": "your_merchant_code", "merchant_operation_number": "5974483", "payment_method": { "method_name": "CUOTEALO", "method_details": { "redirect_url": "https://pay-me.com", "callback_url": "https://pay-me.com/callback" } }, "payment_details": { "amount": "15000", "currency": "604", "billing": { "first_name": "Pedro", "last_name": "Miranda", "email": "pedro@pay-me.com", "phone": { "country_code": "+51", "subscriber": "999835685" }, "location": { "line_1": "Av. Casimiro Ulloa 333", "line_2": "Miraflores", "city": "Lima", "state": "Lima", "country": "Peru" } }, "shipping": { "first_name": "Pedro", "last_name": "Miranda", "email": "pedro@pay-me.com", "phone": { "country_code": "+51", "subscriber": "999835685" }, "location": { "line_1": "Av. Casimiro Ulloa 333", "line_2": "Miraflores", "city": "Lima", "state": "Lima", "country": "Peru" } }, "customer": { "first_name": "Pedro", "last_name": "Miranda", "email": "pedro@pay-me.com", "phone": { "country_code": "+51", "subscriber": "999835685" }, "location": { "line_1": "Av. Casimiro Ulloa 333", "line_2": "Miraflores", "city": "Lima", "state": "Lima", "country": "Peru" } }, "product_details": [] } } ``` *** ## Response Para recibir la respuesta final de una autorización con redirect, toma en cuenta las [Consideraciones para métodos con Redirect](/payin/autorizacion-metodos-con-redirect). La respuesta inicial normalmente deja la transacción en seguimiento. ### Objeto `transaction` | Campo | Descripción | Ejemplo | Tipo | Obligatorio | | :- | :- | :- | :- | :- | | `transaction_id` | Identificador único de la transacción | `5hk8rwa3h3cq9oyfs3a28v1ms` | String | SI | | `channel` | Canal por el cual se realizó la transacción | `ecommerce` | String | SI | | `state` | Estado actual de la transacción | `PENDIENTE` | String | SI | | `state_reason` | Observación o descripción del estado actual | `Url generada para continuar con el pago` | String | SI | | `continue_url` | URL para continuar el flujo del pago fuera del checkout | `https://api.dev.alignet.io/payment/continue/card/81vrxn30vja1gwcfsdng4i5g5` | String | NO | | `amount` | Monto de la transacción | `15000` | String | SI | | `currency` | Código de la moneda de la operación | `604` | String | SI | | `payment_method` | Objeto con información del método de pago usado en la transacción | Object | Object | SI | | `expiration_date` | Fecha en la que expirará la transacción | Object | Object | NO | | `additional_fields` | Datos adicionales enviados en el request | Object | Object | NO | | `lifecycle` | Historial de estados por los que pasó la transacción | Array | Array | SI | `state` puede devolver valores como `PENDIENTE` o `INVALIDO`. `continue_url` y `expiration_date` suelen estar presentes cuando la transacción queda en estado `PENDIENTE`. No uses `meta.status.code` como validador de autorización o denegación del pago. Ese código solo indica si el servicio procesó o respondió correctamente; el resultado del pago se valida con `transaction.state` y, como respaldo, desde backend con consulta o notificación. *** ### Objeto `transaction.payment_method` | Campo | Descripción | Ejemplo | Tipo | Obligatorio | | :- | :- | :- | :- | :- | | `method_name` | Nombre del método de pago usado en la transacción | `CUOTEALO` | String | SI | | `method_details` | Objeto que contiene el detalle del método de pago usado en la transacción | Object | Object | SI | *** ### Objeto `transaction.payment_method.method_details` | Campo | Descripción | Ejemplo | Tipo | Obligatorio | | :- | :- | :- | :- | :- | | `redirect_url` | URL donde se realizará el redirect cuando finalice la autorización | `https://pay-me.com` | String | SI | | `callback_url` | URL donde se realizará la notificación host to host (server to server) | `https://pay-me.com/callback` | String | NO | *** ### Objeto `transaction.expiration_date` | Campo | Descripción | Ejemplo | Tipo | Obligatorio | | :- | :- | :- | :- | :- | | `utc_time` | Fecha de expiración en UTC | `2024-03-12T22:49:36.018Z` | String | NO | | `unix_time` | Fecha de expiración en unix time | `1711585037` | Integer | NO | *** ### Objeto `transaction.lifecycle` | Campo | Descripción | Ejemplo | Tipo | Obligatorio | | :- | :- | :- | :- | :- | | `state` | Estado registrado en el historial | `PENDIENTE` | String | SI | | `date` | Fecha del cambio de estado | Object | Object | SI | En `lifecycle` puedes recibir estados como `REGISTRADO`, `PENDIENTE` e `INVALIDO`. *** ### Objeto `transaction.lifecycle[].date` | Campo | Descripción | Ejemplo | Tipo | Obligatorio | | :- | :- | :- | :- | :- | | `utc_time` | Fecha en UTC | `2024-03-12T22:49:36.018Z` | String | SI | | `unix_time` | Fecha en unix time | `1710282940` | Integer | SI | *** ### Ejemplo de response ```json theme={"system"} { "success": "true", "action": "authorize", "merchant_code": "your_merchant_code", "merchant_operation_number": "2391645", "transaction": { "transaction_id": "5hk8rwa3h3cq9oyfs3a28v1ms", "channel": "ecommerce", "state": "PENDIENTE", "state_reason": "Url generada para continuar con el pago", "continue_url": "https://api.dev.alignet.io/payment/continue/card/81vrxn30vja1gwcfsdng4i5g5", "amount": "15000", "currency": "604", "payment_method": { "method_name": "CUOTEALO", "method_details": { "redirect_url": "https://pay-me.com", "callback_url": "https://pay-me.com/callback" } }, "expiration_date": { "utc_time": "2024-03-12T22:49:36.018Z", "unix_time": 1711585037 }, "processor_response": null, "additional_fields": null, "lifecycle": [ { "state": "REGISTRADO", "date": { "utc_time": "2024-03-12T22:49:36.018Z", "unix_time": 1710282940 } }, { "state": "PENDIENTE", "date": { "utc_time": "2024-03-12T22:49:36.018Z", "unix_time": 1710282940 } } ] }, "meta": { "status": { "code": "00", "message_ilgn": [ { "locale": "es_PE", "value": "Procesado correctamente" } ] } } } ``` *** ## Buenas prácticas * Confirma el resultado final por backend antes de actualizar la orden. * Asegúrate de enviar un `merchant_operation_number` único por transacción. * Implementa el manejo del retorno del usuario a `redirect_url` sin asumir que el pago terminó correctamente. * Usa `callback_url` si tu operación necesita confirmación server to server. * Conserva `transaction_id`, `merchant_operation_number` y `continue_url` para seguimiento, soporte y conciliación. *** ## Errores comunes No marques una orden como pagada solo porque el usuario regresó a tu sitio o porque recibiste una respuesta inicial `PENDIENTE`. Si `redirect_url` no está correctamente implementado, el usuario puede completar el flujo de Cuotéalo sin que tu comercio procese bien el retorno. *** ## Siguiente paso Consulta el estado final de una operación iniciada con Cuotéalo. # Consideraciones para métodos con Redirect Source: https://docs.pay-me.com/payin/autorizacion-metodos-con-redirect Aspectos comunes para CARD cuando usa Redirect, Cuotéalo y transferencia bancaria. Esta guía reúne las consideraciones comunes para los flujos donde la autorización continúa fuera de tu checkout y luego retorna al comercio mediante un `form post`. *** ## Métodos que aplican Aplica cuando la autorización de tarjeta requiere continuar fuera de la sesión inicial. El usuario continúa el pago fuera del checkout y luego retorna al comercio. La operación continúa en una experiencia externa de pago en cuotas. *** ## Flujo general Envía el `POST /charges` con el método de pago correspondiente. Cuando la respuesta incluya la URL de continuación del flujo, cárgala para que el usuario pueda seguir con el pago. Cuando el usuario finalice la autorización, el orquestador redirigirá hacia la `redirect_url` enviada en el request. El retorno se realiza en formato `form post` e incluye los campos `authorization_result` y `signature`. Decodifica `authorization_result` y valida `signature` antes de confiar en el contenido. Usa [Notificaciones](/payin/notificaciones) o [Consulta](/payin/consulta) como confirmación final del estado. *** ## Campos enviados al `redirect_url` | Campo | Descripción | | :- | :- | | `authorization_result` | Contendrá un json-string en base64 con el resultado de la autorización. | | `signature` | Contendrá una firma para validar que el json de respuesta es auténtico. | *** ## Parámetros del `authorization_result` | Campo | Descripción | Ejemplo | Tipo | Obligatorio | | :- | :- | :- | :- | :- | | `success` | Indica si el proceso se realizó correctamente | `true` | String | SI | | `merchant_code` | Identificador del comercio | `your_merchant_code` | String | SI | | `merchant_operation_number` | Número de pedido de la operación | `2391645` | String | SI | | `transaction` | Objeto con información de la transacción | Object | Object | SI | | `meta` | Objeto que contiene metadatos del flujo ejecutado | Object | Object | SI | *** ### Objeto `authorization_result.transaction` | Campo | Descripción | Ejemplo | Tipo | Obligatorio | | :- | :- | :- | :- | :- | | `transaction_id` | Identificador de la transacción | `5hk8rwa3h3cq9oyfs3a28v1ms` | String | SI | | `state` | Estado de la transacción | `AUTORIZADO` | String | SI | | `currency` | Código de la moneda autorizada | `604` | String | SI | | `amount` | Monto autorizado en centavos | `15000` | String | SI | | `processor_response` | Resultado detallado del procesamiento. Este objeto puede variar según el método de pago. | Object | Object | NO | `processor_response` es variable y puede modificarse en el tiempo. Tómalo como referencial y complementa la integración con la documentación específica del método. *** ### Objeto `authorization_result.meta.status` | Campo | Descripción | Ejemplo | Tipo | Obligatorio | | :- | :- | :- | :- | :- | | `code` | Código del resultado técnico del servicio o request. No valida si el pago fue autorizado o denegado. | `00` | String | SI | | `message_ilgn` | Mensajes resultantes del flujo | Array | Object | SI | No cambies la orden a pagada usando `authorization_result.meta.status.code`. Primero valida `authorization_result.transaction.state`, la `signature` y la confirmación final desde backend. *** ### Objeto `authorization_result.meta.status.message_ilgn[]` | Campo | Descripción | Ejemplo | Tipo | Obligatorio | | :- | :- | :- | :- | :- | | `locale` | Localidad a nivel de lenguaje para el mensaje del flujo ejecutado | `es_PE` | String | SI | | `value` | Mensaje resultante del flujo ejecutado | `Procesado correctamente` | String | SI | *** ## Recomendaciones No cambies el estado de la orden únicamente por el retorno del navegador. La fuente final de verdad debe ser backend. Valida siempre `signature` antes de procesar `authorization_result`. Maneja explícitamente escenarios donde el usuario regresa sin completar el pago o abandona el flujo. Si no recibes confirmación S2S, realiza consulta activa con intervalos razonables. *** ## Siguiente paso Complementa los métodos con redirect usando consulta y reconciliación. # API de Autorización con PagoEfectivo Source: https://docs.pay-me.com/payin/autorizacion-pagoefectivo Inicia pagos con PagoEfectivo usando el API de autorización de PayIn. Usa este flujo para iniciar pagos ecommerce con PagoEfectivo desde el API de autorización de PayIn. Este flujo utiliza el mismo endpoint base de autorización. Revisa los ambientes y la configuración general en el [Overview](/payin/autorizacion). *** ## Características del flujo Asíncrono. Permite iniciar cobros ecommerce con PagoEfectivo. El API devuelve un CIP y una URL de pago para que el usuario complete la operación fuera del checkout. El resultado final debe confirmarse por backend con notificación o consulta. *** ## Consideraciones Este flujo requiere `redirect_url` para retornar al comercio cuando finalice la autorización y permite enviar `callback_url` para notificación host to host. El usuario puede completar el pago después de la sesión inicial usando el CIP o la URL generada por PagoEfectivo. Complementa este flujo con [Notificaciones](/payin/notificaciones) o con [Consulta](/payin/consulta-pagoefectivo). No tomes como final la respuesta inicial del `POST /charges`. Generar el CIP no equivale a recibir el pago. Confirma el resultado con [Notificaciones](/payin/notificaciones) o con [Consulta](/payin/consulta-pagoefectivo). *** ## Request Antes de consumir este endpoint, solicita tu `Access Token` en [Autenticación](/autenticacion#param-post-token). ### Headers | Campo | Descripción | Valor | Tipo | Obligatorio | | :- | :- | :- | :- | :- | | `Authorization` | Token Bearer obtenido desde autenticación | `Bearer {access_token}` | String | SI | | `Content-Type` | Formato del request | `application/json` | String | SI | | `ALG-API-VERSION` | Versión del API | `1709847567` | String | SI | ```bash theme={"system"} Authorization: Bearer {access_token} Content-Type: application/json ALG-API-VERSION: 1709847567 ``` *** ### Body #### Objeto raíz del request | Campo | Descripción | Ejemplo | Tipo | Obligatorio | | :- | :- | :- | :- | :- | | `action` | Acción a ejecutar | `authorize` | String | SI | | `channel` | Canal de la operación | `ecommerce` | String | SI | | `merchant_code` | Código del comercio | `your_merchant_code` | String | SI | | `merchant_operation_number` | Identificador único de la operación en el comercio. **Debe ser diferente en cada transacción.** | `5974483` | String | SI | | `payment_method` | Objeto con la información del método de pago | Object | Object | SI | | `payment_details` | Objeto con el detalle del pago y datos del cliente | Object | Object | SI | *** #### Objeto `payment_method` | Campo | Descripción | Ejemplo | Tipo | Obligatorio | | :- | :- | :- | :- | :- | | `method_name` | Nombre del método de pago | `PAGOEFECTIVO` | String | SI | | `method_details` | Objeto con la información específica de PagoEfectivo | Object | Object | SI | *** #### Objeto `payment_method.method_details` | Campo | Descripción | Ejemplo | Tipo | Obligatorio | | :- | :- | :- | :- | :- | | `redirect_url` | URL donde se realizará el redirect cuando finalice la autorización | `https://pay-me.com` | String | SI | | `callback_url` | URL donde se realizará la notificación host to host (server to server) | `https://pay-me.com/callback` | String | NO | `redirect_url` debe apuntar a una ruta de tu comercio preparada para recibir el retorno del usuario. Si envías `callback_url`, asegúrate de que sea accesible desde backend. *** #### Objeto `payment_details` | Campo | Descripción | Ejemplo | Tipo | Obligatorio | | :- | :- | :- | :- | :- | | `amount` | Monto de la operación en centavos | `15000` | String | SI | | `currency` | Código de la moneda | `604` | String | SI | | `billing` | Datos de facturación | Object | Object | SI | | `shipping` | Datos de envío | Object | Object | SI | | `customer` | Datos del cliente | Object | Object | SI | | `product_details` | Lista de productos asociados a la operación | `[]` | Array | SI | Para `billing`, `shipping` y `customer`, usa la estructura ecommerce estándar con `first_name`, `last_name`, `email`, `phone` y `location`. *** ### Ejemplo de request ```json theme={"system"} { "action": "authorize", "channel": "ecommerce", "merchant_code": "your_merchant_code", "merchant_operation_number": "5974483", "payment_method": { "method_name": "PAGOEFECTIVO", "method_details": { "redirect_url": "https://pay-me.com", "callback_url": "https://pay-me.com/callback" } }, "payment_details": { "amount": "15000", "currency": "604", "billing": { "first_name": "Pedro", "last_name": "Miranda", "email": "pedro@pay-me.com", "phone": { "country_code": "+51", "subscriber": "999835685" }, "location": { "line_1": "Av. Casimiro Ulloa 333", "line_2": "Miraflores", "city": "Lima", "state": "Lima", "country": "Peru" } }, "shipping": { "first_name": "Pedro", "last_name": "Miranda", "email": "pedro@pay-me.com", "phone": { "country_code": "+51", "subscriber": "999835685" }, "location": { "line_1": "Av. Casimiro Ulloa 333", "line_2": "Miraflores", "city": "Lima", "state": "Lima", "country": "Peru" } }, "customer": { "first_name": "Pedro", "last_name": "Miranda", "email": "pedro@pay-me.com", "phone": { "country_code": "+51", "subscriber": "999835685" }, "location": { "line_1": "Av. Casimiro Ulloa 333", "line_2": "Miraflores", "city": "Lima", "state": "Lima", "country": "Peru" } }, "product_details": [] } } ``` *** ## Response La respuesta inicial normalmente deja la transacción en seguimiento. Confirma el resultado final con notificaciones o con consulta antes de actualizar la orden. ### Objeto `transaction` | Campo | Descripción | Ejemplo | Tipo | Obligatorio | | :- | :- | :- | :- | :- | | `transaction_id` | Identificador único de la transacción | `5hk8rwa3h3cq9oyfs3a28v1ms` | String | SI | | `channel` | Canal por el cual se realizó la transacción | `ecommerce` | String | SI | | `state` | Estado actual de la transacción | `PENDIENTE` | String | SI | | `state_reason` | Observación o descripción del estado actual | `Código CIP generado exitosamente` | String | SI | | `amount` | Monto de la transacción | `15000` | String | SI | | `currency` | Código de la moneda de la operación | `604` | String | SI | | `payment_method` | Objeto con información del método de pago usado en la transacción | Object | Object | SI | | `expiration_date` | Fecha en la que expirará la transacción | Object | Object | NO | | `processor_response` | Resultado devuelto por la procesadora con datos del CIP | Object | Object | NO | | `additional_fields` | Datos adicionales enviados en el request | Object | Object | NO | | `lifecycle` | Historial de estados por los que pasó la transacción | Array | Array | SI | `state` puede devolver valores como `PENDIENTE` o `INVALIDO`. Cuando el CIP fue generado correctamente, la transacción normalmente queda en `PENDIENTE` hasta que el usuario complete el pago o expire. No uses `meta.status.code` como validador de autorización o denegación del pago. Ese código solo indica si el servicio procesó o respondió correctamente; el resultado del pago se valida con `transaction.state` y, como respaldo, desde backend con consulta o notificación. *** ### Objeto `transaction.payment_method` | Campo | Descripción | Ejemplo | Tipo | Obligatorio | | :- | :- | :- | :- | :- | | `method_name` | Nombre del método de pago usado en la transacción | `PAGOEFECTIVO` | String | SI | | `method_details` | Objeto que contiene el detalle del método de pago usado en la transacción | Object | Object | SI | *** ### Objeto `transaction.payment_method.method_details` | Campo | Descripción | Ejemplo | Tipo | Obligatorio | | :- | :- | :- | :- | :- | | `callback_url` | URL donde se realizará la notificación host to host (server to server) | `https://pay-me.com/callback` | String | NO | *** ### Objeto `transaction.expiration_date` | Campo | Descripción | Ejemplo | Tipo | Obligatorio | | :- | :- | :- | :- | :- | | `utc_time` | Fecha de expiración en UTC | `2024-03-12T22:49:36.018Z` | String | NO | | `unix_time` | Fecha de expiración en unix time | `1711585037` | Integer | NO | *** ### Objeto `transaction.processor_response` | Campo | Descripción | Ejemplo | Tipo | Obligatorio | | :- | :- | :- | :- | :- | | `cip` | Código CIP de PagoEfectivo | `1508405` | String | NO | | `cip_url` | URL de PagoEfectivo con el detalle e indicaciones de pago | `https://pre1a.payment.pagoefectivo.pe/72217FA5-4580-4B16-A345-24F028F53356.html` | String | NO | | `result_message` | Mensaje del resultado de la autorización | Object | Object | NO | *** ### Objeto `transaction.processor_response.result_message` | Campo | Descripción | Ejemplo | Tipo | Obligatorio | | :- | :- | :- | :- | :- | | `code` | Código del resultado de la autorización | `100` | String | NO | | `description` | Descripción del resultado de la autorización | `Solicitud exitosa.` | String | NO | *** ### Objeto `transaction.lifecycle` | Campo | Descripción | Ejemplo | Tipo | Obligatorio | | :- | :- | :- | :- | :- | | `state` | Estado registrado en el historial | `PENDIENTE` | String | SI | | `date` | Fecha del cambio de estado | Object | Object | SI | En `lifecycle` puedes recibir estados como `REGISTRADO`, `PENDIENTE` e `INVALIDO`. *** ### Objeto `transaction.lifecycle[].date` | Campo | Descripción | Ejemplo | Tipo | Obligatorio | | :- | :- | :- | :- | :- | | `utc_time` | Fecha en UTC | `2024-03-12T22:49:36.018Z` | String | SI | | `unix_time` | Fecha en unix time | `1710282940` | Integer | SI | *** ### Ejemplo de response ```json theme={"system"} { "success": "true", "action": "authorize", "merchant_code": "your_merchant_code", "merchant_operation_number": "2391645", "transaction": { "transaction_id": "5hk8rwa3h3cq9oyfs3a28v1ms", "channel": "ecommerce", "state": "PENDIENTE", "state_reason": "Código CIP generado exitosamente", "amount": "15000", "currency": "604", "payment_method": { "method_name": "PAGOEFECTIVO", "method_details": { "callback_url": "https://pay-me.com/callback" } }, "expiration_date": { "utc_time": "2024-03-12T22:49:36.018Z", "unix_time": 1711585037 }, "processor_response": { "cip": "1508405", "cip_url": "https://pre1a.payment.pagoefectivo.pe/72217FA5-4580-4B16-A345-24F028F53356.html", "result_message": { "code": "100", "description": "Solicitud exitosa." } }, "additional_fields": null, "lifecycle": [ { "state": "REGISTRADO", "date": { "utc_time": "2024-03-12T22:49:36.018Z", "unix_time": 1710282940 } }, { "state": "PENDIENTE", "date": { "utc_time": "2024-03-12T22:49:36.018Z", "unix_time": 1710282940 } } ] }, "meta": { "status": { "code": "00", "message_ilgn": [ { "locale": "es_PE", "value": "Procesado correctamente" } ] } } } ``` *** ## Buenas prácticas * Confirma el resultado final por backend antes de actualizar la orden. * Asegúrate de enviar un `merchant_operation_number` único por transacción. * No asumas que un CIP generado significa pago completado; interpreta `PENDIENTE` como un estado intermedio. * Usa `callback_url` si tu operación necesita confirmación server to server. * Conserva `transaction_id`, `merchant_operation_number`, `cip`, `cip_url` y la fecha de expiración para seguimiento, soporte y conciliación. *** ## Errores comunes Generar el CIP no equivale a recibir el pago. El usuario todavía debe completar el abono en el canal habilitado por PagoEfectivo. Si el usuario intenta pagar después de `expiration_date`, deberás generar una nueva operación en lugar de reutilizar la anterior. *** ## Siguiente paso Verifica cómo consultar una operación iniciada con PagoEfectivo. # API de Autorización con QR Source: https://docs.pay-me.com/payin/autorizacion-qr Inicia pagos con QR usando el API de autorización de PayIn. Usa este flujo para generar una operación QR desde el API de autorización de PayIn y entregar el QR en la misma respuesta para que el usuario complete el pago desde su app bancaria o billetera compatible. Este flujo utiliza el mismo endpoint base de autorización. Revisa los ambientes y la configuración general en el [Overview](/payin/autorizacion). *** ## Características del flujo Asíncrono. Permite generar un código QR para que el usuario complete el pago desde su app bancaria o billetera compatible. El API devuelve la imagen del QR en base 64 dentro de `transaction.processor_response.qr_image`. El resultado final debe confirmarse por backend con notificación o consulta. *** ## Consideraciones Este flujo permite enviar `callback_url` para recibir una notificación host to host cuando el estado de la operación cambie. QR no utiliza `redirect_url` ni retorno del navegador al comercio. El código QR se obtiene en la respuesta inicial del `POST /charges`. Aunque el QR se genera en la respuesta inicial, la confirmación final del pago sigue la misma lógica operativa de los métodos asíncronos. Complementa este flujo con [Notificaciones](/payin/notificaciones) o con [Consulta](/payin/consulta-qr). No marques la orden como pagada solo porque el QR fue generado correctamente. Confirma siempre el estado final con [Notificaciones](/payin/notificaciones) o con [Consulta](/payin/consulta-qr). *** ## Request Antes de consumir este endpoint, solicita tu `Access Token` en [Autenticación](/autenticacion#param-post-token). ### Headers | Campo | Descripción | Valor | Tipo | Obligatorio | | :- | :- | :- | :- | :- | | `Authorization` | Token Bearer obtenido desde autenticación | `Bearer {access_token}` | String | SI | | `Content-Type` | Formato del request | `application/json` | String | SI | | `ALG-API-VERSION` | Versión del API | `1709847567` | String | SI | ```bash theme={"system"} Authorization: Bearer {access_token} Content-Type: application/json ALG-API-VERSION: 1709847567 ``` *** ### Body #### Objeto raíz del request | Campo | Descripción | Ejemplo | Tipo | Obligatorio | | :- | :- | :- | :- | :- | | `action` | Acción a ejecutar | `authorize` | String | SI | | `channel` | Canal de la operación | `ecommerce` | String | SI | | `merchant_code` | Código del comercio | `your_merchant_code` | String | SI | | `merchant_operation_number` | Identificador único de la operación en el comercio. **Debe ser diferente en cada transacción.** | `5733813` | String | SI | | `payment_method` | Objeto con la información del método de pago | Object | Object | SI | | `payment_details` | Objeto con el detalle del pago y datos del cliente | Object | Object | SI | *** #### Objeto `payment_method` | Campo | Descripción | Ejemplo | Tipo | Obligatorio | | :- | :- | :- | :- | :- | | `method_name` | Nombre del método de pago | `QR` | String | SI | | `method_details` | Objeto con la información específica del pago con QR | Object | Object | SI | *** #### Objeto `payment_method.method_details` | Campo | Descripción | Ejemplo | Tipo | Obligatorio | | :- | :- | :- | :- | :- | | `callback_url` | URL donde se realizará la notificación host to host (server to server) | `https://pay-me.com/callback` | String | NO | Si envías `callback_url`, asegúrate de que sea una URL backend accesible para recibir confirmaciones server to server. *** #### Objeto `payment_details` | Campo | Descripción | Ejemplo | Tipo | Obligatorio | | :- | :- | :- | :- | :- | | `amount` | Monto de la operación en centavos | `15000` | String | SI | | `currency` | Código de la moneda | `604` | String | SI | | `billing` | Datos de facturación | Object | Object | SI | | `shipping` | Datos de envío | Object | Object | SI | | `customer` | Datos del cliente | Object | Object | SI | | `product_details` | Lista de productos asociados a la operación | `[]` | Array | SI | Para `billing`, `shipping` y `customer`, usa la estructura ecommerce estándar con `first_name`, `last_name`, `email`, `phone` y `location`. *** ### Ejemplo de request ```json theme={"system"} { "action": "authorize", "channel": "ecommerce", "merchant_code": "your_merchant_code", "merchant_operation_number": "5733813", "payment_method": { "method_name": "QR", "method_details": { "callback_url": "https://pay-me.com/callback" } }, "payment_details": { "amount": "15000", "currency": "604", "billing": { "first_name": "Pedro", "last_name": "Miranda", "email": "pedro@pay-me.com", "phone": { "country_code": "+51", "subscriber": "999835685" }, "location": { "line_1": "Av. Casimiro Ulloa 333", "line_2": "Miraflores", "city": "Lima", "state": "Lima", "country": "Peru" } }, "shipping": { "first_name": "Pedro", "last_name": "Miranda", "email": "pedro@pay-me.com", "phone": { "country_code": "+51", "subscriber": "999835685" }, "location": { "line_1": "Av. Casimiro Ulloa 333", "line_2": "Miraflores", "city": "Lima", "state": "Lima", "country": "Peru" } }, "customer": { "first_name": "Pedro", "last_name": "Miranda", "email": "pedro@pay-me.com", "phone": { "country_code": "+51", "subscriber": "999835685" }, "location": { "line_1": "Av. Casimiro Ulloa 333", "line_2": "Miraflores", "city": "Lima", "state": "Lima", "country": "Peru" } }, "product_details": [] } } ``` *** ## Response ### Objeto `transaction` | Campo | Descripción | Ejemplo | Tipo | Obligatorio | | :- | :- | :- | :- | :- | | `transaction_id` | Identificador único de la transacción | `5hk8rwa3h3cq9oyfs3a28v1ms` | String | SI | | `channel` | Canal por el cual se realizó la transacción | `ecommerce` | String | SI | | `state` | Estado actual de la transacción | `PENDIENTE` | String | SI | | `state_reason` | Observación o descripción del estado actual | `QR generado exitosamente` | String | SI | | `amount` | Monto de la transacción | `15000` | String | SI | | `currency` | Código de la moneda de la operación | `604` | String | SI | | `payment_method` | Objeto con información del método de pago usado en la transacción | Object | Object | SI | | `expiration_date` | Fecha en la que expirará la transacción | Object | Object | NO | | `processor_response` | Resultado devuelto por la procesadora con información del QR generado | Object | Object | NO | | `additional_fields` | Datos adicionales enviados en el request | Object | Object | NO | | `lifecycle` | Historial de estados por los que pasó la transacción | Array | Array | SI | `state` puede devolver valores como `PENDIENTE` o `INVALIDO`. Cuando el QR fue generado correctamente, la transacción normalmente queda en `PENDIENTE` hasta que el pago sea completado o expire. No uses `meta.status.code` como validador de autorización o denegación del pago. Ese código solo indica si el servicio procesó o respondió correctamente; el resultado del pago se valida con `transaction.state` y, como respaldo, desde backend con consulta o notificación. *** ### Objeto `transaction.payment_method` | Campo | Descripción | Ejemplo | Tipo | Obligatorio | | :- | :- | :- | :- | :- | | `method_name` | Nombre del método de pago usado en la transacción | `QR` | String | SI | | `method_details` | Objeto que contiene el detalle del método de pago usado en la transacción | Object | Object | NO | *** ### Objeto `transaction.payment_method.method_details` | Campo | Descripción | Ejemplo | Tipo | Obligatorio | | :- | :- | :- | :- | :- | | `callback_url` | URL de callback enviada en el request | `https://pay-me.com/callback` | String | NO | *** ### Objeto `transaction.expiration_date` | Campo | Descripción | Ejemplo | Tipo | Obligatorio | | :- | :- | :- | :- | :- | | `utc_time` | Fecha de expiración en UTC | `2024-03-12T22:49:36.018Z` | String | NO | | `unix_time` | Fecha de expiración en unix time | `1711585037` | Integer | NO | *** ### Objeto `transaction.processor_response` | Campo | Descripción | Ejemplo | Tipo | Obligatorio | | :- | :- | :- | :- | :- | | `date` | Fecha devuelta por la procesadora | `2024-03-26 19:17:19.599715` | String | NO | | `qr_image` | Imagen del QR en base 64 | `data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAA...` | String | NO | | `qr_id` | ID del QR | `6d5d1ffc79234991b5592b825d6ec097` | String | NO | | `result_message` | Mensaje del resultado de la autorización | Object | Object | NO | *** ### Objeto `transaction.processor_response.result_message` | Campo | Descripción | Ejemplo | Tipo | Obligatorio | | :- | :- | :- | :- | :- | | `code` | Código del resultado de la autorización | `0` | String | NO | | `description` | Descripción del resultado de la autorización | `Exito` | String | NO | *** ### Objeto `transaction.lifecycle` | Campo | Descripción | Ejemplo | Tipo | Obligatorio | | :- | :- | :- | :- | :- | | `state` | Estado registrado en el historial | `PENDIENTE` | String | SI | | `date` | Fecha del cambio de estado | Object | Object | SI | En `lifecycle` puedes recibir estados como `REGISTRADO`, `PENDIENTE` e `INVALIDO`. *** ### Objeto `transaction.lifecycle[].date` | Campo | Descripción | Ejemplo | Tipo | Obligatorio | | :- | :- | :- | :- | :- | | `utc_time` | Fecha en UTC | `2024-03-12T22:49:36.018Z` | String | SI | | `unix_time` | Fecha en unix time | `1710282940` | Integer | SI | *** ### Ejemplo de response ```json theme={"system"} { "success": "true", "action": "authorize", "merchant_code": "your_merchant_code", "merchant_operation_number": "2391645", "transaction": { "transaction_id": "5hk8rwa3h3cq9oyfs3a28v1ms", "channel": "ecommerce", "state": "PENDIENTE", "state_reason": "QR generado exitosamente", "amount": "15000", "currency": "604", "payment_method": { "method_name": "QR", "method_details": { "callback_url": "https://pay-me.com/callback" } }, "expiration_date": { "utc_time": "2024-03-12T22:49:36.018Z", "unix_time": 1711585037 }, "processor_response": { "date": "2024-03-26 19:17:19.599715", "qr_image": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAA...", "qr_id": "6d5d1ffc79234991b5592b825d6ec097", "result_message": { "code": "0", "description": "Exito" } }, "additional_fields": null, "lifecycle": [ { "state": "REGISTRADO", "date": { "utc_time": "2024-03-12T22:49:36.018Z", "unix_time": 1710282940 } }, { "state": "PENDIENTE", "date": { "utc_time": "2024-03-12T22:49:36.018Z", "unix_time": 1710282940 } } ] }, "meta": { "status": { "code": "00", "message_ilgn": [ { "locale": "es_PE", "value": "Procesado correctamente" } ] } } } ``` *** ## Buenas prácticas * Confirma el resultado final por backend antes de actualizar la orden. * Asegúrate de enviar un `merchant_operation_number` único por transacción. * No asumas que un QR generado significa pago completado; interpreta `PENDIENTE` como un estado intermedio. * Usa `callback_url` si tu operación necesita confirmación server to server. * Conserva `transaction_id`, `merchant_operation_number`, `qr_id` y la fecha de expiración para seguimiento, soporte y conciliación. *** ## Errores comunes Generar el QR no equivale a autorizar el pago. El usuario todavía debe escanearlo y completar la operación. Si el usuario intenta pagar después de `expiration_date`, deberás generar una nueva operación en lugar de reutilizar la anterior. *** ## Siguiente paso Aprende a consultar el estado actualizado de una operación QR. # API de Autorización con Tarjeta Source: https://docs.pay-me.com/payin/autorizacion-tarjeta Inicia pagos con tarjeta desde el API de autorización de PayIn. Usa este flujo para procesar pagos ecommerce con tarjeta desde el API de autorización de PayIn. Este flujo utiliza el mismo endpoint base de autorización. Revisa los ambientes y la configuración general en el [Overview](/payin/autorizacion). *** ## Características del flujo Síncrono o con autenticación adicional, según la configuración del comercio y del emisor. Permite procesar pagos ecommerce con tarjeta. La confirmación del resultado debe realizarse desde backend. Si el flujo envía o recibe datos sensibles de tarjeta, debes contar con cumplimiento PCI. Si utilizas Checkout Web (Flex), en esta página también se documenta la estructura de respuesta que recibirás en `responseCallback`. *** ## Consideraciones Este flujo puede operar en tres escenarios: autorización sin autenticación, autorización con autenticación 3DS Redirect y autorización con datos de autenticación 3DS obtenidos previamente. Si trabajas con autenticación 3DS en un único flujo, revisa también las [Consideraciones para métodos con Redirect](/payin/autorizacion-metodos-con-redirect). No expongas datos sensibles de pago en frontend, logs o herramientas sin enmascaramiento. Si tu integración procesa directamente PAN, CVV o datos equivalentes, valida previamente la habilitación PCI de tu comercio. *** ## Request Antes de consumir este endpoint, solicita tu `Access Token` en [Autenticación](/autenticacion#param-post-token). ### Headers | Campo | Descripción | Valor | Tipo | Obligatorio | | :- | :- | :- | :- | :- | | `Authorization` | Token Bearer obtenido desde autenticación | `Bearer {access_token}` | String | SI | | `Content-Type` | Formato del request | `application/json` | String | SI | | `ALG-API-VERSION` | Versión del API | `1709847567` | String | SI | ```bash theme={"system"} Authorization: Bearer {access_token} Content-Type: application/json ALG-API-VERSION: 1709847567 ``` *** ### Body #### Objeto raíz del request | Campo | Descripción | Ejemplo | Tipo | Obligatorio | | :- | :- | :- | :- | :- | | `action` | Acción a ejecutar | `authorize` | String | SI | | `channel` | Canal de la operación | `ecommerce` | String | SI | | `merchant_code` | Código del comercio | `your_merchant_code` | String | SI | | `merchant_operation_number` | Identificador único de la operación en el comercio. **Debe ser diferente en cada transacción.** | `2391645` | String | SI | | `payment_method` | Objeto con la información del método de pago | Object | Object | SI | | `payment_details` | Objeto con el detalle del pago y datos del cliente | Object | Object | SI | *** #### Objeto `payment_method` | Campo | Descripción | Ejemplo | Tipo | Obligatorio | | :- | :- | :- | :- | :- | | `method_name` | Nombre del método de pago | `CARD` | String | SI | | `method_details` | Objeto con la información específica de la tarjeta | Object | Object | SI | *** #### Objeto `payment_method.method_details` | Campo | Descripción | Ejemplo | Tipo | Obligatorio | | :- | :- | :- | :- | :- | | `pan` | Número de la tarjeta | `4051420006041115` | String | SI | | `expiry_date` | Fecha de expiración en formato `MMYY` | `1231` | String | SI | | `security_code` | Código de seguridad de la tarjeta (CVV) | `123` | String | SI | | `card_holder` | Objeto con información del titular de la tarjeta | Object | Object | SI | | `redirect_url` | URL de retorno al finalizar la autenticación | `https://pay-me.com` | String | NO | | `callback_url` | URL para notificación host to host | `https://pay-me.com/callback` | String | NO | | `authentication_result` | Resultado de autenticación 3DS obtenida previamente | Object | Object | NO | | `installments` | Objeto con información de plan y cuotas | Object | Object | NO | *** #### Objeto `payment_method.method_details.card_holder` | Campo | Descripción | Ejemplo | Tipo | Obligatorio | | :- | :- | :- | :- | :- | | `first_name` | Nombres del titular | `Pedro` | String | SI | | `last_name` | Apellidos del titular | `Miranda` | String | SI | | `email` | Correo electrónico del titular | `pedro@pay-me.com` | String | SI | | `phone` | Objeto con el teléfono del titular | Object | Object | SI | *** #### Objeto `payment_method.method_details.card_holder.phone` | Campo | Descripción | Ejemplo | Tipo | Obligatorio | | :- | :- | :- | :- | :- | | `prefix` | Código de país del teléfono | `51` | String | SI | | `number` | Número del teléfono | `999835685` | String | SI | *** #### Objeto `payment_method.method_details.authentication_result.3ds_secure` | Campo | Descripción | Ejemplo | Tipo | Obligatorio | | :- | :- | :- | :- | :- | | `version` | Versión del protocolo 3DS | `2.1.0` | String | NO | | `electronic_commerce_indicator` | Valor del ECI | `05` | String | NO | | `cardholder_authentication_verification_value` | Valor del CAVV | `AJkBB5NBeQAAAD3MYENQdAAAAAA=` | String | NO | | `ds_transaction_id` | Directory Server Transaction ID | `ABC123` | String | NO | | `three_ds_server_transaction_id` | 3DS Server Transaction ID | `ABC123` | String | NO | | `trans_status` | Resultado de autenticación | `Y` | String | NO | *** #### Objeto `payment_method.method_details.installments` | Campo | Descripción | Ejemplo | Tipo | Obligatorio | | :- | :- | :- | :- | :- | | `plan` | Plan de cuotas a usar en la autorización | `01` | String | NO | | `number` | Cantidad de cuotas | `3` | String | NO | Valores para `installments.plan`: * `01`: Normal * `02`: Diferido (no disponible) *** ### Ejemplo 1: sin autenticación ```json theme={"system"} { "action": "authorize", "channel": "ecommerce", "merchant_code": "your_merchant_code", "merchant_operation_number": "2391645", "payment_method": { "method_name": "CARD", "method_details": { "pan": "4051420006041115", "expiry_date": "1231", "security_code": "123", "card_holder": { "first_name": "Pedro", "last_name": "Miranda", "email": "pedro@pay-me.com", "phone": { "prefix": "51", "number": "999835685" } }, "installments": { "plan": "01", "number": "3" } } }, "payment_details": { "amount": "15000", "currency": "604", "billing": { "first_name": "Pedro", "last_name": "Miranda", "email": "pedro@pay-me.com", "phone": { "country_code": "+51", "subscriber": "999835685" }, "location": { "line_1": "Av. Casimiro Ulloa 333", "line_2": "Miraflores", "city": "Lima", "state": "Lima", "country": "Peru" } }, "shipping": { "first_name": "Pedro", "last_name": "Miranda", "email": "pedro@pay-me.com", "phone": { "country_code": "+51", "subscriber": "999835685" }, "location": { "line_1": "Av. Casimiro Ulloa 333", "line_2": "Miraflores", "city": "Lima", "state": "Lima", "country": "Peru" } }, "customer": { "first_name": "Pedro", "last_name": "Miranda", "email": "pedro@pay-me.com", "phone": { "country_code": "+51", "subscriber": "999835685" }, "location": { "line_1": "Av. Casimiro Ulloa 333", "line_2": "Miraflores", "city": "Lima", "state": "Lima", "country": "Peru" } }, "product_details": [] } } ``` *** ### Ejemplo 2: con autenticación Redirect ```json theme={"system"} { "action": "authorize", "channel": "ecommerce", "merchant_code": "your_merchant_code", "merchant_operation_number": "2391645", "payment_method": { "method_name": "CARD", "method_details": { "pan": "4051420006041115", "expiry_date": "1231", "security_code": "123", "card_holder": { "first_name": "Pedro", "last_name": "Miranda", "email": "pedro@pay-me.com", "phone": { "prefix": "51", "number": "999835685" } }, "redirect_url": "https://pay-me.com", "callback_url": "https://pay-me.com/callback", "installments": { "plan": "01", "number": "3" } } }, "payment_details": { "amount": "15000", "currency": "604", "billing": { "first_name": "Pedro", "last_name": "Miranda", "email": "pedro@pay-me.com", "phone": { "country_code": "+51", "subscriber": "999835685" }, "location": { "line_1": "Av. Casimiro Ulloa 333", "line_2": "Miraflores", "city": "Lima", "state": "Lima", "country": "Peru" } }, "shipping": { "first_name": "Pedro", "last_name": "Miranda", "email": "pedro@pay-me.com", "phone": { "country_code": "+51", "subscriber": "999835685" }, "location": { "line_1": "Av. Casimiro Ulloa 333", "line_2": "Miraflores", "city": "Lima", "state": "Lima", "country": "Peru" } }, "customer": { "first_name": "Pedro", "last_name": "Miranda", "email": "pedro@pay-me.com", "phone": { "country_code": "+51", "subscriber": "999835685" }, "location": { "line_1": "Av. Casimiro Ulloa 333", "line_2": "Miraflores", "city": "Lima", "state": "Lima", "country": "Peru" } }, "product_details": [] } } ``` Para recibir el resultado final en flujos con autenticación Redirect, revisa las [Consideraciones para métodos con Redirect](/payin/autorizacion-metodos-con-redirect). *** ### Ejemplo 3: con datos de autenticación 3DS previos ```json theme={"system"} { "action": "authorize", "channel": "ecommerce", "merchant_code": "your_merchant_code", "merchant_operation_number": "2391645", "payment_method": { "method_name": "CARD", "method_details": { "pan": "4051420006041115", "expiry_date": "1231", "security_code": "123", "card_holder": { "first_name": "Pedro", "last_name": "Miranda", "email": "pedro@pay-me.com", "phone": { "prefix": "51", "number": "999835685" } }, "authentication_result": { "3ds_secure": { "version": "2.1.0", "electronic_commerce_indicator": "05", "cardholder_authentication_verification_value": "AJkBB5NBeQAAAD3MYENQdAAAAAA=", "ds_transaction_id": "ABC123", "three_ds_server_transaction_id": "ABC123", "trans_status": "Y" } }, "installments": { "plan": "01", "number": "3" } } }, "payment_details": { "amount": "15000", "currency": "604", "billing": { "first_name": "Pedro", "last_name": "Miranda", "email": "pedro@pay-me.com", "phone": { "country_code": "+51", "subscriber": "999835685" }, "location": { "line_1": "Av. Casimiro Ulloa 333", "line_2": "Miraflores", "city": "Lima", "state": "Lima", "country": "Peru" } }, "shipping": { "first_name": "Pedro", "last_name": "Miranda", "email": "pedro@pay-me.com", "phone": { "country_code": "+51", "subscriber": "999835685" }, "location": { "line_1": "Av. Casimiro Ulloa 333", "line_2": "Miraflores", "city": "Lima", "state": "Lima", "country": "Peru" } }, "customer": { "first_name": "Pedro", "last_name": "Miranda", "email": "pedro@pay-me.com", "phone": { "country_code": "+51", "subscriber": "999835685" }, "location": { "line_1": "Av. Casimiro Ulloa 333", "line_2": "Miraflores", "city": "Lima", "state": "Lima", "country": "Peru" } }, "product_details": [] } } ``` *** ## Response ### Objeto `transaction` | Campo | Descripción | Ejemplo | Tipo | Obligatorio | | :- | :- | :- | :- | :- | | `transaction_id` | Identificador único de la transacción | `5hk8rwa3h3cq9oyfs3a28v1ms` | String | SI | | `channel` | Canal de la transacción | `ecommerce` | String | SI | | `state` | Estado actual de la transacción | `AUTORIZADO` | String | SI | | `state_reason` | Motivo o descripción del estado actual | `Approval and completed successfully` | String | SI | | `amount` | Monto de la transacción | `15000` | String | SI | | `currency` | Código de moneda | `604` | String | SI | | `payment_method` | Objeto con información del método de pago | Object | Object | SI | | `continue_url` | URL para continuar el proceso de autenticación | `https://api.dev.alignet.io/payment/continue/card/...` | String | NO | | `expiration_date` | Fecha de expiración de la transacción | Object | Object | NO | | `processor_response` | Resultado devuelto por la procesadora | Object | Object | NO | | `authentication_result` | Resultado de autenticación aplicado a la transacción | Object | Object | NO | | `risk_evaluation` | Resultado de evaluación antifraude | Object | Object | NO | | `additional_fields` | Datos adicionales enviados en el request | Object | Object | NO | | `lifecycle` | Historial de estados de la transacción | Array | Array | SI | `continue_url` y `expiration_date` se muestran cuando la transacción queda en estado `PENDIENTE`. No uses `meta.status.code` como validador de autorización o denegación del pago. Ese código solo indica si el servicio procesó o respondió correctamente; el resultado del pago se valida con `transaction.state` y, como respaldo, desde backend con consulta o notificación. *** ### Objeto `transaction.payment_method` | Campo | Descripción | Ejemplo | Tipo | Obligatorio | | :- | :- | :- | :- | :- | | `method_name` | Método de pago utilizado | `CARD` | String | SI | | `method_details` | Objeto con información detallada del método | Object | Object | NO | *** ### Objeto `transaction.payment_method.method_details` | Campo | Descripción | Ejemplo | Tipo | Obligatorio | | :- | :- | :- | :- | :- | | `masked_pan` | Tarjeta enmascarada | `411111********1111` | String | NO | | `brand` | Marca de la tarjeta | `VISA` | String | NO | | `bin` | BIN de la tarjeta | `411111` | String | NO | | `last_pan` | Últimos dígitos de la tarjeta | `9268` | String | NO | | `card_type` | Tipo de tarjeta | `DEBIT` | String | NO | | `card_country` | País de la tarjeta | `PE` | String | NO | | `issuer` | Banco emisor | `BANCO DE CREDITO DEL PERU - BCP` | String | NO | | `installments` | Información de plan y cuotas | Object | Object | NO | | `redirect_url` | URL de retorno enviada en el request | `https://pay-me.com` | String | NO | | `callback_url` | URL de callback enviada en el request | `https://pay-me.com/callback` | String | NO | *** ### Objeto `transaction.payment_method.method_details.installments` | Campo | Descripción | Ejemplo | Tipo | Obligatorio | | :- | :- | :- | :- | :- | | `plan` | Plan aplicado a la transacción | `NORMAL` | String | NO | | `installment_number` | Número de cuotas | `2` | String | NO | *** ### Objeto `transaction.expiration_date` | Campo | Descripción | Ejemplo | Tipo | Obligatorio | | :- | :- | :- | :- | :- | | `utc_time` | Fecha de expiración en UTC | `2024-03-12T22:49:36.018Z` | String | NO | | `unix_time` | Fecha de expiración en unix time | `1710282940` | Integer | NO | *** ### Objeto `transaction.processor_response` | Campo | Descripción | Ejemplo | Tipo | Obligatorio | | :- | :- | :- | :- | :- | | `authorization_code` | Código de autorización | `055552` | String | NO | | `brand_transaction_id` | ID de la transacción ante la marca | `100B` | String | NO | | `result_message` | Mensaje del resultado de autorización | Object | Object | NO | *** ### Objeto `transaction.processor_response.result_message` | Campo | Descripción | Ejemplo | Tipo | Obligatorio | | :- | :- | :- | :- | :- | | `code` | Código del resultado | `00` | String | NO | | `description` | Descripción del resultado | `Approval and completed successfully` | String | NO | *** ### Objeto `transaction.authentication_result` | Campo | Descripción | Ejemplo | Tipo | Obligatorio | | :- | :- | :- | :- | :- | | `version` | Versión del protocolo de autenticación | `2.1.0` | String | NO | | `eci` | Electronic Commerce Indicator | `05` | String | NO | | `ds_transaction_id` | DS Transaction ID | `ABC123` | String | NO | | `3ds_transaction_id` | 3DS Server Transaction ID | `ABC123` | String | NO | | `trans_status` | Estado del resultado de autenticación | `A` | String | NO | *** ### Objeto `transaction.lifecycle` | Campo | Descripción | Ejemplo | Tipo | Obligatorio | | :- | :- | :- | :- | :- | | `state` | Estado registrado en el historial | `AUTORIZADO` | String | SI | | `date` | Fecha del cambio de estado | Object | Object | SI | *** ### Objeto `transaction.lifecycle[].date` | Campo | Descripción | Ejemplo | Tipo | Obligatorio | | :- | :- | :- | :- | :- | | `utc_time` | Fecha en UTC | `2024-03-12T22:49:36.018Z` | String | SI | | `unix_time` | Fecha en unix time | `1710282940` | Integer | SI | *** ### Ejemplo 1: sin autenticación ```json theme={"system"} { "success": "true", "action": "authorize", "merchant_code": "your_merchant_code", "merchant_operation_number": "2391645", "transaction": { "transaction_id": "5hk8rwa3h3cq9oyfs3a28v1ms", "channel": "ecommerce", "state": "AUTORIZADO", "state_reason": "Approval and completed successfully", "amount": "15000", "currency": "604", "payment_method": { "method_name": "CARD", "method_details": { "masked_pan": "411111********1111", "brand": "VISA", "bin": "411111", "last_pan": "9268", "card_type": "DEBIT", "card_country": "PE", "issuer": "BANCO DE CREDITO DEL PERU - BCP", "installments": { "plan": "NORMAL", "installment_number": "2" } } }, "processor_response": { "authorization_code": "055552", "brand_transaction_id": "100B", "result_message": { "code": "00", "description": "Approval and completed successfully" } }, "additional_fields": null, "lifecycle": [ { "state": "REGISTRADO", "date": { "utc_time": "2024-03-12T22:49:36.018Z", "unix_time": 1710282940 } }, { "state": "PENDIENTE", "date": { "utc_time": "2024-03-12T22:49:36.018Z", "unix_time": 1710282940 } }, { "state": "AUTORIZADO", "date": { "utc_time": "2024-03-12T22:49:36.018Z", "unix_time": 1710282940 } } ] }, "meta": { "status": { "code": "00", "message_ilgn": [ { "locale": "es_PE", "value": "Procesado correctamente" } ] } } } ``` *** ### Ejemplo 2: con autenticación Redirect ```json theme={"system"} { "success": "true", "action": "authorize", "merchant_code": "your_merchant_code", "merchant_operation_number": "2391645", "transaction": { "transaction_id": "5hk8rwa3h3cq9oyfs3a28v1ms", "channel": "ecommerce", "state": "PENDIENTE", "state_reason": "Url generada para continuar con la Autenticacion", "continue_url": "https://api.dev.alignet.io/payment/continue/card/81vrxn30vja1gwcfsdng4i5g5", "amount": "15000", "currency": "604", "payment_method": { "method_name": "CARD", "method_details": { "masked_pan": "411111********1111", "brand": "VISA", "bin": "411111", "last_pan": "9268", "card_type": "DEBIT", "card_country": "PE", "issuer": "BANCO DE CREDITO DEL PERU - BCP", "installments": { "plan": "NORMAL", "installment_number": "2" }, "redirect_url": "https://pay-me.com", "callback_url": "https://pay-me.com/callback" } }, "processor_response": { "authorization_code": "055552", "brand_transaction_id": "100B", "result_message": { "code": "00", "description": "Approval and completed successfully" } }, "additional_fields": null, "lifecycle": [ { "state": "REGISTRADO", "date": { "utc_time": "2024-03-12T22:49:36.018Z", "unix_time": 1710282940 } }, { "state": "PENDIENTE", "date": { "utc_time": "2024-03-12T22:49:36.018Z", "unix_time": 1710282940 } } ] }, "meta": { "status": { "code": "00", "message_ilgn": [ { "locale": "es_PE", "value": "Procesado correctamente" } ] } } } ``` *** ### Ejemplo 3: con datos de autenticación 3DS previos ```json theme={"system"} { "success": "true", "action": "authorize", "merchant_code": "your_merchant_code", "merchant_operation_number": "2391645", "transaction": { "transaction_id": "5hk8rwa3h3cq9oyfs3a28v1ms", "channel": "ecommerce", "state": "AUTORIZADO", "state_reason": "Approval and completed successfully", "amount": "15000", "currency": "604", "payment_method": { "method_name": "CARD", "method_details": { "masked_pan": "411111********1111", "brand": "VISA", "bin": "411111", "last_pan": "9268", "card_type": "DEBIT", "card_country": "PE", "issuer": "BANCO DE CREDITO DEL PERU - BCP", "installments": { "plan": "NORMAL", "installment_number": "2" } } }, "processor_response": { "authorization_code": "055552", "brand_transaction_id": "100B", "result_message": { "code": "00", "description": "Approval and completed successfully" } }, "additional_fields": null, "authentication_result": { "version": "2.1.0", "eci": "05", "ds_transaction_id": "", "3ds_transaction_id": "", "trans_status": "A" }, "lifecycle": [ { "state": "REGISTRADO", "date": { "utc_time": "2024-03-12T22:49:36.018Z", "unix_time": 1710282940 } }, { "state": "PENDIENTE", "date": { "utc_time": "2024-03-12T22:49:36.018Z", "unix_time": 1710282940 } }, { "state": "AUTORIZADO", "date": { "utc_time": "2024-03-12T22:49:36.018Z", "unix_time": 1710282940 } } ] }, "meta": { "status": { "code": "00", "message_ilgn": [ { "locale": "es_PE", "value": "Procesado correctamente" } ] } } } ``` *** ## Buenas prácticas * Valida siempre el resultado desde backend. * Usa autenticación 3DS cuando aplique a tu modelo de riesgo o configuración. * No expongas PAN, CVV ni datos sensibles en frontend o logs. * Enmascara siempre la información sensible en observabilidad y soporte. * Revisa el estado final de la operación antes de tomar acciones de negocio. *** ## Errores comunes No envíes ni almacenes PAN, CVV o datos sensibles en frontend, logs o herramientas sin protección. No tomes decisiones de negocio confiando únicamente en validaciones del lado cliente o en estados no confirmados. *** ## Siguiente paso Revisa cómo consultar el estado de una operación. # API de Autorización con Transferencia Bancaria Source: https://docs.pay-me.com/payin/autorizacion-transferencia-bancaria Inicia pagos con transferencia bancaria desde el API de autorización de PayIn. Usa este flujo para iniciar pagos ecommerce con transferencia bancaria desde el API de autorización de PayIn. Este flujo utiliza el mismo endpoint base de autorización. Revisa los ambientes y la configuración general en el [Overview](/payin/autorizacion). *** ## Características del flujo Asíncrono. Permite iniciar cobros ecommerce con transferencia bancaria. El usuario continúa el pago fuera de tu checkout. El resultado final debe confirmarse por backend con notificación o consulta. *** ## Consideraciones Este flujo requiere `redirect_url` para retornar al comercio cuando finalice la autorización y permite enviar `callback_url` para notificación host to host. Si trabajas con redirect, revisa también las [Consideraciones para métodos con Redirect](/payin/autorizacion-metodos-con-redirect). No tomes como final la respuesta inicial del `POST /charges`. Confirma el resultado con [Notificaciones](/payin/notificaciones) o con [Consulta](/payin/consulta-transferencia-bancaria). *** ## Request Antes de consumir este endpoint, solicita tu `Access Token` en [Autenticación](/autenticacion#param-post-token). ### Headers | Campo | Descripción | Valor | Tipo | Obligatorio | | :- | :- | :- | :- | :- | | `Authorization` | Token Bearer obtenido desde autenticación | `Bearer {access_token}` | String | SI | | `Content-Type` | Formato del request | `application/json` | String | SI | | `ALG-API-VERSION` | Versión del API | `1709847567` | String | SI | ```bash theme={"system"} Authorization: Bearer {access_token} Content-Type: application/json ALG-API-VERSION: 1709847567 ``` *** ### Body #### Objeto raíz del request | Campo | Descripción | Ejemplo | Tipo | Obligatorio | | :- | :- | :- | :- | :- | | `action` | Acción a ejecutar | `authorize` | String | SI | | `channel` | Canal de la operación | `ecommerce` | String | SI | | `merchant_code` | Código del comercio | `your_merchant_code` | String | SI | | `merchant_operation_number` | Identificador único de la operación en el comercio. **Debe ser diferente en cada transacción.** | `5974483` | String | SI | | `payment_method` | Objeto con la información del método de pago | Object | Object | SI | | `payment_details` | Objeto con el detalle del pago y datos del cliente | Object | Object | SI | *** #### Objeto `payment_method` | Campo | Descripción | Ejemplo | Tipo | Obligatorio | | :- | :- | :- | :- | :- | | `method_name` | Nombre del método de pago | `BANK_TRANSFER` | String | SI | | `method_details` | Objeto con la información específica de la transferencia bancaria | Object | Object | SI | *** #### Objeto `payment_method.method_details` | Campo | Descripción | Ejemplo | Tipo | Obligatorio | | :- | :- | :- | :- | :- | | `redirect_url` | URL donde se realizará el redirect cuando finalice la autorización | `https://pay-me.com` | String | SI | | `callback_url` | URL donde se realizará la notificación host to host (server to server) | `https://pay-me.com/callback` | String | NO | `redirect_url` debe apuntar a una ruta de tu comercio preparada para recibir el retorno del usuario. Si envías `callback_url`, asegúrate de que sea accesible desde backend. *** #### Objeto `payment_details` | Campo | Descripción | Ejemplo | Tipo | Obligatorio | | :- | :- | :- | :- | :- | | `amount` | Monto de la operación en centavos | `15000` | String | SI | | `currency` | Código de la moneda | `604` | String | SI | | `billing` | Datos de facturación | Object | Object | SI | | `shipping` | Datos de envío | Object | Object | SI | | `customer` | Datos del cliente | Object | Object | SI | | `product_details` | Lista de productos asociados a la operación | `[]` | Array | SI | Para `billing`, `shipping` y `customer`, usa la estructura ecommerce estándar con `first_name`, `last_name`, `email`, `phone` y `location`. *** ### Ejemplo de request ```json theme={"system"} { "action": "authorize", "channel": "ecommerce", "merchant_code": "your_merchant_code", "merchant_operation_number": "5974483", "payment_method": { "method_name": "BANK_TRANSFER", "method_details": { "redirect_url": "https://pay-me.com", "callback_url": "https://pay-me.com/callback" } }, "payment_details": { "amount": "15000", "currency": "604", "billing": { "first_name": "Pedro", "last_name": "Miranda", "email": "pedro@pay-me.com", "phone": { "country_code": "+51", "subscriber": "999835685" }, "location": { "line_1": "Av. Casimiro Ulloa 333", "line_2": "Miraflores", "city": "Lima", "state": "Lima", "country": "Peru" } }, "shipping": { "first_name": "Pedro", "last_name": "Miranda", "email": "pedro@pay-me.com", "phone": { "country_code": "+51", "subscriber": "999835685" }, "location": { "line_1": "Av. Casimiro Ulloa 333", "line_2": "Miraflores", "city": "Lima", "state": "Lima", "country": "Peru" } }, "customer": { "first_name": "Pedro", "last_name": "Miranda", "email": "pedro@pay-me.com", "phone": { "country_code": "+51", "subscriber": "999835685" }, "location": { "line_1": "Av. Casimiro Ulloa 333", "line_2": "Miraflores", "city": "Lima", "state": "Lima", "country": "Peru" } }, "product_details": [] } } ``` *** ## Response Para recibir la respuesta final de una autorización con redirect, toma en cuenta las [Consideraciones para métodos con Redirect](/payin/autorizacion-metodos-con-redirect). La respuesta inicial normalmente deja la transacción en seguimiento. ### Objeto `transaction` | Campo | Descripción | Ejemplo | Tipo | Obligatorio | | :- | :- | :- | :- | :- | | `transaction_id` | Identificador único de la transacción | `5hk8rwa3h3cq9oyfs3a28v1ms` | String | SI | | `channel` | Canal por el cual se realizó la transacción | `ecommerce` | String | SI | | `state` | Estado actual de la transacción | `PENDIENTE` | String | SI | | `state_reason` | Observación o descripción del estado actual | `Url generada para continuar con el pago` | String | SI | | `continue_url` | URL para continuar el flujo del pago fuera del checkout | `https://api.dev.alignet.io/payment/continue/card/81vrxn30vja1gwcfsdng4i5g5` | String | NO | | `amount` | Monto de la transacción | `15000` | String | SI | | `currency` | Código de la moneda de la operación | `604` | String | SI | | `payment_method` | Objeto con información del método de pago usado en la transacción | Object | Object | SI | | `expiration_date` | Fecha en la que expirará la transacción | Object | Object | NO | | `additional_fields` | Datos adicionales enviados en el request | Object | Object | NO | | `lifecycle` | Historial de estados por los que pasó la transacción | Array | Array | SI | `state` puede devolver valores como `PENDIENTE` o `INVALIDO`. `continue_url` y `expiration_date` suelen estar presentes cuando la transacción queda en estado `PENDIENTE`. No uses `meta.status.code` como validador de autorización o denegación del pago. Ese código solo indica si el servicio procesó o respondió correctamente; el resultado del pago se valida con `transaction.state` y, como respaldo, desde backend con consulta o notificación. *** ### Objeto `transaction.payment_method` | Campo | Descripción | Ejemplo | Tipo | Obligatorio | | :- | :- | :- | :- | :- | | `method_name` | Nombre del método de pago usado en la transacción | `BANK_TRANSFER` | String | SI | | `method_details` | Objeto que contiene el detalle del método de pago usado en la transacción | Object | Object | SI | *** ### Objeto `transaction.payment_method.method_details` | Campo | Descripción | Ejemplo | Tipo | Obligatorio | | :- | :- | :- | :- | :- | | `redirect_url` | URL donde se realizará el redirect cuando finalice la autorización | `https://pay-me.com` | String | SI | | `callback_url` | URL donde se realizará la notificación host to host (server to server) | `https://pay-me.com/callback` | String | NO | *** ### Objeto `transaction.expiration_date` | Campo | Descripción | Ejemplo | Tipo | Obligatorio | | :- | :- | :- | :- | :- | | `utc_time` | Fecha de expiración en UTC | `2024-03-12T22:49:36.018Z` | String | NO | | `unix_time` | Fecha de expiración en unix time | `1711585037` | Integer | NO | *** ### Objeto `transaction.lifecycle` | Campo | Descripción | Ejemplo | Tipo | Obligatorio | | :- | :- | :- | :- | :- | | `state` | Estado registrado en el historial | `PENDIENTE` | String | SI | | `date` | Fecha del cambio de estado | Object | Object | SI | En `lifecycle` puedes recibir estados como `REGISTRADO`, `PENDIENTE` e `INVALIDO`. *** ### Objeto `transaction.lifecycle[].date` | Campo | Descripción | Ejemplo | Tipo | Obligatorio | | :- | :- | :- | :- | :- | | `utc_time` | Fecha en UTC | `2024-03-12T22:49:36.018Z` | String | SI | | `unix_time` | Fecha en unix time | `1710282940` | Integer | SI | *** ### Ejemplo de response ```json theme={"system"} { "success": "true", "action": "authorize", "merchant_code": "your_merchant_code", "merchant_operation_number": "2391645", "transaction": { "transaction_id": "5hk8rwa3h3cq9oyfs3a28v1ms", "channel": "ecommerce", "state": "PENDIENTE", "state_reason": "Url generada para continuar con el pago", "continue_url": "https://api.dev.alignet.io/payment/continue/card/81vrxn30vja1gwcfsdng4i5g5", "amount": "15000", "currency": "604", "payment_method": { "method_name": "BANK_TRANSFER", "method_details": { "redirect_url": "https://pay-me.com", "callback_url": "https://pay-me.com/callback" } }, "expiration_date": { "utc_time": "2024-03-12T22:49:36.018Z", "unix_time": 1711585037 }, "processor_response": null, "additional_fields": null, "lifecycle": [ { "state": "REGISTRADO", "date": { "utc_time": "2024-03-12T22:49:36.018Z", "unix_time": 1710282940 } }, { "state": "PENDIENTE", "date": { "utc_time": "2024-03-12T22:49:36.018Z", "unix_time": 1710282940 } } ] }, "meta": { "status": { "code": "00", "message_ilgn": [ { "locale": "es_PE", "value": "Procesado correctamente" } ] } } } ``` *** ## Buenas prácticas * Confirma el resultado final por backend antes de actualizar la orden. * Asegúrate de enviar un `merchant_operation_number` único por transacción. * Implementa el manejo del retorno del usuario a `redirect_url` sin asumir que el pago terminó correctamente. * Usa `callback_url` si tu operación necesita confirmación server to server. * Conserva `transaction_id`, `merchant_operation_number` y `continue_url` para seguimiento, soporte y conciliación. *** ## Errores comunes No marques una orden como pagada solo porque el usuario regresó a tu sitio o porque recibiste una respuesta inicial `PENDIENTE`. Si `redirect_url` no está correctamente implementado, el usuario puede completar el flujo bancario sin que tu comercio procese bien el retorno. *** ## Siguiente paso Verifica cómo consultar el estado de una operación por transferencia bancaria. # API de Autorización con Yape Source: https://docs.pay-me.com/payin/autorizacion-yape Inicia cobros con Yape usando el API de autorización de PayIn. Usa este flujo para procesar pagos ecommerce con Yape desde el API de autorización de PayIn. Este flujo utiliza el mismo endpoint base de autorización. Revisa los ambientes y la configuración general en el [Overview](/payin/autorizacion). *** ## Características del flujo Síncrono. Permite procesar cobros ecommerce con billetera Yape. La confirmación del resultado debe realizarse desde backend. Puedes enviar un `callback_url` para recibir una notificación host to host. *** ## Consideraciones Este flujo requiere el número celular afiliado a Yape y el código OTP generado por la billetera. Si necesitas consultar el estado de una operación luego de autorizarla, revisa el [API de Consulta con Yape](/payin/consulta-yape). No marques una orden como pagada solo con validaciones del frontend. Usa la respuesta backend o la consulta posterior para confirmar el estado final. *** ## Request Antes de consumir este endpoint, solicita tu `Access Token` en [Autenticación](/autenticacion#param-post-token). ### Headers | Campo | Descripción | Valor | Tipo | Obligatorio | | :- | :- | :- | :- | :- | | `Authorization` | Token Bearer obtenido desde autenticación | `Bearer {access_token}` | String | SI | | `Content-Type` | Formato del request | `application/json` | String | SI | | `ALG-API-VERSION` | Versión del API | `1709847567` | String | SI | ```bash theme={"system"} Authorization: Bearer {access_token} Content-Type: application/json ALG-API-VERSION: 1709847567 ``` *** ### Body #### Objeto raíz del request | Campo | Descripción | Ejemplo | Tipo | Obligatorio | | :- | :- | :- | :- | :- | | `action` | Acción a ejecutar | `authorize` | String | SI | | `channel` | Canal de la operación | `ecommerce` | String | SI | | `merchant_code` | Código del comercio | `your_merchant_code` | String | SI | | `merchant_operation_number` | Identificador único de la operación en el comercio. **Debe ser diferente en cada transacción.** | `5974484` | String | SI | | `payment_method` | Objeto con la información del método de pago | Object | Object | SI | | `payment_details` | Objeto con el detalle del pago y datos del cliente | Object | Object | SI | *** #### Objeto `payment_method` | Campo | Descripción | Ejemplo | Tipo | Obligatorio | | :- | :- | :- | :- | :- | | `method_name` | Nombre del método de pago | `YAPE` | String | SI | | `method_details` | Objeto con la información específica del pago con Yape | Object | Object | SI | *** #### Objeto `payment_method.method_details` | Campo | Descripción | Ejemplo | Tipo | Obligatorio | | :- | :- | :- | :- | :- | | `callback_url` | URL donde se realizará la notificación host to host (server to server) | `https://pay-me.com/callback` | String | NO | | `phone` | Objeto con la información del titular de Yape | Object | Object | SI | | `otp` | Código OTP de la billetera Yape | `557454` | String | SI | Si envías `callback_url`, asegúrate de que sea una URL backend accesible para recibir confirmaciones server to server. *** #### Objeto `payment_method.method_details.phone` | Campo | Descripción | Ejemplo | Tipo | Obligatorio | | :- | :- | :- | :- | :- | | `country_code` | Código del país del teléfono | `+51` | String | SI | | `subscriber` | Número del teléfono | `969929157` | String | SI | *** #### Objeto `payment_details` | Campo | Descripción | Ejemplo | Tipo | Obligatorio | | :- | :- | :- | :- | :- | | `amount` | Monto de la operación en centavos | `15000` | String | SI | | `currency` | Código de la moneda | `604` | String | SI | | `billing` | Datos de facturación | Object | Object | SI | | `shipping` | Datos de envío | Object | Object | SI | | `customer` | Datos del cliente | Object | Object | SI | | `product_details` | Lista de productos asociados a la operación | `[]` | Array | SI | Para `billing`, `shipping` y `customer`, usa la estructura ecommerce estándar con `first_name`, `last_name`, `email`, `phone` y `location`. *** ### Ejemplo de request ```json theme={"system"} { "action": "authorize", "channel": "ecommerce", "merchant_code": "your_merchant_code", "merchant_operation_number": "5974484", "payment_method": { "method_name": "YAPE", "method_details": { "callback_url": "https://pay-me.com/callback", "phone": { "country_code": "+51", "subscriber": "969929157" }, "otp": "557454" } }, "payment_details": { "amount": "15000", "currency": "604", "billing": { "first_name": "Pedro", "last_name": "Miranda", "email": "pedro@pay-me.com", "phone": { "country_code": "+51", "subscriber": "999835685" }, "location": { "line_1": "Av. Casimiro Ulloa 333", "line_2": "Miraflores", "city": "Lima", "state": "Lima", "country": "Peru" } }, "shipping": { "first_name": "Pedro", "last_name": "Miranda", "email": "pedro@pay-me.com", "phone": { "country_code": "+51", "subscriber": "999835685" }, "location": { "line_1": "Av. Casimiro Ulloa 333", "line_2": "Miraflores", "city": "Lima", "state": "Lima", "country": "Peru" } }, "customer": { "first_name": "Pedro", "last_name": "Miranda", "email": "pedro@pay-me.com", "phone": { "country_code": "+51", "subscriber": "999835685" }, "location": { "line_1": "Av. Casimiro Ulloa 333", "line_2": "Miraflores", "city": "Lima", "state": "Lima", "country": "Peru" } }, "product_details": [] } } ``` *** ## Response ### Objeto `transaction` | Campo | Descripción | Ejemplo | Tipo | Obligatorio | | :- | :- | :- | :- | :- | | `transaction_id` | Identificador único de la transacción | `5hk8rwa3h3cq9oyfs3a28v1ms` | String | SI | | `channel` | Canal por el cual se realizó la transacción | `ecommerce` | String | SI | | `state` | Estado actual de la transacción | `AUTORIZADO` | String | SI | | `state_reason` | Observación o descripción del estado actual | `Pago exitoso con Yape` | String | SI | | `amount` | Monto de la transacción | `15000` | String | SI | | `currency` | Código de la moneda de la operación | `604` | String | SI | | `payment_method` | Objeto con información del método de pago usado en la transacción | Object | Object | SI | | `processor_response` | Resultado devuelto por la procesadora | Object | Object | NO | | `additional_fields` | Datos adicionales enviados en el request | Object | Object | NO | | `lifecycle` | Historial de estados por los que pasó la transacción | Array | Array | SI | `state` puede devolver valores como `AUTORIZADO`, `DENEGADO` o `INVALIDO`, según el resultado de la autorización. En el historial `lifecycle` también pueden aparecer estados intermedios como `REGISTRADO` o `PENDIENTE`. No uses `meta.status.code` como validador de autorización o denegación del pago. Ese código solo indica si el servicio procesó o respondió correctamente; el resultado del pago se valida con `transaction.state` y, como respaldo, desde backend con consulta o notificación. *** ### Objeto `transaction.payment_method` | Campo | Descripción | Ejemplo | Tipo | Obligatorio | | :- | :- | :- | :- | :- | | `method_name` | Nombre del método de pago usado en la transacción | `YAPE` | String | SI | | `method_details` | Objeto con información detallada relacionada al método | Object | Object | SI | *** ### Objeto `transaction.payment_method.method_details` | Campo | Descripción | Ejemplo | Tipo | Obligatorio | | :- | :- | :- | :- | :- | | `phone` | Objeto con la información del teléfono del cliente Yape | Object | Object | SI | | `masked_pan` | Tarjeta enmascarada usada en la transacción | `411111********1111` | String | NO | | `brand` | Marca de la tarjeta usada en la transacción | `VISA` | String | NO | | `bin` | BIN de la tarjeta usada en la transacción | `411111` | String | NO | | `last_pan` | Últimos 4 dígitos de la tarjeta usada en la transacción | `9268` | String | NO | | `card_type` | Tipo de tarjeta | `DEBIT` | String | NO | | `card_country` | País de la tarjeta | `PE` | String | NO | | `issuer` | Banco emisor de la tarjeta | `BANCO DE CREDITO DEL PERU - BCP` | String | NO | *** ### Objeto `transaction.payment_method.method_details.phone` | Campo | Descripción | Ejemplo | Tipo | Obligatorio | | :- | :- | :- | :- | :- | | `country_code` | Código del país del teléfono de Yape | `+51` | String | SI | | `subscriber` | Número de teléfono de Yape | `969929157` | String | SI | *** ### Objeto `transaction.processor_response` | Campo | Descripción | Ejemplo | Tipo | Obligatorio | | :- | :- | :- | :- | :- | | `authorization_code` | Código de autorización | `055552` | String | NO | | `brand_transaction_id` | ID de la transacción ante la marca | `100B` | String | NO | | `result_message` | Mensaje del resultado de la autorización | Object | Object | NO | Este objeto puede mostrarse cuando la transacción llega a estados como `AUTORIZADO`, `DENEGADO` o `EXTORNADO`. *** ### Objeto `transaction.processor_response.result_message` | Campo | Descripción | Ejemplo | Tipo | Obligatorio | | :- | :- | :- | :- | :- | | `code` | Código del resultado de la autorización | `00` | String | NO | | `description` | Descripción del resultado de la autorización | `Approval and completed successfully` | String | NO | *** ### Objeto `transaction.lifecycle` | Campo | Descripción | Ejemplo | Tipo | Obligatorio | | :- | :- | :- | :- | :- | | `state` | Estado registrado en el historial | `AUTORIZADO` | String | SI | | `date` | Fecha del cambio de estado | Object | Object | SI | En `lifecycle` puedes recibir estados intermedios como `REGISTRADO` o `PENDIENTE` antes del resultado final. *** ### Objeto `transaction.lifecycle[].date` | Campo | Descripción | Ejemplo | Tipo | Obligatorio | | :- | :- | :- | :- | :- | | `utc_time` | Fecha en UTC | `2024-03-12T22:49:36.018Z` | String | SI | | `unix_time` | Fecha en unix time | `1710282940` | Integer | SI | *** ### Ejemplo de response ```json theme={"system"} { "success": "true", "action": "authorize", "merchant_code": "your_merchant_code", "merchant_operation_number": "2391645", "transaction": { "transaction_id": "5hk8rwa3h3cq9oyfs3a28v1ms", "channel": "ecommerce", "state": "AUTORIZADO", "state_reason": "Pago exitoso con Yape", "amount": "15000", "currency": "604", "payment_method": { "method_name": "YAPE", "method_details": { "phone": { "country_code": "+51", "subscriber": "969929157" }, "masked_pan": "411111********1111", "brand": "VISA", "bin": "411111", "last_pan": "9268", "card_type": "DEBIT", "card_country": "PE", "issuer": "BANCO DE CREDITO DEL PERU - BCP" } }, "processor_response": { "authorization_code": "055552", "brand_transaction_id": "100B", "result_message": { "code": "00", "description": "Approval and completed successfully" } }, "additional_fields": null, "lifecycle": [ { "state": "REGISTRADO", "date": { "utc_time": "2024-03-12T22:49:36.018Z", "unix_time": 1710282940 } }, { "state": "PENDIENTE", "date": { "utc_time": "2024-03-12T22:49:36.018Z", "unix_time": 1710282940 } }, { "state": "AUTORIZADO", "date": { "utc_time": "2024-03-12T22:49:36.018Z", "unix_time": 1710282940 } } ] }, "meta": { "status": { "code": "00", "message_ilgn": [ { "locale": "es_PE", "value": "Procesado correctamente" } ] } } } ``` *** ## Buenas prácticas * Valida siempre el resultado desde backend. * Asegúrate de enviar un `merchant_operation_number` único por transacción. * Verifica que el `otp` corresponda al número Yape enviado en `phone`. * Usa `callback_url` si tu operación necesita confirmación server to server. * No asumas que los campos opcionales de tarjeta dentro de `transaction.payment_method.method_details` siempre estarán presentes. * Conserva `transaction_id` y `merchant_operation_number` para soporte y conciliación. *** ## Errores comunes Si el OTP no corresponde al intento de pago vigente, la transacción puede ser rechazada o marcada como inválida. No tomes decisiones de negocio basándote solo en la interacción del usuario; confirma siempre el estado final desde backend. *** ## Siguiente paso Revisa cómo consultar el estado de una operación procesada con Yape. # API de Cancelación Source: https://docs.pay-me.com/payin/cancelacion Cancela o extorna una transacción generada previamente por el API de autorización ecommerce. El API de Cancelación permite cancelar una transacción generada previamente por el API de Autorización para ecommerce. Con el método `DELETE` del orquestador, las transacciones se pueden cancelar o extornar según el estado en el que se encuentren. [https://api.preprod.alignet.io/charges/\{merchant\_code}/\{merchant\_operation\_number}](https://api.preprod.alignet.io/charges/\{merchant_code}/\{merchant_operation_number}) [https://api.alignet.io/charges/\{merchant\_code}/\{merchant\_operation\_number}](https://api.alignet.io/charges/\{merchant_code}/\{merchant_operation_number}) Este endpoint cambia el estado de la operación según el estado actual de la transacción y el método de pago. Si necesitas confirmar el resultado final luego del cambio, apóyate también en [Consulta](/payin/consulta) y [Notificaciones](/payin/notificaciones). *** ## ¿Qué cubre esta sección? Las transacciones en estado `REGISTRADO` o `PENDIENTE` pasan a estado `CANCELADO` para `CARD` cuando usa Redirect, `CUOTEALO`, `QR`, `BANK_TRANSFER` y `PAGOEFECTIVO`. Las transacciones en estado `AUTORIZADO` pasan a estado `EXTORNADO` para `CARD` y `YAPE`. Usa este endpoint para cerrar correctamente una operación desde backend cuando el negocio requiera anular o revertir el cobro. El comportamiento no es igual para todos los métodos. La transición depende del estado actual de la transacción. *** ## Request Antes de consumir este endpoint, solicita tu `Access Token` en [Autenticación](/autenticacion#param-post-token). ### Path ```bash theme={"system"} DELETE {{base}}/charges/{merchant_code}/{merchant_operation_number} ``` | Campo | Descripción | Formato | Tipo | | :- | :- | :- | :- | | `merchant_code` | Identificador del comercio. | Cadena alfanumérica | String | | `merchant_operation_number` | Número de operación. | Cadena alfanumérica | String | ### Headers | Campo | Descripción | Valor | Tipo | Obligatorio | | :- | :- | :- | :- | :- | | `Authorization` | Token de identificación para uso del API creado previamente en API de Seguridad. | `Bearer {access_token}` | String | SI | | `ALG-API-VERSION` | Versión del API a usar. | `1709847567` | String | SI | | `payment-facilitator-code` | Identificador del PF. Uso obligatorio para PF. | Cadena alfanumérica | String | NO | ```bash theme={"system"} Authorization: Bearer {access_token} ALG-API-VERSION: 1709847567 payment-facilitator-code: {pf_code} ``` *** ## Response Se devuelve la misma estructura general que el [API de Consulta](/payin/consulta), con las transacciones que se pudieron cancelar o extornar de forma exitosa. | Campo | Descripción | Tipo | Obligatorio | | :- | :- | :- | :- | | `success` | Indica si el proceso se realizó correctamente. Valores esperados: `true` o `false`. | Boolean | SI | | `merchant_code` | Identificador del comercio. | String | SI | | `merchant_operation_number` | Número de pedido de la operación cancelada o extornada. Puede estar presente a nivel raíz según la integración. | String | NO | | `operation` | Visible cuando se encontró el `merchant_operation_number`. Objeto con el detalle de la operación. | Object | SI | | `operation.merchant_operation_number` | Número de pedido de la operación cancelada o extornada. | String | SI | | `operation.amount` | Monto de la operación. | String | SI | | `operation.currency` | Código de moneda de la operación. | String | SI | | `operation.state` | Visible cuando la operación se pudo cancelar o extornar. Estado al cual cambió la operación. Valores frecuentes: `CANCELADO`, `EXTORNADO`. | String | SI | | `operation.transactions` | Lista de transacciones canceladas o extornadas sobre la operación. Este objeto cambia según el método de pago: [Tarjeta](/payin/consulta-tarjeta), [Transferencia Bancaria](/payin/consulta-transferencia-bancaria), [QR](/payin/consulta-qr), [Yape](/payin/consulta-yape), [Cuotéalo](/payin/consulta-cuotealo), [PagoEfectivo](/payin/consulta-pagoefectivo). | Array | SI | | Campo | Descripción | Tipo | Obligatorio | | :- | :- | :- | :- | | `operation.transactions[].transaction_id` | Identificador único de la transacción afectada. | String | SI | | `operation.transactions[].channel` | Canal de la transacción. Valor esperado: `ecommerce`. | String | SI | | `operation.transactions[].state` | Estado final de la transacción luego del cambio. Valores frecuentes: `CANCELADO`, `EXTORNADO`. | String | SI | | `operation.transactions[].state_reason` | Observación o motivo del cambio de estado. | String | SI | | `operation.transactions[].amount` | Monto de la transacción. | String | SI | | `operation.transactions[].currency` | Código de la moneda de la transacción. | String | SI | | `operation.transactions[].payment_method` | Objeto con información del método de pago usado. | Object | SI | | `operation.transactions[].continue_url` | Puede aparecer si el flujo original generó URL de continuación. | String | NO | | `operation.transactions[].expiration_date` | Puede aparecer si el flujo original incluía expiración. | Object | NO | | `operation.transactions[].processor_response` | Resultado devuelto por la procesadora. En extornos puede incluir datos específicos como `reverse_date` o `reverse_code`. | Object | NO | | `operation.transactions[].authentication_result` | Resultado de autenticación asociado a la transacción, cuando aplique. | Object | NO | | `operation.transactions[].risk_evaluation` | Resultado de evaluación antifraude, cuando aplique. | Object | NO | | `operation.transactions[].additional_fields` | Datos adicionales enviados en la autorización. | Object | NO | | `operation.transactions[].lifecycle` | Historial de estados por los que pasó la transacción. | Array | SI | | Campo | Descripción | Tipo | Obligatorio | | :- | :- | :- | :- | | `meta` | Objeto que contiene metadatos del flujo ejecutado. | Object | SI | | `meta.status` | Objeto que contiene el resultado del flujo ejecutado. | Object | SI | | `meta.status.code` | Código que representa el resultado del flujo ejecutado. | String | SI | | `meta.status.message_ilgn` | Lista de mensajes resultantes del flujo. | Array | SI | | `meta.status.message_ilgn[].locale` | Localidad a nivel de lenguaje para el mensaje del flujo ejecutado. | String | SI | | `meta.status.message_ilgn[].value` | Mensaje resultante del flujo ejecutado. | String | SI | La estructura interna de `operation.transactions[]` se mantiene alineada con el API de Consulta. Lo que cambia principalmente es el estado final alcanzado después de la cancelación o el extorno. *** ## Ejemplo: cancelación exitosa ```json theme={"system"} { "success": true, "merchant_code": "abc", "merchant_operation_number": "2836824", "operation": { "merchant_operation_number": "2836824", "amount": "1000", "currency": "604", "created_at": { "utc_time": "2024-07-05T16:46:12", "unix_time": 1720197972 }, "state": "CANCELADO", "transactions": [ { "transaction_id": "9namjcnjvqzas2t33xyfrqr2h", "channel": "ecommerce", "state": "CANCELADO", "state_reason": "Usuario cancelo el metodo de pago", "amount": "1000", "currency": "604", "additional_fields": null, "payment_method": { "method_name": "PAGOEFECTIVO", "method_details": { "callback_url": "https://jjap9ekgee.execute-api.us-east-1.amazonaws.com/development/redirect/prueba/merchant_notification_response" } }, "expiration_date": null, "processor_response": null, "lifecycle": [ { "state": "REGISTRADO", "date": { "utc_time": "2024-07-05T16:46:12", "unix_time": 1720197972 } }, { "state": "PENDIENTE", "date": { "utc_time": "2024-07-05T16:46:13", "unix_time": 1720197973 } }, { "state": "CANCELADO", "date": { "utc_time": "2024-07-05T16:47:22", "unix_time": 1720198042 } } ] } ] }, "meta": { "status": { "code": "00", "message_ilgn": [ { "locale": "es_PE", "value": "Se proceso correctamente la peticion" } ] } } } ``` *** ## Ejemplo: extorno exitoso ```json theme={"system"} { "success": true, "merchant_code": "abc", "merchant_operation_number": "8522366", "operation": { "merchant_operation_number": "8522366", "amount": "150", "currency": "604", "created_at": { "utc_time": "2024-07-05T20:34:18", "unix_time": 1720211658 }, "state": "EXTORNADO", "transactions": [ { "transaction_id": "0fuwnd6miwsomisn0ikqivav9", "channel": "ecommerce", "state": "EXTORNADO", "state_reason": "Pago anulado", "amount": "150", "currency": "604", "additional_fields": null, "payment_method": { "method_name": "CARD", "method_details": { "redirect_url": null, "callback_url": null, "masked_pan": "545545******3401", "brand": "MASTERCARD", "bin": "545545", "last_pan": "3401", "card_type": "CIRRUS", "card_country": "PE", "issuer": "SCOTIABANK PERU S.A.A." } }, "continue_url": null, "expiration_date": null, "risk_evaluation": null, "authentication_result": null, "processor_response": { "reverse_date": "05-07-2024 20:34:19", "reverse_code": "T90261", "brand_transaction_id": "0705203422939657", "result_message": { "code": "00", "description": "Aprobado" } }, "lifecycle": [ { "state": "REGISTRADO", "date": { "utc_time": "2024-07-05T20:34:18", "unix_time": 1720211658 } }, { "state": "PENDIENTE", "date": { "utc_time": "2024-07-05T20:34:19", "unix_time": 1720211659 } }, { "state": "AUTORIZADO", "date": { "utc_time": "2024-07-05T20:34:24", "unix_time": 1720211664 } }, { "state": "EXTORNADO", "date": { "utc_time": "2024-07-05T21:34:24", "unix_time": 1720211664 } } ] } ] }, "meta": { "status": { "code": "00", "message_ilgn": [ { "locale": "es_PE", "value": "Se proceso correctamente la peticion" } ] } } } ``` *** ## Siguiente paso Confirma el estado final de la operación y revisa el detalle por método cuando lo necesites. Complementa la cancelación con notificaciones S2S para trazabilidad operativa. # API de Consulta Source: https://docs.pay-me.com/payin/consulta Overview del API de consulta para verificar el estado de transacciones en PayIn. El API de Consulta permite consultar una transacción generada previamente por el API de Autorización para ecommerce. Es la forma recomendada de confirmar el estado final desde backend, especialmente en métodos asíncronos o cuando necesitas una segunda validación del resultado. [https://api.preprod.alignet.io/charges/\{merchant\_code}/\{merchant\_operation\_number}/\{transaction\_id}](https://api.preprod.alignet.io/charges/\{merchant_code}/\{merchant_operation_number}/\{transaction_id}) [https://api.alignet.io/charges/\{merchant\_code}/\{merchant\_operation\_number}/\{transaction\_id}](https://api.alignet.io/charges/\{merchant_code}/\{merchant_operation_number}/\{transaction_id}) Usa este API para validar el resultado final de una operación desde backend. También aplica al flujo Checkout Web (Flex) como segunda validación luego de `responseCallback`, redirect o cualquier confirmación preliminar mostrada al usuario. *** ## ¿Qué cubre esta sección? Confirma desde backend si la transacción terminó en estado autorizado, pendiente, expirado, cancelado u otro estado relevante para tu negocio. Es especialmente útil para QR, Transferencia Bancaria, Cuotéalo y PagoEfectivo, donde el resultado final puede cambiar luego de la autorización inicial. Si integras Flex, usa esta consulta como segunda validación antes de cerrar la orden o marcar el pago como exitoso en tu sistema. Conserva `merchant_code`, `merchant_operation_number` y `transaction_id` para conciliación, soporte operativo y seguimiento de reclamos. *** ## Métodos disponibles Verifica el resultado de cobros con tarjeta y realiza conciliación. Consulta el estado de pagos con Yape cuando necesitas respaldo adicional. Consulta operaciones con retorno diferido o pendientes de confirmación. Úsala para validar pagos QR luego del redirect o durante polling controlado. Consulta el estado actualizado de operaciones en cuotas. Verifica operaciones que completan su confirmación fuera de la sesión inicial. *** ## Request Antes de consumir este endpoint, solicita tu `Access Token` en [Autenticación](/autenticacion#param-post-token). ### Path ```bash theme={"system"} GET {{base}}/charges/{merchant_code}/{merchant_operation_number}/{transaction_id} ``` | Campo | Descripción | Formato | Tipo | | :- | :- | :- | :- | | `merchant_code` | Identificador del comercio. | Cadena alfanumérica | String | | `merchant_operation_number` | Número de operación registrado por el comercio. | Cadena alfanumérica | String | | `transaction_id` | Identificador único de la transacción. Se usa para consultar una sola transacción dentro de una operación. | Cadena alfanumérica | String | ### Headers | Campo | Descripción | Valor | Tipo | Obligatorio | | :- | :- | :- | :- | :- | | `Authorization` | Token de identificación creado previamente en API de Seguridad. | `Bearer {access_token}` | String | SI | | `ALG-API-VERSION` | Versión del API a usar. | `1709847567` | String | SI | | `payment-facilitator-code` | Identificador del Facilitador de Pago. | Cadena alfanumérica | String | NO | ```bash theme={"system"} Authorization: Bearer {access_token} ALG-API-VERSION: 1709847567 payment-facilitator-code: {pf_code} ``` *** ## Response El orquestador responde el detalle de la operación y el listado de transacciones asociadas. Si consultas una transacción específica, la estructura es la misma y `operation.transactions` contendrá solo la transacción solicitada. | Campo | Descripción | Tipo | Obligatorio | | :- | :- | :- | :- | | `success` | Indica si el proceso se realizó correctamente. Valores esperados: `true` o `false`. | String | SI | | `merchant_code` | Identificador del comercio. | String | SI | | `operation` | Objeto con el detalle de la operación. | Object | SI | | `operation.merchant_operation_number` | Número de pedido de la operación consultada. | String | SI | | `operation.amount` | Monto total de la operación. | String | SI | | `operation.currency` | Código de moneda de la operación. | String | SI | | `operation.state` | Estado actual de la operación. Valores frecuentes: `REGISTRADO`, `PENDIENTE`, `AUTORIZADO`, `CANCELADO`, `EXPIRADO`, `LIQUIDADO`, `DEPOSITADO`. | String | SI | | `operation.transactions` | Lista de transacciones realizadas sobre la operación. Cambia según el método de pago: [Tarjeta](/payin/consulta-tarjeta), [Transferencia Bancaria](/payin/consulta-transferencia-bancaria), [QR](/payin/consulta-qr), [Yape](/payin/consulta-yape), [Cuotéalo](/payin/consulta-cuotealo), [PagoEfectivo](/payin/consulta-pagoefectivo). | Array | SI | | Campo | Descripción | Tipo | Obligatorio | | :- | :- | :- | :- | | `operation.transactions[].transaction_id` | Identificador único de la transacción. | String | SI | | `operation.transactions[].channel` | Canal en el que se realizó la transacción. Valor esperado: `ecommerce`. | String | SI | | `operation.transactions[].state` | Estado actual de la transacción. Puede ser `REGISTRADO`, `PENDIENTE`, `AUTORIZADO`, `CANCELADO`, `EXPIRADO`, `LIQUIDADO` o `DEPOSITADO`. | String | SI | | `operation.transactions[].state_reason` | Observación o motivo del estado. | String | SI | | `operation.transactions[].amount` | Monto de la transacción. | String | SI | | `operation.transactions[].currency` | Código de moneda de la transacción. | String | SI | | `operation.transactions[].payment_method` | Objeto con información del método de pago usado en la transacción. | Object | SI | | `operation.transactions[].payment_method.method_name` | Nombre del método de pago usado. Ejemplos: `CARD`, `BANK_TRANSFER`, `QR`, `YAPE`, `CUOTEALO`, `PAGOEFECTIVO`. | String | SI | | `operation.transactions[].payment_method.method_details` | Objeto con información específica del método. Su estructura varía por flujo y se documenta en cada página de método. | Object | SI | | Campo | Descripción | Tipo | Obligatorio | | :- | :- | :- | :- | | `operation.transactions[].payment_method.method_details.redirect_url` | URL de redirect enviada durante la autorización. | String | NO | | `operation.transactions[].payment_method.method_details.callback_url` | URL de callback enviada durante la autorización. | String | NO | | `operation.transactions[].continue_url` | Visible en estado `PENDIENTE`. Se usa para continuar el flujo de pago en `CARD` con redirect, `BANK_TRANSFER` y `CUOTEALO`. | String | NO | | `operation.transactions[].expiration_date` | Visible en estado `PENDIENTE`. Objeto con la fecha de expiración de la transacción para `CARD` con redirect, `BANK_TRANSFER`, `PAGOEFECTIVO`, `QR` y `CUOTEALO`. | Object | NO | | `operation.transactions[].expiration_date.utc_time` | Fecha de expiración en UTC. | String | NO | | `operation.transactions[].expiration_date.unix_time` | Fecha de expiración en Unix time. | Integer | NO | | `operation.transactions[].processor_response` | Resultado detallado del procesamiento. Visible normalmente en estados como `AUTORIZADO`, `DENEGADO` o `EXTORNADO`. Su estructura cambia según el método y debe tomarse como referencial. | Object | NO | | `operation.transactions[].additional_fields` | Datos adicionales enviados durante la autorización. | Dictionary | NO | | Campo | Descripción | Tipo | Obligatorio | | :- | :- | :- | :- | | `operation.transactions[].lifecycle` | Historial de estados por los que pasó la transacción. | Array | SI | | `operation.transactions[].lifecycle[].state` | Estado del ciclo de vida. Valores frecuentes: `REGISTRADO`, `PENDIENTE`, `AUTORIZADO`, `EXTORNADO`, `CANCELADO`, `EXPIRADO`, `LIQUIDADO`, `DEPOSITADO`. | String | SI | | `operation.transactions[].lifecycle[].date` | Objeto con la fecha del cambio de estado. | Object | SI | | `operation.transactions[].lifecycle[].date.utc_time` | Fecha en UTC. | String | SI | | `operation.transactions[].lifecycle[].date.unix_time` | Fecha en Unix time. | Integer | SI | | `meta` | Objeto con metadatos del flujo ejecutado. | Object | SI | | `meta.status` | Objeto con el resultado del flujo ejecutado. | Object | SI | | `meta.status.code` | Código del resultado técnico del servicio o request. No valida si el pago fue autorizado o denegado. | String | SI | | `meta.status.message_ilgn` | Lista de mensajes resultantes del flujo. | Array | SI | | `meta.status.message_ilgn[].locale` | Localidad del mensaje. | String | SI | | `meta.status.message_ilgn[].value` | Mensaje resultante del flujo. | String | SI | Si consultas una transacción puntual, recibirás la misma estructura de respuesta que una operación, pero `operation.transactions` incluirá solo la transacción solicitada. Para validar el resultado del pago, usa `operation.transactions[].state` y no `meta.status.code`. Un `meta.status.code` exitoso solo indica que el servicio respondió correctamente; la transacción todavía puede estar `PENDIENTE`, `DENEGADO`, `EXPIRADO` u otro estado. *** ## Recomendaciones de uso Si el método es asíncrono, consulta con intervalos razonables y evita usar polling agresivo como única estrategia. Si ya recibes [Notificaciones](/payin/notificaciones), usa este API como respaldo y validación adicional, no como único origen de verdad. En Checkout Web (Flex), no cierres la orden solo con el resultado visual del frontend. Confirma el estado final consultando desde backend. Guarda `merchant_operation_number` y `transaction_id` desde la autorización para evitar consultas ambiguas y facilitar soporte. *** ## Siguiente paso Revisa el primer flujo específico por método para aterrizar la respuesta y validaciones de negocio. Combina consulta con notificaciones S2S para confirmar estados sin depender del frontend. # Api de Consulta con Cuotéalo Source: https://docs.pay-me.com/payin/consulta-cuotealo Consulta el estado de una operación con Cuotéalo en PayIn. Usa esta consulta para dar seguimiento a operaciones con Cuotéalo y obtener el estado final después del flujo externo de pago. Este flujo usa la misma estructura general documentada en el [Overview de Consulta](/payin/consulta). Aquí se detalla específicamente el objeto `operation.transactions[]` para pagos con Cuotéalo. *** ## ¿Cuándo usarla? Cuando el pago continúa fuera de la sesión principal y aún no tienes estado final. Cuando necesitas confirmar desde backend si la operación terminó autorizada, denegada, cancelada o liquidada. Cuando necesitas consultar `continue_url`, expiración o reenviar al usuario al flujo de Cuotéalo. Cuando necesitas validar el resultado para tu orden o conciliación operativa. *** ## Consideraciones Conserva `merchant_code`, `merchant_operation_number` y `transaction_id` desde la autorización para consultar sin ambigüedad. En esta documentación se usa `method_details` para mantener consistencia con el resto de la referencia. Si en material previo encuentras `method_detail`, trátalo como el mismo objeto. Los campos de `processor_response` para Cuotéalo pueden variar según la procesadora. Tómalos como referenciales. *** ## Response Objeto `operation.transactions[]` para pagos con Cuotéalo dentro de la trama de respuesta del [API de Consulta](/payin/consulta). ### Objeto `operation.transactions[]` | Campo | Descripción | Tipo | Obligatorio | | :- | :- | :- | :- | | `operation.transactions[].transaction_id` | Identificador único de la transacción. | String | SI | | `operation.transactions[].channel` | Canal por el cual se realizó la transacción. Valor esperado: `ecommerce`. | String | SI | | `operation.transactions[].state` | Estado actual de la transacción. Valores frecuentes: `PENDIENTE`, `CANCELADO`, `INVALIDO`, `AUTORIZADO`, `DENEGADO`, `LIQUIDADO`. | String | SI | | `operation.transactions[].state_reason` | Observación o detalle del estado. | String | SI | | `operation.transactions[].amount` | Monto de la transacción. | String | SI | | `operation.transactions[].currency` | Código de la moneda de la operación. | String | SI | | `operation.transactions[].payment_method` | Objeto que contiene información sobre el método de pago usado en la transacción. | Object | SI | | `operation.transactions[].payment_method.method_name` | Nombre del método de pago usado en la transacción. Valor esperado: `CUOTEALO`. | String | SI | | `operation.transactions[].payment_method.method_details` | Objeto que contiene información detallada relacionada al método. | Object | NO | | `operation.transactions[].continue_url` | Visible en estado `PENDIENTE`. URL para continuar el proceso de pago. | String | NO | | `operation.transactions[].expiration_date` | Visible en estado `PENDIENTE`. Objeto que contiene la fecha en la que expirará la transacción. | Object | NO | | `operation.transactions[].processor_response` | Visible normalmente en estado `AUTORIZADO` o `DENEGADO`. Objeto que contiene el resultado de la autorización. | Object | NO | | `operation.transactions[].additional_fields` | Objeto que contiene los datos adicionales de la transacción enviados en la autorización. | Object | NO | | `operation.transactions[].lifecycle` | Array que contiene el listado de estados por los cuales pasó la transacción. | Array | SI | *** ### Objeto `operation.transactions[].payment_method.method_details` | Campo | Descripción | Tipo | Obligatorio | | :- | :- | :- | :- | | `operation.transactions[].payment_method.method_details.redirect_url` | Visible en estado `PENDIENTE`. URL del redirect enviado en la autorización. | String | SI | | `operation.transactions[].payment_method.method_details.callback_url` | URL del callback enviado en la autorización. | String | NO | *** ### Objeto `operation.transactions[].expiration_date` | Campo | Descripción | Tipo | Obligatorio | | :- | :- | :- | :- | | `operation.transactions[].expiration_date.utc_time` | Fecha en UTC. | String | NO | | `operation.transactions[].expiration_date.unix_time` | Fecha en Unix time. | Integer | NO | *** ### Objeto `operation.transactions[].processor_response` | Campo | Descripción | Tipo | Obligatorio | | :- | :- | :- | :- | | `operation.transactions[].processor_response.credit_status` | Estado de la autorización devuelta por la procesadora. | String | NO | | `operation.transactions[].processor_response.operation_id` | ID de la operación devuelta por la procesadora. | String | NO | *** ### Objeto `operation.transactions[].lifecycle` | Campo | Descripción | Tipo | Obligatorio | | :- | :- | :- | :- | | `operation.transactions[].lifecycle[].state` | Estado de la transacción. Valores frecuentes: `REGISTRADO`, `PENDIENTE`, `CANCELADO`, `INVALIDO`, `AUTORIZADO`, `DENEGADO`, `LIQUIDADO`. | String | SI | | `operation.transactions[].lifecycle[].date` | Objeto que contiene la fecha en la que se realizó el cambio de estado. | Object | SI | *** ### Objeto `operation.transactions[].lifecycle[].date` | Campo | Descripción | Tipo | Obligatorio | | :- | :- | :- | :- | | `operation.transactions[].lifecycle[].date.utc_time` | Fecha en UTC. | String | SI | | `operation.transactions[].lifecycle[].date.unix_time` | Fecha en Unix time. | Integer | SI | *** ## Ejemplo: pendiente Response de consulta de Cuotéalo con estado `PENDIENTE`. ```json theme={"system"} { "success": true, "merchant_code": "abc", "operation": { "merchant_operation_number": "2391645", "state": "PENDIENTE", "created_at": { "utc_time": "2024-03-12T22:49:36.018Z", "unix_time": 1710282940 }, "amount": "15000", "currency": "604", "transactions": [ { "transaction_id": "5hk8rwa3h3cq9oyfs3a28v1ms", "channel": "ecommerce", "state": "PENDIENTE", "state_reason": "Url generada para continuar con el pago", "amount": "15000", "currency": "604", "payment_method": { "method_name": "CUOTEALO", "method_details": { "redirect_url": "https://pay-me.com", "callback_url": "https://pay-me.com/callback" } }, "continue_url": "https://api.dev.alignet.io/payment/continue/cuotealo/c7dagnrwgxgh1b6kzwirheezv", "expiration_date": { "utc_time": "2024-03-12T22:49:36.018Z", "unix_time": 1710282940 }, "processor_response": null, "additional_fields": null, "lifecycle": [ { "state": "REGISTRADO", "date": { "utc_time": "2024-03-12T22:49:36.018Z", "unix_time": 1710282940 } }, { "state": "PENDIENTE", "date": { "utc_time": "2024-03-12T22:49:36.018Z", "unix_time": 1710282940 } } ] } ] }, "meta": { "status": { "code": "00", "message_ilgn": [ { "locale": "es_PE", "value": "Se proceso correctamente" } ] } } } ``` *** ## Ejemplo: autorizada Response de consulta de Cuotéalo con estado `AUTORIZADO`. ```json theme={"system"} { "success": true, "merchant_code": "abc", "operation": { "merchant_operation_number": "2391645", "state": "AUTORIZADO", "amount": "15000", "currency": "604", "transactions": [ { "transaction_id": "5hk8rwa3h3cq9oyfs3a28v1ms", "channel": "ecommerce", "state": "AUTORIZADO", "state_reason": "Pago Exitoso", "amount": "15000", "currency": "604", "payment_method": { "method_name": "CUOTEALO", "method_details": { "redirect_url": "https://pay-me.com", "callback_url": "https://pay-me.com/callback" } }, "continue_url": null, "expiration_date": null, "processor_response": { "credit_status": "APPROVED", "operation_id": "ABC123_ABC123" }, "additional_fields": null, "lifecycle": [ { "state": "REGISTRADO", "date": { "utc_time": "2024-03-12T22:49:36.018Z", "unix_time": 1710282940 } }, { "state": "PENDIENTE", "date": { "utc_time": "2024-03-12T22:49:36.018Z", "unix_time": 1710282940 } }, { "state": "AUTORIZADO", "date": { "utc_time": "2024-03-12T22:49:36.018Z", "unix_time": 1710282940 } } ] } ] }, "meta": { "status": { "code": "00", "message_ilgn": [ { "locale": "es_PE", "value": "Se proceso correctamente" } ] } } } ``` *** ## Siguiente paso Si corresponde por estado y negocio, revisa la cancelación de la operación. # Api de Consulta con PagoEfectivo Source: https://docs.pay-me.com/payin/consulta-pagoefectivo Consulta el estado de una operación con PagoEfectivo en PayIn. Usa esta consulta para verificar operaciones con PagoEfectivo cuyo resultado puede confirmarse fuera de la sesión inicial del checkout. Este flujo usa la misma estructura general documentada en el [Overview de Consulta](/payin/consulta). Aquí se detalla específicamente el objeto `operation.transactions[]` para pagos con PagoEfectivo. *** ## ¿Cuándo usarla? Cuando el usuario completa el pago después de abandonar la sesión principal. Cuando necesitas una fuente confiable del estado final antes de actualizar la orden. Cuando necesitas recuperar el `cip`, la `cip_url` o la expiración mientras el pago sigue pendiente. Cuando debes validar pagos confirmados por PagoEfectivo y conciliarlos con tu orden. *** ## Consideraciones Conserva `merchant_code`, `merchant_operation_number` y `transaction_id` desde la autorización para consultar sin ambigüedad. En esta documentación se usa `method_details` para mantener consistencia con el resto de la referencia. Si en material previo encuentras `method_detail`, trátalo como el mismo objeto. Los campos de `processor_response` para PagoEfectivo pueden variar según el estado de la operación. Tómalos como referenciales. *** ## Response Objeto `operation.transactions[]` para pagos con PagoEfectivo dentro de la trama de respuesta del [API de Consulta](/payin/consulta). ### Objeto `operation.transactions[]` | Campo | Descripción | Tipo | Obligatorio | | :- | :- | :- | :- | | `operation.transactions[].transaction_id` | Identificador único de la transacción. | String | SI | | `operation.transactions[].channel` | Canal por el cual se realizó la transacción. Valor esperado: `ecommerce`. | String | SI | | `operation.transactions[].state` | Estado actual de la transacción. Valores frecuentes: `PENDIENTE`, `INVALIDO`, `AUTORIZADO`, `DENEGADO`, `CANCELADO`, `EXPIRADO`, `LIQUIDADO`. | String | SI | | `operation.transactions[].state_reason` | Observación o detalle del estado. | String | SI | | `operation.transactions[].amount` | Monto de la transacción. | String | SI | | `operation.transactions[].currency` | Código de la moneda de la operación. | String | SI | | `operation.transactions[].payment_method` | Objeto que contiene información sobre el método de pago usado en la transacción. | Object | SI | | `operation.transactions[].payment_method.method_name` | Nombre del método de pago usado en la transacción. Valor esperado: `PAGOEFECTIVO`. | String | SI | | `operation.transactions[].payment_method.method_details` | Objeto que contiene información detallada relacionada al método. | Object | NO | | `operation.transactions[].expiration_date` | Visible en estado `PENDIENTE`. Objeto que contiene la fecha en la que expirará la transacción. | Object | NO | | `operation.transactions[].processor_response` | Visible normalmente en estado `PENDIENTE` o `AUTORIZADO`. Objeto que contiene el resultado devuelto por la procesadora. | Object | NO | | `operation.transactions[].additional_fields` | Objeto que contiene los datos adicionales de la transacción enviados en la autorización. | Object | NO | | `operation.transactions[].lifecycle` | Array que contiene el listado de estados por los cuales pasó la transacción. | Array | SI | *** ### Objeto `operation.transactions[].payment_method.method_details` | Campo | Descripción | Tipo | Obligatorio | | :- | :- | :- | :- | | `operation.transactions[].payment_method.method_details.callback_url` | URL del callback enviado en la autorización. | String | NO | *** ### Objeto `operation.transactions[].expiration_date` | Campo | Descripción | Tipo | Obligatorio | | :- | :- | :- | :- | | `operation.transactions[].expiration_date.utc_time` | Fecha en UTC. | String | NO | | `operation.transactions[].expiration_date.unix_time` | Fecha en Unix time. | Integer | NO | *** ### Objeto `operation.transactions[].processor_response` | Campo | Descripción | Tipo | Obligatorio | | :- | :- | :- | :- | | `operation.transactions[].processor_response.cip` | Visible normalmente en estado `PENDIENTE` o `AUTORIZADO`. Código CIP de PagoEfectivo. | String | NO | | `operation.transactions[].processor_response.cip_url` | Visible normalmente en estado `PENDIENTE`. URL de PagoEfectivo con el detalle e indicaciones de pago. | String | NO | | `operation.transactions[].processor_response.payment_date` | Visible normalmente en estado `AUTORIZADO`. Fecha de pago reportada por PagoEfectivo. | String | NO | | `operation.transactions[].processor_response.operationNumber` | Visible normalmente en estado `AUTORIZADO`. Identificador de PagoEfectivo. | String | NO | | `operation.transactions[].processor_response.result_message` | Visible normalmente en estado `PENDIENTE`. Objeto que contiene el mensaje del resultado de la autorización. | Object | NO | *** ### Objeto `operation.transactions[].processor_response.result_message` | Campo | Descripción | Tipo | Obligatorio | | :- | :- | :- | :- | | `operation.transactions[].processor_response.result_message.code` | Código del resultado de la autorización. | String | NO | | `operation.transactions[].processor_response.result_message.description` | Descripción del resultado de la autorización. | String | NO | *** ### Objeto `operation.transactions[].lifecycle` | Campo | Descripción | Tipo | Obligatorio | | :- | :- | :- | :- | | `operation.transactions[].lifecycle[].state` | Estado de la transacción. Valores frecuentes: `REGISTRADO`, `PENDIENTE`, `INVALIDO`, `AUTORIZADO`, `DENEGADO`, `CANCELADO`, `EXPIRADO`, `LIQUIDADO`. | String | SI | | `operation.transactions[].lifecycle[].date` | Objeto que contiene la fecha en la que se realizó el cambio de estado. | Object | SI | *** ### Objeto `operation.transactions[].lifecycle[].date` | Campo | Descripción | Tipo | Obligatorio | | :- | :- | :- | :- | | `operation.transactions[].lifecycle[].date.utc_time` | Fecha en UTC. | String | SI | | `operation.transactions[].lifecycle[].date.unix_time` | Fecha en Unix time. | Integer | SI | *** ## Ejemplo: pendiente Response de consulta de PagoEfectivo con estado `PENDIENTE`. ```json theme={"system"} { "success": true, "merchant_code": "abc", "operation": { "merchant_operation_number": "7649167", "amount": "121900", "currency": "604", "state": "PENDIENTE", "transactions": [ { "transaction_id": "a9e9040spd17ba3tdw42u4uv3", "state": "PENDIENTE", "state_reason": "Codigo CIP generado exitosamente", "amount": "121900", "currency": "604", "additional_fields": null, "payment_method": { "method_name": "PAGOEFECTIVO", "method_details": { "callback_url": "https://pay-me.com/callback" } }, "expiration_date": { "utc_time": "2024-07-06T16:20:16.345140+00:00", "unix_time": 1720282816 }, "processor_response": { "cip": "1508405", "cip_url": "https://pre1a.payment.pagoefectivo.pe/72217FA5-4580-4B16-A345-24F028F53356.html", "result_message": { "code": "100", "description": "Solicitud exitosa." } }, "lifecycle": [ { "state": "REGISTRADO", "date": { "utc_time": "2024-07-05T16:20:16", "unix_time": 1720196416.222 } }, { "state": "PENDIENTE", "date": { "utc_time": "2024-07-05T16:20:16", "unix_time": 1720196416.305 } } ] } ] }, "meta": { "status": { "code": "00", "message_ilgn": [ { "locale": "es_PE", "value": "Se proceso correctamente la peticion" } ] } } } ``` *** ## Ejemplo: autorizada Response de consulta de PagoEfectivo con estado `AUTORIZADO`. ```json theme={"system"} { "success": true, "merchant_code": "abc", "operation": { "merchant_operation_number": "2836824", "amount": "1000", "currency": "604", "state": "AUTORIZADO", "transactions": [ { "transaction_id": "9namjcnjvqzas2t33xyfrqr2h", "state": "AUTORIZADO", "state_reason": "Pago exitoso", "amount": "1000", "currency": "604", "additional_fields": null, "payment_method": { "method_name": "PAGOEFECTIVO", "method_details": { "callback_url": "https://pay-me.com/callback" } }, "expiration_date": null, "processor_response": { "payment_date": "2024-06-24T11:01:20-05:00", "cip": "1493006", "operationNumber": "1057462" }, "lifecycle": [ { "state": "REGISTRADO", "date": { "utc_time": "2024-07-05T16:46:12", "unix_time": 1720197972.931 } }, { "state": "PENDIENTE", "date": { "utc_time": "2024-07-05T16:46:13", "unix_time": 1720197973.047 } }, { "state": "AUTORIZADO", "date": { "utc_time": "2024-07-05T16:47:22", "unix_time": 1720198042.642 } } ] } ] }, "meta": { "status": { "code": "00", "message_ilgn": [ { "locale": "es_PE", "value": "Se proceso correctamente la peticion" } ] } } } ``` *** ## Siguiente paso Revisa el flujo de cancelación si tu operación aún puede anularse. # Api de Consulta con QR Source: https://docs.pay-me.com/payin/consulta-qr Consulta el estado de una operación con QR en PayIn. Usa esta consulta para confirmar el estado final de un pago QR luego del redirect del usuario o cuando la operación permanece pendiente. Este flujo usa la misma estructura general documentada en el [Overview de Consulta](/payin/consulta). Aquí se detalla específicamente el objeto `operation.transactions[]` para pagos con QR. *** ## ¿Cuándo usarla? Para contrastar el retorno del navegador con el estado real de backend. Para obtener el estado definitivo antes de actualizar la orden en tu sistema. Para recuperar el `qr_image`, `qr_id` y la fecha de expiración mientras el pago sigue pendiente. Para validar si la operación pasó de `PENDIENTE` a `AUTORIZADO`, `EXPIRADO` o `CANCELADO`. *** ## Consideraciones No marques la operación como exitosa solo por el retorno del usuario. Usa la consulta o la notificación S2S como validación final. En esta documentación se usa `method_details` para mantener consistencia con el resto de la referencia. Si en material previo encuentras `method_detail`, trátalo como el mismo objeto. En estado `PENDIENTE`, el objeto `processor_response` suele devolver el QR generado. Cuando la operación queda `AUTORIZADO`, ese mismo objeto puede devolver datos de autorización. *** ## Response Objeto `operation.transactions[]` para pagos con QR dentro de la trama de respuesta del [API de Consulta](/payin/consulta). ### Objeto `operation.transactions[]` | Campo | Descripción | Tipo | Obligatorio | | :- | :- | :- | :- | | `operation.transactions[].transaction_id` | Identificador único de la transacción. | String | SI | | `operation.transactions[].channel` | Canal por el cual se realizó la transacción. Valor esperado: `ecommerce`. | String | SI | | `operation.transactions[].state` | Estado actual de la transacción. Valores frecuentes: `PENDIENTE`, `AUTORIZADO`, `INVALIDO`, `EXPIRADO`, `CANCELADO`, `LIQUIDADO`. | String | SI | | `operation.transactions[].state_reason` | Observación o detalle del estado. | String | SI | | `operation.transactions[].amount` | Monto de la transacción. | String | SI | | `operation.transactions[].currency` | Código de la moneda de la operación. | String | SI | | `operation.transactions[].payment_method` | Objeto que contiene información sobre el método de pago usado en la transacción. | Object | SI | | `operation.transactions[].payment_method.method_name` | Nombre del método de pago usado en la transacción. Valor esperado: `QR`. | String | SI | | `operation.transactions[].payment_method.method_details` | Objeto que contiene información detallada relacionada al método. | Object | NO | | `operation.transactions[].expiration_date` | Visible en estado `PENDIENTE`. Objeto que contiene la fecha en la que expirará la transacción. | Object | NO | | `operation.transactions[].processor_response` | Objeto que contiene el resultado devuelto por la procesadora. Su contenido varía según el estado de la transacción. | Object | NO | | `operation.transactions[].additional_fields` | Objeto que contiene los datos adicionales de la transacción enviados en el request. | Object | NO | | `operation.transactions[].lifecycle` | Array que contiene el listado de estados por los cuales pasó la transacción. | Array | SI | *** ### Objeto `operation.transactions[].payment_method.method_details` | Campo | Descripción | Tipo | Obligatorio | | :- | :- | :- | :- | | `operation.transactions[].payment_method.method_details.masked_pan` | Tarjeta enmascarada usada en la transacción. | String | NO | | `operation.transactions[].payment_method.method_details.brand` | Marca de la tarjeta usada en la transacción. | String | NO | | `operation.transactions[].payment_method.method_details.bin` | BIN de la tarjeta usada en la transacción. | String | NO | | `operation.transactions[].payment_method.method_details.last_pan` | Últimos 4 dígitos de la tarjeta usada en la transacción. | String | NO | | `operation.transactions[].payment_method.method_details.card_type` | Tipo de tarjeta. | String | NO | | `operation.transactions[].payment_method.method_details.card_country` | País de la tarjeta. | String | NO | | `operation.transactions[].payment_method.method_details.issuer` | Banco emisor de la tarjeta. | String | NO | | `operation.transactions[].payment_method.method_details.callback_url` | URL del callback enviado en la autorización. | String | NO | *** ### Objeto `operation.transactions[].expiration_date` | Campo | Descripción | Tipo | Obligatorio | | :- | :- | :- | :- | | `operation.transactions[].expiration_date.utc_time` | Fecha en UTC. | String | NO | | `operation.transactions[].expiration_date.unix_time` | Fecha en Unix time. | Integer | NO | *** ### Objeto `operation.transactions[].processor_response` | Campo | Descripción | Tipo | Obligatorio | | :- | :- | :- | :- | | `operation.transactions[].processor_response.date` | Visible normalmente en estado `PENDIENTE`. Fecha devuelta por la procesadora al generar el QR. | String | NO | | `operation.transactions[].processor_response.qr_image` | Visible normalmente en estado `PENDIENTE`. Imagen en base64 del QR generado. | String | NO | | `operation.transactions[].processor_response.qr_id` | Visible normalmente en estado `PENDIENTE`. ID del QR generado por la procesadora. | String | NO | | `operation.transactions[].processor_response.authorization_code` | Visible normalmente en estado `AUTORIZADO` o `DENEGADO`. Código de autorización. | String | NO | | `operation.transactions[].processor_response.brand_transaction_id` | Visible normalmente en estado `AUTORIZADO` o `DENEGADO`. ID de la transacción ante la marca. | String | NO | | `operation.transactions[].processor_response.result_message` | Objeto que contiene el mensaje del resultado devuelto por la procesadora. | Object | NO | *** ### Objeto `operation.transactions[].processor_response.result_message` | Campo | Descripción | Tipo | Obligatorio | | :- | :- | :- | :- | | `operation.transactions[].processor_response.result_message.code` | Código del resultado de la autorización o generación del QR. | String | NO | | `operation.transactions[].processor_response.result_message.description` | Descripción del resultado de la autorización o generación del QR. | String | NO | *** ### Objeto `operation.transactions[].lifecycle` | Campo | Descripción | Tipo | Obligatorio | | :- | :- | :- | :- | | `operation.transactions[].lifecycle[].state` | Estado de la transacción. Valores frecuentes: `REGISTRADO`, `PENDIENTE`, `AUTORIZADO`, `EXTORNADO`, `CANCELADO`, `EXPIRADO`, `LIQUIDADO`. | String | SI | | `operation.transactions[].lifecycle[].date` | Objeto que contiene la fecha en la que se realizó el cambio de estado. | Object | SI | *** ### Objeto `operation.transactions[].lifecycle[].date` | Campo | Descripción | Tipo | Obligatorio | | :- | :- | :- | :- | | `operation.transactions[].lifecycle[].date.utc_time` | Fecha en UTC. | String | SI | | `operation.transactions[].lifecycle[].date.unix_time` | Fecha en Unix time. | Integer | SI | *** ## Ejemplo: pendiente Response de consulta de QR en estado `PENDIENTE`. ```json theme={"system"} { "success": true, "merchant_code": "abc", "operation": { "merchant_operation_number": "2391645", "state": "PENDIENTE", "created_at": { "utc_time": "2024-03-12T22:49:36.018Z", "unix_time": 1710282940 }, "amount": "15000", "currency": "604", "transactions": [ { "transaction_id": "5hk8rwa3h3cq9oyfs3a28v1ms", "channel": "ecommerce", "state": "PENDIENTE", "state_reason": "QR generado, pendiente de pago", "amount": "15000", "currency": "604", "payment_method": { "method_name": "QR", "method_details": { "callback_url": "https://pay-me.com/callback" } }, "expiration_date": { "utc_time": "2024-03-12T22:49:36.018Z", "unix_time": 1710282940 }, "processor_response": { "date": "2024-03-21 14:53:15.096596", "qr_image": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAV4AAAFeAQAAAADlUEq3AAAFa0lEQVR42u1bS47iQAx1i0WWOUJu0lwsUpC4GNwkR8iSRRTP+1SlmZZGmsVsrGkWEVAvSLFd9vMrE/n3rz1+wP8XeIuIj22eXrjw3WXNx4ilJxc+x3visuNtLFXBCxcu6/AYb5PeYTXX1yfWM3lv4qdwKQueY3jyQo9GjLcYHgHjROi2+0ozTTBTaXDeE98tK25b1tc1c4VdZhonJnh/rw/G6iOWHA4swBAxwTj7hI+ZQ363RjGw4nmmkxeaJLB1gcMNiuI58omPvwV/MXDLSAzqP16+p69KYL2cXhnFeaP38T0SVOQRS8vAbwWoGnhnRsK+TAU1iggcH1Nct4u8H06+D1ujIHjj5mRQ46FXbdg8mHf19NjJvFeFpS44TAiC7k4kX9xxX2ENZlu6WxkJq0XBCGAUESRaVhJc7isMoUsPdoTAOtgaFcEslfwYjN1UEQErQBSzulwRB7gwIdt0FcEtnv2d7mVG4mr6giw1YdcuVcGXZMHAXg2y17ikCEGgcgatQbogWptFwanscyPFuSHRIpRT7g6EgDMSWN/K24qC2VyYmcMufOiV9HzSNiXD43bWT2VdMK0BVkAi18gdWg92HYpnOP7G/VsVjEfF49/JfRZ3wn78dDyzWSZRf2ZZMBr8K7MtG2PiwlWSe1VcT/EczkgVwWQFMapA7uRwZABMUAxvGsK8rjCYGYkEHB2VSsfFPmclceVEPCM3HWXBfujZ9UPkTt0xVqPF88Ef+MisCw4SAvhcLI4yVdc3yAUUz9l5XU2wuAAd2toM8vGIsTVd4kOdxlcEzy29Bn3+QYYn4Y3No0XU1pOUBbP15Xfcl/KvpGIRdUkbv8VzRfDMbEsOdyrgYuvHqAy8kNzds2ekiuALY5cUB+721v1gIeWL8ew6MzR3VwTPzqxUFlldurJ4UMX5dCfCmjJWBUvdpwblIqJ+X0Rui7O3iui8riKYvVVXUiXgZOuOd5M76+NZFszW4ykNqlM6CVYK7+FhavAe/PXA6hvxUX2jSCp1fu3axuvck5QFkwGAC7BomueI1+k2HU9JKu6soCKYC+j3KWjw8cXHWUTIBY7O6+LaJeV64DmkQX1pGXzyfKnp7+2IqmlV8GXVR0Zsul623kov8br9bXeXA/vgcJH4nS4iJHKv1mWZ9qyN11UEyxqjVA0eB7NenjJVsIbyjuwnNRXBoW6xpderm2XmWO1VnQ5LSO4ZqR5YIwqMYiZaeJUZ2EUkrVA93oK/ItiMx7xOIxmK7FTH7ON+qgHHWBZ80Tu/WD5bI/y0IsfIpth/9lb1wCqLt0kQ9sT2OexijVHTGGf7XxBM11KXaqM09G9rlqUS0ySaXRjLgm8iqRqGSsZzOkGJvbaxBfu8MFhEjvvSp6UPj0XdJpdPDYT1w/F6YM2vpQb0XDrUaoWsoXNTzSf2s7aCYDLVzybguI86jzTCg22sKXmarhzY8zS7BI3J07OHVyUQq8HSYU6WBa9vHZXC24eJm+YyxAru2sl1wUM7tIg2paeackpXGrT5av/LgVXy1Qlb3fcdk5pHkTvZhRy9KnhXExyaSkSObZPQ0obVar081d7H/MqB1S2yUVSrH4psaTfMtoemEsnRr1tVMDfn07POEjR8WhqidB7OuLbR06pgHc3wsMmu5VFUNjancRNRoeF91LYWeGuqaWuRo009c8J00gnqt0HNemAx1bueV+eIqck9DZeqpljnf36Nu1cDt3+RiBAMbR74PGGjrRjPJwmsCxZEwd1l4aY7Dt1WpcFScaQIh4/20yLqJo1xP+O5IljxvE+np6ksalboVKikpL4FfzFwnJlVNtDsQk/FnjnxIF8WBf/8XfQH/A/AvwD2DA1dmGNskwAAAABJRU5ErkJggg==", "qr_id": "e5e36834a2294d83868d587af8ae8e13", "result_message": { "code": "0", "description": "Exito" } }, "additional_fields": null, "lifecycle": [ { "state": "REGISTRADO", "date": { "utc_time": "2024-03-12T22:49:36.018Z", "unix_time": 1710282940 } }, { "state": "PENDIENTE", "date": { "utc_time": "2024-03-12T22:49:36.018Z", "unix_time": 1710282940 } } ] } ] }, "meta": { "status": { "code": "00", "message_ilgn": [ { "locale": "es_PE", "value": "Se proceso correctamente" } ] } } } ``` *** ## Ejemplo: autorizado Response de consulta de QR en estado `AUTORIZADO`. ```json theme={"system"} { "success": true, "merchant_code": "abc", "operation": { "merchant_operation_number": "2391645", "state": "AUTORIZADO", "amount": "15000", "currency": "604", "transactions": [ { "transaction_id": "5hk8rwa3h3cq9oyfs3a28v1ms", "channel": "ecommerce", "state": "AUTORIZADO", "state_reason": "Approval and completed successfully", "amount": "15000", "currency": "604", "payment_method": { "method_name": "QR", "method_details": { "masked_pan": "455788******9268", "brand": "VISA", "bin": "455788", "last_pan": "9268", "card_type": "DEBIT", "card_country": "PE", "issuer": "BANCO DE CREDITO DEL PERU - BCP", "callback_url": "https://pay-me.com/callback" } }, "expiration_date": null, "processor_response": { "authorization_code": "055552", "result_message": { "code": "00", "description": "Approval and completed successfully" }, "brand_transaction_id": "A055552" }, "additional_fields": null, "lifecycle": [ { "state": "REGISTRADO", "date": { "utc_time": "2024-03-12T22:49:36.018Z", "unix_time": 1710282940 } }, { "state": "PENDIENTE", "date": { "utc_time": "2024-03-12T22:49:36.018Z", "unix_time": 1710282940 } }, { "state": "AUTORIZADO", "date": { "utc_time": "2024-03-12T22:49:36.018Z", "unix_time": 1710282940 } } ] } ] }, "meta": { "status": { "code": "00", "message_ilgn": [ { "locale": "es_PE", "value": "Se proceso correctamente" } ] } } } ``` *** ## Siguiente paso Revisa la cancelación para operaciones que todavía puedan anularse. # Api de Consulta con Tarjeta Source: https://docs.pay-me.com/payin/consulta-tarjeta Consulta el estado de una operación con tarjeta en PayIn. Usa esta consulta para validar el estado de una transacción con tarjeta, realizar conciliación o confirmar el resultado final desde backend. Este flujo usa la misma estructura general documentada en el [Overview de Consulta](/payin/consulta). Aquí se detalla específicamente el objeto `operation.transactions[]` para pagos con tarjeta. *** ## ¿Cuándo usarla? Cuando necesitas validar el resultado almacenado en tu sistema con el estado real de la transacción. Cuando debes confirmar desde backend si el pago con tarjeta terminó autorizado, pendiente, denegado o expirado. Cuando la tarjeta requiere autenticación 3DS Redirect y necesitas consultar `continue_url`, expiración o el resultado posterior. Si integras Flex, usa esta consulta como validación final antes de cerrar la orden, no solo el resultado mostrado en frontend. *** ## Consideraciones Conserva `merchant_code`, `merchant_operation_number` y `transaction_id` desde la autorización para consultar sin ambigüedad. En esta documentación se usa `method_details` para mantener consistencia con el resto de la referencia. Si en material previo encuentras `method_detail`, trátalo como el mismo objeto. *** ## Response Objeto `operation.transactions[]` para pagos con tarjeta dentro de la trama de respuesta del [API de Consulta](/payin/consulta). ### Objeto `operation.transactions[]` | Campo | Descripción | Tipo | Obligatorio | | :- | :- | :- | :- | | `operation.transactions[].transaction_id` | Identificador único de la transacción. | String | SI | | `operation.transactions[].channel` | Canal por el cual se realizó la transacción. Valor esperado: `ecommerce`. | String | SI | | `operation.transactions[].state` | Estado actual de la transacción. Valores frecuentes: `PENDIENTE`, `INVALIDO`, `AUTORIZADO`, `DENEGADO`, `CANCELADO`, `EXPIRADO`, `LIQUIDADO`. | String | SI | | `operation.transactions[].state_reason` | Observación o detalle del estado. | String | SI | | `operation.transactions[].amount` | Monto de la transacción. | String | SI | | `operation.transactions[].currency` | Código de moneda de la operación. | String | SI | | `operation.transactions[].payment_method` | Objeto que contiene información sobre el método de pago usado en la transacción. En este flujo el método es `CARD`. | Object | SI | | `operation.transactions[].payment_method.method_name` | Nombre del método de pago usado en la transacción. | String | SI | | `operation.transactions[].payment_method.method_details` | Objeto que contiene información detallada relacionada al método. | Object | NO | | `operation.transactions[].continue_url` | Visible en estado `PENDIENTE`. URL para continuar el proceso de pago cuando el método CARD requiere autenticación. | String | NO | | `operation.transactions[].expiration_date` | Visible en estado `PENDIENTE`. Objeto que contiene la fecha en la que expirará la transacción. | Object | NO | | `operation.transactions[].processor_response` | Visible normalmente en estados `AUTORIZADO`, `DENEGADO` o `EXTORNADO`. Objeto con el resultado de autorización devuelto por la procesadora. | Object | NO | | `operation.transactions[].authentication_result` | Objeto que contiene el resultado de la autenticación usada en la transacción. | Object | NO | | `operation.transactions[].risk_evaluation` | Objeto que contiene el resultado de la evaluación de antifraude. | Object | NO | | `operation.transactions[].additional_fields` | Objeto que contiene los datos adicionales enviados en el request de autorización. | Object | NO | | `operation.transactions[].lifecycle` | Array que contiene el listado de estados por los que pasó la transacción. | Array | SI | *** ### Objeto `operation.transactions[].payment_method.method_details` | Campo | Descripción | Tipo | Obligatorio | | :- | :- | :- | :- | | `operation.transactions[].payment_method.method_details.masked_pan` | Tarjeta enmascarada usada en la transacción. | String | NO | | `operation.transactions[].payment_method.method_details.brand` | Marca de la tarjeta usada en la transacción. | String | NO | | `operation.transactions[].payment_method.method_details.bin` | BIN de la tarjeta usada en la transacción. | String | NO | | `operation.transactions[].payment_method.method_details.last_pan` | Últimos 4 dígitos de la tarjeta usada en la transacción. | String | NO | | `operation.transactions[].payment_method.method_details.card_type` | Tipo de tarjeta. | String | NO | | `operation.transactions[].payment_method.method_details.card_country` | País de la tarjeta. | String | NO | | `operation.transactions[].payment_method.method_details.issuer` | Banco emisor de la tarjeta. | String | NO | | `operation.transactions[].payment_method.method_details.installments` | Objeto que contiene información de planes y cuotas usadas en la transacción. | Object | NO | | `operation.transactions[].payment_method.method_details.redirect_url` | Visible cuando aplica redirect. URL enviada en el request de autorización. | String | NO | | `operation.transactions[].payment_method.method_details.callback_url` | URL de callback enviada en el request de autorización. | String | NO | *** ### Objeto `operation.transactions[].payment_method.method_details.installments` | Campo | Descripción | Tipo | Obligatorio | | :- | :- | :- | :- | | `operation.transactions[].payment_method.method_details.installments.plan` | Plan de cuotas. Valores frecuentes: `NORMAL`, `DIFERIDO`. | String | NO | | `operation.transactions[].payment_method.method_details.installments.installment_number` | Número de cuotas. | String | NO | *** ### Objeto `operation.transactions[].expiration_date` | Campo | Descripción | Tipo | Obligatorio | | :- | :- | :- | :- | | `operation.transactions[].expiration_date.utc_time` | Fecha en UTC. | String | NO | | `operation.transactions[].expiration_date.unix_time` | Fecha en Unix time. | Integer | NO | *** ### Objeto `operation.transactions[].processor_response` | Campo | Descripción | Tipo | Obligatorio | | :- | :- | :- | :- | | `operation.transactions[].processor_response.authorization_code` | Código de autorización. | String | NO | | `operation.transactions[].processor_response.brand_transaction_id` | ID de la transacción ante la marca. | String | NO | | `operation.transactions[].processor_response.result_message` | Objeto que contiene el mensaje del resultado de la autorización. | Object | NO | *** ### Objeto `operation.transactions[].processor_response.result_message` | Campo | Descripción | Tipo | Obligatorio | | :- | :- | :- | :- | | `operation.transactions[].processor_response.result_message.code` | Código del resultado de la autorización. | String | NO | | `operation.transactions[].processor_response.result_message.description` | Descripción del resultado de la autorización. | String | NO | *** ### Objeto `operation.transactions[].authentication_result` | Campo | Descripción | Tipo | Obligatorio | | :- | :- | :- | :- | | `operation.transactions[].authentication_result.version` | Versión del protocolo de autenticación. | String | NO | | `operation.transactions[].authentication_result.eci` | ECI. | String | NO | | `operation.transactions[].authentication_result.vci` | VCI. | String | NO | | `operation.transactions[].authentication_result.ds_transaction_id` | DS Transaction ID. | String | NO | | `operation.transactions[].authentication_result.3ds_transaction_id` | 3DS Server Transaction ID. | String | NO | *** ### Objeto `operation.transactions[].lifecycle` | Campo | Descripción | Tipo | Obligatorio | | :- | :- | :- | :- | | `operation.transactions[].lifecycle[].state` | Estado de la transacción. Valores frecuentes: `REGISTRADO`, `PENDIENTE`, `INVALIDO`, `AUTORIZADO`, `DENEGADO`, `CANCELADO`, `EXPIRADO`, `LIQUIDADO`. | String | SI | | `operation.transactions[].lifecycle[].date` | Objeto que contiene la fecha en la que se realizó el cambio de estado. | Object | SI | *** ### Objeto `operation.transactions[].lifecycle[].date` | Campo | Descripción | Tipo | Obligatorio | | :- | :- | :- | :- | | `operation.transactions[].lifecycle[].date.utc_time` | Fecha en UTC. | String | SI | | `operation.transactions[].lifecycle[].date.unix_time` | Fecha en Unix time. | Integer | SI | *** ## Ejemplo 1: sin autenticación Response de consulta de tarjeta sin autenticación. ```json theme={"system"} { "success": true, "merchant_code": "abc", "operation": { "merchant_operation_number": "2391645", "state": "AUTORIZADO", "amount": "15000", "currency": "604", "transactions": [ { "transaction_id": "5hk8rwa3h3cq9oyfs3a28v1ms", "channel": "ecommerce", "state": "AUTORIZADO", "state_reason": "Approval and completed successfully", "amount": "15000", "currency": "604", "payment_method": { "method_name": "CARD", "method_details": { "masked_pan": "455788******9268", "brand": "VISA", "bin": "455788", "last_pan": "9268", "card_type": "DEBIT", "card_country": "PE", "issuer": "BANCO DE CREDITO DEL PERU - BCP", "installments": { "plan": "NORMAL", "installment_number": "2" }, "redirect_url": "https://pay-me.com", "callback_url": "https://pay-me.com/callback" } }, "processor_response": { "authorization_code": "055552", "brand_transaction_id": "A055552", "result_message": { "code": "00", "description": "Approval and completed successfully" } }, "lifecycle": [ { "state": "REGISTRADO", "date": { "utc_time": "2024-03-12T22:49:36.018Z", "unix_time": 1710282940 } }, { "state": "PENDIENTE", "date": { "utc_time": "2024-03-12T22:49:36.018Z", "unix_time": 1710282940 } }, { "state": "AUTORIZADO", "date": { "utc_time": "2024-03-12T22:49:36.018Z", "unix_time": 1710282940 } } ] } ] }, "meta": { "status": { "code": "00", "message_ilgn": [ { "locale": "es_PE", "value": "Se proceso correctamente" } ] } } } ``` *** ## Ejemplo 2: con autenticación Redirect Response de consulta de tarjeta con Redirect para un API único de autorización más autenticación 3DS. ```json theme={"system"} { "success": true, "merchant_code": "abc", "operation": { "merchant_operation_number": "2391645", "state": "PENDIENTE", "amount": "15000", "currency": "604", "transactions": [ { "transaction_id": "5hk8rwa3h3cq9oyfs3a28v1ms", "channel": "ecommerce", "state": "PENDIENTE", "state_reason": "Url generada para continuar con la Autenticacion", "continue_url": "https://api.dev.alignet.io/payment/continue/card/81vrxn30vja1gwcfsdng4i5g5", "expiration_date": { "utc_time": "2024-03-12T22:49:36.018Z", "unix_time": 1711585037 }, "amount": "15000", "currency": "604", "payment_method": { "method_name": "CARD", "method_details": { "masked_pan": "455788******9268", "brand": "VISA", "bin": "455788", "last_pan": "9268", "card_type": "DEBIT", "card_country": "PE", "issuer": "BANCO DE CREDITO DEL PERU - BCP", "installments": { "plan": "NORMAL", "installment_number": "2" }, "redirect_url": "https://pay-me.com", "callback_url": "https://pay-me.com/callback" } }, "lifecycle": [ { "state": "REGISTRADO", "date": { "utc_time": "2024-03-12T22:49:36.018Z", "unix_time": 1710282940 } }, { "state": "PENDIENTE", "date": { "utc_time": "2024-03-12T22:49:36.018Z", "unix_time": 1710282940 } } ] } ] }, "meta": { "status": { "code": "00", "message_ilgn": [ { "locale": "es_PE", "value": "Se proceso correctamente" } ] } } } ``` *** ## Ejemplo 3: con datos de autenticación Response de consulta de tarjeta con datos resultado de autenticación 3DS obtenidos previamente por otro API 3DS. ```json theme={"system"} { "success": true, "merchant_code": "abc", "operation": { "merchant_operation_number": "2391645", "state": "AUTORIZADO", "amount": "15000", "currency": "604", "transactions": [ { "transaction_id": "5hk8rwa3h3cq9oyfs3a28v1ms", "channel": "ecommerce", "state": "AUTORIZADO", "state_reason": "Approval and completed successfully", "amount": "15000", "currency": "604", "payment_method": { "method_name": "CARD", "method_details": { "masked_pan": "411111********1111", "brand": "VISA", "bin": "411111", "last_pan": "9268", "card_type": "DEBIT", "card_country": "PE", "issuer": "BANCO DE CREDITO DEL PERU - BCP", "installments": { "plan": "NORMAL", "installment_number": "2" }, "callback_url": "https://pay-me.com/callback" } }, "processor_response": { "authorization_code": "055552", "brand_transaction_id": "100B", "result_message": { "code": "00", "description": "Approval and completed successfully" } }, "additional_fields": null, "authentication_result": { "version": "2.1.0", "eci": "05", "vci": "TSYF", "ds_transaction_id": "", "3ds_transaction_id": "" }, "lifecycle": [ { "state": "REGISTRADO", "date": { "utc_time": "2024-03-12T22:49:36.018Z", "unix_time": 1710282940 } }, { "state": "PENDIENTE", "date": { "utc_time": "2024-03-12T22:49:36.018Z", "unix_time": 1710282940 } }, { "state": "AUTORIZADO", "date": { "utc_time": "2024-03-12T22:49:36.018Z", "unix_time": 1710282940 } } ] } ] }, "meta": { "status": { "code": "00", "message_ilgn": [ { "locale": "es_PE", "value": "Procesado correctamente" } ] } } } ``` *** ## Siguiente paso Si la transacción sigue autorizada, revisa cómo cancelarla antes de liquidación. # Api de Consulta con Transferencia Bancaria Source: https://docs.pay-me.com/payin/consulta-transferencia-bancaria Consulta el estado de una operación con transferencia bancaria en PayIn. Usa esta consulta para verificar el estado actualizado de pagos con transferencia bancaria, especialmente cuando la confirmación no llega de inmediato y necesitas validar el resultado final desde backend. Este flujo usa la misma estructura general documentada en el [Overview de Consulta](/payin/consulta). Aquí se detalla específicamente el objeto `operation.transactions[]` para pagos con transferencia bancaria. *** ## ¿Cuándo usarla? Cuando la autorización inicial deja la operación en seguimiento o `PENDIENTE`. Cuando necesitas confirmar desde backend si la transferencia terminó autorizada, denegada, expirada o cancelada. Cuando necesitas consultar `continue_url`, expiración o volver a dirigir al usuario para completar el pago. Cuando no recibes confirmación inmediata vía notificaciones y necesitas validar el estado por consulta. *** ## Consideraciones Conserva `merchant_code`, `merchant_operation_number` y `transaction_id` desde la autorización para consultar sin ambigüedad. En esta documentación se usa `method_details` para mantener consistencia con el resto de la referencia. Si en material previo encuentras `method_detail`, trátalo como el mismo objeto. Los campos de `processor_response` para transferencia bancaria pueden variar según la procesadora o el banco. Tómalos como referenciales. *** ## Response Objeto `operation.transactions[]` para pagos con transferencia bancaria dentro de la trama de respuesta del [API de Consulta](/payin/consulta). ### Objeto `operation.transactions[]` | Campo | Descripción | Tipo | Obligatorio | | :- | :- | :- | :- | | `operation.transactions[].transaction_id` | Identificador único de la transacción. | String | SI | | `operation.transactions[].channel` | Canal por el cual se realizó la transacción. Valor esperado: `ecommerce`. | String | SI | | `operation.transactions[].state` | Estado actual de la transacción. Valores frecuentes: `PENDIENTE`, `INVALIDO`, `AUTORIZADO`, `DENEGADO`, `CANCELADO`, `EXPIRADO`, `LIQUIDADO`. | String | SI | | `operation.transactions[].state_reason` | Observación o detalle del estado. | String | SI | | `operation.transactions[].amount` | Monto de la transacción. | String | SI | | `operation.transactions[].currency` | Código de la moneda de la operación. | String | SI | | `operation.transactions[].payment_method` | Objeto que contiene información sobre el método de pago usado en la transacción. | Object | SI | | `operation.transactions[].payment_method.method_name` | Nombre del método de pago usado en la transacción. Valor esperado: `BANK_TRANSFER`. | String | SI | | `operation.transactions[].payment_method.method_details` | Objeto que contiene información detallada relacionada al método. | Object | NO | | `operation.transactions[].continue_url` | Visible en estado `PENDIENTE`. URL para continuar el proceso de pago. | String | NO | | `operation.transactions[].expiration_date` | Visible en estado `PENDIENTE`. Objeto que contiene la fecha en la que expirará la transacción. | Object | NO | | `operation.transactions[].processor_response` | Visible normalmente en estados `AUTORIZADO`, `DENEGADO` o `EXTORNADO`. Objeto que contiene el resultado de la autorización. | Object | NO | | `operation.transactions[].additional_fields` | Objeto que contiene los datos adicionales de la transacción enviados en la autorización. | Object | NO | | `operation.transactions[].lifecycle` | Array que contiene el listado de estados por los cuales pasó la transacción. | Array | SI | *** ### Objeto `operation.transactions[].payment_method.method_details` | Campo | Descripción | Tipo | Obligatorio | | :- | :- | :- | :- | | `operation.transactions[].payment_method.method_details.redirect_url` | Visible en estado `PENDIENTE`. URL del redirect enviado en la autorización. | String | SI | | `operation.transactions[].payment_method.method_details.callback_url` | URL del callback enviado en la autorización. | String | NO | *** ### Objeto `operation.transactions[].expiration_date` | Campo | Descripción | Tipo | Obligatorio | | :- | :- | :- | :- | | `operation.transactions[].expiration_date.utc_time` | Fecha en UTC. | String | NO | | `operation.transactions[].expiration_date.unix_time` | Fecha en Unix time. | Integer | NO | *** ### Objeto `operation.transactions[].processor_response` | Campo | Descripción | Tipo | Obligatorio | | :- | :- | :- | :- | | `operation.transactions[].processor_response.origin_account` | Visible en estado `AUTORIZADO` o `DENEGADO`. Cuenta bancaria enmascarada desde donde se realizó la transferencia. | String | NO | | `operation.transactions[].processor_response.request_id` | Visible en estado `AUTORIZADO` o `DENEGADO`. ID de la transacción generada por la procesadora. | String | NO | | `operation.transactions[].processor_response.operation_id` | Visible en estado `AUTORIZADO` o `DENEGADO`. ID de la operación generada por el banco. | String | NO | *** ### Objeto `operation.transactions[].lifecycle` | Campo | Descripción | Tipo | Obligatorio | | :- | :- | :- | :- | | `operation.transactions[].lifecycle[].state` | Estado de la transacción. Valores frecuentes: `REGISTRADO`, `PENDIENTE`, `INVALIDO`, `AUTORIZADO`, `DENEGADO`, `CANCELADO`, `EXPIRADO`, `LIQUIDADO`. | String | SI | | `operation.transactions[].lifecycle[].date` | Objeto que contiene la fecha en la que se realizó el cambio de estado. | Object | SI | *** ### Objeto `operation.transactions[].lifecycle[].date` | Campo | Descripción | Tipo | Obligatorio | | :- | :- | :- | :- | | `operation.transactions[].lifecycle[].date.utc_time` | Fecha en UTC. | String | SI | | `operation.transactions[].lifecycle[].date.unix_time` | Fecha en Unix time. | Integer | SI | *** ## Ejemplo: pendiente Response de consulta de transferencia bancaria con estado `PENDIENTE`. ```json theme={"system"} { "success": true, "merchant_code": "abc", "operation": { "merchant_operation_number": "2391645", "state": "PENDIENTE", "created_at": { "utc_time": "2024-03-12T22:49:36.018Z", "unix_time": 1710282940 }, "amount": "15000", "currency": "604", "transactions": [ { "transaction_id": "5hk8rwa3h3cq9oyfs3a28v1ms", "channel": "ecommerce", "state": "PENDIENTE", "state_reason": "Url generada para continuar con el pago", "amount": "15000", "currency": "604", "payment_method": { "method_name": "BANK_TRANSFER", "method_details": { "redirect_url": "https://pay-me.com", "callback_url": "https://pay-me.com/callback" } }, "continue_url": "https://api.dev.alignet.io/payment/continue/bank_transfer/c7dagnrwgxgh1b6kzwirheezv", "expiration_date": { "utc_time": "2024-03-12T22:49:36.018Z", "unix_time": 1710282940 }, "processor_response": null, "additional_fields": null, "lifecycle": [ { "state": "REGISTRADO", "date": { "utc_time": "2024-03-12T22:49:36.018Z", "unix_time": 1710282940 } }, { "state": "PENDIENTE", "date": { "utc_time": "2024-03-12T22:49:36.018Z", "unix_time": 1710282940 } } ] } ] }, "meta": { "status": { "code": "00", "message_ilgn": [ { "locale": "es_PE", "value": "Se proceso correctamente" } ] } } } ``` *** ## Ejemplo: autorizada Response de consulta de transferencia bancaria con estado `AUTORIZADO`. ```json theme={"system"} { "success": true, "merchant_code": "abc", "operation": { "merchant_operation_number": "2391645", "state": "AUTORIZADO", "amount": "15000", "currency": "604", "transactions": [ { "transaction_id": "5hk8rwa3h3cq9oyfs3a28v1ms", "channel": "ecommerce", "state": "AUTORIZADO", "state_reason": "Pago exitoso", "amount": "15000", "currency": "604", "payment_method": { "method_name": "BANK_TRANSFER", "method_details": { "redirect_url": "https://pay-me.com", "callback_url": "https://pay-me.com/callback" } }, "continue_url": null, "expiration_date": null, "processor_response": { "origin_account": "055552", "request_id": "055552", "operation_id": "055552" }, "additional_fields": null, "lifecycle": [ { "state": "REGISTRADO", "date": { "utc_time": "2024-03-12T22:49:36.018Z", "unix_time": 1710282940 } }, { "state": "PENDIENTE", "date": { "utc_time": "2024-03-12T22:49:36.018Z", "unix_time": 1710282940 } }, { "state": "AUTORIZADO", "date": { "utc_time": "2024-03-12T22:49:36.018Z", "unix_time": 1710282940 } } ] } ] }, "meta": { "status": { "code": "00", "message_ilgn": [ { "locale": "es_PE", "value": "Se proceso correctamente" } ] } } } ``` *** ## Siguiente paso Revisa la cancelación si tu flujo de negocio necesita anular una operación autorizada. # Api de Consulta con Yape Source: https://docs.pay-me.com/payin/consulta-yape Consulta el estado de una operación con Yape en PayIn. Usa esta consulta para validar el estado de cobros con Yape cuando necesitas respaldo adicional, conciliación o confirmación final desde backend. Este flujo usa la misma estructura general documentada en el [Overview de Consulta](/payin/consulta). Aquí se detalla específicamente el objeto `operation.transactions[]` para pagos con Yape. *** ## ¿Cuándo usarla? Cuando necesitas contrastar el estado del pago con tu sistema o con el resultado registrado por tu backend. Cuando debes confirmar desde backend si el cobro con Yape terminó autorizado, denegado, extornado o liquidado. Cuando requieres revisar una operación reportada por el comercio o por el usuario final. Si integras Flex, úsala como validación final del resultado antes de marcar la orden como pagada. *** ## Consideraciones Conserva `merchant_code`, `merchant_operation_number` y `transaction_id` desde la autorización para consultar sin ambigüedad. En esta documentación se usa `method_details` para mantener consistencia con el resto de la referencia. Si en material previo encuentras `method_detail`, trátalo como el mismo objeto. *** ## Response Objeto `operation.transactions[]` para pagos con Yape dentro de la trama de respuesta del [API de Consulta](/payin/consulta). ### Objeto `operation.transactions[]` | Campo | Descripción | Tipo | Obligatorio | | :- | :- | :- | :- | | `operation.transactions[].transaction_id` | Identificador único de la transacción. | String | SI | | `operation.transactions[].channel` | Canal por el cual se realizó la transacción. Valor esperado: `ecommerce`. | String | SI | | `operation.transactions[].state` | Estado actual de la transacción. Valores frecuentes: `PENDIENTE`, `INVALIDO`, `AUTORIZADO`, `DENEGADO`, `EXTORNADO`, `LIQUIDADO`. | String | SI | | `operation.transactions[].state_reason` | Observación o detalle del estado. | String | SI | | `operation.transactions[].amount` | Monto de la transacción. | String | SI | | `operation.transactions[].currency` | Código de la moneda de la operación. | String | SI | | `operation.transactions[].payment_method` | Objeto que contiene información sobre el método de pago usado en la transacción. | Object | SI | | `operation.transactions[].payment_method.method_name` | Nombre del método de pago usado en la transacción. Valor esperado: `YAPE`. | String | SI | | `operation.transactions[].payment_method.method_details` | Objeto que contiene información detallada relacionada al método. | Object | SI | | `operation.transactions[].processor_response` | Visible normalmente en estados `AUTORIZADO`, `DENEGADO` o `EXTORNADO`. Objeto que contiene el resultado de la autorización. | Object | NO | | `operation.transactions[].additional_fields` | Objeto que contiene los datos adicionales de la transacción enviados en el request. | Object | NO | | `operation.transactions[].lifecycle` | Array que contiene el listado de estados por los cuales pasó la transacción. | Array | SI | *** ### Objeto `operation.transactions[].payment_method.method_details` | Campo | Descripción | Tipo | Obligatorio | | :- | :- | :- | :- | | `operation.transactions[].payment_method.method_details.phone` | Objeto `phone` que contiene la información del número telefónico usado para realizar el Yape. | Object | SI | | `operation.transactions[].payment_method.method_details.masked_pan` | Tarjeta enmascarada usada en la transacción. | String | SI | | `operation.transactions[].payment_method.method_details.brand` | Marca de la tarjeta usada en la transacción. | String | SI | | `operation.transactions[].payment_method.method_details.bin` | BIN de la tarjeta usada en la transacción. | String | SI | | `operation.transactions[].payment_method.method_details.last_pan` | Últimos 4 dígitos de la tarjeta usada en la transacción. | String | SI | | `operation.transactions[].payment_method.method_details.card_type` | Tipo de tarjeta. | String | SI | | `operation.transactions[].payment_method.method_details.card_country` | País de la tarjeta. | String | SI | | `operation.transactions[].payment_method.method_details.issuer` | Banco emisor de la tarjeta. | String | SI | | `operation.transactions[].payment_method.method_details.callback_url` | URL del callback enviado en el request. | String | NO | *** ### Objeto `operation.transactions[].payment_method.method_details.phone` | Campo | Descripción | Tipo | Obligatorio | | :- | :- | :- | :- | | `operation.transactions[].payment_method.method_details.phone.country_code` | Código del país. | String | SI | | `operation.transactions[].payment_method.method_details.phone.subscriber` | Número celular. | String | SI | *** ### Objeto `operation.transactions[].processor_response` | Campo | Descripción | Tipo | Obligatorio | | :- | :- | :- | :- | | `operation.transactions[].processor_response.authorization_code` | Código de autorización. | String | NO | | `operation.transactions[].processor_response.brand_transaction_id` | ID de la transacción ante la marca. | String | NO | | `operation.transactions[].processor_response.result_message` | Objeto que contiene el mensaje del resultado de la autorización. | Object | NO | *** ### Objeto `operation.transactions[].processor_response.result_message` | Campo | Descripción | Tipo | Obligatorio | | :- | :- | :- | :- | | `operation.transactions[].processor_response.result_message.code` | Código del resultado de la autorización. | String | NO | | `operation.transactions[].processor_response.result_message.description` | Descripción del resultado de la autorización. | String | NO | *** ### Objeto `operation.transactions[].lifecycle` | Campo | Descripción | Tipo | Obligatorio | | :- | :- | :- | :- | | `operation.transactions[].lifecycle[].state` | Estado de la transacción. Valores frecuentes: `REGISTRADO`, `PENDIENTE`, `INVALIDO`, `AUTORIZADO`, `DENEGADO`, `EXTORNADO`, `LIQUIDADO`. | String | SI | | `operation.transactions[].lifecycle[].date` | Objeto que contiene la fecha en la que se realizó el cambio de estado. | Object | SI | *** ### Objeto `operation.transactions[].lifecycle[].date` | Campo | Descripción | Tipo | Obligatorio | | :- | :- | :- | :- | | `operation.transactions[].lifecycle[].date.utc_time` | Fecha en UTC. | String | SI | | `operation.transactions[].lifecycle[].date.unix_time` | Fecha en Unix time. | Integer | SI | *** ## Ejemplo Response de consulta de Yape. ```json theme={"system"} { "success": true, "merchant_code": "abc", "operation": { "merchant_operation_number": "2391645", "state": "AUTORIZADO", "amount": "15000", "currency": "604", "transactions": [ { "transaction_id": "5hk8rwa3h3cq9oyfs3a28v1ms", "channel": "ecommerce", "state": "AUTORIZADO", "state_reason": "Approval and completed successfully", "amount": "15000", "currency": "604", "payment_method": { "method_name": "YAPE", "method_details": { "phone": { "country_code": "+51", "subscriber": "969929157" }, "masked_pan": "455788******9268", "brand": "VISA", "bin": "455788", "last_pan": "9268", "card_type": "DEBIT", "card_country": "PE", "issuer": "BANCO DE CREDITO DEL PERU - BCP", "callback_url": "https://pay-me.com/callback" } }, "processor_response": { "authorization_code": "055552", "brand_transaction_id": "A055552", "result_message": { "code": "00", "description": "Approval and completed successfully" } }, "lifecycle": [ { "state": "REGISTRADO", "date": { "utc_time": "2024-03-12T22:49:36.018Z", "unix_time": 1710282940 } }, { "state": "PENDIENTE", "date": { "utc_time": "2024-03-12T22:49:36.018Z", "unix_time": 1710282940 } }, { "state": "AUTORIZADO", "date": { "utc_time": "2024-03-12T22:49:36.018Z", "unix_time": 1710282940 } } ] } ] }, "meta": { "status": { "code": "00", "message_ilgn": [ { "locale": "es_PE", "value": "Se proceso correctamente" } ] } } } ``` *** ## Siguiente paso Si la operación aún lo permite, revisa el flujo de cancelación. # PayIn Source: https://docs.pay-me.com/payin/introduccion Conoce los métodos de pago disponibles en Pay-me y cómo funciona el flujo de autorización. PayIn es el módulo de cobros de la API de Pay-me. Permite aceptar pagos de consumidores a través de múltiples métodos, todos orquestados desde un único punto de integración. *** ## Métodos disponibles ecommerce · Síncrono · 3DS según configuración ecommerce · Síncrono ecommerce · Asíncrono · Redirección ecommerce · Asíncrono · Redirección ecommerce · Asíncrono · Redirección ecommerce · Asíncrono · Redirección ecommerce · 🔜 Próximamente *** ## Flujo general de un pago Genera un token vigente desde el [API de Autenticación](/api-de-pagos/autenticacion) y reutilízalo mientras siga activo. Haz un `POST` al endpoint de autorización con los datos del pago y el método elegido. La API retorna el estado de la transacción: `AUTORIZADO`, `DENEGADO`, `PENDIENTE`, entre otros. Recibe la confirmación final en tu endpoint vía [notificación Server-to-Server](/payin/notificaciones). *** ## Contenido de esta sección Revisa la estructura general y los flujos específicos por método de pago ecommerce. Consulta el estado de una transacción con páginas separadas por método. Cancela una transacción autorizada antes de su liquidación. Configura tu endpoint para recibir confirmaciones Server-to-Server. Estados, códigos de respuesta y datos de prueba. *** ## Siguiente paso Entra al resumen de autorización y navega por cada método de pago. # API de Notificaciones S2S Source: https://docs.pay-me.com/payin/notificaciones Recibe, valida y prueba la notificación Server-to-Server del resultado final de autorización. Pay-me notifica el resultado final de la autorización enviando un `POST` a la `callback_url` configurada por el comercio. Este canal es clave para confirmar estados finales desde backend, especialmente en métodos asíncronos o en flujos donde el usuario puede abandonar el frontend. *** ## Panorama general Comparte tu URL S2S con el equipo de Pay-me o Alignet para que pueda quedar registrada y validada en la configuración del merchant cuando aplique. La notificación viaja de servidor a servidor y no depende del navegador del comprador. Cada notificación incluye un header `signature` que debes validar con la llave pública del ambiente. Usa este canal para confirmar el resultado final de la autorización junto con [Consulta](/payin/consulta). Tu endpoint debe responder `HTTP 200` en menos de 10 segundos o Pay-me reintentará más adelante. Si el método usa `callback_url`, prepara un endpoint backend público y accesible por HTTPS. Además, según el esquema de integración, esa URL puede ser compartida con Pay-me o Alignet para configurarla también a nivel del merchant del comercio. No dependas solo del retorno del usuario para cambiar el estado de la orden. *** ## Flujo general Define una URL S2S pública y compártela con el equipo de Pay-me o Alignet. En los flujos que lo soportan puedes enviarla como `callback_url`, y cuando aplique también puede quedar registrada a nivel del merchant del comercio. Pay-me enviará el resultado final de la autorización en formato `application/json` al endpoint configurado. Verifica el header `signature` con la llave pública del ambiente usando el body crudo recibido. Guarda el evento, valida el estado y evita procesar dos veces la misma transacción. Devuelve `HTTP 200` en menos de 10 segundos cuando la notificación haya sido aceptada por tu sistema. *** ## Qué conviene validar Confirma la presencia de `success`, `action`, `merchant_code`, `merchant_operation_number`, `transaction.transaction_id`, `transaction.state`, `transaction.amount`, `transaction.currency` y `meta.status`. Para verificar la firma usa el body exactamente como llegó por HTTP. No reserialices el JSON ni reordenes llaves antes de validar, porque eso cambia los bytes firmados. Usa `merchant_operation_number` y `transaction.transaction_id` como claves de correlación para ignorar duplicados y soportar reintentos. Si tu sistema rechaza la notificación o tienes dudas sobre el estado, realiza una verificación adicional con [API de Consulta](/payin/consulta). *** ## Verificación del `signature` El `signature` es una firma digital generada por Pay-me con una llave privada asimétrica. Su objetivo es proteger la integridad del contenido enviado al comercio tanto en `ServerToServer` como en flujos de `redirect`. ### Especificaciones técnicas | Propiedad | Valor | | :- | :- | | Tipo de llave | Asimétrica | | Especificación | `RSA_2048` | | Longitud | `2048 bits` | | Uso | Firma y verificación | | Algoritmo | `SHA512withRSA` | | Longitud del `signature` | Hasta `512` caracteres | ### Paso 1: identifica el contenido firmado | Flujo | Dato que debes verificar | | :- | :- | | `Redirect` | El valor de `authorization_result` recibido en el retorno del comercio | | `ServerToServer` | El body completo y crudo de la petición recibida | ### Paso 2: usa la llave pública del ambiente Archivo: `Publickey-6f031bb8-45cb-4aed-9375-80d8dbb9c8fd.pem` ```pem theme={"system"} -----BEGIN PUBLIC KEY----- MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAkmpsqcJzjQ45u0K7JOQJ tfjXGeMXNwsaU6JDGSdKwSDGGXt1m551p2mlG0oGkmn9FPbp4E0lOQzkL/qhHB1Y pTP2MqecJ7pMTonEeXOv0P6uwR9yvV5lxK17nE3+xgfcpFfxT5GAI/wZsQJ3+Lsv qh3+IcRG2Hb2BUdM5pYZFOUBGGSZWc/ULPtsFx2DSjI9peJ9kYibpaokphP+Cypz /LgKV7Yiv/TUufPiUk5gFYIad5VhRU822sTMRQ7BgS2CY4t49jqFkIiRnmPwM8fF KjPD4wvzssrqbAQvkk56XOcE9ML0iJhcIY1/xgNSiHqij0Ql1UTU5nAIJR5/paOn hQIDAQAB -----END PUBLIC KEY----- ``` Archivo: `Publickey-4e68a306-6f87-47f8-b5a2-e1c0129515fa.pem` ```pem theme={"system"} -----BEGIN PUBLIC KEY----- MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAwEAOZB5HxPxraV/SmOUC i+Y/A2tQ9djLWTJ7yx4kXzdDuy0yojZMwA+p5jUExN0ZvW78Td2d29KpmXu7hdTk n+NCx+CpufDh5aSsIl6XLwQh9D7cS+elq/TVaizQIAfNa6+z/xT3zFhMOwfWuj3t Y2UKdyss7GFxnQ7BWahci2vlUUuR2wjKniN1XLQWX1gPw1kZhU4EcKcMbymSv7GA /ZJAEs9Ce6kziO8qZAj/tvIf4O3iA2GvfjPgV7tgfp3z2LHeLbxMCIrc+GMpKt9+ Yg+hKfandUC3/8fXWtyff2W8iQA6uNDvJ3uG61bOMEKEJwlc1piZxiBsuQkmeGVs kwIDAQAB -----END PUBLIC KEY----- ``` ### Ejemplo de verificación en Python ```python theme={"system"} import base64 from cryptography.hazmat.primitives import hashes from cryptography.hazmat.primitives.asymmetric import padding from cryptography.hazmat.primitives.serialization import load_pem_public_key def verify_signature(public_key_pem: str, raw_body: bytes, signature_b64: str) -> bool: public_key = load_pem_public_key(public_key_pem.encode("utf-8")) signature = base64.b64decode(signature_b64) try: public_key.verify( signature, raw_body, padding.PKCS1v15(), hashes.SHA512(), ) return True except Exception: return False ``` Nunca marques una transacción como final si el `signature` es inválido. Si la firma falla, registra el intento, responde según tu política interna y confirma el estado luego con [Consulta](/payin/consulta). *** ## Pruebas y simulación Para pruebas de integración conviene separar dos escenarios: 1. Validar que tu endpoint reciba el `POST`, procese JSON, registre el evento y responda `HTTP 200`. 2. Validar la firma digital con un payload real emitido por Pay-me en el ambiente correspondiente. Si modificas aunque sea un carácter del body, el `signature` dejará de coincidir. Por eso una simulación manual sirve para probar parsing, ruteo e idempotencia, pero no reemplaza una prueba criptográfica real. ### Simulación manual con `curl` Usa un body como el siguiente para probar el contrato de tu endpoint: ```bash theme={"system"} curl -X POST https://tu-comercio.com/payme/callback \ -H 'Content-Type: application/json' \ -H 'signature: REEMPLAZAR_CON_SIGNATURE_BASE64' \ -d '{ "success": "true", "action": "authorize", "merchant_code": "b0deb6f3-e51a-48a7-9268-f1441d46f7bd", "merchant_operation_number": "2391645", "transaction": { "transaction_id": "5hk8rwa3h3cq9oyfs3a28v1ms", "state": "AUTORIZADO", "amount": "15000", "currency": "604", "processor_response": { "date": "17-01-2024 12:27:46", "authorization_code": "055552", "result_message": { "code": "00", "description": "Approval and completed successfully" } } }, "meta": { "status": { "code": "00", "message_ilgn": [ { "locale": "es_PE", "value": "Procesado correctamente" } ] } } }' ``` ### Recomendación de prueba real Ejecuta una autorización en preproducción con `callback_url` y captura la notificación real para validar firma, logging e idempotencia. Si el callback no llega o la prueba se corta, usa [API de Consulta](/payin/consulta) para verificar el estado final de la operación. *** ## Respuesta esperada por Pay-me Luego de enviar la notificación hacia tu callback, Pay-me esperará hasta `10 segundos` por una respuesta `HTTP 200`. Si no la recibe, reintentará el envío según la configuración del comercio. | Respuesta de tu endpoint | Comportamiento esperado | | :- | :- | | `HTTP 200` | La notificación se considera recibida | | Cualquier otro código o timeout | El envío puede reintentarse posteriormente | La cantidad y ventana de reintentos es configurable por comercio. Diseña el endpoint para soportar notificaciones duplicadas o fuera de orden. *** ## Siguiente paso Usa consulta para reconciliar estados cuando necesites una segunda validación backend. Revisa estados de transacción, códigos de respuesta y datos de prueba del ambiente sandbox. # Referencia Source: https://docs.pay-me.com/payin/referencia Punto de entrada para estados de transacción, datos de prueba y códigos de retorno de PayIn. Esta página concentra la información base que conviene tener a mano durante la integración de PayIn. Los catálogos detallados de pruebas y códigos viven en sus páginas dedicadas para evitar duplicidad y mantener esta referencia simple. *** ## Accesos rápidos Revisa el ciclo de vida del pago y los estados que debes mapear en tu backend. Usa tarjetas, credenciales y escenarios sandbox para validar tus flujos. Consulta los códigos de aprobación, rechazo y reintento por marca o procesador. Complementa tu integración con una segunda validación backend cuando la necesites. *** ## Lo esencial Envía y procesa montos en la unidad mínima de la moneda. Ejemplo: `15000` representa `150.00`. No tomes el frontend como única fuente de verdad. Confirma el resultado final con [Notificaciones](/payin/notificaciones) o [Consulta](/payin/consulta). Considera aprobado el flujo cuando el resultado funcional y el código de retorno coincidan con la respuesta esperada del método o procesador. Conserva `merchant_operation_number` y `transaction_id` para consulta, conciliación, cancelación y soporte. *** ## Lectura rápida de estados | Estado | Qué significa en integración | | :- | :- | | `PENDIENTE` | La transacción aún no terminó y puede requerir espera, redirección o acción del usuario. | | `AUTORIZADO` | El pago fue aprobado y ya puedes continuar tu flujo de negocio según tu modelo operativo. | | `DENEGADO` / `INVALIDO` | El pago no fue aprobado y debes manejar el mensaje mostrado al usuario y el registro interno. | | `CANCELADO` / `EXPIRADO` | La operación terminó sin pago exitoso. | | `EXTORNADO` / `LIQUIDADO` | Corresponden a etapas posteriores del ciclo de vida y conciliación. | Si necesitas el detalle completo de cada estado, usa la página dedicada de [Estados de Transacción](/pagos/estados-de-transaccion). *** ## Cómo usar esta sección Usa [Datos de Prueba](/pagos/datos-de-prueba) para validar aprobaciones, rechazos y flujos por método de pago. Usa [Códigos de Retorno](/pagos/codigos-de-retorno) para definir qué considera tu sistema como aprobado, rechazado o reintento. Cierra tu lógica operativa con [Notificaciones](/payin/notificaciones) o [API de Consulta](/payin/consulta), especialmente en métodos asíncronos. *** ## Siguiente paso Vuelve al punto de entrada de creación de cargos y selección del método de pago. Implementa la confirmación backend del resultado final de autorización. # Configuración del Módulo Source: https://docs.pay-me.com/prestashop/configuracion-del-modulo Vincula tu tienda con Pay-me configurando tus credenciales API y preferencias de visualización. Para acceder a estos ajustes, dirígete a **Módulos** > **Module Manager** > **Payme** y haz clic en el botón **Configurar**. ## 1. Ajustes Básicos Configura la identidad de la pasarela en tu checkout: | Parámetro | Acción | Recomendación | | :- | :- | :- | | **Habilitar** | Activa o desactiva la pasarela globalmente. | Mantener en **Activado**. | | **Título** | El nombre que verá el cliente al elegir el pago. | "Pagar con Payme" | | **Descripción** | Texto secundario de ayuda. | "Paga con tarjeta, Yape, QR y más" | | **País** | Define la región de operación. | Seleccionar **Perú**. | *** ## 2. Credenciales API Estos datos son el "pasaporte" de tu tienda hacia Pay-me. Solicítalos a tu ejecutivo de cuenta. Nunca compartas el **Client Secret** con terceros ni lo publiques en repositorios abiertos de código. * **Client ID:** Identificador público de tu comercio. * **Client Secret:** Clave privada de autenticación. * **Merchant Code:** Código único asignado por Pay-me. *** ## 3. Entorno y Visualización Personaliza cómo se comporta la pasarela y en qué ambiente opera. ### Ambiente de Ejecución Utiliza este modo para realizar transacciones ficticias con tarjetas de prueba. Es ideal para validar que tu servidor reciba las notificaciones correctamente. Activa este modo únicamente cuando hayas completado las pruebas y tengas las credenciales reales para procesar dinero de clientes. ### Modo de Visualización del Formulario Puedes elegir entre dos tipos de experiencia de usuario: * **Embebido:** El formulario de pago aparece integrado directamente dentro de la página de checkout de PrestaShop. * **Modal (Popup):** Se abre una ventana emergente segura sobre tu tienda para capturar los datos del pago. *** ## 4. Opciones Avanzadas y S2S Para garantizar el éxito de los métodos asíncronos (QR, PagoEfectivo), debes configurar la comunicación entre servidores. | Opción | Descripción | | :- | :- | | **URL S2S** | Es la URL de notificación. **Debes enviarla al equipo de Pay-me** para que puedan avisar a tu tienda sobre pagos confirmados. | | **Modo Debug** | Actívalo para generar registros técnicos detallados en caso de errores durante la integración. | | **Moneda** | Selecciona la moneda base de tu tienda: **PEN** (Soles) o **USD** (Dólares). | En PrestaShop, la URL de redirección post-pago se genera automáticamente, pero asegúrate de que el **Modo Debug** esté desactivado en producción para optimizar el rendimiento. *** Configura el Modo Separado para mejorar la conversión en tu checkout. # Experiencia del Cliente Source: https://docs.pay-me.com/prestashop/experiencia-del-cliente Configura cómo tus clientes visualizan y completan sus pagos en el checkout de PrestaShop. El módulo de Pay-me se integra de forma nativa con el sistema de checkout de PrestaShop, adaptándose visualmente a tu plantilla y garantizando una experiencia segura. ## 1. Modos de Visualización de Métodos Puedes decidir cómo se agrupan las opciones de pago en tu formulario de finalización de compra. ### Modo Separado (Recomendado) Este modo desglosa cada método de pago (Visa, Mastercard, Yape, PagoEfectivo) como una opción individual con su respectivo icono oficial. * **Beneficio:** Mayor confianza del cliente al reconocer logos familiares desde el inicio. * **Flujo:** 1. El cliente selecciona su método preferido (ej: **Yape**). 2. Se carga el formulario seguro de Pay-me. 3. El cliente confirma el pago. 4. Redirección automática a la página de éxito de la tienda. ### Modo "Junto" Agrupa todos los métodos bajo un solo selector genérico de Pay-me. Al seleccionarlo, se despliega el SDK de Pay-me con todas las opciones dentro de un mismo bloque. *** ## 2. Página de Confirmación de Pedido Tras procesar la transacción, el cliente recibe feedback visual inmediato en la página de confirmación de PrestaShop: | Resultado del Pago | Indicador Visual | Significado | | :- | :- | :- | | **Exitoso** | **Verde** | "¡Pedido Confirmado!". Transacción aprobada por el emisor. | | **Pendiente** | **Amarillo** | "Pedido Pendiente". Esperando confirmación (ej: depósito PagoEfectivo). | | **Denegado** | **Rojo** | "Pago Denegado". La transacción fue rechazada; se sugiere otro medio. | **La página de éxito incluye:** * Resumen del pedido y número de referencia. * Detalle de productos y montos. * Botón de retorno seguro a la tienda. *** ## 3. Compatibilidad con Checkouts El módulo está optimizado para funcionar con los estándares de PrestaShop: * **Standard Checkout:** El flujo nativo de 5 pasos o 1 paso (OPC). * **Temas Personalizados:** Compatible con la mayoría de plantillas de *PrestaShop Addons* que respetan los hooks de pago oficiales. Si utilizas un módulo de "One Page Checkout" de terceros, asegúrate de que esté configurado para refrescar los métodos de pago cuando el cliente cambie su dirección de envío. *** Administra estados y realiza extornos desde el Back Office. Entiende el flujo de QR, PagoEfectivo y Transferencias. # Gestión de Pedidos y Transacciones Source: https://docs.pay-me.com/prestashop/gestion-de-pedidos-y-transacciones Administra estados de pago, realiza reembolsos y consulta logs técnicos desde el Back Office de PrestaShop. El módulo de Payme centraliza la administración financiera directamente en tu panel de control, permitiéndote gestionar el ciclo de vida de cada orden sin herramientas externas. ## 1. Panel de Administración del Módulo Para visualizar el estado de tu configuración y los registros, dirígete a: **Módulos** > **Module Manager** > **Payme** > **Configurar**. Desde este panel podrás monitorear: * **Estado de Configuración:** Verificación visual de que tus credenciales están activas. * **Indicadores de Ambiente:** Confirmación en tiempo real de si estás operando en **Sandbox** o **Producción**. * **Logs Técnicos:** Acceso a la tabla de base de datos `payme_logs` donde se registran las peticiones y respuestas de la pasarela. *** ## 2. Gestión de Extornos (Anulaciones) Puedes procesar devoluciones de dinero de forma segura y directa desde el detalle de cada pedido en PrestaShop. ### ¿Cómo realizar un extorno? 1. Ve a **Pedidos** > **Pedidos** y selecciona la orden que deseas reembolsar. 2. Localiza el botón **"Extornar con Payme"**. 3. El sistema enviará la solicitud a la pasarela y actualizará el pedido automáticamente. **Prevención de Duplicados:** El sistema cuenta con una validación lógica que impide realizar extornos duplicados sobre la misma transacción, protegiendo tus fondos. *** ## 3. Sincronización de Estados de Pedido El módulo actualiza el estado de la orden en PrestaShop basándose en la respuesta de Payme, automatizando tu flujo de trabajo: | Evento de Pago | Estado en PrestaShop | Descripción | | :- | :- | :- | | **Pago Exitoso** | **Pago aceptado** | La transacción fue aprobada y los fondos están confirmados. | | **Pago Pendiente** | **En espera de pago** | El pedido se reserva hasta recibir la confirmación (típico de métodos asíncronos). | | **Pago Denegado** | **Error en el pago** | La transacción fue rechazada por el emisor o el cliente canceló. | | **Extorno Exitoso** | **Reembolsado** | Se confirma la devolución del dinero al cliente. | *** ## 4. Métodos Asíncronos (QR, PagoEfectivo) Para métodos que no se confirman al instante, el flujo opera bajo la lógica de **notificación diferida**: El pedido se genera en estado **"En espera de pago"**. Una vez que el cliente realiza el depósito o escaneo, Payme envía una señal a tu **URL S2S**. El módulo recibe la señal y cambia el estado a **"Pago aceptado"** automáticamente. Si notas que los pedidos asíncronos no cambian de estado, verifica que tu servidor permita notificaciones externas y que la **URL S2S** haya sido enviada al equipo de integraciones de Payme. *** Valida tus flujos con datos de prueba antes de vender. Consulta soluciones a errores de conexión o credenciales. # Instalación y Activación Source: https://docs.pay-me.com/prestashop/instalacion-y-activacion Guía paso a paso para instalar el módulo de Payme en tu tienda PrestaShop. Antes de comenzar, asegúrate de haber completado la fase de [Acceso a la Plataforma](/prestashop/introduccion) y contar con el archivo **.zip** del módulo Pay-me para PrestaShop. La instalación de **Payme Gateway** se realiza de forma nativa a través del gestor de módulos de PrestaShop, lo que garantiza una integración limpia con los hooks de tu plantilla. ## Descarga del Módulo Asegúrate de descargar la versión más reciente publicada por el equipo de Pay-me: Descarga la release oficial más reciente desde GitHub Releases. La versión vigente es **v1.1.0** y el archivo publicado es **payme.zip**. *** ## Proceso de Instalación Sigue estos pasos dentro de tu panel de administración: Inicia sesión en tu panel de PrestaShop con credenciales de administrador. En el menú lateral izquierdo, dirígete a **Módulos** > **Module Manager** (o Gestor de módulos). Haz clic en el botón **Subir un módulo** ubicado en la parte superior derecha de la pantalla. Arrastra el archivo **payme.zip** o búscalo en tu computadora. El sistema iniciará la descompresión y carga automática. Una vez que aparezca el mensaje "Módulo instalado", haz clic en el botón **Configurar** para ingresar tus credenciales. *** ## Verificación de Instalación Para confirmar que el módulo está activo y reconocido por el sistema: 1. Ve a **Módulos** > **Module Manager**. 2. En la barra de búsqueda, escribe **"Payme"**. 3. Asegúrate de que el interruptor esté en **Activado**. Si ves un botón que dice "Habilitar", haz clic en él. **¿Error al subir?** Verifica que tu servidor permita la subida de archivos de al menos 10MB y que la carpeta **/modules/** de tu instalación de PrestaShop tenga permisos de escritura **(755 o 775)**. *** Configura tus llaves API, el modo de visualización y el ambiente de Sandbox. # PrestaShop Source: https://docs.pay-me.com/prestashop/introduccion Integra la pasarela de pagos Pay-me en tu tienda PrestaShop de forma rápida y segura. Image Pay-me PrestaShop es el módulo oficial para **cobrar en tu tienda PrestaShop** con los métodos de pago más importantes del mercado local (Perú y región) desde una sola integración. ### Métodos de Pago Disponibles Dependiendo de tu configuración, podrás habilitar * **Tarjetas:** Visa, Mastercard, American Express, Diners. * **Billeteras:** Yape, Plin. * **Pagos con QR.** * **Transferencias y Efectivo:** PagoEfectivo, Cuotéalo BCP. ### Flujo General de Pago Comprender cómo viaja la información es clave para una integración exitosa. El módulo gestiona todo el ciclo de vida de la transacción automáticamente. Image ### ¿Cómo funciona? 1. **Selección:** El cliente elige Pay-me como método de pago en el checkout de PrestaShop. 2. **Envío:** El módulo envía de forma cifrada la información de la transacción a la pasarela Pay-me. 3. **Validación:** Pay-me valida el pago con los emisores y procesadores bajo estándares de seguridad PCI-DSS. 4. **Respuesta:** * **Síncrona:** El cliente recibe una confirmación inmediata en pantalla. * **Asíncrona (Webhook):** Pay-me notifica a tu tienda mediante un webhook para actualizar el estado del pedido automáticamente. *** ## Ciclo de Vida del Pedido Para que tu operación sea consistente, el módulo mapea los estados de la pasarela con los estados nativos de PrestaShop: El pedido se crea en PrestaShop como **"Esperando pago"** o **"Pendiente"**. Si el pago es exitoso, el estado cambia a **"Pago aceptado"**, permitiendo iniciar la preparación del pedido. Si el pago es rechazado o el cliente abandona el flujo, el pedido se marca como **"Error de pago"** o **"Cancelado"**. *** Descarga el módulo y súbelo desde el panel de administración de PrestaShop. Configura tus credenciales y habilita los métodos de pago según tu negocio. # Pruebas y Certificación Source: https://docs.pay-me.com/prestashop/pruebas-y-certificacion Valida tu integración en el ambiente Sandbox antes de procesar pagos reales en PrestaShop. Antes de habilitar el modo de producción, es fundamental realizar un ciclo de pruebas completo para asegurar que los estados de los pedidos en el **Back Office** se actualicen correctamente. ## 1. Datos de prueba para Sandbox Los datos de prueba se mantienen en una página central para que puedas reutilizarlos sin duplicar información dentro de esta guía: Consulta tarjetas, Yape, transferencias y otros escenarios sandbox desde una sola referencia. Asegúrate de que el módulo siga en Sandbox antes de ejecutar tus compras de validación. En PrestaShop, esta guía se enfoca en el comportamiento del pedido, los estados y la certificación; los datos concretos viven en la referencia compartida. Para probar métodos asíncronos como **PagoEfectivo** o **QR** en Sandbox, contacta a nuestro equipo de soporte si necesitas simular la confirmación del pago. *** ## 2. Ciclo de Certificación Para garantizar una nota **10/10** en tu implementación, verifica estos 4 puntos clave: Realiza un pedido completo y verifica que seas redirigido a la página de **"¡Pedido Confirmado!"** en PrestaShop. Confirma que el pedido pase de **"En espera de pago"** a **"Pago aceptado"** tras una transacción exitosa (vía S2S). Ejecuta una anulación desde el detalle del pedido y valida que el estado cambie a **"Reembolsado"**. Verifica que la tabla `payme_logs` registre correctamente la entrada y salida de datos sin errores de timeout. *** ## 3. Consideraciones de Soporte Nuestro equipo de integradores está disponible para revisar tus resultados y apoyarte en el paso a producción. * **Disponibilidad:** El ambiente de Sandbox está activo **24/7**. * **Horario de Soporte:** Lunes a viernes, de **09:00 AM a 06:00 PM** (Días laborables). * **Zona Horaria:** Todos los registros y soportes se rigen por la hora **Perú (GMT -5)**. *** ## 4. Canales de Contacto Una vez finalizadas tus pruebas, envía los resultados a los responsables de integración: [soporte@pay-me.com](mailto:soporte@pay-me.com) (01) 700-8377 *** ¿Algo no funciona como esperabas? Revisa nuestra guía de errores comunes en PrestaShop. # Solución de Problemas Source: https://docs.pay-me.com/prestashop/solucion-de-problemas Guía rápida para resolver errores técnicos y de configuración en PrestaShop. Si encuentras dificultades durante la integración o el procesamiento de pagos, consulta esta tabla de diagnóstico. La mayoría de las incidencias en PrestaShop se deben a restricciones de red o credenciales mal configuradas. ## 1. Tabla de Diagnóstico Rápido | Problema | Causa Probable | Solución Sugerida | | :- | :- | :- | | **Formulario no carga** | Credenciales inválidas o desajuste de ambiente. | Verifica que el **Client ID** y **Client Secret** correspondan al modo seleccionado (Sandbox/Producción). | | **Pago exitoso sin pedido** | Falla en la notificación **S2S**. | Valida que tu URL S2S sea accesible externamente y no esté bloqueada por un firewall o módulo de seguridad. | | **No cambian los estados** | Bloqueo de notificaciones externas. | Confirma con tu proveedor de hosting que se permitan peticiones `POST` desde las IPs de Payme. | | **Extorno no funciona** | Permisos de usuario o estado de transacción. | Verifica que el usuario del Back Office tenga permisos para editar pedidos y que la transacción original esté **Liquidada**. | | **Error de moneda (PEN/USD)** | Desajuste entre tienda y pasarela. | Asegúrate de que la moneda seleccionada en el módulo coincida con la moneda activa en el carrito de PrestaShop. | *** ## 2. Depuración Técnica (Debug Mode) Para obtener detalles específicos de un error, el módulo de Payme cuenta con un sistema de registro interno. En la configuración del módulo, marca la casilla **"Modo Debug"** y guarda los cambios. Accede a tu gestor de base de datos (phpMyAdmin) y revisa la tabla `payme_logs`. Allí verás el JSON completo de envío y respuesta de la API. También puedes consultar en el Back Office: **Parámetros Avanzados** > **Registros/Logs** para ver errores de sistema. **Importante:** Desactiva el Modo Debug una vez resuelto el problema para evitar el crecimiento excesivo de la base de datos en producción. *** ## 3. Requisitos de Comunicación Asegúrate de que tu servidor cumpla con estas reglas de red: * **Puertos:** El puerto **443** debe estar abierto para comunicación saliente y entrante. * **Extensiones PHP:** Verifica que `cURL` y `OpenSSL` estén actualizados. * **Protocolo:** El sitio debe operar bajo **TLS 1.2** o superior para cumplir con estándares de seguridad PCI. *** ## 4. Canales de Soporte Si el problema persiste después de seguir esta guía, envíanos un correo con el **Kit de Soporte**: 1. **Merchant Code** y URL del sitio. 2. Versión exacta de **PrestaShop** y **PHP**. 3. Captura de pantalla del error. 4. Contenido de la tabla `payme_logs` relacionado a la transacción fallida. *** [soporte@pay-me.com](mailto:soporte@pay-me.com) Regresar a la guía principal. # Prepara tu integración Source: https://docs.pay-me.com/primeros-pasos/inicio-rapido Reúne tus accesos, configura el entorno de pruebas y continúa con la guía técnica de tu canal. Prepara primero lo que comparten todas las integraciones. El código y el procedimiento para tu **primer pago** están en la guía específica de tu canal. ¿Todavía no has elegido una alternativa? Revisa [Elige tu integración](/primeros-pasos/metodos-de-integracion) antes de comenzar. ## Antes de comenzar * Confirma la habilitación de tu comercio con el equipo de integraciones, una vez completado el proceso comercial. * Identifica el canal que vas a implementar y los medios de pago habilitados. * Define quién configurará la integración y quién validará los resultados de las pruebas. ## Prepara tu entorno Coordina la entrega segura de las credenciales con el equipo de integraciones. Revisa los identificadores y secretos que necesita tu canal, como **Client ID**, **Client Secret** y **Merchant ID**. Confirma a qué comercio y entorno corresponden antes de utilizarlos. Mantén configuraciones y credenciales separadas. Empieza en **sandbox** y comprueba que los endpoints y datos utilizados correspondan a ese entorno. No mezcles credenciales productivas con ejemplos de prueba. Abre la guía técnica correspondiente. Sigue sus instrucciones de autenticación, configuración del componente o módulo y creación del pago. Usa los nombres y formatos de parámetros de esa referencia. Configura las URLs de retorno y notificaciones cuando el flujo las requiera. Relaciona tu pedido con el identificador de la operación. Define cómo confirmarás su estado desde backend y cómo registrarás la evidencia de prueba, sin exponer secretos ni datos sensibles. Una pantalla de éxito no debe ser la única confirmación de que un pedido está pagado. ## Comprende los entornos Entorno para desarrollar y validar tu integración. Utiliza los datos y escenarios de prueba indicados en la documentación de tu canal. Entorno para procesar pagos reales. Su habilitación y las pruebas controladas se coordinan con el equipo de integraciones. Las pruebas controladas con credenciales de producción pueden generar operaciones reales. No son un tercer entorno de sandbox: ejecútalas únicamente con la habilitación y coordinación correspondientes. ## Continúa con tu primer pago Selecciona la guía de tu canal para implementar su flujo y ejecutar una transacción de prueba. Configura tu plataforma y valida una compra de prueba. Revisa la modalidad de checkout y conecta tu flujo web. Integra el SDK y prueba el recorrido en tu aplicación. Implementa la autenticación y las solicitudes desde tu backend. ## Antes de operar en vivo Conserva las evidencias de tus pruebas y revisa los criterios que corresponden a tu integración. El equipo de integraciones confirma la validación y los pasos para habilitar producción. Revisa seguridad, validación de operaciones y trazabilidad. Comprueba los requisitos antes de coordinar la salida a producción. # Elige tu integración Source: https://docs.pay-me.com/primeros-pasos/metodos-de-integracion Encuentra el camino para conectar Pay-me a tu tienda, sitio web, aplicación o backend. ## Compara el trabajo de integración | Ruta | Trabajo principal | Qué revisar primero | | :- | :- | :- | | **E-commerce** | Configurar el módulo y validar pedidos. | Compatibilidad de plataforma y versión. | | **Checkout Web** | Conectar el componente con tu flujo web. | Modalidad de checkout y comunicación con backend. | | **SDK Mobile** | Integrar el SDK y manejar el retorno en la app. | Plataformas y versiones soportadas. | | **API de pagos** | Implementar solicitudes y estados desde servidor. | Autenticación y requisitos de seguridad aplicables. | El esfuerzo depende de tu arquitectura, los medios de pago habilitados y los escenarios que debas validar. La elección del canal no sustituye la revisión técnica ni los requisitos de seguridad. ## Define tu punto de partida * **Tienda existente:** comienza por la guía de tu plataforma y comprueba su compatibilidad. * **Sitio web propio:** revisa [Checkout Web](/checkout-web/introduccion). Las guías de [Flex](/checkout-web/flex/introduccion) y [Modal](/checkout-web/modal/introduccion) describen sus flujos específicos. * **Aplicación nativa:** continúa con el SDK de tu plataforma. * **Integración de backend:** revisa la API y confirma el alcance de seguridad de tu solución antes de implementarla. Confirma con el equipo de integraciones las modalidades, medios de pago y requisitos habilitados para tu comercio. Si trabajas con varios canales, prepara un recorrido por canal y conserva una gestión coherente de tus pedidos. ## Siguiente paso Reúne tus accesos, separa los entornos y continúa con la guía técnica de tu canal. # Inicializar afiliaciones Android Source: https://docs.pay-me.com/sdk-mobile/android/afiliaciones/inicializar-sdk-android Inicializa Pay-me SDK Android para registrar o actualizar afiliaciones desde tu app móvil. El flujo de afiliaciones permite registrar o actualizar información asociada a un beneficiario desde Pay-me SDK Android. Antes de inicializar este flujo, completa [Instalación SDK Android](/sdk-mobile/android/instalacion), revisa [Parámetros de afiliación](/sdk-mobile/android/afiliaciones/parametros-de-sdk-android) y genera un `Access Token` desde backend usando [Autenticación](/api-de-pagos/autenticacion). ## Flujo de integración Agrega `PaymeClient`, `PaymeClientDelegate`, modelos y ambiente en tu `Activity`. Crea `PAYMEAffiliationRequest` con datos de afiliación, beneficiario y configuración. Inicializa `PaymeClient` con `delegate`, `merchantCode` y ambiente. Envía `sessionToken` y `paymeAffiliationRequest` en `invokeAffiliationForm`. Implementa `onAffiliationResponse` para recibir el resultado final del flujo. ## Importar PaymeSDK ```kotlin theme={"system"} import com.alignet.payme.PaymeClient import com.alignet.payme.PaymeClientDelegate import com.alignet.payme.model.* import com.alignet.payme.util.PaymeEnvironment ``` ## Parámetros principales * `delegate`: Activity que implementa los métodos de `PaymeClientDelegate`. * `merchantCode`: código del comercio entregado por Alignet. * `PaymeEnvironment.DEVELOPMENT`: ambiente de pruebas. * `PaymeEnvironment.PRODUCTION`: ambiente productivo. * `from`: Activity desde donde se invoca el SDK. * `sessionToken`: token generado desde backend para esta solicitud. * `paymeAffiliationRequest`: objeto con información de la afiliación. ## Ejemplo de inicialización ```kotlin theme={"system"} val beneficiary = PAYMEAddressData( firstName = "Producto", lastName = "Alignet", email = "producto@alignet.com", phone = "51-999999999", identityDocument = PAYMEIdentityDocument( type = "DNI", identifier = "77777777", country = "PE" ), addressLine1 = "Av casimiro Ulloa 333", addressLine2 = null, city = "Lima", state = "Lima", country = "PE" ) val additionalFields = hashMapOf( "FACTURACION_ID" to "LEV_72661927", "reserved1" to "Reservado 1" ) val affiliation = PAYMEAffiliationData( type = PAYMEAffiliationType.MANUAL, amount = null, currency = "604", additionalFields = additionalFields, beneficiary = beneficiary ) val paymeAffiliationRequest = PAYMEAffiliationRequest( action = PAYMEAffiliationAction.CREATE, affiliationCode = "AFFILIATION_CODE", affiliation = affiliation, setting = PAYMESettingData( locale = "es_PE", walletUserID = "WALLET_USER_CODE" ) ) val paymeClient = PaymeClient( delegate = this, merchantCode = "MERCHANT_CODE" ) paymeClient.setEnvironment( environment = PaymeEnvironment.DEVELOPMENT ) paymeClient.invokeAffiliationForm( from = this, sessionToken = "TOKEN_GENERADO_PARA_ESTA_SOLICITUD", paymeAffiliationRequest = paymeAffiliationRequest ) ``` El `sessionToken` debe generarse desde backend para la solicitud. No incluyas credenciales ni secretos dentro de la app. ## Implementar delegate Para completar la integración, el `Activity` debe implementar `PaymeClientDelegate` y procesar la respuesta de afiliación. ```kotlin theme={"system"} class MainActivity : AppCompatActivity(), PaymeClientDelegate { override fun onAffiliationResponse(response: PAYMEAffiliationResponse) { // Procesa el resultado final de la afiliación. } } ``` ## Siguiente paso Revisa el detalle completo de los objetos enviados y recibidos por el flujo de afiliación. # Mensajes de errores de SDK Source: https://docs.pay-me.com/sdk-mobile/android/afiliaciones/mensajes-de-errores ## **Códigos de Error** Pay-me SDK maneja distintos errores que interrumpen el flujo de afiliacion, estos errores son entregados al comercio y se pueden identificar por el código de error que se encuentra en el parámetro `success`,`resultCode` y` resultMessage` del objeto `PaymeResponse`. Abre tabla en pantalla completaAbrir | **success** | **resultCode** | **resultMessage** | **Descripción** | | :- | :- | :- | :- | | **true** | **00** | Se procesó correctamente la petición | La afiliación se realizó o se actualizó con éxito. | | **false** | **01** | Ocurrió un error | Petición invalida por error del sistema. | | **false** | **02** | Algunos datos no fueron enviados correctamente | El comercio envió uno o más parámetros inválidos al momento de invocar al SDK de Payme. | | **false** | **03** | Comercio no existente | El merchantCode enviado no existe. | | **false** | **04** | Comercio requiere configuracion | El Comercio no tiene habilitado los métodos de pago. | | **false** | **05** | La afiliacion se encuentra registrada | Al momento de crear la afiliación, esta ya se encuentra registrada. | | **false** | **06** | La afiliación no se encuentra registrada | Al momento de actualizar la afiliación, esta no se encuentra registrada. | | **false** | **07** | Afiliación requiere activación | La afiliación esta desactivada, y requiere activar primero. | | **false** | **08** | Usuario abandonó la afiliación | El usuario decidió volver al comercio y no realizo el registro o actualización de la afiliación. | | **false** | **09** | Token de la tarjeta está vencida | La fecha de token ya venció | # Parámetros de Entrada y Salida de SDK Android Source: https://docs.pay-me.com/sdk-mobile/android/afiliaciones/parametros-de-sdk-android A continuación, se detallan los parámetros de entrada y salida de Pay-me SDK para el flujo de afiliaciones: ## Parámetros de Entrada El objeto `PMEAffiliationRequest` está compuesto por los siguientes atributos: ### **Objeto PMEAffiliationRequest** Abre tabla en pantalla completaAbrir | **Parámetro** | **Tipo** | **Descripción** | **Obligatorio** | | :- | :- | :- | :- | | action | `PAYMEAffiliationAction` | La acción a ejecutar. Puede ser CREATE o UPDATE
  • `PAYMEAffiliationAction.CREATE`
  • `PAYMEAffiliationAction.UPDATE`
| SI | | affiliationCode | String | Código de afiliación generado por el comercio | SI | | affiliation | [Objeto PAYMEAffiliationData](https://docs.pay-me.com/es/sdk/v3.2/Android/afiliaciones-parametros-de-entrada-y-salida-de-pay#PAYMEAffiliationData) | Contiene información de la afiliación. Es obligatorio cuando la acción es CREATE | NO | | setting | [Objeto PAYMESettingData](https://docs.pay-me.com/es/sdk/v3.2/Android/afiliaciones-parametros-de-entrada-y-salida-de-pay#PAYMESettingData) | Contiene información de ajuste del comportamiento del formulario de afiliacion | NO | #### **Objeto PAYMEAffiliationData** Abre tabla en pantalla completaAbrir | **Parámetro** | **Tipo** | **Long.** | **Descripción** | **Obligatorio** | | :- | :- | :- | :- | :- | | type | `PAYMEAffiliationType` | - | Tipo de afiliación. Valores:
  • `FIXED` → NO DISPONIBLE
  • `VARIABLE` → NO DISPONIBLE
  • `MANUAL` → DISPONIBLE
| SI | | frequency | String | - | Frecuencia de los cobros de la afiliación | NO | | amount | String | 11 | Monto en centavos cobrar por la pasarela de pago. La pasarela se encargar de aplicar el separador decimal. Ejemplo:
  • Si el monto es 0.50 → Enviar 50
  • Si el monto es 10.00 → Enviar 1000
| NO | | maxAmount | String | 11 | Monto máximo que se aplica al monto de hacer los pagos recurrentes. El monto debe expresarse como un entero en centavos | NO | | currency | String | - | Código de moneda ISO-4217. | SI | | additionalFields | Diccionario | - | Contiene información adicional proporcionado por el comercio. | NO | | beneficiary | [Objeto PAYMEAddressData](https://docs.pay-me.com/es/sdk/v3.2/Android/afiliaciones-parametros-de-entrada-y-salida-de-pay#PAYMEAddressData) | - | Información del afiliado | SI | ##### **Objeto PAYMEAddressData** Abre tabla en pantalla completaAbrir | **Parámetro** | **Tipo** | **Long.** | **Descripción** | **Obligatorio** | | :- | :- | :- | :- | :- | | firstName | String | 30 | Nombres | SI | | lastName | String | 50 | Apellidos | SI | | email | String | 50 | Correo electrónico | SI | | phone | String | 15 | Código del país y número de celular del titular de la tarjeta (51-958435685) | SI | | identityDocument | [Objeto PAYMEIdentityDocument](https://docs.pay-me.com/es/sdk/v3.2/Android/afiliaciones-parametros-de-entrada-y-salida-de-pay#PAYMEIdentityDocument) | - | Objeto que contiene información de documento de identidad | NO | | line1 | String | 50 | Dirección | SI | | line2 | String | 50 | Dirección | NO | | city | String | 50 | Ciudad/Provincia | SI | | state | String | 15 | Estado/Departamento | SI | | country | String | 2 | Código del País en letra. ISO-3166 | SI | ###### **Objeto PAYMEIdentityDocument** Abre tabla en pantalla completaAbrir | **Parámetro** | **Tipo** | **Long.** | **Descripción** | **Obligatorio** | | :- | :- | :- | :- | :- | | country | String | 2 | Código del País en letra. ISO-3166. Ejm:
  • Perú → PE
| SI | | type | String | 20 | Tipo de documento de identidad:
  • DNI
  • CARNET\_EXTRANJERIA
  • PASAPORTE
  • OTROS
| SI | | identifier | String | 20 | Número de documento de identidad | SI | #### **Objeto PAYMESettingData** Abre tabla en pantalla completaAbrir | **Parámetro** | **Tipo** | **Long.** | **Descripción** | **Obligatorio** | | :- | :- | :- | :- | :- | | locale | String | 5 | Localización del idioma que utilizará el formulario para mostrarse. | SI | | **Valor - Descripción** | | | | | | es\_PE Español Perú | | | | | | walletUserId | String | 15 | Valor para identificar el wallet de un usuario. | NO | ## **Parámetros de Salida** El objeto `PMEAffiliationResponse` está compuesto por los siguientes atributos: ### Objeto PMEAffiliationResponse Abre tabla en pantalla completaAbrir | **Parámetro** | **Tipo** | **Long.** | **Descripción** | **Obligatorio** | | :- | :- | :- | :- | :- | | success | Boolean | - | Tiene valor \*\*true \*\*si se realizó el proceso correctamente, \*\*false \*\*si ocurrió algún error durante el procesamiento del pago. | SI | | resultCode | String | 2 | Código de resultado del procesamiento. | SI | | resultMessage | String | 30 | Texto que describe el resultado del procesamiento. | SI | | result | [Objeto PAYMEAffiliationResult](https://docs.pay-me.com/es/sdk/v3.2/Android/afiliaciones-parametros-de-entrada-y-salida-de-pay#PAYMEAffiliationResult) | - | Detalle del resultado de la transacción. | NO | #### Objeto PAYMEAffiliationResult Abre tabla en pantalla completaAbrir | **Parámetro** | **Tipo** | **Long.** | **Descripción** | **Obligatorio** | | :- | :- | :- | :- | :- | | affiliationId | String | 36 | Identificar único de la transacción generado por Pay-me | SI | | affiliationCode | String | 36 | Número de operación enviado por el Comercio | SI | | type | String | - | Tipo de afiliación. Valores:
  • `FIXED` → NO DISPONIBLE
  • `VARIABLE` → NO DISPONIBLE
  • `MANUAL` → DISPONIBLE
| SI | | state | String | - | Estado actual de la afiliación, valores:
  • ACTIVE
  • INACTIVE
| SI | | frequency | String | - | Frecuencia de los cobros de la afiliación | NO | | amount | String | 11 | Monto en centavos cobrar por la pasarela de pago. La pasarela se encargar de aplicar el separador decimal. Ejemplo:
  • Si el monto es 0.50 → Enviar 50
  • Si el monto es 10.00 → Enviar 1000
| NO | | maxAmount | String | 11 | Monto máximo que se aplica al monto de hacer los pagos recurrentes. El monto debe expresarse como un entero en centavos | NO | | currency | String | - | Código de moneda ISO-4217. | SI | | additionalFields | Diccionario | - | Contiene información adicional proporcionado por el comercio. | NO | | card | [Objeto PAYMEAffiliationCard](https://docs.pay-me.com/es/sdk/v3.2/Android/afiliaciones-parametros-de-entrada-y-salida-de-pay#PAYMEAffiliationCard) | - | Información de la tarjeta usada en la afiliación | SI | ##### Objeto PAYMEAffiliationCard Abre tabla en pantalla completaAbrir | **Parámetro** | **Tipo** | **Long.** | **Descripción** | **Obligatorio** | | :- | :- | :- | :- | :- | | brand | String | 4 | Marca de la tarjeta. Los valores son:
  • VISA
  • MSCD
  • AMEX
  • DINC
| SI | | bin | String | 6 | Bin de la tarjeta | SI | | lastPan | String | 4 | Cuatro últimos dígitos de la tarjeta | SI | | issuerName | String | 50 | Nombre del emisor de la tarjeta | NO | | cardholderName | String | 50 | Nombre y Apellidos del titular de la tarjeta | SI | # Inicializar Pay-me SDK Android Source: https://docs.pay-me.com/sdk-mobile/android/flujo-de-cobro/inicializar-pay-me-sdk-android Crea la instancia de PaymeClient, configura el ambiente e inicia el flujo de cobro en Android. La función de cobro permite invocar Pay-me SDK desde tu app Android para mostrar el formulario de pago y recibir el resultado de la operación. Antes de inicializar el SDK, completa [Instalación SDK Android](/sdk-mobile/android/instalacion) y genera un `Access Token` desde tu backend usando [Autenticación](/api-de-pagos/autenticacion). ## Métodos disponibles Tarjetas de crédito y débito. Pago con billetera Yape. Pago con billeteras móviles mediante QR. Pago mediante transferencia bancaria. Pago financiado con Cuotéalo. Pago con código o canal PagoEfectivo. ## Flujo de integración Agrega las clases necesarias en el `Activity` o controlador donde iniciarás el flujo. Crea `PAYMEChargesRequest` con datos de transacción, comprador, facturación y configuración. Inicializa `PaymeClient` con `delegate`, `merchantCode` y ambiente. Envía `sessionToken` y `paymeChargesRequest` en `invokeCaptureForm`. Implementa `onRespondsPayme` y `onPaymeEvents` para cerrar el flujo en tu app. ## Importar PaymeSDK ```kotlin theme={"system"} import com.alignet.payme.PaymeClient import com.alignet.payme.PaymeClientDelegate import com.alignet.payme.model.* import com.alignet.payme.util.PaymeEnvironment ``` ## Parámetros principales * `delegate`: Activity que implementa los métodos de `PaymeClientDelegate`. * `merchantCode`: Código del comercio entregado por Alignet. * `PaymeEnvironment.DEVELOPMENT`: ambiente de pruebas. * `PaymeEnvironment.PRODUCTION`: ambiente productivo. * `from`: Activity desde donde se invoca el SDK. * `sessionToken`: token generado desde backend para esta solicitud. * `paymeChargesRequest`: objeto con información de la transacción. ## Ejemplo de inicialización ```kotlin theme={"system"} val customer = PAYMEAddressData( firstName = "Levis", lastName = "Silvestre", email = "levis.silvestre@alignet.com", phone = "51-958435685", identityDocument = PAYMEDocumentIdentity( type = "DNI", identifier = "72661927", country = "PE" ), addressLine1 = "Av casimiro Ulloa 333", addressLine2 = null, city = "Lima", state = "Lima", country = "PE" ) val billingShipping = PAYMEAddressData( firstName = "Levis", lastName = "Silvestre", email = "levis.silvestre@alignet.com", phone = "51-958435685", addressLine1 = "Av casimiro Ulloa 333", addressLine2 = null, city = "Lima", state = "Lima", country = "PE" ) val reservedData = hashMapOf( "reserved1" to "Reservado 1", "reserved2" to "Reservado 2", "reserved30" to "Reservado 30" ) val paymeChargesRequest = PAYMEChargesRequest( transaction = PAYMETransactionData( operationNumber = "0000001", amount = "1000", currency = "604", additionalFields = reservedData, customer = customer, billing = billingShipping, shipping = billingShipping ), setting = PAYMESettingData( locale = "es_PE", paymentMethods = listOf("CARD", "YAPE", "CUOTEALO"), walletUserID = null ) ) val paymeClient = PaymeClient( delegate = this, merchantCode = "MERCHANT_CODE" ) paymeClient.setEnvironment( environment = PaymeEnvironment.DEVELOPMENT ) paymeClient.invokeCaptureForm( from = this, sessionToken = "TOKEN_GENERADO_PARA_ESTA_SOLICITUD", paymeChargesRequest = paymeChargesRequest ) ``` El `sessionToken` debe generarse desde backend para la solicitud. No incluyas credenciales ni secretos dentro de la app. ## Implementar delegates Para completar la integración, el `Activity` debe implementar `PaymeClientDelegate`. ```kotlin theme={"system"} class MainActivity : AppCompatActivity(), PaymeClientDelegate { override fun onRespondsPayme(response: PAYMEChargesResponse) { // Procesa el resultado final del flujo. } override fun onPaymeEvents(event: PaymeEvent) { // Registra eventos de navegación o interacción del SDK. } } ``` ## Eventos disponibles Indica qué métodos se mostraron al usuario. Indica el método de pago elegido por el usuario. Indica que el usuario regresó al listado de métodos. Indica que el usuario canceló un método de pago. Indica que el usuario presionó el botón de pago. Indica que el usuario cerró el SDK. ## Validación del resultado Usa `onRespondsPayme` para actualizar la experiencia de usuario, pero confirma el estado final desde backend cuando el flujo o método de pago lo requiera. ## Siguiente paso Revisa el detalle completo de los objetos enviados y recibidos por el SDK. # Mensajes de errores de SDK Source: https://docs.pay-me.com/sdk-mobile/android/flujo-de-cobro/mensajes-de-errores ## **Códigos de Error** Pay-me SDK maneja distintos errores que interrumpen el flujo de autorización, estos errores son entregados al comercio y se pueden identificar por el código de error que se encuentra en el parámetro `success`,`resultCode` y` resultMessage` del objeto `PaymeResponse`. Abre tabla en pantalla completaAbrir | **success** | **resultCode** | **resultMessage** | **Descripción** | | :- | :- | :- | :- | | **true** | **00** | Se procesó correctamente la petición | La autorización se realizó con éxito o la transacción esta en Pendiente. | | **true** | **01** | Peticion rechazada por el Procesador | La autorización fue denegada. | | **true** | **02** | Se expiro la transaccion | Notificacion al comercio que expiró la transacción. | | **false** | **03** | Ocurrió un error | Petición invalida por error del sistema. | | **false** | **04** | No se pudo procesar la petición | Petición inválida por error de la procesadora. | | **false** | **05** | No se encontró el pedido | Consulta o extorno de un número de operación inexistente. | | **false** | **06** | Algunos datos no fueron enviados correctamente | El comercio envió uno o más parámetros inválidos al momento de invocar al SDK de Payme.. | | **false** | **07** | Comercio no existente | El merchantCode enviado no existe. | | **false** | **08** | Comercio requiere configuracion de procesamiento | El Comercio no tiene habilitado los métodos de pago. | | **false** | **09** | Metodo de pago no soportado por el sistema | El método de pago enviado no es soportado por el sistema. | | **false** | **10** | Se requiere un token de acceso | El access token no fue enviado. | | **false** | **11** | Token de acceso inválido | El access token es inválido o ya venció. | | **false** | **12** | La Operación se encuentra finalizada | El número de Operación enviada ya existe con un estado Autorizado o Liquidado. | | **false** | **13** | La Operación se encuentra en proceso | El número de Operación enviada ya existe con un estado Pendiente. | | **false** | **14** | Usuario regresó al comercio sin seleccionar un método de pago | El usuario ingreso al SDK y regreso al comercio sin iniciar un pago con algún método de pago. | | **false** | **15** | Usuario canceló la transacción pendiente y regresó al comercio | El usuario ingreso al SDK, inicio el proceso de pago y decidión regresar al comercio cancelando la transacción pendiente. | # Parámetros de Entrada y Salida de Pay-me SDK Android Source: https://docs.pay-me.com/sdk-mobile/android/flujo-de-cobro/parametros-de-pay-me-sdk-android # Cobros: Parámetros de Entrada y Salida de Pay-me SDK Android A continuación, se detallan los parámetros de entrada y salida de Pay-me SDK. ## Parámetros de Entrada ### **Objeto PAYMEChargesRequest** Abre tabla en pantalla completaAbrir | **Parámetro** | **Tipo** | **Descripción** | **Obligatorio** | | :- | :- | :- | :- | | transaction | [Objeto PAYMETransactionData](https://docs.pay-me.com/es/sdk/v3.2/Android/parametros-de-entrada-y-salida-de-pay-me-sdk-andro#PAYMETransactionData) | Contiene información de la transacción | SI | | setting | [Objeto PAYMESettingData](https://docs.pay-me.com/es/sdk/v3.2/Android/parametros-de-entrada-y-salida-de-pay-me-sdk-andro#PAYMESettingData) | Contiene información de ajuste del comportamiento del formulario de pago. | NO | #### **Objeto PAYMETransactionData** Abre tabla en pantalla completaAbrir | **Parámetro** | **Tipo** | **Long.** | **Descripción** | **Obligatorio** | | :- | :- | :- | :- | :- | | operationNumber | String | 12 | Número de operación único en la  pasarela, el cual será utilizado para  realizar la transacción. (Cadena numérica entre 6 y 12 dígitos). | SI | | amount | String | 11 | Monto en centavos cobrar por la pasarela de pago. La pasarela se encargar de aplicar el separador decimal. Ejemplo:
  • Si el monto es 0.50 → Enviar 50
  • Si el monto es 10.00 → Enviar 1000
| SI | | currency | String | 3 | Código de moneda ISO-4217 (3 digitos numérico) Ejm:
  • Soles → 604
  • Dólares → 840
| SI | | additionalFields | Diccionario | - | Contiene información adicional proporcionado por el comercio. | NO | | billing | [Objeto PAYMEAddressData](https://docs.pay-me.com/es/sdk/v3.2/Android/parametros-de-entrada-y-salida-de-pay-me-sdk-andro#PAYMEAddressData) | - | Información de facturación de la orden de compra. | SI | | shipping | [Objeto PAYMEAddressData](https://docs.pay-me.com/es/sdk/v3.2/Android/parametros-de-entrada-y-salida-de-pay-me-sdk-andro#PAYMEAddressData) | - | Información de envió de la orden de compra. | NO | | customer | [Objeto PAYMEAddressData](https://docs.pay-me.com/es/sdk/v3.2/Android/parametros-de-entrada-y-salida-de-pay-me-sdk-andro#PAYMEAddressData) | - | Información del comprador. | NO | **Objeto PAYMEAddressData** Abre tabla en pantalla completaAbrir | **Parámetro** | **Tipo** | **Long.** | **Descripción** | **Obligatorio** | | :- | :- | :- | :- | :- | | firstName | String | 30 | Nombres | SI | | lastName | String | 50 | Apellidos | SI | | email | String | 50 | Correo electrónico | SI | | phone | String | 15 | Código del país y número de celular del titular de la tarjeta (51-958435685) | SI | | identityDocument | [Objeto PAYMEIdentityDocument](https://docs.pay-me.com/es/sdk/v3.2/Android/parametros-de-entrada-y-salida-de-pay-me-sdk-andro#PAYMEIdentityDocument) | - | Objeto que contiene información de documento de identidad del comprador. Solo disponible para **CUSTOMER.** | NO | | line1 | String | 50 | Dirección | SI | | line2 | String | 50 | Dirección | NO | | city | String | 50 | Ciudad/Provincia | SI | | state | String | 15 | Estado/Departamento | SI | | country | String | 2 | Código del País en letra. ISO-3166. Ejm:
  • Perú → PE
| SI | ###### **Objeto PAYMEIdentityDocument** Abre tabla en pantalla completaAbrir | **Parámetro** | **Tipo** | **Long.** | **Descripción** | **Obligatorio** | | :- | :- | :- | :- | :- | | country | String | 2 | Código del País en letra. ISO-3166. Ejm:
  • Perú → PE
| SI | | type | String | 20 | Tipo de documento de identidad:
  • DNI
  • CARNET\_EXTRANJERIA
  • PASAPORTE
  • OTROS
| SI | | identifier | String | 20 | Número de documento de identidad | SI | #### **Objeto PAYMESettingData** Abre tabla en pantalla completaAbrir | **Parámetro** | **Tipo** | **Long.** | **Descripción** | **Obligatorio** | | :- | :- | :- | :- | :- | | locale | String | 5 | Localización del idioma que utilizará el formulario para mostrarse. | SI | | **Valor - Descripción** | | | | | | es\_PE Español Perú | | | | | | walletUserId | String | 15 | Valor para identificar el wallet de un usuario. | NO | | paymentMethods | Arrays\[String] | - | Listado de metodos de pagos que cargará el SDK, en caso de no enviarlo, se utilizará el listado de la configuracion del comercio | NO | | **Valor - Descripción** | | | | | | CARD - Tarjetas de Crédito / Débito | | | | | | YAPE - Pago con yape | | | | | | CUOTEALO - Pago con Cuotealo BCP | | | | | | QR - Pago con Billeteras Móviles | | | | | | BANK\_TRANSFER - Pago por Transferencia Bancaria | | | | | | PAGO\_EFECTIVO - Pago por PagoEfectivo | | | | | | `urlNotification` | String | 200 | URL donde se realizará la notificación luego de autorizar la transacción. Es opcional ya que se puede configurar por back | NO | ## **Parámetros de Salida** ### Objeto PaymeEvents Abre tabla en pantalla completaAbrir | **Parámetro** | **Tipo** | **Descripción** | **Req.** | | :- | :- | :- | :- | | PaymeEvents | Enum | Indicador de acción interna del SDK. Puede tener los siguientes valores
  • `BUILD_FORM(methods:[String])`: Indica que métodos se mostraron al usuario en el SDK
  • `CHOOSE_PAYMENT_METHOD(method: String)`: Indica que método de pago seleccionó el usuario.
  • `RETURN_LIST_PAYMENT_METHODS`: Indica que regresó al listado de métodos de pago.
  • `CANCEL_PAYMENT_METHOD(method: String)`: Indica que método de pago canceló el usuario.
  • `PRESS_PAY_BUTTON(method: String)`: Indica que método el usuario seleccionó pagar.
  • `CLOSE_PAYME`: Indica que el usuario cerró el SDK
| SI | El objeto `PAYMEChargesResponse` está compuesto por los siguientes atributos: ### Objeto PAYMEChargesResponse Abre tabla en pantalla completaAbrir | **Parámetro** | **Tipo** | **Long.** | **Descripción** | **Obligatorio** | | :- | :- | :- | :- | :- | | success | Boolean | - | Tiene valor \*\*true \*\*si se realizó el proceso correctamente, \*\*false \*\*si ocurrió algún error durante el procesamiento del pago. | SI | | resultCode | String | 2 | Código de resultado del procesamiento. | SI | | resultMessage | String | 30 | Texto que describe el resultado del procesamiento. | SI | | result | [Objeto PAYMETransactionResult](https://docs.pay-me.com/es/sdk/v3.2/Android/parametros-de-entrada-y-salida-de-pay-me-sdk-andro#PAYMETransactionResult) | - | Detalle del resultado de la transacción. | NO | #### Objeto PAYMETransactionResult Abre tabla en pantalla completaAbrir | **Parámetro** | **Tipo** | **Long.** | **Descripción** | **Obligatorio** | | :- | :- | :- | :- | :- | | transactionId | String | 25 | Identificar único de la transacción generado por Pay-me | SI | | operationNumber | String | 12 | Número de operación enviado por el Comercio | SI | | state | String | - | Estado de la transacción:
  • PENDIENTE
  • INVALIDO
  • AUTORIZADO
  • DENEGADO
| SI | | stateReason | String | 100 | Razón por la cual se quedó en aquel estado. | SI | | amount | String | 11 | Monto de la autorización | SI | | currency | String | 3 | Moneda usada en la autorización | SI | | additionalFields | Diccionario | - | Contiene información adicional proporcionado por el comercio. | NO | | paymentMethod | [Objeto PAYMEPaymentMethod](https://docs.pay-me.com/es/sdk/v3.2/Android/parametros-de-entrada-y-salida-de-pay-me-sdk-andro#PAYMEPaymentMethod) | - | Objeto del método de Pago | SI | | expirationDate | String | - | Fecha en formato **UNIX** en la que la transacción será expirada. Disponible para QR y PAGO\_EFECTIVO | NO | | processorResponse | String | 500 | JSON String que contiene respuesta de la procesadora. | NO | | lifecycle | [Array PAYMETransactionLifecycle](https://docs.pay-me.com/es/sdk/v3.2/Android/parametros-de-entrada-y-salida-de-pay-me-sdk-andro#PAYMETransactionLifecycle) | - | Array de tiempos y estados por el cual paso la transacción | SI | ##### Objeto PAYMEPaymentMethod Abre tabla en pantalla completaAbrir | **Parámetro** | **Tipo** | **Long.** | **Descripción** | **Obligatorio** | | :- | :- | :- | :- | :- | | name | String | - | Método de pago usado para autorizar la transacción:
  • CARD
  • YAPE
  • QR
  • CUOTEALO
  • BANK\_TRANSFER
  • PAGO\_EFECTIVO
| SI | | methodDetail | String | 500 | JSON String que contiene datos de la tarjeta usada para la autorización, estos datos están disponibles en métodos CARD - YAPE - QR. | NO | ##### Objeto PAYMETransactionLifecycle Abre tabla en pantalla completaAbrir | **Parámetro** | **Tipo** | **Long.** | **Descripción** | **Obligatorio** | | :- | :- | :- | :- | :- | | state | String | - | Estado de la transacción:
  • REGISTRADO
  • PENDIENTE
  • INVALIDO
  • AUTORIZADO
  • DENEGADO
| SI | | utcTime | String | - | Fecha en formato UTC en la que la transacción cambio de estado. | SI | | unixTime | String | - | Fecha en formato UNIX en la que la transacción cambio de estado. | SI | # Instalación SDK Android Source: https://docs.pay-me.com/sdk-mobile/android/instalacion Configura librerías, permisos y dependencias necesarias para integrar Pay-me SDK en Android. Esta guía describe cómo incorporar Pay-me SDK en tu proyecto Android antes de implementar cobros o afiliaciones. Utiliza siempre la versión de SDK entregada o confirmada por el equipo de integraciones para tu comercio. Descarga el paquete `.zip` con las librerías necesarias para integrar el SDK Android. ## Artefactos requeridos El paquete de integración debe incluir las librerías necesarias para ejecutar el flujo de pago. Librería principal del SDK. Librería para autenticación 3DS. Librería de experiencia Visa. Librería de experiencia Mastercard. No subas los artefactos del SDK a repositorios públicos. Trata los archivos entregados como dependencias privadas del comercio. ## Estructura recomendada Crea una carpeta `libs` dentro del proyecto y coloca ahí los artefactos entregados. ```text theme={"system"} app/ libs/ Payme.aar SecureKey3DS.aar VisaSensoryBranding.aar MastercardSonic.aar ``` ## Configuración Gradle Agrega los `.aar` como dependencias locales del módulo Android. ```kotlin theme={"system"} dependencies { implementation(files("libs/SecureKey3DS.aar")) implementation(files("libs/Payme.aar")) implementation(files("libs/VisaSensoryBranding.aar")) implementation(files("libs/MastercardSonic.aar")) } ``` Si tu proyecto usa `build.gradle` con Groovy, puedes declararlo así: ```groovy theme={"system"} dependencies { implementation files('libs/SecureKey3DS.aar') implementation files('libs/Payme.aar') implementation files('libs/VisaSensoryBranding.aar') implementation files('libs/MastercardSonic.aar') } ``` ## Plugins y configuración Android Confirma que el módulo tenga Kotlin y `viewBinding` habilitados. ```kotlin theme={"system"} plugins { id("com.android.application") id("org.jetbrains.kotlin.android") id("kotlin-parcelize") } android { buildFeatures { viewBinding = true } } ``` ## Permisos Declara los permisos requeridos en `AndroidManifest.xml`. ```xml theme={"system"} ``` ## Dependencias base El SDK requiere dependencias Android, networking, serialización y seguridad. Usa como referencia las versiones mínimas indicadas por el equipo de integraciones y mantén compatibilidad con tu proyecto. ```kotlin theme={"system"} dependencies { implementation("androidx.core:core-ktx:1.6.0") implementation("androidx.appcompat:appcompat:1.7.0") implementation("org.jetbrains.kotlin:kotlin-stdlib:1.9.0") implementation("androidx.recyclerview:recyclerview:1.2.1") implementation("androidx.constraintlayout:constraintlayout:2.1.4") implementation("androidx.localbroadcastmanager:localbroadcastmanager:1.1.0") implementation("com.squareup.retrofit2:retrofit:2.3.0") implementation("com.squareup.retrofit2:converter-gson:2.3.0") implementation("com.squareup.retrofit2:converter-scalars:2.5.0") implementation("com.squareup.okhttp3:logging-interceptor:3.10.0") implementation("com.squareup.okhttp3:okhttp:3.10.0") implementation("com.google.code.gson:gson:2.8.8") implementation("com.madgag.spongycastle:core:1.50.0.0") implementation("com.madgag.spongycastle:pg:1.50.0.0") implementation("org.bouncycastle:bcprov-jdk15on:1.56") implementation("com.nimbusds:nimbus-jose-jwt:7.0.1") implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:0.30.1") implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:0.30.1") } ``` Si tu proyecto ya usa versiones superiores de estas dependencias, valida compatibilidad antes de degradarlas. Evita duplicar librerías con versiones incompatibles. ## Validación rápida * El proyecto sincroniza Gradle sin errores. * Los `.aar` se resuelven desde la carpeta `libs`. * No existen conflictos de versiones en dependencias compartidas. * Los permisos están declarados en `AndroidManifest.xml`. * `viewBinding` está habilitado si el proyecto lo requiere. * El ambiente sandbox está identificado para las primeras pruebas. * Las credenciales se generan y protegen desde backend. * No se exponen tokens ni secretos dentro de la app. * Los logs de prueba no imprimen información sensible. ## Siguiente paso Crea la instancia de `PaymeClient` e inicia tu primer flujo de cobro. # SDK Android Source: https://docs.pay-me.com/sdk-mobile/android/introduccion Integra Pay-me SDK en Android para ejecutar cobros y afiliaciones desde aplicaciones móviles nativas. Pay-me SDK Android permite integrar flujos de **cobro** y **afiliación** directamente en tu aplicación móvil, manteniendo una experiencia nativa para el usuario final. La integración debe coordinarse con el equipo de integraciones para recibir SDKs, credenciales, ambiente y métodos de pago habilitados para tu comercio. ## ¿Qué puedes integrar? Inicializa el SDK para procesar pagos con los métodos habilitados para el comercio. Registra o actualiza datos asociados a flujos de afiliación cuando aplique al negocio. Tarjetas, Yape, QR, transferencia bancaria, Cuotéalo y PagoEfectivo según configuración. Valida escenarios controlados antes de solicitar salida a producción. ## Ruta sugerida Confirma versiones, dependencias, permisos y prerequisitos de negocio en [Requisitos SDK Android](/sdk-mobile/android/requisitos). Agrega las librerías entregadas por Pay-me, configura Gradle y valida permisos desde [Instalación](/sdk-mobile/android/instalacion). Inicializa `PaymeClient`, configura el ambiente y envía el objeto de request para cobro o afiliación. Implementa los delegates del SDK para procesar resultado final, eventos, cancelaciones y errores. Ejecuta pruebas con [Datos de prueba](/pagos/datos-de-prueba) antes de pedir validación final. ## Guías de integración Revisa condiciones técnicas y de negocio antes de iniciar. Configura SDKs, permisos y dependencias Android. Inicializa el SDK para iniciar un cobro desde tu app. Implementa los flujos de afiliación cuando apliquen. ## Antes de producción No uses credenciales, SDKs ni datos de prueba en ambiente productivo. Coordina la validación final con el equipo de integraciones antes de salir a vivo. # Requisitos SDK Android Source: https://docs.pay-me.com/sdk-mobile/android/requisitos Requisitos de negocio, plataforma y seguridad para integrar Pay-me SDK en Android. Antes de iniciar la integración, confirma que el comercio y el proyecto Android cumplen las condiciones mínimas para usar Pay-me SDK. Solicita al equipo de integraciones las credenciales, SDKs, métodos de pago habilitados y ambiente asignado para tus pruebas. ## Requisitos de negocio Razón social registrada, RUC activo y datos comerciales validados. Aplicación, web o canal digital asociado al comercio. Canales protegidos y manejo seguro de credenciales, tokens y respuestas de pago. Cuenta bancaria a nombre de la razón social del comercio. ## Requisitos técnicos Android * Android 5.0 (**API Level 21**) o superior. * Android Studio Jellyfish o superior. * Gradle 8.6 o superior. * Proyecto Android con soporte Kotlin. * Conectividad a internet disponible durante el flujo. * Permisos de red declarados en `AndroidManifest.xml`. * Validación de estado de red antes de iniciar el SDK. * Consumo del API de Seguridad para generar `Access Token`. * Manejo seguro de credenciales fuera de la app. * Registro de operación único por intento de pago. * Confirmación final del resultado desde backend cuando aplique. ## Librerías necesarias El equipo de integraciones entregará las librerías que deben incorporarse al proyecto Android. Librería principal para inicializar cobros y afiliaciones. Soporte de autenticación 3DS 2.2. Experiencia y branding para pagos Visa. Experiencia y branding para pagos Mastercard. ## Consideraciones de entorno El ambiente sandbox está disponible para pruebas controladas. Para pruebas con simuladoras o métodos específicos, coordina la disponibilidad con el equipo de integraciones. Todas las horas operativas indicadas para soporte o coordinación se consideran en GMT-5 (Perú). No expongas credenciales, tokens ni información sensible en la app móvil, repositorios, logs o herramientas de analítica. ## Siguiente paso Configura las librerías, permisos y dependencias necesarias en tu proyecto Android. # Buenas prácticas Source: https://docs.pay-me.com/sdk-mobile/buenas-practicas Recomendaciones para integrar Pay-me SDK Mobile en Android e iOS de forma segura y estable. Aplica estas recomendaciones cuando integres Pay-me mediante **SDK Android** o **SDK iOS**. ## Arquitectura recomendada Invoca el SDK, presenta el flujo de pago o afiliación y muestra respuestas amigables. Genera tokens, protege credenciales, registra operaciones y confirma resultados finales. No incluyas credenciales, secretos o lógica sensible dentro de la app. Todo lo crítico debe vivir en backend. ## Seguridad móvil * Genera `Access Token` desde backend. * No persistir tokens sensibles en almacenamiento inseguro. * Evita imprimir tokens o payloads completos en logs. * No subas `.aar`, `.xcframework` o ZIPs privados a repositorios públicos. * Usa la versión entregada o aprobada por el equipo de integraciones. * Valida compatibilidad antes de actualizar dependencias. * Usa callbacks/delegates para actualizar la experiencia de usuario. * Confirma estados desde backend cuando el método lo requiera. * Maneja cancelación, error, timeout y retorno de la app. ## Validación recomendada * Probar Android e iOS por separado. * Validar aprobado, denegado y errores controlados. * Revisar comportamiento con mala conectividad. * Conservar número de operación y logs mínimos para soporte. Revisa el checklist específico para SDK Mobile. # Checklist de integración Source: https://docs.pay-me.com/sdk-mobile/checklist-de-integracion Validaciones recomendadas para completar una integración SDK Mobile en Android o iOS. Usa este checklist como una guía rápida antes de pedir validación final del flujo **SDK Mobile**. Esta guía aplica para implementaciones nativas en **Android** e **iOS**, tanto para flujos de cobro como para afiliaciones. ## Panorama general Plataforma, requisitos técnicos, credenciales y caso de uso definidos antes de integrar. SDK agregado al proyecto, dependencias resueltas y permisos configurados por plataforma. Cobro aprobado, rechazo, afiliación y manejo de errores revisados desde la app. Evidencias listas, ambiente productivo revisado y flujo validado con integraciones. ## Ruta sugerida Confirma plataforma objetivo, credenciales, ambiente sandbox y caso de uso: cobro, afiliación o ambos. Agrega la librería a tu proyecto móvil y valida dependencias, permisos y configuración inicial. Configura parámetros obligatorios, callbacks, manejo de respuesta y experiencia del usuario. Ejecuta escenarios aprobados, rechazados y errores controlados con datos de prueba. Cuando el flujo esté estable, prepara evidencias y coordina la revisión con el equipo de integraciones. ## Checklist base * Plataforma objetivo definida: **Android**, **iOS** o ambas. * Requisitos técnicos revisados por plataforma. * Credenciales y ambiente de pruebas disponibles. * Caso de uso definido: cobro, afiliación o ambos. * SDK instalado correctamente en el proyecto. * Dependencias y versiones compatibles validadas. * Permisos, configuración de red y entorno sandbox revisados. * Inicialización completada sin errores en la app. * Parámetros obligatorios enviados con formato correcto. * Callbacks o listeners implementados para éxito, rechazo y error. * Manejo de navegación y retorno al flujo de la app validado. * Datos sensibles no expuestos en cliente, logs o pantallas. * Flujo de cobro aprobado probado correctamente. * Flujo rechazado o error controlado validado. * Flujo de afiliación probado si aplica. * Mensajes y experiencia del usuario revisados. * Sandbox completado con evidencia mínima de pruebas. * Build final revisada para el ambiente productivo. * Logs mínimos disponibles para soporte y diagnóstico. * Integración lista para salida a vivo. ## Puntos por plataforma Confirma que las dependencias, repositorios y versiones requeridas estén configuradas. Verifica que el SDK maneje correctamente navegación, retorno y estados de la app. * Revisar [Requisitos SDK Android](/sdk-mobile/android/requisitos). * Validar instalación desde [Instalación Android](/sdk-mobile/android/instalacion). * Probar cobro desde [Inicializar Pay-me SDK Android](/sdk-mobile/android/flujo-de-cobro/inicializar-pay-me-sdk-android). * Probar afiliaciones si están dentro del alcance del comercio. Confirma que la instalación, targets y configuración del proyecto estén alineados con la guía. Verifica permisos, navegación, callbacks y continuidad del usuario dentro de la app. * Revisar [Requisitos SDK iOS](/sdk-mobile/ios/requisitos). * Validar instalación desde [Instalación iOS](/sdk-mobile/ios/instalacion). * Probar cobro desde [Inicializar Pay-me SDK iOS](/sdk-mobile/ios/flujo-de-cobro/inicializar-pay-me-sdk-ios). * Probar afiliaciones si están dentro del alcance del comercio. ## Criterio mínimo de aprobación Al menos un flujo aprobado y uno rechazado revisados correctamente en sandbox. La app maneja éxito, rechazo, cancelación y errores sin romper la experiencia del usuario. Evidencias, logs y build final disponibles para revisión con el equipo de integraciones. ## Guías relacionadas Revisa el flujo completo para Android. Revisa el flujo completo para iOS. Usa escenarios sandbox para validar SDK Mobile y otros flujos de pago. Descarga y configura el SDK iOS en tu proyecto Xcode. # SDK Mobile Source: https://docs.pay-me.com/sdk-mobile/introduccion Visión general de la integración móvil de Pay-me para Android e iOS. El SDK Mobile de Pay-me permite integrar cobros dentro de aplicaciones nativas, manteniendo una experiencia fluida para el usuario final. Puedes elegir la plataforma según tu app: Implementa el flujo móvil en aplicaciones Android. Implementa el flujo móvil en aplicaciones iOS. *** ## Flujo recomendado Confirma dependencias, versiones y consideraciones técnicas antes de integrar. Configura la librería en tu proyecto móvil según la plataforma seleccionada. Elige el flujo que necesitas según tu caso de uso. Ejecuta pruebas antes de pasar a producción. Revisa las validaciones sugeridas para Android e iOS antes de tu salida a vivo. Revisa lineamientos para proteger SDKs, tokens y validación final del pago. # Inicializar afiliaciones iOS Source: https://docs.pay-me.com/sdk-mobile/ios/afiliaciones/inicializar-sdk-ios Inicializa Pay-me SDK iOS para registrar o actualizar afiliaciones desde tu app móvil. El flujo de afiliaciones permite registrar o actualizar información asociada a un beneficiario desde Pay-me SDK iOS. Antes de inicializar este flujo, completa [Instalación SDK iOS](/sdk-mobile/ios/instalacion), revisa [Parámetros de afiliación](/sdk-mobile/ios/afiliaciones/parametros-de-sdk-ios) y genera un `Access Token` desde backend usando [Autenticación](/api-de-pagos/autenticacion). ## Flujo de integración Agrega `UIKit` y `Payme` en el `ViewController` desde donde iniciarás el flujo. Crea `PAYMEAffiliationRequest` con datos de afiliación, beneficiario y configuración. Inicializa `PaymeClient` con `delegate`, `merchantCode` y ambiente. Envía `accessToken` y `paymeAffiliationRequest` en `invokeAffiliationForm`. Implementa `onAffiliationResponse` para recibir el resultado final del flujo. ## Importar PaymeSDK ```swift theme={"system"} import UIKit import Payme ``` ## Parámetros principales * `delegate`: instancia que implementa los métodos de `PaymeClientDelegate`. * `merchantCode`: código del comercio entregado por Alignet. * `PaymeEnviroment.development`: ambiente de pruebas. * `PaymeEnviroment.production`: ambiente productivo. * `from`: `UINavigationController` o controlador desde donde se invoca el SDK. * `accessToken`: token generado desde backend para esta solicitud. * `paymeAffiliationRequest`: objeto con información de la afiliación. ## Ejemplo de inicialización ```swift theme={"system"} let beneficiary = PAYMEAddressData( firstName: "Producto", lastName: "Alignet", email: "producto@alignet.com", phone: "51-999999999", identityDocument: PAYMEIdentityDocument( type: "DNI", identifier: "77777777", country: "PE" ), addressLine1: "Av casimiro Ulloa 333", addressLine2: nil, city: "Lima", state: "Lima", country: "PE" ) var additionalFields = [String: String]() additionalFields["FACTURACION_ID"] = "CODE_12345" additionalFields["reserved1"] = "1" let affiliation = PAYMEAffiliationData( type: PAYMEAffiliationType.MANUAL, amount: nil, currency: "604", additionalFields: additionalFields, beneficiary: beneficiary ) let paymeAffiliationRequest = PAYMEAffiliationRequest( action: PAYMEAffiliationAction.CREATE, affiliationCode: "AFFILIATION_CODE", affiliation: affiliation, setting: PAYMESettingData( locale: "es_PE", walletUserID: "WALLET_USER_CODE" ) ) let paymeClient = PaymeClient( delegate: self, merchantCode: "MERCHANT_CODE" ) paymeClient.setEnvironment( environment: PaymeEnviroment.development ) paymeClient.invokeAffiliationForm( from: self.navigationController!, accessToken: "TOKEN_GENERADO_PARA_ESTA_SOLICITUD", paymeAffiliationRequest: paymeAffiliationRequest ) ``` El `accessToken` debe generarse desde backend para la solicitud. No incluyas credenciales ni secretos dentro de la app. ## Implementar delegate Para completar la integración, la clase debe implementar `PaymeClientDelegate` y procesar la respuesta de afiliación. ```swift theme={"system"} extension MainController: PaymeClientDelegate { func onAffiliationResponse(response: PAYMEAffiliationResponse) { // Procesa el resultado final de la afiliación. } } ``` ## Siguiente paso Revisa el detalle completo de los objetos enviados y recibidos por el flujo de afiliación. # Mensajes de errores de SDK Source: https://docs.pay-me.com/sdk-mobile/ios/afiliaciones/mensajes-de-errores ## **Códigos de Error** Pay-me SDK maneja distintos errores que interrumpen el flujo de afiliacion, estos errores son entregados al comercio y se pueden identificar por el código de error que se encuentra en el parámetro `success`,`resultCode` y` resultMessage` del objeto `PaymeResponse`. Abre tabla en pantalla completaAbrir | **success** | **resultCode** | **resultMessage** | **Descripción** | | :- | :- | :- | :- | | **true** | **00** | Se procesó correctamente la petición | La afiliación se realizó o se actualizó con éxito. | | **false** | **01** | Ocurrió un error | Petición invalida por error del sistema. | | **false** | **02** | Algunos datos no fueron enviados correctamente | El comercio envió uno o más parámetros inválidos al momento de invocar al SDK de Payme. | | **false** | **03** | Comercio no existente | El merchantCode enviado no existe. | | **false** | **04** | Comercio requiere configuracion | El Comercio no tiene habilitado los métodos de pago. | | **false** | **05** | La afiliacion se encuentra registrada | Al momento de crear la afiliación, esta ya se encuentra registrada. | | **false** | **06** | La afiliación no se encuentra registrada | Al momento de actualizar la afiliación, esta no se encuentra registrada. | | **false** | **07** | Afiliación requiere activación | La afiliación esta desactivada, y requiere activar primero. | | **false** | **08** | Usuario abandonó la afiliación | El usuario decidió volver al comercio y no realizo el registro o actualización de la afiliación. | | **false** | **09** | Token de la tarjeta está vencida | La fecha de token ya venció | # Parámetros de Entrada y Salida de SDK iOS Source: https://docs.pay-me.com/sdk-mobile/ios/afiliaciones/parametros-de-sdk-ios A continuación, se detallan los parámetros de entrada y salida de Pay-me SDK para el flujo de afiliaciones: ## Parámetros de Entrada El objeto `PMEAffiliationRequest` está compuesto por los siguientes atributos: ### Objeto PMEAffiliationRequest | **Parámetro** | **Tipo** | **Descripción** | **Obligatorio** | | :- | :- | :- | :- | | action | `PAYMEAffiliationAction` | La acción a ejecutar. Puede ser CREATE o UPDATE: `PAYMEAffiliationAction.CREATE` / `PAYMEAffiliationAction.UPDATE` | SI | | affiliationCode | String | Código de afiliación generado por el comercio | SI | | affiliation | [Objeto PAYMEAffiliationData](#objeto-paymeaffiliationdata) | Contiene información de la afiliación. Es obligatorio cuando la acción es CREATE | NO | | setting | [Objeto PAYMESettingData](#objeto-paymeSettingdata) | Contiene información de ajuste del comportamiento del formulario de afiliación | NO | #### Objeto PAYMEAffiliationData | **Parámetro** | **Tipo** | **Long.** | **Descripción** | **Obligatorio** | | :- | :- | :- | :- | :- | | type | `PAYMEAffiliationType` | - | Tipo de afiliación: `FIXED` → NO DISPONIBLE / `VARIABLE` → NO DISPONIBLE / `MANUAL` → DISPONIBLE | SI | | frequency | String | - | Frecuencia de los cobros de la afiliación | NO | | amount | String | 11 | Monto en centavos a cobrar. Ejemplo: 0.50 → Enviar 50 / 10.00 → Enviar 1000 | NO | | maxAmount | String | 11 | Monto máximo para pagos recurrentes, expresado en centavos | NO | | currency | String | - | Código de moneda ISO-4217 | SI | | additionalFields | Diccionario | - | Contiene información adicional proporcionada por el comercio | NO | | beneficiary | [Objeto PAYMEAddressData](#objeto-paymeaddressdata) | - | Información del afiliado | SI | #### Objeto PAYMEAddressData | **Parámetro** | **Tipo** | **Long.** | **Descripción** | **Obligatorio** | | :- | :- | :- | :- | :- | | firstName | String | 30 | Nombres | SI | | lastName | String | 50 | Apellidos | SI | | email | String | 50 | Correo electrónico | SI | | phone | String | 15 | Código del país y número de celular (51-958435685) | SI | | identityDocument | [Objeto PAYMEIdentityDocument](#objeto-paymeidentitydocument) | - | Objeto que contiene información de documento de identidad | NO | | line1 | String | 50 | Dirección | SI | | line2 | String | 50 | Dirección complementaria | NO | | city | String | 50 | Ciudad/Provincia | SI | | state | String | 15 | Estado/Departamento | SI | | country | String | 2 | Código del País en letra. ISO-3166 | SI | #### Objeto PAYMEIdentityDocument | **Parámetro** | **Tipo** | **Long.** | **Descripción** | **Obligatorio** | | :- | :- | :- | :- | :- | | country | String | 2 | Código del País en letra. ISO-3166. Ejm: Perú → PE | SI | | type | String | 20 | Tipo de documento: DNI / CARNET\_EXTRANJERIA / PASAPORTE / OTROS | SI | | identifier | String | 20 | Número de documento de identidad | SI | #### Objeto PAYMESettingData | **Parámetro** | **Tipo** | **Long.** | **Descripción** | **Obligatorio** | | :- | :- | :- | :- | :- | | locale | String | 5 | Localización del idioma del formulario. Valor: `es_PE` (Español Perú) | SI | | walletUserId | String | 15 | Valor para identificar el wallet de un usuario | NO | *** ## Parámetros de Salida El objeto `PMEAffiliationResponse` está compuesto por los siguientes atributos: ### Objeto PMEAffiliationResponse | **Parámetro** | **Tipo** | **Long.** | **Descripción** | **Obligatorio** | | :- | :- | :- | :- | :- | | success | Boolean | - | `true` si el proceso fue correcto, `false` si ocurrió un error. | SI | | resultCode | String | 2 | Código de resultado del procesamiento. | SI | | resultMessage | String | 30 | Texto que describe el resultado del procesamiento. | SI | | result | [Objeto PAYMEAffiliationResult](#objeto-paymeaffiliationresult) | - | Detalle del resultado de la transacción. | NO | #### Objeto PAYMEAffiliationResult | **Parámetro** | **Tipo** | **Long.** | **Descripción** | **Obligatorio** | | :- | :- | :- | :- | :- | | affiliationId | String | 36 | Identificador único de la transacción generado por Pay-me | SI | | affiliationCode | String | 36 | Número de operación enviado por el Comercio | SI | | type | String | - | Tipo de afiliación: `FIXED` → NO DISPONIBLE / `VARIABLE` → NO DISPONIBLE / `MANUAL` → DISPONIBLE | SI | | state | String | - | Estado actual de la afiliación: `ACTIVE` / `INACTIVE` | SI | | frequency | String | - | Frecuencia de los cobros de la afiliación | NO | | amount | String | 11 | Monto en centavos. Ejemplo: 0.50 → Enviar 50 / 10.00 → Enviar 1000 | NO | | maxAmount | String | 11 | Monto máximo para pagos recurrentes, expresado en centavos | NO | | currency | String | - | Código de moneda ISO-4217 | SI | | additionalFields | Diccionario | - | Información adicional proporcionada por el comercio | NO | | card | [Objeto PAYMEAffiliationCard](#objeto-paymeaffiliationcard) | - | Información de la tarjeta usada en la afiliación | SI | #### Objeto PAYMEAffiliationCard | **Parámetro** | **Tipo** | **Long.** | **Descripción** | **Obligatorio** | | :- | :- | :- | :- | :- | | brand | String | 4 | Marca de la tarjeta: `VISA` / `MSCD` / `AMEX` / `DINC` | SI | | bin | String | 6 | Bin de la tarjeta | SI | | lastPan | String | 4 | Cuatro últimos dígitos de la tarjeta | SI | | issuerName | String | 50 | Nombre del emisor de la tarjeta | NO | | cardholderName | String | 50 | Nombre y Apellidos del titular de la tarjeta | SI | # Inicializar Pay-me SDK iOS Source: https://docs.pay-me.com/sdk-mobile/ios/flujo-de-cobro/inicializar-pay-me-sdk-ios Crea la instancia de PaymeClient, configura el ambiente e inicia el flujo de cobro en iOS. La función de cobro permite invocar Pay-me SDK desde tu app iOS para mostrar el formulario de pago y recibir el resultado de la operación. Antes de inicializar el SDK, completa [Instalación SDK iOS](/sdk-mobile/ios/instalacion) y genera un `Access Token` desde tu backend usando [Autenticación](/api-de-pagos/autenticacion). ## Métodos disponibles Tarjetas de crédito y débito. Pago con billetera Yape. Pago con billeteras móviles mediante QR. Pago mediante transferencia bancaria. Pago financiado con Cuotéalo. Pago con código o canal PagoEfectivo. ## Flujo de integración Agrega `UIKit` y `Payme` en el `ViewController` desde donde iniciarás el flujo. Crea `PAYMEChargesRequest` con datos de transacción, comprador, facturación y configuración. Inicializa `PaymeClient` con `delegate`, `merchantCode` y ambiente. Envía `accessToken` y `paymeChargesRequest` en `invokeCaptureForm`. Implementa `onRespondsPayme` y `onPaymeEvents` para cerrar el flujo en tu app. ## Importar PaymeSDK ```swift theme={"system"} import UIKit import Payme ``` ## Parámetros principales * `delegate`: instancia que implementa los métodos de `PaymeClientDelegate`. * `merchantCode`: código del comercio entregado por Alignet. * `PaymeEnviroment.development`: ambiente de pruebas. * `PaymeEnviroment.production`: ambiente productivo. * `from`: `UINavigationController` o controlador desde donde se invoca el SDK. * `accessToken`: token generado desde backend para esta solicitud. * `paymeChargesRequest`: objeto con información de la transacción. ## Ejemplo de inicialización ```swift theme={"system"} let customer = PAYMEAddressData( firstName: "Levis Antonio", lastName: "Silvestre Maylle", email: "levis.silvestre@alignet.com", phone: "51-958435685", identityDocument: PAYMEIdentityDocument( type: "DNI", identifier: "72111111", country: "PE" ), addressLine1: "Av casimiro Ulloa 333", addressLine2: nil, city: "Lima", state: "Lima", country: "PE" ) let billingShipping = PAYMEAddressData( firstName: "Levis Antonio", lastName: "Silvestre Maylle", email: "levis.silvestre@alignet.com", phone: "51-958435685", addressLine1: "Av casimiro Ulloa 333", addressLine2: nil, city: "Lima", state: "Lima", country: "PE" ) var additionalFields = [String: String]() additionalFields["reserved1"] = "1" additionalFields["reserved2"] = "2" additionalFields["reserved3"] = "3" let paymeChargesRequest = PAYMEChargesRequest( transaction: PAYMETransactionData( operationNumber: "0000001", amount: "1000", currency: "604", additionalFields: additionalFields, customer: customer, billing: billingShipping, shipping: billingShipping ), setting: PAYMESettingData( locale: "es_PE", paymentMethods: ["CARD", "YAPE", "CUOTEALO"], walletUserID: nil ) ) let paymeClient = PaymeClient( delegate: self, merchantCode: "MERCHANT_CODE" ) paymeClient.setEnvironment( environment: PaymeEnviroment.development ) paymeClient.invokeCaptureForm( from: self.navigationController!, accessToken: "TOKEN_GENERADO_PARA_ESTA_SOLICITUD", paymeChargesRequest: paymeChargesRequest ) ``` El `accessToken` debe generarse desde backend para la solicitud. No incluyas credenciales ni secretos dentro de la app. ## Implementar delegates Para completar la integración, la clase debe implementar `PaymeClientDelegate`. ```swift theme={"system"} extension MainController: PaymeClientDelegate { func onRespondsPayme(response: PAYMEChargesResponse) { // Procesa el resultado final del flujo. } func onPaymeEvents(event: PaymeEvent) { // Registra eventos de navegación o interacción del SDK. } } ``` ## Eventos disponibles Indica qué métodos se mostraron al usuario. Indica el método de pago elegido por el usuario. Indica que el usuario regresó al listado de métodos. Indica que el usuario canceló un método de pago. Indica que el usuario presionó el botón de pago. Indica que el usuario cerró el SDK. ## Validación del resultado Usa `onRespondsPayme` para actualizar la experiencia de usuario, pero confirma el estado final desde backend cuando el flujo o método de pago lo requiera. ## Siguiente paso Revisa el detalle completo de los objetos enviados y recibidos por el SDK. # Mensajes de errores de SDK Source: https://docs.pay-me.com/sdk-mobile/ios/flujo-de-cobro/mensajes-de-errores ## **Códigos de Error** Pay-me SDK maneja distintos errores que interrumpen el flujo de autorización, estos errores son entregados al comercio y se pueden identificar por el código de error que se encuentra en el parámetro `success`,`resultCode` y` resultMessage` del objeto `PaymeResponse`. Abre tabla en pantalla completaAbrir | **success** | **resultCode** | **resultMessage** | **Descripción** | | :- | :- | :- | :- | | **true** | **00** | Se procesó correctamente la petición | La autorización se realizó con éxito o la transacción esta en Pendiente. | | **true** | **01** | Peticion rechazada por el Procesador | La autorización fue denegada. | | **true** | **02** | Se expiro la transaccion | Notificacion al comercio que expiró la transacción. | | **false** | **03** | Ocurrió un error | Petición invalida por error del sistema. | | **false** | **04** | No se pudo procesar la petición | Petición inválida por error de la procesadora. | | **false** | **05** | No se encontró el pedido | Consulta o extorno de un número de operación inexistente. | | **false** | **06** | Algunos datos no fueron enviados correctamente | El comercio envió uno o más parámetros inválidos al momento de invocar al SDK de Payme.. | | **false** | **07** | Comercio no existente | El merchantCode enviado no existe. | | **false** | **08** | Comercio requiere configuracion de procesamiento | El Comercio no tiene habilitado los métodos de pago. | | **false** | **09** | Metodo de pago no soportado por el sistema | El método de pago enviado no es soportado por el sistema. | | **false** | **10** | Se requiere un token de acceso | El access token no fue enviado. | | **false** | **11** | Token de acceso inválido | El access token es inválido o ya venció. | | **false** | **12** | La Operación se encuentra finalizada | El número de Operación enviada ya existe con un estado Autorizado o Liquidado. | | **false** | **13** | La Operación se encuentra en proceso | El número de Operación enviada ya existe con un estado Pendiente. | | **false** | **14** | Usuario regresó al comercio sin seleccionar un método de pago | El usuario ingreso al SDK y regreso al comercio sin iniciar un pago con algún método de pago. | | **false** | **15** | Usuario canceló la transacción pendiente y regresó al comercio | El usuario ingreso al SDK, inicio el proceso de pago y decidión regresar al comercio cancelando la transacción pendiente. | # Parámetros de Entrada y Salida de Pay-me SDK iOS Source: https://docs.pay-me.com/sdk-mobile/ios/flujo-de-cobro/parametros-de-pay-me-sdk-ios # Cobros: Parámetros de Entrada y Salida de Pay-me SDK iOS A continuación, se detallan los parámetros de entrada y salida de Pay-me SDK para el flujo de autorización. ## Parámetros de Entrada ### Objeto PAYMEChargesRequest | **Parámetro** | **Tipo** | **Descripción** | **Obligatorio** | | :- | :- | :- | :- | | transaction | [Objeto PAYMETransactionData](#objeto-paymetransactiondata) | Contiene información de la transacción | SI | | setting | [Objeto PAYMESettingData](#objeto-paymeSettingdata) | Contiene información de ajuste del comportamiento del formulario de pago. | NO | #### Objeto PAYMETransactionData | **Parámetro** | **Tipo** | **Long.** | **Descripción** | **Obligatorio** | | :- | :- | :- | :- | :- | | operationNumber | String | 12 | Número de operación único en la pasarela, el cual será utilizado para realizar la transacción. (Cadena numérica entre 6 y 12 dígitos). | SI | | amount | String | 11 | Monto en centavos a cobrar por la pasarela de pago. La pasarela se encarga de aplicar el separador decimal. Ejemplo: Si el monto es 0.50 → Enviar 50 / Si el monto es 10.00 → Enviar 1000 | SI | | currency | String | - | Código de moneda ISO-4217. | SI | | additionalFields | Diccionario | - | Contiene información adicional proporcionada por el comercio. | NO | | billing | [Objeto PAYMEAddressData](#objeto-paymeaddressdata) | - | Información de facturación de la orden de compra. | SI | | shipping | [Objeto PAYMEAddressData](#objeto-paymeaddressdata) | - | Información de envío de la orden de compra. | NO | | customer | [Objeto PAYMEAddressData](#objeto-paymeaddressdata) | - | Información del comprador. | NO | #### Objeto PAYMEAddressData | **Parámetro** | **Tipo** | **Long.** | **Descripción** | **Obligatorio** | | :- | :- | :- | :- | :- | | firstName | String | 30 | Nombres | SI | | lastName | String | 50 | Apellidos | SI | | email | String | 50 | Correo electrónico | SI | | phone | String | 15 | Código del país y número de celular del titular de la tarjeta (51-958435685) | SI | | identityDocument | [Objeto PAYMEIdentityDocument](#objeto-paymeidentitydocument) | - | Objeto que contiene información de documento de identidad del comprador. Solo disponible para **CUSTOMER.** | NO | | line1 | String | 50 | Dirección | SI | | line2 | String | 50 | Dirección complementaria | NO | | city | String | 50 | Ciudad/Provincia | SI | | state | String | 15 | Estado/Departamento | SI | | country | String | 2 | Código del País en letra. ISO-3166. Ejm: Perú → PE | SI | #### Objeto PAYMEIdentityDocument | **Parámetro** | **Tipo** | **Long.** | **Descripción** | **Obligatorio** | | :- | :- | :- | :- | :- | | country | String | 2 | Código del País en letra. ISO-3166. Ejm: Perú → PE | SI | | type | String | 20 | Tipo de documento de identidad: DNI / CARNET\_EXTRANJERIA / PASAPORTE / OTROS | SI | | identifier | String | 20 | Número de documento de identidad | SI | #### Objeto PAYMESettingData | **Parámetro** | **Tipo** | **Long.** | **Descripción** | **Obligatorio** | | :- | :- | :- | :- | :- | | locale | String | 5 | Localización del idioma del formulario. Valor: `es_PE` (Español Perú) | SI | | walletUserId | String | 15 | Valor para identificar el wallet de un usuario. | NO | | paymentMethods | Array\[String] | - | Listado de métodos de pago que cargará el SDK. Si no se envía, se usará la configuración del comercio. Valores: `CARD`, `YAPE`, `CUOTEALO`, `QR`, `BANK_TRANSFER`, `PAGO_EFECTIVO` | NO | | urlNotification | String | 200 | URL donde se realizará la notificación luego de autorizar la transacción. Opcional si se configura por back. | NO | *** ## Parámetros de Salida ### Objeto PaymeEvents | **Parámetro** | **Tipo** | **Descripción** | **Req.** | | :- | :- | :- | :- | | PaymeEvents | Enum | Indicador de acción interna del SDK. Valores posibles: `BUILD_FORM(methods:[String])`, `CHOOSE_PAYMENT_METHOD(method: String)`, `RETURN_LIST_PAYMENT_METHODS`, `CANCEL_PAYMENT_METHOD(method: String)`, `PRESS_PAY_BUTTON(method: String)`, `CLOSE_PAYME` | SI | ### Objeto PAYMEChargesResponse | **Parámetro** | **Tipo** | **Long.** | **Descripción** | **Obligatorio** | | :- | :- | :- | :- | :- | | success | Boolean | - | `true` si el proceso fue correcto, `false` si ocurrió un error. | SI | | resultCode | String | 2 | Código de resultado del procesamiento. | SI | | resultMessage | String | 30 | Texto que describe el resultado del procesamiento. | SI | | result | [Objeto PAYMETransactionResult](#objeto-paymetransactionresult) | - | Detalle del resultado de la transacción. | NO | #### Objeto PAYMETransactionResult | **Parámetro** | **Tipo** | **Long.** | **Descripción** | **Obligatorio** | | :- | :- | :- | :- | :- | | transactionId | String | 25 | Identificador único de la transacción generado por Pay-me | SI | | operationNumber | String | 12 | Número de operación enviado por el Comercio | SI | | state | String | - | Estado de la transacción: `PENDIENTE`, `INVALIDO`, `AUTORIZADO`, `DENEGADO` | SI | | stateReason | String | 100 | Razón por la cual se quedó en aquel estado. | SI | | amount | String | 11 | Monto de la autorización | SI | | currency | String | 3 | Moneda usada en la autorización | SI | | additionalFields | Diccionario | - | Información adicional proporcionada por el comercio. | NO | | paymentMethod | [Objeto PAYMEPaymentMethod](#objeto-paymepaymentmethod) | - | Objeto del método de pago. | SI | | expirationDate | String | - | Fecha en formato **UNIX** en la que la transacción expirará. Disponible para QR y PAGO\_EFECTIVO. | NO | | processorResponse | String | 500 | JSON String con la respuesta de la procesadora. | NO | | lifecycle | [Array PAYMETransactionLifecycle](#objeto-paymetransactionlifecycle) | - | Array de tiempos y estados por los que pasó la transacción. | SI | #### Objeto PAYMEPaymentMethod | **Parámetro** | **Tipo** | **Long.** | **Descripción** | **Obligatorio** | | :- | :- | :- | :- | :- | | name | String | - | Método de pago usado: `CARD`, `YAPE`, `QR`, `CUOTEALO`, `BANK_TRANSFER`, `PAGO_EFECTIVO` | SI | | methodDetail | String | 500 | JSON String con datos de la tarjeta usada. Disponible para CARD, YAPE y QR. | NO | #### Objeto PAYMETransactionLifecycle | **Parámetro** | **Tipo** | **Long.** | **Descripción** | **Obligatorio** | | :- | :- | :- | :- | :- | | state | String | - | Estado de la transacción: `REGISTRADO`, `PENDIENTE`, `INVALIDO`, `AUTORIZADO`, `DENEGADO` | SI | | utcTime | String | - | Fecha en formato UTC en la que la transacción cambió de estado. | SI | | unixTime | String | - | Fecha en formato UNIX en la que la transacción cambió de estado. | SI | # Instalación SDK iOS Source: https://docs.pay-me.com/sdk-mobile/ios/instalacion Configura frameworks, embedding y ajustes necesarios para integrar Pay-me SDK en iOS. Esta guía describe cómo incorporar Pay-me SDK en tu proyecto iOS antes de implementar cobros o afiliaciones. Utiliza siempre la versión de SDK entregada o confirmada por el equipo de integraciones para tu comercio. Descarga el paquete `.zip` con los frameworks necesarios para integrar el SDK iOS. ## Artefactos requeridos El paquete de integración debe incluir los frameworks necesarios para ejecutar el flujo de pago. Framework principal del SDK. Framework para autenticación 3DS. Framework de experiencia Visa. Framework de experiencia Mastercard. No subas los artefactos del SDK a repositorios públicos. Trata los archivos entregados como dependencias privadas del comercio. ## Estructura recomendada Crea una carpeta para frameworks dentro del proyecto y coloca ahí los artefactos entregados. ```text theme={"system"} App/ Frameworks/ Payme.xcframework SecureKey3DS.xcframework VisaSensoryBranding.xcframework MastercardSonic.xcframework ``` ## Agregar frameworks en Xcode En Xcode, agrega los frameworks al proyecto usando: * **Copy items if needed** * **Create groups** * Target correcto de la aplicación Después de agregarlos, revisa que cada framework aparezca en el target de la app dentro de **Frameworks, Libraries, and Embedded Content**. ## Embedding Configura cada framework con la opción **Embed Without Signing** dentro del target iOS. * Abre el target principal de la aplicación. * Ingresa a **General**. * Ubica **Frameworks, Libraries, and Embedded Content**. * Agrega los frameworks del SDK si no aparecen en la lista. * Configura `Payme.xcframework` como **Embed Without Signing**. * Configura `SecureKey3DS.xcframework` como **Embed Without Signing**. * Configura `VisaSensoryBranding.xcframework` como **Embed Without Signing**. * Configura `MastercardSonic.xcframework` como **Embed Without Signing**. ## Configuración Swift Importa `Payme` en el `ViewController` o clase desde donde invocarás el SDK. ```swift theme={"system"} import UIKit import Payme ``` ## Validación rápida * El proyecto compila sin errores de frameworks faltantes. * Los `.xcframework` están asociados al target correcto. * No existen conflictos con arquitecturas o versiones de Swift. * Los frameworks están configurados como **Embed Without Signing**. * El ambiente sandbox está identificado para las primeras pruebas. * La app puede importar `Payme` correctamente. * Las credenciales se generan y protegen desde backend. * No se exponen tokens ni secretos dentro de la app. * Los logs de prueba no imprimen información sensible. ## Siguiente paso Crea la instancia de `PaymeClient` e inicia tu primer flujo de cobro. # SDK iOS Source: https://docs.pay-me.com/sdk-mobile/ios/introduccion Integra Pay-me SDK en iOS para ejecutar cobros y afiliaciones desde aplicaciones móviles nativas. Pay-me SDK iOS permite integrar flujos de **cobro** y **afiliación** directamente en tu aplicación móvil, manteniendo una experiencia nativa para el usuario final. La integración debe coordinarse con el equipo de integraciones para recibir SDKs, credenciales, ambiente y métodos de pago habilitados para tu comercio. ## ¿Qué puedes integrar? Inicializa el SDK para procesar pagos con los métodos habilitados para el comercio. Registra o actualiza datos asociados a flujos de afiliación cuando aplique al negocio. Tarjetas, Yape, QR, transferencia bancaria, Cuotéalo y PagoEfectivo según configuración. Valida escenarios controlados antes de solicitar salida a producción. ## Ruta sugerida Confirma versiones, frameworks, permisos y prerequisitos de negocio en [Requisitos SDK iOS](/sdk-mobile/ios/requisitos). Agrega los frameworks entregados por Pay-me, configura Xcode y valida embedding desde [Instalación](/sdk-mobile/ios/instalacion). Inicializa `PaymeClient`, configura el ambiente y envía el objeto de request para cobro o afiliación. Implementa los delegates del SDK para procesar resultado final, eventos, cancelaciones y errores. Ejecuta pruebas con [Datos de prueba](/pagos/datos-de-prueba) antes de pedir validación final. ## Guías de integración Revisa condiciones técnicas y de negocio antes de iniciar. Configura SDKs, frameworks y dependencias iOS. Inicializa el SDK para iniciar un cobro desde tu app. Implementa los flujos de afiliación cuando apliquen. ## Antes de producción No uses credenciales, SDKs ni datos de prueba en ambiente productivo. Coordina la validación final con el equipo de integraciones antes de salir a vivo. # Requisitos SDK iOS Source: https://docs.pay-me.com/sdk-mobile/ios/requisitos Requisitos de negocio, plataforma y seguridad para integrar Pay-me SDK en iOS. Antes de iniciar la integración, confirma que el comercio y el proyecto iOS cumplen las condiciones mínimas para usar Pay-me SDK. Solicita al equipo de integraciones las credenciales, SDKs, métodos de pago habilitados y ambiente asignado para tus pruebas. ## Requisitos de negocio Razón social registrada, RUC activo y datos comerciales validados. Aplicación, web o canal digital asociado al comercio. Canales protegidos y manejo seguro de credenciales, tokens y respuestas de pago. Cuenta bancaria a nombre de la razón social del comercio. ## Requisitos técnicos iOS * iOS 13.0 o superior. * Xcode 14.2 o superior. * Swift 5.5 o superior. * Proyecto iOS con soporte para frameworks dinámicos. * Conectividad a internet disponible durante el flujo. * Configuración de red y permisos revisados en el proyecto. * Validación de estado de red antes de iniciar el SDK. * Consumo del API de Seguridad para generar `Access Token`. * Manejo seguro de credenciales fuera de la app. * Registro de operación único por intento de pago. * Confirmación final del resultado desde backend cuando aplique. ## Librerías necesarias El equipo de integraciones entregará los frameworks que deben incorporarse al proyecto iOS. Framework principal para inicializar cobros y afiliaciones. Soporte de autenticación 3DS 2.2. Experiencia y branding para pagos Visa. Experiencia y branding para pagos Mastercard. ## Consideraciones de entorno El ambiente sandbox está disponible para pruebas controladas. Para pruebas con simuladoras o métodos específicos, coordina la disponibilidad con el equipo de integraciones. Todas las horas operativas indicadas para soporte o coordinación se consideran en GMT-5 (Perú). No expongas credenciales, tokens ni información sensible en la app móvil, repositorios, logs o herramientas de analítica. ## Siguiente paso Configura los frameworks, embedding y ajustes necesarios en tu proyecto iOS. # Configuración Source: https://docs.pay-me.com/vtex/configuracion Configura Pay-me como proveedor de pagos en VTEX y habilita los métodos de pago. ## Configuración en VTEX *** ## 1. Crear proveedor Pay-me `Store Settings → Payments → Providers` Crearás el provider **Pay-me** para luego cargar credenciales y habilitar los métodos de pago de tu comercio. Si no ubicas esta opción en el menú lateral, usa el buscador superior del Admin y escribe `Providers`. Ve a `Store Settings → Payments → Providers`. Haz clic en **New Provider** en la parte superior derecha. En la ventana de búsqueda, escribe **Pay-me** para filtrar el listado. Elige el proveedor **Pay-me** con tipo **Payment** para continuar con la configuración. Image Con este paso, la tienda queda lista para que configures las credenciales y detalles de la integración. Continúa con la carga de credenciales, el control del ambiente y la activación de métodos de pago. # Configuración de Condiciones de Pago en VTEX Source: https://docs.pay-me.com/vtex/configuracion-de-condiciones-de-pago Luego de crear la afiliación de **Pay-me** y cargar las credenciales, asóciala a las **Payment Conditions** de la tienda. ### 1) Acceder a Condiciones de Pago En el Admin de VTEX, ve a: **Store Settings > Payments > Settings**.\ Selecciona la opción **Payment Conditions**. ### 2) Seleccionar el proveedor Payme En la lista de métodos de pago, ubica **Flex**.\ Haz clic para abrir la configuración. Abre imagen en pantalla completaAbrir Image ### 3) Configurar la condición En **Process with provider**, selecciona la afiliación de **Flex** previamente creada (ejemplo: *Pay-me Prueba Pet*).\ Asegúrate de que el **Status** esté en **Active**. Image ### 4) Guardar cambios Haz clic en **Save**.\ Los cambios pueden tardar entre **5 a 10 minutos** en aplicarse al checkout de la tienda. # Configuración de credenciales y métodos de pago Source: https://docs.pay-me.com/vtex/configuracion-de-credenciales-y-metodos-de-pago Una vez seleccionado el proveedor **Pay-me**, configura la autorización y parámetros de integración. Las credenciales **App key**, **App token** y **Merchant Code** se entregan por correo de Payme, y cada una tiene un propósito. ### Campos de credenciales Abre tabla en pantalla completaAbrir | Campo | Descripción | Ejemplo | | - | - | - | | **App key** | Llave pública del comercio | `Ri54Xh2CREY8OiMnmDnok2tYUxSLnft57Oum83hbVeyUAlCY6RMrx4jVFWmzA0i1` | | **App token** | Token secreto de autenticación | `Ri54Xh2CREY8OiMnmDnok2tYUxSLnft57Oum83hbVeyUAlCY6RMrx4jVFWmzA0i1` | | **Merchant Code** | Identificador único (NSL) del comercio | `e899a9f-c899-4563-aeeb-6345d437e25a` | ### 1) Provider Authorization Ingresa las credenciales compartidas por el equipo de Payme: * **App key** → Llave pública del comercio. * **App token** → Token secreto de autenticación. Abre imagen en pantalla completaAbrir Image Nota: Estos valores son únicos por comercio. No se pueden volver a visualizar una vez guardados, por lo que debes copiarlos y almacenarlos de forma segura. ### 2) Payment Control Configura los parámetros de control: * **Enable test mode** * Si el comercio está en **pruebas**, mantener **activado**. * Si el comercio está en **producción**, **desactivar**. * **Automatic settlement**: Selecciona la opción recomendada por el procesador. * **Enable payout split**: Mantener **deshabilitado**, salvo que el comercio lo requiera explícitamente. Abre imagen en pantalla completaAbrir Image ### 3) Provider Fields Registra los datos específicos del comercio: * **Merchant Code**: Código único del comercio (enviado al correo junto con la App Key y App Token). * **Aceptar pagos con Tarjetas**: Selecciona **Sí** si el comercio tiene habilitado este método. * **Aceptar pagos con Billeteras Móviles (QR)**: Selecciona **Sí** si aplica. * **Aceptar pagos con Yape**: Selecciona **Sí** si está habilitado. * **Aceptar pagos con Cuotéalo**: Selecciona **Sí** si corresponde. * **Aceptar pagos con Transferencia Bancaria / PagoEfectivo**: Selecciona según el caso. Abre imagen en pantalla completaAbrir > > Image > > > Solo deben habilitarse los métodos de pago **previamente contratados** con Payme. ### 4) Confirmación Una vez completados los campos: 1. Haz clic en **Save**. 2. VTEX mostrará una pantalla de confirmación con todos los parámetros cargados. 3. El nuevo proveedor **Payme** quedará visible en el listado de **Providers**. Abre imagen en pantalla completaAbrir Image # Flujo de pago VTEX Source: https://docs.pay-me.com/vtex/flujo-de-pago Entiende cómo se procesa una transacción con Pay-me en VTEX. ## Flujo de pago El siguiente flujo describe cómo se procesa una transacción cuando un cliente paga en tu tienda VTEX usando Pay-me. *** ## Paso a paso 1. **Selección de método de pago**\ El cliente elige Pay-me en el checkout de VTEX 2. **Inicialización del pago**\ VTEX invoca el conector Pay-me 3. **Autenticación (3DS)**\ Se ejecuta 3-D Secure si aplica 4. **Autorización**\ La transacción se envía al procesador (Visa / Mastercard / otros) 5. **Respuesta**\ Se recibe el resultado (aprobado o rechazado) 6. **Resultado en checkout**\ VTEX muestra el estado final al cliente *** ## Resultado de la transacción * **Aprobada** → Pedido confirmado * **Rechazada** → Se solicita otro medio de pago *** ## Consideraciones * 3DS se ejecuta según reglas del emisor * El tiempo de respuesta depende del procesador * El flujo es transparente para el comercio *** ## Siguiente paso Continúa con pruebas y validación de la integración. # Instalación Source: https://docs.pay-me.com/vtex/instalacion Instala el conector Pay-me en VTEX en pocos pasos usando VTEX IO CLI. Sigue los pasos a continuación para instalar y activar el conector en tu tienda VTEX: ### 1) Instalar VTEX IO CLI Descarga e instala la CLI de VTEX IO según tu sistema operativo.\ **Guía oficial:** [Installing VTEX IO CLI](https://developers.vtex.com/docs/guides/vtex-io-documentation-vtex-io-cli-install) ### 2) Iniciar sesión en VTEX Abre una terminal y ejecuta el siguiente comando para iniciar sesión en tu cuenta VTEX: ```text theme={"system"} vtex login ``` El inicio de sesión se realizará con las credenciales de tu tienda VTEX. ### 3) Instalar el conector Payme En la misma terminal, ejecuta el siguiente comando para instalar el conector: ```text theme={"system"} vtex install acalderom.payme-flex ``` ### 4) Validar instalación en el Admin VTEX 1. Ingresa a tu tienda VTEX con tus credenciales. 2. En el menú lateral, dirígete a **App Management**. 3. Verifica que la aplicación **PayMe** se haya instalado correctamente. Con estos pasos, la aplicación queda disponible en tu entorno VTEX y lista para ser configurada. # VTEX Source: https://docs.pay-me.com/vtex/introduccion Integra Pay-me en tu tienda VTEX de forma rápida, segura y sin desarrollo adicional. Image Pay-me para VTEX es un conector listo para usar que permite a los comercios procesar pagos sin necesidad de desarrollo, aprovechando la infraestructura nativa de VTEX IO. Esta integración está pensada para equipos e-commerce que buscan activar Pay-me con una configuración administrativa, manteniendo el checkout nativo de VTEX. Activa Pay-me en menos pasos, sin construir un flujo de pago desde cero. Conserva la experiencia de compra de VTEX y centraliza la operación en tu tienda. Configura sandbox y producción con credenciales y métodos de pago según tu operación. *** ## Descripción general Con nuestro conector de pagos para VTEX podrás integrar Pay-me de forma rápida, segura y escalable, centralizando múltiples métodos de pago en una sola configuración. El conector está diseñado para minimizar el esfuerzo técnico y acelerar el time-to-market, manteniendo altos estándares de seguridad y disponibilidad. *** ## ¿Qué incluye el conector? Habilita tarjetas de crédito y débito, Yape, billeteras móviles con QR, PagoEfectivo y Cuotéalo, según lo contratado para tu comercio. Opera con checkout integrado en VTEX, soporte de **3-D Secure 2.0** y una arquitectura lista para crecer con tu operación. *** ## ¿Cómo avanza la implementación? Despliega la aplicación en tu cuenta VTEX usando VTEX IO CLI. Registra `App Key`, `App Token` y `Merchant Code` para conectar tu comercio con Pay-me. Habilita solo los medios previamente contratados y define las condiciones comerciales necesarias. Valida pagos aprobados y rechazados antes de mover la integración a producción. *** ## Requisitos previos Antes de comenzar, asegúrate de contar con: Una tienda activa en VTEX con acceso administrativo al módulo de pagos. Credenciales habilitadas con Pay-me para `sandbox` o `producción`. Llaves de integración: **App Key**, **App Token** y **Merchant Code**. Métodos de pago previamente contratados con Pay-me para poder habilitarlos en tu tienda. Estas credenciales serán proporcionadas por el equipo de Pay-me. *** ## Beneficios clave La integración se realiza mediante configuración guiada, sin desarrollar un checkout nuevo ni mantener una personalización compleja. Centraliza varios métodos de pago en una sola configuración y prepara tu tienda para crecer con mayor orden operativo. *** ## Siguiente paso Instala el conector en tu entorno VTEX y déjalo listo para la configuración inicial. Revisa cómo viaja la transacción desde el checkout hasta la respuesta final del pago. # Pruebas y Troubleshooting Source: https://docs.pay-me.com/vtex/pruebas-y-troubleshooting Valida tu integración en VTEX y resuelve problemas comunes. ## Pruebas de integración Antes de pasar a producción, valida el funcionamiento en entorno de pruebas. *** ## Validaciones básicas * Realizar una compra en el checkout * Validar pago aprobado * Validar pago rechazado * Verificar que el pedido se genere correctamente * Confirmar visibilidad del método de pago *** ## Checklist de validación * Credenciales correctas (App Key / Token / Merchant Code) * Modo test activado * Métodos de pago habilitados * Provider correctamente configurado * Payment Condition activa *** ## Problemas comunes ### No aparece Pay-me en checkout * Verificar Payment Condition activa * Revisar que el provider esté configurado * Esperar propagación (5–10 min) *** ### Error de credenciales * Validar App Key y App Token * Confirmar entorno correcto (test vs producción) *** ### Métodos de pago no visibles * Revisar configuración en Provider Fields * Confirmar que estén habilitados para el comercio *** ### Cambios no se reflejan * Esperar tiempo de propagación * Refrescar checkout * Validar caché del navegador *** ## Paso a producción Antes de pasar a producción: * Desactivar **Enable test mode** * Usar credenciales productivas * Validar flujo completo nuevamente *** ## Soporte Si el problema persiste, contactar: [soporte@pay-me.com](mailto:soporte@pay-me.com) # Configuración y Llaves Source: https://docs.pay-me.com/wordpress-woocommerce/configuracion-y-llaves Aprende a conectar tu tienda con la pasarela Pay-me utilizando tus credenciales y llaves de seguridad. Una vez instalado el plugin, el siguiente paso es la vinculación técnica. Pay-me utiliza un sistema de identificadores y llaves criptográficas para garantizar que cada transacción sea auténtica y segura. ## Acceso al Panel de Configuración Para comenzar, dirígete en tu administrador de WordPress a: **WooCommerce** > **Ajustes** > **Pagos** > **Pay-me Checkout** > **Finalizar configuración**. *** ## 1. Identificadores del Comercio Estos datos son proporcionados por el equipo de Pay-me tras tu afiliación. Son esenciales para el enrutamiento de los pagos. | Campo | Descripción | | :- | :- | | **ID de Comercio (Merchant ID)** | Identificador único de tu tienda en la plataforma Pay-me. | | **ID de Adquirente (Acquirer ID)** | Identificador del procesador de pagos asignado a tu cuenta. | | **ID de Terminal** | Número de terminal lógico para tus operaciones. | *** ## 2. Gestión de Llaves de Seguridad Para cifrar la comunicación, el plugin requiere dos llaves. Puedes generarlas o recuperarlas desde el **Portal de Administración de Pay-me**. Se utiliza para cifrar los datos que viajan desde el navegador del cliente hacia Pay-me. * **Formato:** Cadena alfanumérica larga. * **Ubicación:** Copia el valor exacto desde tu panel de comercio en la sección "Configuración de Seguridad". Se utiliza para la firma de mensajes S2S (Server to Server) y validación de webhooks. * **Seguridad:** ¡Nunca compartas esta llave! Solo debe estar configurada en tu servidor. *** ## 3. Ambientes de Ejecución El plugin permite alternar entre dos entornos. Es fundamental validar todo en Sandbox antes de procesar dinero real. Asegúrate de marcar la casilla **"Habilitar modo de prueba"**. En este modo, se utilizarán credenciales de prueba y no se realizarán cargos reales a las tarjetas. * **URL de Pruebas:** Configurada automáticamente por el plugin. * **Datos de prueba:** [Ver referencia unificada](/pagos/datos-de-prueba). Cuando estés listo para vender, desmarca el modo de prueba e ingresa las credenciales definitivas enviadas por el equipo de Soporte. * **Validación SSL:** En producción, es obligatorio que tu sitio web cuente con un certificado HTTPS activo. *** ## 4. Configuración de URL de Notificación (S2S) Para que Pay-me avise a tu tienda cuando un pago ha sido exitoso (especialmente en métodos asíncronos), debes configurar la URL de respuesta en tu panel de Pay-me: **[https://tudominio.com/?wc-api=WC\\\_Gateway\\\_Payme](https://tudominio.com/?wc-api=WC\\_Gateway\\_Payme)** Sustituye **tudominio.com** por la URL real de tu tienda. Esta URL debe ser pública y no estar protegida por firewalls que bloqueen conexiones externas. *** Configura cómo verán tus clientes los métodos de pago en el carrito. Usa nuestras tarjetas de prueba para validar tu integración. # Experiencia del Checkout Source: https://docs.pay-me.com/wordpress-woocommerce/experiencia-del-checkout Configura cómo tus clientes visualizan y completan sus pagos en WooCommerce. El plugin de Pay-me ofrece una integración nativa que se adapta al diseño de tu tienda, garantizando un flujo de pago fluido y seguro. ## 1. Modos de Visualización Puedes elegir cómo presentar los métodos de pago en tu formulario de finalización de compra. ### Modo Separado (Recomendado) Este modo desglosa cada marca de tarjeta y método de pago (Yape, Plin, PagoEfectivo) como opciones individuales con su propio icono oficial. * **Ventaja:** Transmite mayor confianza al cliente al ver los logos familiares desde el primer clic. * **Flujo:** 1. El cliente completa sus **Datos de Facturación**. 2. Selecciona el método específico (ej: Tarjeta Visa). 3. Al dar clic en "Pagar", se abre el **Formulario Seguro de Pay-me**. 4. Tras la confirmación, el cliente es redirigido a la página de éxito. *** ## 2. Compatibilidad con WooCommerce Blocks El plugin es totalmente compatible con el **Checkout Moderno de WooCommerce** (basado en React/Blocks). Soporte total para temas basados en shortcodes **(\[woocommerce\_checkout])**. Integración optimizada para el bloque de Pago de WooCommerce de alto rendimiento. *** ## 3. Validación de Datos en Tiempo Real Para evitar transacciones fallidas, el plugin realiza una validación previa antes de invocar a la pasarela. Los siguientes campos son obligatorios: * **Nombre y Apellidos:** Requeridos para la validación del tarjetahabiente. * **Correo Electrónico:** Donde el cliente recibirá su comprobante. * **Dirección y Ciudad:** Datos críticos para el análisis de riesgo. * **Teléfono:** Contacto para validaciones de seguridad. Si un campo falta o está mal formateado, el plugin mostrará una advertencia nativa de WooCommerce resaltando el error antes de intentar procesar el pago. *** ## 4. Pantalla de Confirmación (Feedback Visual) La experiencia post-pago es vital. El plugin personaliza la página de "Orden Recibida" con mensajes claros según el resultado: | Estado del Pago | Significado | | :- | :- | | **Exitoso** | "¡Pedido Confirmado!". Transacción aprobada y lista para despacho. | | **Pendiente** | "Pedido Pendiente". Típico en métodos asíncronos (QR o PagoEfectivo). | | **Denegado** | "Pago Denegado". Transacción rechazada; se invita a intentar con otro medio. | **La página incluye automáticamente:** * Resumen completo del pedido. * Detalle de productos adquiridos. * Datos de facturación ingresados. * Botón directo para "Volver a la tienda". *** Aprende a gestionar reembolsos y ver logs desde el admin de WordPress. Entiende el flujo de pagos con QR y transferencias. # Gestión de Pedidos y Transacciones Source: https://docs.pay-me.com/wordpress-woocommerce/gestion-de-pedidos-y-transacciones Administra cobros, reembolsos y estadísticas directamente desde tu panel de WordPress. El plugin de Pay-me centraliza la operación financiera en un solo lugar, permitiéndote tomar decisiones basadas en datos y gestionar el flujo de dinero de forma eficiente. ## 1. Panel de Administración Pay-me Para acceder al centro de control de tus pagos, dirígete a: **WooCommerce** > **Payme Transacciones**. Este panel se divide en tres herramientas fundamentales: Visualiza el historial detallado de todos los intentos de pago. * **Filtros avanzados:** Busca por estado (Aprobado, Denegado) y rangos de fechas. * **Detalle Individual:** Accede a los IDs de transacción de la pasarela para conciliaciones bancarias. Registro técnico de la comunicación entre tu servidor y Pay-me. * **Auditoría:** Rastrea errores de conexión o respuestas del emisor. * **Mantenimiento:** Opción para limpiar registros antiguos y optimizar la base de datos. Visualización gráfica del rendimiento de tu tienda en los últimos 30 días: * **Tasa de Conversión:** Porcentaje de transacciones exitosas vs. fallidas. * **Métricas:** Monto total procesado, ticket promedio y volumen de ventas. *** ## 2. Gestión de Extornos (Reembolsos) Ya no necesitas ingresar al portal externo de Pay-me para devolver dinero. Puedes realizar **reembolsos totales o parciales** directamente desde la orden de WooCommerce. ### ¿Cómo realizar un extorno? 1. Ve a **WooCommerce** > **Pedidos** y selecciona la orden deseada. 2. Haz clic en el botón **"Extornar con Payme"**. 3. El sistema procesará la solicitud S2S (Server-to-Server) con la pasarela. **Seguridad Inteligente:** El plugin cuenta con una validación interna que previene extornos duplicados de forma automática, protegiendo tu flujo de caja. *** ## 3. Mapeo Automático de Estados El plugin sincroniza el estado del pedido en WooCommerce según el resultado en Pay-me, automatizando tu logística: | Evento en Pay-me | Estado en WooCommerce | Acción Automática | | :- | :- | :- | | **Pago Exitoso** | **Procesando** | Se reduce el stock y se envía correo de confirmación. | | **Pago Pendiente** | **En espera** | El stock se reserva (on-hold) hasta la confirmación S2S. | | **Pago Fallido** | **Fallido** | Se notifica al cliente para que reintente el pago. | | **Extorno Exitoso** | **Reembolsado** | El estado cambia automáticamente al confirmar la devolución. | ## 4. Métodos Asíncronos (QR / PagoEfectivo) Para los métodos que no son instantáneos, el flujo sigue una lógica de **confirmación diferida**: 1. El pedido se crea como **En espera (on-hold)**. 2. El cliente realiza el pago en su app bancaria o agente. 3. Pay-me envía una notificación **S2S** a tu tienda. 4. El plugin recibe la señal y cambia el estado a **Procesando** automáticamente. **Importante:** Si tu servidor está en mantenimiento o bajo un firewall que bloquee la IP de Pay-me, el estado del pedido no se actualizará automáticamente. Revisa siempre los **Logs** si esto ocurre. *** Valida que los estados cambien correctamente con nuestras tarjetas de prueba. ¿El pedido no cambia de estado? Revisa las soluciones comunes aquí. # Instalación y Activación Source: https://docs.pay-me.com/wordpress-woocommerce/instalacion-y-activacion Guía paso a paso para instalar el plugin de Pay-me en tu tienda WooCommerce. Antes de comenzar, asegúrate de haber completado la fase de [Acceso a la Plataforma](/wordpress-woocommerce/introduccion) y contar con el archivo **.zip** del plugin Pay-me para WooCommerce. Descarga la versión más reciente del plugin desde el repositorio oficial de GitHub Releases. ## Requisitos Previos Para un funcionamiento óptimo, tu entorno debe cumplir con lo siguiente: * **WordPress:** Versión 3.3 o superior. * **WooCommerce:** Instalado y activo en tu CMS. * **PHP:** Versión 5.2.4 o superior (se recomienda 7.4+ por seguridad). * **Seguridad:** Certificado SSL instalado (navegación obligatoria por **HTTPS**). *** ## Proceso de Instalación Sigue estos pasos para cargar el plugin en tu servidor de WordPress: Inicia sesión en tu CMS de WordPress como administrador. En el menú lateral izquierdo, dirígete a **Plugins** > **Añadir nuevo**. Image Haz clic en el botón **Subir plugin** ubicado en la parte superior de la pantalla. Se abrirá un selector de archivos. Image Haz clic en **Seleccionar archivo**, busca en tu computadora el archivo comprimido del plugin (ej: Plugin\_Payme\_Wordpress\_vX.zip) y selecciónalo. Haz clic en el botón **Instalar ahora**. WordPress se encargará de descomprimir y mover los archivos a la carpeta correspondiente (wp-content/plugins/). Image Una vez finalizada la instalación, haz clic en el botón **Activar plugin**. Image *** ## Verificación de la Instalación Tras la activación, podrás confirmar que el plugin está listo para ser configurado: 1. Ve a **WooCommerce** > **Ajustes** en el menú de WordPress. 2. Selecciona la pestaña **Pagos** (o *Finalizar compra* en versiones antiguas). 3. Deberías visualizar el método de pago **Pay-me - Checkout** en el listado oficial de pasarelas. **¿No aparece el plugin?** Asegúrate de que WooCommerce esté correctamente activado. Si el problema persiste, verifica que tu servidor tenga habilitada la extensión `fsockopen` de PHP, requerida por algunas pasarelas para la comunicación de red. *** Aprende a ingresar tus credenciales (Merchant ID, Acquirer ID y llaves) para habilitar el ambiente de pruebas. # WooCommerce Source: https://docs.pay-me.com/wordpress-woocommerce/introduccion Integra la pasarela de pagos Pay-me en tu tienda WordPress de forma rápida y segura. Image Pay-me WooCommerce es el plugin oficial para **cobrar en tu tienda WordPress** con los métodos de pago más importantes del mercado local (Perú y región) desde una sola integración. ### Métodos de Pago Disponibles Dependiendo de tu configuración, podrás habilitar: * **Tarjetas:** Visa, Mastercard, American Express, Diners. * **Billeteras:** Yape, Plin. * **Pagos con QR.** * **Transferencias y Efectivo:** PagoEfectivo, Cuotéalo BCP. ### Flujo General de Pago Comprender cómo viaja la información es clave para una integración exitosa. El plugin gestiona todo el ciclo de vida de la transacción automáticamente. Image ### ¿Cómo funciona? 1. **Selección:** El cliente elige Pay-me como método de pago en el checkout de WooCommerce. 2. **Envío:** El plugin envía de forma cifrada la información de la transacción a la pasarela Pay-me. 3. **Validación:** Pay-me valida el pago con los emisores y procesadores bajo estándares de seguridad PCI-DSS. 4. **Respuesta:** - **Síncrona:** El cliente recibe una confirmación inmediata en pantalla. * **Asíncrona (Webhook):** Pay-me notifica a tu tienda mediante un webhook para actualizar el estado del pedido automáticamente. *** ## Ciclo de Vida del Pedido Para que tu logística sea eficiente, el plugin mapea los estados de la pasarela con los estados nativos de WooCommerce: El pedido se crea en WooCommerce como **"Pendiente de pago"**. Si el pago es exitoso, el estado cambia a **"Procesando"** (o "Completado" según tu configuración), notificando al cliente por correo. Si el pago es rechazado o el cliente cierra la ventana, el pedido se marca como **"Fallido"** o **"Cancelado"**. *** Descarga el plugin y sigue los pasos para subirlo a tu WordPress. Ingresa tus credenciales de producción y activa los métodos de pago. # Pruebas y Certificación Source: https://docs.pay-me.com/wordpress-woocommerce/pruebas-y-certificacion Valida tu integración en Sandbox antes de pasar al ambiente de producción. Antes de habilitar los pagos reales, es obligatorio realizar pruebas de extremo a extremo para asegurar que los pedidos se creen correctamente y que tu servidor reciba las notificaciones de pago (S2S). ## 1. Datos de prueba para Sandbox Para evitar duplicidad, los escenarios de prueba se consultan desde una sola página compartida: Revisa tarjetas, Yape, transferencias y otros escenarios sandbox desde una referencia central. Ejecuta estas validaciones con el plugin en modo prueba y credenciales sandbox activas. En WooCommerce, utiliza esa referencia para cubrir aprobaciones, rechazos y métodos alternativos sin repetir aquí los mismos datos. Para métodos como **PagoEfectivo** o flujos que requieran confirmación diferida, puedes apoyarte con el equipo de soporte si necesitas validar la aprobación manual del escenario. *** ## 2. Casos de Prueba Obligatorios Ejecuta este checklist para garantizar una nota **10/10** en tu implementación: Realiza una compra real, completa el formulario y verifica que seas redirigido a la página de **"Pedido Confirmado"**. Verifica en el admin de WordPress que el pedido cambió de **Pendiente** a **Procesando** automáticamente sin intervención manual. Cierra la ventana de pago a la mitad y confirma que el pedido en WooCommerce se marque como **Cancelado** tras el tiempo de expiración. Desde el panel de transacciones del plugin, realiza un reembolso parcial y valida que el monto se refleje en el historial del pedido. *** ## 3. Checklist para Paso a Producción ¿Todo listo? Antes de solicitar tus llaves definitivas, asegúrate de cumplir con: * **Certificado SSL:** Tu sitio debe cargar obligatoriamente bajo **https\://**. * **Credenciales Finales:** Tienes tu Merchant ID y llaves de producción a la mano. * **URL S2S:** Tu servidor es accesible desde IPs externas (Pay-me). * **Ambiente:** Has desmarcado la casilla "Modo de Prueba" en los ajustes del plugin. *** ## 4. Obtener Soporte Técnico Si encuentras comportamientos inesperados durante tus pruebas, nuestro equipo de integraciones está listo para ayudarte: [soporte@pay-me.com](mailto:soporte@pay-me.com) +51 940 133 391 (01) 700-8377 *** ¿Recibes un error específico? Consulta nuestra guía de errores comunes. # Solución de Problemas Source: https://docs.pay-me.com/wordpress-woocommerce/solucion-de-problemas Guía rápida para identificar y resolver los errores más comunes en la integración con WooCommerce. Si experimentas dificultades durante la integración o el procesamiento de pagos, consulta esta guía antes de contactar al soporte técnico. La mayoría de los problemas se resuelven revisando la configuración de red y las credenciales. ## 1. Tabla de Errores Comunes Identifica el síntoma y aplica la solución recomendada: | Problema | Causa Probable | Solución Sugerida | | :- | :- | :- | | **Formulario no carga** | Credenciales inválidas o ambiente incorrecto. | Verifica que el Merchant ID y las Llaves coincidan con el modo (Sandbox/Producción). | | **Pago exitoso sin pedido** | El Webhook (S2S) no pudo notificar a tu tienda. | Valida que tu URL S2S sea pública y revisa si un Firewall o Plugin de seguridad bloquea la IP de Pay-me. | | **Error en datos de facturación** | Faltan campos obligatorios en el checkout. | Asegúrate de que el cliente complete nombre, apellido, correo y teléfono. | | **Extorno no funciona** | La transacción no permite devoluciones aún. | Verifica que la transacción original esté en estado **Liquidado**. Los pagos del mismo día no siempre permiten extorno inmediato. | | **Botón de pago no aparece** | Conflicto de JavaScript o SSL ausente. | Revisa la consola del navegador (F12) y asegúrate de navegar por **HTTPS**. | *** ## 2. Diagnóstico Técnico (Logs) El plugin registra cada interacción relevante. Si un pago falla "silenciosamente", los logs te dirán por qué. 1. Ve a **WooCommerce** > **Estado** > **Logs**. 2. En el desplegable de la derecha, busca el archivo que comience por **payme-checkout-...** y dale a **Ver**. 3. Busca líneas que contengan **ERROR** o **RESPONSE**. Allí verás el código de respuesta del procesador (Visa/Mastercard). Puedes comparar los códigos de error encontrados en los logs con nuestra [Guía de Códigos de Respuesta](/referencias/codigos-visa-mastercard). *** ## 3. Verificación del Servidor Para que el plugin se comunique correctamente con la pasarela Pay-me, tu servidor debe permitir: * **Salida de datos:** Conexiones hacia las URLs de la API de Pay-me (Puerto 443). * **Entrada de datos (S2S):** Tu servidor debe aceptar peticiones **POST** externas. * **Extensiones PHP:** Verifica que **curl** y **openssl** estén activos en tu configuración de PHP. *** ## 4. ¿Aún necesitas ayuda? Si el problema persiste tras revisar los puntos anteriores, prepara la siguiente información para nuestro equipo de soporte: 1. **Merchant ID** de tu comercio. 2. **URL de tu tienda**. 3. **Captura de pantalla** del error o el mensaje exacto. 4. **Archivo de Log** de la transacción fallida. *** Envíanos un correo con tu kit de soporte. Regresar a la guía principal. # Generar Access Token Source: https://docs.pay-me.com/api-reference/authentication/generar-access-token /openapi.json post /token Genera un Bearer Token usando credenciales del comercio y el flujo client_credentials. Si prefieres ver la solicitud documentada paso a paso, revisa [Autenticación](/autenticacion#param-post-token). # Generar Nonce Source: https://docs.pay-me.com/api-reference/authentication/generar-nonce /openapi.json post /nonce Genera el Nonce temporal necesario para inicializar Pay-me Flex. Este endpoint debe consumirse desde backend usando un Bearer Token vigente. Si prefieres ver la solicitud documentada paso a paso, revisa [API Nonce](/checkout-web/flex/api-nonce). # Notificacion servertoserver Source: https://docs.pay-me.com/api-reference/notificacion-servertoserver /openapi.json webhook serverToServerNotification Pay-me envia una notificacion HTTP POST al callback del comercio con el resultado final de la autorizacion. El header `signature` debe validarse con la llave publica del ambiente usando el body crudo recibido. # Autorizar pago ecommerce Source: https://docs.pay-me.com/api-reference/payin/autorizar-pago-ecommerce /openapi.json post /charges Procesa un pago ecommerce usando el API de autorizacion. Este endpoint soporta flujos con Tarjeta, Yape, Transferencia Bancaria, QR, Cuotéalo y PagoEfectivo. Antes de consumirlo, solicita tu Access Token en [Autenticación](/autenticacion#param-post-token). Si necesitas la guia funcional paso a paso, revisa [Tarjeta](/payin/autorizacion-tarjeta), [Yape](/payin/autorizacion-yape), [Transferencia Bancaria](/payin/autorizacion-transferencia-bancaria), [QR](/payin/autorizacion-qr), [Cuotéalo](/payin/autorizacion-cuotealo) o [PagoEfectivo](/payin/autorizacion-pagoefectivo). # Cancelar o extornar operacion ecommerce Source: https://docs.pay-me.com/api-reference/payin/cancelar-o-extornar-operacion-ecommerce /openapi.json delete /charges/{merchant_code}/{merchant_operation_number} Cancela o extorna una transaccion generada previamente por el API de autorizacion. Con el metodo DELETE del orquestador, las transacciones se podran cancelar o extornar segun el estado en el que se encuentran. Las transacciones en estado REGISTRADO o PENDIENTE pasan a CANCELADO para CARD cuando es por Redirect, CUOTEALO, QR, BANK_TRANSFER y PAGOEFECTIVO. Las transacciones en estado AUTORIZADO pasan a EXTORNADO para CARD y YAPE. # Consultar transaccion ecommerce Source: https://docs.pay-me.com/api-reference/payin/consultar-transaccion-ecommerce /openapi.json get /charges/{merchant_code}/{merchant_operation_number}/{transaction_id} Consulta el estado de una transaccion generada previamente por el API de autorizacion. Este endpoint soporta flujos con Tarjeta, Yape, Transferencia Bancaria, QR, Cuotealo y PagoEfectivo. Antes de consumirlo, solicita tu Access Token en [Autenticacion](/autenticacion#param-post-token). Si necesitas la guia funcional paso a paso, revisa [Tarjeta](/payin/consulta-tarjeta), [Yape](/payin/consulta-yape), [Transferencia Bancaria](/payin/consulta-transferencia-bancaria), [QR](/payin/consulta-qr), [Cuotealo](/payin/consulta-cuotealo) o [PagoEfectivo](/payin/consulta-pagoefectivo). # Consultar devolucion unitaria Source: https://docs.pay-me.com/api-reference/refunds/consultar-devolucion-unitaria /openapi.json get /refund/{merchant_code}/{merchant_operation_number} El API de Consulta Unitaria de Devolucion permite consultar una devolucion generada anteriormente por el API de Devoluciones. # Consultar devoluciones con filtros Source: https://docs.pay-me.com/api-reference/refunds/consultar-devoluciones-con-filtros /openapi.json get /refund El API de Consulta Masiva de Devolucion permite consultar mediante filtros una o mas solicitudes de devolucion generadas anteriormente por el API de Devoluciones. # Solicitar devolucion Source: https://docs.pay-me.com/api-reference/refunds/solicitar-devolucion /openapi.json post /refund El API de Devoluciones permite enviar una o mas transacciones en estado LIQUIDADO a devolver. Solo esta disponible para los metodos CARD, YAPE y CUOTEALO. La devolucion se aplica despues de la autorizacion, cuando la transaccion ya fue liquidada. # Autorización Source: https://docs.pay-me.com/autorizacion ## Flujo de Autorización Para iniciar una autorización, la aplicación debe invocar la función `initAuthorization` del objeto `PaymeClient`. Esta función permite enviar los datos de la transacción al SDK para iniciar el flujo de pago. ## Parámetros de Entrada | Parámetro | Tipo | Descripción | | :- | :- | :- | | `from` | Activity | Activity desde donde se realizará la invocación del SDK. | | `method` | PMPaymentMethod? | Método de pago con el cual se realizará la autorización. Puede ser `CARD` o `QR`. Si no se envía, el SDK mostrará una pantalla para seleccionar el método de pago. | | `pmAuthorizationRequest` | PMAuthorizationRequest | Objeto que contiene los datos de la transacción. | | `delegate` | Activity | Activity encargada de implementar los métodos del delegado. | Si el parámetro `method` no es enviado, el SDK permitirá que el usuario seleccione el método de pago disponible desde la pantalla correspondiente. ## Ejemplo de Invocación ```text theme={"system"} private fun invokeForAuthorization(method: PMPaymentMethod? = null) { val reservedData = HashMap() reservedData["reserved1"] = "Reserved_1" val pmAuthorizationRequest = PMAuthorizationRequest( operationNumber = "00000001", amount = "2000", currency = "604", additionalFields = reservedData ) PaymeClient.initAuthorization( from = this, method = method, pmAuthorizationRequest = pmAuthorizationRequest, delegate = this ) } ``` ## Recepción de la Respuesta Para recibir el resultado de la autorización, se debe implementar el método `onAuthorizationResponse`. ```text theme={"system"} override fun onAuthorizationResponse(response: PMAuthorizationResponse) { val gson = GsonBuilder().setPrettyPrinting().create() val gsonRequest = gson.toJson(this.pmAuthorizationRequest) val gsonResponse = gson.toJson(response) val intent = Intent(this, ResponseActivity::class.java).apply { putExtra("ACTION", this@RequestActivity.action) putExtra("REQUEST_PAYME", gsonRequest) putExtra("RESPONSE_PAYME", gsonResponse) } startActivity(intent) finish() } ``` ## Respuesta de Autorización El resultado de la autorización será devuelto mediante el objeto `PMAuthorizationResponse`. El método `onAuthorizationResponse` permite capturar la respuesta del SDK y procesarla dentro de la aplicación integradora. # Consideraciones generales Source: https://docs.pay-me.com/consideraciones-generales Buenas prácticas, validaciones, manejo de errores, reintentos e información operativa para autorizaciones Ecommerce y POS. Esta página reúne las principales recomendaciones técnicas y operativas para integrar correctamente el servicio de autorización mediante el endpoint `POST /authorize`. Aplica para los canales: * Ecommerce * POS ## Endpoint ```http theme={"system"} POST /authorize ``` ## Alcance El servicio de autorización permite procesar transacciones de pago enviadas por un comercio, terminal, PinPad, checkout o integración server-to-server. La autorización puede originarse desde distintos canales según el valor enviado en `frame_type`. | Canal | Valor `frame_type` | Descripción | | - | - | - | | Ecommerce | `ecommerce` | Transacción no presencial. Aplica para checkout web, mobile checkout, link de pago o integración server-to-server. | | POS | `pos` | Transacción presencial. Aplica para terminal POS, PinPad, Android POS o captura física de tarjeta. | ## Flujo general de autorización ```mermaid theme={"system"} sequenceDiagram participant Comercio participant Plataforma participant Marca Comercio->>Plataforma: POST /authorize Plataforma->>Plataforma: Valida comercio, monto, moneda y datos de pago Plataforma->>Marca: Envía autorización Marca-->>Plataforma: Respuesta de autorización Plataforma-->>Comercio: Response con resultado y trazabilidad ``` ## Pasos del flujo | Paso | Descripción | | - | - | | 1 | El comercio genera una orden de compra o una operación de pago. | | 2 | El comercio captura u obtiene los datos de pago según el canal. | | 3 | El comercio construye la trama de autorización. | | 4 | El comercio invoca el endpoint `POST /authorize`. | | 5 | La plataforma valida la estructura, el comercio, la moneda, el monto y los datos enviados. | | 6 | La plataforma procesa la transacción con la marca correspondiente. | | 7 | La plataforma devuelve la respuesta de autorización. | | 8 | El comercio almacena los identificadores de trazabilidad. | ## Canales soportados | Canal | Uso recomendado | | - | - | | Ecommerce | Pagos en checkout web, mobile checkout, link de pago o integración directa desde backend. | | POS | Pagos presenciales con lectura de tarjeta física, chip, contactless, banda magnética o entrada manual. | ## Marcas soportadas | Valor | Marca | | - | - | | `visa` | Visa | | `mscd` | Mastercard | ## Monedas soportadas El campo de moneda debe enviarse en formato ISO 4217 numérico. | Moneda | Código ISO 4217 numérico | | - | - | | PEN | `604` | | USD | `840` | ## Formato de montos Todos los montos deben enviarse sin punto decimal, sin separadores de miles y como string. El monto se calcula aplicando el exponente de la moneda. ```text theme={"system"} Monto enviado = monto real × 10^exponente de la moneda ``` Ejemplo para moneda PEN: | Monto real | Código moneda | Valor enviado | | -: | - | -: | | 10.00 | `604` | `1000` | | 389.80 | `604` | `38980` | | 1,250.50 | `604` | `125050` | | 50,000.00 | `604` | `5000000` | ## Ejemplos incorrectos de monto | Valor enviado | Motivo | | - | - | | `389.80` | No debe enviarse con punto decimal. | | `1,250.50` | No debe enviarse con separador de miles ni punto decimal. | | `S/ 389.80` | No debe enviarse con símbolo de moneda. | | `38980.00` | No debe enviarse con decimales. | ## Ejemplos correctos de monto | Monto real | Valor correcto | | -: | -: | | 1.00 | `100` | | 10.50 | `1050` | | 389.80 | `38980` | | 1,250.50 | `125050` | ## Identificador de operación El campo `internal_operation_number` identifica la operación del comercio. Debe ser único por comercio y debe mantenerse para consultas, trazabilidad, soporte y conciliación. | Campo | Descripción | | - | - | | `internal_operation_number` | Referencia o número de orden generado por el comercio. | | `transaction.meta.internal_operation_number` | Referencia o número de operación enviado en tramas POS. | ## Reglas para `internal_operation_number` | Regla | Descripción | | - | - | | Unicidad | Debe ser único por comercio. | | Longitud | Debe cumplir la longitud definida en la guía del canal correspondiente. | | Trazabilidad | Debe poder relacionarse con la orden o venta del comercio. | | Reutilización | No debe reutilizarse para una nueva compra. | ## Idempotencia y duplicidad El campo `internal_operation_number` permite controlar la duplicidad de operaciones. No se recomienda reutilizar el mismo identificador de operación para más de una autorización, ya que puede generar rechazos por duplicidad o inconsistencias en la conciliación. | Escenario | Recomendación | | - | - | | Nueva compra | Generar un nuevo `internal_operation_number`. | | Reintento por timeout | Consultar primero el estado de la operación antes de enviar una nueva autorización. | | Error de validación | Corregir la trama y reenviar solo si la operación no fue procesada. | | Operación aprobada | No reenviar la misma operación. | | Operación rechazada | Permitir nuevo intento según la regla del comercio. | ## Datos sensibles Los datos sensibles de tarjeta deben enviarse cifrados antes de invocar el servicio de autorización. | Campo | Canal | Cifrado requerido | | - | - | - | | `card.pan` | Ecommerce | Sí | | `card.expiry_date` | Ecommerce | Sí | | `card.security_code` | Ecommerce | Sí | | `payment_method.card[].pan` | POS | Sí | | `payment_method.card[].expiry_date` | POS | Sí | | `payment_method.card[].card_sequence_number` | POS | Sí, cuando aplique | ## Información que no debe enviarse en campos libres No se debe enviar información sensible dentro de campos libres como `metadata` o `additional_fields`. | Tipo de información | Puede enviarse en metadata | | - | - | | Número de tarjeta | No | | CVV o código de seguridad | No | | Fecha de expiración | No | | PIN o PIN block | No | | Documento de identidad sensible | No | | Número de pedido | Sí | | Código de sucursal | Sí | | Canal de venta | Sí | | Identificador de carrito | Sí | | Código de vendedor | Sí | ## Uso recomendado de `metadata` El campo `metadata` permite enviar información adicional del comercio para fines de trazabilidad, reportería o conciliación. ```json theme={"system"} { "metadata": { "sucursal": "Sucursal 1", "canal": "web", "numero_pedido": "PED-123456", "codigo_vendedor": "VEN-001" } } ``` | Campo sugerido | Uso | | - | - | | `sucursal` | Identificar la tienda, agencia o punto de venta. | | `canal` | Identificar el canal de origen de la operación. | | `numero_pedido` | Relacionar la transacción con el pedido del comercio. | | `codigo_vendedor` | Identificar al vendedor o asesor asociado. | | `identificador_carrito` | Relacionar la operación con un carrito de compra. | ## Uso recomendado de `additional_fields` En POS, el objeto `transaction.meta.additional_fields` permite enviar información complementaria de la operación. ```json theme={"system"} { "transaction": { "currency": "604", "amount": "5000000", "meta": { "internal_operation_number": "123554", "additional_fields": { "sucursal": "Sucursal 1", "terminal_logical_id": "TERM-001" } } } } ``` ## Timeout y reintentos Si el comercio no recibe respuesta por timeout o error de comunicación, no debe asumir automáticamente que la operación fue rechazada. En estos casos, se recomienda consultar el estado de la operación antes de enviar una nueva autorización. | Caso | Acción recomendada | | - | - | | Timeout sin respuesta | Consultar estado antes de reintentar. | | Error HTTP | Validar si la operación fue registrada. | | Respuesta aprobada | No reenviar la misma operación. | | Respuesta rechazada | Permitir nuevo intento según regla del comercio. | | Sin registro de operación | Generar un nuevo intento según la política del comercio. | ## Flujo recomendado ante timeout ```mermaid theme={"system"} flowchart TD A[Comercio envía POST /authorize] --> B{Recibe respuesta} B -->|Sí| C[Procesa response] B -->|No / Timeout| D[Consultar estado de la operación] D --> E{Existe operación} E -->|Aprobada| F[No reenviar autorización] E -->|Rechazada| G[Permitir nuevo intento según regla del comercio] E -->|No existe| H[Enviar nuevo intento] ``` *** ## Campos recomendados para almacenamiento El comercio debe almacenar los identificadores de respuesta necesarios para consultas, reversos, soporte, conciliación y trazabilidad. | Campo | Uso recomendado | | - | - | | `tk_transaction_identifier` | Identificador único interno de la transacción. | | `authorization_identification_response` | Código de autorización de la operación. | | `retrieval_reference_code` | Trazabilidad, soporte y conciliación. | | `system_trace_audit` | Identificador STAN para seguimiento operativo. | | `brand_transaction_identifier` | Identificador asignado por la marca. | | `response_code` | Validación del resultado de la operación. | | `date_settlement` | Fecha estimada de liquidación. | | `internal_operation_number` | Relación con la orden del comercio. | *** ## Uso operativo de los identificadores | Identificador | Uso | | - | - | | `tk_transaction_identifier` | Consultas internas dentro de la plataforma. | | `brand_transaction_identifier` | Validaciones con la marca. | | `authorization_identification_response` | Confirmación de autorización aprobada. | | `retrieval_reference_code` | Conciliación, soporte y seguimiento operativo. | | `system_trace_audit` | Auditoría y rastreo transaccional. | | `date_settlement` | Estimación de liquidación. | *** ## Interpretación general del response Una autorización aprobada debe validar tanto la respuesta de la marca como el estado interno de la plataforma. | Campo | Valor esperado | Interpretación | | - | - | - | | `success` | `true` | La petición fue procesada por el servicio. | | `processor_response.message.code` | `00` | La marca respondió con aprobación. | | `processor_response.response_code` | `00` | Código ISO de aprobación. | | `meta.status.code` | `success_operation` | Estado interno exitoso. | ## Estados internos referenciales Los siguientes estados son referenciales y pueden variar según la configuración del servicio. | Estado | Descripción | | - | - | | `success_operation` | La operación fue procesada correctamente. | | `invalid_request` | La petición contiene campos inválidos o incompletos. | | `merchant_not_found` | El comercio no fue encontrado. | | `merchant_disabled` | El comercio no se encuentra habilitado para operar. | | `duplicated_operation` | La referencia de operación ya fue utilizada. | | `processor_error` | Ocurrió un error al procesar la operación con la marca o procesador. | | `timeout` | No se recibió respuesta dentro del tiempo esperado. | ## Errores comunes | Escenario | Causa probable | Acción recomendada | | - | - | - | | Monto incorrecto | El monto fue enviado con decimales o separadores | Enviar el monto sin punto decimal. Ejemplo: `389.80` debe enviarse como `38980`. | | Comercio no habilitado | El `merchant_identifier` no existe o no está activo | Validar el comercio en el proceso de onboarding. | | Marca inválida | Se envió un valor distinto a `visa` o `mscd` | Validar el valor del campo `brand`. | | Operación duplicada | El `internal_operation_number` ya fue utilizado | Generar una nueva referencia única por comercio o consultar la operación original. | | Datos de tarjeta inválidos | Los campos sensibles no fueron cifrados correctamente | Verificar el mecanismo de cifrado antes de enviar la autorización. | | Datos EMV incompletos | La operación POS chip/contactless no envió `icc_related_data` | Enviar los campos EMV obligatorios cuando aplique. | | Moneda inválida | Se envió una moneda no soportada o con formato incorrecto | Enviar el código ISO 4217 numérico. | | Terminal no reconocido | El `terminal_id` no existe o no está habilitado | Validar el registro del terminal. | ## Validaciones previas recomendadas Antes de enviar una autorización, se recomienda validar los siguientes puntos. | Validación | Ecommerce | POS | | - | - | - | | Comercio activo | Sí | Sí | | Marca válida | Sí | Sí | | Monto sin decimales | Sí | Sí | | Moneda en ISO 4217 numérico | Sí | Sí | | Identificador de operación único | Sí | Sí | | Datos sensibles cifrados | Sí | Sí | | Terminal habilitado | No aplica | Sí | | Modo de captura correcto | No aplica | Sí | | Datos EMV completos | No aplica | Sí, si es chip/contactless | | Datos 3DS válidos | Sí, si aplica | No aplica | ## Recomendaciones Ecommerce | Recomendación | Descripción | | - | - | | Enviar email del tarjetahabiente | Usar `card_holder.email_address` cuando esté disponible para trazabilidad y soporte. | | Enviar datos 3DS | Enviar `authentication.3d_secure` cuando la operación haya pasado por autenticación. | | Usar metadata | Registrar datos como sucursal, canal, número de pedido o identificador de carrito. | | Mantener referencia única | Alinear `internal_operation_number` con la orden del comercio. | | No enviar datos sensibles | No incluir PAN, CVV o datos cifrados dentro de `metadata`. | ## Recomendaciones POS | Recomendación | Descripción | | - | - | | Validar modo de captura | `pan_entry_mode` debe reflejar el método real de captura de la tarjeta. | | Enviar datos EMV | Para operaciones chip o contactless EMV, debe enviarse `icc_related_data`. | | Validar terminal | `terminal_id` debe corresponder a un terminal registrado y habilitado. | | Enviar PIN cuando aplique | Si la operación requiere PIN, debe enviarse `pin_block`. | | No mezclar contextos | No enviar datos EMV cuando la captura sea manual o banda magnética, salvo que aplique según configuración del terminal. | *** ## Reglas para POS según tipo de captura | Tipo de captura | `pan_entry_mode` | Requiere `icc_related_data` | Requiere `pin_block` | | - | - | - | - | | Manual | `01` | No | No, salvo regla del comercio o emisor | | Chip | `05` | Sí | Sí, si aplica | | Contactless EMV | `07` | Sí | Según reglas de monto, comercio o emisor | | Banda magnética | `90` | No | Sí, si aplica | ## Buenas prácticas de integración | Buena práctica | Descripción | | - | - | | Validar campos obligatorios | El comercio debe validar la trama antes de enviarla. | | No almacenar datos sensibles | No almacenar PAN, CVV, fecha de expiración ni PIN. | | Registrar request y response | Registrar información útil para soporte, excluyendo datos sensibles. | | Guardar identificadores | Almacenar los identificadores de trazabilidad devueltos en la respuesta. | | Manejar timeout | Implementar consulta posterior antes de reintentar una autorización. | | Evitar duplicidad | No duplicar autorizaciones ante errores de comunicación. | | Usar metadata correctamente | Enviar solo información operativa o comercial no sensible. | | Separar flujos | Diferenciar Ecommerce y POS según el valor de `frame_type`. | | Validar montos | Enviar montos sin decimales y con moneda correcta. | | Validar terminales | Para POS, confirmar que el terminal esté registrado y habilitado. | ## Checklist de integración Ecommerce | Ítem | Validación | | - | - | | `frame_type` | Debe ser `ecommerce`. | | `merchant_identifier` | Debe corresponder a un comercio activo. | | `brand` | Debe ser `visa` o `mscd`. | | `internal_operation_number` | Debe ser único por comercio. | | `amount` | Debe enviarse sin decimales. | | `currency` | Debe enviarse en formato ISO 4217 numérico. | | `card.pan` | Debe enviarse cifrado. | | `card.expiry_date` | Debe enviarse cifrado. | | `card.security_code` | Debe enviarse cifrado cuando aplique. | | `installments` | Debe enviarse solo si aplica pago en cuotas. | | `authentication.3d_secure` | Debe enviarse solo si la transacción cuenta con datos 3DS. | | `metadata` | No debe contener datos sensibles. | ## Checklist de integración POS | Ítem | Validación | | - | - | | `frame_type` | Debe ser `pos`. | | `merchant_identifier` | Debe corresponder a un comercio activo. | | `brand` | Debe ser `visa` o `mscd`. | | `payment_method.card[].pan` | Debe enviarse cifrado. | | `payment_method.card[].expiry_date` | Debe enviarse cifrado. | | `payment_method.terminal.terminal_id` | Debe corresponder a un terminal registrado. | | `context.pos.pan_entry_mode` | Debe reflejar el método real de captura. | | `context.pos.pin_entry_capability` | Debe reflejar la capacidad real del terminal. | | `transaction.amount` | Debe enviarse sin decimales. | | `transaction.currency` | Debe enviarse en formato ISO 4217 numérico. | | `transaction.meta.internal_operation_number` | Debe ser único por comercio. | | `icc_related_data` | Debe enviarse si la operación es chip o contactless EMV. | ## Recomendaciones para conciliación Para facilitar la conciliación, el comercio debe conservar la relación entre su orden interna y los identificadores devueltos por la plataforma. | Dato del comercio | Dato de la plataforma / marca | | - | - | | Número de pedido | `internal_operation_number` | | ID interno de transacción | `tk_transaction_identifier` | | Código de autorización | `authorization_identification_response` | | RRN | `retrieval_reference_code` | | STAN | `system_trace_audit` | | ID de marca | `brand_transaction_identifier` | | Fecha estimada de liquidación | `date_settlement` | ## Recomendaciones para soporte Cuando se reporte una incidencia, se recomienda incluir los siguientes datos. | Dato | Descripción | | - | - | | `merchant_identifier` | Identificador del comercio. | | `internal_operation_number` | Número de orden u operación del comercio. | | `tk_transaction_identifier` | Identificador interno de la transacción. | | `retrieval_reference_code` | RRN de la operación. | | `system_trace_audit` | STAN de la operación. | | `authorization_identification_response` | Código de autorización, si existe. | | `brand` | Marca de la tarjeta. | | `amount` | Monto enviado. | | `currency` | Moneda enviada. | | Fecha y hora | Momento aproximado de la transacción. | *** ## Relación con las guías de autorización Ver trama autorización Ecommerce. Ver trama de autorización     POS. Ver estructura de respuesta de autorización. # Consideraciones previas Source: https://docs.pay-me.com/consideraciones-previas Requisitos técnicos, operativos y de marca para iniciar el procesamiento transaccional con Alignet. ## Antes de iniciar La integración con los servicios de procesamiento de Alignet requiere una evaluación previa del modelo operativo, las marcas involucradas y las responsabilidades de cada participante. La habilitación del servicio no depende únicamente de la integración técnica. En determinados escenarios será necesario ejecutar actividades adicionales con las marcas, redes de pago o entidades participantes. Antes de iniciar el proyecto, la entidad deberá contactar a un representante comercial de Alignet para evaluar el alcance requerido, validar la disponibilidad del servicio y coordinar los siguientes pasos. Comunícate con nuestro equipo comercial para iniciar la evaluación del proyecto. ## Definición del modelo de participación Antes de iniciar el proyecto se debe definir el rol que tendrá cada participante dentro del flujo transaccional. Los modelos más frecuentes son: ### Entidad adquirente La entidad mantiene la relación con la marca, los comercios y la liquidación de las operaciones. Alignet puede participar como procesador tecnológico, encargado de recibir, validar, enrutar y gestionar las transacciones. ### Facilitador de pago El facilitador de pago envía las transacciones de sus comercios o subcomercios mediante una integración centralizada. En este modelo se deben definir, entre otros aspectos: * Identificación del facilitador. * Identificación de los comercios o subcomercios. * Reglas de afiliación. * Modelo de liquidación. * Responsabilidad sobre el monitoreo de los comercios. * Información requerida por cada marca. ### Alignet como procesador Alignet puede operar como procesador para las marcas y redes habilitadas en el proyecto. La disponibilidad puede variar según: * País de operación. * Marca o red solicitada. * Modelo de adquirencia. * Conexiones disponibles. * Certificaciones requeridas. * Alcance comercial contratado. La participación de Alignet como procesador no reemplaza las obligaciones regulatorias, contractuales o de marca correspondientes a la entidad adquirente o al facilitador de pago. ## Proyecto previo con las marcas Cuando la entidad requiera procesamiento adquirente, deberá coordinarse previamente un proyecto con la marca correspondiente. Este proyecto puede ser necesario para Visa, Mastercard, Diners Club, UnionPay u otras redes, dependiendo del alcance solicitado. Las actividades pueden incluir: La entidad debe registrar o solicitar el proyecto ante la marca o red correspondiente. Se identifican la entidad adquirente, el procesador, los facilitadores de pago y los demás participantes. Se confirman los identificadores requeridos para autorización, procesamiento, compensación y liquidación. Se habilitan los enlaces, estaciones, endpoints o mecanismos de comunicación requeridos. Se ejecutan las pruebas técnicas y transaccionales definidas por la marca. La marca y los participantes confirman la habilitación para operar en el ambiente productivo. ## Información requerida de la entidad Para evaluar la integración, la entidad deberá proporcionar como mínimo: ### Información general * Razón social (VAT) * País de operación. * Rol dentro del ecosistema. * Tipo de entidad: adquirente o facilitador de pago. * Marcas que desea procesar. * Canales de origen de las transacciones. * Volumen transaccional estimado. * Monedas requeridas. ### Información de adquirencia * BIN o identificador adquirente. * Identificador asignado por la marca. * Código de procesador, cuando corresponda. * Identificadores de comercios. * Categorías de comercio. * Modelo de liquidación. * Flujo de compensación y conciliación. * Configuración doméstica e internacional. ### Información técnica * Arquitectura de integración. * Dirección de los endpoints. * Direcciones IP de origen. * Mecanismos de seguridad. * Certificados digitales. * Ambientes requeridos. * Formato de mensajería. * Manejo de timeouts y reintentos. * Contactos técnicos y operativos. ## Certificaciones Según el canal y la marca, pueden ser necesarias certificaciones adicionales. Estas pueden incluir: * Certificación de autorización. * Certificación de compensación. * Certificación de terminales POS. * Certificación de comercio electrónico. * Certificación 3DS. * Certificación de tokenización. * Certificación de facilitadores de pago. * Certificación de mensajes ISO 8583 o API. * Pruebas de continuidad y contingencia. El tipo de certificación será determinado durante la etapa de evaluación del proyecto. ## Responsabilidades de la entidad La entidad será responsable de: * Contar con las autorizaciones necesarias para operar. * Gestionar su relación contractual con las marcas. * Mantener actualizados sus identificadores. * Enviar información transaccional correcta. * Cumplir las reglas de las marcas. * Gestionar adecuadamente a sus comercios o subcomercios. * Aplicar controles de fraude y riesgo. * Cumplir las obligaciones de seguridad y protección de datos. * Participar en las pruebas y certificaciones. * Validar los resultados antes del pase a producción. ## Responsabilidades de Alignet De acuerdo con el alcance contratado, Alignet podrá encargarse de: * Proporcionar los servicios API. * Recibir y validar las solicitudes. * Aplicar reglas de procesamiento. * Enrutar las transacciones. * Gestionar la comunicación con la red habilitada. * Retornar las respuestas transaccionales. * Proporcionar trazabilidad y monitoreo. * Participar en las pruebas de certificación. * Brindar soporte durante la integración. ## Seguridad La entidad deberá cumplir las políticas de seguridad definidas para el proyecto. Estas pueden comprender: * Uso obligatorio de HTTPS. * Autenticación mediante credenciales o certificados. * Restricción de direcciones IP. * Protección de información sensible. * Cumplimiento de PCI DSS, cuando corresponda. * Cifrado de información. * Gestión segura de llaves y secretos. * Control de acceso a los ambientes. * Registro y auditoría de las operaciones. ## Ambientes La integración puede considerar los siguientes ambientes: Ambiente inicial para validar la estructura de las solicitudes y respuestas. Ambiente utilizado para ejecutar los casos de prueba requeridos. Ambiente habilitado para el procesamiento de transacciones reales. Configuración alternativa cuando el modelo contratado lo contemple. ## Criterios para iniciar producción La habilitación productiva estará sujeta al cumplimiento de las siguientes condiciones: * Alcance aprobado. * Contratos formalizados. * Proyecto de marca completado, cuando corresponda. * Identificadores confirmados. * Conexiones habilitadas. * Certificación aprobada. * Pruebas integrales satisfactorias. * Configuración de seguridad validada. * Contactos de soporte definidos. * Plan de pase a producción aprobado. El envío de transacciones reales sin completar las validaciones previas puede ocasionar rechazos, problemas de conciliación o incumplimientos frente a las marcas. ## Inicio del proyecto Una vez revisadas estas consideraciones, la entidad deberá coordinar con Alignet la sesión de entendimiento y levantamiento de información. Durante esta etapa se definirá: * Alcance funcional. * Alcance técnico. * Marcas involucradas. * Responsabilidades. * Cronograma. * Certificaciones. * Dependencias. * Plan de implementación. # Consulta de Transacciones Source: https://docs.pay-me.com/consulta ## Flujo de Consulta Para consultar una transacción previamente procesada, la aplicación debe invocar la función `startSearch` del objeto `PaymeClient`. La consulta puede realizarse utilizando el número de operación del comercio y, opcionalmente, el identificador de transacción generado por Pay-me. ## Parámetros de Entrada | Parámetro | Tipo | Descripción | | :- | :- | :- | | `from` | Activity | Activity desde donde se realizará la invocación del SDK. | | `merchantOperationNumber` | String | Número de operación o pedido que se desea consultar. | | `transactionID` | String? | Identificador único de la transacción generado por Pay-me. Este parámetro es opcional. | | `delegate` | Activity | Activity encargada de implementar los métodos del delegado. | La consulta puede realizarse utilizando únicamente el número de operación `merchantOperationNumber`). El parámetro `transactionID` es opcional. ## Ejemplo de Invocación ```text theme={"system"} private fun invokeForConsult() { val operationNumber = this.binding.inputOperationNumber.text.toString() PaymeClient.startSearch( from = this, merchantOperationNumber = operationNumber, transactionID = null, delegate = this ) } ``` ## Recepción de la Respuesta Para recibir el resultado de la consulta, se debe implementar el método `onSearchResponse`. ```text theme={"system"} override fun onSearchResponse(response: PMSearchResponse) { val gson = GsonBuilder().setPrettyPrinting().create() val gsonResponse = gson.toJson(response) val intent = Intent(this, ResponseActivity::class.java).apply { putExtra("ACTION", this@RequestActivity.action) putExtra( "REQUEST_PAYME", "Número de pedido: ${binding.inputOperationNumber.text}" ) putExtra("RESPONSE_PAYME", gsonResponse) } startActivity(intent) finish() } ``` ## Respuesta de Consulta El resultado de la consulta será devuelto mediante el objeto `PMSearchResponse`. La información retornada en `PMSearchResponse` puede incluir una o varias transacciones asociadas al número de operación consultado. # Consulta operaciones Source: https://docs.pay-me.com/dashboard/consulta-operaciones Aprende a buscar, filtrar y analizar operaciones y transacciones en Dashboard Metrix. ### Consultar operaciones En Metrix, toda la información se organiza alrededor de **Operaciones**, lo que te permite entender el resultado real de cada pago sin duplicidad de intentos. Image ### Conceptos clave Agrupa uno o más intentos de pago de un mismo pedido. Intento individual de pago (tarjeta, Yape, transferencia, etc.). Estado final de la operación (éxito o no éxito). ### ⚡ ¿Qué significa esto en la práctica? No verás múltiples “ventas fallidas” separadas.\ Metrix agrupa todos los intentos en una sola operación. Un cliente intenta pagar: 1. Tarjeta → ❌ Rechazada 2. Otra tarjeta → ❌ Rechazada 3. Yape → ✅ Aprobado 👉 Resultado en Metrix: **1 sola operación exitosa** *** ### 🔎 ¿Cómo buscar operaciones? La búsqueda siempre requiere una **fecha inicial y final**. Puedes usar combinaciones como: * Comercio * Canal (POS / E-commerce) * Método de pago * Estado * BIN o últimos dígitos (PAN enmascarado) Obtendrás resultados agrupados por operación. *** ### ¿Qué verás en los resultados? * ID de operación * Número de pedido * Fecha * Canal * Método de pago * Marca / procesadora * Estado *** ### Ver transacciones dentro de una operación Haz clic sobre una fila en la tabla. Cada transacción muestra: * Método de pago * Estado * Fecha y hora Identifica reintentos, rechazos o cambios de método. Image *** ### Detalle de transacción Al hacer clic en una transacción se abre un panel lateral con: Ciclo de vida (timeline) Información general Método de pago (enmascarado) Autenticación (3DS) Logs del procesamiento Datos técnicos (API / SDK) *** ### Vista rápida Accede a **Operaciones → Últimas 100 Transacciones** para monitoreo en tiempo real. ### 💡 Recomendaciones Usa rangos de 1 día y luego amplía. Menos filtros = búsquedas más rápidas. Revisa operaciones con múltiples transacciones. *** # Devoluciones Source: https://docs.pay-me.com/dashboard/devoluciones Aprende a devolver pagos ya procesados desde Dashboard Metrix. Una devolución permite **reembolsar una transacción que ya fue procesada**, normalmente después de haber sido liquidada. *** ### ¿Cuándo usar una devolución? El cliente solicita reembolso después de la compra Producto o servicio no entregado Error detectado posterior a la liquidación *** ### Diferencia con extorno Se realiza antes de la liquidación. Revierte la autorización. Se realiza después del procesamiento. Devuelve el dinero al cliente. *** ### ¿Cómo realizar una devolución? Ingresa a **Consultar operaciones** y ubica la transacción. Selecciona la transacción correspondiente. Haz clic en la opción **Devolver**. Define el monto a devolver (incluye decimales. Ejemplo: "20.50"): * Total * Parcial Valida la información y confirma la devolución. ### **Proceso Grafico:** Busca el botón de solicitud de "Devolución" en el detalle de la operación. Image Registra el monto a devolver, la razón y descripción, Image Una vez confirmado, tu **solicitud de devolución será enviada a proceso,** Considera que las solicitudes de devolución tienen un plazo de procesamiento no mayor entre 2 a 10 Dias, debido a reglas del emisor (banco). Una vez confirmada tu devolución. por el procesador se te enviara un correo de confirmació1n Image ### Resultado esperado Se registra una nueva transacción de devolución asociada. Puede fallar por reglas del procesador o configuración. *** ### Consideraciones importantes La devolución genera una nueva transacción Puede ser total o parcial Depende de reglas del banco, marca o procesador El tiempo de abono al cliente no es inmediato *** ### Tiempos de devolución El tiempo depende del banco emisor y la marca: * Puede tardar desde horas hasta varios días * No depende directamente de Metrix * Se refleja en el estado de cuenta del cliente *** ### Recomendaciones Asegúrate que la transacción sea elegible para devolución. Verifica si corresponde devolución total o parcial. Indica que el abono puede tardar algunos días. *** # Estados de transacción Source: https://docs.pay-me.com/dashboard/estados-de-transaccion Entiende el ciclo de vida de una transacción y cómo interpretar cada estado en Metrix. Los estados indican la **situación actual de una transacción** dentro del proceso de pago. Permiten identificar si un pago fue exitoso, rechazado o si aún está en proceso. *** ### Estados principales La transacción fue creada pero aún no tiene resultado final. Común en pagos que requieren confirmación (QR, transferencias). La transacción fue aprobada por la marca o banco emisor. Los fondos han sido reservados. La transacción fue incluida en el proceso de liquidación. No implica que el dinero ya fue abonado. La transacción fue revertida después de haber sido autorizada. El banco o procesador rechazó la transacción. Ocurrió un error técnico o la transacción no cumple validaciones. La operación fue cancelada antes de completarse. El cliente no completó el pago dentro del tiempo permitido. *** ### Cómo interpretar los estados * Autorizado * Liquidado * Extornado * Denegado * Inválido * Cancelado * Expirado *** ### Detalle importante: Liquidado Una transacción en estado **Liquidado** indica que: * Fue aprobada previamente * Fue enviada al proceso de liquidación * Será considerada en conciliación ⚠️ Este estado no confirma que el dinero ya fue depositado en la cuenta del comercio. *** ## Consideraciones importantes No todas las transacciones pasan por todos los estados Una transacción autorizada puede ser extornada posteriormente Los estados pueden variar según el método de pago Pagos asíncronos pueden permanecer en estado pendiente por más tiempo *** # Extornos Source: https://docs.pay-me.com/dashboard/extornos Aprende a revertir transacciones desde Dashboard Metrix. Un extorno permite **revertir una transacción autorizada**, evitando que el cargo se concrete o continúe su proceso. *** ### ¿Cuándo usar un extorno? Error en el monto o en la operación Cancelación de la compra por parte del cliente Transacción duplicada *** ### Consideraciones previas Solo se pueden extornar transacciones que hayan sido **autorizadas**. El extorno debe realizarse dentro del mismo día o según configuración del procesador Una transacción extornada no puede volver a procesarse *** ### ¿Cómo realizar un extorno? Ingresa a **Consultar operaciones** y ubica la transacción que deseas revertir. Haz clic sobre la operación y luego en la transacción correspondiente. Selecciona la opción **Extornar** dentro del detalle. Valida la información y confirma la operación. ### **Proceso grafico:** Busca el botón de "**Extorno"** en el detalle de la operación. Image Confirma el extorno. Image Espera lel resultado de la ejecución de extorno, el mismo que aparece en la parte superior de la pantalla. Image ### Resultado esperado La transacción cambia a estado **Extornado**. Puede fallar si la transacción ya fue liquidada o no cumple condiciones. *** ### Restricciones No se puede extornar una transacción ya liquidada No aplica para todos los métodos de pago Depende de reglas del procesador y la marca *** ### Recomendaciones Realiza el extorno lo antes posible. Asegúrate que esté en autorizado. Revisa si ya existe un extorno previo. *** # Dashboard Source: https://docs.pay-me.com/dashboard/introduccion Consulta, analiza y gestiona tus transacciones en tiempo real con Dashboard Metrix. Image Dashboard Metrix es la plataforma de **consulta y monitoreo transaccional** que te permite visualizar, analizar y gestionar operaciones de pago en tiempo real. *** Consulta operaciones y transacciones en un solo lugar Analiza KPIs y tendencias en tiempo real Exporta reportes en CSV y XLS Gestiona extornos y devoluciones desde la plataforma *** ### ¿Qué puedes hacer? Localiza transacciones usando filtros avanzados como fecha, comercio, estado o método de pago. Visualiza resultados agrupados por operación para mayor claridad. Accede a KPIs, tendencias y comportamiento transaccional en tiempo real. Ideal para monitoreo operativo y toma de decisiones. Descarga reportes en formato CSV o XLS para conciliación, auditoría o análisis externo. Ejecuta extornos o devoluciones directamente desde el detalle de la operación. *** ### Conceptos clave **Operación:** Agrupa uno o más intentos de pago de un mismo pedido **Transacción:** Intento individual de pago con un método específico **Estado:** Etapa en la que se encuentra la transacción (Pendiente, Autorizado, etc.) *** ### ¿Cómo se organiza la información? Metrix trabaja con una estructura pensada para simplificar el análisis: * **Operación → nivel negocio (pedido)** * **Transacciones → nivel técnico (intentos)** Esto permite: Evitar duplicidad de registros Tener trazabilidad completa del pago Mejorar conciliación y análisis *** Image ### Acceso a la plataforma Ingresa mediante la URL proporcionada durante la integración. Accede con usuario y contraseña (HTTPS). Puedes recuperar tu contraseña desde la pantalla de login. *** ### Roles disponibles **Administrador:** acceso completo (consulta, exportación, extornos) **Visor:** acceso solo lectura (consulta y reportes) # Recuperación de contraseña Source: https://docs.pay-me.com/dashboard/recuperacion-de-contrasena Recupera el acceso a tu cuenta de Dashboard Metrix de forma segura. Si no puedes acceder a tu cuenta, puedes restablecer tu contraseña desde la pantalla de inicio de sesión. *** ### ¿Cuándo usar esta opción? Olvidaste tu contraseña Tu contraseña dejó de funcionar Necesitas generar una nueva contraseña por seguridad *** ### ¿Cómo recuperar tu contraseña? Ingresa a la URL de Dashboard Metrix. Haz clic en la opción disponible en el formulario de acceso. Introduce el correo electrónico registrado en la plataforma. Recibirás un correo con instrucciones para restablecer tu contraseña. Accede al enlace recibido y define una nueva contraseña. *** ### Correo de recuperación Si no encuentras el correo: * Revisa la carpeta de spam o correo no deseado * Verifica que ingresaste correctamente tu correo *** ### Recomendaciones de seguridad Usa combinaciones de letras, números y símbolos. No compartas tus credenciales con terceros. Cambia tu contraseña regularmente. *** ### Consideraciones El enlace de recuperación puede tener un tiempo de expiración Si no tienes acceso al correo registrado, contacta a soporte *** ## Soporte Si no puedes recuperar tu acceso: 👉 [soporte@pay-me.com](mailto:soporte@pay-me.com) # Reporte y exportación Source: https://docs.pay-me.com/dashboard/reporte-y-exportacion Exporta y analiza tus transacciones desde Dashboard Metrix en formatos CSV y XLS. Metrix permite exportar información de transacciones para **conciliación, análisis y auditoría**. *** ### ¿Qué puedes hacer? Descarga transacciones en formato CSV o XLS. Utiliza los archivos en Excel o herramientas externas. Cruza información con tus sistemas internos. *** ### ¿Cómo generar un reporte? Realiza una búsqueda desde **Consultar operaciones** usando los filtros necesarios. Haz clic en la opción de descarga disponible en la pantalla de resultados. El archivo se generará en formato CSV o XLS según la opción elegida. *** ### Formatos disponibles Formato ligero y compatible con múltiples herramientas. Recomendado para grandes volúmenes de datos. Formato Excel listo para análisis manual. Recomendado para revisión operativa. *** ### Información incluida Los reportes pueden incluir: | Campo | Descripción | | - | - | | Fecha | Fecha de la transacción | | ID Operación | Identificador de la operación | | ID Transacción | Identificador del intento | | Método de pago | Tarjeta, Yape, etc. | | Estado | Resultado de la transacción | | Monto | Importe procesado | | Moneda | Tipo de moneda | | Canal | POS / E-commerce | *** ### Consideraciones El reporte incluye solo la información filtrada en la búsqueda Archivos grandes pueden tardar algunos segundos en generarse Para grandes volúmenes, se recomienda usar CSV La información exportada refleja el estado al momento de la descarga *** ### Buenas prácticas Reduce el volumen de datos antes de exportar. Para análisis masivo o integraciones. Asegúrate de interpretar correctamente los estados. *** # Dependencias Source: https://docs.pay-me.com/dependencias El SDK **PaymePOS v1.0.0** requiere la instalación de determinadas dependencias y la habilitación de **ViewBinding** para su correcto funcionamiento. ## Plugins Requeridos Agregue los siguientes plugins en el archivo de configuración de su proyecto Android: ```text theme={"system"} plugins { id 'kotlin-android' id 'kotlin-parcelize' } ``` ## Habilitar ViewBinding El SDK requiere que la característica **ViewBinding** se encuentre habilitada. ```text theme={"system"} android { buildFeatures { viewBinding = true } } ``` ## Dependencias Requeridas Agregue las siguientes dependencias en el módulo donde será integrado el SDK: ```text theme={"system"} dependencies { implementation("androidx.core:core-ktx:1.6.0") implementation("androidx.appcompat:appcompat:1.7.0") implementation("org.jetbrains.kotlin:kotlin-stdlib:1.9.0") implementation("androidx.constraintlayout:constraintlayout:2.1.4") implementation("com.squareup.retrofit2:retrofit:2.3.0") implementation("com.squareup.retrofit2:converter-gson:2.3.0") implementation("com.squareup.retrofit2:converter-scalars:2.5.0") implementation("com.squareup.okhttp3:logging-interceptor:3.10.0") implementation("com.squareup.okhttp3:okhttp:3.10.0") implementation("com.google.code.gson:gson:2.8.8") implementation project(':PaymePOS') implementation project(':Wiseasy') implementation project(':MasterCardSonic') implementation project(':VisaSensoryBranding') } ``` Utilice las versiones indicadas en esta documentación. El uso de versiones diferentes podría generar incompatibilidades durante la compilación o ejecución del SDK. *** # Inicializar el SDK Antes de utilizar cualquier funcionalidad del SDK, es necesario realizar una inicialización para obtener la configuración del dispositivo POS y del comercio asociado. La inicialización debe ejecutarse al iniciar la aplicación y antes de invocar cualquier otra funcionalidad del SDK. ## Requisitos Previos \ Para que la inicialización sea exitosa, el dispositivo POS debe encontrarse previamente registrado y configurado en Pay-me. \ ## Inicialización Para inicializar el SDK, invoque la función `initializeSDK` del objeto `PaymeClient`. ### Parámetros | Parámetro | Tipo | Descripción | | :- | :- | :- | | `context` | Context | Contexto de la aplicación o actividad actual. | | `environment` | PaymeEnvironment | Ambiente donde se realizará la inicialización. | | `listener` | PaymeInitializationListener | Callback que permite recibir el resultado de la inicialización. | ### Ejemplo ```text theme={"system"} PaymeClient.initializeSDK( this, environment = PaymeEnvironment.PRODUCTION, listener = object : PaymeInitializationListener { override fun onInitSuccess() { Toast.makeText( this@MainActivity, "PaymePOS se inició correctamente", Toast.LENGTH_LONG ).show() } override fun onInitFail( errorCode: String, errorMessage: String ) { Toast.makeText( this@MainActivity, "PaymePOS falló al iniciar - $errorMessage", Toast.LENGTH_LONG ).show() } } ) ``` ## Resultado de la Inicialización El resultado de la inicialización es informado mediante la interfaz `PaymeInitializationListener`. ### onInitSuccess Se ejecuta cuando la inicialización finaliza correctamente. | Parámetro | Tipo | Descripción | | :- | :- | :- | | N/A | N/A | No retorna parámetros. | ### onInitFail Se ejecuta cuando ocurre un error durante la inicialización. | Parámetro | Tipo | Descripción | | :- | :- | :- | | `errorCode` | String | Código del error producido. | | `errorMessage` | String | Descripción del error producido. | Se recomienda esperar la ejecución de `onInitSuccess()` antes de permitir al usuario realizar operaciones de consulta, pago, extorno o impresión mediante el SDK. # Códigos de Respuesta - Devoluciones Source: https://docs.pay-me.com/devoluciones/codigos-de-respuesta Códigos válidos del objeto meta para las APIs del módulo de Devoluciones. Los códigos de respuesta válidos en el objeto `meta` para todos los APIs de **Devolución** son los siguientes: | Código | Descripción | | :- | :- | | `00` | Se procesó correctamente la petición | | `01` | Algunas operaciones fueron rechazadas | | `03` | Ocurrió un error | | `05` | No se encontró el pedido | | `06` | Algunos datos no fueron enviados correctamente | *** ## Cómo interpretarlos Usa `00` cuando la petición fue procesada correctamente a nivel del flujo. Usa `01` cuando el request fue aceptado, pero una o más operaciones fueron rechazadas dentro del lote. Usa `05` y `06` para errores de negocio o datos incompletos que deben corregirse antes de reintentar. Usa `03` para fallas no controladas o errores de procesamiento del flujo. *** ## Consejos de integración Aunque `meta.status.code` resume el resultado del request, también debes revisar `operations[].state` y `operations[].refund_reason` para conocer el resultado real de cada devolución. Que una devolución quede en `REGISTERED` no significa que ya terminó. Usa las APIs de consulta para seguir su avance hasta `RESOLVED` o `REJECTED`. Cuando recibas `01`, procesa el detalle por operación. No asumas que todo el batch falló ni que todo el batch fue aceptado. Guarda `refund_id`, `merchant_operation_number` y `transaction_id` para conciliación, soporte y reprocesos. Antes de solicitar una devolución, confirma que la transacción original esté en `LIQUIDADO` y que el monto cumpla con tus reglas internas para devoluciones totales o parciales. *** ## Recomendación operativa Para integraciones backend, lo más seguro es tratar `POST /refund` como una solicitud inicial y luego confirmar el estado definitivo con la consulta unitaria o masiva cuando tu flujo necesite conciliación o seguimiento. # API de Consulta Masiva de Devolución Source: https://docs.pay-me.com/devoluciones/consulta-masiva Consulta una o más solicitudes de devolución mediante filtros. El **API de Consulta Masiva de Devolución** permite consultar mediante filtros una o más solicitudes de devolución generadas anteriormente por el **API de Devoluciones**. [https://api.preprod.alignet.io/refund](https://api.preprod.alignet.io/refund) [https://api.alignet.io/refund](https://api.alignet.io/refund) Esta consulta trabaja por filtros. `date_start` y `date_end` son obligatorios, mientras que el resto de parámetros ayudan a acotar la búsqueda para conciliación y seguimiento operativo. *** ## Request ### Query Params | Campo | Descripción | Ejemplo | Tipo | Obligatorio | | :- | :- | :- | :- | :- | | `date_start` | Fecha de cuando se realizó el refund | `2025-05-26` | String | SI | | `date_end` | Fecha final de cuando se realizó el refund | `2025-05-26` | String | SI | | `merchant_code` | Código único del comercio | `41bb301e-3c37-4332-accb-ed5ec19081e4` | String | NO | | `merchant_operation_number` | Número de operación de un pedido | `239766` | String | NO | | `transaction_id` | UUID único de una transacción | `bko66gpi8czns4tcde93q96vd` | String | NO | | `refund_state` | Estado del refund | `REGISTERED`, `IN_PROCESS`, `RESOLVED`, `REJECTED` | String | NO | ### Headers | Campo | Descripción | Valor | Tipo | Obligatorio | | :- | :- | :- | :- | :- | | `Authorization` | Token de identificación para uso del API creado previamente en API de Seguridad | `Bearer ` | String | SI | | `ALG-API-VERSION` | Versión del API a usar | `1709847567` | String | SI | | `payment-facilitator-code` | Identificador del PF, obligatorio para Payment Facilitator | Cadena alfanumérica | String | NO | *** ## Response | Campo | Descripción | Ejemplo | Tipo | Obligatorio | | :- | :- | :- | :- | :- | | `success` | Indica si el proceso se realizó correctamente | `true`, `false` | String | SI | | `merchant_code` | Identificador del comercio | `41bb301e-3c37-4332-accb-ed5ec19081e4` | String | SI | | `operations_count` | Cantidad de operaciones encontradas | `1` | String | SI | | `operations` | Array que contiene objetos de transacciones a devolver | Array | Array | SI | | `operations[].refund_id` | UUID único de la devolución | UUID | String | SI | | `operations[].state` | Estado de la solicitud | `REGISTERED`, `IN_PROCESS`, `RESOLVED`, `REJECTED` | String | SI | | `operations[].refund_reason` | Motivo o detalle asociado al estado | `Solicitud recibida y validada` | String | SI | | `operations[].merchant_operation_number` | Número de pedido de la operación | `239766` | String | SI | | `operations[].type` | Tipo de devolución | `TOTAL`, `PARTIAL` | String | SI | | `operations[].transaction_id` | Código alfanumérico de la transacción | `bko66gpi8czns4tcde93q96vd` | String | SI | | `operations[].refund_amount` | Monto a devolver en centavos | `1050` | String | SI | | `operations[].transaction_amount` | Monto original de la transacción en centavos | `1050` | String | SI | | `operations[].currency` | Código ISO 4217 de la moneda de la transacción | `604` | String | SI | | `operations[].additional_fields` | Diccionario para enviar campos y valores personalizados como `key:value` | Dictionary | Dictionary | NO | | `operations[].payment_method` | Objeto relacionado al medio y procesador de pago | Object | Object | SI | | `operations[].payment_method.name` | Nombre del método de pago | `CARD`, `YAPE`, `CUOTEALO` | String | SI | | `operations[].payment_method.brand` | Marca de la tarjeta | `VISA`, `MSCD`, `AMEX`, `DINC` | String | SI | | `operations[].payment_method.masked_pan` | Tarjeta enmascarada | `447411******2240` | String | SI | | `operations[].lifecycle` | Array que contiene listado de los estados por los que pasó la devolución | Array | Array | SI | | `operations[].lifecycle[].state` | Estado de la devolución | `REGISTERED`, `IN_PROCESS`, `RESOLVED`, `REJECTED` | String | SI | | `operations[].lifecycle[].date` | Objeto que contiene la fecha en la que se realizó el cambio de estado | Object | Object | SI | | `operations[].lifecycle[].date.utc_time` | Fecha en UTC | `2025-05-26T06:06:45` | String | SI | | `operations[].lifecycle[].date.unix_time` | Fecha en unix time | `1748239605` | Integer | SI | | `meta` | Objeto que contiene metadatos del flujo ejecutado | Object | Object | SI | | `meta.status` | Objeto que contiene el resultado del flujo ejecutado | Object | Object | SI | | `meta.status.code` | Código que representa el resultado del flujo ejecutado | `00` | String | SI | | `meta.status.message_ilgn` | Objeto que contiene el mensaje resultante del flujo | Object | Object | SI | | `meta.status.message_ilgn[].locale` | Localidad a nivel de lenguaje para el mensaje del flujo ejecutado | `es_PE` | String | SI | | `meta.status.message_ilgn[].value` | Mensaje resultante del flujo ejecutado | `Se procesó correctamente la petición` | String | SI | ### Ejemplo (JSON) ```json theme={"system"} { "success": "true", "merchant_code": "41bb301e-3c37-4332-accb-ed5ec19081e4", "operations_count": "1", "operations": [ { "refund_id": "922178aa-ce4c-4c5f-8190-82fa7e009425", "state": "REGISTERED", "refund_reason": "Solicitud recibida y validada", "type": "TOTAL", "merchant_operation_number": "239766", "transaction_id": "bko66gpi8czns4tcde93q96vd", "refund_amount": "1050", "transaction_amount": "1050", "currency": "604", "payment_method": { "name": "CARD", "brand": "VISA", "masked_pan": "447411******2240" }, "additional_fields": { "canal": "WEB", "reason": "cliente no reconoció el consumo", "description": "solicitud por desconocimiento" }, "lifecycle": [ { "state": "REGISTERED", "date": { "utc_time": "2025-05-26T06:06:45", "unix_time": 1748239605 } } ] } ], "meta": { "status": { "code": "00", "message_ilgn": [ { "locale": "es_PE", "value": "Se procesó correctamente la petición" } ] } } } ``` *** ## Siguiente paso Usa la consulta unitaria cuando ya conozcas el `merchant_operation_number` exacto. Revisa cómo interpretar `meta.status.code` para todas las APIs del módulo. # API de Consulta Unitaria de Devolución Source: https://docs.pay-me.com/devoluciones/consulta-unitaria Consulta una devolución generada previamente por el API de Devoluciones. El **API de Consulta Unitaria de Devolución** permite consultar una devolución generada anteriormente por el **API de Devoluciones**. [https://api.preprod.alignet.io/refund/\{merchant\_code}/\{merchant\_operation\_number}](https://api.preprod.alignet.io/refund/\{merchant_code}/\{merchant_operation_number}) [https://api.alignet.io/refund/\{merchant\_code}/\{merchant\_operation\_number}](https://api.alignet.io/refund/\{merchant_code}/\{merchant_operation_number}) Esta consulta devuelve el detalle de las devoluciones asociadas a una operación del comercio. El resultado incluye `operations_count`, el listado encontrado y el `lifecycle` de cada devolución. *** ## Request ### Path | Campo | Descripción | Tipo | | :- | :- | :- | | `merchant_code` | Identificador del comercio | String | | `merchant_operation_number` | Número de operación | String | ### Headers | Campo | Descripción | Valor | Tipo | Obligatorio | | :- | :- | :- | :- | :- | | `Authorization` | Token de identificación para uso del API creado previamente en API de Seguridad | `Bearer ` | String | SI | | `ALG-API-VERSION` | Versión del API a usar | `1709847567` | String | SI | | `payment-facilitator-code` | Identificador del PF, obligatorio para Payment Facilitator | Cadena alfanumérica | String | NO | *** ## Response | Campo | Descripción | Ejemplo | Tipo | Obligatorio | | :- | :- | :- | :- | :- | | `success` | Indica si el proceso se realizó correctamente | `true`, `false` | String | SI | | `merchant_code` | Identificador del comercio | `41bb301e-3c37-4332-accb-ed5ec19081e4` | String | SI | | `operations_count` | Cantidad de operaciones encontradas | `1` | String | SI | | `operations` | Array que contiene objetos de transacciones a devolver | Array | Array | SI | | `operations[].refund_id` | UUID único de la devolución | UUID | String | SI | | `operations[].state` | Estado de la solicitud | `REGISTERED`, `IN_PROCESS`, `RESOLVED`, `REJECTED` | String | SI | | `operations[].refund_reason` | Motivo o detalle asociado al estado | `Solicitud recibida y validada` | String | SI | | `operations[].merchant_operation_number` | Número de pedido de la operación | `239766` | String | SI | | `operations[].type` | Tipo de devolución | `TOTAL`, `PARTIAL` | String | SI | | `operations[].transaction_id` | Código alfanumérico de la transacción | `bko66gpi8czns4tcde93q96vd` | String | SI | | `operations[].refund_amount` | Monto a devolver en centavos | `1050` | String | SI | | `operations[].transaction_amount` | Monto original de la transacción en centavos | `1050` | String | SI | | `operations[].currency` | Código ISO 4217 de la moneda de la transacción | `604` | String | SI | | `operations[].additional_fields` | Diccionario para enviar campos y valores personalizados como `key:value` | Dictionary | Dictionary | NO | | `operations[].payment_method` | Objeto relacionado al medio y procesador de pago | Object | Object | SI | | `operations[].payment_method.name` | Nombre del método de pago | `CARD`, `YAPE`, `CUOTEALO` | String | SI | | `operations[].payment_method.brand` | Marca de la tarjeta | `VISA`, `MSCD`, `AMEX`, `DINC` | String | SI | | `operations[].payment_method.masked_pan` | Tarjeta enmascarada | `447411******2240` | String | SI | | `operations[].lifecycle` | Array que contiene listado de los estados por los que pasó la devolución | Array | Array | SI | | `operations[].lifecycle[].state` | Estado de la devolución | `REGISTERED`, `IN_PROCESS`, `RESOLVED`, `REJECTED` | String | SI | | `operations[].lifecycle[].date` | Objeto que contiene la fecha en la que se realizó el cambio de estado | Object | Object | SI | | `operations[].lifecycle[].date.utc_time` | Fecha en UTC | `2025-05-26T06:06:45` | String | SI | | `operations[].lifecycle[].date.unix_time` | Fecha en unix time | `1748239605` | Integer | SI | | `meta` | Objeto que contiene metadatos del flujo ejecutado | Object | Object | SI | | `meta.status` | Objeto que contiene el resultado del flujo ejecutado | Object | Object | SI | | `meta.status.code` | Código que representa el resultado del flujo ejecutado | `00` | String | SI | | `meta.status.message_ilgn` | Objeto que contiene el mensaje resultante del flujo | Object | Object | SI | | `meta.status.message_ilgn[].locale` | Localidad a nivel de lenguaje para el mensaje del flujo ejecutado | `es_PE` | String | SI | | `meta.status.message_ilgn[].value` | Mensaje resultante del flujo ejecutado | `Se procesó correctamente la petición` | String | SI | ### Ejemplo (JSON) ```json theme={"system"} { "success": "true", "merchant_code": "41bb301e-3c37-4332-accb-ed5ec19081e4", "operations_count": "1", "operations": [ { "refund_id": "922178aa-ce4c-4c5f-8190-82fa7e009425", "state": "REGISTERED", "refund_reason": "Solicitud recibida y validada", "type": "TOTAL", "merchant_operation_number": "239766", "transaction_id": "bko66gpi8czns4tcde93q96vd", "refund_amount": "1050", "transaction_amount": "1050", "currency": "604", "payment_method": { "name": "CARD", "brand": "VISA", "masked_pan": "447411******2240" }, "additional_fields": { "canal": "WEB", "reason": "cliente no reconoció el consumo", "description": "solicitud por desconocimiento" }, "lifecycle": [ { "state": "REGISTERED", "date": { "utc_time": "2025-05-26T06:06:45", "unix_time": 1748239605 } } ] } ], "meta": { "status": { "code": "00", "message_ilgn": [ { "locale": "es_PE", "value": "Se procesó correctamente la petición" } ] } } } ``` *** ## Siguiente paso Usa el `POST /refund` para registrar nuevas solicitudes de devolución. Vuelve al overview del módulo para revisar el resto de APIs del flujo. # Ecommerce Source: https://docs.pay-me.com/ecommerce-post-authorize Autorización de transacciones Ecommerce mediante el endpoint POST /authorize. El servicio de autorización Ecommerce permite procesar pagos de comercio electrónico mediante el endpoint `POST /authorize`. Image Esta trama debe utilizarse cuando la transacción proviene de un canal no presencial, como checkout web, mobile checkout, link de pago o integración server-to-server. Los identificadores de adquirencia y los parámetros asignados por las marcas no deben enviarse dentro de la trama de autorización. Estos datos se configuran previamente durante el proceso de onboarding y registro de la entidad adquirente, en el cual se registran la llave de integración y los identificadores correspondientes, como `BID`, `PCR`, `ICA`, `BIN` y otros parámetros requeridos por cada marca. La plataforma utilizará esta configuración para identificar a la entidad y enrutar correctamente las transacciones. ## Endpoint ```http theme={"system"} POST /authorize ``` ## Request ```json theme={"system"} { "frame_type": "ecommerce", "merchant_identifier": "b656d278-f047-4e23-9fa5-96c5818b5c8d", "brand": "visa", "internal_operation_number": "ORDER-0000000079", "amount": "38980", "currency": "604", "card": { "pan": "Cifrado", "expiry_date": "cifrado", "security_code": "cifrado" }, "card_holder": { "first_name": "Fabricio", "last_name": "Iman", "email_address": "fabricio.iman@pay-me.com", "line_1": "Rupertuups" }, "installments": { "number_of_installments": "04", "id_plan": "145", "grace_period": "02" }, "authentication": { "3d_secure": { "payment_implementation_mode_indicator": "08", "cavv": "kANvskBe2eEnngBkKwx45YQBV7E=", "version": "2.1.0" } }, "metadata": { "sucursal": "Sucursal 1" } } ``` *** ## Descripción de campos | Campo | Tipo | Obligatorio | Longitud | Descripción | | - | - | - | - | - | | `frame_type` | string | Sí | enum | Canal de la transacción. Para Ecommerce debe enviarse `ecommerce`. | | `merchant_identifier` | string UUID | Sí | 36 | Identificador único del comercio. Se entrega al registrar el comercio durante el onboarding. | | `brand` | string | Sí | enum | Marca de la tarjeta. Valores permitidos: `visa`, `mscd`. | | `internal_operation_number` | string | Sí | 1-40 | Referencia o número de orden del comercio. Debe ser único por comercio. | | `amount` | string | Sí | 6-17 | Monto de la operación sin decimales. Ejemplo: `389.80 PEN = "38980"`. | | `currency` | string | Sí | 3 | Código ISO 4217 numérico. Ejemplo: `604` = PEN, `840` = USD. | | `card.pan` | string | Sí | 13-19 | Número de tarjeta cifrado. | | `card.expiry_date` | string | Sí | 4 | Fecha de expiración cifrada. | | `card.security_code` | string | No | 3-4 | Código de seguridad cifrado. | | `card_holder.first_name` | string | No | 1-26 | Nombre del tarjetahabiente. Puede ser utilizado para validaciones AVS. | | `card_holder.last_name` | string | No | 1-26 | Apellido del tarjetahabiente. Puede ser utilizado para validaciones AVS. | | `card_holder.email_address` | string | No | email | Correo electrónico del tarjetahabiente. | | `card_holder.line_1` | string | No | 1-40 | Dirección del tarjetahabiente. Puede ser utilizada para validaciones AVS. | | `installments.number_of_installments` | string | No | 1-4 | Número de cuotas. Debe enviarse solo con dígitos. Ejemplo: `04`. | | `installments.id_plan` | string | No | 1+ | Identificador del plan de cuotas configurado por el adquirente. | | `installments.grace_period` | string | No | 2 | Periodo de gracia expresado en meses. Ejemplo: `02`. | | `authentication.3d_secure.payment_implementation_mode_indicator` | string | No | enum | Indicador de implementación 3DS. | | `authentication.3d_secure.cavv` | string | No | 1-40 | Valor CAVV obtenido como resultado de la autenticación 3DS. | | `authentication.3d_secure.version` | string | No | 5-8 | Versión del protocolo 3DS. Ejemplo: `2.1.0`. | | `metadata` | object | No | — | Campos libres enviados por el comercio en formato key-value. Se almacenan con la transacción. | ## Valores permitidos ### `frame_type` | Valor | Descripción | | - | - | | `ecommerce` | Transacción de comercio electrónico. | ### `brand` | Valor | Descripción | | - | - | | `visa` | Transacción con tarjeta Visa. | | `mscd` | Transacción con tarjeta Mastercard. | ### `authentication.3d_secure.payment_implementation_mode_indicator` | Valor | Descripción | | - | - | | `05` | Transacción 3DS con CAVV. | | `06` | Attempt Mastercard. | | `07` | Attempt Visa. | | `08` | Transacción con datos 3DS. | *** ## Consideraciones sobre montos El campo `amount` debe enviarse sin punto decimal. El monto se calcula aplicando el exponente de la moneda: ```text theme={"system"} Monto enviado = monto real × 10^exponente de la moneda ``` Ejemplo para moneda PEN: | Monto real | Currency | Valor enviado | | -: | - | -: | | 10.00 | `604` | `1000` | | 389.80 | `604` | `38980` | | 1,250.50 | `604` | `125050` | ## Consideraciones sobre moneda El campo `currency` debe enviarse en formato ISO 4217 numérico. | Moneda | Código ISO 4217 numérico | | - | - | | PEN | `604` | | USD | `840` | ## Consideraciones sobre tarjeta Los datos sensibles de tarjeta deben enviarse cifrados. | Campo | Cifrado requerido | | - | - | | `card.pan` | Sí | | `card.expiry_date` | Sí | | `card.security_code` | Sí | ## Consideraciones sobre cuotas El objeto `installments` debe enviarse únicamente cuando la operación aplique a un pago en cuotas. ```json theme={"system"} { "installments": { "number_of_installments": "04", "id_plan": "145", "grace_period": "02" } } ``` ### Reglas | Regla | Descripción | | - | - | | Número de cuotas | `number_of_installments` debe contener solo dígitos. | | Plan de cuotas | `id_plan` debe corresponder a un plan habilitado para el comercio. | | Periodo de gracia | `grace_period` debe enviarse en formato de dos dígitos. | | Operación sin cuotas | Si la operación no aplica a cuotas, el objeto `installments` puede omitirse. | ## Consideraciones sobre 3DS El objeto `authentication.3d_secure` debe enviarse cuando la transacción cuente con información de autenticación 3DS. ```json theme={"system"} { "authentication": { "3d_secure": { "payment_implementation_mode_indicator": "08", "cavv": "kANvskBe2eEnngBkKwx45YQBV7E=", "version": "2.1.0" } } } ``` ## Metadata El campo `metadata` permite enviar información adicional del comercio para fines de trazabilidad, reportería o conciliación. ```json theme={"system"} { "metadata": { "sucursal": "Sucursal 1", "canal": "web", "numero_pedido": "PED-123456" } } ``` ## Validaciones principales Antes de enviar una autorización Ecommerce, validar lo siguiente: | Validación | Regla | | - | - | | Comercio | `merchant_identifier` debe estar activo y habilitado para operar. | | Canal | `frame_type` debe ser `ecommerce`. | | Marca | `brand` debe ser `visa` o `mscd`. | | Orden | `internal_operation_number` debe ser único por comercio. | | Monto | `amount` debe enviarse sin decimales. | | Moneda | `currency` debe enviarse en formato ISO 4217 numérico. | | Tarjeta | Los campos sensibles deben enviarse cifrados. | | Cuotas | Si se envía `installments`, el plan debe estar habilitado para el comercio. | | 3DS | Si se envía información 3DS, debe incluir datos válidos de autenticación. | | Metadata | Los campos enviados en `metadata` deben respetar formato key-value. | ## Ejemplo mínimo ```json theme={"system"} { "frame_type": "ecommerce", "merchant_identifier": "b656d278-f047-4e23-9fa5-96c5818b5c8d", "brand": "visa", "internal_operation_number": "ORDER-0000000080", "amount": "1000", "currency": "604", "card": { "pan": "Cifrado", "expiry_date": "cifrado", "security_code": "cifrado" } } ``` ## Ejemplo con cuotas ```json theme={"system"} { "frame_type": "ecommerce", "merchant_identifier": "b656d278-f047-4e23-9fa5-96c5818b5c8d", "brand": "visa", "internal_operation_number": "ORDER-0000000081", "amount": "38980", "currency": "604", "card": { "pan": "Cifrado", "expiry_date": "cifrado", "security_code": "cifrado" }, "installments": { "number_of_installments": "04", "id_plan": "145", "grace_period": "02" } } ``` ## Ejemplo con 3DS ```json theme={"system"} { "frame_type": "ecommerce", "merchant_identifier": "b656d278-f047-4e23-9fa5-96c5818b5c8d", "brand": "visa", "internal_operation_number": "ORDER-0000000082", "amount": "38980", "currency": "604", "card": { "pan": "Cifrado", "expiry_date": "cifrado", "security_code": "cifrado" }, "authentication": { "3d_secure": { "payment_implementation_mode_indicator": "08", "cavv": "kANvskBe2eEnngBkKwx45YQBV7E=", "version": "2.1.0" } } } ``` *** ## Response La respuesta de una autorización Ecommerce se encuentra documentada en la página de respuesta general para autorizaciones. Ver estructura de respuesta para Ecommerce y POS. # Extorno Source: https://docs.pay-me.com/extorno ## Flujo de Extorno Para realizar el extorno de una transacción, la aplicación debe invocar la función `startReversal` del objeto `PaymeClient`. La operación de extorno se realiza utilizando el número de operación asociado a la transacción. ## Parámetros de Entrada | Parámetro | Tipo | Descripción | | :- | :- | :- | | `from` | Activity | Activity desde donde se realizará la invocación del SDK. | | `merchantOperationNumber` | String | Número de operación o pedido que se desea extornar. | | `delegate` | Activity | Activity encargada de implementar los métodos del delegado. | ## Ejemplo de Invocación ```text theme={"system"} private fun invokeForReverse() { val operationNumber = "00000001" PaymeClient.startReversal( from = this, merchantOperationNumber = operationNumber, delegate = this ) } ``` ## Recepción de la Respuesta Para recibir el resultado del extorno, se debe implementar el método `onReversalResponse`. ```text theme={"system"} override fun onReversalResponse(response: PMReversalResponse) { val gson = GsonBuilder().setPrettyPrinting().create() val gsonResponse = gson.toJson(response) val intent = Intent(this, ResponseActivity::class.java).apply { putExtra("ACTION", this@RequestActivity.action) putExtra( "REQUEST_PAYME", "Número de pedido: ${binding.inputOperationNumber.text}" ) putExtra("RESPONSE_PAYME", gsonResponse) } startActivity(intent) finish() } ``` ## Respuesta de Extorno El resultado del proceso será devuelto mediante el objeto `PMReversalResponse`. La respuesta recibida en `onReversalResponse` permitirá conocer si el extorno fue procesado correctamente o si ocurrió algún error durante la operación. # API de Devoluciones Source: https://docs.pay-me.com/gestion-de-devoluciones/api-de-devoluciones Envía solicitudes de devolución total o parcial sobre transacciones liquidadas. El **API de Devoluciones** permite enviar una o más transacciones en estado `LIQUIDADO` a devolver. Solo está disponible para los métodos `CARD`, `YAPE` y `CUOTEALO`. [https://api.preprod.alignet.io/refund](https://api.preprod.alignet.io/refund) [https://api.alignet.io/refund](https://api.alignet.io/refund) La devolución se procesa después del estado `AUTORIZADO`, cuando la transacción ya se encuentra en `LIQUIDADO`. Si la operación aún no fue liquidada, el mecanismo correcto es el extorno, no la devolución. *** ## Request ### Headers | Campo | Descripción | Valor | Tipo | Obligatorio | | :- | :- | :- | :- | :- | | `Authorization` | Token de identificación para uso del API creado previamente en API de Seguridad | `Bearer ` | String | SI | | `ALG-API-VERSION` | Versión del API a usar | `1709847567` | String | SI | | `payment-facilitator-code` | Identificador del PF, obligatorio para Payment Facilitator | Cadena alfanumérica | String | NO | ### Body | Campo | Descripción | Ejemplo | Tipo | Obligatorio | | :- | :- | :- | :- | :- | | `merchant_code` | Identificador del comercio | `41bb301e-3c37-4332-accb-ed5ec19081e4` | String | SI | | `operations` | Array que contiene objetos de transacciones a devolver | Array | Array | SI | | `operations[].type` | Tipo de devolución | `TOTAL`, `PARTIAL` | String | SI | | `operations[].merchant_operation_number` | Número de pedido de la operación | `239766` | String | SI | | `operations[].transaction_id` | Código alfanumérico de la transacción | `bko66gpi8czns4tcde93q96vd` | String | NO | | `operations[].refund_amount` | Monto a devolver en centavos | `1050` | String | SI | | `operations[].additional_fields` | Diccionario para enviar campos y valores personalizados como `key:value` | `external_id:21871054` | Dictionary | NO | Para S/. 10.50 debes enviar `1050`. La separación de decimales se aplica según la moneda. ### Ejemplo (JSON) ```json theme={"system"} { "merchant_code": "41bb301e-3c37-4332-accb-ed5ec19081e4", "operations": [ { "type": "TOTAL", "merchant_operation_number": "239766", "transaction_id": null, "refund_amount": "1050", "additional_fields": { "canal": "WEB", "reason": "cliente no reconoció el consumo", "description": "solicitud por desconocimiento" } } ] } ``` *** ## Siguiente paso Consulta una solicitud puntual usando `merchant_code` y `merchant_operation_number`. Lista devoluciones por rango de fechas y filtros operativos. *** ## Response | Campo | Descripción | Ejemplo | Tipo | Obligatorio | | :- | :- | :- | :- | :- | | `success` | Indica si el proceso se realizó correctamente | `true`, `false` | String | SI | | `action` | Acción ejecutada | `refund` | String | SI | | `merchant_code` | Identificador del comercio | `41bb301e-3c37-4332-accb-ed5ec19081e4` | String | SI | | `operations` | Array que contiene objetos de transacciones a devolver | Array | Array | SI | | `operations[].refund_id` | UUID único de la devolución | UUID | String | SI | | `operations[].state` | Estado de la solicitud | `REGISTERED`, `REJECTED` | String | SI | | `operations[].refund_reason` | Motivo o detalle asociado al estado | `Solicitud recibida y validada` | String | SI | | `operations[].type` | Tipo de devolución | `TOTAL`, `PARTIAL` | String | SI | | `operations[].merchant_operation_number` | Número de pedido de la operación | `239766` | String | SI | | `operations[].transaction_id` | Código alfanumérico de la transacción | `bko66gpi8czns4tcde93q96vd` | String | SI | | `operations[].refund_amount` | Monto a devolver en centavos | `1050` | String | SI | | `operations[].transaction_amount` | Monto original de la transacción en centavos | `1050` | String | SI | | `operations[].currency` | Código ISO 4217 de la moneda de la transacción | `604` | String | SI | | `operations[].additional_fields` | Diccionario con campos personalizados enviados en el request | Dictionary | Dictionary | NO | | `operations[].payment_method` | Objeto relacionado al medio y procesador de pago | Object | Object | SI | | `operations[].payment_method.name` | Nombre del método de pago | `CARD`, `YAPE`, `CUOTEALO` | String | SI | | `operations[].payment_method.brand` | Marca de la tarjeta | `VISA`, `MSCD`, `AMEX`, `DINC` | String | SI | | `operations[].payment_method.masked_pan` | Tarjeta enmascarada | `447411******2240` | String | SI | | `operations[].lifecycle` | Array con el listado de estados por los que pasó la devolución | Array | Array | SI | | `operations[].lifecycle[].state` | Estado de la devolución | `REGISTERED`, `REJECTED` | String | SI | | `operations[].lifecycle[].date` | Objeto con la fecha del cambio de estado | Object | Object | SI | | `operations[].lifecycle[].date.utc_time` | Fecha en UTC | `2025-05-26T06:06:45` | String | SI | | `operations[].lifecycle[].date.unix_time` | Fecha en unix time | `1748239605` | Integer | SI | | `meta.status` | Objeto que contiene el resultado del flujo ejecutado | Object | Object | SI | | `meta.status.code` | Código que representa el resultado del flujo ejecutado | `00` | String | SI | | `meta.status.message_ilgn` | Objeto que contiene el mensaje resultante del flujo | Object | Object | SI | | `meta.status.message_ilgn[].locale` | Localidad a nivel de lenguaje para el mensaje del flujo ejecutado | `es_PE` | String | SI | | `meta.status.message_ilgn[].value` | Mensaje resultante del flujo ejecutado | `Se procesó correctamente la petición` | String | SI | ### Ejemplo (JSON) ```json theme={"system"} { "success": "true", "action": "refund", "merchant_code": "41bb301e-3c37-4332-accb-ed5ec19081e4", "operations": [ { "refund_id": "922178aa-ce4c-4c5f-8190-82fa7e009425", "state": "REGISTERED", "refund_reason": "Solicitud recibida y validada", "type": "TOTAL", "merchant_operation_number": "239766", "transaction_id": "bko66gpi8czns4tcde93q96vd", "refund_amount": "1050", "transaction_amount": "1050", "currency": "604", "payment_method": { "name": "CARD", "brand": "VISA", "masked_pan": "447411******2240" }, "additional_fields": { "canal": "WEB", "reason": "cliente no reconoció el consumo", "description": "solicitud por desconocimiento" }, "lifecycle": [ { "state": "REGISTERED", "date": { "utc_time": "2025-05-26T06:06:45", "unix_time": 1748239605 } } ] } ], "meta": { "status": { "code": "00", "message_ilgn": [ { "locale": "es_PE", "value": "Se procesó correctamente la petición" } ] } } } ``` # Devoluciones Source: https://docs.pay-me.com/gestion-de-devoluciones/introduccion Panorama general del módulo de Devoluciones y de las APIs disponibles para transacciones liquidadas. Pay-me ofrece a los comercios la funcionalidad de **Devoluciones**, permitiendo automatizar la gestión de devoluciones por medio de APIs especializadas. Las capacidades contempladas en este módulo son: * `API de Devoluciones` * `API de Consulta Unitaria de Devolución` * `API de Consulta Masiva de Devolución` * `Códigos de Respuesta - Devoluciones` *** ## Momento del ciclo Se aplica sobre transacciones `AUTORIZADO`, antes de la liquidación. Se aplica después de la autorización, únicamente sobre transacciones en estado `LIQUIDADO`. La devolución no reemplaza al extorno. Operativamente corresponde a una etapa posterior del ciclo de vida del pago. *** ## APIs del módulo Permite registrar una o más solicitudes de devolución total o parcial para transacciones liquidadas. Permite revisar el detalle y lifecycle de una solicitud específica de devolución. Permite consultar múltiples solicitudes de devolución para control operativo y conciliación. Resume los códigos funcionales y mensajes que debes interpretar en las respuestas del módulo. *** ## Métodos de pago soportados Tarjetas de crédito y débito liquidadas. Operaciones liquidadas procesadas con Yape. Operaciones liquidadas procesadas con Cuotéalo. *** ## Reglas base La devolución solo se efectúa sobre transacciones en estado `LIQUIDADO`. Puedes enviar una o más operaciones en un mismo request. El tipo de devolución soportado es `TOTAL` o `PARTIAL`. Conserva `merchant_operation_number` y `transaction_id` para trazabilidad y conciliación. *** ## Consejos de integración Toma `REGISTERED` como recepción de la solicitud. Usa las APIs de consulta para confirmar si la devolución avanza a `RESOLVED` o termina en `REJECTED`. Si integras devoluciones parciales o varias operaciones en un mismo request, revisa cada resultado individual y no solo el código global del `meta`. Verifica que la transacción origen esté en `LIQUIDADO`, que el método sea soportado y que el monto a devolver cumpla tus reglas internas. Conserva `refund_id`, `merchant_operation_number` y `transaction_id` para conciliación, auditoría y soporte. *** ## Siguiente paso Revisa el endpoint `POST /refund`, la estructura del request, la respuesta y el ejemplo base del flujo. # Impresión de voucher Source: https://docs.pay-me.com/impresion-de-voucher ## Flujo de Impresión Para imprimir un voucher, la aplicación debe invocar la función `startPrint` del objeto `PaymeClient`. Esta función permite enviar al SDK una lista de elementos que serán impresos en el voucher. ## Parámetros de Entrada | Parámetro | Tipo | Descripción | | :- | :- | :- | | `context` | Context | Contexto desde donde se realizará la invocación del SDK. | | `elements` | List\ | Lista de elementos a imprimir. | | `listener` | PaymePrintListener | Callback que notificará si la impresión finalizó correctamente o si se presentó un error. | Los elementos serán impresos respetando el orden en el que son enviados dentro de la lista `elements` ## Ejemplo de Invocación ```text theme={"system"} private fun printPaymeVoucher() { val voucherElements = listOf( PMPrintElement.Image( content = BitmapFactory.decodeResource( this.resources, com.alignet.paymepossdk.R.drawable.payme_logo ), width = 300, height = 100, align = PMPrintElement.Align.CENTER ), PMPrintElement.Text( "Payme Store", align = PMPrintElement.Align.CENTER, fontSize = 22, isBold = true ), PMPrintElement.Text( "Av. Casimiro Ulloa 333", align = PMPrintElement.Align.CENTER ), PMPrintElement.Text( "Lima Perú", align = PMPrintElement.Align.CENTER ), PMPrintElement.Line( style = PMPrintElement.LineStyle.BLANK ), PMPrintElement.Text( "VENTA AUTORIZADA", align = PMPrintElement.Align.CENTER, fontSize = 18, isBold = true, isReverseText = true ), PMPrintElement.Line( style = PMPrintElement.LineStyle.BLANK ), PMPrintElement.Text( "S/. 100.00", align = PMPrintElement.Align.CENTER, fontSize = 38, isBold = true ), PMPrintElement.Text( "Pago Exitoso", align = PMPrintElement.Align.CENTER, fontSize = 24 ), PMPrintElement.Line( style = PMPrintElement.LineStyle.DASHED ), PMPrintElement.MultiText( items = listOf( PMPrintElement.Text("Número de Pedido", width = 220), PMPrintElement.Text( "00000001", width = 164, align = PMPrintElement.Align.RIGHT, isBold = true ) ) ), PMPrintElement.MultiText( items = listOf( PMPrintElement.Text("Fecha", width = 100), PMPrintElement.Text( "25/08/2025 10:00:00", width = 284, align = PMPrintElement.Align.RIGHT, isBold = true ) ) ), PMPrintElement.MultiText( items = listOf( PMPrintElement.Text("Terminal", width = 100), PMPrintElement.Text( "0000001", width = 284, align = PMPrintElement.Align.RIGHT, isBold = true ) ) ), PMPrintElement.MultiText( items = listOf( PMPrintElement.Text("Cod Comercio", width = 150), PMPrintElement.Text( "2604000001", width = 234, align = PMPrintElement.Align.RIGHT, isBold = true ) ) ), PMPrintElement.MultiText( items = listOf( PMPrintElement.Text("Tarjeta", width = 100), PMPrintElement.Text( "**************1234", width = 284, align = PMPrintElement.Align.RIGHT, isBold = true ) ) ), PMPrintElement.MultiText( items = listOf( PMPrintElement.Text("Marca", width = 80), PMPrintElement.Text( "VISA CREDIT – CONTACTLESS", width = 304, align = PMPrintElement.Align.RIGHT, isBold = true ) ) ), PMPrintElement.MultiText( items = listOf( PMPrintElement.Text("TID", width = 50), PMPrintElement.Text( "0993203580049584", width = 334, align = PMPrintElement.Align.RIGHT, isBold = true ) ) ), PMPrintElement.MultiText( items = listOf( PMPrintElement.Text("Código de Autorización", width = 290), PMPrintElement.Text( "T28501", width = 94, align = PMPrintElement.Align.RIGHT, isBold = true ) ) ), PMPrintElement.Line( style = PMPrintElement.LineStyle.SOLID ), PMPrintElement.Text( "NO REQUIERE FIRMA", align = PMPrintElement.Align.CENTER ) ) PaymeClient.startPrint( this, voucherElements, listener = object : PaymePrintListener { override fun onPrintSuccess() { Toast.makeText( this@MainActivity, "Impresión finalizada", Toast.LENGTH_LONG ).show() } override fun onPrintFail( errorCode: String, errorMessage: String ) { Toast.makeText( this@MainActivity, "$errorCode - $errorMessage", Toast.LENGTH_LONG ).show() } } ) } ``` ## Resultado de la Impresión El resultado del proceso será informado mediante la interfaz `PaymePrintListener`. ### onPrintSuccess Se ejecuta cuando la impresión finaliza correctamente. ### onPrintFail Se ejecuta cuando ocurre un error durante la impresión. | Parámetro | Tipo | Descripción | | :- | :- | :- | | `errorCode` | String | Código asociado al error producido durante la impresión. | | `errorMessage` | String | Descripción del error producido durante la impresión. | El callback `PaymePrintListener` permite controlar el resultado de la impresión y mostrar una respuesta al usuario desde la aplicación integradora. # Inicializar el SDK Source: https://docs.pay-me.com/inicializar-el-sdk Antes de utilizar cualquier funcionalidad de **Pay-me POS SDK**, es necesario realizar una inicialización para obtener la configuración del dispositivo POS y del comercio asociado. La inicialización debe ejecutarse al inicio de la aplicación y antes de invocar cualquier operación del SDK. ## Consideraciones Para que la inicialización sea exitosa, el dispositivo POS debe encontrarse previamente registrado y configurado en Pay-me. ## Inicialización del SDK Para inicializar el SDK, invoque la función `initializeSDK` del objeto `PaymeClient`. ### Ejemplo ```text theme={"system"} PaymeClient.initializeSDK( this, environment = PaymeEnvironment.PRODUCTION, listener = object : PaymeInitializationListener { override fun onInitSuccess() { Toast.makeText( this@MainActivity, "PaymePOS se inició correctamente", Toast.LENGTH_LONG ).show() } override fun onInitFail( errorCode: String, errorMessage: String ) { Toast.makeText( this@MainActivity, "PaymePOS falló al iniciar - $errorMessage", Toast.LENGTH_LONG ).show() } } ) ``` ## Resultado de la Inicialización El resultado del proceso es informado mediante la interfaz `PaymeInitializationListener`. ### onInitSuccess Se ejecuta cuando el SDK se inicializa correctamente y queda disponible para procesar operaciones. ### onInitFail Se ejecuta cuando ocurre un error durante la inicialización. | Parámetro | Tipo | Descripción | | :- | :- | :- | | `errorCode` | String | Código asociado al error producido durante la inicialización. | | `errorMessage` | String | Descripción del error producido durante la inicialización. | Se recomienda habilitar las funcionalidades de pago, consulta, extorno e impresión únicamente después de recibir la respuesta satisfactoria en el método `onInitSuccess()`. # Introducción - procesamiento Source: https://docs.pay-me.com/introduccion-procesamiento Conoce el servicio de procesamiento transaccional de Alignet para entidades adquirentes y facilitadores de pago. ## Procesamiento transaccional La plataforma de procesamiento de Alignet permite a entidades adquirentes y facilitadores de pago enviar, gestionar y consultar transacciones provenientes de distintos canales de pago. Image A través de una integración centralizada, las entidades pueden conectar sus canales digitales y presenciales con los servicios de autorización y procesamiento disponibles en la plataforma. Los canales soportados pueden incluir: * Sitios web y checkout. * Aplicaciones móviles. * Terminales POS y PinPad. * Plataformas propias de comercio electrónico. * Sistemas de adquirencia y facilitación de pagos. ## Modelos de servicio Alignet puede participar bajo diferentes modelos, de acuerdo con el alcance definido para cada entidad. ### Alignet como procesador La entidad mantiene su rol como adquirente o facilitador de pago, mientras Alignet brinda la infraestructura tecnológica necesaria para procesar las transacciones. El servicio puede comprender: * Recepción de transacciones. * Validaciones técnicas y de negocio. * Enrutamiento hacia las redes o entidades correspondientes. * Autorización y respuesta transaccional. * Gestión de extornos, anulaciones y consultas. * Monitoreo y trazabilidad de las operaciones. ### Procesamiento adquirente Cuando la entidad requiera operar como adquirente frente a una marca de tarjetas, será necesario realizar previamente el proyecto correspondiente con dicha marca. Este proceso puede incluir certificaciones, habilitación de identificadores, configuración de conexiones y validaciones operativas antes del inicio de producción. ## Marcas y redes Según el modelo contratado, el país, la disponibilidad del servicio y las habilitaciones correspondientes, Alignet puede actuar como procesador para distintas marcas y redes de pago, entre ellas: * Visa. * Mastercard. * Diners Club. * UnionPay. * Otras redes habilitadas para el proyecto. La disponibilidad de cada marca debe ser confirmada durante la etapa de evaluación y definición del alcance. ## Integración mediante API La comunicación con la plataforma se realiza mediante servicios API, permitiendo que la entidad gestione el ciclo transaccional desde sus propios sistemas. El flujo general comprende: La transacción se origina desde el canal de la entidad, comercio o facilitador de pago. La entidad envía la solicitud mediante la API de procesamiento. Alignet valida la información y determina la ruta de procesamiento aplicable. La operación es enviada a la red, marca o entidad correspondiente. Alignet devuelve el resultado de la transacción al sistema de origen. ## Operaciones disponibles Dependiendo del alcance contratado, la integración puede contemplar las siguientes operaciones: Procesamiento de una nueva transacción de pago. Consulta del estado y resultado de una operación. Reversión de una transacción previamente procesada. Gestión de anulaciones o devoluciones según el modelo habilitado. ## Próximos pasos Antes de iniciar la integración, la entidad debe revisar las consideraciones técnicas, operativas y de marca aplicables al proyecto. Consulta los requisitos necesarios para iniciar el proyecto de integración. # Introducción Source: https://docs.pay-me.com/introduccion-sdk-para-pos Bienvenido a la guía de integración de **Pay-me POS SDK**. Este SDK permite a las aplicaciones Android integrarse con los dispositivos POS compatibles con Pay-me para realizar operaciones de pago presenciales de forma segura y estandarizada. A través de sus funcionalidades, es posible ejecutar autorizaciones de pago, consultas de transacciones, extornos e impresión de comprobantes directamente desde la aplicación integradora. La presente documentación describe los requisitos necesarios para la integración, la configuración inicial del SDK y los flujos disponibles para interactuar con los servicios de Pay-me POS. ## Funcionalidades Disponibles Pay-me POS SDK permite integrar las siguientes funcionalidades dentro de una aplicación Android: * **Autorización de Pagos:** Procesamiento de transacciones mediante tarjeta o código QR. * **Consulta de Transacciones:** Consulta del estado y detalle de operaciones realizadas. * **Extornos:** Reversión de transacciones utilizando el número de operación. * **Impresión de Comprobantes:** Generación e impresión de vouchers desde el dispositivo POS. ## Flujo General de Integración Image Se recomienda realizar la inicialización del SDK al inicio de la aplicación y esperar una respuesta satisfactoria antes de habilitar cualquier operación transaccional. ## Compatibilidad Esta guía está orientada a desarrolladores Android responsables de integrar Pay-me POS SDK dentro de aplicaciones móviles que interactúan con dispositivos POS compatibles. Todos los ejemplos incluidos en esta documentación tienen fines ilustrativos. Utilice siempre los valores y configuraciones proporcionados para su ambiente de integración. Descargue la última versión de Pay-me POS SDK para iniciar su integración. Descargar SDK v1.0.0 # Códigos de Retorno Source: https://docs.pay-me.com/pagos/codigos-de-retorno Guía técnica para la interpretación de respuestas de autorización de Pay-me. ### Validación General de Éxito Independientemente del procesador utilizado, la lógica de su sistema debe ser estricta para evitar fraudes o errores de entrega. Código **00** Código **000** Cualquier código distinto a los mencionados arriba debe ser tratado automáticamente por su lógica de negocio como una transacción **No Aprobada**. ### Diccionario de Códigos (otros procesadores) Seleccione el procesador o marca de tarjeta para ver el detalle de los mensajes de retorno. ### Marcas Principales Gestión de respuestas directas para tarjetas Visa y Mastercard. | Código | Mensaje de Retorno/Respuesta | Estado | Acción | | :- | :- | :- | :- | | **00** | Pago Exitoso | `[EXITOSO]` | Proceder con la entrega del producto/servicio. | | **01** | Contactar al banco | `[DENEGADO]` | Solicitar al cliente intentar con otro medio de pago. | | **02** | Contactar al banco | `[DENEGADO]` | Solicitar al cliente intentar con otro medio de pago. | | **03** | Código de comercio inválido. | `[DENEGADO]` | Solicitar al cliente intentar con otro medio de pago. | | **04** | Retener Tarjeta | `[DENEGADO]` | Solicitar al cliente intentar con otro medio de pago. | | **05** | Pago no aceptado por el emisor | `[DENEGADO]` | Solicitar al cliente intentar con otro medio de pago. | | **06** | Error general en procesamiento | `[DENEGADO]` | Solicitar al cliente intentar con otro medio de pago. | | **07** | Retener tarjeta (posible fraude). | `[DENEGADO]` | Solicitar al cliente intentar con otro medio de pago. | | **10** | Aprobación parcial exitosa. (No habilitado) | `[DENEGADO]` | Solicitar al cliente intentar con otro medio de pago. | | **11** | Aprobado (VIP) (No habilitado) | `[DENEGADO]` | Solicitar al cliente intentar con otro medio de pago. | | **12** | Transacción inválida. | `[DENEGADO]` | Solicitar al cliente intentar con otro medio de pago. | | **13** | Monto inválido o error en conversión. | `[DENEGADO]` | Solicitar al cliente intentar con otro medio de pago. | | **14** | Número de cuenta inválido. | `[DENEGADO]` | Solicitar al cliente intentar con otro medio de pago. | | **15** | Código de emisor Incorrecto | `[DENEGADO]` | Solicitar al cliente intentar con otro medio de pago. | | **19** | Reintentar la transacción | `[REINTENTAR]` | Solicitar al cliente intentar con otro medio de pago. | | **21** | Reintentar la transacción | `[REINTENTAR]` | Solicitar al cliente intentar con otro medio de pago. | | **25** | Reintentar la transacción | `[REINTENTAR]` | Solicitar al cliente intentar con otro medio de pago. | | **28** | Reintentar la transacción | `[REINTENTAR]` | Solicitar al cliente intentar con otro medio de pago. | | **39** | Cuenta de crédito no disponible. | `[DENEGADO]` | Solicitar al cliente intentar con otro medio de pago. | | **41** | Tarjeta reportada como perdida | `[DENEGADO]` | Solicitar al cliente intentar con otro medio de pago. | | **43** | Tarjeta reportada | `[DENEGADO]` | Solicitar al cliente intentar con otro medio de pago. | | **46** | Número de cuenta vinculada cerrada | `[DENEGADO]` | Solicitar al cliente intentar con otro medio de pago. | | **51** | Fondos insuficientes | `[DENEGADO]` | Solicitar al cliente intentar con otro medio de pago. | | **52** | No existe cuenta corriente | `[DENEGADO]` | Solicitar al cliente intentar con otro medio de pago. | | **53** | No existe cuenta de ahorros | `[DENEGADO]` | Solicitar al cliente intentar con otro medio de pago. | | **54** | Tarjeta expirada | `[DENEGADO]` | Solicitar al cliente intentar con otro medio de pago. | | **55** | PIN incorrecto | `[DENEGADO]` | Solicitar al cliente intentar con otro medio de pago. | | **57** | Transacción no permitida contactar emisor | `[DENEGADO]` | Solicitar al cliente intentar con otro medio de pago. | | **58** | Pago No Permitido en terminal | `[DENEGADO]` | Solicitar al cliente intentar con otro medio de pago. | | **59** | Sospecha de fraude | `[DENEGADO]` | Solicitar al cliente intentar con otro medio de pago. | | **61** | Supera el límite de monto | `[DENEGADO]` | Solicitar al cliente intentar con otro medio de pago. | | **62** | Tarjeta restringida | `[DENEGADO]` | Solicitar al cliente intentar con otro medio de pago. | | **63** | Violación de seguridad | `[DENEGADO]` | Solicitar al cliente intentar con otro medio de pago. | | **64** | No se cumple requisitos de AML | `[DENEGADO]` | Solicitar al cliente intentar con otro medio de pago. | | **65** | Excedió límite de frecuencia de retiros | `[DENEGADO]` | Solicitar al cliente intentar con otro medio de pago. | | **70** | PIN es requerido | `[DENEGADO]` | Solicitar al cliente intentar con otro medio de pago. | | **74** | Error en la transacción | `[DENEGADO]` | Solicitar al cliente intentar con otro medio de pago. | | **75** | Intentos de PIN excedidos | `[DENEGADO]` | Solicitar al cliente intentar con otro medio de pago. | | **76** | Reversión no solicitada | `[DENEGADO]` | Solicitar al cliente intentar con otro medio de pago. | | **78** | Bloqueado por primer uso | `[DENEGADO]` | Solicitar al cliente intentar con otro medio de pago. | | **79** | Reintentar la transacción | `[DENEGADO]` | Solicitar al cliente intentar con otro medio de pago. | | **80** | Operación sin impacto financiero | `[DENEGADO]` | Solicitar al cliente intentar con otro medio de pago. | | **81** | Error criptográfico encontrado en el PIN | `[DENEGADO]` | Solicitar al cliente intentar con otro medio de pago. | | **82** | Resultado de Autenticación inválido | `[DENEGADO]` | Solicitar al cliente intentar con otro medio de pago. | | **85** | Rechazo por verificaciones | `[DENEGADO]` | Solicitar al cliente intentar con otro medio de pago. | | **86** | El PIN no pudo ser verificado | `[DENEGADO]` | Solicitar al cliente intentar con otro medio de pago. | | **91** | Emisor no disponible | `[DENEGADO]` | Solicitar al cliente intentar con otro medio de pago. | | **92** | ID de la institución inválida | `[DENEGADO]` | Solicitar al cliente intentar con otro medio de pago. | | **93** | Transacción No completada | `[DENEGADO]` | Solicitar al cliente intentar con otro medio de pago. | | **94** | Transmisión duplicada. | `[DENEGADO]` | Solicitar al cliente intentar con otro medio de pago. | | **96** | Error de sistema | `[DENEGADO]` | Solicitar al cliente intentar con otro medio de pago. | | **1A** | Autenticación es requerida | `[DENEGADO]` | Solicitar al cliente intentar con otro medio de pago. | | **6P** | Verificación fallida | `[DENEGADO]` | Solicitar al cliente intentar con otro medio de pago. | | **B1** | Cargo adicional no permitido | `[DENEGADO]` | Solicitar al cliente intentar con otro medio de pago. | | **N0** | Reintentar la transacción | `[DENEGADO]` | Solicitar al cliente intentar con otro medio de pago. | | **N3** | Servicio de efectivo no disponible | `[DENEGADO]` | Solicitar al cliente intentar con otro medio de pago. | | **N4** | Límite de efectivo excedido | `[DENEGADO]` | Solicitar al cliente intentar con otro medio de pago. | | **N7** | Rechazo por clave CVV2 | `[DENEGADO]` | Solicitar al cliente intentar con otro medio de pago. | | **N8** | Monto excede aprobación preautorizada. | `[DENEGADO]` | Solicitar al cliente intentar con otro medio de pago. | | **P5** | Desbloqueo de PIN denegado por el emisor | `[DENEGADO]` | Solicitar al cliente intentar con otro medio de pago. | | **P6** | Cambio de PIN denegado (PIN inseguro) | `[DENEGADO]` | Solicitar al cliente intentar con otro medio de pago. | | **Q1** | Fallo en la autenticación de la tarjeta. | `[DENEGADO]` | Solicitar al cliente intentar con otro medio de pago. | | **R0** | Detener la orden de pago | `[DENEGADO]` | Solicitar al cliente intentar con otro medio de pago. | | **R1** | Detener la orden de pago | `[DENEGADO]` | Solicitar al cliente intentar con otro medio de pago. | | **R2** | Transacción no califica para PIN Visa | `[DENEGADO]` | Solicitar al cliente intentar con otro medio de pago. | | **R3** | Detener la orden de pago | `[DENEGADO]` | Solicitar al cliente intentar con otro medio de pago. | | **Z1** | Removido del proceso de autorización | `[DENEGADO]` | Solicitar al cliente intentar con otro medio de pago. | | **Z3** | No se puede conectar a línea | `[DENEGADO]` | Solicitar al cliente intentar con otro medio de pago. | | Código | Mensaje de Retorno/Respuesta | Estado | Acción | | :- | :- | :- | :- | | **00** | Pago Exitoso | `[EXITOSO]` | Proceder con la entrega del producto/servicio. | | **01** | Denegado por el emisor | `[DENEGADO]` | Solicitar al cliente intentar con otro medio de pago. | | **03** | Datos de comercio Inválidos | `[DENEGADO]` | Validar configuración del comercio y reintentar la operación. | | **04** | Denegado por el emisor | `[DENEGADO]` | Solicitar al cliente intentar con otro medio de pago. | | **05** | Denegado por el emisor | `[DENEGADO]` | Solicitar al cliente intentar con otro medio de pago. | | **08** | Denegado por el emisor | `[DENEGADO]` | Solicitar al cliente intentar con otro medio de pago. | | **10** | Aprobación Parcial Denegada | `[DENEGADO]` | Solicitar al cliente completar el pago con otro medio. | | **12** | Transacción no válida | `[DENEGADO]` | Validar los datos de la transacción y reintentar. | | **13** | Monto invalido | `[DENEGADO]` | Validar el monto e intentar nuevamente. | | **14** | Número de cuenta no válido | `[DENEGADO]` | Validar datos de la tarjeta y reintentar. | | **15** | Emisor no disponible | `[ERROR]` | Reintentar en unos minutos o usar otro medio de pago. | | **30** | Error durante el proceso emisor | `[ERROR]` | Reintentar la operación. | | **41** | Denegado por el emisor | `[DENEGADO]` | Solicitar al cliente intentar con otro medio de pago. | | **43** | Denegado por el emisor | `[DENEGADO]` | Solicitar al cliente intentar con otro medio de pago. | | **51** | Fondos insuficientes | `[DENEGADO]` | Solicitar al cliente usar otro medio de pago o fondos disponibles. | | **54** | Tarjeta expirada | `[DENEGADO]` | Solicitar al cliente usar otra tarjeta vigente. | | **55** | PIN incorrecto | `[DENEGADO]` | Solicitar al cliente ingresar correctamente su PIN. | | **57** | La transacción no es permitida | `[DENEGADO]` | Solicitar al cliente contactar a su banco o usar otro medio. | | **58** | La transacción no es permitida | `[DENEGADO]` | Solicitar al cliente contactar a su banco o usar otro medio. | | **61** | Excede el límite del monto | `[DENEGADO]` | Solicitar al cliente intentar con un monto menor u otro medio. | | **62** | Denegado por el emisor | `[DENEGADO]` | Solicitar al cliente intentar con otro medio de pago. | | **63** | Violación de seguridad | `[DENEGADO]` | Solicitar al cliente contactar a su banco. | | **65** | Error durante el proceso emisor | `[ERROR]` | Reintentar la operación. | | **70** | Denegado por el emisor | `[DENEGADO]` | Solicitar al cliente intentar con otro medio de pago. | | **71** | Error de clave PIN | `[DENEGADO]` | Solicitar al cliente validar su PIN. | | **75** | Excedió el número de intentos | `[DENEGADO]` | Solicitar al cliente contactar a su banco. | | **76** | Error durante el proceso emisor | `[ERROR]` | Reintentar la operación. | | **77** | Error durante el proceso emisor | `[ERROR]` | Reintentar la operación. | | **78** | Error durante el proceso emisor | `[ERROR]` | Reintentar la operación. | | **79** | Denegado por la marca | `[DENEGADO]` | Solicitar al cliente intentar con otro medio de pago. | | **81** | Denegado por el emisor | `[DENEGADO]` | Solicitar al cliente intentar con otro medio de pago. | | **82** | Denegado por la marca | `[DENEGADO]` | Solicitar al cliente intentar con otro medio de pago. | | **83** | Denegado por el emisor | `[DENEGADO]` | Solicitar al cliente intentar con otro medio de pago. | | **84** | Denegado por el emisor | `[DENEGADO]` | Solicitar al cliente intentar con otro medio de pago. | | **85** | Denegado por el emisor | `[DENEGADO]` | Solicitar al cliente intentar con otro medio de pago. | | **86** | Error durante el proceso emisor | `[ERROR]` | Reintentar la operación. | | **87** | Denegado por el emisor | `[DENEGADO]` | Solicitar al cliente intentar con otro medio de pago. | | **88** | Error de ingreso de datos | `[DENEGADO]` | Validar datos ingresados y reintentar. | | **89** | Denegado por el emisor | `[DENEGADO]` | Solicitar al cliente intentar con otro medio de pago. | | **91** | Error durante el proceso emisor | `[ERROR]` | Reintentar la operación. | | **92** | Error durante el proceso emisor | `[ERROR]` | Reintentar la operación. | | **94** | Numero pedido duplicado | `[ERROR]` | Validar duplicidad antes de reenviar la transacción. | | **96** | Error durante el proceso emisor | `[ERROR]` | Reintentar la operación. | ### Procesador | Código | Mensaje de Retorno/Respuesta | Estado | Acción | | :- | :- | :- | :- | | **000** | Transacción aprobada | `[EXITOSO]` | Proceder con la entrega del producto/servicio. | | **101** | Tarjeta Caducada | `[DENEGADO]` | Solicitar al cliente usar otra tarjeta vigente. | | **102** | Sospecha de fraude | `[DENEGADO]` | Solicitar al cliente contactar a su banco. | | **104** | Operación no permitida | `[DENEGADO]` | Solicitar otro medio de pago. | | **105** | Requiere lectura de chip | `[DENEGADO]` | Solicitar insertar tarjeta o usar chip. | | **106** | Exceso de intentos | `[DENEGADO]` | Intentar más tarde o contactar banco. | | **107** | Contactar con emisor | `[DENEGADO]` | Solicitar al cliente contactar a su banco. | | **110** | Operación no permitida para tarjeta | `[DENEGADO]` | Solicitar otro medio de pago. | | **112** | Se requiere PIN | `[DENEGADO]` | Solicitar ingresar PIN correctamente. | | **114** | Tarjeta restringida | `[DENEGADO]` | Contactar banco. | | **116** | Fondos insuficientes | `[DENEGADO]` | Solicitar otro medio de pago. | | **117** | PIN incorrecto | `[DENEGADO]` | Solicitar reingresar PIN. | | **118** | Tarjeta inválida | `[DENEGADO]` | Validar o usar otra tarjeta. | | **121** | Límite de consumo | `[DENEGADO]` | Reducir monto o usar otro medio. | | **129** | CVV2 incorrecto | `[DENEGADO]` | Validar CVV. | | **150** | Cuota no permitida | `[DENEGADO]` | Cambiar condiciones de pago. | | **151** | Tarjeta cancelada | `[DENEGADO]` | Usar otra tarjeta. | | **190** | Denegación genérica | `[DENEGADO]` | Solicitar otro medio de pago. | | **192** | Banco no responde | `[ERROR]` | Reintentar operación. | | **263** | Error envío parámetros | `[ERROR]` | Validar integración. | | **264** | Emisor no disponible | `[ERROR]` | Reintentar más tarde. | | **265** | OTP incorrecto | `[DENEGADO]` | Solicitar OTP correcto. | | **280** | CVV erróneo | `[DENEGADO]` | Validar CVV. | | **290** | Lista negra | `[DENEGADO]` | Solicitar otro medio de pago. | | **300** | Pedido duplicado | `[ERROR]` | Validar duplicidad. | | **316** | Tarjeta no existe por emisor | `[DENEGADO]` | Validar tarjeta o usar otra. | | **317** | Tarjeta bloqueada por emisor | `[DENEGADO]` | Contactar banco. | | **319** | Error parámetro | `[ERROR]` | Validar request. | | **320** | Error parámetro | `[ERROR]` | Validar request. | | **401** | Marca inhabilitada en comercio | `[DENEGADO]` | Validar configuración del comercio. | | **402** | IP no válida | `[DENEGADO]` | Validar origen de la transacción. | | **403** | Requiere autenticación | `[PENDIENTE]` | Completar autenticación (3DS). | | **404** | Monto supera máximo | `[DENEGADO]` | Reducir monto. | | **405** | Excede transacciones tarjeta | `[DENEGADO]` | Intentar más tarde. | | **406** | Excede transacciones comercio | `[DENEGADO]` | Intentar más tarde. | | **407** | Monto menor al mínimo | `[DENEGADO]` | Aumentar monto. | | **408** | CVC no coincide | `[DENEGADO]` | Validar CVC. | | **409** | CVV no procesado (P) | `[DENEGADO]` | Validar CVV. | | **412** | CVV no reconocido | `[DENEGADO]` | Validar CVV. | | **413** | Rechazo por validación adicional | `[DENEGADO]` | Revisar autenticación (3DS). | | **420** | Tarjeta no es VISA | `[DENEGADO]` | Usar tarjeta válida. | | **421** | BIN riesgoso | `[DENEGADO]` | Solicitar otro medio de pago. | | **422** | Configuración no permitida | `[DENEGADO]` | Validar configuración comercio. | | **423** | Usuario canceló | `[CANCELADO]` | Permitir reintento. | | **424** | BIN en lista negra | `[DENEGADO]` | Solicitar otro medio de pago. | | **425** | País incorrecto | `[DENEGADO]` | Validar país emisor. | | **426** | Link de pago inhabilitado | `[DENEGADO]` | Generar nuevo link. | | **427** | Denegación genérica | `[DENEGADO]` | Solicitar otro medio de pago. | | **428** | Requiere CVC | `[DENEGADO]` | Ingresar CVC. | | **665** | Error funcional | `[ERROR]` | Reintentar. | | **666** | Problema de comunicación | `[ERROR]` | Reintentar. | | **667** | Transacción abandonada | `[CANCELADO]` | Permitir reintento. | | **668** | Error antifraude | `[ERROR]` | Revisar antifraude. | | **670** | Antifraude | `[DENEGADO]` | Revisar reglas antifraude. | | **672** | Sin respuesta Cybersource | `[ERROR]` | Reintentar. | | **673** | Sin respuesta autorizador | `[ERROR]` | Reintentar. | | **674** | Sesión no válida | `[ERROR]` | Reintentar flujo. | | **680** | Exceso de intentos | `[DENEGADO]` | Intentar más tarde. | | **682** | Fuera de tiempo | `[DENEGADO]` | Reintentar operación. | | **683** | Contactar emisor | `[DENEGADO]` | Contactar banco. | | **684** | Error antifraude | `[DENEGADO]` | Revisar antifraude. | | **687** | Error formato trama | `[ERROR]` | Validar integración. | | **690** | Tarjeta no aceptada en billetera | `[DENEGADO]` | Usar otro medio. | | **691** | Error en token | `[ERROR]` | Regenerar token. | | **692** | Token vencido | `[DENEGADO]` | Generar nuevo token. | | **693** | Token inválido | `[DENEGADO]` | Validar token. | | **754** | Configuración errada | `[ERROR]` | Validar configuración. | | **760** | Error configuración | `[ERROR]` | Validar configuración. | | **777** | Error comunicación | `[ERROR]` | Reintentar. | | **800** | Echo aceptado | `[EXITOSO]` | Operación técnica correcta. | | **900** | Comunicación aceptada | `[EXITOSO]` | Operación técnica correcta. | | **904** | Formato erróneo | `[ERROR]` | Validar request. | | **909** | Error sistema | `[ERROR]` | Reintentar. | | **912** | Emisor no disponible | `[ERROR]` | Reintentar. | | **913** | Transmisión duplicada | `[ERROR]` | Validar duplicidad. | | **940** | Transacción anulada | `[CANCELADO]` | No reprocesar. | | **941** | Ya anulada | `[CANCELADO]` | No reprocesar. | | **942** | Original denegada | `[DENEGADO]` | No reprocesar. | | **945** | Referencia repetida | `[ERROR]` | Validar duplicidad. | | **949** | Terminal no operativo | `[ERROR]` | Validar terminal. | | **965** | Violación normativa | `[DENEGADO]` | Revisar reglas del emisor. | | Código | Mensaje de Retorno/Respuesta | Estado | Acción | | :- | :- | :- | :- | | **00** | Transacción aprobada | `[EXITOSO]` | Proceder con la entrega del producto/servicio. | | **02** | Consulte emisor de tarjetas | `[DENEGADO]` | Solicitar al cliente contactar a su banco. | | **03** | Comerciante no válido | `[DENEGADO]` | Validar configuración del comercio. | | **04** | No honres | `[DENEGADO]` | Solicitar otro medio de pago. | | **05** | No se puede procesar | `[DENEGADO]` | Solicitar otro medio de pago. | | **06** | Transacción no válida para este terminal | `[DENEGADO]` | Validar configuración del terminal. | | **08** | Tiempo de espera del emisor | `[ERROR]` | Reintentar operación. | | **09** | Sin original | `[ERROR]` | Validar referencia de la transacción. | | **10** | No se puede revertir | `[ERROR]` | Validar estado de la operación. | | **11** | Aprobado (VIP) | `[EXITOSO]` | Proceder con la entrega. | | **12** | Transacción no válida | `[DENEGADO]` | Validar datos e intentar nuevamente. | | **13** | Importe no válido | `[DENEGADO]` | Validar monto. | | **14** | Número de tarjeta no válido | `[DENEGADO]` | Validar datos de tarjeta. | | **17** | Fecha de captura no válida | `[ERROR]` | Validar fecha del terminal. | | **19** | Error del sistema | `[ERROR]` | Reintentar operación. | | **20** | No desde la cuenta | `[DENEGADO]` | Validar tipo de cuenta. | | **21** | No a la cuenta | `[DENEGADO]` | Validar destino de cuenta. | | **22** | Sin cuenta corriente | `[DENEGADO]` | Validar cuenta. | | **23** | Sin cuenta de ahorro | `[DENEGADO]` | Validar cuenta. | | **24** | Sin cuenta de crédito | `[DENEGADO]` | Validar cuenta. | | **25** | Registro no encontrado | `[ERROR]` | Validar información de la transacción. | | **30** | Error de formato | `[ERROR]` | Validar integración. | | **39** | Transacción no permitida | `[DENEGADO]` | Solicitar otro medio de pago. | | **41** | Tarjeta caliente | `[DENEGADO]` | Retener tarjeta si aplica. | | **42** | Recogida especial | `[DENEGADO]` | Retener tarjeta si aplica. | | **43** | Tarjeta robada | `[DENEGADO]` | Retener tarjeta si aplica. | | **44** | Tarjeta de recogida | `[DENEGADO]` | Retener tarjeta si aplica. | | **45** | Retroceso de transacción | `[ERROR]` | Validar estado antes de reintentar. | | **46** | Chip rechazado | `[DENEGADO]` | Reintentar con chip/contactless. | | **47** | Chip no disponible online | `[ERROR]` | Reintentar. | | **48** | Error Chip ARQC | `[ERROR]` | Validar EMV. | | **49** | Tag EMV no encontrado | `[ERROR]` | Validar EMV. | | **51** | Fondos insuficientes | `[DENEGADO]` | Solicitar otro medio de pago. | | **52** | Sin cuenta corriente | `[DENEGADO]` | Validar cuenta. | | **53** | Sin cuenta de ahorro | `[DENEGADO]` | Validar cuenta. | | **54** | Tarjeta vencida | `[DENEGADO]` | Solicitar tarjeta vigente. | | **55** | PIN incorrecto | `[DENEGADO]` | Solicitar reingresar PIN. | | **56** | Tarjeta sin registro | `[DENEGADO]` | Validar tarjeta. | | **57** | Transacción no permitida al titular | `[DENEGADO]` | Contactar banco. | | **58** | Transacción no permitida al terminal | `[DENEGADO]` | Validar configuración. | | **59** | Sospecha de fraude | `[DENEGADO]` | Contactar banco. | | **61** | Supera el límite | `[DENEGADO]` | Reducir monto o usar otro medio. | | **62** | Tarjeta restringida | `[DENEGADO]` | Contactar banco. | | **63** | Error de clave MAC | `[ERROR]` | Validar seguridad/integración. | | **65** | Límite de frecuencia excedido | `[DENEGADO]` | Intentar más tarde. | | **66** | Límite del adquirente excedido | `[DENEGADO]` | Intentar más tarde. | | **67** | Conservar tarjeta | `[DENEGADO]` | Retener tarjeta si aplica. | | **68** | Respuesta tardía | `[ERROR]` | Reintentar. | | **75** | Excede intentos de PIN | `[DENEGADO]` | Contactar banco. | | **76** | Cuenta no válida | `[DENEGADO]` | Validar cuenta. | | **77** | Sin acuerdo de red | `[ERROR]` | Validar integración/red. | | **78** | Función no disponible | `[ERROR]` | Validar operación. | | **79** | Error validación de clave | `[ERROR]` | Validar seguridad. | | **80** | Error longitud PIN | `[ERROR]` | Validar PIN. | | **81** | Bloque de PIN inválido | `[ERROR]` | Validar PIN. | | **82** | CVV no válido | `[DENEGADO]` | Validar CVV. | | **83** | Error sincronización contador | `[ERROR]` | Validar EMV. | | **84** | Ciclo de vida inválido | `[ERROR]` | Validar estado transacción. | | **85** | No hay claves disponibles | `[ERROR]` | Validar configuración. | | **86** | No se puede verificar PIN | `[ERROR]` | Reintentar. | | **87** | Error de clave PIN | `[ERROR]` | Validar PIN. | | **88** | Error sincronización MAC | `[ERROR]` | Validar seguridad. | | **89** | Violación de seguridad | `[DENEGADO]` | Revisar seguridad. | | **91** | Switch no disponible | `[ERROR]` | Reintentar. | | **92** | Emisor no válido | `[DENEGADO]` | Validar emisor. | | **93** | Adquirente no válido | `[ERROR]` | Validar configuración adquirente. | | **94** | Originador no válido | `[ERROR]` | Validar origen. | | **95** | Error del sistema | `[ERROR]` | Reintentar. | | **96** | Error del sistema | `[ERROR]` | Reintentar. | | **97** | Sin transferencia de fondos | `[DENEGADO]` | Validar operación. | | **98** | Reversión duplicada | `[ERROR]` | Validar duplicidad. | | **99** | Transacción duplicada | `[ERROR]` | Validar antes de reenviar. | | **102** | Timeout emisor | `[ERROR]` | Reintentar más tarde. | ### Notas Importantes sobre Marcas Si su comercio utiliza **Niubiz** o **Izipay**, es fundamental que también implemente la lógica para las marcas **Visa** y **Mastercard**, así como para **Diners Club** y **American Express**, ya que estos procesadores actúan como puente para dichas marcas. # Datos de Prueba Source: https://docs.pay-me.com/pagos/datos-de-prueba Utiliza estas credenciales para simular transacciones en nuestro ambiente de Sandbox. Estos datos son ficticios y solo funcionan en el ambiente de **Sandbox**. No intentes procesar transacciones reales con ellos. ## Tarjetas de Crédito y Débito Utiliza las siguientes tarjetas para probar los flujos de pagos exitosos y rechazados. Haz clic en el número para copiarlo rápidamente. **Número:** `4474118355632240`\ **Exp:** 03/28 | **CVV:** 111 **Número:** `4551708161768059`\ **Exp:** 03/28 | **CVV:** 111 **Número:** `4140682013946809`\ **Exp:** 03/28 | **CVV:** 111 **Número:** `4041650444437900`\ **Exp:** 03/28 | **CVV:** 111 **Número:** `5455460920094260`\ **Exp:** 03/28 | **CVV:** 111 **Número:** `5160030000000310`\ **Cod. Acción:** 000 | **CVV:** 111 **Número:** `5115422225052734`\ **Exp:** 03/28 | **CVV:** 111 **Número:** `371064649323968`\ **CVV:** 1111 **Número:** `371327381068590`\ **CVV:** 1111 **Número:** `36006616055724`\ **CVV:** 111 **Número:** `36344311372031`\ **CVV:** 111 ## Métodos Alternativos Simula pagos con billeteras digitales y transferencias bancarias. Para realizar pruebas con `QR` y `PagoEfectivo` mediante simuladoras, contacta al [equipo de integraciones](mailto:equipo.integraciones@pay-me.com). El equipo te indicará el flujo y los escenarios disponibles para tu comercio. Valida escenarios rápidos de aprobación y rechazo con número de teléfono y código. Simula autenticación y respuesta final con credenciales de prueba controladas. Prueba el flujo de financiamiento con un escenario sandbox disponible. Requiere coordinación con el equipo de integraciones para usar la simuladora correspondiente. Requiere coordinación con el equipo de integraciones para usar la simuladora correspondiente. **Teléfono:** `969929157`\ **Código de aprobación:** `557454` **Teléfono:** `999999999`\ **Código de aprobación:** `284563` **Tarjeta:** `123456`\ **Clave:** `123456`\ **Doc. Identidad:** `123456`\ **Token:** `123456` **Tarjeta:** `123456`\ **Clave:** `123456`\ **Doc. Identidad:** `123456`\ **Token:** `222222` **DNI:** `46699676`\ **Tarjeta:** `4557885801589196`\ **Clave:** `111111`\ **Monto (PEN):** `100.00` *** ### Tips de Integración * **Ambiente:** Asegúrate de que tu endpoint esté apuntando a `sandbox.api.tu-servicio.com`. * **CVV:** Para la mayoría de tarjetas en Sandbox, puedes usar `111` (o `1111` para Amex). * **Logs:** Revisa la consola de desarrollador para ver los códigos de respuesta detallados. # Estados de transacción Source: https://docs.pay-me.com/pagos/estados-de-transaccion Comprende los nueve estados y el recorrido de un intento de pago con un diagrama interactivo.
EL RECORRIDO DE UN PAGO

Un intento.
Un estado a la vez.

Una operación es la sesión de compra. Dentro de ella puede haber varios intentos de pago, y cada transacción conserva su propio estado.

Una operación · Una compraIntento 1: DenegadoIntento 2: AutorizadoDos intentos, no dos compras. Cambiar de estado tampoco crea otra transacción.
## Así cambia el estado Empieza con un pago aprobado. Después, compara qué cambia cuando el intento se deniega, se cancela o vence. Puedes seleccionar cada paso o reproducir el recorrido. ## Tres diferencias importantes **Autorizado:** el pago fue aprobado. **Liquidado:** la operación se presenta a la marca para su procesamiento en BASE2. La liquidación no confirma, por sí sola, un depósito en la cuenta del comercio. **Cancelado:** el usuario cancela antes de la autorización. **Extornado:** se anula una operación autorizada, durante el primer día y antes de su liquidación. El importe a restituir considera los gastos administrativos aplicables. **Denegado:** el emisor rechazó el pago. **Inválido:** una regla, validación o error impidió continuar. **Expirado:** venció el plazo sin respuesta del cliente, según el método de pago. En los tres casos el intento no se autorizó, pero la causa es distinta. [Entender operaciones e intentos](/pagos/operaciones-inteligentes) · [Consultar una transacción en la API](/payin/consulta) # Operaciones inteligentes Source: https://docs.pay-me.com/pagos/operaciones-inteligentes Una operación agrupa la sesión de compra; cada transacción representa un intento de pago. Aprende a relacionarlas sin duplicar pedidos ni confundir resultados.
EL NUEVO MODELO DE PAGOS

Una compra.
Todos sus intentos.

La operación reúne el contexto de la compra. Las transacciones cuentan qué ocurrió cada vez que el cliente intentó pagar.

## El cambio de enfoque En Pay-me, no debes leer cada transacción como si fuera una venta independiente. El modelo tiene dos niveles: | Nivel | Qué representa | Qué necesitas saber | | - | - | - | | **Operación** | La sesión o intención de compra que agrupa los intentos de pago. | ¿Qué compra estamos gestionando y cuál es su situación global? | | **Transacción** | Un intento individual dentro de esa operación, con su método, identificador, estado e historial. | ¿Qué pasó con este intento concreto? | **Una operación puede tener varias transacciones. Una transacción pertenece al contexto de una operación.** Cambiar de método o reintentar no convierte, por sí solo, la compra en otro pedido. “Sesión de compra” describe el contexto comercial. No significa que su vigencia sea idéntica a la de la pestaña del navegador, un token o un temporizador local. Respeta las condiciones de vigencia y reintento de tu integración. ## Los nombres de estado se leen en dos niveles Operación y transacción utilizan los mismos nombres de estado, pero describen **recursos distintos**. Por eso no basta con decir “está denegado”: debes precisar si hablas de la operación o de un intento. Los estados actuales son **Registrado, Pendiente, Autorizado, Inválido, Denegado, Extornado, Liquidado, Expirado y Cancelado**. El estado global de la operación y el de cada transacción deben conservarse por separado. **Abonado y Devuelto están previstos, pero todavía no están disponibles.** No los uses como condiciones obligatorias de tu integración. ## Mira cómo se conserva una misma compra Avanza por el ejemplo: dos intentos se rechazan y el tercero se autoriza. La operación y el pedido se mantienen; lo que crece es el historial de transacciones. La lectura correcta al terminar es **una compra de S/ 50.00 con tres intentos, uno de ellos autorizado**. No sumes los importes de los tres intentos como si fueran S/ 150.00 vendidos. ## Qué cambia para tu integración Relaciona la compra con su operación. No crees otro pedido únicamente porque un intento fue rechazado. Guarda cada transaction\_id y su resultado. No sobrescribas el intento anterior al registrar el siguiente. Distingue qué método se usó en cada intento, qué respuesta recibió y cuál terminó autorizado. Cuenta las compras por su contexto de operación y analiza autorizaciones, rechazos y ajustes por transacción. **Un intento pendiente no es un intento rechazado.** Ante un timeout, un QR o un CIP pendiente, consulta su resultado antes de promover otro cobro. No asumas que Pay-me canceló los demás intentos ni que evita automáticamente cualquier duplicidad. ## Cómo reconocer ambos niveles en la API En la [consulta de transacción](/payin/consulta), la respuesta contiene una estructura `operation` y una colección `transactions`. | Campo | Nivel | Uso | | - | - | - | | `merchant_operation_number` | Operación | Número de operación registrado por el comercio. Relaciónalo con el pedido de tu tienda. | | `operation.state` | Operación | Estado de la operación informado por la plataforma. No lo reemplaces automáticamente por el estado del último intento. | | `operation.transactions[].transaction_id` | Transacción | Identificador del intento que debes conservar para consultas y trazabilidad. | | `operation.transactions[].state` | Transacción | Estado actual de ese intento. | | `operation.transactions[].lifecycle` | Transacción | Historial de estados de ese intento; no es la lista de intentos de la operación. | **Dos listas distintas:** `transactions[]` agrupa transacciones; `lifecycle[]` agrupa eventos de una transacción. Que un intento pase por registrado, pendiente y autorizado no significa que existan tres intentos. La consulta documentada recibe `merchant_code`, `merchant_operation_number` y `transaction_id`. No supongas que una consulta filtrada por transacción devuelve necesariamente todo el historial de la operación. ### Ejemplo de estructura Fragmento simplificado basado en la consulta documentada. Los identificadores son ilustrativos; no es un request para copiar ni el catálogo completo de estados. ```json theme={"system"} { "operation": { "merchant_operation_number": "2391645", "state": "AUTORIZADO", "amount": "15000", "currency": "604", "transactions": [ { "transaction_id": "tx-ejemplo-01", "state": "AUTORIZADO", "lifecycle": [ { "state": "REGISTRADO" }, { "state": "PENDIENTE" }, { "state": "AUTORIZADO" } ] } ] } } ``` Aquí hay **una operación y una transacción con tres eventos**, no tres transacciones. En este contrato, el importe `15000` está expresado en centavos: equivale a S/ 150.00 con moneda `604` (PEN). ## Reglas para implementar sin confusiones 1. **Relaciona pedido y operación.** Conserva sus identificadores por separado; no presupongas que tienen el mismo formato. 2. **Registra cada intento.** Guarda `transaction_id`, método, estado y referencias necesarias para soporte. 3. **No deduzcas el pago de la interfaz.** Cerrar el checkout o recibir un callback no demuestra por sí mismo una aprobación. 4. **Confirma desde el backend.** Comprueba la operación, el intento, importe y moneda mediante la consulta o notificación correspondiente. 5. **Aplica cambios de forma idempotente.** Una notificación repetida o una consulta reiterada no deben duplicar la entrega ni volver a registrar la misma venta. 6. **Conserva el historial.** Un extorno o una devolución posterior no elimina la transacción que originó el pago. Mantener una operación para la misma compra no significa reenviar a ciegas la misma petición HTTP. Las reglas de reintento, expiración e idempotencia técnica dependen del endpoint y del canal utilizado. ## Comprueba que tu equipo lo entendió En el ejemplo hay una compra, una operación y tres transacciones. Solo una transacción terminó autorizada. No. Es una sola transacción que cambió de estado tres veces. Sus eventos comparten el mismo transaction\_id. No lo determines solo con ese dato. Revisa el estado de la operación y el contexto de sus intentos. No sobrescribas una compra ya confirmada con el rechazo de otro intento. Aprende qué significa cada resultado y qué debe hacer tu integración. # Parámetros para Autorización Source: https://docs.pay-me.com/parametros-para-autorizacion Para iniciar una autorización con el SDK, se debe invocar la función `initAuthorization`. ## Datos de Entrada El objeto `PMAuthorizationRequest` está compuesto por los siguientes atributos: ### PMAuthorizationRequest | Parámetro | Tipo | Obligatorio | Descripción | | :- | :- | :- | :- | | `operationNumber` | String | Sí | Número de operación único en la pasarela, utilizado para realizar la transacción. | | `amount` | String | Sí | Monto a cobrar expresado en centavos. La pasarela aplicará automáticamente el separador decimal. | | `currency` | String | Sí | Código de moneda según el estándar ISO-4217. | | `additionalFields` | Dictionary | No | Información adicional proporcionada por el comercio. | | `urlNotification` | String | No | URL donde se notificará el resultado de la transacción. | Los montos deben enviarse en centavos, sin separador decimal. ### Ejemplos de monto | Monto Real | Valor a Enviar | | :- | :- | | 0.50 | 50 | | 10.00 | 1000 | | 150.75 | 15075 | ## Datos de Salida El objeto `PMAuthorizationResponse` contiene el resultado de la autorización. ### PMAuthorizationResponse | Parámetro | Tipo | Obligatorio | Descripción | | :- | :- | :- | :- | | `success` | Boolean | Sí | Indica si el proceso fue exitoso. Tendrá el valor `true` cuando la operación se procese correctamente y `false` cuando ocurra algún error. | | `resultCode` | String | Sí | Código de resultado del procesamiento. | | `resultMessage` | String | Sí | Mensaje descriptivo asociado al resultado del procesamiento. | | `result` | TransactionResult | No | Objeto que contiene el detalle completo de la transacción. | ## TransactionResult | Parámetro | Tipo | Obligatorio | Descripción | | :- | :- | :- | :- | | `transactionID` | String | Sí | Identificador único de la transacción generado por Pay-me. | | `operationNumber` | String | Sí | Número de operación enviado por el comercio. | | `state` | String | Sí | Estado actual de la transacción. | | `stateReason` | String | Sí | Motivo asociado al estado de la transacción. | | `amount` | String | Sí | Monto autorizado. | | `currency` | String | Sí | Moneda utilizada en la autorización. | | `additionalFields` | Dictionary | No | Información adicional proporcionada por el comercio. | | `paymentMethod` | TransactionPaymentMethod | Sí | Información del método de pago utilizado. | | `processorResponse` | String | No | Cadena JSON que contiene la respuesta devuelta por la procesadora. | | `lifecycle` | TransactionLifecycle\[] | Sí | Historial de estados por los que pasó la transacción durante su ciclo de vida. | ## TransactionPaymentMethod | Parámetro | Tipo | Obligatorio | Descripción | | :- | :- | :- | :- | | `name` | String | Sí | Nombre del método de pago utilizado para la autorización. | | `methodDetail` | String | No | Cadena JSON con información adicional del método de pago utilizado. Disponible para métodos CARD y QR. | ## TransactionLifecycle | Parámetro | Tipo | Obligatorio | Descripción | | :- | :- | :- | :- | | `state` | String | Sí | Estado de la transacción. | | `utcDateTime` | String | Sí | Fecha y hora en formato UTC en la que la transacción cambió de estado. | | `unixTime` | String | Sí | Fecha y hora en formato UNIX en la que la transacción cambió de estado. | \ El arreglo `lifecycle` permite consultar el historial completo de cambios de estado de una transacción, facilitando tareas de auditoría, seguimiento y soporte. \ ## Ejemplo de Respuesta Exitosa ```text theme={"system"} { "success": true, "resultCode": "00", "resultMessage": "Transacción aprobada", "result": { "transactionID": "TRX123456789", "operationNumber": "OP987654321", "state": "AUTHORIZED", "stateReason": "Aprobada", "amount": "1000", "currency": "PEN", "paymentMethod": { "name": "CARD", "methodDetail": "{\"brand\":\"VISA\",\"maskedPan\":\"411111******1111\"}" }, "lifecycle": [ { "state": "AUTHORIZED", "utcDateTime": "2026-06-03T18:30:00Z", "unixTime": "1780501800" } ] } } ``` # Parámetros para consulta y extorno Source: https://docs.pay-me.com/parametros-para-consulta-y-extorno Para realizar una consulta o un extorno mediante el SDK, se deben invocar las funciones `startSearch` o `startReversal`, según la operación requerida. ## Datos de Entrada Estas funciones esperan los siguientes parámetros: | Parámetro | Tipo | Obligatorio | Descripción | | :- | :- | :- | :- | | `operationNumber` | String | Sí | Número de operación único generado por la pasarela y utilizado para identificar la transacción. | | `transactionID` | String | No | Identificador único de la transacción generado por Pay-me. | Para las operaciones de consulta `startSearch`), se puede utilizar el `operationNumber` o el `transactionID` para localizar la transacción. ## Datos de Salida La función de consulta devuelve un objeto `PMSearchResponse`. ### PMSearchResponse | Parámetro | Tipo | Obligatorio | Descripción | | :- | :- | :- | :- | | `success` | Boolean | Sí | Indica si el proceso fue ejecutado correctamente. | | `resultCode` | String | Sí | Código de resultado de la operación. | | `resultMessage` | String | Sí | Mensaje descriptivo asociado al resultado. | | `result` | OperationResult | No | Objeto que contiene el detalle de la operación consultada. | ## OperationResult | Parámetro | Tipo | Obligatorio | Descripción | | :- | :- | :- | :- | | `merchantOperationNumber` | String | Sí | Número de operación proporcionado por el comercio. | | `transactions` | TransactionDetail\[] | Sí | Lista de transacciones asociadas a la operación consultada. | ## TransactionDetail | Parámetro | Tipo | Obligatorio | Descripción | | :- | :- | :- | :- | | `transactionID` | String | Sí | Identificador único de la transacción generado por Pay-me. | | `state` | String | Sí | Estado actual de la transacción. | | `stateReason` | String | Sí | Motivo asociado al estado de la transacción. | | `amount` | String | Sí | Monto de la transacción. | | `currency` | String | Sí | Moneda utilizada en la transacción. | | `additionalFields` | Dictionary | No | Información adicional proporcionada por el comercio. | | `paymentMethod` | TransactionPaymentMethod | Sí | Información del método de pago utilizado. | | `processorResponse` | String | No | Cadena JSON con la respuesta devuelta por la procesadora. | | `lifecycle` | TransactionLifecycle\[] | Sí | Historial de estados por los que pasó la transacción. | ## TransactionPaymentMethod | Parámetro | Tipo | Obligatorio | Descripción | | :- | :- | :- | :- | | `name` | String | Sí | Método de pago utilizado en la transacción. | | `methodDetail` | String | No | Cadena JSON con información adicional del método de pago. Disponible para métodos CARD y QR. | ## TransactionLifecycle | Parámetro | Tipo | Obligatorio | Descripción | | :- | :- | :- | :- | | `state` | String | Sí | Estado de la transacción. | | `utcDateTime` | String | Sí | Fecha y hora en formato UTC en la que la transacción cambió de estado. | | `unixTime` | String | Sí | Fecha y hora en formato UNIX en la que la transacción cambió de estado. | El arreglo `lifecycle` permite conocer el historial completo de la transacción, incluyendo todos los cambios de estado registrados durante su procesamiento. ## Ejemplo de Respuesta ```text theme={"system"} { "success": true, "resultCode": "00", "resultMessage": "Consulta exitosa", "result": { "merchantOperationNumber": "ORDER-123456", "transactions": [ { "transactionID": "TRX987654321", "state": "AUTHORIZED", "stateReason": "Aprobada", "amount": "1000", "currency": "PEN", "paymentMethod": { "name": "CARD", "methodDetail": "{\"brand\":\"VISA\",\"maskedPan\":\"411111******1111\"}" }, "lifecycle": [ { "state": "AUTHORIZED", "utcDateTime": "2026-06-03T18:30:00Z", "unixTime": "1780501800" } ] } ] } } ``` # Parámetros para la impresión Source: https://docs.pay-me.com/parametros-para-la-impresion Para realizar una impresión mediante el SDK, se debe invocar la función `startPrint`. ## Datos de Entrada La función recibe una lista de elementos que serán enviados a la impresora. | Parámetro | Tipo | Obligatorio | Descripción | | :- | :- | :- | :- | | `elements` | List\ | Sí | Lista de elementos que serán impresos. | La impresión puede combinar distintos tipos de elementos, como texto, imágenes, líneas, códigos QR y códigos de barras, permitiendo construir comprobantes personalizados. *** ## PMPrintElement.Text Representa un bloque de texto simple. | Parámetro | Tipo | Obligatorio | Descripción | | :- | :- | :- | :- | | `content` | String | Sí | Texto a imprimir. | | `align` | Align | No | Alineación del texto (`LEFT`, `CENTER`, `RIGHT`). | | `width` | Int | No | Ancho en unidades personalizadas. Utilice `-1` para ajuste automático. | | `fontSize` | Int | No | Tamaño de fuente en puntos. | | `isBold` | Boolean | No | Indica si el texto debe imprimirse en negrita. | | `isUnderline` | Boolean | No | Indica si el texto debe imprimirse subrayado. | | `isReverseText` | Boolean | No | Invierte los colores de fondo y texto (modo negativo). | | `isItalic` | Boolean | No | Indica si el texto debe imprimirse en cursiva. | ## PMPrintElement.MultiText Permite imprimir múltiples textos en una misma línea. | Parámetro | Tipo | Obligatorio | Descripción | | :- | :- | :- | :- | | `items` | List\ | Sí | Lista de textos a imprimir. | ## PMPrintElement.Image Permite imprimir imágenes. | Parámetro | Tipo | Obligatorio | Descripción | | :- | :- | :- | :- | | `content` | Bitmap | Sí | Imagen a imprimir. | | `width` | Int | No | Ancho deseado de la imagen. | | `height` | Int | No | Alto deseado de la imagen. | | `align` | Align | No | Alineación de la imagen (`LEFT`, `CENTER`, `RIGHT`). | ## PMPrintElement.Line Permite imprimir líneas divisorias. | Parámetro | Tipo | Obligatorio | Descripción | | :- | :- | :- | :- | | `thickness` | Int | No | Grosor de la línea. | | `length` | Int | No | Longitud de la línea. | | `style` | LineStyle | No | Estilo de línea (`SOLID`, `DASHED`, `DOTTED`, `BLANK`). | ## PMPrintElement.QR Permite imprimir códigos QR. | Parámetro | Tipo | Obligatorio | Descripción | | :- | :- | :- | :- | | `content` | String | Sí | Información que será codificada dentro del código QR. | | `size` | Int | No | Tamaño del código QR en píxeles. | ## PMPrintElement.BarCode Permite imprimir códigos de barras. | Parámetro | Tipo | Obligatorio | Descripción | | :- | :- | :- | :- | | `type` | BarCodeType | Sí | Tipo de código de barras (`BARCODE_128`, `PDF417`, `BARCODE_39`). | | `content` | String | Sí | Información que será codificada en el código de barras. | | `size` | Int | No | Tamaño del código de barras. | ## Tipos de Alineación | Valor | Descripción | | :- | :- | | `LEFT` | Alineación a la izquierda. | | `CENTER` | Alineación centrada. | | `RIGHT` | Alineación a la derecha. | ## Tipos de Línea | Valor | Descripción | | :- | :- | | `SOLID` | Línea continua. | | `DASHED` | Línea segmentada. | | `DOTTED` | Línea punteada. | | `BLANK` | Espacio en blanco sin línea visible. | ## Tipos de Código de Barras | Valor | Descripción | | :- | :- | | `BARCODE_128` | Código de barras Code 128. | | `PDF417` | Código bidimensional PDF417. | | `BARCODE_39` | Código de barras Code 39. | Los elementos se imprimirán respetando el orden en el que son enviados dentro de la lista `elements`, permitiendo construir comprobantes completamente personalizados. ## Ejemplo de Comprobante ```text theme={"system"} listOf( PMPrintElement.Text( content = "PAY-ME", align = Align.CENTER, isBold = true, fontSize = 24 ), PMPrintElement.Line(), PMPrintElement.Text( content = "Operación aprobada" ), PMPrintElement.QR( content = "https://pay-me.com" ) ) ``` # Administración y Control Source: https://docs.pay-me.com/paymepos/administracion-y-control Gestión de catálogo, análisis de ventas y configuración avanzada del terminal. ## Catálogo de productos El catálogo permite optimizar el tiempo en caja configurando hasta **6 productos con precio fijo** para acceso directo desde la pantalla principal. ### Configuración de productos Sigue estos pasos para personalizar tu oferta de cobro rápido: Desde la pantalla principal, selecciona **Más Opciones** → **Catálogo**, o presiona **Editar** directamente en la sección de Cobro Rápido. Presiona el botón **"+"** para desplegar el formulario de creación. Elige uno de los **10 iconos temáticos** (café, comida, repostería, etc.) para facilitar la identificación visual del producto. Asigna un nombre descriptivo y el precio fijo en soles (S/). Al finalizar, el producto estará disponible inmediatamente en el menú de inicio. **Nota:** Puedes editar o eliminar productos existentes en cualquier momento tocándolos dentro de la lista del catálogo. *** ## Historial de ventas Consulta las transacciones recientes para mantener un control operativo del día. Por cada operación, el sistema registra: * **Marca:** Red de la tarjeta (Visa, Mastercard, etc.). * **Identificación:** Últimos 4 dígitos de la tarjeta utilizada. * **Monto:** Valor total de la transacción. * **Hora:** Registro exacto del momento del cobro. * **Estado:** Clasificación de la venta (Autorizado, Liquidado, Rechazado o Extornado). Al tocar cualquier transacción del historial, accederás al detalle completo con el código de autorización y la referencia bancaria. *** ## Reportes estadísticos **Acceso Administrativo:** Esta sección es exclusiva para usuarios con rol de **Administrador**. Visualiza el rendimiento de tu negocio mediante métricas clave y filtros temporales (Hoy, Ayer, Esta semana o Rango manual): * **Ingresos totales:** Suma de operaciones aprobadas y liquidadas. * **Cantidad de transacciones:** Volumen total de operaciones procesadas. * **Ticket promedio:** Valor medio por cada venta realizada. * **Distribución por método:** Comparativa porcentual de ingresos entre **Tarjeta** y **Código QR**. ### Pestañas de detalle Para un análisis profundo, el reporte se divide en: * **Resumen:** Vista general de ingresos y transacciones. * **Estados:** Distribución de ventas aprobadas vs. rechazadas. * **Actividad:** Línea de tiempo con el flujo de ventas durante el periodo. *** ## Configuración del terminal Ajusta los parámetros técnicos de tu terminal Wiseasy P5 según las necesidades de tu comercio: Establece límites de monto por transacción y personaliza los porcentajes de propina (por defecto 10% y 15%). Cambia la interfaz de la aplicación entre Español e Inglés (requiere reinicio). Consulta el número de serie, modelo del equipo y el ambiente de operación (Producción/Sandbox). Realiza una prueba de impresión para verificar el estado del hardware y el papel térmico. # Centro de Ayuda y Soporte Source: https://docs.pay-me.com/paymepos/centro-de-ayuda-y-soporte Resolución de dudas frecuentes y canales de asistencia técnica para tu terminal. ## Preguntas frecuentes (FAQ) Encuentra respuestas rápidas a las situaciones más comunes durante la operación diaria. Verifica que la tarjeta del cliente tenga fondos suficientes y esté habilitada para compras. Si el problema persiste, intenta con otro método de pago o contacta a soporte. No. Solo se pueden anular operaciones en estado **Autorizado**. Las operaciones ya liquidadas por el banco no pueden reversarse desde el terminal y deben gestionarse como devoluciones administrativas con tu administrador. El terminal intentará completar la operación automáticamente. Si la conexión no se restablece, la transacción se cancelará y no se realizará ningún cobro al cliente. El terminal requiere conexión activa para procesar pagos. Sin embargo, puedes consultar el historial de transacciones local y los reportes se sincronizarán en cuanto se recupere la señal. Por seguridad, las contraseñas se gestionan únicamente desde el panel de administración central. Contacta a tu administrador para solicitar una actualización de credenciales. El terminal envía automáticamente una "señal de vida" cada 15 minutos al servidor. Si aparece como "offline" en el dashboard, verifica la conexión Wi-Fi o la señal 4G del dispositivo. *** ## Soporte Técnico Si tienes un problema técnico con el hardware o una transacción específica, accede a la sección de **Soporte** desde el menú "Más Opciones". ### Canales de atención Llama a nuestra línea directa de soporte técnico para atención inmediata. Inicia una conversación con un asesor técnico directamente desde la aplicación. Envía tus consultas detalladas a nuestra cuenta de soporte oficial. Consulta el serial y versión del terminal en la pantalla de Soporte. **Antes de contactarnos:** Ten a la mano el **número de serie** del terminal (ubicado en la sección de Soporte) y una descripción detallada del problema para agilizar tu atención. ***
PayMe POS Versión 1.0.0 · Terminal Wiseasy P5 · © 2026 Alignet
# Configuración Inicial del POS Source: https://docs.pay-me.com/paymepos/configuracion-inicial Primeros pasos para operar tu terminal PayMe POS Wiseasy P5. Sigue estos pasos para poner en marcha tu terminal **Wiseasy P5** y comenzar a procesar ventas. Image Si ocurre un error durante esta fase, el sistema reintentará la conexión automáticamente. Asegúrate de contar con acceso a internet. ## 1. Preparación del Hardware Al recibir la caja de tu equipo, asegúrate de contar con el terminal Wiseasy P5 y su chip (SIM card) correspondiente. 1. **Insertar el chip:** Localiza la ranura en la parte trasera del terminal e inserta el chip de datos. 2. **Encendido:** Mantén presionado el botón de encendido hasta que la pantalla se ilumine. 3. **Conexión automática:** Una vez encendido, el POS detectará el chip y se conectará automáticamente a la red para vincularse con la aplicación **PayMe POS**. ## 2. Inicio y Acceso Al encender tu terminal, la aplicación **PayMe POS** se iniciará de forma automática. El proceso de acceso se divide en dos etapas clave: ### Inicialización (Splash Screen) Al abrir la app, visualizarás el logo de **PayMe POS** con una animación de carga. Durante este breve periodo, el sistema inicializa automáticamente los componentes de pago. > **Nota:** Si ocurre un error durante esta fase, el sistema reintentará la conexión automáticamente. Asegúrate de que el chip esté correctamente insertado y cuente con acceso a internet. ### Inicio de sesión Una vez completada la carga, deberás ingresar tus credenciales en la pantalla de login para comenzar a vender: * **Correo electrónico:** Ingresa la dirección de correo asignada por tu administrador. * **Contraseña:** Ingresa tu clave de acceso de forma segura. * **Botón Ingresar:** Presiona este botón para dirigirte al centro de operaciones. ## 3. Seguridad y Bloqueos Por motivos de seguridad, el sistema cuenta con medidas de protección de cuenta: * **Intentos limitados:** Ten en cuenta que los intentos fallidos de inicio de sesión son limitados. * **Bloqueo de seguridad:** Tras varios intentos fallidos, la cuenta puede bloquearse temporalmente. > **¿Necesitas ayuda?** Si tu cuenta ha sido bloqueada, por favor contacta a tu administrador para recuperar el acceso y generar una nueva clave si es necesario. **Bloqueo de seguridad:** Tras varios intentos fallidos, la cuenta puede bloquearse temporalmente. Si esto sucede, contacta a tu administrador para recuperar el acceso. *** ## Pantalla principal La pantalla principal es el centro de control desde donde gestionarás todas las operaciones de tu comercio. ### Interfaz superior En la barra superior encontrarás información crítica de tu sesión: * **Nombre del comercio:** Tu identidad comercial registrada. * **Código del terminal:** Identificador único (formato POS-XXXX). * **Usuario y Rol:** Tu nombre y nivel de acceso (Administrador u Operador). ### Funciones principales Accede rápidamente a las herramientas de venta y gestión: Ingresa montos manualmente para cobros sin productos predefinidos. Acceso directo a tus 6 productos más vendidos con precio fijo. Reversa operaciones mediante el número de transacción (Solo Admin). Consulta el historial detallado de las últimas transacciones. Estadísticas de rendimiento y métricas de venta (Solo Admin). Acceso al catálogo, configuración técnica y soporte. **Resumen de actividad:** En la parte inferior de la pantalla siempre verás los detalles de la última venta (marca, últimos 4 dígitos y monto). *** ## Roles y permisos El acceso a las funciones del terminal depende del rol asignado a tu cuenta: | Función | Administrador | Operador | | :- | :-: | :-: | | Realizar cobros y Cobro Rápido | ✅ | ✅ | | Ver historial de ventas | ✅ | ✅ | | Gestionar catálogo de productos | ✅ | ✅ | | **Anular operaciones** | ✅ | ❌ | | **Ver reportes estadísticos** | ✅ | ❌ | | **Configuración del terminal** | ✅ | ❌ | | Cerrar sesión | ✅ | ✅ | Los roles son fijos y se gestionan desde el panel de administración central. # Operaciones de Venta Source: https://docs.pay-me.com/paymepos/operaciones-de-venta Guía detallada para procesar pagos, gestionar propinas y realizar anulaciones en el terminal. ## Realizar un cobro El proceso de cobro en el terminal PayMe POS es simple y guiado para asegurar una operación rápida en el punto de venta. Utiliza el teclado numérico para ingresar el monto a cobrar en soles (S/). El sistema mostrará el valor en formato `S/ 0.00`. Una vez ingresado un monto mayor a cero, presiona el botón **Continuar**. Si la función está habilitada, se presentarán las opciones de propina al cliente antes de proceder al pago. Selecciona si el cliente pagará con **Tarjeta** (crédito/débito) o mediante **Código QR**. El terminal solicitará la interacción del cliente (acercar/insertar tarjeta o escanear QR) y procesará la transacción con el banco. La pantalla confirmará inmediatamente si la operación fue aprobada o rechazada. *** ## Métodos de pago admitidos El terminal Wiseasy P5 ofrece flexibilidad total para tus clientes: Compatible con Visa, Mastercard y más. Admite tres tipos de lectura: * **Contactless:** Acercar al lector NFC. * **Chip:** Insertar en la ranura inferior. * **Banda:** Deslizar en la ranura lateral. Genera un código dinámico en pantalla para pagos con **Yape, Plin** y otras aplicaciones compatibles. *** ## Gestión de Propinas Esta función permite al cliente reconocer el servicio recibido de forma digital. Las opciones disponibles son: | Opción | Descripción | | :- | :- | | **Sin propina** | Se procesa únicamente el monto original de la venta. | | **Porcentajes (10% / 15%)** | Cálculos automáticos basados en el monto de la venta. | | **Otro monto** | Permite al cliente ingresar una cifra específica manualmente. | Los porcentajes sugeridos y la activación de esta función se gestionan desde **Configuración → Configuración de Venta**. *** ## Estados de la transacción Tras el procesamiento, el terminal mostrará uno de los siguientes resultados visuales: ### ✅ Operación Aprobada Pantalla verde que confirma el éxito del cobro. Incluye: * Monto final y marca de tarjeta. * Últimos 4 dígitos de la tarjeta. * Código de autorización y número de operación. ### ❌ Operación Rechazada Pantalla roja que indica que el cobro no pudo completarse. Se mostrará un código de error y la descripción del motivo (ej. fondos insuficientes o tarjeta bloqueada). *** ## Anular una operación **Función restringida:** Solo los usuarios con rol de **Administrador** pueden realizar anulaciones. Para reversar un cobro autorizado que aún no ha sido liquidado, sigue estos pasos: 1. Selecciona **Anular** en la pantalla principal e ingresa el **número de operación**. 2. Presiona **Consultar** para recuperar los detalles de la transacción. 3. Verifica que el monto, tarjeta y fecha coincidan con la venta original. 4. Confirma la acción presionando **Confirmar Anulación**. Solo se pueden anular operaciones en estado **Autorizado**. Las operaciones ya liquidadas deben gestionarse como devoluciones administrativas. # POS Source: https://docs.pay-me.com/pos Autorización de transacciones POS mediante el endpoint POST /authorize. El servicio de autorización POS permite procesar pagos presenciales mediante el endpoint `POST /authorize`. Esta trama debe utilizarse cuando la transacción proviene de un canal presencial, como terminal POS, PinPad, dispositivo Android POS o integración de captura física de tarjeta. ## Endpoint ```http theme={"system"} POST /authorize ``` ## Request ```json theme={"system"} { "frame_type": "pos", "merchant_identifier": "b656d278-f047-4e23-9fa5-96c5818b5c8d", "brand": "visa", "payment_method": { "card": [ { "pan": "cifrado", "expiry_date": "cifrado", "card_sequence_number": "cifrado", "track1": "B4000222357994675^CHARLES^230420100558222222", "track2": "04000220130005421D230620100222222222" } ], "terminal": { "terminal_id": "POS00001", "pin_block": "7788E773618F7977" } }, "card_holder": [ { "first_name": "John", "last_name": "Smith" } ], "context": { "pos": { "pan_entry_mode": "05", "pin_entry_capability": "1", "condition_code": "00", "chip_condition_code": "0", "terminal_type": "0", "terminal_entry_capability": "0" } }, "merchant": { "card_acceptor": { "card_acceptor_name": "ABC Supplies", "address": { "country": "PE", "city": "LIMA" } } }, "transaction": { "currency": "604", "amount": "5000000", "meta": { "internal_operation_number": "123554", "additional_fields": {} } }, "icc_related_data": { "vsdc_chip_data": true, "app_interchange_profile": "1800", "dedicated_file_name": "A0000000980840", "terminal_verification_result": "8000048000", "icc_transaction_date": "220607", "icc_transaction_type": "00", "transaction_currency": "604", "authorized_amount": "5000000", "other_amount": "5000000", "issuer_app_data": "06020A03A00000", "terminal_country_code": "604", "app_cryptogram": "B9E652BBD8FE30E5", "terminal_capability_profile": "E0F8C8", "app_transaction_counter": "0151", "unpredictable_number": "D28971EC" } } ``` ## Descripción de campos | Campo | Tipo | Obligatorio | Longitud | Descripción | | - | - | - | - | - | | `frame_type` | string | Sí | enum | Canal de la transacción. Para POS debe enviarse `pos`. | | `merchant_identifier` | string UUID | Sí | 36 | Identificador único del comercio. Se entrega al registrar el comercio durante el onboarding. | | `brand` | string | Sí | enum | Marca de la tarjeta. Valores permitidos: `visa`, `mscd`. | | `payment_method.card[].pan` | string | Sí | 13-19 | Número de tarjeta cifrado. | | `payment_method.card[].expiry_date` | string | Sí | 4 | Fecha de expiración cifrada. | | `payment_method.card[].card_sequence_number` | string | No | 1-3 | Número de secuencia de tarjeta cifrado. | | `payment_method.card[].track1` | string | No | variable | Track 1 de banda magnética. | | `payment_method.card[].track2` | string | No | variable | Track 2 de banda magnética o chip. | | `payment_method.terminal.terminal_id` | string | Sí | 1-8 | Identificador del terminal POS. | | `payment_method.terminal.pin_block` | string | No | 16 | PIN cifrado en bloque TDEA. | | `card_holder[].first_name` | string | No | 1-26 | Nombre del tarjetahabiente. | | `card_holder[].last_name` | string | No | 1-26 | Apellido del tarjetahabiente. | | `context.pos.pan_entry_mode` | string | Sí | 2 | Modo de entrada PAN. `05` = chip, `07` = contactless, `90` = banda magnética, `01` = manual. | | `context.pos.pin_entry_capability` | string | Sí | 1 | Capacidad de captura de PIN. `0` = no puede capturar PIN, `1` = puede capturar PIN. | | `context.pos.condition_code` | string | Sí | 2 | Código de condición POS. `00` = transacción presencial normal. | | `context.pos.chip_condition_code` | string | No | 1 | Condición del chip. `0` = no aplica, `1` = chip no leído. | | `context.pos.terminal_type` | string | No | 1 | Tipo de terminal. | | `context.pos.terminal_entry_capability` | string | No | 1 | Capacidad de entrada del terminal. | | `merchant.card_acceptor.card_acceptor_name` | string | No | 1-25 | Nombre del comercio. Puede utilizarse como override. | | `merchant.card_acceptor.address.country` | string | No | 2 | País en formato ISO alpha-2. | | `merchant.card_acceptor.address.city` | string | No | 1-13 | Ciudad del comercio. | | `transaction.currency` | string | Sí | 3 | Código ISO 4217 numérico. Ejemplo: `604` = PEN, `840` = USD. | | `transaction.amount` | string | Sí | 6-17 | Monto de la operación sin decimales. | | `transaction.meta.internal_operation_number` | string | Sí | 1-40 | Referencia o número de operación del comercio. Debe ser único por comercio. | | `transaction.meta.additional_fields` | object | No | — | Campos libres enviados por el comercio en formato key-value. | | `icc_related_data.vsdc_chip_data` | boolean | Sí, si es chip | — | Indica que la transacción contiene datos EMV. | | `icc_related_data.app_interchange_profile` | string | Sí, si es chip | 4 hex | AIP, Application Interchange Profile del chip. | | `icc_related_data.dedicated_file_name` | string | Sí, si es chip | variable hex | AID de la aplicación. | | `icc_related_data.terminal_verification_result` | string | Sí, si es chip | 10 hex | TVR, Terminal Verification Result. | | `icc_related_data.icc_transaction_date` | string | Sí, si es chip | 6 | Fecha de transacción ICC en formato `YYMMDD`. | | `icc_related_data.icc_transaction_type` | string | Sí, si es chip | 2 | Tipo de transacción ICC. `00` = compra. | | `icc_related_data.transaction_currency` | string | Sí, si es chip | 3 | Código ISO 4217 numérico. | | `icc_related_data.authorized_amount` | string | Sí, si es chip | variable | Monto autorizado. | | `icc_related_data.other_amount` | string | No | variable | Monto adicional, por ejemplo cashback. | | `icc_related_data.issuer_app_data` | string | Sí, si es chip | variable hex | IAD, Issuer Application Data. | | `icc_related_data.terminal_country_code` | string | Sí, si es chip | 3 | País del terminal en formato ISO numérico. | | `icc_related_data.app_cryptogram` | string | Sí, si es chip | 16 hex | TC o ARQC generado por el chip. | | `icc_related_data.terminal_capability_profile` | string | Sí, si es chip | 6 hex | Capacidades del terminal. | | `icc_related_data.app_transaction_counter` | string | Sí, si es chip | 4 hex | ATC, Application Transaction Counter. | | `icc_related_data.unpredictable_number` | string | Sí, si es chip | 8 hex | Número aleatorio generado por el terminal. | ## Valores permitidos ### `frame_type` | Valor | Descripción | | - | - | | `pos` | Transacción presencial. | ### `brand` | Valor | Descripción | | - | - | | `visa` | Transacción con tarjeta Visa. | | `mscd` | Transacción con tarjeta Mastercard. | ### `context.pos.pan_entry_mode` | Valor | Descripción | | - | - | | `01` | Entrada manual. | | `05` | Lectura por chip. | | `07` | Contactless. | | `90` | Banda magnética. | ### `context.pos.pin_entry_capability` | Valor | Descripción | | - | - | | `0` | El terminal no puede capturar PIN. | | `1` | El terminal puede capturar PIN. | ### `context.pos.condition_code` | Valor | Descripción | | - | - | | `00` | Transacción presencial normal. | ### `context.pos.chip_condition_code` | Valor | Descripción | | - | - | | `0` | No aplica. | | `1` | Chip no leído. | *** ## Objeto `payment_method.card` Contiene la información de la tarjeta utilizada en la transacción POS. ```json theme={"system"} { "card": [ { "pan": "cifrado", "expiry_date": "cifrado", "card_sequence_number": "cifrado", "track1": "B4000222357994675^CHARLES^230420100558222222", "track2": "04000220130005421D230620100222222222" } ] } ``` | Campo | Cifrado requerido | Descripción | | - | - | - | | `pan` | Sí | Número de tarjeta cifrado. | | `expiry_date` | Sí | Fecha de expiración cifrada. | | `card_sequence_number` | Sí, cuando aplique | Número de secuencia de tarjeta cifrado. | | `track1` | No | Track 1 de banda magnética. | | `track2` | No | Track 2 de banda magnética o chip. | ## Objeto `payment_method.terminal` Contiene la información del terminal POS utilizado para capturar la transacción. ```json theme={"system"} { "terminal": { "terminal_id": "POS00001", "pin_block": "7788E773618F7977" } } ``` | Campo | Descripción | | - | - | | `terminal_id` | Identificador del terminal POS. | | `pin_block` | PIN cifrado en bloque TDEA. Debe enviarse cuando la operación requiera PIN. | ## Objeto `context.pos` Contiene información del contexto de captura POS. ```json theme={"system"} { "context": { "pos": { "pan_entry_mode": "05", "pin_entry_capability": "1", "condition_code": "00", "chip_condition_code": "0", "terminal_type": "0", "terminal_entry_capability": "0" } } } ``` | Campo | Descripción | | - | - | | `pan_entry_mode` | Modo de captura de la tarjeta. Debe reflejar el mecanismo real de captura. | | `pin_entry_capability` | Indica si el terminal tiene capacidad de capturar PIN. | | `condition_code` | Condición bajo la cual se realiza la transacción POS. | | `chip_condition_code` | Condición de lectura del chip, cuando aplique. | | `terminal_type` | Tipo de terminal utilizado. | | `terminal_entry_capability` | Capacidad de entrada del terminal. | ## Objeto `merchant.card_acceptor` Permite enviar información referencial del comercio o realizar un override de datos de aceptación. ```json theme={"system"} { "merchant": { "card_acceptor": { "card_acceptor_name": "ABC Supplies", "address": { "country": "PE", "city": "LIMA" } } } } ``` | Campo | Descripción | | - | - | | `card_acceptor_name` | Nombre del comercio o nombre de aceptación. | | `address.country` | País en formato ISO alpha-2. | | `address.city` | Ciudad del comercio. | ## Objeto `transaction` Contiene la información transaccional de monto, moneda y referencia del comercio. ```json theme={"system"} { "transaction": { "currency": "604", "amount": "5000000", "meta": { "internal_operation_number": "123554", "additional_fields": {} } } } ``` | Campo | Descripción | | - | - | | `currency` | Código ISO 4217 numérico. | | `amount` | Monto sin decimales. | | `meta.internal_operation_number` | Referencia o número de operación del comercio. | | `meta.additional_fields` | Campos libres enviados por el comercio en formato key-value. | ## Objeto `icc_related_data` El objeto `icc_related_data` debe enviarse cuando la transacción sea chip o contactless EMV. ```json theme={"system"} { "icc_related_data": { "vsdc_chip_data": true, "app_interchange_profile": "1800", "dedicated_file_name": "A0000000980840", "terminal_verification_result": "8000048000", "icc_transaction_date": "220607", "icc_transaction_type": "00", "transaction_currency": "604", "authorized_amount": "5000000", "other_amount": "5000000", "issuer_app_data": "06020A03A00000", "terminal_country_code": "604", "app_cryptogram": "B9E652BBD8FE30E5", "terminal_capability_profile": "E0F8C8", "app_transaction_counter": "0151", "unpredictable_number": "D28971EC" } } ``` | Campo | Descripción | | - | - | | `vsdc_chip_data` | Indica que la transacción contiene datos EMV. | | `app_interchange_profile` | AIP, Application Interchange Profile del chip. | | `dedicated_file_name` | AID de la aplicación. | | `terminal_verification_result` | TVR, Terminal Verification Result. | | `icc_transaction_date` | Fecha de transacción ICC en formato `YYMMDD`. | | `icc_transaction_type` | Tipo de transacción ICC. `00` = compra. | | `transaction_currency` | Código ISO 4217 numérico. | | `authorized_amount` | Monto autorizado. | | `other_amount` | Monto adicional, por ejemplo cashback. | | `issuer_app_data` | IAD, Issuer Application Data. | | `terminal_country_code` | País del terminal en formato ISO numérico. | | `app_cryptogram` | TC o ARQC generado por el chip. | | `terminal_capability_profile` | Capacidades del terminal. | | `app_transaction_counter` | ATC, Application Transaction Counter. | | `unpredictable_number` | Número aleatorio generado por el terminal. | ## Consideraciones sobre montos El campo `transaction.amount` debe enviarse sin punto decimal. El monto se calcula aplicando el exponente de la moneda: ```text theme={"system"} Monto enviado = monto real × 10^exponente de la moneda ``` Ejemplo para moneda PEN: | Monto real | Currency | Valor enviado | | -: | - | -: | | 10.00 | `604` | `1000` | | 389.80 | `604` | `38980` | | 50,000.00 | `604` | `5000000` | ## Consideraciones sobre moneda El campo `transaction.currency` debe enviarse en formato ISO 4217 numérico. | Moneda | Código ISO 4217 numérico | | - | - | | PEN | `604` | | USD | `840` | *** ## Consideraciones sobre tarjeta Los datos sensibles de tarjeta deben enviarse cifrados. | Campo | Cifrado requerido | | - | - | | `payment_method.card[].pan` | Sí | | `payment_method.card[].expiry_date` | Sí | | `payment_method.card[].card_sequence_number` | Sí, cuando aplique | ## Consideraciones sobre EMV Para operaciones chip o contactless EMV, debe enviarse el objeto `icc_related_data`. | Tipo de captura | Requiere `icc_related_data` | | - | - | | Chip | Sí | | Contactless EMV | Sí | | Banda magnética | No | | Manual | No | ## Validaciones principales Antes de enviar una autorización POS, validar lo siguiente: | Validación | Regla | | - | - | | Comercio | `merchant_identifier` debe estar activo y habilitado para operar. | | Canal | `frame_type` debe ser `pos`. | | Marca | `brand` debe ser `visa` o `mscd`. | | Terminal | `payment_method.terminal.terminal_id` debe estar registrado y habilitado. | | Operación | `transaction.meta.internal_operation_number` debe ser único por comercio. | | Monto | `transaction.amount` debe enviarse sin decimales. | | Moneda | `transaction.currency` debe enviarse en formato ISO 4217 numérico. | | Tarjeta | Los campos sensibles deben enviarse cifrados. | | PAN Entry Mode | `context.pos.pan_entry_mode` debe corresponder al modo real de captura. | | PIN Capability | `context.pos.pin_entry_capability` debe corresponder a la capacidad real del terminal. | | ICC | Si la operación es chip o contactless EMV, debe enviarse `icc_related_data`. | ## Ejemplo mínimo El siguiente ejemplo muestra una autorización POS sin información EMV. ```json theme={"system"} { "frame_type": "pos", "merchant_identifier": "b656d278-f047-4e23-9fa5-96c5818b5c8d", "brand": "visa", "payment_method": { "card": [ { "pan": "cifrado", "expiry_date": "cifrado" } ], "terminal": { "terminal_id": "POS00001" } }, "context": { "pos": { "pan_entry_mode": "01", "pin_entry_capability": "0", "condition_code": "00" } }, "transaction": { "currency": "604", "amount": "1000", "meta": { "internal_operation_number": "POS-000000001" } } } ``` ## Ejemplo con chip EMV ```json theme={"system"} { "frame_type": "pos", "merchant_identifier": "b656d278-f047-4e23-9fa5-96c5818b5c8d", "brand": "visa", "payment_method": { "card": [ { "pan": "cifrado", "expiry_date": "cifrado", "card_sequence_number": "cifrado", "track2": "04000220130005421D230620100222222222" } ], "terminal": { "terminal_id": "POS00001", "pin_block": "7788E773618F7977" } }, "context": { "pos": { "pan_entry_mode": "05", "pin_entry_capability": "1", "condition_code": "00", "chip_condition_code": "0", "terminal_type": "0", "terminal_entry_capability": "0" } }, "transaction": { "currency": "604", "amount": "5000000", "meta": { "internal_operation_number": "POS-000000002", "additional_fields": {} } }, "icc_related_data": { "vsdc_chip_data": true, "app_interchange_profile": "1800", "dedicated_file_name": "A0000000980840", "terminal_verification_result": "8000048000", "icc_transaction_date": "220607", "icc_transaction_type": "00", "transaction_currency": "604", "authorized_amount": "5000000", "other_amount": "0", "issuer_app_data": "06020A03A00000", "terminal_country_code": "604", "app_cryptogram": "B9E652BBD8FE30E5", "terminal_capability_profile": "E0F8C8", "app_transaction_counter": "0151", "unpredictable_number": "D28971EC" } } ``` ## Response La respuesta de una autorización POS se encuentra documentada en la página de respuesta general para autorizaciones. Ver estructura de respuesta para Ecommerce y POS. # Buenas prácticas generales Source: https://docs.pay-me.com/primeros-pasos/buenas-practicas Protege los accesos, verifica las operaciones y conserva la trazabilidad de tu integración con Pay-me.

SEGURIDAD / BUENAS PRÁCTICAS

La confianza tambiénse integra.

Protege cada acceso. Confirma cada operación. Diseña una integración que puedas entender y acompañar cuando algo no salga como esperas.

SEGURIDAD EN CADA CAPA

✓
01
Accesos privadosSecretos en tu servidor
02
Estado verificadoAntes de confirmar la venta
03
Rastro de la operaciónSin exponer datos sensibles

Controles complementarios.
Ninguno sustituye a los demás.

## Tres principios para empezar
01 / PROTEGE

Secretos en el servidor.

Las credenciales privadas nunca forman parte del navegador, la app ni el repositorio.

02 / VERIFICA

El estado, desde backend.

La respuesta visual no basta para confirmar una venta o entregar un pedido.

03 / REGISTRA

Trazabilidad sin exponer.

Relaciona pedido y operación. Registra lo necesario, no los datos sensibles.

## Aplica los controles * Guarda Client Secret, llaves privadas y tokens sensibles en variables de entorno o un gestor de secretos del servidor. * Mantén separadas las configuraciones de sandbox y producción. * Ejecuta las operaciones sensibles desde backend mediante HTTPS y limita el acceso a las credenciales. * No incluyas secretos en URLs, capturas, mensajes de soporte ni registros. Ante una exposición, coordina su revocación o rotación. * Relaciona el identificador de tu pedido con el de la operación de Pay-me. * Verifica desde backend el estado mediante el mecanismo documentado para tu integración. * Comprueba la correspondencia del pedido, importe y moneda antes de actualizar tu sistema. * Trata los estados pendientes o inciertos como tales. Un timeout no demuestra que un pago haya sido rechazado. * Cuando tu flujo utilice notificaciones, valida su autenticidad según la guía específica del canal. * Evita procesar dos veces un mismo evento o ejecutar dos veces la entrega de un pedido. * Contempla eventos duplicados o fuera de orden, y conserva estados coherentes en tu sistema. * Antes de repetir una operación con resultado incierto, consulta o reconcilia su estado según el flujo documentado. * Conserva identificadores, fecha, entorno, código de respuesta y resultado esperado para investigar incidencias. * Enmascara los datos personales necesarios. No registres CVV, números completos de tarjeta, secretos ni tokens sensibles. * Define alertas para errores repetidos, timeouts o variaciones inusuales en los resultados. * Prueba los medios de pago habilitados y los escenarios aplicables: aprobación, rechazo, pendiente, expiración y error controlado. ## Aterrízalo en tu canal Esta base es transversal. Los mecanismos concretos, parámetros y responsabilidades dependen de tu integración. Plugins, pedidos y operación de tu tienda. Flex, callbacks y experiencia de pago web. Sesiones, callbacks y pruebas en dispositivos. Autenticación, respuestas y responsabilidades del servidor. ## El siguiente paso Ejecuta los escenarios de tu canal, reúne evidencias y coordina la certificación. # Checklist de certificación Source: https://docs.pay-me.com/primeros-pasos/checklist-de-certificacion Prueba tu integración, reúne evidencias y coordina la validación antes de operar en producción con Pay-me.

PRUEBAS Y PRODUCCIÓN / CERTIFICACIÓN

Prueba con criterio.Lanza con confianza.

Valida el recorrido completo del pago y prepara las evidencias para la revisión técnica. Esta es tu ruta; los requisitos específicos están en la guía de tu canal.

COBERTURA DE TUS PRUEBAS

✓AprobaciónConfirma el pedido
×RechazoControla la respuesta
◷PendienteConserva el estado
↻RecuperaciónResuelve la incertidumbre
Evidencia por escenario
IDENTIFICADORPedido ↔ OperaciónRESULTADOEsperado ↔ Obtenido

Esquema ilustrativo, no una aprobación.
Valida los casos aplicables a tu canal.

## Elige tu checklist técnico Completa los criterios específicos del canal que implementaste, además de las verificaciones generales de esta página. WooCommerce, PrestaShop y VTEX. Flujos de Flex y Modal. Aplicaciones Android e iOS. Integración de servidor a servidor. ## 01 · Valida en sandbox | Qué comprobar | Evidencia que debes conservar | | - | - | | Pago aprobado de principio a fin | Pedido, identificador de operación y estado confirmado en backend. | | Rechazo y errores controlados | Respuesta recibida, mensaje al cliente y estado correcto del pedido. | | Pendiente o expiración, cuando aplique | Transiciones de estado y tratamiento del pedido sin confirmar antes de tiempo. | | Cada medio de pago habilitado | Resultado de los escenarios que correspondan a tu comercio. | | Retorno, cancelación o interrupción del flujo | Comportamiento del canal y recuperación de un resultado incierto. | Utiliza los datos y escenarios de prueba documentados para tu integración. Si un caso no está disponible en sandbox, coordina su validación con el equipo de integraciones. ## 02 · Revisa la implementación * Configuración de autenticación y renovación de tokens según el canal. * Separación de credenciales y endpoints por entorno. * Identificadores de pedido, importe, moneda y demás parámetros válidos según la API utilizada. * URLs de retorno y notificación configuradas cuando correspondan. * HTTPS y protección de endpoints críticos; secretos fuera del frontend. * Recepción de los eventos previstos por tu integración, cuando aplique. * Validación de autenticidad según el mecanismo documentado. * Procesamiento idempotente: un evento duplicado no duplica acciones. * Manejo de eventos fuera de orden y actualización consistente del pedido. * Verificación del resultado desde backend antes de confirmar la venta. * Manejo de respuestas inesperadas, timeouts y excepciones. * Consulta o reconciliación de operaciones con resultado incierto antes de reintentarlas. * Relación trazable entre pedido y operación de Pay-me. * Registros y alertas suficientes para investigar incidencias, sin secretos ni datos sensibles de tarjeta. ## 03 · Prepara las evidencias

UN CASO, UN RESULTADO COMPROBABLE

Haz que la revisión sea clara.

Por cada escenario, reúne el entorno y la fecha, el canal y versión, el identificador del pedido y de la operación, el resultado esperado y el obtenido. Añade registros o capturas enmascarados cuando ayuden a explicar el comportamiento.

Si una prueba falla: registra el hallazgo, corrige la causa y vuelve a ejecutar el escenario antes de presentarlo como completado.

No compartas Client Secret, tokens sensibles, CVV ni números completos de tarjeta. La evidencia debe permitir revisar el caso sin exponer credenciales o datos de pago. Coordina con el equipo de integraciones los escenarios exigidos y el formato de entrega. Esta página no sustituye la revisión técnica ni representa una aprobación automática. ## 04 · Coordina la salida a producción Las pruebas en producción pueden generar cargos reales. Ejecútalas únicamente tras recibir la habilitación y credenciales correspondientes, y con el alcance acordado con el equipo de integraciones. Antes de la salida, confirma: * Configuración productiva revisada, sin datos ni credenciales de sandbox. * Flujo completo validado según el plan de pruebas controladas acordado. * Notificaciones y consistencia del pedido comprobadas, cuando apliquen. * Medios de pago habilitados revisados y monitoreo operativo preparado. * Confirmación de aprobación y pasos de activación por parte del equipo de integraciones. ## Continúa con apoyo Protección de accesos, validación y trazabilidad. Comparte tu canal y el estado de las pruebas, sin enviar secretos. # Arquitectura, red y seguridad Source: https://docs.pay-me.com/procesamiento-fisico/alignet-transit/arquitectura-y-trazabilidad Componentes, responsabilidades, direccionamiento local, configuración inicial y protección de datos. ## Arquitectura ```mermaid theme={"system"} flowchart TD CENTRAL[Sistema central] -->|HTTP local| PINPAD[Pay-me PinPAD] PINPAD --> SDK[SDK del P5L] SDK --> INTERACTION[Tarjeta o QR] SDK --> PLATFORM[Pasarela y procesador] CENTRAL -->|GET payments: consulta a pasarela| PINPAD ``` El sistema central inicia todas las llamadas hacia la IP y el puerto configurados en el Wiseasy P5L. Pay-me PinPAD muestra la pantalla de pago, coordina la tarjeta o genera el QR con su transacción pendiente, procesa el pago y devuelve la respuesta cruda del SDK en autorización. La consulta del cobro lee la pasarela; cancelación y extorno usan modelos propios con `status`. La comunicación de Pay-me PinPAD con el procesador o banco es transparente para el sistema central. ## Responsabilidades | Componente | Responsabilidades | | - | - | | Sistema central del comercio — **cliente HTTP** | Calcular el monto, generar y persistir `operationNumber`, enviar solicitudes, configurar timeouts, interpretar respuestas, recuperar operaciones pendientes y aplicar la decisión de negocio. Puede ser un POS, caja, backend o SCC. | | Pay-me PinPAD — **servidor HTTP** | Escuchar en la red local, validar el JSON, asegurar idempotencia y exclusión mutua, coordinar la interacción de pago y conservar el resultado por operación. | | Wiseasy P5L y SDK | Leer tarjeta contactless, chip o banda, capturar PIN cuando corresponda y comunicarse con la plataforma de pagos. No requieren integración directa con el sistema central. | | Procesador o banco | Aprobar o rechazar la transacción. No tiene una interfaz directa con el sistema central. | ## Requisitos de red Antes de integrar, verifica lo siguiente: * El sistema central y el Wiseasy P5L están en la misma red local y existe conectividad entre ambos. * El punto de acceso no usa **AP Isolation** o **Client Isolation** entre el sistema central y el terminal. * El puerto TCP configurado en Pay-me PinPAD es accesible desde el sistema central. El valor predeterminado es `8080`. * El terminal mantiene una IP estable, preferiblemente mediante una reserva DHCP o una dirección estática. * Las reglas de firewall permiten tráfico desde el sistema central hacia la IP y el puerto del terminal. * La aplicación Pay-me PinPAD permanece abierta y en estado listo durante la operación. La URL base sigue este formato: ```text theme={"system"} http://: ``` Ejemplo: ```text theme={"system"} http://: ``` La dirección del ejemplo es ilustrativa. Confirma la IP y el puerto de cada terminal. Si cambia la IP del Wiseasy P5L, actualiza la configuración del sistema central. ### Verificación desde el sistema central Primero verifica alcance IP y después la aplicación: ```bash theme={"system"} ping "" curl --header "Connection: close" "http://:/health" ``` Una respuesta válida de la aplicación es: ```json theme={"system"} { "status": "UP", "service": "Alignet ECR" } ``` Si `ping` responde pero `GET /health` no, revisa el puerto, el firewall y que Pay-me PinPAD esté abierta. Algunos entornos bloquean ICMP; en ese caso, usa `GET /health` como prueba definitiva de la aplicación. La [configuración inicial](/procesamiento-fisico/alignet-transit/configuracion#configurar-pay-me-pinpad) se realiza una vez por terminal e incluye la IP, el puerto, la verificación de conectividad y la inyección de llaves. Todas las respuestas usan `Connection: close`: abre una conexión por petición y no reutilices keep-alive. Usa un timeout superior a aproximadamente 90 segundos en los POST y cubre los 12–15 segundos de la consulta a la pasarela. ## Trazabilidad Por cada intento, registra únicamente información no sensible: * `operationNumber`; * `amount`, `currency` y `paymentMethod` enviados; * código HTTP recibido; * `success`, `resultCode`, `resultMessage` y `result.state` o `transaction.state` en cobro; * `status`, `authorizationCode` y `completedAt` en cancelación o extorno, cuando existan; * `transactionID` de autorización o `transactionId` y `authorizationCode` de consulta, cuando existan; * fecha y hora del envío, la respuesta y las consultas; * timeouts, pérdidas de conexión y reintentos de consulta; * solicitud de cancelación, cierre visual y consultas posteriores; * resultado de cancelación y evidencia del extorno CARD independiente, registrados por separado del cobro. La autorización puede incluir `transactionID`, `paymentMethod`, `stateReason`, `processorResponse` y `lifecycle` dentro de `result`. La consulta devuelve `transaction` y no expone `processorResponse` ni `methodDetail` crudos. Consulta el [contrato por endpoint](/procesamiento-fisico/alignet-transit/respuesta-estados-y-codigos) y sanitiza las evidencias. ## Seguridad y protección de datos * Mantén la red local controlada y restringe el puerto a los sistemas autorizados mediante segmentación y reglas de firewall. * No expongas el puerto de Pay-me PinPAD a Internet. * No incluyas nombres, documentos, placa u otros datos personales dentro de `operationNumber`. * No registres PAN completo, CVV, PIN, PIN Block, Track 1, Track 2 ni datos EMV sensibles. * Protege los logs y limita su acceso según la política de retención de tu organización. * Conserva `operationNumber` y `authorizationCode` para conciliación y comprobantes. La versión vigente documenta HTTP dentro de la red local y no define headers de autenticación para la interfaz entre el sistema central y Pay-me PinPAD. Consulta [Autenticación y control de acceso](/procesamiento-fisico/alignet-transit/autenticacion) antes de incorporar controles adicionales. # Autenticación y control de acceso Source: https://docs.pay-me.com/procesamiento-fisico/alignet-transit/autenticacion Controles de acceso aplicables a la interfaz local entre el sistema central y Pay-me PinPAD. La interfaz vigente de Pay-me Transit PinPAD opera mediante HTTP dentro de la red local. El contrato documentado **no define credenciales, tokens, certificados de cliente ni headers de autenticación** para las solicitudes entre el sistema central y Pay-me PinPAD. No envíes un header `Authorization` ni agregues un esquema de firma por iniciativa propia. Un control no previsto por Pay-me PinPAD puede hacer que la integración no sea compatible. La ausencia de autenticación a nivel de aplicación no convierte el endpoint en un servicio público. No expongas la IP ni el puerto del terminal a Internet o a redes no autorizadas. ## Controles requeridos en la red * Ubica el sistema central y el Wiseasy P5L en una red local controlada. * Restringe el puerto TCP del terminal a los orígenes autorizados mediante segmentación y reglas de firewall. * Desactiva **AP Isolation** o **Client Isolation** únicamente cuando impida la comunicación requerida entre los equipos autorizados. * Mantén una IP estable para el terminal mediante reserva DHCP o configuración estática. * Protege los logs y los datos de conciliación de acuerdo con la política de acceso y retención del comercio. * No registres PAN completo, CVV, PIN, PIN Block, pistas ni datos EMV sensibles. ## Headers de la interfaz | Header | Operación | Uso | | - | - | - | | `Content-Type: application/json` | `POST /authorize`, `POST /cancel` y `POST /reversals` | Obligatorio para enviar el cuerpo JSON. | | `Connection: close` | Todas las respuestas | Abre una conexión por petición; no reutilices keep-alive. | | `Cache-Control: no-store` | Todas las respuestas | Evita reutilizar una respuesta guardada en caché. | | `Retry-After: 2` | Todas las respuestas HTTP `202` | Espera dos segundos antes de consultar el cobro o extorno correspondiente. | | `Authorization` | Todas | No forma parte del contrato vigente. | ## Controles adicionales Si la política de seguridad del comercio exige TLS, autenticación de red, VPN, proxy o filtrado adicional, coordina el diseño con Alignet antes de implementarlo. La documentación disponible no define HTTPS ni autenticación mutua en el Wiseasy P5L y no permite asegurar que un intermediario sea compatible sin validación. Revisa los métodos, rutas, cuerpos y respuestas disponibles. # Cancelación de una autorización en curso Source: https://docs.pay-me.com/procesamiento-fisico/alignet-transit/cancelacion Cancelación validada y recuperación del cobro original ante fallos o incertidumbre. `POST /cancel` solicita cancelar una autorización activa. El servicio debe comprobar que la cancelación se ejecutó y que el resultado corresponde al `operationNumber` solicitado. Cerrar la pantalla del POS no confirma la cancelación. Si no se ejecutó o el resultado corresponde a otra operación, el servicio debe devolver un error, sin informar éxito. ## CARD `POST /authorize` inicia el cobro y el PinPAD solicita la tarjeta. Si la cancelación falla y el cobro original queda `transaction.state: "AUTORIZADO"` en una consulta `200/00`, puedes evaluar un [extorno independiente](/procesamiento-fisico/alignet-transit/extorno). Un error de `/cancel` no ejecuta automáticamente `/reversals`. ```mermaid theme={"system"} flowchart TD A[Cobro con tarjeta] --> B[Solicitar cancelación] B -->|Confirmada| C[Operación cancelada] B -->|No se confirmó| D[Consultar pasarela: transaction.state] D -->|200 y 00: AUTORIZADO| E[Evaluar extorno CARD] D -->|Otro desenlace financiero confirmado| F[Registrar desenlace] D -->|03 o 05 o 503 o 504| G[Consultar de nuevo o escalar] D -->|Sin confirmar| D ``` ## QR Al generar el QR ya existe una transacción pendiente asociada al `operationNumber`. Mostrar o escanear el código no confirma el pago. En QR, `/cancel` solo cancela o inhabilita el código. Ni `/cancel` ni refund devuelven un monto pagado; `/reversals` aplica únicamente a CARD. ```mermaid theme={"system"} flowchart TD A[Generar QR] --> B[QR pendiente] B -->|Pago aprobado| C[Pago aprobado] B --> D[Solicitar cancelación] D -->|Confirmada| E[QR cancelado] D -->|No se confirmó| F[Consultar pasarela: transaction.state] F -->|200 y 00: AUTORIZADO| C F -->|Otro desenlace financiero confirmado| G[Registrar desenlace] F -->|03 o 05 o 503 o 504| H[Consultar de nuevo o escalar] F -->|Sin confirmar| F ``` Si recuperas un QR `transaction.state: "AUTORIZADO"` en una consulta `200/00`, conserva el pago aprobado. No lo marques como cancelado, devuelto ni extornado; registra la discrepancia para revisión. ## Solicitud Envía al mismo PinPAD de la autorización original: ```http theme={"system"} POST /cancel Content-Type: application/json Connection: close ``` ```json theme={"system"} { "operationNumber": "44992528" } ``` | Campo | Tipo | Obligatorio | Uso | | - | - | - | - | | `operationNumber` | String | Sí | Referencia original: 1–64 caracteres sin espacios (`^\S{1,64}$`). | No generes otra referencia ni envíes monto, moneda, método o datos de tarjeta. ```bash theme={"system"} curl --header "Connection: close" -i --request POST "http://:/cancel" \ --header "Content-Type: application/json" \ --max-time 110 \ --data '{"operationNumber":"44992528"}' ``` ## Resultados por método Estas reglas aplican a CARD y QR. Evalúa el estado, el código y la validación del servicio; HTTP `200` por sí solo no confirma éxito. | HTTP | `status` y `resultCode` | Acción | | - | - | - | | `200` | `CANCELLED` con `00`, `16` o `17` | Cancelación confirmada o éxito equivalente, validado por el servicio. No exige otra consulta para reconocerla. | | `200` | `DENIED` con `14`, `15`, `18`, `19`, `20`, `01`, `03` u otro código SDK | Cancelación rechazada o abandonada. Consulta el cobro original; no marques cancelación exitosa. | | `202` | `PENDING` con `P22` | Resultado todavía no confirmado. Consulta el cobro original; este GET no informa el desenlace de `/cancel`. | | `404` | `ERROR/NOT_FOUND` | Venta inexistente o resultado SDK `05/07`. Verifica referencia y terminal. | | `409` | `ERROR/CANCELLATION_IN_PROGRESS` | Ya hay una cancelación de esa referencia en curso. No envíes otra. | | `503` | `ERROR/POS_NOT_AVAILABLE` | Restablece SDK o pantalla disponible; consulta el cobro antes de decidir otro envío. | | `400` | `ERROR/BAD_REQUEST` | Corrige el JSON. | Reenviar una cancelación ya finalizada devuelve el resultado guardado; una segunda cancelación en curso devuelve `409 CANCELLATION_IN_PROGRESS`. Ejemplos de campos de decisión, sin representar pruebas ejecutadas: ```json Abandono con 14 theme={"system"} { "operationNumber": "44992528", "status": "DENIED", "resultCode": "14" } ``` ```json Cancelación confirmada con 16 theme={"system"} { "operationNumber": "44992528", "status": "CANCELLED", "resultCode": "16" } ``` `DENIED/14` indica abandono por cierre de autorización en curso; `15` indica abandono con intento (QR cancelado). No confirman cancelación aprobada ni son rechazo típico de tarjeta. Decide con estado y código. No normalices `16` o `17` a `00`. ## Verificar el resultado final No existe un endpoint de consulta de cancelación. La respuesta de `POST /cancel` informa el resultado de esa solicitud. Ante fallo, timeout o incertidumbre, `GET /payments/{operationNumber}` consulta **la pasarela** y devuelve `success`, `resultCode`, `resultMessage` y `transaction`, sin `status` propio. `00` significa encontrada: lee `transaction.state`. Este GET no devuelve `202`. Aplica el [contrato de consulta](/procesamiento-fisico/alignet-transit/respuesta-estados-y-codigos#consulta-de-estado): | Estado del cobro | Acción | | - | - | | CARD: `transaction.state: "AUTORIZADO"` en una consulta `200/00` | Tras una cancelación fallida, evalúa `POST /reversals` con la referencia original, sin duplicar extornos. | | QR: `transaction.state: "AUTORIZADO"` en una consulta `200/00` | Conserva el pago aprobado, sin refund ni reversa. | | `200/00` con `transaction.state: "CANCELADO"` | La pasarela registra el cobro cancelado; no es una consulta del desenlace de `/cancel`. | | `200/00` con otro `transaction.state` | Interpreta el literal financiero del SDK; la guía no enumera todos los estados. | | `200/03`, `404/05`, `503/P04` o `POS_NOT_AVAILABLE`, `504/SEARCH_TIMEOUT` | Cobro no verificado. Conserva la referencia, vuelve a consultar o escala; no deduzcas rechazo ni habilites otra venta. | En los ciclos del gráfico, repite únicamente el GET. No reenvíes `/cancel` ni generes otra venta mientras no conozcas el resultado del cobro. Un `202 WAITING_RESULT` tardío de `/authorize` no sustituye un resultado confirmado. ## Fallos de cancelación | Situación | Tratamiento | | - | - | | Cancelación no ejecutada o resultado de otra operación | El servicio devuelve un error; no puede informar cancelación exitosa. | | Timeout, desconexión o fallo del backend | Muestra **Cancelación no confirmada** y recupera el cobro original. Si falta conexión, restablécela primero. | | Cancelación ejecutada y resultado validado | Reconoce la respuesta de éxito de `/cancel`. El cierre visual por sí solo no acredita este resultado. | La matriz no especifica la respuesta cuando la cancelación no se ejecuta o el resultado corresponde a otra operación. No asignes a ese caso un HTTP, código ni cuerpo JSON sin confirmación de desarrollo. ## Manejo de 202 y pérdida de conexión Todas las respuestas incluyen `Cache-Control: no-store`. HTTP `202` añade `Retry-After: 2`: espera dos segundos antes de consultar el cobro original. Una desconexión no garantiza recepción de `/cancel` ni cierre de pantalla. # Configuración por ambiente Source: https://docs.pay-me.com/procesamiento-fisico/alignet-transit/configuracion Configura Pay-me PinPAD y registra la asociación entre el sistema central y cada terminal. Configura cada Wiseasy P5L antes de probar los endpoints. No copies las direcciones de los ejemplos en un ambiente real. ## Configurar Pay-me PinPAD Al iniciar Pay-me PinPAD por primera vez, el operador verá un asistente con tres etapas: **Bienvenida**, **Conexión** y **Verificación**. Asistente de configuración inicial de Pay-me PinPAD con las etapas Bienvenida, Conexión y Verificación La dirección `192.168.20.50` mostrada en la imagen es ilustrativa. Ingresa la IP asignada al Wiseasy P5L. El puerto predeterminado es `8080`; confirma el valor de cada terminal. En **Bienvenida**, selecciona **Empezar**. Ingresa la **Dirección IP** del propio Wiseasy P5L y el **Puerto** en el que escuchará Pay-me PinPAD. El sistema central usará ambos valores para construir `http://:`. La pantalla final valida **Conexión disponible** e **Inyección de llaves**. Envía un `GET /health` real desde el sistema central. Pay-me PinPAD verifica las llaves de seguridad en el terminal. Cuando ambos indicadores estén en verde, selecciona **Continuar**. Pay-me PinPAD mostrará **Listo para el siguiente vehículo** cuando termine la configuración. Este es el texto actual de la interfaz del producto; no obliga a que el sistema integrador sea un SCC. El sistema central no inyecta llaves ni inicializa directamente el SDK de pagos. ## Configuración por terminal Registra para cada Wiseasy P5L: | Parámetro | Ejemplo | Responsable | | - | - | - | | Identificador interno del terminal | `P5L-PUNTO-03` | Comercio / Alignet | | Punto de atención asociado | `PUNTO-03` | Comercio o integrador | | Dirección IP | `192.168.68.121` | Administración de red | | Puerto TCP | `8080` | Alignet / administración de red | | Dirección MAC, si se reserva DHCP | Valor del terminal | Administración de red | | Ambiente | Integración, UAT o producción | Alignet / comercio o integrador | | Versión de Pay-me PinPAD | Versión entregada | Alignet | No copies la IP de ejemplo en un ambiente real. ## Ambientes | Ambiente | Objetivo | Salida esperada | | - | - | - | | Integración | Validar red, contrato JSON y control de errores. | Cliente compatible con los endpoints y códigos HTTP. | | UAT | Validar el flujo físico y la decisión de negocio. | Evidencias aprobadas de escenarios normales y de recuperación. | | Producción | Procesar cobros reales. | Parámetros definitivos registrados, monitoreo y soporte habilitados. | ## Control de cambios Registra la versión de Pay-me PinPAD y la fecha de vigencia junto con la configuración de cada terminal. Un cambio en rutas, campos, tipos, estados, timeouts o semántica requiere revisar el cliente antes del despliegue. Confirma timeouts, políticas de consulta, códigos y habilitaciones antes de producción. Implementa únicamente las rutas del contrato vigente. # Datos por validar Source: https://docs.pay-me.com/procesamiento-fisico/alignet-transit/datos-por-validar Decisiones abiertas y datos que deben confirmarse con Alignet antes de habilitar producción. Esta página reúne la información ambigua, incompleta o dependiente de cada implementación. Los valores de referencia sirven para desarrollo y pruebas; no los conviertas en reglas de producción hasta recibir confirmación. Estos pendientes no cambian los endpoints ni los contratos documentados. Si una definición futura modifica rutas, campos, tipos o semántica, trata el cambio como una nueva versión de integración. ## Parámetros operativos | Punto | Referencia disponible | Validación requerida | | - | - | - | | Espera interna de Pay-me PinPAD | Aproximadamente `90` segundos para los POST, según la guía 1.3.25. | Valor definitivo por ambiente. | | Timeout del cliente HTTP | Al menos `100–110` segundos con la espera de referencia. | Valor definitivo, siempre superior a la espera del terminal. | | Frecuencia de consulta | HTTP `202` incluye `Retry-After: 2`. | Backoff y tiempo máximo de consulta por ambiente. | | Operación no resuelta | No iniciar otro cobro ante consulta fallida o incierta (`200/03`, `404/05`, `503` o `504`). | Procedimiento de inmovilización, escalamiento y decisión de negocio. | | Reinicio durante un extorno | Puede producir `UNKNOWN`. | Confirmar si el procesador recibió la reversa y cómo conciliarla. | | Cancelación con resultado incierto | `POST /cancel` puede responder `202` con `Retry-After`, o perderse la conexión antes de recibir el resultado. | Consultar el cobro original con `GET /payments/{operationNumber}`; no existe consulta de cancelación. Acordar revisión si el cobro continúa sin resolver. | ## Contrato y habilitación | Punto | Referencia disponible | Validación requerida | | - | - | - | | `operationNumber` | String de 1–64 caracteres sin espacios; la ruta GET no admite `/` adicional. | Acordar el formato del comercio. La guía no define la consulta por ruta de referencias que contengan `/`. | | Referencia reutilizada con otro body | No está documentado. | Comportamiento de Pay-me PinPAD; hasta entonces, reenvía exactamente el mismo payload. | | `additionalFields` | Objeto opcional; todos sus valores son String. | El comercio define las claves que necesita enviar como información complementaria. | | Monedas | PEN usa `currency: "604"`. | Otras monedas habilitadas para el comercio y el ambiente. | | Métodos de pago | El contrato admite `CARD` y `QR`, uno por solicitud. | Métodos efectivamente habilitados para el comercio y el ambiente. | | Códigos financieros | Autorización: `success: true`, `00` y `result.state: "AUTORIZADO"`. Consulta: `00` indica encontrada; leer `transaction.state`. | La guía no enumera todos los estados financieros de la pasarela; validar literales por método. `00` aislado no confirma un cobro. | | Cancelación validada | `CANCELLED` con `00`, `16` o `17`; `DENIED/14` no confirma éxito. | Verificar que la versión instalada aplique el [mapeo vigente](/procesamiento-fisico/alignet-transit/respuesta-estados-y-codigos#c%C3%B3digos-confirmados). | | Validación fallida de `/cancel` | Si no se ejecutó o el resultado pertenece a otra operación, devolver error, sin informar éxito. | La matriz recibida no especifica HTTP, código ni cuerpo de este error de validación; desarrollo debe definirlos. | | SDK `07` en consulta del cobro | La tabla general de la guía menciona `404`; el mapeo específico de `/payments` reporta otros códigos SDK con `200`. | Aplicar el mapeo específico y confirmar la discrepancia en el entorno. Cancelación/extorno usan `404 ERROR/NOT_FOUND` ante `05/07`. | | Recepción y corte visual | El PinPAD corta el flujo visual cuando recibe y procesa la solicitud. | Validar fallos de conexión sin presumir recepción o cierre; distinguirlos de fallos internos tras la recepción. | | Cancelación QR | Solo inhabilita el código; no devuelve pagos. | Evidencia de cancelación ejecutada y correspondencia con la referencia solicitada. | | `tollData` | Datos de peaje con valores String; se fusionan con `additionalFields` y prevalece `tollData`. | Acordar claves y convenciones por comercio, sin convertirlas en restricciones del servidor. | ## Extornos | Punto | Referencia disponible | Validación requerida | | - | - | - | | Extorno tras cancelación fallida | Si el cobro CARD se encuentra con `transaction.state: "AUTORIZADO"`, se evalúa `POST /reversals` como acción independiente. | Evidencia del extorno y conciliación cuando no se confirma éxito. | | Discrepancia de cancelación QR | Solo se cancela o inhabilita el código. Ni `/cancel` ni refund devuelven pagos QR; un QR encontrado con `transaction.state: "AUTORIZADO"` se conserva como aprobado. | Definir evidencias, responsables y revisión de discrepancias; no generar refund ni reversa. | | Presentación de tarjeta | El extorno explícito puede requerir interacción con el PinPAD. | Obligatoriedad por versión, uso de tarjeta original y pasos reales. | | Prevención de duplicados | No repetir `REVERSED`, `NOT_FOUND` ni un extorno en curso. Tras `DENIED`, `UNKNOWN` o `ERROR` finales, un nuevo POST puede ejecutar otro intento; no es un reintento automático. | Evidencia y consulta para descartar ambos antes de una reversa adicional. | Confirma también: * la ventana máxima para solicitar un extorno; * el tratamiento de ventas cerradas o liquidadas; * cuándo se refleja la reversa para el tarjetahabiente y cuál es su efecto contable; * la semántica y el procedimiento de conciliación de `UNKNOWN` después de un reinicio; * los códigos del procesador que permiten reintentar una reversa. ## Infraestructura y soporte Completa por ambiente: * la IP, el puerto y la asociación entre sistema central y Wiseasy P5L; * la versión aprobada de Pay-me PinPAD; * los contactos, horarios, severidades y procedimiento de soporte; * los responsables de decidir qué hacer cuando el resultado aún no está confirmado; * cualquier requisito adicional de seguridad de red. ## Registro de decisión Por cada punto, registra responsable, definición aprobada, ambiente, fecha de vigencia y evidencia. Conserva este registro junto con la versión de Pay-me PinPAD certificada. Convierte las definiciones aprobadas en criterios verificables antes de habilitar cobros reales. # Ejemplos de integración Source: https://docs.pay-me.com/procesamiento-fisico/alignet-transit/ejemplos-de-integracion Ejemplos en cURL, Java, C#, Python y Node.js para consumir Pay-me PinPAD. El sistema central del comercio actúa como **cliente HTTP**. La aplicación Pay-me PinPAD instalada en el Wiseasy P5L actúa como **servidor HTTP** sobre la red local. Reemplaza `` y `` por la configuración de tu terminal. Estos ejemplos ilustran el contrato HTTP; no son evidencia de pruebas ejecutadas. Consulta la [referencia de endpoints](/procesamiento-fisico/alignet-transit/referencia-de-endpoints) y el contrato de cada operación antes de adaptar estos ejemplos. ## cURL ### Disponibilidad ```bash theme={"system"} curl --header "Connection: close" "http://:/health" ``` ### Autorización ```bash theme={"system"} curl --header "Connection: close" --request POST "http://:/authorize" \ --header "Content-Type: application/json" \ --max-time 110 \ --data '{ "operationNumber": "44992528", "amount": "100", "currency": "604", "paymentMethod": "QR", "tollData": { "plate": "ABC-123", "tollPointId": "PEAJE-01", "laneId": "VIA-03" }, "additionalFields": {} }' ``` Los datos estructurados del peaje van en `tollData`. Se fusionan con `additionalFields`; ante claves coincidentes prevalece `tollData`. Usa `additionalFields` para información complementaria. Para CARD cambia únicamente `paymentMethod` a `"CARD"` en una operación nueva y resuelta de forma independiente; el PinPAD solicitará la tarjeta. En QR, generar el código ya crea la transacción pendiente. ### Consulta del cobro ```bash theme={"system"} curl --max-time 20 --header "Connection: close" -i "http://:/payments/44992528" ``` Usa `-i` para comprobar `Connection: close` y `Cache-Control: no-store`. Solo los endpoints que devuelven HTTP `202` añaden `Retry-After: 2`; este GET consulta la pasarela y no devuelve `202`. ### Solicitar cancelación ```bash theme={"system"} curl --header "Connection: close" -i --request POST "http://:/cancel" \ --header "Content-Type: application/json" \ --max-time 110 \ --data '{"operationNumber":"44992528"}' ``` La respuesta informa el resultado de la solicitud de cancelación. Usa el GET del cobro únicamente para recuperarlo ante fallo, timeout o incertidumbre; no existe un GET de cancelación. | Caso del ejemplo | Resultado esperado | Acción | | - | - | - | | Cancelación ejecutada y validada | HTTP `200`, `CANCELLED` con `00`, `16` o `17`. | Reconocer la cancelación sin exigir otra consulta. | | Cancelación rechazada | HTTP `200`, `DENIED`, incluido el código `14`. | No registrar cancelación exitosa; consultar el cobro original. | | Cancelación no ejecutada | Respuesta de error, sin valores específicos definidos. | No registrar éxito; consultar el cobro original. | | Resultado de otra operación | El servicio devuelve un error de validación. | Conservar la referencia solicitada y consultar su cobro. | | Timeout o resultado incierto | Sin cancelación confirmada; `PENDING` con `P22` sigue pendiente. | Consultar el cobro original; en HTTP `202`, esperar `Retry-After: 2`. | | Cancelación fallida y cobro CARD `transaction.state: "AUTORIZADO"` en una consulta `200/00` | El cobro original está aprobado. | Evaluar `POST /reversals` con la referencia original; consultar el extorno cuando corresponda. | En `/cancel`, `DENIED/14` indica abandono por cierre de autorización en curso; `15` indica abandono con intento (QR cancelado). Ninguno confirma cancelación aprobada ni rechazo típico de tarjeta. `CANCELLED` con `16` o `17` es éxito equivalente, validado por el servicio. Si el cobro QR aparece `transaction.state: "AUTORIZADO"` en una consulta `200/00`, conserva el pago aprobado y registra la discrepancia. Ni `/cancel` ni refund devuelven pagos QR; no uses `/reversals` para QR. ## Java 11 o posterior ```java theme={"system"} import java.net.URI; import java.net.URLEncoder; import java.nio.charset.StandardCharsets; import java.net.http.HttpClient; import java.net.http.HttpRequest; import java.net.http.HttpResponse; import java.time.Duration; public final class PinpadClient { private final String baseUrl; public PinpadClient(String baseUrl) { this.baseUrl = baseUrl; } // Recibe JSON serializado con la biblioteca de tu aplicación. public HttpResponse authorize(String json) throws Exception { HttpRequest request = HttpRequest.newBuilder() .uri(URI.create(baseUrl + "/authorize")) .header("Content-Type", "application/json") .timeout(Duration.ofSeconds(110)) .POST(HttpRequest.BodyPublishers.ofString(json)) .build(); return HttpClient.newBuilder().version(HttpClient.Version.HTTP_1_1) .build().send(request, HttpResponse.BodyHandlers.ofString()); } public HttpResponse query(String operationNumber) throws Exception { HttpRequest request = HttpRequest.newBuilder() .uri(URI.create(baseUrl + "/payments/" + URLEncoder.encode(operationNumber, StandardCharsets.UTF_8))) .timeout(Duration.ofSeconds(20)) .GET() .build(); return HttpClient.newBuilder().version(HttpClient.Version.HTTP_1_1) .build().send(request, HttpResponse.BodyHandlers.ofString()); } } ``` En Java, cada envío crea su cliente y usa HTTP/1.1; el servidor responde `Connection: close`. No configures reutilización de conexiones. ## C# con .NET ```csharp theme={"system"} using System.Net.Http.Json; public sealed class PinpadClient { private readonly HttpClient _http; public PinpadClient(string baseUrl) { _http = new HttpClient { BaseAddress = new Uri(baseUrl), Timeout = TimeSpan.FromSeconds(110) }; _http.DefaultRequestHeaders.ConnectionClose = true; } public async Task<(int StatusCode, string Body)> AuthorizeAsync( string operationNumber, string amount, string currency, string paymentMethod) { var payload = new { operationNumber, amount, currency, paymentMethod }; using var response = await _http.PostAsJsonAsync("/authorize", payload); return ((int)response.StatusCode, await response.Content.ReadAsStringAsync()); } public async Task<(int StatusCode, string Body)> QueryAsync(string operationNumber) { using var timeout = new CancellationTokenSource(TimeSpan.FromSeconds(20)); using var response = await _http.GetAsync( $"/payments/{Uri.EscapeDataString(operationNumber)}", timeout.Token); return ((int)response.StatusCode, await response.Content.ReadAsStringAsync()); } } ``` ## Python con requests ```python theme={"system"} import requests from urllib.parse import quote BASE_URL = "http://:" def authorize(operation_number, amount, currency, payment_method): payload = { "operationNumber": operation_number, "amount": amount, "currency": currency, "paymentMethod": payment_method, } response = requests.post( f"{BASE_URL}/authorize", json=payload, headers={"Connection": "close"}, timeout=110, ) return response.status_code, response.json() def query_status(operation_number): response = requests.get( f"{BASE_URL}/payments/{quote(operation_number, safe='')}", headers={"Connection": "close"}, timeout=20, ) return response.status_code, response.json() ``` ## Node.js 18 o posterior ```javascript theme={"system"} const BASE_URL = "http://:"; async function authorize(operationNumber, amount, currency, paymentMethod) { const controller = new AbortController(); const timeout = setTimeout(() => controller.abort(), 110_000); try { const response = await fetch(`${BASE_URL}/authorize`, { method: "POST", headers: { "Content-Type": "application/json", "Connection": "close" }, body: JSON.stringify({ operationNumber, amount, currency, paymentMethod }), signal: controller.signal, }); return { statusCode: response.status, body: await response.json(), retryAfter: response.headers.get("retry-after"), }; } finally { clearTimeout(timeout); } } async function queryStatus(operationNumber) { const controller = new AbortController(); const timeout = setTimeout(() => controller.abort(), 20_000); try { const response = await fetch( `${BASE_URL}/payments/${encodeURIComponent(operationNumber)}`, { headers: { "Connection": "close" }, signal: controller.signal }, ); return { statusCode: response.status, body: await response.json() }; } finally { clearTimeout(timeout); } } ``` ## Reglas para cualquier lenguaje * Persiste `operationNumber` antes del `POST`. * Envía `operationNumber` como String de 1–64 caracteres sin espacios; evita `/` para consultarlo por ruta. `amount` acepta entero o String numérico positivo. Moneda y método son opcionales (`604` y `CARD`); el método no distingue mayúsculas. * Abre una conexión por petición, sin keep-alive; todas las respuestas usan `Connection: close`. * Configura 110 segundos para los POST, por encima de la espera aproximada de 90 segundos. Cubre los 12–15 segundos de consulta del cobro; los ejemplos usan 20 segundos. * Conserva por separado el código HTTP y el JSON. * Confirma autorización con HTTP `200`, `success: true`, `resultCode: "00"` y `result.state: "AUTORIZADO"`. En consulta `200/00`, interpreta `transaction.state`: `00` solo significa encontrada. * Reconoce cancelación validada con `CANCELLED` y `00`, `16` o `17`. `DENIED/14` y HTTP `200` aislado no confirman éxito. * Ante cancelación fallida o incierta, consulta el cobro original. Una consulta fallida o incierta (`200/03`, `404/05`, `503`, `504`) no permite otro cobro ni confirma rechazo. * Una falla de conexión no garantiza recepción de `/cancel` ni cierre de pantalla. * Los ciclos repiten solo el GET correspondiente; no reenvían `/cancel` ni generan otra venta. * Ante timeout, desconexión o fallo del backend, muestra **Cancelación no confirmada** y consulta el estado. * No repitas un extorno exitoso o en curso. Tras `DENIED`, `UNKNOWN` o `ERROR` finales, un nuevo POST puede ejecutar otro intento; consulta y decide antes, sin reintento automático ante incertidumbre. * No sustituyas un resultado confirmado por un `202 WAITING_RESULT` tardío de `/authorize`. * Autorización `202` usa `WAITING_RESULT` y `result: null`. La consulta del cobro no tiene `status` propio ni devuelve `202`. Extorno `UNKNOWN` devuelve `502` y es final localmente; revisa si se ejecutó sin asumir éxito. * El cuerpo compacto de extorno `UNKNOWN` utiliza `message`. * Conserva los códigos SDK; en cancelación y extorno, `P22` se clasifica como `PENDING`. No extrapoles el modelo propio a la autorización o consulta del cobro. * Respeta `Retry-After: 2` en HTTP `202`. * Serializa los cobros dirigidos al mismo terminal. * No registres datos sensibles de tarjeta. La solicitud y consulta de extorno están en [Extorno de una venta CARD aprobada](/procesamiento-fisico/alignet-transit/extorno). Los ejemplos se concentran en el contrato HTTP. En producción, serializa JSON con la biblioteca estándar del lenguaje, valida las respuestas y persiste el estado antes de ejecutar una acción de negocio irreversible. # Extorno de una venta CARD aprobada Source: https://docs.pay-me.com/procesamiento-fisico/alignet-transit/extorno Extorno explícito CARD y consulta de resultados; QR no admite extornos ni devoluciones. `POST /reversals` aplica **solo a CARD** y solicita el extorno total de una venta aprobada. Conserva el `operationNumber` original. ## Cancelación y extorno | Flujo | Uso | Verificación | | - | - | - | | `POST /cancel` | Solicitar cancelar una autorización activa. | Su respuesta informa el resultado de la cancelación. Ante fallo o incertidumbre, consulta el cobro original. | | `POST /reversals` | Solicitar un extorno independiente de una venta CARD aprobada. | `GET /reversals/{operationNumber}` cuando el resultado no esté confirmado. | En **QR**, únicamente cancelas o inhabilitas el código generado. Ni `/cancel` ni refund devuelven un monto pagado; `/reversals` no aplica. Si aparece `transaction.state: "AUTORIZADO"` en una consulta `200/00` después de solicitar cancelación, conserva el pago aprobado y registra la discrepancia para revisión. Una cancelación fallida permite evaluar el extorno cuando `GET /payments/{operationNumber}` confirma el cobro CARD como `transaction.state: "AUTORIZADO"` en una consulta `200/00`. Usa el `operationNumber` de esa venta; el error de cancelación no genera un extorno automático. ## Requisitos por método | Método | Requisito | | - | - | | CARD | Venta encontrada con `transaction.state: "AUTORIZADO"` y cobro vigente. Presenta la tarjeta cuando la solicite el PinPAD. | | QR | No aplica este flujo: solo puedes cancelar o inhabilitar el código, sin devolver un monto pagado. | Antes del POST, verifica que no exista un extorno completado o en curso. No dupliques la solicitud mientras falte resolución. ## Solicitud Envía al mismo host y puerto de la autorización: ```http theme={"system"} POST /reversals Content-Type: application/json Connection: close ``` ```json theme={"system"} { "operationNumber": "44992528" } ``` | Campo | Tipo | Obligatorio | Uso | | - | - | - | - | | `operationNumber` | String | Sí | Referencia original aceptada en la autorización; consulta [Parámetros](/procesamiento-fisico/alignet-transit/parametros-de-envio). | No envíes monto, moneda, método ni datos de tarjeta. El extorno es total. ```bash theme={"system"} curl --header "Connection: close" --request POST "http://:/reversals" \ --header "Content-Type: application/json" \ --max-time 110 \ --data '{"operationNumber":"44992528"}' ``` Si el resultado no está confirmado o se pierde la respuesta, consulta el extorno: ```bash theme={"system"} curl --header "Connection: close" -i "http://:/reversals/44992528" ``` Todas las respuestas incluyen `Connection: close` y `Cache-Control: no-store`. Abre una conexión por petición. HTTP `202` añade `Retry-After: 2`; espera dos segundos antes de consultar el extorno. ## Respuestas del POST | HTTP | Resultado documentado | Acción | | - | - | - | | `200` | `REVERSED` con `00`, `16` o `17` | Registrar extorno confirmado o éxito equivalente. | | `200` | `DENIED` con `14`, `15`, `18`, `19`, `20`, `01`, `03` u otro código SDK | No registrar éxito; conservar código y mensaje. No reintentar automáticamente. | | `202` | `SEARCHING`, `PROCESSING` o `PENDING`; códigos `SEARCHING`, `WAITING_RESULT` o `P22` | Respetar `Retry-After: 2` y consultar; no duplicar. | | `400` | `BAD_REQUEST` | Corregir el cuerpo. No es un rechazo financiero. | | `404` | `NOT_FOUND` | Verificar referencia y terminal; no confirma ausencia de cobro. | | `409` | `POS_BUSY` | Esperar a que termine la operación activa antes de reintentar la solicitud no aceptada. | | `502` | `UNKNOWN`, cuerpo compacto con `message`; sin `resultCode` | Búsqueda ambigua o control de tiempo agotado. Revisar con Alignet; no registrar éxito ni reenviar automáticamente. | | `503` | `POS_NOT_AVAILABLE` | Restablecer disponibilidad y consultar antes de decidir otro envío. | La forma normal conserva `operationNumber`, `status`, `resultCode`, `resultMessage`, `authorizationCode` y `completedAt` (fecha ISO 8601 UTC o `null` si no aplica). Ejemplo de extorno aprobado; no representa una prueba ejecutada: ```json theme={"system"} { "operationNumber": "44992528", "status": "REVERSED", "resultCode": "00", "resultMessage": "Extorno aprobado", "authorizationCode": "123456", "completedAt": "2026-08-27T20:30:00Z" } ``` El código aislado no basta: el éxito exige `REVERSED` con `00`, `16` o `17`. Conserva los códigos SDK sin normalizaciones adicionales. El cuerpo compacto de `UNKNOWN` utiliza `message`, no `resultMessage`. Forma compacta de HTTP `502` (esquema, no evidencia de prueba): ```json theme={"system"} { "operationNumber": "string", "status": "UNKNOWN", "message": "string" } ``` ## Consulta del extorno explícito | HTTP de `GET /reversals/{operationNumber}` | Significado | Acción | | - | - | - | | `200` | `REVERSED`, `DENIED` o `ERROR` guardado. | Reconocer éxito solo con `REVERSED` y `00`, `16` o `17`. | | `202` | Extorno en curso. | Respetar `Retry-After: 2` y continuar consultando. | | `404` | No existe solicitud registrada o la venta original no fue encontrada. | Verificar terminal y referencia; no deducir un resultado financiero. | | `400` | `ERROR/BAD_REQUEST`: segmento vacío o inválido. | Corregir la referencia en la ruta. | | `502` | `UNKNOWN`: la solicitud terminó con error. | Revisar si se ejecutó el extorno con Alignet; no registrar éxito. | `GET /reversals/{operationNumber}` consulta el estado **local** guardado por la app. El cobro y el extorno son resultados independientes. Encontrar `transaction.state: "AUTORIZADO"` en `GET /payments/{operationNumber}` no confirma ni descarta el extorno; consulta este último en `/reversals/{operationNumber}`. ## Estados del extorno | Estado | Interpretación | | - | - | | `SEARCHING` | Se está buscando la venta original. Sigue consultando el extorno. | | `PROCESSING`, `PENDING` | Extorno en proceso o espera HTTP agotada; continuar consultando. | | `REVERSED` con `00`, `16` o `17` | Extorno confirmado o éxito equivalente. | | `DENIED` | Solicitud denegada; no registres extorno exitoso. | | `UNKNOWN` | La solicitud terminó con HTTP `502`, pero no se sabe si se ejecutó el extorno. Revisa el caso con Alignet. | | `ERROR` | Evaluar HTTP, código y mensaje; no equivale a extorno. | `DENIED`, `ERROR` y `UNKNOWN` no confirman un extorno exitoso. `UNKNOWN` no debe tratarse como un pendiente de cobro con HTTP `202`. ## Recuperación e idempotencia * Ante timeout o desconexión, consulta la misma referencia: el timeout no determina el resultado financiero. * Si el mismo extorno está `SEARCHING`, `PROCESSING` o `PENDING`, el POST devuelve `202` sin iniciar otro. * Si ya fue `REVERSED`, devuelve `200` con el resultado guardado sin repetir el extorno; si fue `NOT_FOUND`, devuelve `404` sin otro intento. * Tras un resultado final `DENIED`, `UNKNOWN` o `ERROR`, un nuevo `POST /reversals` con la misma referencia **puede ejecutar otro intento real**. Esta capacidad no autoriza reintentos automáticos ante incertidumbre: consulta, revisa el resultado financiero y decide antes de reenviar. * Otra referencia activa devuelve `409 POS_BUSY`. Serializa operaciones por terminal. * No reenvíes en paralelo ni cambies el cuerpo. Consulta antes de cualquier reenvío permitido. * No sustituyas un resultado confirmado por un `PENDING` tardío ni inicies otra venta mientras no conozcas el resultado anterior. # Habilitación y soporte Source: https://docs.pay-me.com/procesamiento-fisico/alignet-transit/habilitacion-y-soporte Información que el comercio, el integrador y Alignet deben intercambiar para pruebas y producción. Completa esta información antes de ejecutar las pruebas conjuntas. Evita incluir credenciales o datos sensibles en documentos de coordinación sin protección. ## Información del comercio o integrador ### Sistema central y despliegue * nombre y versión del componente que realizará las llamadas HTTP; * sistema operativo, runtime y biblioteca HTTP; * relación entre instancias del sistema central, puntos de atención y terminales; * estrategia de persistencia de operaciones abiertas; * mecanismo de serialización de cobros por terminal; * procedimiento de recuperación después de un reinicio. ### Red * subred y dirección IP del sistema central; * reglas de firewall aplicables; * confirmación de que AP/Client Isolation está desactivado; * reserva DHCP o mecanismo de IP estática del Wiseasy P5L; * contacto responsable de red durante las pruebas. ### Operación * formato utilizado para `operationNumber`, según [Parámetros](/procesamiento-fisico/alignet-transit/parametros-de-envio), de 1–64 caracteres sin espacios; * regla que garantiza unicidad por operación real; * montos y referencias de prueba; * datos estructurados del peaje en `tollData` y claves complementarias en `additionalFields`, si aplica; * decisión de negocio según `result.state` en autorización, `transaction.state` en consulta a pasarela y `status` en cancelación/extorno; * formato de comprobante y datos de conciliación. ### Observabilidad y soporte * evidencia técnica disponible en el sistema central; * retención y protección de logs; * responsables de desarrollo, QA, redes y operación; * procedimiento para inmovilizar una operación incierta y escalarla. ## Información de Alignet Alignet debe confirmar antes de la salida a producción: * Wiseasy P5L y versión de Pay-me PinPAD asignados; * IP y puerto configurados para cada terminal; * espera interna definitiva de Pay-me PinPAD; * recomendación definitiva de timeout del sistema central; * intervalo, backoff y límite de consulta; * catálogo aplicable de códigos por método y operación; * versión instalada conforme al mapeo de códigos de cobro, cancelación y extorno; * HTTP, código y cuerpo del error cuando la cancelación no se ejecutó o corresponde a otra operación; * evidencia y revisión de discrepancias cuando QR sigue aprobado tras solicitar cancelación, sin refund ni reversa; * presentación de tarjeta en el extorno explícito CARD; * monedas y medios de pago habilitados; * claves de `additionalFields` definidas por el comercio y su finalidad; * contactos, horarios y procedimiento de soporte. El registro completo, incluida la semántica pendiente de extornos y referencias reutilizadas, está en [Datos por validar](/procesamiento-fisico/alignet-transit/datos-por-validar). ## Ficha por terminal | Campo | Valor | | - | - | | Ambiente | Por completar | | Punto de atención | Por completar | | Identificador del Wiseasy P5L | Por completar | | Versión de Pay-me PinPAD | Por completar | | IP | Por completar | | Puerto | `8080` por defecto; confirmar | | Sistema central autorizado | Por completar | | Fecha de `GET /health` exitoso | Por completar | | Timeout del sistema central | Por completar | | Política de consulta | Por completar | | Contacto de soporte | Por completar | ## Evidencia mínima por caso * identificador y descripción del caso; * fecha, hora y ambiente; * terminal y sistema central utilizados; * `operationNumber` y método CARD o QR; * evidencia de recepción de `/cancel`, fallo de conexión o fallo interno, y cierre visual observado; * resultado de `/cancel`, consultas del cobro ante fallo o incertidumbre y resultado del extorno CARD independiente, si se solicitó; * mensaje **Cancelación no confirmada** ante timeout, desconexión o fallo del backend; * solicitud y respuesta sanitizadas; * código HTTP, `Connection: close`, `Cache-Control: no-store` y `Retry-After: 2` en HTTP `202`; * campos del contrato correspondiente a cada endpoint; en extorno `502 UNKNOWN`, solo `operationNumber`, `status` y `message`; * tiempos de inicio, respuesta y consultas; * resultado esperado, resultado observado y conformidad. No incluyas PAN completo, CVV, PIN, PIN Block, pistas ni datos EMV sensibles. ## Entregables de habilitación Asociación entre sistema central, punto de atención y Wiseasy P5L, IP, puerto, versión y timeouts. Acción del sistema central para cada código HTTP y estado transaccional. Casos normales, errores, concurrencia, timeout y recuperación. Contactos, severidades, datos de diagnóstico y escalamiento. # Operación y recuperación Source: https://docs.pay-me.com/procesamiento-fisico/alignet-transit/operacion-y-recuperacion Flujo síncrono, timeouts, consulta, idempotencia, concurrencia y recuperación segura. ## Secuencia por método | Método | Secuencia normal | | - | - | | CARD | Autorizar → solicitar tarjeta y PIN cuando corresponda → procesar → confirmar resultado. | | QR | Autorizar → generar QR y transacción pendiente → esperar confirmación de pago → confirmar resultado. | El POST espera un resultado hasta agotar su tiempo de espera. La transacción QR existe desde que se genera el código. Consulta los [diagramas CARD y QR](/procesamiento-fisico/alignet-transit/cancelacion). ## Después de cancelar Para ambos métodos, el PinPAD corta el flujo visual cuando recibe y procesa `/cancel`. Si falla la conexión, no puedes asegurar recepción ni cierre visual. Reconoce la cancelación confirmada y validada en la respuesta del POST. Ante fallo, timeout o incertidumbre, consulta el cobro original con `GET /payments/{operationNumber}`. Un cobro CARD aprobado permite evaluar un extorno independiente. Si QR aparece `transaction.state: "AUTORIZADO"` en una consulta `200/00` después de solicitar cancelación, conserva el pago aprobado y registra la discrepancia; no solicites refund ni reversa. Aplica la [tabla de resolución](/procesamiento-fisico/alignet-transit/cancelacion#verificar-el-resultado-final). En QR, la cancelación solo inhabilita el código; ni `/cancel` ni refund devuelven un monto pagado. Ante timeout, desconexión o fallo del backend, el frontend muestra **Cancelación no confirmada** y consulta el estado. Sin solicitud de cancelación, un QR `transaction.state: "AUTORIZADO"` en una consulta `200/00` confirma el pago y permite ejecutar la acción de negocio. Los ciclos de consulta repiten únicamente el GET; no reenvían `/cancel`. No inicies una nueva transacción mientras la anterior siga sin resolverse. Un `202 WAITING_RESULT` tardío de `/authorize` no reemplaza un resultado final confirmado. ## Timeouts Los POST de autorización, cancelación y extorno esperan al PinPAD aproximadamente **90 segundos**, según la guía 1.3.25. Configura un timeout superior y valida la duración en tu ambiente. Configura el timeout de lectura del cliente HTTP por encima de la espera del terminal: ```text theme={"system"} Espera aproximada de los POST: 90 s Timeout HTTP del sistema central: al menos 100–110 s ``` `GET /payments` puede esperar aproximadamente 12–15 segundos por la pasarela; usa, por ejemplo, 20 segundos de timeout. `GET /health` y `GET /reversals` responden inmediatamente. Todas las respuestas incluyen `Connection: close`: abre una conexión por petición, sin keep-alive. Un cobro puede tomar decenas de segundos. No uses el mismo timeout corto que aplicarías a una API convencional. Si el timeout del sistema central vence antes que el del terminal, el pago puede continuar aunque el comercio haya perdido la conexión. Un timeout de red nunca equivale a rechazo. El valor definitivo de la espera interna, el timeout del sistema central y el tiempo máximo de recuperación deben validarse con Alignet antes de producción. ## Recuperación de una operación incierta Usa `GET /payments/{operationNumber}` para consultar el cobro original **en la pasarela**. Devuelve `success`, `resultCode`, `resultMessage` y `transaction`, sin `status` propio; `00` indica encontrada y el desenlace financiero se lee en `transaction.state`. No existe consulta de cancelación. Para un extorno CARD, usa `GET /reversals/{operationNumber}`; HTTP `502 UNKNOWN` termina esa solicitud sin confirmar éxito y requiere revisión financiera. Consulta cuando ocurra cualquiera de estos casos: * `POST /authorize` devuelve HTTP `202` con `WAITING_RESULT` y `result: null`; * el timeout del cliente HTTP vence sin recibir respuesta; * la conexión se interrumpe durante el cobro; * el sistema central se reinicia con una operación abierta; * la consulta no verifica el cobro (`200/03`, `404/05`, `503` o `504`) o su estado financiero no permite concluir. ```mermaid theme={"system"} flowchart TD A[Guardar referencia] --> B[Consultar pasarela: GET payments] B -->|200 y 00: encontrada| C[Interpretar transaction.state] C -->|Desenlace confirmado| F[Registrar resultado financiero] C -->|Sin confirmar| D[Esperar según política de consulta] B -->|03 o 05 o 503 o 504: no verificado| D D --> B D -->|Límite alcanzado| E[Escalar sin otro cobro] ``` Procedimiento: 1. Conserva el `operationNumber` original. 2. Mantén la operación como no resuelta en el sistema central. 3. No ejecutes la acción de negocio asociada ni marques un rechazo definitivo. 4. Ejecuta `GET /payments/{operationNumber}`. 5. Si el POST previo devolvió `202`, respeta `Retry-After: 2` antes del primer GET. Este GET no devuelve `202`; interpreta su [tabla HTTP](/procesamiento-fisico/alignet-transit/respuesta-estados-y-codigos#consulta-de-estado). 6. Sigue consultando hasta conocer el resultado del cobro o alcanzar el límite de espera acordado. 7. Si alcanzas ese límite sin verificar el resultado financiero, escala la operación para resolución. No inicies automáticamente otro cobro. ## Idempotencia `operationNumber` es la clave de idempotencia del cobro. Esta tabla aplica a `/authorize`; el [extorno](/procesamiento-fisico/alignet-transit/extorno#recuperaci%C3%B3n-e-idempotencia) permite otro intento tras `DENIED`, `UNKNOWN` o `ERROR` finales. | Escenario | Comportamiento garantizado | | - | - | | Misma referencia mientras se procesa | No se inicia un segundo cobro. Pay-me PinPAD responde HTTP `202` sin iniciar otro cargo; interpreta `WAITING_RESULT` y `result: null`. | | Misma referencia ya finalizada | No se inicia un segundo cobro. Pay-me PinPAD responde HTTP `200` con el resultado almacenado. | | Resultado perdido por el sistema central | El sistema central puede consultar o reenviar la misma referencia para recuperar el resultado existente. | | Nueva operación real | El sistema central debe generar una referencia nueva. | ```text theme={"system"} 1 operación real de cobro = 1 operationNumber ``` No cambies el monto ni la moneda al reutilizar una referencia. El contrato vigente no documenta el comportamiento para una misma referencia con un payload diferente; evita esa condición y escálala si ocurre. ## Concurrencia Pay-me PinPAD procesa una sola operación a la vez: * Si llega el mismo `operationNumber`, aplica la regla de idempotencia. * Si llega otro `operationNumber` mientras existe un cobro activo, responde HTTP `409` con `POS_BUSY`. * El sistema central debe serializar los cobros destinados al mismo terminal. * Después de `POS_BUSY`, espera a que el terminal se libere antes de reintentar la solicitud que no fue aceptada. Si varios procesos pueden enviar pagos al mismo Wiseasy P5L, coordínalos mediante una cola o bloqueo único en el sistema central. ## Reinicios ### Reinicio del sistema central Al iniciar, recupera las operaciones guardadas cuyo resultado aún no conoces y consulta cada `operationNumber` antes de decidir si hubo cobro. ### Reinicio del Wiseasy P5L durante el cobro El resultado del cobro puede quedar sin verificar. La guía no define un estado de respuesta específico para el reinicio. No marques la operación como aprobada ni rechazada. Consulta la referencia y solicita revisión si no logras conocer el resultado dentro del límite de espera acordado. ## Flujo recomendado del sistema central ```text theme={"system"} 1. GET /health para confirmar disponibilidad. 2. Generar y persistir un operationNumber único. 3. POST /authorize con timeout de al menos 100–110 s. 4. Evaluar HTTP, success, resultCode y result.state. 5. Confirmar autorización con 200 + success true + 00 + AUTORIZADO. En consulta 200/00, leer transaction.state; 00 solo significa encontrada. Reconocer cancelación validada en la respuesta de POST /cancel. Si falla y el cobro CARD está aprobado, evaluar un extorno independiente. Conservar QR aprobado sin refund ni reversa; registrar la discrepancia. 6. Ante 202, timeout o desconexión, consultar la referencia original. 7. Iniciar otro cobro solo después de confirmar el desenlace financiero anterior, con un operationNumber nuevo y después de la decisión del usuario. ``` ## Decisión de negocio Define antes de producción qué hará el comercio cuando todavía no sabe si se cobró. No confirmes la venta ni ejecutes una acción irreversible —por ejemplo, abrir una barrera— hasta confirmar `success: true`, `resultCode: "00"` y `result.state: "AUTORIZADO"` en autorización, o una consulta `200/00` con `transaction.state: "AUTORIZADO"`. La política para operaciones sin verificar, incluido el escalamiento manual, requiere acuerdo entre el integrador y Alignet. ## Persistencia mínima Guarda, cuando existan: ```text theme={"system"} operationNumber amount currency paymentMethod tollData additionalFields código HTTP success y result.state (autorización) success y transaction.state (consulta a pasarela) status (cancelación y extorno) resultCode y resultMessage, o message en extorno 502 UNKNOWN identificador de transacción y código de autorización, cuando existan completedAt (cancelación o extorno, cuando exista) fecha y hora de cada solicitud y respuesta ``` No almacenes datos sensibles de tarjeta. Conserva por separado los eventos de cancelación, la autorización original y cualquier extorno explícito. Guarda su estado y marcas de tiempo para evitar decisiones basadas en una respuesta anterior. # Solicitud de autorización Source: https://docs.pay-me.com/procesamiento-fisico/alignet-transit/parametros-de-envio Parámetros, validaciones y ejemplos para iniciar un pago con POST /authorize. El sistema central del comercio inicia el procesamiento del pago mediante `POST /authorize` a Pay-me PinPAD. La conexión permanece abierta mientras el terminal procesa la operación, hasta recibir un resultado o completar el tiempo de espera de la solicitud. Mientras la autorización continúa en curso, puedes solicitar su [cancelación](/procesamiento-fisico/alignet-transit/cancelacion) mediante `POST /cancel` con el mismo `operationNumber`. La solicitud original de `/authorize` puede seguir abierta hasta completar su tiempo de espera, aunque la cancelación ya se haya procesado y el PINPAD haya salido de la pantalla de pago. Si la conexión falla al solicitar cancelación, no puedes asegurar que el PinPAD la recibió ni que cerró la pantalla. Consulta siempre la referencia original; sin solicitud de cancelación, un QR con `transaction.state: "AUTORIZADO"` en una consulta `200/00` confirma el pago. Si posteriormente `/authorize` responde HTTP `202` con `success: false`, `resultCode: "WAITING_RESULT"` y `result: null`, significa que venció la espera de esa solicitud. Esta respuesta no invalida una cancelación confirmada. Si aún no conoces el resultado del cobro, consulta `GET /payments/{operationNumber}`. ```http theme={"system"} POST /authorize Content-Type: application/json Connection: close ``` Construye la URL con la dirección IP y el puerto configurados en el terminal: ```text theme={"system"} http://:/authorize ``` ## Flujos por método | Método | Inicio | Confirmación del cobro | | - | - | - | | CARD | El PinPAD solicita la tarjeta después de `POST /authorize`. | `success: true`, `resultCode: "00"` y `result.state: "AUTORIZADO"`. | | QR | `POST /authorize` genera el QR y crea una transacción pendiente asociada a `operationNumber`. | La misma aprobación de autorización; mostrar o escanear el QR no basta. | Consulta los [diagramas y las respuestas de cancelación](/procesamiento-fisico/alignet-transit/cancelacion). Si la cancelación falla o no está confirmada, consulta el cobro original; no existe una consulta de cancelación. ## Solicitud mínima Solo `operationNumber` y `amount` son obligatorios. Este ejemplo también indica moneda y método: ```json theme={"system"} { "operationNumber": "44992528", "amount": "100", "currency": "604", "paymentMethod": "QR" } ``` ## Parámetros | Campo | Tipo JSON | Obligatorio | Validación | Descripción | | - | - | - | - | - | | `operationNumber` | String | Sí | Cadena de 1 a 64 caracteres sin espacios (`^\S{1,64}$`). | Identificador único generado por el sistema central. Se utiliza como clave de idempotencia y referencia de consulta. | | `amount` | Entero o String numérico | Sí | Cadena numérica que representa un entero positivo de 1 a 12 dígitos, expresado en unidades menores. | Importe total del pago. Por ejemplo, `"1500"` representa S/ 15.00. | | `currency` | Número o String | No | Exactamente 3 dígitos (`^\d{3}$`); predeterminado `604`. | Código numérico ISO 4217 de la moneda. Para soles peruanos, envía `"604"`. | | `paymentMethod` | String | No | `CARD` o `QR`, sin distinguir mayúsculas; predeterminado `CARD`. | Método con el que Pay-me PinPAD procesará el pago. | | `tollData` | Object | No | Sus campos deben enviarse como String. | Datos de la operación de peaje. Pueden enviarse para fines de trazabilidad. | | `additionalFields` | Object | No | Todos los valores deben ser String. | Información complementaria asociada al pago. | Respeta los nombres y los tipos JSON de cada campo. Por ejemplo, envía `paymentMethod`, no `payment_method`. ## Detalle de los parámetros ### `operationNumber` Genera un `operationNumber` nuevo para cada pago y almacénalo antes de llamar a `POST /authorize`. El valor debe cumplir estas condiciones: * ser una cadena de 1 a 64 caracteres sin espacios; * ser único para una operación real de pago; * permanecer asociado a la operación hasta obtener un resultado final. Si no recibes el resultado por un timeout o una pérdida de conexión, conserva la referencia original. Consulta el estado actualizado antes de decidir si corresponde reenviar exactamente la misma solicitud. No generes otro `operationNumber` después de un timeout. La solicitud original puede haber producido un cargo. ### `amount` Expresa el importe en unidades menores, sin símbolo de moneda, separadores ni decimales: | Importe | Valor válido de `amount` | | - | -: | | S/ 1.00 | `"100"` | | S/ 8.50 | `"850"` | | S/ 15.00 | `"1500"` | | S/ 125.40 | `"12540"` | Envía `amount` como entero JSON o String numérico positivo de 1 a 12 dígitos (`^\d{1,12}$`). No utilices decimales, signos, espacios ni separadores. El servidor puede aplicar un máximo configurado; el ejemplo S/ 500.00 de la guía no establece un límite universal. ### `currency` `currency` es opcional: acepta un número de tres dígitos o su String. Si lo omites, se usa `604`. Para pagos en soles peruanos, utiliza `"604"`. Confirma con Alignet cualquier moneda distinta de PEN antes de habilitarla en producción. ### `paymentMethod` Si envías `paymentMethod`, usa uno de estos valores, sin distinguir mayúsculas. Si lo omites, se usa `CARD`: | Valor | Método de pago | | - | - | | `CARD` | Tarjeta de crédito o débito. | | `QR` | Código QR. | Cada solicitud admite un solo método de pago. No envíes `CARD` y `QR` juntos, arreglos, valores combinados como `"CARD,QR"`, ni valores diferentes de los documentados. `card` y `qr` son válidos. ### `tollData` Utiliza `tollData` para enviar datos de la operación de peaje con fines de trazabilidad. El objeto y todos sus campos son opcionales. Se fusiona con `additionalFields`; ante claves coincidentes prevalece `tollData`. Las claves siguientes son convenciones de peaje, no un catálogo de restricciones del servidor. | Campo | Tipo JSON | Obligatorio | Descripción | | - | - | - | - | | `shiftId` | String | No | Identificador del turno y la vía. Su formato se acuerda para cada integración; no existe una composición única para todos los operadores. | | `tollOperatorId` | String | No | Identificador del operador del peaje. | | `tollPointId` | String | No | Identificador del punto de peaje. | | `laneId` | String | No | Identificador de la vía o carril. | | `transactionDateTime` | String | No | Fecha y hora de la operación en formato ISO 8601, con zona horaria. | | `plate` | String | No | Placa del vehículo. | | `tollAmount` | String | No | Importe del peaje expresado en unidades menores. | | `withholdingAmount` | String | No | Importe de la retención expresado en unidades menores. | | `direction` | String | No | Sentido de circulación. | | `vehicleClass` | String | No | Categoría del vehículo. | | `axleCount` | String | No | Número de ejes. | Como recomendación de conciliación para el comercio, relaciona los importes de peaje y retención así; la guía no documenta esta igualdad como validación del servidor: ```text theme={"system"} amount = tollAmount + withholdingAmount ``` #### Interpretación de `shiftId` para reportes El formato de `shiftId` se acuerda para cada integración. Por ejemplo, si el formato acordado es `punto + vía + turno + fecha operativa (AAAAMMDD)`, el valor ilustrativo `AB2N20260710` se interpreta así: | Componente | Valor | Significado | | - | - | - | | Punto | `AB` | Debe coincidir con `tollPointId`. | | Vía | `2` | Debe coincidir con `laneId`. | | Turno | `N` | Código del turno según la convención acordada. | | Fecha operativa | `20260710` | Fecha asociada al turno en formato `AAAAMMDD`. | Con la convención acordada, estos componentes pueden usarse como filtros y columnas del reporte de conciliación. En esta convención, deriva `shift` y `shiftDate` de `shiftId` para reportes; no necesitas duplicarlos en el request. Define también cómo interpretar la fecha operativa cuando un turno cruza la medianoche; puede ser distinta del día indicado por `transactionDateTime`. Si el formato del identificador es diferente, define la regla de extracción antes de usarlo en reportes. No apliques el formato ilustrativo a todas las integraciones. ### `additionalFields` El comercio puede declarar en `additionalFields` cualquier otro dato complementario que necesite. Los valores se envían como cadenas. ```json theme={"system"} { "additionalFields": {} } ``` Si el comercio no necesita agregar información complementaria, puede enviar un objeto vacío u omitir `additionalFields`. ## Ejemplo de autorización para peaje El siguiente ejemplo ilustra los datos de la operación de peaje con identificadores genéricos. El formato de `shiftId` mostrado es solo un ejemplo de composición: código del punto (`AB`) + vía (`2`) + turno (`N`) + fecha operativa (`20260710`). Cada integración debe acordar su propia convención. ```json theme={"system"} { "operationNumber": "012001000039", "amount": "3150", "currency": "604", "paymentMethod": "CARD", "tollData": { "shiftId": "AB2N20260710", "tollOperatorId": "OPERADOR_01", "tollPointId": "AB", "laneId": "2", "transactionDateTime": "2026-07-10T00:13:00-05:00", "plate": "TIY953", "tollAmount": "2583", "withholdingAmount": "567", "direction": "NORTH", "vehicleClass": "HEAVY", "axleCount": "3" }, "additionalFields": {} } ``` ## Enviar la solicitud Este ejemplo envía una solicitud mínima: ```bash theme={"system"} curl --header "Connection: close" --request POST "http://:/authorize" \ --header "Content-Type: application/json" \ --max-time 110 \ --data '{ "operationNumber": "44992528", "amount": "100", "currency": "604", "paymentMethod": "QR" }' ``` Reemplaza `` y `` por los valores configurados en tu terminal. ## Respuestas de autorización Interpreta `success`, `resultCode`, `resultMessage` y `result`; este endpoint no devuelve `status` propio. Consulta el [contrato, los ejemplos y la tabla HTTP](/procesamiento-fisico/alignet-transit/respuesta-estados-y-codigos#respuestas-de-post-%2Fauthorize). La respuesta de `/cancel` se interpreta por separado en [Cancelación](/procesamiento-fisico/alignet-transit/cancelacion). ## Verificar el resultado final 1. Conserva `operationNumber`; ante HTTP `202 WAITING_RESULT`, timeout o incertidumbre, consulta la pasarela con `GET /payments/{operationNumber}`. 2. En una consulta `200/00`, interpreta `transaction.state`; `00` solo indica que la operación fue encontrada. 3. Una consulta `200/03`, `404/05`, `503` o `504` no confirma rechazo ni permite otro cobro. Mantén la operación sin resolver y consulta o escala. 4. No sustituyas un resultado confirmado por un `202 WAITING_RESULT` tardío ni decidas por el cierre de pantalla. Tras cancelación fallida, un CARD autorizado permite evaluar un extorno independiente; conserva QR autorizado sin devolución. # Certificación y salida a producción Source: https://docs.pay-me.com/procesamiento-fisico/alignet-transit/pruebas-y-salida-a-produccion Casos de prueba, evidencias y checklist de certificación para Pay-me Transit PinPAD. La certificación debe validar el contrato HTTP, la interacción física con el Wiseasy P5L, la decisión de negocio y la recuperación sin doble cobro. Las tablas describen **resultados esperados**, no pruebas ejecutadas. Registra el resultado real y su evidencia antes de marcar un criterio como cumplido. ## Preparación Antes de ejecutar casos: * registra la versión de Pay-me PinPAD instalada; * confirma la asociación entre sistema central, punto de atención y Wiseasy P5L; * configura una IP estable y el puerto del terminal; * ejecuta `GET /health` desde el sistema central; * completa la verificación de llaves en el terminal; * configura 110 segundos para los POST y 20 segundos para la consulta del cobro; abre una conexión por petición, sin keep-alive; * habilita persistencia y logs sanitizados; * acuerda referencias, montos y medios de pago de prueba. ## Casos de contrato | Caso | Estímulo | Resultado esperado | | - | - | - | | Disponibilidad | `GET /health` | HTTP `200`, `status: "UP"`, `service: "Alignet ECR"`. | | Solicitud mínima | Solo `operationNumber` y `amount` válidos | Se procesa con moneda `604` y método `CARD` predeterminados. | | Solicitud completa | Incluye campos obligatorios, `tollData` y `additionalFields` con valores String | La autorización se procesa sin error de validación. | | Referencia numérica | `operationNumber: "44992528"` | Se acepta como String numérico. | | Referencia alfanumérica | `operationNumber: "CAJA-01_A"` | Se acepta: 1–64 caracteres sin espacios; no se exige que sea numérica. | | Límites de referencia | Cadenas de 1 y 64 caracteres; vacía, de 65 o con espacios | Aceptar las dos primeras; las otras devuelven `400 BAD_REQUEST`. | | Monto como cadena | `amount: "100"` | Se acepta como String numérico en unidades menores. | | Monto como número JSON | `amount: 100` | Se acepta como entero positivo en unidades menores. | | Moneda como cadena | `currency: "604"` | Se acepta como String numérico de tres dígitos. | | Moneda como número JSON | `currency: 604` | Se acepta como número de tres dígitos. | | Moneda ausente | No incluye `currency` | Se usa `604`. | | Método de pago | Ejecuta solicitudes independientes con `paymentMethod: "CARD"` y `paymentMethod: "QR"` | Cada valor se acepta por separado. | | Método de pago ausente | No incluye `paymentMethod` | Se usa `CARD`. | | Método sin distinguir mayúsculas | `card` o `qr` en solicitudes independientes | Se acepta cada valor. | | Métodos de pago simultáneos | Envía `CARD` y `QR` juntos, como arreglo o valor combinado | HTTP `400` con `BAD_REQUEST`. | | Método de pago inválido | Envía un valor distinto de `CARD` o `QR` | HTTP `400` con `BAD_REQUEST`. | | Referencia inválida | Vacía, de más de 64 caracteres o con espacios | HTTP `400` con `BAD_REQUEST`. | | Monto inválido | Cero, negativo, decimal, no numérico o mayor de 12 dígitos | HTTP `400` con `BAD_REQUEST`. | | Moneda inválida | No contiene exactamente tres dígitos | HTTP `400` con `BAD_REQUEST`. | | Colisión de datos | Misma clave con valores diferentes en `tollData` y `additionalFields` | Prevalece el valor de `tollData` en los campos fusionados. | | Campo adicional inválido | Valor que no es String | HTTP `400` con `BAD_REQUEST`. | ## Casos transaccionales | Caso | Resultado esperado | Decisión del sistema central | | - | - | - | | Pago aprobado | HTTP `200`, `success: true`, `resultCode: "00"`, `result.state: "AUTORIZADO"`, sin `status` propio. | Confirmar y aplicar la regla de apertura. | | Pago rechazado | HTTP `200`, `success: false`, código SDK distinto de `00` y `result.state` crudo de la pasarela. | No confirmar. | | Extorno explícito CARD aprobado | HTTP `200`, `REVERSED` con `00`, `16` o `17`. | Registrar extorno confirmado o éxito equivalente. | | Extorno pendiente | HTTP `202`; `SEARCHING`, `PROCESSING` o `PENDING`. `P22` se clasifica como `PENDING`. | Esperar `Retry-After: 2` y consultar `GET /reversals/{operationNumber}`. | | Extorno denegado | HTTP `200`, `DENIED`. | No registrar como extornado ni reintentar automáticamente. | | Cobro sin confirmar | HTTP `202`, `success: false`, `WAITING_RESULT`, `result: null`, sin `status`. | Seguir consultando con la misma referencia, sin otro cobro. | | Extorno sin confirmar | HTTP `502`, `UNKNOWN`: la solicitud terminó con error. El cuerpo incluye solo `operationNumber`, `status` y `message`. | Revisar si se ejecutó el extorno; no registrar éxito ni reenviar automáticamente. | | Método incorrecto | Usar un método no admitido en una ruta válida. | HTTP `405`, `METHOD_NOT_ALLOWED`. | | Consulta inválida | Consultar `/payments` o `/reversals` con segmento vacío o inválido. | HTTP `400` según el error de ruta; no inferir un resultado financiero. | | Headers de respuesta | Todas incluyen `Connection: close` y `Cache-Control: no-store`; HTTP `202` añade `Retry-After: 2`. | Comprobar headers y respetar el intervalo de consulta. | | Espera agotada | Autorización: HTTP `202`, `success: false`, `WAITING_RESULT`, `result: null`. | Consultar, sin nuevo cobro. | | Terminal ocupado | Otra referencia durante un cobro activo devuelve `409 POS_BUSY`. | Esperar y reintentar cuando se libere. | | Terminal no listo | HTTP `503 POS_NOT_AVAILABLE`. | Recuperar disponibilidad antes de reintentar. | | Referencia inexistente | La consulta del cobro devuelve `404/05`, `success: false`, `transaction: null`. | Verificar la referencia; no asumir rechazo financiero. | ## Consulta del cobro en la pasarela Comprueba esta forma en todas las respuestas: `operationNumber`, `success`, `resultCode`, `resultMessage` y `transaction`, sin `status` propio. El GET no devuelve `202` ni estados locales. | Caso | Resultado esperado | Decisión | | - | - | - | | Operación encontrada | `200/00`, `success: true`, `transaction.state` crudo | `00` significa encontrada. `AUTORIZADO` confirma aprobación; `CANCELADO` confirma cancelación del cobro. | | Operación no encontrada | `404/05`, `success: false`, `transaction: null` | Verificar referencia y terminal; no confirmar rechazo ni habilitar otro cobro. | | SDK no inicializado o terminal sin disponibilidad | `503/P04` o `POS_NOT_AVAILABLE`, `success: false`, `transaction: null` | Restablecer disponibilidad y consultar de nuevo. | | Espera interna agotada | `504/SEARCH_TIMEOUT`, `success: false`, `transaction: null` | Cobro no verificado; consultar de nuevo o escalar. | | Servicio incierto | `200/03`, `success: false`, `transaction: null` | No confirmar rechazo ni iniciar otro cobro. | | Consulta lenta | Respuesta en aproximadamente 12–15 segundos | El timeout de ejemplo de 20 segundos permite leerla; una desconexión conserva la operación sin resolver. | ## Validación de cancelación Aplica estos casos a CARD y QR. El servicio valida ejecución y correspondencia con la operación; el cierre visual no acredita éxito. | Caso | Estímulo | Resultado esperado | | - | - | - | | Cancelación abandonada con `14/15` | Recibir `DENIED/14` o `DENIED/15`. | No reconocer cancelación exitosa; consultar el cobro original. | | Cancelación confirmada | Cancelar una autorización activa y obtener un resultado de esa operación. | `CANCELLED` con `00`, `16` o `17`, validado por el servicio; reconocer el resultado sin consulta obligatoria. | | Éxito equivalente de cancelación | Recibir HTTP `200`, `CANCELLED` con `16` o `17`. | Reconocer cancelación validada; conservar el código SDK sin convertirlo a `00`. | | Cancelación no ejecutada | Simular un fallo que impida ejecutar la cancelación. | Respuesta de error, sin informar éxito; consultar el cobro original. No se anticipan HTTP, código ni mensaje del nuevo error. | | Resultado de otra operación | Entregar al servicio un resultado que no corresponda al `operationNumber` solicitado. | Rechazarlo con una respuesta de error; no cerrar la operación como cancelada. | | Cancelación denegada | Obtener `DENIED` con `14`, `15`, `18`, `19`, `20`, `01`, `03` u otro código SDK. | Cancelación rechazada o abandonada; recuperar el cobro original sin asumir su resultado. | | Segunda cancelación concurrente | Enviar otro `/cancel` para la misma referencia mientras se procesa el primero. | HTTP `409`, `ERROR`, `CANCELLATION_IN_PROGRESS`; no repetir el POST. | | Venta no encontrada | Obtener `05` o `07` del SDK en cancelación. | HTTP `404`; no inferir el resultado financiero del cobro. El cuerpo usa `status: "ERROR"`, `resultCode: "NOT_FOUND"`. | | Timeout o incertidumbre | Perder la respuesta o recibir HTTP `202`, `PENDING` con `P22`. | Mostrar **Cancelación no confirmada**; consultar el cobro original, respetando `Retry-After: 2` en HTTP `202`. | Comprueba que `GET /payments/{operationNumber}` informa el cobro original, no el resultado de la solicitud de cancelación. Consulta la pasarela, sin `status` propio ni HTTP `202`. Ante `200/03`, `404/05`, `503` o `504`, conserva la referencia y no habilites otro cobro. Los ciclos repiten solo el GET. ## Cancelación CARD | Caso | Estímulo | Resultado esperado | | - | - | - | | Cobro aprobado tras cancelación fallida | Recuperar `200/00` con `transaction.state: "AUTORIZADO"` en el cobro original. | Evaluar un extorno independiente con `POST /reversals` y el `operationNumber` de la venta, sin duplicados. Reconocer éxito con `REVERSED` y `00`, `16` o `17`; consultar `/reversals/{operationNumber}` si no está confirmado. | No debe generarse un extorno automático ante cualquier error de cancelación. Presenta la tarjeta cuando el PinPAD la solicite en el extorno. ## Cancelación QR | Caso | Estímulo | Resultado esperado | | - | - | - | | QR pendiente | Generar el QR sin pagar. | Ya existe la transacción pendiente asociada al `operationNumber`; mostrar o escanear no confirma el pago. | | Cancelación validada | Cancelar o inhabilitar el QR pendiente. | Reconocer `CANCELLED` con `00`, `16` o `17`, sujeto a la validación del servicio. | | Pago aprobado tras cancelación fallida | Recuperar `200/00` con `transaction.state: "AUTORIZADO"` en el cobro original. | Conservar el pago aprobado y registrar la discrepancia. Ni `/cancel` ni refund devuelven el monto; no enviar `/reversals`. | ## Casos de idempotencia y recuperación | Caso | Validación esperada | | - | - | | Misma referencia durante el proceso | El segundo envío no inicia otro cobro y devuelve `202 WAITING_RESULT`, `success: false`, `result: null`, sin `status` propio. | | Misma referencia finalizada | Devuelve `200` con el resultado guardado sin otro cargo. | | Otra referencia concurrente | Devuelve `409 POS_BUSY`. | | Timeout del sistema central | El sistema central consulta la referencia original antes de aceptar otro intento. | | Pérdida de red | Al reconectar, el sistema central consulta las operaciones abiertas. | | Reinicio del sistema central | Recupera las referencias guardadas y consulta los cobros cuyo resultado aún no conoce. | | Reinicio del P5L durante el cobro | Consultar la pasarela con la referencia original; no anticipar un estado local de respuesta ni concluir rechazo. | | `202` de POST o de consulta local de extorno | Respetar `Retry-After: 2`; el GET del cobro no devuelve `202`. | | Extorno exitoso o en curso repetido | `REVERSED` devuelve `200` guardado; `SEARCHING`/`PROCESSING`/`PENDING` devuelve `202`, sin otro intento. | | Extorno previo `NOT_FOUND` | Otro POST devuelve `404` sin ejecutar otro intento. | | Nuevo extorno tras `DENIED`, `UNKNOWN` o `ERROR` final | Tras consulta y decisión controlada, el POST puede ejecutar otro intento real. No activar reintento automático por incertidumbre. | ## Verificaciones de seguridad El puerto del terminal no es accesible desde redes no autorizadas ni desde Internet. `operationNumber` no contiene datos personales. Las solicitudes, respuestas y evidencias no contienen PAN completo, CVV, PIN, PIN Block, pistas ni datos EMV sensibles. El acceso y la retención de logs están controlados. ## Lista de verificación para producción Cada Wiseasy P5L tiene IP fija o reserva DHCP y puerto documentado. El sistema central distingue cancelación validada de recuperación del cobro ante fallo o incertidumbre, para CARD y QR. El timeout definitivo del sistema central es mayor que la espera interna confirmada de Pay-me PinPAD. La frecuencia, el backoff y el límite de consulta están acordados. La autorización se confirma con `200`, `success: true`, `00` y `result.state: "AUTORIZADO"`; en consulta `200/00`, se interpreta `transaction.state`. La lógica de idempotencia, concurrencia, timeout y reinicio superó las pruebas. La decisión de negocio para resultados inciertos y estados propios de cancelación/extorno está aprobada. Los datos del peaje permanecen en `tollData`; las claves complementarias, monedas y métodos están confirmados. Las clasificaciones de cobro, cancelación y extorno respetan los códigos SDK sin normalizaciones adicionales. Existen monitoreo, contactos de soporte y un procedimiento de escalamiento. El integrador y Alignet aprobaron las evidencias de integración y UAT. Se valida el extorno CARD independiente tras cancelación fallida y se conservan pagos QR aprobados sin devolución. ## Criterio de aceptación No habilites producción mientras exista riesgo de interpretar una consulta incierta, un timeout o `404/05` como rechazo y generar un cobro adicional. La salida requiere demostrar que toda operación incierta conserva su referencia original hasta resolverse o escalarse. # Referencia de endpoints Source: https://docs.pay-me.com/procesamiento-fisico/alignet-transit/referencia-de-endpoints Métodos, rutas y códigos HTTP de la interfaz local de Pay-me Transit PinPAD. El sistema central consume la interfaz HTTP/JSON que expone Pay-me PinPAD en el Wiseasy P5L. Construye todas las solicitudes a partir de la URL configurada para cada terminal: ```text theme={"system"} http://: ``` El puerto predeterminado es `8080`. Confirma la IP y el puerto de cada terminal antes de integrar. ## Endpoints disponibles | Método | Ruta | Uso | Respuestas documentadas | | - | - | - | - | | `GET` | `/health` | Verificar que Pay-me PinPAD esté accesible. | `200` | | `POST` | `/authorize` | Iniciar CARD o QR; generar el QR crea la transacción pendiente. | `200`, `202`, `400`, `409`, `503` | | `GET` | `/payments/{operationNumber}` | Consultar el cobro en la pasarela. | `200`, `400`, `404`, `503`, `504` | | `POST` | `/cancel` | Solicitar cancelar una autorización activa. | `200`, `202`, `400`, `404`, `409`, `503` | | `POST` | `/reversals` | Solicitar un extorno explícito de una venta CARD aprobada. No aplica a QR. | `200`, `202`, `400`, `404`, `409`, `502`, `503` | | `GET` | `/reversals/{operationNumber}` | Consultar el estado local del extorno CARD. | `200`, `202`, `400`, `404`, `502` | `POST /cancel` y `POST /reversals` son operaciones distintas. Ambas usan el `operationNumber` de la autorización original y se consumen en el mismo host y puerto que `POST /authorize`. No existe un endpoint de consulta de cancelación. Su desenlace se devuelve solo en `POST /cancel`; `/payments` consulta el cobro original. Todas las respuestas incluyen `Connection: close` y `Cache-Control: no-store`; abre una conexión por petición. Solo HTTP `202` añade `Retry-After: 2`. ## Verificar disponibilidad ```http theme={"system"} GET /health ``` ```bash theme={"system"} curl --header "Connection: close" "http://:/health" ``` Respuesta esperada: ```json theme={"system"} { "status": "UP", "service": "Alignet ECR" } ``` Usa `GET /health` al configurar el terminal y antes de iniciar operaciones cuando necesites comprobar disponibilidad. Una respuesta satisfactoria confirma la aplicación local; no confirma que el SDK esté inicializado ni que el procesador aprobará pagos. ## Autorizar y consultar un pago `POST /authorize` requiere un cuerpo JSON. Consulta [Solicitud de autorización](/procesamiento-fisico/alignet-transit/parametros-de-envio) para conocer los campos, las validaciones y los ejemplos. `POST /authorize` devuelve `success`, `resultCode`, `resultMessage` y `result`, sin `status` propio. `GET /payments/{operationNumber}` consulta la pasarela y devuelve `success`, `resultCode`, `resultMessage` y `transaction`, también sin `status` propio. `00` significa encontrada: lee `transaction.state`. Este GET no devuelve `202`; consulta el [contrato y la tabla HTTP](/procesamiento-fisico/alignet-transit/respuesta-estados-y-codigos#consulta-de-estado). No lleva cuerpo. Usa exactamente la referencia enviada en la autorización: ```bash theme={"system"} curl -i --header "Connection: close" --max-time 20 "http://:/payments/44992528" ``` ## Cancelar una autorización activa `POST /cancel` recibe el `operationNumber` original. Reconoce cancelación exitosa solo con `CANCELLED` y `00`, `16` o `17`, validada por el servicio. HTTP `200` con `DENIED`, incluido `14`, no confirma éxito. Ante fallo, timeout o incertidumbre, consulta el cobro original; no hay un GET de cancelación. El cierre de pantalla no acredita el resultado. Revisa las [respuestas y acciones de cancelación](/procesamiento-fisico/alignet-transit/cancelacion). En QR solo se cancela o inhabilita el código; ni `/cancel` ni refund devuelven pagos. Un QR encontrado con `transaction.state: "AUTORIZADO"` conserva el pago aprobado, sin reversa. ## Extornar una venta aprobada `POST /reversals` solicita un extorno independiente y total de una venta CARD aprobada. No aplica a QR. Usa `GET /reversals/{operationNumber}` ante espera, timeout o pérdida de respuesta. Encontrar el cobro original no determina el resultado del extorno. Consulta [Extorno de una venta CARD aprobada](/procesamiento-fisico/alignet-transit/extorno) para interpretar `REVERSED`, `DENIED` y el cuerpo compacto de `502 UNKNOWN`. ## Rutas fuera del contrato vigente Una ruta válida con método incorrecto devuelve HTTP `405` y `METHOD_NOT_ALLOWED`; una ruta desconocida devuelve HTTP `404` y `NOT_FOUND`. No uses `/payment`, `/api/v1/payments`, `/api/v1/payments/{operationNumber}` ni `DELETE /charges` para esta integración. La autorización vigente sí incluye `result.state` y puede incluir `transactionID`, `processorResponse` y `lifecycle`. No traslades a esta interfaz los códigos locales `P01–P21` de otras especificaciones. Implementa el payload de `POST /authorize`. Interpreta códigos HTTP y estados transaccionales. # Requisitos y responsabilidades Source: https://docs.pay-me.com/procesamiento-fisico/alignet-transit/requisitos-y-responsabilidades Requisitos y responsabilidades del comercio, el integrador, Pay-me PinPAD y Alignet. ## Matriz de responsabilidades | Área | Comercio o integrador — sistema central | Pay-me PinPAD / Alignet | Validación conjunta | | - | - | - | - | | Red local | Alcanzar la IP y el puerto del terminal; configurar firewall y timeout. | Exponer el servidor HTTP en el Wiseasy P5L. | Ejecutar `GET /health` desde el sistema central. | | Operación | Calcular el monto, generar y persistir `operationNumber` y aplicar la decisión de negocio. | Validar la solicitud; ejecutar el cobro, cancelación o extorno; y devolver el resultado. | Probar aprobación, rechazo, cancelación y recuperación por método; extorno únicamente CARD. | | Idempotencia | Mantener una sola referencia por operación real y consultar ante incertidumbre. | Evitar un segundo cargo para la misma referencia y conservar el resultado. | Simular timeout, reenvío y consulta. | | Concurrencia | Serializar solicitudes destinadas al mismo terminal. | Procesar una operación a la vez y devolver `409 POS_BUSY` a otra referencia. | Enviar solicitudes concurrentes controladas. | | Configuración | Registrar IP, puerto y asociación entre sistema central, punto de atención y terminal. | Instalar la aplicación, configurar IP/puerto y verificar llaves. | Confirmar el estado operativo que muestra Pay-me PinPAD. | | Seguridad | Proteger la red, los logs y los datos de conciliación. | No exponer datos sensibles de tarjeta en la respuesta. | Revisar evidencias sanitizadas. | | Soporte | Conservar solicitudes, respuestas, códigos HTTP y marcas de tiempo. | Correlacionar la operación y apoyar el diagnóstico. | Definir responsables y escalamiento. | ## Requisitos del sistema central ### Cliente HTTP * Implementa `GET /health`, `POST /authorize`, `GET /payments/{operationNumber}`, `POST /cancel`, `POST /reversals` y `GET /reversals/{operationNumber}`. * Envía `Content-Type: application/json` en la autorización, la cancelación y el extorno. * Configura al menos 100 a 110 segundos de timeout para `POST /authorize`, `POST /cancel` y `POST /reversals` con la espera de desarrollo actual. * Abre una conexión por petición: todas las respuestas usan `Connection: close`; no reutilices keep-alive. * Configura la consulta del cobro para cubrir aproximadamente 12–15 segundos, por ejemplo con timeout de 20 segundos. * Lee el HTTP y el JSON; verifica `Cache-Control: no-store` y respeta `Retry-After: 2` en HTTP `202`. * Maneja `200`, `202`, `400`, `404`, `405`, `409`, `502`, `503` y `504` según la operación. * Mantén una cola o bloqueo por terminal para no enviar cobros concurrentes. ### Estado transaccional * Persiste la referencia y los datos del cobro antes del envío. * Confirma autorización con `success: true`, `resultCode: "00"` y `result.state: "AUTORIZADO"`. En consulta `200/00`, interpreta `transaction.state`. Ante cancelación fallida, evalúa un extorno independiente solo en CARD; conserva QR aprobado sin devolución. * Interpreta `/cancel` por su respuesta. Ante fallo, timeout o incertidumbre, consulta el cobro original; no existe un GET de cancelación. * Solo en CARD, verifica el extorno completado o en curso antes de solicitar otro; conserva abiertas las operaciones cuya resolución no puedas comprobar. * Consulta la pasarela ante cobros sin verificar; `200/03`, `404/05`, `503` o `504` no confirman rechazo ni permiten otro cargo. Un extorno `UNKNOWN` con HTTP `502` requiere revisión; no confirma éxito. * Recupera las operaciones abiertas después de un reinicio del sistema central. * No conviertas un timeout o `404` de consulta en rechazo financiero. ### Decisión de negocio * Define la acción que ejecutará el comercio después de una aprobación —por ejemplo, confirmar una venta o abrir una barrera— y cómo informará un rechazo o una cancelación. * Define el límite de espera y el escalamiento de una operación no resuelta. * Crea una referencia nueva solo después de resolver la operación anterior y verificar su resultado final. Distingue cancelación y rechazo por método, estado, código y mensaje. * Conserva `authorizationCode` y `operationNumber` para el comprobante y la conciliación. ## Preparación del Wiseasy P5L Alignet y el operador deben: * instalar la versión de Pay-me PinPAD correspondiente al package `com.alignet.pinpad.ecr`; * conectar el terminal a la red local y asignarle una IP estable; * configurar la IP y el puerto de escucha, cuyo valor predeterminado es `8080`; * confirmar la llamada real de `GET /health` desde el sistema central; * completar la verificación de inyección de llaves; * dejar la aplicación en **Listo para el siguiente vehículo**; * confirmar que el terminal dispone de la conectividad necesaria para procesar el pago. ## Lista de verificación inicial El sistema central y el Wiseasy P5L están en la misma red local y sin aislamiento entre clientes. La IP del terminal es fija o tiene una reserva DHCP. `GET /health` responde HTTP `200` desde el equipo donde se ejecuta el sistema central. El sistema central genera y persiste un `operationNumber` válido y único por cobro. `operationNumber` es un String de 1–64 caracteres sin espacios. `amount` es entero o String numérico positivo en unidades menores. Moneda y método son opcionales, con valores predeterminados `604` y `CARD`. El cliente maneja la consulta, idempotencia, concurrencia y reinicios. Está definido qué hacer ante un pago aprobado, rechazado o cuyo resultado aún no se conoce. Los logs de pruebas no contienen información sensible de tarjeta. # Respuestas, consulta y códigos Source: https://docs.pay-me.com/procesamiento-fisico/alignet-transit/respuesta-estados-y-codigos Esquemas JSON, códigos SDK y respuestas HTTP de cobro, cancelación y extorno. En Pay-me PinPAD **1.3.25**, autorización y consulta usan `success`, `resultCode` y `result.state` / `transaction.state`, sin `status` propio. Cancelación y extorno conservan `status`. HTTP `200` o el mensaje por sí solos no confirman éxito. Todas las respuestas incluyen `Connection: close` y `Cache-Control: no-store`. Abre una conexión por petición, sin reutilizar keep-alive. HTTP `202` añade `Retry-After: 2`. ## Estructura de respuesta de pago Cancelación y extorno utilizan esta forma normal. El bloque describe tipos, no una respuesta de prueba: ```json theme={"system"} { "operationNumber": "string", "status": "string", "resultCode": "string|null", "resultMessage": "string", "authorizationCode": "string|null", "completedAt": "string|null" } ``` | Campo | Uso | | - | - | | `operationNumber` | Referencia de la operación. | | `status` | Estado propio de cancelación o extorno. | | `resultCode` | Código SDK conservado o código propio de la app. | | `resultMessage` | Mensaje recibido; no sustituye la interpretación del estado y código. | | `authorizationCode` | Código de autorización o `null`. | | `completedAt` | Fecha UTC en formato `yyyy-MM-dd'T'HH:mm:ss'Z'`, solo cuando la operación terminó; en espera es `null`. | Extorno `UNKNOWN` con HTTP `502` utiliza una forma compacta distinta: ```json theme={"system"} { "operationNumber": "string", "status": "UNKNOWN", "message": "string" } ``` Esta forma no incluye `resultCode`, `resultMessage`, `authorizationCode` ni `completedAt`. La clave del mensaje es `message`. ## Respuestas de `POST /authorize` La respuesta contiene `operationNumber`, `success`, `resultCode`, `resultMessage` y `result`, sin `status` propio. Ejemplo sintético mínimo: ```json theme={"system"} { "operationNumber": "44992528", "success": true, "resultCode": "00", "resultMessage": "Operación autorizada", "result": { "transactionID": "a1b2c3d4-0001", "state": "AUTORIZADO", "amount": "100", "currency": "604" } } ``` `result` puede incluir `stateReason`, `additionalFields`, `paymentMethod` (con `name` y `methodDetail` ofuscado), `processorResponse` como String crudo y `lifecycle`. Estos campos pertenecen al contrato vigente; `authorization_code` puede llegar dentro de `processorResponse`. | HTTP | Campos de decisión | Acción | | - | - | - | | `200` | `success: true`, `00`, `result.state: "AUTORIZADO"` | Confirmar el cobro. | | `200` | `success: false`, código SDK y `result.state` crudo | Interpretar el desenlace del SDK; no decidir solo por HTTP. | | `202` | `success: false`, `WAITING_RESULT`, `result: null` | Esperar dos segundos y consultar el cobro. | | `400` | `success: false`, `BAD_REQUEST`, `result: null` | Corregir JSON o monto fuera del máximo configurado. | | `409` | `success: false`, `POS_BUSY`, `result: null` | Esperar a que termine la operación activa. | | `503` | `success: false`, `POS_NOT_AVAILABLE`, `result: null` | Restablecer disponibilidad. | ```json theme={"system"} { "operationNumber": "44992528", "success": false, "resultCode": "WAITING_RESULT", "resultMessage": "Consulte el estado antes de reintentar", "result": null } ``` HTTP `202` puede corresponder a una solicitud duplicada aún en curso, al tiempo de espera agotado o al control de tiempo del servicio. No inicies otro cobro. ## Consulta de estado `GET /payments/{operationNumber}` consulta **la pasarela**, no el estado local ni el resultado de `/cancel`. Devuelve `operationNumber`, `success`, `resultCode`, `resultMessage` y `transaction`, sin `status` propio. Puede tardar 12–15 segundos; usa un timeout de cliente que cubra esa espera, por ejemplo 20 segundos. ```json theme={"system"} { "operationNumber": "44992528", "success": true, "resultCode": "00", "resultMessage": "Operación encontrada", "transaction": { "transactionId": "a1b2c3d4-0001", "state": "AUTORIZADO", "amount": "100", "currency": "604", "authorizationCode": "123456" } } ``` `00` significa **operación encontrada**; interpreta el resultado financiero mediante `transaction.state` (por ejemplo, `AUTORIZADO` o `CANCELADO`). `transaction` puede incluir `stateReason` y `lifecycle`; no expone `processorResponse` ni `methodDetail` crudos. La consulta usa `transactionId`, mientras la autorización usa `transactionID`. | HTTP | `resultCode` | Resultado y acción | | - | - | - | | `200` | `00` | `success: true`, `transaction` encontrada; leer `transaction.state`. | | `404` | `05` | `success: false`, `transaction: null`; verificar referencia y terminal. | | `503` | `P04` o `POS_NOT_AVAILABLE` | `success: false`, `transaction: null`; restablecer SDK o disponibilidad. | | `504` | `SEARCH_TIMEOUT` | `success: false`, `transaction: null`; no verificado a tiempo, consultar de nuevo. | | `200` | `03` | `success: false`, `transaction: null`; consulta incierta del servicio. | Otros códigos SDK se reportan tal cual con `200`, según el mapeo específico de la guía. Este GET no devuelve `202` ni estados locales. Una consulta fallida, incierta o no encontrada no confirma rechazo ni permite otro cobro. ## Estados | Operación | Sigue esperando un resultado | La solicitud terminó | | - | - | - | | Cancelación (`PaymentStatus`) | `PENDING` | `CANCELLED`, `DENIED`, `ERROR` | | Extorno (`ReversalStatus`) | `SEARCHING`, `PROCESSING`, `PENDING` | `REVERSED`, `DENIED`, `UNKNOWN`, `ERROR` | En la forma normal, `completedAt` se informa solo en los estados de la última columna. Un estado `ERROR` significa que terminó con error, no que hubo éxito. `UNKNOWN` en extorno es final y devuelve HTTP `502` con el cuerpo compacto: revisa si se ejecutó con Alignet, sin asumir éxito ni reenviar automáticamente. ## Códigos confirmados ### Mapeo de códigos SDK | Código SDK | Cancelación | Extorno CARD | | - | - | - | | `00` | `CANCELLED` | `REVERSED` | | `16`, `17` | `CANCELLED`, éxito equivalente | `REVERSED`, éxito equivalente | | `P22` | `PENDING`, HTTP `202` | `PENDING`, HTTP `202` | | `05`, `07` | HTTP `404`, `ERROR/NOT_FOUND` | HTTP `404`, `ERROR/NOT_FOUND` | | `14`, `15`, `18`, `19`, `20`, `01`, `03` y otros | `DENIED` | `DENIED` | Conserva los códigos SDK; no los reemplaces por `00` ni por un código inventado. `14` significa abandono por cierre de autorización en curso; `15`, abandono con intento (QR cancelado). No confirman cancelación aprobada ni rechazo típico de tarjeta. ### Códigos propios de la app | Código | Significado | | - | - | | `BAD_REQUEST` | JSON, campos o segmento de ruta inválidos. | | `NOT_FOUND` | Cancelación, extorno o ruta no encontrados; la consulta del cobro usa `05`. | | `POS_NOT_AVAILABLE` | SDK no listo o pantalla no disponible. | | `POS_BUSY` | Terminal ocupado. | | `CANCELLATION_IN_PROGRESS` | Ya existe una cancelación en curso para esa referencia. | | `PROCESSING`, `SEARCHING` | Fases locales del extorno en curso; no son estados de `/payments`. | | `WAITING_RESULT` | Tiempo de espera agotado, sin resultado confirmado. | | `SEARCH_TIMEOUT` | Consulta del cobro no verificada a tiempo; HTTP `504`. | | `UNKNOWN` | Extorno incierto final; HTTP `502`, cuerpo compacto con `message`. | | `METHOD_NOT_ALLOWED` | Ruta válida con método HTTP incorrecto. | ## Matriz de decisión | Endpoint | Qué informa | Acción | | - | - | - | | `POST /authorize` | Resultado del cobro. | Confirmar `success: true`, `00` y `result.state: "AUTORIZADO"`. | | `GET /payments/{operationNumber}` | Cobro en la pasarela. | `00` significa encontrada; interpretar `transaction.state`. | | `POST /cancel` | Resultado de esa solicitud de cancelación. | Éxito solo con `CANCELLED` y `00`, `16` o `17`, validado por el servicio. `DENIED/14` no confirma cancelación. | | `POST /reversals` | Resultado de un extorno CARD independiente. | Éxito con `REVERSED` y `00`, `16` o `17`. | | `GET /reversals/{operationNumber}` | Estado local del extorno CARD. | Consultar cuando corresponda; HTTP `502 UNKNOWN` exige revisión. | Una ruta válida con método incorrecto devuelve HTTP `405` y `METHOD_NOT_ALLOWED`. Una ruta desconocida devuelve HTTP `404` y `NOT_FOUND`. ## Consulta después de cancelar No existe un endpoint de consulta de cancelación: su desenlace se devuelve solo en `POST /cancel`. Si confirma una cancelación validada, no exige otro GET para reconocerla. Ante fallo, timeout o incertidumbre, consulta el cobro original y aplica la [decisión por método](/procesamiento-fisico/alignet-transit/cancelacion#verificar-el-resultado-final). Un pago CARD encontrado con `transaction.state: "AUTORIZADO"` permite evaluar un extorno independiente; un pago QR aprobado se conserva sin devolución. No sustituyas un resultado confirmado por un `202 WAITING_RESULT` tardío de `/authorize` ni uses el cierre de pantalla como prueba de cancelación. # Solución de problemas Source: https://docs.pay-me.com/procesamiento-fisico/alignet-transit/solucion-de-problemas Diagnóstico de conectividad, solicitudes inválidas, terminal ocupado y operaciones pendientes. Usa HTTP, `resultCode` y `operationNumber`. En autorización interpreta `success` y `result.state`; en consulta a pasarela, `success` y `transaction.state`; en cancelación/extorno, `status`. No uses el mensaje como única base para decidir. El extorno `502 UNKNOWN` utiliza el cuerpo compacto con `message`. ## Diagnóstico rápido | Síntoma | Causa probable | Acción | | - | - | - | | `GET /health` no responde | IP o puerto incorrectos, firewall, aislamiento de clientes o aplicación cerrada. | Verifica la IP del terminal, la misma red local, AP/Client Isolation, puerto TCP y estado de Pay-me PinPAD. | | `ping` no responde | Sin ruta IP o ICMP bloqueado. | Verifica direccionamiento. Si la red bloquea ICMP, prueba directamente `GET /health`. | | `404` al autorizar | El sistema central llama a una ruta anterior o incorrecta. | Usa exactamente `POST /authorize`; no uses `/payment` ni `/api/v1/payments`. | | `400 BAD_REQUEST` | JSON o campo inválido. | Revisa tipo, obligatoriedad, longitud y formato. Corrige antes de reenviar. | | `409 POS_BUSY` | Existe otra operación activa. | Espera a que termine. Serializa los cobros por terminal. | | `503 POS_NOT_AVAILABLE` | Pay-me PinPAD o el SDK de pagos no está listo. | El operador debe abrir la aplicación y dejarla en estado **Listo**. | | El sistema central pierde la respuesta de autorización | Timeout menor que la duración del cobro o pérdida de red. | No inicies otro cobro. Consulta el `operationNumber` original mediante `GET /payments/{operationNumber}`. | | Autorización `202 WAITING_RESULT` o extorno `202` en curso | Venció la espera, pero la operación puede seguir activa. | Usa el GET correspondiente y respeta `Retry-After: 2`. | | `202` o timeout en cancelación | No hay cancelación confirmada. | Muestra **Cancelación no confirmada**, consulta `GET /payments/{operationNumber}` y respeta `Retry-After`. | | `404/05` al consultar `/payments` | La operación no fue encontrada en la pasarela. | Verifica el valor exacto y el terminal consultado. No asumas rechazo financiero. | | Consulta `/payments` con `200/03`, `503/P04` o `POS_NOT_AVAILABLE`, `504/SEARCH_TIMEOUT` | No se pudo verificar el cobro. | Conserva la referencia y consulta de nuevo o escala; no concluyas rechazo ni generes otra venta. | | Timeouts o respuestas cruzadas al reutilizar sockets | El servidor cierra cada conexión. | Respeta `Connection: close`; abre una conexión por petición y desactiva keep-alive. | | Extorno `502 UNKNOWN` | Búsqueda ambigua o vencimiento del control de espera. | La solicitud terminó sin confirmar éxito. Conserva el cuerpo compacto y solicita revisión financiera; no reintentes automáticamente. | | `/cancel` con HTTP `200`, `DENIED`, incluido `14` | Cancelación rechazada o abandonada. | No registres cancelación exitosa; consulta el cobro original. | | Pantalla cerrada tras procesar cancelación | El cierre visual no determina el resultado financiero. | Evalúa la respuesta de `/cancel`. Ante fallo o incertidumbre, consulta el cobro original; reconoce éxito solo si está validado. | | Falla de conexión durante `/cancel` | No hay certeza de que el PinPAD recibió la solicitud o cerró la pantalla. | Muestra **Cancelación no confirmada**, recupera conexión y consulta la referencia original, sin repetir automáticamente el POST. | | Fallo interno de `/cancel` | La pantalla puede haberse cerrado sin resolver la cancelación financiera. | Muestra **Cancelación no confirmada** y consulta el estado. El POST debe reflejar el fallo o pendiente real. Falta definir la respuesta específica cuando no se ejecutó o no coincide la operación. | | QR `transaction.state: "AUTORIZADO"` en una consulta `200/00` sin solicitud de cancelación | Pago normal aprobado. | Confirmar pago y ejecutar la acción de negocio; no iniciar reversión. | | Cobro CARD `transaction.state: "AUTORIZADO"` en una consulta `200/00` tras cancelación fallida | El cobro original sigue aprobado. | Evalúa un extorno independiente con `POST /reversals`; no lo ejecutes automáticamente ante cualquier error. | | Pago QR confirmado durante cancelación | La transacción existía desde la generación del QR. | Ante cancelación fallida o incierta, consulta el cobro. Si aparece `transaction.state: "AUTORIZADO"` en una consulta `200/00`, conserva el pago aprobado y registra la discrepancia, sin refund ni reversa. | | `/cancel` devuelve `409 CANCELLATION_IN_PROGRESS` | Ya se procesa otra cancelación de la misma referencia. | No repitas el POST. Conserva la referencia y recupera el cobro original si no recibes el resultado. | | Método incorrecto en ruta válida | El método HTTP no está admitido. | HTTP `405`, `METHOD_NOT_ALLOWED`; corrige el método. | | `202 WAITING_RESULT` tardío de `/authorize` | Venció la espera de esa solicitud. | Conserva el resultado confirmado y consulta si queda una discrepancia. | ## `GET /health` no responde Sigue este orden: 1. Confirma en el Wiseasy P5L la IP y el puerto configurados. 2. Confirma que el sistema central usa esos valores y no una dirección anterior. 3. Verifica que ambos equipos estén en la misma red local. 4. Desactiva AP Isolation o Client Isolation para esos equipos. 5. Verifica que el firewall permita el puerto TCP configurado, `8080` por defecto. 6. Abre Pay-me PinPAD y confirma que la aplicación continúa en primer plano y lista. 7. Ejecuta nuevamente `GET /health` desde el mismo host y proceso de red que usará el sistema central. Respuesta esperada: ```json theme={"system"} { "status": "UP", "service": "Alignet ECR" } ``` ## `400 BAD_REQUEST` Verifica: * `operationNumber`: String de 1–64 caracteres sin espacios; conserva la referencia original y evita `/` para consultarla por ruta; * `amount`: entero JSON o String numérico positivo de 1 a 12 dígitos en unidades menores; * `currency`: número o String de exactamente tres dígitos; opcional, predeterminado `604`; * `paymentMethod`: opcional, predeterminado `CARD`; acepta `CARD` o `QR` sin distinguir mayúsculas; * `tollData`: objeto opcional de valores String; se fusiona con `additionalFields` y prevalece en colisiones; * `additionalFields`: objeto opcional cuyos valores son únicamente String; * header `Content-Type: application/json`; * JSON bien formado. Conserva el `resultMessage` para saber qué validación falló. No lo muestres sin control al usuario final. ## Timeout o desconexión Un timeout describe la conexión del sistema central, no el resultado financiero. El siguiente flujo corresponde a `POST /authorize`. Para una cancelación, conserva la referencia y aplica el [procedimiento de `/cancel`](/procesamiento-fisico/alignet-transit/cancelacion#manejo-de-202-y-p%C3%A9rdida-de-conexi%C3%B3n). El extorno CARD es una acción independiente y tiene su propia consulta. ```text theme={"system"} POST sin respuesta → conservar operationNumber → GET /payments/{operationNumber} → leer transaction.state si responde 200/00 → consultar de nuevo o escalar ante 200/03, 404/05, 503 o 504 → registrar solo un resultado confirmado ``` `GET /payments` puede tardar aproximadamente 12–15 segundos; usa un timeout de cliente de ejemplo de 20 segundos. No devuelve `202` ni estados locales. Confirma que el timeout del `POST` sea mayor que la espera interna del terminal. Con la referencia de desarrollo de 90 segundos, utiliza al menos 100 a 110 segundos. ## Operación pendiente por demasiado tiempo 1. Mantén el mismo `operationNumber`. 2. Si el POST devolvió HTTP `202`, respeta `Retry-After: 2` antes de consultar. En las siguientes consultas a pasarela, aplica el intervalo y límite acordados. 3. Verifica que el terminal conserve conectividad local y conectividad con la plataforma de pagos. 4. Al alcanzar el límite acordado, inmoviliza la operación y escala. No crees automáticamente otra venta. El límite máximo de consulta y la decisión de negocio deben definirse antes de producción. ## Datos para soporte Comparte: * ambiente, fecha y hora con zona horaria; * identificador del sistema central, punto de atención y Wiseasy P5L; * versión de Pay-me PinPAD; * IP y puerto, sin exponer información innecesaria fuera del canal de soporte; * `operationNumber` y `paymentMethod`; * cierre visual y secuencia de autorización, cancelación, consultas y extorno; * evidencia de extorno completado, en curso o todavía no verificable; * código HTTP, `Connection`, `Cache-Control` y `Retry-After`; * cuerpo de solicitud y respuesta sanitizados; * duración del `POST` y secuencia de consultas; * cambios de red o reinicios observados. No compartas PAN completo, CVV, PIN, PIN Block, pistas ni datos EMV sensibles. Revisa el algoritmo de consulta, idempotencia y concurrencia. Ejecuta los casos antes de habilitar cobros reales. # Response Source: https://docs.pay-me.com/response Estructura de respuesta para autorizaciones Ecommerce y POS mediante el endpoint POST /authorize. La respuesta del servicio de autorización aplica para ambos canales: * Ecommerce * POS Esta estructura permite identificar si la petición fue procesada, el resultado enviado por la marca, los identificadores de trazabilidad y el estado interno de la operación. ## Response exitoso ```json theme={"system"} { "success": "true", "transaction": { "tk_transaction_identifier": "42c2ff66-3eb0-4a69-9848-430fc722f6bc", "processor_response": { "message": { "code": "00", "description": "Pago exitoso" }, "brand_transaction_identifier": "306190611475347", "authorization_identification_response": "087657", "retrieval_reference_code": "619016007284", "system_trace_audit": "007284", "response_code": "00", "date_settlement": "0710" }, "meta": { "status": { "code": "success_operation", "message_ilgn": [ { "locale": "es_PE", "value": "Petición procesada correctamente" } ] }, "metrics": { "aggregate": { "start": "1783616336421", "end": "1783616348410", "duration": { "milliseconds": "11988" } } } } } } ``` ## Descripción de campos | Campo | Tipo | Descripción | | - | - | - | | `success` | string | Indica si la operación fue procesada por el servicio. Valores: `true` o `false`. | | `transaction.tk_transaction_identifier` | string UUID | Identificador único de la transacción en el sistema. | | `transaction.processor_response.message.code` | string | Código de respuesta de la marca. `00` indica operación aprobada. | | `transaction.processor_response.message.description` | string | Descripción legible del resultado de la operación. | | `transaction.processor_response.brand_transaction_identifier` | string | Identificador de la transacción asignado por la marca. | | `transaction.processor_response.authorization_identification_response` | string | Código de autorización de la operación. Normalmente contiene 6 dígitos. | | `transaction.processor_response.retrieval_reference_code` | string | RRN, Retrieval Reference Number. Se utiliza para consultas, trazabilidad y conciliación. | | `transaction.processor_response.system_trace_audit` | string | STAN, System Trace Audit Number. Identificador de auditoría de la transacción. | | `transaction.processor_response.response_code` | string | Código ISO de respuesta. `00` indica aprobación. | | `transaction.processor_response.date_settlement` | string | Fecha estimada de liquidación en formato `MMDD`. | | `transaction.meta.status.code` | string | Estado interno de la operación. Ejemplos: `success_operation`, `invalid_request`. | | `transaction.meta.status.message_ilgn` | array | Lista de mensajes localizados asociados al resultado de la operación. | | `transaction.meta.status.message_ilgn[].locale` | string | Locale del mensaje. Ejemplo: `es_PE`. | | `transaction.meta.status.message_ilgn[].value` | string | Mensaje descriptivo del resultado de la operación. | | `transaction.meta.metrics.aggregate.start` | string | Marca de tiempo de inicio del procesamiento. | | `transaction.meta.metrics.aggregate.end` | string | Marca de tiempo de fin del procesamiento. | | `transaction.meta.metrics.aggregate.duration.milliseconds` | string | Tiempo total de procesamiento en milisegundos. | ## Interpretación de respuesta exitosa Una autorización se considera aprobada cuando los principales campos de respuesta tienen los siguientes valores: | Campo | Valor esperado | Interpretación | | - | - | - | | `success` | `true` | La petición fue procesada por el servicio. | | `processor_response.message.code` | `00` | La marca respondió con aprobación. | | `processor_response.response_code` | `00` | Código ISO de aprobación. | | `meta.status.code` | `success_operation` | Estado interno exitoso. | ## Identificadores de trazabilidad Los siguientes campos pueden utilizarse para seguimiento transaccional, consultas, conciliación, soporte operativo y validación con la marca. | Campo | Uso | | - | - | | `tk_transaction_identifier` | Identificador único interno de la transacción. | | `brand_transaction_identifier` | Identificador asignado por la marca. | | `authorization_identification_response` | Código de autorización de la transacción. | | `retrieval_reference_code` | RRN utilizado para trazabilidad, consultas y conciliación. | | `system_trace_audit` | STAN de la transacción. | | `date_settlement` | Fecha estimada de liquidación. | ## Objeto `processor_response` El objeto `processor_response` contiene la respuesta recibida desde el procesador o la marca. ```json theme={"system"} { "processor_response": { "message": { "code": "00", "description": "Pago exitoso" }, "brand_transaction_identifier": "306190611475347", "authorization_identification_response": "087657", "retrieval_reference_code": "619016007284", "system_trace_audit": "007284", "response_code": "00", "date_settlement": "0710" } } ``` | Campo | Descripción | | - | - | | `message.code` | Código de respuesta de la marca. | | `message.description` | Descripción del resultado de la operación. | | `brand_transaction_identifier` | Identificador de la transacción asignado por la marca. | | `authorization_identification_response` | Código de autorización. | | `retrieval_reference_code` | RRN de la transacción. | | `system_trace_audit` | STAN de la transacción. | | `response_code` | Código ISO de respuesta. | | `date_settlement` | Fecha estimada de liquidación en formato `MMDD`. | ## Objeto `meta.status` El objeto `meta.status` contiene el estado interno de la operación dentro del sistema. ```json theme={"system"} { "status": { "code": "success_operation", "message_ilgn": [ { "locale": "es_PE", "value": "Petición procesada correctamente" } ] } } ``` | Campo | Descripción | | - | - | | `code` | Código interno del estado de la operación. | | `message_ilgn` | Lista de mensajes localizados. | | `message_ilgn[].locale` | Locale del mensaje. | | `message_ilgn[].value` | Descripción localizada del resultado. | ## Objeto `meta.metrics` El objeto `meta.metrics` contiene información de tiempos de procesamiento de la operación. ```json theme={"system"} { "metrics": { "aggregate": { "start": "1783616336421", "end": "1783616348410", "duration": { "milliseconds": "11988" } } } } ``` | Campo | Descripción | | - | - | | `aggregate.start` | Marca de tiempo de inicio del procesamiento. | | `aggregate.end` | Marca de tiempo de fin del procesamiento. | | `aggregate.duration.milliseconds` | Duración total del procesamiento en milisegundos. | ## Consideraciones * El campo `success` indica si la petición fue procesada por el servicio. * Una operación aprobada debe validar el código de respuesta de la marca y el estado interno de la operación. * El campo `tk_transaction_identifier` debe almacenarse para consultas posteriores. * El `retrieval_reference_code` y el `system_trace_audit` son relevantes para trazabilidad operativa. * El `authorization_identification_response` debe utilizarse como código de autorización de la operación. * El campo `date_settlement` permite identificar la fecha estimada de liquidación. * Los tiempos de `meta.metrics` pueden utilizarse para monitoreo, soporte y análisis de performance. *** ## Relación con los canales de autorización Ver trama autorización Ecommerce. Ver trama de autorización POS.