Skip to content
Kayana for Business

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

9. Tarjetas de Prueba
TarjetaResultado
4242 4242 4242 4242Exitosa
4000 0025 0000 31553D Secure
4000 0000 0000 9995Rechazada

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:

Autenticación
EncabezadoTipoRequeridoDescripción
x-api-keyCadenaSíTu clave API
typeCadenaSíDebe establecerse en business
Content-TypeCadenaSíDebe ser application/json
x-property-idCadenaSíID de propiedad

1. Capturar pago autorizado

Punto final

POST /web/payment/capture-authorised-payment

Parámetros de solicitud

Parámetros de solicitud
CampoTipoRequeridoDescripción
order_idCadenaSíID de pedido
amountNúmeroSí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

Parámetros de solicitud
CampoTipoRequeridoDescripción
order_idCadenaSí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

Parámetros de solicitud
CampoTipoRequeridoDescripción
order_idCadenaSíID de pedido
amountNúmeroSí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

Parámetros de solicitud
CampoTipoRequeridoDescripción
order_idCadenaSí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

Still need a hand?Contact support← All help
Escríbenos por WhatsApp