Componente React reutilizable para integración con Transbank Webpay. Incluye botón de pago, manejo de redirección, confirmación de transacción y estados visuales (cargando, éxito, error, cancelado).
- React 18 con TypeScript
- TailwindCSS responsivo (mobile‑first) con prefijo
wpay-para evitar conflictos - Redux Toolkit para manejo de estado de la transacción
- React Query (TanStack Query) para comunicación con el backend
- Tema personalizable vía CSS custom properties
- Autocontenido: incluye sus propios providers (Redux + React Query)
npm install @apofis/webpay-ui
# o
yarn add @apofis/webpay-uiAsegúrate de tener instaladas las siguientes dependencias en tu proyecto:
npm install react react-domimport React from "react";
import { WebpayComponent } from "@apofis/webpay-ui";
function CheckoutPage() {
return (
<WebpayComponent
apiUrl="https://tu-backend.com/api/webpay"
buyOrder="orden-12345"
sessionId="sesion-abc"
amount={15000}
returnUrl="https://tu-app.com/checkout/result"
onSuccess={(data) => {
console.log("Pago exitoso:", data);
// Redirigir a página de confirmación
}}
onError={(error) => {
console.error("Error en pago:", error.message);
}}
onCancel={() => {
console.log("Pago cancelado por el usuario");
}}
/>
);
}| Prop | Tipo | Requerido | Default | Descripción |
|---|---|---|---|---|
apiUrl |
string |
✅ | — | URL base del backend API |
buyOrder |
string |
✅ | — | Identificador de la orden de compra |
sessionId |
string |
✅ | — | Identificador de sesión |
amount |
number |
✅ | — | Monto a pagar (en pesos CLP) |
returnUrl |
string |
✅ | — | URL de retorno tras el pago |
logoUrl |
string |
❌ | — | URL del logo a mostrar en el header |
theme |
WebpayTheme |
❌ | Tema por defecto | Personalización visual |
buttonText |
string |
❌ | "Pagar con Webpay" |
Texto del botón de pago |
showDetails |
boolean |
❌ | true |
Mostrar detalle tras pago exitoso |
className |
string |
❌ | "" |
Clase CSS adicional para el contenedor |
onSuccess |
(data: ConfirmTransactionResponse) => void |
❌ | — | Callback cuando el pago es exitoso |
onError |
(error: Error) => void |
❌ | — | Callback cuando ocurre un error |
onCancel |
() => void |
❌ | — | Callback cuando el usuario cancela |
<WebpayComponent
apiUrl="https://api.example.com/webpay"
buyOrder="ord-001"
sessionId="sess-001"
amount={25000}
returnUrl="https://app.example.com/result"
theme={{
primaryColor: "#FF6B00",
secondaryColor: "#1A1A2E",
successColor: "#22C55E",
errorColor: "#DC2626",
backgroundColor: "#FAFAFA",
textColor: "#111827",
borderRadius: "12px",
fontFamily: "'Inter', sans-serif",
}}
/>| Variable | Default | Descripción |
|---|---|---|
--wpay-primary |
#E4002B |
Color principal |
--wpay-secondary |
#1A1A2E |
Color secundario |
--wpay-success |
#10B981 |
Color de éxito |
--wpay-error |
#EF4444 |
Color de error |
--wpay-bg |
#FFFFFF |
Fondo del componente |
--wpay-text |
#1F2937 |
Color del texto |
El componente espera un backend que exponga dos endpoints:
Request:
{
"buy_order": "orden-12345",
"session_id": "sesion-abc",
"amount": 15000,
"return_url": "https://tu-app.com/checkout/result"
}Response:
{
"token": "01ab...",
"url": "https://webpay3gint.transbank.cl/webpayserver/initTransaction"
}Request:
{
"token": "01ab..."
}Response:
{
"status": "AUTHORIZED",
"amount": 15000,
"authorization_code": "1234",
"buy_order": "orden-12345",
"session_id": "sesion-abc",
"card_number": "6623",
"transaction_date": "2026-04-17T10:30:00",
"payment_type": "VN",
"installments_number": 0,
"vci": "TSY"
}┌──────────┐ POST /create-transaction ┌──────────┐
│ Frontend │ ──────────────────────────────▶ │ Backend │
│ React │ ◀────────────────────────────── │ Python │
│ │ { token, url } │ │
│ │ │ │
│ │ Redirect → Webpay │ │
│ │ ──────────────────────────────▶ │ Transbank│
│ │ ◀────────────────────────────── │ │
│ │ Redirect → returnUrl?token_ws │ │
│ │ │ │
│ │ POST /confirm-transaction │ │
│ │ ──────────────────────────────▶ │ Backend │
│ │ ◀────────────────────────────── │ │
│ │ { status, amount, ... } │ │
└──────────┘ └──────────┘
Si necesitas mayor control, puedes usar los hooks directamente:
import { useCreateTransaction, useConfirmTransaction } from "@apofis/webpay-ui";
function CustomPayment() {
const createTx = useCreateTransaction("https://api.example.com/webpay");
const confirmTx = useConfirmTransaction("https://api.example.com/webpay");
const handlePay = () => {
createTx.mutate(
{
buy_order: "ord-001",
session_id: "sess-001",
amount: 10000,
return_url: window.location.href,
},
{
onSuccess: (data) => {
window.location.href = `${data.url}?token_ws=${data.token}`;
},
}
);
};
return <button onClick={handlePay}>Pagar</button>;
}| Export | Tipo | Descripción |
|---|---|---|
WebpayComponent |
Componente | Componente principal con UI completa |
useCreateTransaction |
Hook | Crear transacción vía React Query |
useConfirmTransaction |
Hook | Confirmar transacción vía React Query |
createWebpayStore |
Función | Crear store Redux independiente |
setCreating, setError... |
Actions | Acciones de Redux |
| Tipos TypeScript | Types | Interfaces y tipos exportados |
# Instalar dependencias
npm install
# Build
npm run build
# Watch mode
npm run dev- Nunca expongas las credenciales de Transbank en el frontend.
- Usa siempre HTTPS para la comunicación con el backend.
- El
returnUrldebe apuntar a tu dominio verificado. - Valida los montos y órdenes en el backend antes de crear la transacción.
MIT © APOFIS