DexaPay · integración simple

Un botón. Un checkout seguro. Cobros por Yappy.

Tu servidor consulta el total del pedido, DexaPay crea el cobro y tu cliente paga en nuestra página segura.

La ruta corta

De tu pedido al checkout en cuatro pasos.

01

Tu servidor lee el pedido

Comprueba que el comprador puede pagar ese pedido y calcula el total guardado.

02

DexaPay crea la sesión

Envía el importe, una referencia y el concepto. No configures el banco en tu web.

03

Abre el checkout

Tu botón redirige a la URL segura que DexaPay devuelve.

04

Verifica el resultado

Consulta a DexaPay desde servidor y guarda el número de transacción confirmado.

Configuración breve

Solo necesitamos una conexión segura entre servidores.

La clave técnica se guarda en tu servidor. Las credenciales de Yappy se guardan una vez en DexaPay y el comprador paga en nuestro checkout.

01

Conecta Yappy una vez

Pega las credenciales en el portal DexaPay. Las ciframos y hacemos las llamadas al banco desde nuestro servidor.

02

Guarda tu clave técnica

El servidor de tu tienda la usa para pedir la sesión. Nunca se incluye en el botón público.

03

Tu web abre DexaPay

La dirección de pago se genera por pedido y la devuelve nuestra API. No necesitas un dominio de iframe.

El dominio que registras en Yappy/Banco General es el del botón bancario. Es distinto del origen HTTPS de tu tienda: solo debes autorizar este último en DexaPay si configuras una URL de retorno o embedding.

API mínima

Una petición crea la dirección de pago.

El ejemplo corre en servidor. Cambia buscarPedidoAutorizado por la consulta real de pedidos de tu tienda; no mandes un total que venga directo del navegador.

Node.js · crear-sesion.mjs
// En tu servidor: carga y autoriza el pedido desde tu base de datos.
const pedido = await buscarPedidoAutorizado(idPedido, usuarioActual);
if (!pedido) throw new Error("Pedido no encontrado");

const response = await fetch("https://dexapanama.com/api/dexapay/v1/sessions", {
  method: "POST",
  headers: {
    "Authorization": "Bearer dxa_live_TU_CLAVE",
    "Content-Type": "application/json"
  },
  body: JSON.stringify({
    amount: pedido.total,
    reference: pedido.id,
    concept: "Pedido " + pedido.id
  })
});

const session = await response.json();
if (!response.ok) throw new Error(session.error?.mensaje ?? "No se pudo crear la sesión");
await guardarSesionDexaPay(pedido.id, session.sessionId);
// El endpoint responde solo { checkoutUrl } a tu navegador.
Ver adaptador PHP
// En una ruta PHP protegida: valida sesión y propiedad del pedido.
$pedido = pedidoAutorizadoDeUsuario($orderId, $usuarioActual);
if (!$pedido) {
  http_response_code(404);
  exit;
}

$curl = curl_init('https://dexapanama.com/api/dexapay/v1/sessions');
curl_setopt_array($curl, [
  CURLOPT_POST => true,
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_HTTPHEADER => [
    'Authorization: Bearer ' . getenv('DEXAPAY_API_KEY'),
    'Content-Type: application/json',
  ],
  CURLOPT_POSTFIELDS => json_encode([
    'amount' => (float) $pedido['total'],
    'reference' => (string) $pedido['id'],
    'concept' => 'Pedido ' . $pedido['id'],
  ]),
]);
$session = json_decode(curl_exec($curl), true);
if (curl_getinfo($curl, CURLINFO_HTTP_CODE) >= 300 || empty($session['checkoutUrl'])) {
  http_response_code(502);
  exit('No se pudo iniciar el checkout');
}
header('Location: ' . $session['checkoutUrl'], true, 303);
exit;
Verificación segura opcional al volver a la tienda

El checkout hospedado muestra el comprobante de DexaPay si no defines URL de retorno. Si la configuras, autoriza primero el origen HTTPS en el Portal y verifica el pago desde tu servidor:

// Ruta de retorno opcional, ejecutada en tu servidor.
const pedido = await buscarPedidoAutorizado(idPedido, usuarioActual);
if (!pedido?.dexapaySessionId) throw new Error("Pedido no encontrado");

