Desarrolladores
Flujos de integración
Tarjetas guardadas

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

HTTPMensajeCausa
404Tarjeta no encontradaEl key no existe o pertenece a otro sistema.
400La tarjeta no tiene token de cobroLa tarjeta se guardó sin token de customer (raro; vuelve a guardarla).
400Tarjeta bloqueada por política antifraudeBloqueo activo sobre esa tarjeta.

Webhooks relacionados

payment.saved_card.success, payment.saved_card.failed, transaction.success, transaction.failed.

Referencia de endpoints usados