Card

POST

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_uuid queda 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

RequisitoOrigenUso en el flujo
Apikey del comercioPaymentsWay, por canal seguroEncabezado Authorization en todas las llamadas.
URL base de cada ambientePaymentsWay, junto con las credencialesValor de {{URL}} en las rutas de esta guía.
terminal_idPaymentsWayPaso 1 (terminal_id) y paso 3 (idterminal).
form_idPaymentsWayPaso 1.
Titular registrado (idperson)Crear personaPaso 1. Se crea una vez por titular.
URL de notificaciónTu sistema; la registras con PaymentsWayRecepción del webhook con el estado final.
Tarjetas de pruebaPaymentsWay, con las credenciales de pruebasCasos 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.

Secuencia completa de la tokenización con compra en valor cero
RequisitoPaso 1Paso 2Paso 3Paso 4EstadoTitularde la tarjetaTu servidorcomercioPaymentsWayClientAPIRed y emisorprocesadorPOST /ClientAPI/CrearPersonaidpersonPOST /ClientAPI/CrearTransaccionamount = 0tran_idPOST /ClientAPI/CrearOrdenTransaccionTCorder_uuidIngresa la tarjetay acepta el tratamiento de datosPOST /ClientAPI/TokenizarTarjetaClienteRegistra la tarjetatokencard_uuidPOST /api/paylands/ExecuteOrderValidación por valor ceroaprobada o rechazadaresultado de la ejecuciónGET /ClientAPI/ObtenerTransaccionidstatus 34 Exitosa · 36 Fallida · 38 CanceladaNingún paso genera un cobro al titularTu sistema guarda solo card_uuid para los cobros posteriores
OrdenServicioQué hace
RequisitoPOST /ClientAPI/CrearPersonaRegistra al titular y devuelve su idperson.
Paso 1POST /ClientAPI/CrearTransaccionCrea la transacción con amount en cero. Devuelve tran_id.
Paso 2POST /ClientAPI/CrearOrdenTransaccionTCCrea la orden y define las cuotas. Devuelve order_uuid.
Paso 3POST /ClientAPI/TokenizarTarjetaClienteTokeniza la tarjeta con el consentimiento del titular. Devuelve card_uuid.
Paso 4POST /api/paylands/ExecuteOrderEjecuta la orden en valor cero sobre la tarjeta tokenizada.
EstadoGET /ClientAPI/ObtenerTransaccionConsulta 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.

IdentificadorSale deSe envía en
idpersonCampo id de la respuesta de CrearPersona.Paso 1, campo idperson.
tran_idCampo id de la transacción del paso 1.Paso 2 (tran_id), pasos 3 y 4 (idtransaction) y consulta de estado.
order_uuidRespuesta del paso 2.Paso 4, campo order_uuid.
card_uuidRespuesta 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:

HeaderValorDescripción
Authorization<APIKEY>Apikey del comercio, tal como la entrega PaymentsWay, sin prefijo.
Content-Typeapplication/jsonPeticiones 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.

