Tarjetas guardadas (tokenización)
WizPay tokeniza las tarjetas en el procesador: tu comercio nunca almacena el número — solo guarda
un identificador (key) con el que puedes volver a cobrar sin pedir la tarjeta de nuevo.
El número real de la tarjeta jamás se persiste en WizPay ni en tu sistema: solo un token
irreversible, la marca (card_type) y los últimos 4 dígitos.
Guarda la tarjeta durante un pago
En POST /payment/process manda save_card: true. Si el pago resulta
APROBADO, la respuesta incluye saved_card:
{
"status": "APROBADO",
"reference": "WP-1784169095747-578AFA46",
"cybersource_id": "7364298...",
"auth_code": "831000",
"saved_card": {
"key": "C8F0D2A1B3E4F5A6B7C8D9E0",
"card_type": "001",
"card_last4": "1111",
"name": "María Fernández"
}
}Persiste saved_card.key en tu base de datos, asociado a tu usuario. Ese key es todo lo
que necesitas para listar, editar y cobrar esa tarjeta. (El proyecto de ejemplo lo guarda en
localStorage solo por simplicidad de demo.)
Lista las tarjetas del cliente
// por email…
const cards = await wpay.listCards({ email: '[email protected]' })
// …o por los keys que guardaste
const cards = await wpay.listCards({ keys: ['C8F0D2A1B3E4...', 'A1B2C3...'] })Cada tarjeta llega con sus datos de facturación completos — ideal para preseleccionar la tarjeta y prellenar el formulario:
[{
"key": "C8F0D2A1B3E4F5A6B7C8D9E0",
"name": "María Fernández",
"first_name": "María",
"last_name": "Fernández",
"email": "[email protected]",
"phone": "70000000",
"direction_1": "Av. Arce 2299",
"direction_2": "",
"postal_code": "0000",
"city": "La Paz",
"state": "LP",
"country_code": "BO",
"card_type": "001",
"card_last4": "1111",
"created_at": "2026-07-16 12:00:00"
}]Actualiza los datos de facturación
Si el cliente edita su dirección al pagar, sincronízala:
await wpay.updateCard(cardKey, {
direction_1: 'Calle Nueva 123',
city: 'Santa Cruz',
state: 'S',
})Campos editables: name, last_name, email, phone, direction_1, direction_2,
postal_code, city, state, country_code. La respuesta es la tarjeta actualizada.
Cobra con la tarjeta guardada
Un solo request — sin 3DS, sin formulario (cobro merchant-initiated):
const result = await wpay.chargeSaved({
card_key: 'C8F0D2A1B3E4F5A6B7C8D9E0',
amount: 99.9,
currency: 'BOB',
description: 'Renovación mensual',
order_id: 'ORD-2001',
})
// → { status: 'APROBADO', reference, cybersource_id, auth_code, card_last4, card_type }Errores específicos
| HTTP | Mensaje | Causa |
|---|---|---|
404 | Tarjeta no encontrada | El key no existe o pertenece a otro sistema. |
400 | La tarjeta no tiene token de cobro | La tarjeta se guardó sin token de customer (raro; vuelve a guardarla). |
400 | Tarjeta bloqueada por política antifraude | Bloqueo activo sobre esa tarjeta. |
Webhooks relacionados
payment.saved_card.success, payment.saved_card.failed, transaction.success,
transaction.failed.
Referencia de endpoints usados
POST /payment/process(consave_card: true)GET /cardsyPUT /cards/:keyPOST /payment/charge-saved