Svelte
Provider, stores, props d'intégration et configuration SvelteKit associée.
@wajub/svelte enveloppe @wajub/js avec la syntaxe Svelte : un provider qui charge une fois
l'environnement d'exécution, cinq composants de champs et quatre helpers basés sur des stores.
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 à Svelte.
@wajub/svelte
Stable · GAnpm
- Version
- 1.4.0
- Runtime
- Svelte 4+ · SvelteKit
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 une condition d'export svelte. Le bundler résout ainsi directement les composants.
npm install @wajub/svelte @wajub/jsProvider
WajubProvider appelle loadWajub() depuis @wajub/js/pure et place l'environnement d'exécution
dans le contexte Svelte. Un provider couvre toute une sous-arborescence. Placez-le donc au niveau
de la mise en page, pas autour de chaque composant.
<script lang="ts">
import { WajubProvider } from '@wajub/svelte';
</script>
<WajubProvider>
<slot />
</WajubProvider>| Prop | Type | Valeur par défaut | Fonction |
|---|---|---|---|
defer | boolean | false | Ignore le chargement automatique et le confie à useLoadWajub() |
loadOptions | { jsOrigin?, jsUrl? } | Valeurs du CDN | Remplace l'origine de chargement de l'environnement d'exécution |
Stores et helpers
Tous les éléments réactifs sont des stores Svelte. Lisez-les donc avec $ dans le template.
useWajub génère une erreur tant que l'environnement n'est pas chargé
Il génère une erreur hors d'un provider et pendant le chargement du script, donc à chaque rendu
avant la fin du chargement. Utilisez useWajubOptional(), qui renvoie plutôt null, sauf si vous
savez que l'environnement est déjà chargé.
<script lang="ts">
import { useWajubOptional } from '@wajub/svelte';
export let sessionId: string;
const runtime = useWajubOptional();
</script>
<button
disabled={!runtime}
on:click={() => runtime?.wajub.open({ sessionId, onSuccess: onUpgraded })}
>
Upgrade plan
</button>| Helper | Valeur renvoyée | Remarques |
|---|---|---|
useWajub() | { wajub, Wajub, WajubError } | Génère une erreur si l'environnement est indisponible |
useWajubOptional() | La même valeur ou null | Sûr pendant le SSR et avant l'arrivée du script |
useLoadWajub() | { runtime, loading, error, loadWajub } | Les trois premiers sont des stores. Vous laisse piloter le chargement avec defer |
useConfirmPayment(sessionId) | { confirm, isConfirming } | isConfirming est un store modifiable. Envoie un composant de champ monté |
useWajubContext() renvoie les mêmes stores { runtime, loading, error } si vous préférez créer
votre propre helper. Il s'agit d'un alias de getWajubContext(). Le provider appelle lui-même setWajubContext().
CheckoutEmbed
Le checkout hébergé dans votre propre mise en page. Chaque option de EmbeddedConfig est une prop, comme chaque callback.
<script lang="ts">
import { CheckoutEmbed } from '@wajub/svelte';
export let sessionId: string;
</script>
{#key sessionId}
<CheckoutEmbed
{sessionId}
layout="tabs"
minHeight={480}
onSuccess={() => (window.location.href = '/order/complete')}
onError={(error) => console.error(error.code, error.message)}
/>
{/key}L'intégration et les champs n'utilisent pas la même convention
CheckoutEmbed reçoit ses callbacks comme props : onSuccess, onError, onReady et les autres.
Les composants de champs émettent plutôt des événements Svelte : on:ready et on:instance.
Écrire on:success sur l'intégration ou onInstance sur un champ reste silencieusement sans effet.
L'enveloppe {#key sessionId} reconstruit l'intégration pour une seconde session. La conservation
de l'instance reçue par onReady permet de modifier son style sans la reconstruire.
<script lang="ts">
import type { CheckoutInstance } from '@wajub/js';
import { CheckoutEmbed } from '@wajub/svelte';
export let sessionId: string;
export let dark = false;
let checkout: CheckoutInstance | null = null;
$: checkout?.update({ appearance: { colorScheme: dark ? 'dark' : 'light' } });
</script>
{#key sessionId}
<CheckoutEmbed {sessionId} onReady={(instance) => (checkout = instance)} />
{/key}Champs de paiement
Les cinq composants affichent chacun un groupe de champs : CardComponent, MobileMoneyComponent,
WalletComponent, PaymentComponent et AddressComponent. Ils partagent les props de
ComponentConfig, et chacun est un ComponentEmbed avec son
type déjà défini. Utilisez directement ComponentEmbed lorsque le choix intervient pendant l'exécution.
<script lang="ts">
import type { ComponentInstance } from '@wajub/js';
import { AddressComponent, PaymentComponent, useConfirmPayment } from '@wajub/svelte';
export let sessionId: string;
const { confirm, isConfirming } = useConfirmPayment(sessionId);
let field: ComponentInstance | null = null;
</script>
<AddressComponent {sessionId} addressMode="shipping" />
<PaymentComponent
{sessionId}
collectAddress="shipping"
collectName
on:instance={(event) => (field = event.detail)}
/>
<button disabled={$isConfirming || !field} on:click={() => field && confirm(field)}>
{$isConfirming ? 'Processing…' : 'Pay now'}
</button>| Événement | Détail | Déclenchement |
|---|---|---|
on:ready | ComponentInstance | Le champ est monté et interactif |
on:instance | ComponentInstance ou null | Au montage, puis avec null au démontage |
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.
Types
Chaque helper est entièrement typé, comme tous les exports de @wajub/js. Les composants ne le sont pas.
Les composants sont distribués sans types de props
Les huit fichiers .d.ts contiennent uniquement export { SvelteComponent as default } from 'svelte'.
Le package n'exporte aucun CheckoutEmbedProps ni ComponentEmbedProps. Votre éditeur ne complète
pas les props et svelte-check ne détecte pas une faute de frappe. Consultez les noms de props dans
Checkout hébergé et
Champs de paiement, ou importez les types de configuration
depuis @wajub/js pour annoter vos variables.
import type { AppearanceConfig, CheckoutLayout } from '@wajub/js';
const appearance: AppearanceConfig = { primaryColor: '#0f172a', labels: 'floating' };
const layout: CheckoutLayout = 'tabs';SvelteKit
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 { json } from '@sveltejs/kit';
import { WAJUB_SECRET_KEY } from '$env/static/private';
import { Wajub } from '@wajub/node';
import type { RequestHandler } from './$types';
const wajub = new Wajub({ secretKey: WAJUB_SECRET_KEY });
export const POST: RequestHandler = async ({ request }) => {
const { cartId } = await request.json();
const payment = await wajub.payments.create(
{
amount: 25000,
currency: 'XAF',
description: `Cart ${cartId}`,
metadata: { cart_id: cartId },
},
{ idempotencyKey: `cart-${cartId}` },
);
return json({ sessionId: payment.authorization_token });
};$env/static/public est réservé à la clé publique
Tout élément importé depuis $env/static/public est intégré au bundle client. pk. peut y figurer,
jamais sk.. Pour cette raison, $env/static/private refuse toute importation depuis le code client.
Une clé secrète envoyée depuis un navigateur reçoit une réponse 403 et son propriétaire est alerté par e-mail.
SvelteKit impose deux autres règles :
- Désactivez le rendu serveur des routes de checkout avec
export const ssr = falsedans+page.ts, ou montez l'intégration dans un bloc{#if browser}. L'environnement d'exécution nécessite unwindow. - Placez
WajubProviderdans+layout.sveltepour éviter qu'une navigation dans le flux de checkout recharge l'environnement d'exécution.
É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 |
getWajubContext, setWajubContext, useWajubContext | Contexte brut pour votre propre helper |
WajubContextValue est le seul type déclaré par le package.
Pages associées