POST{{URL}}/ClientAPI/CrearPersona
CampoTipoDescripciónReq.
firstnamestringNombres del titular. Mínimo 3 caracteres.Sí
lastnamestringApellidos del titular. Mínimo 3 caracteres.Sí
ididentificationtypestringId del tipo de identificación. Por ejemplo, 4 para cédula de ciudadanía.Sí
identificationstringNúmero de identificación del titular.Sí
emailstringCorreo electrónico del titular.Sí
phonestringTeléfono del titular.Sí
JSON — Body
{
  "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.

POST{{URL}}/ClientAPI/CrearTransaccion
CampoTipoDescripciónReq.
terminal_idstringTerminal asignada por PaymentsWay.Sí
form_idstringFormulario asignado por PaymentsWay.Sí
amountnumberValor de la transacción. Para la validación siempre es 0.Sí
external_orderstringTu referencia de la operación. Única por transacción; te sirve para conciliar y rastrear el flujo.Sí
ipstringDirección IP del dispositivo del titular.Sí
idpersonstringId del titular devuelto por CrearPersona.Sí
JSON — Body
{
  "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.

POST{{URL}}/ClientAPI/CrearOrdenTransaccionTC
CampoTipoDescripciónReq.
tran_idnumberId de la transacción del paso 1.Sí
descriptionstringDescripción de la orden. Por ejemplo, «Validación de tarjeta para reserva».Sí
installmentsnumberNúmero de cuotas de la orden.Sí
JSON — Body
{
  "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.

POST{{URL}}/ClientAPI/TokenizarTarjetaCliente
CampoTipoDescripciónReq.
idtransactionnumberId de la transacción del paso 1 (el mismo tran_id).Sí
idterminalstringTerminal asignada (el mismo terminal_id del paso 1).Sí
card_holderstringNombre del titular como aparece en la tarjeta.Sí
card_panstringNúmero completo de la tarjeta, solo dígitos.Sí
card_expiry_yearstringAño de vencimiento.Sí
card_expiry_monthstringMes de vencimiento, dos dígitos (01 a 12).Sí
card_cvvstringCódigo de seguridad de la tarjeta.Sí
autorizacionDatosbooleanConsentimiento del titular para el tratamiento de sus datos. Debe ser true y reflejar una aceptación expresa en tu formulario.Sí
JSON — Body (datos de tarjeta enmascarados)
{
  "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.

POST{{URL}}/api/paylands/ExecuteOrder
CampoTipoDescripciónReq.
order_uuidstringIdentificador de la orden del paso 2.Sí
card_uuidstringIdentificador de la tarjeta tokenizada del paso 3.Sí
customer_ipstringDirección IP del dispositivo del titular.Sí
idtransactionnumberId de la transacción del paso 1.Sí
JSON — Body
{
  "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.

IDEstadoQué hacer
1CreadaAún sin resultado. Consulta de nuevo más tarde.
35PendienteEl resultado no es definitivo. No habilites el token todavía.
34ExitosaFinal. La tarjeta quedó validada: habilita el card_uuid.
36FallidaFinal. No guardes el token como medio de pago.
37Rechazada ClearSaleEl control antifraude rechazó la operación. Trátala como no aprobada.
38CanceladaFinal. No guardes el token como medio de pago.

Consulta del estado

GET{{URL}}/ClientAPI/ObtenerTransaccion?id={tran_id}
cURL
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 id o por externalorder y actualiza su estado solo si es final.
  • Procesa cada notificación una sola vez; si llega repetida, ignórala.
  • Ante cualquier duda, confirma con ObtenerTransaccion y 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:

JSON — 400 Bad Request
{
  "status" : 400,
  "message": "Campos Incompletos",
  "item"   : null,
  "errors" : [
    {
      "item"         : "firstname",
      "previusValue" : "",
      "message"      : "El campo firstname es obligatorio y no puede estar vacío."
    }
  ]
}
HTTPSituaciónQué hacer
400Faltan 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.
400La transacción no existe («La transaccion no se registra»).Verifica que el id sea el del paso 1 y del mismo ambiente.
403Apikey ausente o inexistente.Revisa el encabezado Authorization y la apikey del ambiente.
409La 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 respuestaError del servicio o tiempo de espera agotado.Consulta la transacción antes de reintentar.

Reintentos e interrupciones

  1. Si el paso 1 se queda sin respuesta, no crees otra transacción a ciegas. Busca primero tu external_order y reutiliza la transacción si ya existe.

  2. 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.

  3. Si el paso 4 se queda sin respuesta, no lo repitas de inmediato. Consulta la transacción y actúa según su estado.

  4. Define tiempos de espera en tu cliente HTTP y registra en tus logs el external_order, el tran_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_uuid o, 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

AmbienteURL baseUso
Pruebas{{URL}} de pruebasDesarrollo y certificación con tarjetas de prueba. No genera movimientos reales.
Producción{{URL}} de producciónOperació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ónResultado esperado
1Registro del titular con CrearPersona.200 con el id del titular guardado.
2Paso 1 con amount en 0.Transacción creada y tran_id guardado con tu external_order.
3Paso 2 con las cuotas definidas.Orden creada y order_uuid guardado.
4Paso 3 con tarjeta de prueba y autorizacionDatos en true.card_uuid guardado y evidencia del consentimiento registrada.
5Paso 4 con tarjeta de prueba aprobada.Estado Exitosa (34), token habilitado y ningún cobro al titular.
6Paso 4 con tarjeta de prueba rechazada.Estado Fallida (36) y token no habilitado.
7Consulta con ObtenerTransaccion.Tu sistema refleja el mismo estado que la consulta.
8Notificación por webhook, si está activa.Respuesta correcta y procesamiento único de cada notificación.
9Petición sin apikey o con datos incompletos.Errores 403 y 400 manejados sin interrumpir tu plataforma.
10Revisión de logs y base de datos.El PAN y el CVV no aparecen en ningún registro.
11Configuración por ambiente.URL, apikey, terminal_id y form_id fuera del código y separados por ambiente.

En esta página