Vue 3
Provider, composables, props d'intégration et configuration Nuxt associée.
@wajub/vue enveloppe @wajub/js avec la syntaxe Vue 3 : un provider qui charge une fois
l'environnement d'exécution, cinq composants de champs et quatre composables. 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 à Vue.
@wajub/vue
Stable · GAnpm
- Version
- 1.4.0
- Runtime
- Vue 3.3+
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/vue @wajub/jsProvider
WajubProvider appelle loadWajub() depuis @wajub/js/pure et fournit l'environnement d'exécution
avec l'injection de Vue. 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.
<script setup lang="ts">
import { WajubProvider } from '@wajub/vue';
</script>
<template>
<ClientOnly>
<WajubProvider>
<slot />
</WajubProvider>
</ClientOnly>
</template>| Prop | Type | Valeur par défaut | Fonction |
|---|---|---|---|
defer | boolean | false | Ignore le chargement automatique et le confie à useLoadWajub() |
load-options | { jsOrigin?, jsUrl? } | Valeurs du CDN | Remplace l'origine de chargement de l'environnement d'exécution |
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.
Composables
useWajub génère une erreur pendant le chargement
Il génère une erreur à chaque appel jusqu'à l'arrivée du script, puis de nouveau si le chargement
échoue. Un composant qui l'appelle dans setup sous le provider plante avant le premier affichage.
Utilisez useWajubOptional(), qui renvoie plutôt null, sauf si l'environnement est déjà chargé.
<script setup lang="ts">
import { useWajubOptional } from '@wajub/vue';
const props = defineProps<{ sessionId: string }>();
const runtime = useWajubOptional();
function upgrade() {
runtime?.wajub.open({ sessionId: props.sessionId, onSuccess: onUpgraded });
}
</script>
<template>
<button :disabled="!runtime" @click="upgrade">Upgrade plan</button>
</template>| Composable | 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 } | Les trois premiers sont des refs. Vous laisse piloter le chargement avec defer |
useConfirmPayment(sessionId) | { confirm, isConfirming } | isConfirming est une ref. Envoie un composant de champ monté |
useWajubContext() renvoie les mêmes refs { runtime, loading, error } si vous préférez créer
votre propre composable. WAJUB_INJECTION_KEY est la clé utilisée par le provider.
CheckoutEmbed
Le checkout hébergé dans votre propre mise en page. Contrairement aux autres frameworks, les props
forment une liste fermée : session-id, class, style, min-height, locale, embed-origin,
theme, appearance, layout, loading-text, show-loading et les onze callbacks.
<script setup lang="ts">
import { CheckoutEmbed } from '@wajub/vue';
defineProps<{ sessionId: string }>();
</script>
<template>
<CheckoutEmbed
:key="sessionId"
:session-id="sessionId"
layout="tabs"
:min-height="480"
@success="navigateTo('/order/complete')"
@error="(error) => console.error(error.code, error.message)"
/>
</template>Chaque callback est déclaré comme prop. @success et :on-success sont donc équivalents. Vue
convertit le listener en prop pour vous.
| Prop | Type | Valeur par défaut | Fonction |
|---|---|---|---|
session-id | string | Obligatoire | La valeur authorization_token de POST /payments |
class | string | aucune | Classe de l'élément conteneur |
style | Record<string, string> | aucun | Styles en ligne du conteneur |
min-height | number | 480 | Hauteur réservée en pixels pendant le chargement de l'iframe |
L'intégration ne réagit jamais aux modifications de props
Elle se monte une fois et ne surveille rien, même pas session-id. Une modification ultérieure de
appearance, locale ou layout reste sans effet. Une seconde session affiche la première.
Associez :key à la session pour que Vue reconstruise le composant et conservez l'instance reçue
par @ready pour les modifications en direct.
<script setup lang="ts">
import { ref, watch } from 'vue';
import type { CheckoutInstance } from '@wajub/js';
const props = defineProps<{ sessionId: string; dark: boolean }>();
const checkout = ref<CheckoutInstance | null>(null);
watch(
() => props.dark,
(dark) => checkout.value?.update({ appearance: { colorScheme: dark ? 'dark' : 'light' } }),
);
</script>
<template>
<CheckoutEmbed
:key="sessionId"
:session-id="sessionId"
@ready="(instance) => (checkout = instance)"
/>
</template>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.
<script setup lang="ts">
import { ref } from 'vue';
import type { ComponentInstance } from '@wajub/js';
import { AddressComponent, PaymentComponent, useConfirmPayment } from '@wajub/vue';
const props = defineProps<{ sessionId: string }>();
const { confirm, isConfirming } = useConfirmPayment(props.sessionId);
const field = ref<ComponentInstance | null>(null);
function pay() {
if (field.value) confirm(field.value);
}
</script>
<template>
<AddressComponent :session-id="sessionId" address-mode="shipping" />
<PaymentComponent
:session-id="sessionId"
collect-address="shipping"
collect-name
@instance="(instance) => (field = instance)"
/>
<button :disabled="isConfirming || !field" @click="pay">
{{ isConfirming ? 'Processing…' : 'Pay now' }}
</button>
</template>| Prop | Type | Valeur par défaut | Fonction |
|---|---|---|---|
type | ComponentType | Défini par l'alias | Uniquement sur ComponentEmbed |
min-height | number | 200 | Hauteur réservée pendant le chargement du champ |
@instance | (instance | null) => void | aucune | Se déclenche au montage, puis avec null au démontage |
@ready | (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 session-id ou type
remonte plutôt le champ.
Nuxt
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 { Wajub } from '@wajub/node';
const wajub = new Wajub({ secretKey: process.env.WAJUB_SECRET_KEY! });
export default defineEventHandler(async (event) => {
const { cartId } = await readBody(event);
const payment = await wajub.payments.create(
{
amount: 25000,
currency: 'XAF',
description: `Cart ${cartId}`,
callback: `${process.env.NUXT_PUBLIC_APP_URL}/order/return`,
metadata: { cart_id: cartId },
},
{ idempotencyKey: `cart-${cartId}` },
);
return { sessionId: payment.authorization_token };
});runtimeConfig.public est réservé à la clé publique
Tout élément sous public est sérialisé dans la page. 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.
Nuxt impose trois autres règles :
- Placez le checkout dans
<ClientOnly>. L'environnement d'exécution nécessite unwindow. Les composables renvoientnullau lieu de générer une erreur pendant le rendu serveur. - Placez
WajubProviderdans une mise en page pour éviter qu'une navigation dans le flux de checkout recharge l'environnement d'exécution. - Récupérez la session depuis
server/api/et transmettez le jeton comme prop.
É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 |
WAJUB_INJECTION_KEY, useWajubContext | Injection brute pour votre propre composable |
Les types sont inclus : WajubProviderProps, CheckoutEmbedProps, ComponentEmbedProps et
WajubContextValue, avec tous les exports de @wajub/js.
Pages associées