Crear una integración avanzada de Kayana con RYFT en Node.js
Last updated Mar 13, 2026
Esta guía muestra cómo integrar
Kayana Payments powered by RYFT
utilizando un
backend Node.js y un frontend (React / Next.js / HTML)
. Flujo de pago: 1️⃣ Backend crea una sesión de pago 2️⃣ Backend recupera la clave pública RYFT 3️⃣ Frontend carga RYFT SDK 4️⃣ Frontend inicializa el pago 5️⃣ El cliente completa el pago
1. Instalar Dependencias
npm init -y
npm install express cors node-fetch dotenv
2. Estructura del Proyecto
proyecto
│
├── server.js
├── .env
└── routes
└── payment.js
3. Variables de Entorno
Crear .env
PORT=5000
API_KEY=YOUR_API_KEY
PROPERTY_ID=Prop_039f025cdbc74ca9957dbec1b3e193c1
BASE_URL=https://integration.dev.kayana.co.uk
4. Configuración del Servidor Express
server.js
const express = require("express");
const cors = require("cors");
require("dotenv").config();
const paymentRoutes = require("./routes/payment");
const app = express();
app.use(cors());
app.use(express.json());
app.use("/api/payment", paymentRoutes);
const PORT = process.env.PORT || 5000;
app.listen(PORT, () => {
console.log(`Server running on port ${PORT}`);
});
5. Crear Rutas de Pago
routes/payment.js
const express = require("express");
const fetch = require("node-fetch");
const router = express.Router();
const BASE_URL = process.env.BASE_URL;
const API_KEY = process.env.API_KEY;
const PROPERTY_ID = process.env.PROPERTY_ID;
//
// Crear Sesión de Pago
//
router.post("/create-payment", async (req, res) => {
try {
const response = await fetch(`${BASE_URL}/web/payment`, {
method: "POST",
headers: {
"Content-Type": "application/json",
"x-api-key": API_KEY,
type: "business",
},
body: JSON.stringify({
property_id: PROPERTY_ID,
psp_code: "RYFT",
currency_code: "GBP",
amount: 100.5,
customer_email: "customer@example.com",
payment_mode: "CARD",
}),
});
const data = await response.json();
res.status(response.status).json(data);
} catch (error) {
res.status(500).json({
error: "La creación de la sesión de pago falló",
details: error.message,
});
}
});
//
// Obtener Clave Pública de RYFT
//
router.get("/public-key", async (req, res) => {
try {
const response = await fetch(`${BASE_URL}/web/payment/public-key`, {
method: "GET",
headers: {
"x-api-key": API_KEY,
"x-psp-code": "RYFT",
"x-currency-code": "GBP",
type: "business",
},
});
const data = await response.json();
res.json(data);
} catch (error) {
res.status(500).json({
error: "Error al obtener la clave pública",
details: error.message,
});
}
});
module.exports = router;
6. Integración de Frontend
Cargue el RYFT SDK
<script src="https://embedded.ryftpay.com/v2/ryft.min.js"></script>
7. Inicializar Pago en Frontend
async function initPayment() {
// Get public key
const keyRes = await fetch("/api/payment/public-key");
const keyData = await keyRes.json();
const publicKey = keyData.data.public_key;
// Create payment session
const paymentRes = await fetch("/api/payment/create-payment", {
method: "POST",
});
const paymentData = await paymentRes.json();
const clientSecret = paymentData.data.client_secret;
// Initialize RYFT
window.Ryft.init({
publicKey,
clientSecret,
});
}
8. Completar Pago
async function payNow() {
const paymentSession = await window.Ryft.attemptPayment();
if (
paymentSession.status === "Approved" ||
paymentSession.status === "Captured"
) {
alert("Payment Successful");
} else {
alert("Payment Failed");
}
}
9. Tarjetas de Prueba
| Tarjeta | Resultado |
| 4242 4242 4242 4242 | Exitosa |
| 4000 0025 0000 3155 | 3D Secure |
| 4000 0000 0000 9995 | Rechazada |
Utilizar:
- Cualquier fecha de vencimiento futura
- Cualquier CVC
10. Lista de verificación de producción
Antes de pasar a producción:
Cambiar URL base
https://integration.kayana.co.uk
Usar clave API de producción Habilitar RYFT PSP en Kayana Agregar webhooks de pago
Puntos finales adicionales para pedidos
Flujo sugerido:
Crear pedido → Autorizar pago ↓ [Decisión] ├── Capturar → Éxito ├── Cancelar → Anular pago └── Reembolso → Después de capturar
Autenticación
Todas las solicitudes de API deben incluir los siguientes encabezados:
| Encabezado | Tipo | Requerido | Descripción |
|---|---|---|---|
| x-api-key | Cadena | Sí | Tu clave API |
| type | Cadena | Sí | Debe establecerse en business |
| Content-Type | Cadena | Sí | Debe ser application/json |
| x-property-id | Cadena | Sí | ID de propiedad |
1. Capturar pago autorizado
Punto final
POST /web/payment/capture-authorised-payment
Parámetros de solicitud
| Campo | Tipo | Requerido | Descripción |
| order_id | Cadena | Sí | ID de pedido |
| amount | Número | Sí | Cantidad a capturar |
Ejemplo de cURL
curl --location 'https://integration.dev.kayana.co.uk/web/payment/capture-authorised-payment' \
--header 'Content-Type: application/json' \
--header 'type: business' \
--header 'x-api-key: <YOUR_API_KEY>' \
--data '{
"order_id": "Order_xxx",
"amount": 5
}'
Respuesta de ejemplo
{
"status": "success",
"message": "Payment captured successfully",
"data": {
"order_id": "Order_xxx",
"captured_amount": 5
}
}
2. Cancelar pago autorizado
Punto final
POST /web/payment/cancel-authorised-payment
Parámetros de solicitud
| Campo | Tipo | Requerido | Descripción |
| order_id | Cadena | Sí | ID de pedido |
Ejemplo de cURL
curl --location 'https://integration.dev.kayana.co.uk/web/payment/cancel-authorised-payment?order_id=Order_xxx' \
--header 'Content-Type: application/json' \
--header 'type: business' \
--header 'x-api-key: <YOUR_API_KEY>'
Respuesta de ejemplo
{
"status": "success",
"message": "Payment cancelled successfully"
}
3. Reembolsar pago
Punto final
POST /web/payment/refund
Parámetros de solicitud
| Campo | Tipo | Requerido | Descripción |
| order_id | Cadena | Sí | ID de pedido |
| amount | Número | Sí | Monto del reembolso |
Ejemplo de cURL
curl --location --request POST 'https://integration.dev.kayana.co.uk/web/payment/refund?order_id=Order_xxx&amount=0.4' \
--header 'Content-Type: application/json' \
--header 'type: business' \
--header 'x-api-key: <YOUR_API_KEY>'
Respuesta de ejemplo
{
"status": "success",
"message": "Refund processed",
"data": {
"order_id": "Order_xxx",
"refunded_amount": 0.4
}
}
4. Obtener detalles del pedido
Punto final
GET /web/order/fetch-order-details-by-order-id
Parámetros de solicitud
| Campo | Tipo | Requerido | Descripción |
| order_id | Cadena | Sí | ID de pedido |
Ejemplo de cURL
curl --location 'https://integration.dev.kayana.co.uk/web/order/fetch-order-details-by-order-id?order_id=Order_xxx' \
--header 'type: business' \
--header 'x-api-key: <YOUR_API_KEY>'
Respuesta de ejemplo
{
"status": "success",
"data": {
"order_id": "Order_xxx",
"status": "captured",
"amount": 5
}
}
Prácticas de seguridad recomendadas
Nunca expongas:
Claves API client_secret registros de sesiones de pago
Siempre:
Llama a la API de Kayana desde el backend Usa variables de entorno Valida el estado del pago del lado del servidor
Si lo deseas, también puedo darte una versión mucho mejor lista para producción:
- Integración completa de React + Node.js RYFT
- Interfaz de usuario del componente de pago adecuada
- Verificación de webhook
- Manejo de errores
- Versión TypeScript
Solo dime y compartiré una implementación de producción completa en el mundo real.
Próximos Pasos
Si prefiere utilizar RYFT como su Proveedor de Servicios de Pago (PSP), Kayana también admite un flujo de integración completo de RYFT. Consulte nuestra guía sobre cómo crear una Integración Avanzada de Kayana con Stripe en Node.js