const response = await fetch(
  "https://dexapanama.com/api/dexapay/v1/sessions/" + encodeURIComponent(pedido.dexapaySessionId),
  { headers: { Authorization: "Bearer " + process.env.DEXAPAY_API_KEY } }
);
const pago = await response.json();
if (response.ok && pago.status === "PAID" &&
    pago.reference === pedido.id && pago.amount === pedido.total) {
  await marcarPedidoPagado(pedido.id, pago.transactionId);
}
Verificación de retorno en PHP
// En la ruta de retorno, busca el pedido en tu servidor.
$pedido = pedidoAutorizadoDeUsuario($orderId, $usuarioActual);
if (!$pedido || empty($pedido['dexapaySessionId'])) {
  http_response_code(404);
  exit;
}

$curl = curl_init('https://dexapanama.com/api/dexapay/v1/sessions/' . rawurlencode($pedido['dexapaySessionId']));
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_HTTPHEADER, ['Authorization: Bearer ' . getenv('DEXAPAY_API_KEY')]);
$pago = json_decode(curl_exec($curl), true);
if ($pago['status'] === 'PAID' && $pago['reference'] === (string) $pedido['id']
    && (float) $pago['amount'] === (float) $pedido['total']) {
  marcarPedidoPagado($pedido['id'], $pago['transactionId']);
}

Seguro por diseño

La confirmación no depende del navegador.

Checkout alojado

Las credenciales del comercio permanecen en el servidor y el cliente paga en una página de DEXA.

Consulta confirmada

Tu servidor consulta la sesión a DexaPay antes de marcar pagado. El webhook firmado queda como opción para automatizar.

Dos identificadores

Guarda tu orderId y también el transactionId que devuelve Yappy para conciliar.

El pago se confirma en el servidor de DexaPay. Una URL de regreso o un mensaje del navegador no confirman una venta.

Antes de activar

Lo que necesitas tener listo.

  • Yappy Comercial activo a nombre de tu comercio.
  • Dominio registrado en Yappy y credenciales cargadas en DexaPay.
  • Contrato DexaPay aceptado por la persona representante.
  • Crédito prepago disponible para cubrir el 0.85% por transacción.

DEXA es proveedor técnico de checkout e integración. No es banco, custodio del dinero ni vendedor de los productos del comercio.

¿Usas un agente de IA?

Pégale este prompt y deja que te guíe.

Selecciona tu tecnología y copia un prompt listo para tu agente de programación. Nunca entregues secretos por chat.

Quiero integrar el botón de DexaPay en mi proyecto Next.js / Node.js para cobrar por Yappy.

Actúa como mi agente de programación y guíame paso a paso. No inventes endpoints ni pidas secretos por este chat.

Contexto obligatorio:
- Las credenciales bancarias de Yappy se guardan una sola vez en el Portal DexaPay. Nunca las solicites ni las pongas en mi código.
- Mi servidor crea sesiones con POST https://dexapanama.com/api/dexapay/v1/sessions y la clave DEXAPAY_API_KEY guardada como secreto de servidor.
- El mínimo para una sesión es amount, reference y concept. currency PAB es opcional.
- DexaPay devuelve checkoutUrl. El botón solo abre esa dirección en la misma pestaña.
- El importe debe salir del pedido consultado y validado en el servidor Next.js / Node.js. No confíes en un total enviado por JavaScript, formulario o query string.
- successUrl, cancelUrl, iframe y webhook firmado son opciones avanzadas. La confirmación de pago se consulta desde servidor usando la API autenticada.
- Guarda sessionId, orderId, reference y transactionId. No marques pagado por volver a la tienda.

Tareas:
1. Revisa cómo autentica usuarios y cómo almacena pedidos este proyecto; no inventes funciones para obtener el precio.
2. Crea un endpoint de servidor que reciba el ID del pedido, lo autorice para el usuario actual y lea el total desde la base de datos del proyecto.
3. Desde ese endpoint, crea una sesión DexaPay y devuelve únicamente checkoutUrl al navegador.
4. Añade un botón que redirija a checkoutUrl y muestre errores entendibles.
5. Implementa una ruta de retorno que consulte el estado autenticado de la sesión antes de actualizar el pedido.
6. Guarda la API key solo en el almacén de secretos del servidor. No imprimas claves ni datos personales en logs.
7. Añade pruebas para pedido ajeno, total manipulado, error de DexaPay y pago aún pendiente. No realices cargos reales.

Si no puedes verificar que el pedido pertenece al usuario actual, detente y explícame qué falta antes de crear el pago.

Empieza hoy

Instala tu botón con una guía paso a paso.

Con Yappy Comercial activo, tus credenciales y la aprobación listas, configura tu servidor y prueba la redirección al checkout.

Comenzar alta