Widget de pago
El Widget embebe el checkout de Chytapay directamente en tu sitio: tu comprador paga por transferencia sin salir de tu página. Lo integrás con unas pocas líneas de JavaScript.
- El SDK corre en el navegador y se autentica con tu clave pública (pk).
- El pago lo creás en tu servidor con la API de integración; el Widget solo lo muestra.
- La UI del checkout vive en un iframe de Chytapay: no manejás datos sensibles.
Cómo funciona
El Widget se apoya en un par de claves a nivel de tu integración (mismo modelo que Stripe o Mercado Pago): una mitad pública para el navegador y una mitad secreta para tu servidor.
pk (publishable key) | Va en el navegador, dentro de tu HTML/JS. Identifica tu integración. Es pública por diseño: no da acceso a nada sensible. |
sk (secret key) | Va solo en tu servidor. Es la mitad secreta del par, para llamadas server-to-server. Nunca la pongas en el frontend. |
iframe | La pantalla de pago la renderiza Chytapay dentro de un iframe. Tu página nunca toca CBU, importes ni el estado del pago: solo pasa el id. |
Qué ve el pagador
El checkout se maneja solo: pasás el paymentId y no volvés a intervenir hasta el callback. Estas son las pantallas que ve tu comprador.
- Ingresa su documento. CUIL, CUIT o DNI. El pago se concilia por ese documento, no por el CVU.
- Recibe la cuenta. El CVU al que transferir, con botón para copiar y una cuenta regresiva hasta el vencimiento del cobro.
- Ve a nombre de quién. En esa misma pantalla le mostramos el nombre que ARCA tiene registrado para su documento, porque la transferencia tiene que salir de una cuenta a ese nombre.
- Transfiere. Desde su propia cuenta. Si sale de otra, puede no acreditarse.
- Ve el resultado. Si entró todo, se dispara onSuccess. Si entró de menos, ve cuánto falta y el mismo CVU para completar.
Paso 1: Obtener tus claves
Generás el par pk/sk desde el Portal de integración, en My Integration → Credenciales → Claves del Widget.
- Entrá al Portal y abrí la sección Credenciales.
- Generá las claves del Widget. La pk queda visible siempre; la sk se muestra una única vez.
- Guardá la sk en un lugar seguro (un secret manager, variables de entorno). Si la perdés, rotála desde el mismo lugar.
Paso 2: Crear el pago en tu servidor
El Widget no crea pagos: muestra uno que ya existe. Desde tu servidor creás el cobro con type: "checkout" y te quedás con el paymentRequestId. Ese id es lo único que le pasás al Widget.
Para crear el cobro, seguí la guía de Crear cobros. El paymentId del Widget es el id del payment request que te devuelve la API.
Paso 3: Instalar el SDK
Sumás el SDK de dos maneras: por CDN con una etiqueta script, o instalándolo desde npm si usás un bundler.
Paso 4: Mostrar el checkout
Inicializás el SDK con tu pk una sola vez, y después abrís el checkout pasándole el paymentId. El SDK monta el iframe, maneja el flujo de pago y te devuelve un handle para cerrarlo desde tu código.
Cómo probarlo
El checkout se prueba contra la API de test, con cobros que no mueven plata real. Como el iframe es una vista pura y el SDK es el único que habla con la API, alcanza con apuntar apiBaseUrl a test y dejar iframeUrl en su valor por defecto.
Los cobros de prueba los creás con el token de test que genera el Portal. Está en la guía de Usar el Portal, en la sección de testing.
Cuando algo falla
El checkout le muestra al pagador el mensaje que corresponde y decide solo si lo deja reintentar.
| Qué ve el pagador | Qué pasó | Qué hacés vos |
|---|---|---|
| “El documento ingresado no es válido.” | No tiene forma de CUIL, CUIT ni DNI. | Nada: lo corrige ahí mismo y sigue. |
| “Este cobro ya tiene un pagador asociado.” | Se intentó pasar el cobro al documento nuevo y no se pudo: ya hay plata acreditada, o el cobro llegó a un estado final. | Generá un cobro nuevo. Con plata adentro, el cobro ya no cambia de dueño. |
| “No pudimos asignarte una cuenta para transferir. Probá de nuevo en unos minutos.” | Tu comercio no tiene ninguna cuenta libre para el documento nuevo en este momento. Es transitorio y es capacidad tuya, no un problema del cobro. | No generes un cobro nuevo: este sigue vivo. El pagador puede reintentar en unos minutos. Si se repite seguido, revisá la disponibilidad de cuentas de tu comercio. |
| “Este cobro ya no admite pagos.” | Está pago, vencido o cancelado. | Generá un cobro nuevo. |
| “No pudimos preparar el cobro.” | Un problema de configuración de tu integración. | Es tuyo, no del pagador. Revisá que el cobro se haya creado con la integración correcta. |
Referencia rápida
ChytaPay.init(config)pk | requerido | Tu clave pública. Identifica la integración. |
apiBaseUrl | opcional | Base de la API del Widget (/v1). Por defecto https://integration-api.chytapay.com.ar. Pasalo solo para apuntar a otro ambiente. |
iframeUrl | opcional | URL del iframe del checkout. Por defecto https://widget.chytapay.com.ar/checkout/. Pasalo solo para apuntar a otro ambiente. |
requestTimeoutMs | opcional | Timeout de las llamadas del SDK, en milisegundos. |
ChytaPay.checkout(options)paymentId | requerido | El id del payment request creado en tu servidor. |
onSuccess | opcional | Callback al acreditarse el pago. Recibe el paymentId. |
onError | opcional | Callback ante un fallo o vencimiento. Recibe un Error. |
onCancel | opcional | Callback cuando el comprador cierra el checkout sin pagar. |
container | opcional | Dónde montar el checkout. Por defecto el SDK crea un modal que se cierra con Escape, con el fondo o con la X. Si pasás un elemento propio, queda embebido en tu página y el cierre lo manejás vos. |
locale | opcional | Formato de importes y fechas dentro del checkout. Default es-AR. No cambia el idioma: los textos están en español. |
theme | opcional | Colores y tipografía del checkout. Acepta variables CSS con prefijo --chytapay- (por ejemplo --chytapay-primary). Las claves con otro prefijo se ignoran. |
pollSchedule | opcional | Cada cuánto le preguntamos al backend si el pago entró. Por defecto: cada 1 segundo los primeros 20, cada 2 hasta los 40, y cada 10 de ahí en adelante. Pasá un número para un intervalo fijo, o una función del tiempo transcurrido en ms. |