React
Provider, hooks, props d'intégration et configuration Next.js associée.
@wajub/react enveloppe @wajub/js avec la syntaxe React : un provider qui charge une fois
l'environnement d'exécution, cinq composants de champs et quatre hooks. L'API de paiement ne change
pas. Le comportement de chaque option est présenté dans Checkout hébergé
et Champs de paiement. Cette page traite des éléments propres à React.
@wajub/react
Stable · GAnpm
- Version
- 1.4.0
- Runtime
- React 18+ · Next.js 13+
Couvre
- Paiements
- Liens de paiement
Absent de ce paquet : Facturation, Transferts, Sync, Shield, Taxes.
Installer
@wajub/js est une dépendance homologue, non intégrée. Installez-la donc sur la même ligne. Le
package est uniquement ESM et déclare sideEffects: false.
npm install @wajub/react @wajub/jsProvider
WajubProvider appelle loadWajub() depuis @wajub/js/pure et conserve l'environnement d'exécution
dans le contexte. Un provider couvre toute une sous-arborescence. Placez-le donc au niveau de la mise
en page ou de la page, pas autour de chaque composant.
'use client';
import { WajubProvider } from '@wajub/react';
export default function CheckoutLayout({ children }: { children: React.ReactNode }) {
return <WajubProvider>{children}</WajubProvider>;
}| Prop | Type | Valeur par défaut | Fonction |
|---|---|---|---|
loadOptions | { jsOrigin?, jsUrl? } | Valeurs du CDN | Remplace l'origine de chargement de l'environnement d'exécution |
defer | boolean | false | Ignore le chargement automatique et le confie à useLoadWajub() |
Utilisez defer si un parent a déjà chargé l'environnement d'exécution ou si le chargement doit
attendre une action de l'utilisateur. Sans cette option, le provider commence le chargement dès son montage.
Hooks
useWajub génère une erreur pendant le chargement
Il génère une erreur à chaque rendu jusqu'à l'arrivée du script, puis de nouveau si le chargement
échoue. Un composant qui l'appelle directement sous le provider plante dès son premier rendu.
Utilisez useWajubOptional(), qui renvoie plutôt null, sauf si vous savez que l'environnement est chargé.
import { useWajubOptional } from '@wajub/react';
function UpgradeButton({ sessionId }: { sessionId: string }) {
const runtime = useWajubOptional();
return (
<button
disabled={!runtime}
onClick={() => runtime?.wajub.open({ sessionId, onSuccess: onUpgraded })}
>
Upgrade plan
</button>
);
}| Hook | Valeur renvoyée | Remarques |
|---|---|---|
useWajub() | { wajub, Wajub, WajubError } | Génère une erreur pendant le chargement, en cas d'échec ou sans environnement |
useWajubOptional() | La même valeur ou null | Sûr pendant le SSR et avant l'arrivée du script |
useLoadWajub() | { runtime, loading, error, loadWajub } | Vous laisse piloter le chargement avec defer |
useConfirmPayment(sessionId) | { confirm, isConfirming } | Envoie un composant de champ monté |
loading et error proviennent directement du contexte du provider. useLoadWajub() permet donc
aussi d'afficher un indicateur de chargement ou une nouvelle tentative pendant l'arrivée de l'environnement.
CheckoutEmbed
Le checkout hébergé dans votre propre mise en page. Chaque option de EmbeddedConfig est une prop. L'enveloppe en ajoute quatre autres.
'use client';
import { CheckoutEmbed } from '@wajub/react';
export function CheckoutClient({ sessionId }: { sessionId: string }) {
return (
<CheckoutEmbed
sessionId={sessionId}
layout="tabs"
minHeight={480}
onSuccess={() => (window.location.href = '/order/complete')}
onError={(error) => console.error(error.code, error.message)}
/>
);
}| Prop | Type | Valeur par défaut | Fonction |
|---|---|---|---|
sessionId | string | Obligatoire | La valeur authorization_token de POST /payments |
className | string | aucune | Classe de l'élément conteneur |
style | CSSProperties | aucun | Styles en ligne du conteneur |
minHeight | number | 480 | Hauteur réservée en pixels pendant le chargement de l'iframe |
onReady | (instance) => void | aucun | Reçoit la CheckoutInstance à piloter ensuite |
Seul sessionId remonte l'intégration
Le composant se monte une fois par session et n'appelle jamais lui-même update(). La modification
de appearance, locale ou layout après le premier rendu reste sans effet. Conservez l'instance
reçue par onReady et pilotez-la vous-même.
const checkout = useRef<CheckoutInstance | null>(null);
<CheckoutEmbed sessionId={sessionId} onReady={(instance) => (checkout.current = instance)} />;
useEffect(() => {
checkout.current?.update({ appearance: { colorScheme: dark ? 'dark' : 'light' } });
}, [dark]);Champs de paiement
Les cinq composants affichent chacun un groupe de champs : CardComponent, MobileMoneyComponent,
WalletComponent, PaymentComponent et AddressComponent. Ils partagent les props de
ComponentConfig, avec les props du wrapper ci-dessous. ComponentEmbed
est le même composant avec un type explicite lorsque le choix intervient pendant l'exécution.
'use client';
import { useRef } from 'react';
import type { ComponentInstance } from '@wajub/js';
import { PaymentComponent, useConfirmPayment } from '@wajub/react';
export function PayForm({ sessionId }: { sessionId: string }) {
const { confirm, isConfirming } = useConfirmPayment(sessionId);
const field = useRef<ComponentInstance | null>(null);
return (
<>
<PaymentComponent
sessionId={sessionId}
collectAddress="shipping"
collectName
onInstance={(instance) => (field.current = instance)}
/>
<button
onClick={() => field.current && confirm(field.current)}
disabled={isConfirming}
>
{isConfirming ? 'Processing…' : 'Pay now'}
</button>
</>
);
}| Prop | Type | Valeur par défaut | Fonction |
|---|---|---|---|
type | ComponentType | Définie par l'alias | Uniquement sur ComponentEmbed |
minHeight | number | 200 | Hauteur réservée pendant le chargement du champ |
onInstance | (instance | null) => void | aucune | Se déclenche au montage, puis avec null au démontage |
onReady | (instance) => void | aucune | Se déclenche lorsque le champ devient interactif |
useConfirmPayment protège contre les doubles envois. Un second clic lorsque isConfirming vaut
true est ignoré. Il réussit avec { status } et rejette avec une WajubError, dont
confirmation_timeout après 60 secondes.
Les composants de champs se mettent à jour sur place
Contrairement à l'intégration, ils surveillent appearance, locale et layout, puis appellent
update() avec les trois valeurs lorsque l'une change. La modification de sessionId ou type
remonte plutôt le champ.
Next.js
La session est créée sur votre serveur. Aucun élément de ce package ne nécessite ni ne doit recevoir de clé secrète.
import { NextResponse } from 'next/server';
import { Wajub } from '@wajub/node';
const wajub = new Wajub({ secretKey: process.env.WAJUB_SECRET_KEY! });
export async function POST(req: Request) {
const { cartId } = await req.json();
const payment = await wajub.payments.create(
{
amount: 25000,
currency: 'XAF',
description: `Cart ${cartId}`,
callback: `${process.env.NEXT_PUBLIC_APP_URL}/order/return`,
metadata: { cart_id: cartId },
},
{ idempotencyKey: `cart-${cartId}` },
);
return NextResponse.json({ sessionId: payment.authorization_token });
}NEXT_PUBLIC_ est réservé à la clé publique
Une variable préfixée par NEXT_PUBLIC_ est intégrée au bundle du navigateur. pk. peut y figurer,
jamais sk.. Une clé secrète envoyée depuis un navigateur reçoit une réponse 403 et son propriétaire est alerté par e-mail.
L'App Router impose trois autres règles :
- Tous les composants de cette page sont des composants client. Marquez le fichier avec
'use client'ou importez-le depuis un fichier qui le fait. - Placez
WajubProviderdans une mise en page pour éviter qu'une navigation dans le flux de checkout recharge l'environnement d'exécution. - Transmettez
sessionIdcomme prop depuis un composant serveur ou récupérez-le depuis la route ci-dessus.
Éléments exportés par le package
| Export | Description |
|---|---|
WajubProvider | Charge une fois l'environnement d'exécution pour la sous-arborescence |
CheckoutEmbed | Checkout hébergé en ligne |
CardComponent, MobileMoneyComponent, WalletComponent, PaymentComponent, AddressComponent | Un groupe de champs chacun |
ComponentEmbed | Le même composant avec le type transmis comme prop |
useWajub, useWajubOptional, useLoadWajub | Donnent accès à l'environnement d'exécution |
useConfirmPayment | Envoie un composant de champ |
WajubContext, useWajubContext | Contexte brut pour votre propre hook |
Les types sont inclus : WajubProviderProps, CheckoutEmbedProps, ComponentEmbedProps et
WajubContextValue, avec tous les exports de @wajub/js.
Pages associées
- Checkout avec Next.js App RouterUn flux App Router complet, de l'action serveur au webhook.
- Checkout hébergéToutes les options et tous les callbacks derrière les props de l'intégration.
- Champs de paiementCe que collecte chaque composant de champ et ses limites.
- Sessions et sécuritéL'origine du jeton et ce qu'il permet de faire.