Card
Tokenización con compra en valor cero
Registra la tarjeta de un titular sin cobrarle. Creas una transacción con valor en cero, le asocias una orden, tokenizas la tarjeta y ejecutas la orden para que la red y el banco emisor confirmen que la tarjeta existe, está activa y pertenece al titular. Al terminar, tu sistema conserva solo el token (card_uuid), nunca los datos de la tarjeta.
Cuándo usarla
Úsala cuando el titular inscribe su tarjeta en tu plataforma, por ejemplo para garantizar una reserva o dejarla lista para cobros posteriores sin volver a pedirle los datos.
- Validación aprobada: el
card_uuidqueda habilitado para los cobros que acuerdes con el titular. - Validación rechazada: la tarjeta no debe quedar registrada y debes pedir otro medio de pago.
Esta guía no cubre los cobros posteriores con el token, las devoluciones ni la autenticación 3DS del pago con valor. Esos procesos tienen su propia documentación.
Requisitos previos
| Requisito | Origen | Uso en el flujo |
|---|---|---|
| Apikey del comercio | PaymentsWay, por canal seguro | Encabezado Authorization en todas las llamadas. |
| URL base de cada ambiente | PaymentsWay, junto con las credenciales | Valor de {{URL}} en las rutas de esta guía. |
terminal_id | PaymentsWay | Paso 1 (terminal_id) y paso 3 (idterminal). |
form_id | PaymentsWay | Paso 1. |
Titular registrado (idperson) | Crear persona | Paso 1. Se crea una vez por titular. |
| URL de notificación | Tu sistema; la registras con PaymentsWay | Recepción del webhook con el estado final. |
| Tarjetas de prueba | PaymentsWay, con las credenciales de pruebas | Casos de aprobación y rechazo. |
Guarda las credenciales en un almacén de secretos, con variables por ambiente. No las envíes por correo ni las dejes en el código fuente o en repositorios.
Flujo
El flujo tiene un requisito y cuatro pasos en orden. Cada paso usa identificadores que devuelve uno anterior, así que no puedes ejecutarlos en paralelo ni saltarte ninguno.
| Orden | Servicio | Qué hace |
|---|---|---|
| Requisito | POST /ClientAPI/CrearPersona | Registra al titular y devuelve su idperson. |
| Paso 1 | POST /ClientAPI/CrearTransaccion | Crea la transacción con amount en cero. Devuelve tran_id. |
| Paso 2 | POST /ClientAPI/CrearOrdenTransaccionTC | Crea la orden y define las cuotas. Devuelve order_uuid. |
| Paso 3 | POST /ClientAPI/TokenizarTarjetaCliente | Tokeniza la tarjeta con el consentimiento del titular. Devuelve card_uuid. |
| Paso 4 | POST /api/paylands/ExecuteOrder | Ejecuta la orden en valor cero sobre la tarjeta tokenizada. |
| Estado | GET /ClientAPI/ObtenerTransaccion | Consulta el estado final de la transacción. |
Identificadores entre pasos
Un mismo valor cambia de nombre según el paso: el id de la transacción es tran_id en el paso 2 e idtransaction en los pasos 3 y 4, y el terminal_id del paso 1 se envía como idterminal en el paso 3.
| Identificador | Sale de | Se envía en |
|---|---|---|
idperson | Campo id de la respuesta de CrearPersona. | Paso 1, campo idperson. |
tran_id | Campo id de la transacción del paso 1. | Paso 2 (tran_id), pasos 3 y 4 (idtransaction) y consulta de estado. |
order_uuid | Respuesta del paso 2. | Paso 4, campo order_uuid. |
card_uuid | Respuesta del paso 3. | Paso 4, campo card_uuid. Es el único dato de la tarjeta que guardas. |
Guarda los cuatro identificadores asociados a tu external_order apenas los recibas. Así puedes reanudar o consultar el flujo si una llamada se interrumpe.
Autenticación
Todas las llamadas van por HTTPS a la URL base del ambiente, desde tu servidor, con estos encabezados:
| Header | Valor | Descripción |
|---|---|---|
Authorization | <APIKEY> | Apikey del comercio, tal como la entrega PaymentsWay, sin prefijo. |
Content-Type | application/json | Peticiones y respuestas en JSON. |
Si falta el encabezado o la apikey no existe, la API responde 403 con el mensaje El api_key enviando no existe. Revisa que uses la apikey del ambiente correcto. Los montos van en pesos colombianos y, en este flujo, siempre son 0.
Requisito: registrar al titular
El titular debe existir antes del paso 1. Regístralo una sola vez con Crear persona y reutiliza su id en las transacciones siguientes. Los tipos de identificación válidos salen de Tipos de identificación.
{{URL}}/ClientAPI/CrearPersona| Campo | Tipo | Descripción | Req. |
|---|---|---|---|
firstname | string | Nombres del titular. Mínimo 3 caracteres. | Sí |
lastname | string | Apellidos del titular. Mínimo 3 caracteres. | Sí |
ididentificationtype | string | Id del tipo de identificación. Por ejemplo, 4 para cédula de ciudadanía. | Sí |
identification | string | Número de identificación del titular. | Sí |
email | string | Correo electrónico del titular. | Sí |
phone | string | Teléfono del titular. | Sí |
{
"firstname" : "NOMBRE",
"lastname" : "APELLIDO",
"ididentificationtype": "4",
"identification" : "<número de documento>",
"email" : "titular@correo.com",
"phone" : "<teléfono>"
}El campo id de la respuesta es el idperson del paso 1.
Paso 1. Crear la transacción
Crea la transacción con amount en cero. Es el contenedor de todo el flujo: su id se usa en los tres pasos siguientes y en la consulta de estado.
{{URL}}/ClientAPI/CrearTransaccion| Campo | Tipo | Descripción | Req. |
|---|---|---|---|
terminal_id | string | Terminal asignada por PaymentsWay. | Sí |
form_id | string | Formulario asignado por PaymentsWay. | Sí |
amount | number | Valor de la transacción. Para la validación siempre es 0. | Sí |
external_order | string | Tu referencia de la operación. Única por transacción; te sirve para conciliar y rastrear el flujo. | Sí |
ip | string | Dirección IP del dispositivo del titular. | Sí |
idperson | string | Id del titular devuelto por CrearPersona. | Sí |
{
"terminal_id" : "<terminal_id>",
"form_id" : "<form_id>",
"amount" : 0,
"external_order": "VAL-000184",
"ip" : "181.50.10.20",
"idperson" : "43573"
}Toma el campo id de la transacción: ese es el tran_id. La transacción nace en estado Creada (idstatus 1). Cuando la terminal tiene autenticación 3DS, el registro llega dentro de data, con type igual a Transaction.
Paso 2. Crear la orden
Crea la orden sobre la transacción del paso 1 y define el número de cuotas. La orden queda lista para ejecutarse en el paso 4.
{{URL}}/ClientAPI/CrearOrdenTransaccionTC| Campo | Tipo | Descripción | Req. |
|---|---|---|---|
tran_id | number | Id de la transacción del paso 1. | Sí |
description | string | Descripción de la orden. Por ejemplo, «Validación de tarjeta para reserva». | Sí |
installments | number | Número de cuotas de la orden. | Sí |
{
"tran_id" : 15,
"description" : "Validación de tarjeta para reserva",
"installments": 1
}La respuesta trae el identificador de la orden: guárdalo, es el order_uuid del paso 4. Si este paso falla, no sigas con la tokenización.
Paso 3. Tokenizar la tarjeta
Envía los datos que el titular ingresó en tu formulario, junto con su autorización para el tratamiento de datos. Es el único paso en el que viajan el número de la tarjeta y el código de seguridad; desde aquí trabajas solo con el token.
{{URL}}/ClientAPI/TokenizarTarjetaCliente| Campo | Tipo | Descripción | Req. |
|---|---|---|---|
idtransaction | number | Id de la transacción del paso 1 (el mismo tran_id). | Sí |
idterminal | string | Terminal asignada (el mismo terminal_id del paso 1). | Sí |
card_holder | string | Nombre del titular como aparece en la tarjeta. | Sí |
card_pan | string | Número completo de la tarjeta, solo dígitos. | Sí |
card_expiry_year | string | Año de vencimiento. | Sí |
card_expiry_month | string | Mes de vencimiento, dos dígitos (01 a 12). | Sí |
card_cvv | string | Código de seguridad de la tarjeta. | Sí |
autorizacionDatos | boolean | Consentimiento del titular para el tratamiento de sus datos. Debe ser true y reflejar una aceptación expresa en tu formulario. | Sí |
{
"idtransaction" : 15,
"idterminal" : "<terminal_id>",
"card_holder" : "NOMBRE APELLIDO",
"card_pan" : "4111********1111",
"card_expiry_year" : "<año>",
"card_expiry_month": "<mes>",
"card_cvv" : "***",
"autorizacionDatos": true
}La respuesta trae el identificador de la tarjeta tokenizada: guárdalo, es el card_uuid del paso 4 y el dato con el que harás los cobros posteriores. Si incluye datos de presentación, como la marca o los últimos cuatro dígitos, puedes guardarlos para mostrarle al titular qué tarjeta registró.
Antes de enviar
Muestra al titular el texto de autorización de tratamiento de datos y envía autorizacionDatos en true solo si lo aceptó. Conserva la evidencia de esa aceptación con fecha y hora, asociada al titular y a la transacción.
Paso 4. Ejecutar en valor cero
Ejecuta la orden del paso 2 sobre la tarjeta del paso 3. Como la transacción vale cero, la red valida la tarjeta sin cobrarle al titular.
{{URL}}/api/paylands/ExecuteOrder| Campo | Tipo | Descripción | Req. |
|---|---|---|---|
order_uuid | string | Identificador de la orden del paso 2. | Sí |
card_uuid | string | Identificador de la tarjeta tokenizada del paso 3. | Sí |
customer_ip | string | Dirección IP del dispositivo del titular. | Sí |
idtransaction | number | Id de la transacción del paso 1. | Sí |
{
"order_uuid" : "<order_uuid del paso 2>",
"card_uuid" : "<card_uuid del paso 3>",
"customer_ip" : "181.50.10.20",
"idtransaction": 15
}Da por registrada la tarjeta solo cuando la transacción quede en Exitosa (idstatus 34), por la consulta de estado o por la notificación. Si queda Fallida (36) o Cancelada (38), no habilites el token y pide otra tarjeta.
Estado de la transacción
El estado está en el campo idstatus. Los estados finales son Exitosa, Fallida y Cancelada; mientras no llegue uno de ellos, trata la transacción como no resuelta.
| ID | Estado | Qué hacer |
|---|---|---|
1 | Creada | Aún sin resultado. Consulta de nuevo más tarde. |
35 | Pendiente | El resultado no es definitivo. No habilites el token todavía. |
34 | Exitosa | Final. La tarjeta quedó validada: habilita el card_uuid. |
36 | Fallida | Final. No guardes el token como medio de pago. |
37 | Rechazada ClearSale | El control antifraude rechazó la operación. Trátala como no aprobada. |
38 | Cancelada | Final. No guardes el token como medio de pago. |
Consulta del estado
{{URL}}/ClientAPI/ObtenerTransaccion?id={tran_id}curl --location '{{URL}}/ClientAPI/ObtenerTransaccion?id=15' \
--header 'Authorization: <APIKEY>'El estado final puede no estar en la respuesta inmediata del paso 4, así que tu integración no debe depender solo de ella. Si el estado no es final, repite la consulta con espera creciente (a los 30 segundos, al minuto y luego cada pocos minutos) y detente cuando llegue un estado final.
Notificación por webhook
Si tienes una URL de notificación registrada, PaymentsWay te envía el resultado con un POST. El formato y cómo responder están en WebHook. En este flujo:
- Busca la transacción por
ido porexternalordery actualiza su estado solo si es final. - Procesa cada notificación una sola vez; si llega repetida, ignórala.
- Ante cualquier duda, confirma con
ObtenerTransacciony quédate con lo que diga la consulta.
No uses el campo response_url
En el flujo de pago con 3DS ese campo corresponde a la notificación del proveedor de PaymentsWay y no debe usarse para cambiar estados en tu plataforma. El estado válido es el de ObtenerTransaccion o el del webhook de PaymentsWay.
Manejo de errores
Los errores de validación indican el campo con problema:
{
"status" : 400,
"message": "Campos Incompletos",
"item" : null,
"errors" : [
{
"item" : "firstname",
"previusValue" : "",
"message" : "El campo firstname es obligatorio y no puede estar vacío."
}
]
}| HTTP | Situación | Qué hacer |
|---|---|---|
400 | Faltan campos o tienen un formato inválido. El arreglo errors indica el campo y el motivo. | Corrige la petición. No la repitas sin cambios. |
400 | La transacción no existe («La transaccion no se registra»). | Verifica que el id sea el del paso 1 y del mismo ambiente. |
403 | Apikey ausente o inexistente. | Revisa el encabezado Authorization y la apikey del ambiente. |
409 | La transacción ya tiene un estado final («La transaccion registra un estado: …»). | No reintentes sobre ella. Para repetir el flujo, empieza en el paso 1. |
5xx o sin respuesta | Error del servicio o tiempo de espera agotado. | Consulta la transacción antes de reintentar. |
Reintentos e interrupciones
Si el paso 1 se queda sin respuesta, no crees otra transacción a ciegas. Busca primero tu
external_ordery reutiliza la transacción si ya existe.Si el paso 2 o el 3 fallan, no ejecutes el paso 4. Corrige la causa y reintenta; si la transacción ya quedó en un estado final, empieza de nuevo en el paso 1 con una referencia nueva.
Si el paso 4 se queda sin respuesta, no lo repitas de inmediato. Consulta la transacción y actúa según su estado.
Define tiempos de espera en tu cliente HTTP y registra en tus logs el
external_order, eltran_id, el servicio y el código de respuesta. Nunca los datos de la tarjeta.
Seguridad de los datos de la tarjeta
El número de la tarjeta (PAN) y el CVV solo viajan en el paso 3, por HTTPS con TLS, desde tu servidor hacia PaymentsWay.
- No guardes el PAN ni el CVV en bases de datos, archivos, colas, cachés ni copias de respaldo, ni siquiera de forma temporal o cifrada.
- No los registres en logs, trazas, herramientas de monitoreo ni mensajes de error. Para identificar la tarjeta usa el
card_uuido, como máximo, los últimos cuatro dígitos. - Desactiva el registro de cuerpos de petición del servicio que llama a
TokenizarTarjetaCliente, en tu aplicación y en balanceadores, proxies y herramientas de observabilidad. - Guarda únicamente el
card_uuid, asociado al titular. - Mantén la apikey en un almacén de secretos, separada por ambiente, y nunca la expongas en el navegador ni en aplicaciones móviles.
- Usa TLS 1.2 o superior y valida el certificado del servidor en cada conexión.
Ambientes
| Ambiente | URL base | Uso |
|---|---|---|
| Pruebas | {{URL}} de pruebas | Desarrollo y certificación con tarjetas de prueba. No genera movimientos reales. |
| Producción | {{URL}} de producción | Operación con tarjetas reales, una vez certificada la integración. |
PaymentsWay entrega la URL base, la apikey, el terminal_id y el form_id de cada ambiente por canal seguro. No mezcles la apikey de pruebas con la URL de producción ni al revés, y parametriza estos valores fuera del código.
Lista de verificación
Antes de pedir el paso a producción, confirma cada punto en el ambiente de pruebas:
| # | Verificación | Resultado esperado |
|---|---|---|
| 1 | Registro del titular con CrearPersona. | 200 con el id del titular guardado. |
| 2 | Paso 1 con amount en 0. | Transacción creada y tran_id guardado con tu external_order. |
| 3 | Paso 2 con las cuotas definidas. | Orden creada y order_uuid guardado. |
| 4 | Paso 3 con tarjeta de prueba y autorizacionDatos en true. | card_uuid guardado y evidencia del consentimiento registrada. |
| 5 | Paso 4 con tarjeta de prueba aprobada. | Estado Exitosa (34), token habilitado y ningún cobro al titular. |
| 6 | Paso 4 con tarjeta de prueba rechazada. | Estado Fallida (36) y token no habilitado. |
| 7 | Consulta con ObtenerTransaccion. | Tu sistema refleja el mismo estado que la consulta. |
| 8 | Notificación por webhook, si está activa. | Respuesta correcta y procesamiento único de cada notificación. |
| 9 | Petición sin apikey o con datos incompletos. | Errores 403 y 400 manejados sin interrumpir tu plataforma. |
| 10 | Revisión de logs y base de datos. | El PAN y el CVV no aparecen en ningún registro. |
| 11 | Configuración por ambiente. | URL, apikey, terminal_id y form_id fuera del código y separados por ambiente. |