Tu servidor lee el pedido
Comprueba que el comprador puede pagar ese pedido y calcula el total guardado.
DexaPay · integración simple
Tu servidor consulta el total del pedido, DexaPay crea el cobro y tu cliente paga en nuestra página segura.
La ruta corta
Comprueba que el comprador puede pagar ese pedido y calcula el total guardado.
Envía el importe, una referencia y el concepto. No configures el banco en tu web.
Tu botón redirige a la URL segura que DexaPay devuelve.
Consulta a DexaPay desde servidor y guarda el número de transacción confirmado.
API mínima
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.
// 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.// 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;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);
}// 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
Las credenciales del comercio permanecen en el servidor y el cliente paga en una página de DEXA.
Tu servidor consulta la sesión a DexaPay antes de marcar pagado. El webhook firmado queda como opción para automatizar.
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
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?
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
Con Yappy Comercial activo, tus credenciales y la aprobación listas, configura tu servidor y prueba la redirección al checkout.
Comenzar alta