Liens de paiement : guide
Comment fonctionne un lien de paiement Qvard, comment le créer dans le tableau de bord et comment créer un paiement par client via l’API.
Ce qu’est un lien
Un lien de paiement est une enveloppe autour des paiements. Chaque client qui paie par ce lien reçoit son propre paiement, sur la même page de paiement hébergée que tout autre paiement Qvard.
Un paiement est une facture à taux fixe. Le lien est un point d’entrée réutilisable qui crée ces paiements. Un lien peut créer plusieurs paiements, mais il ne remplace pas le paiement.
Le lien a sa propre devise, celle que le client voit et utilise pour payer. Chaque paiement fige son taux à sa création. Les taux actuels sont sur la page « Taux de change ».
Créer un lien dans le tableau de bord
Dans le tableau de bord, ouvrez la section « Liens de paiement » et configurez le lien. Les options sont :
- Montant : fixe, ou saisi par le client avec un minimum et un maximum.
- Limite de paiements : sans limite, un seul paiement ou N paiements.
- Durée : 1, 7 ou 30 jours, ou sans durée.
- E-mail de l’acheteur : ne pas demander, facultatif ou obligatoire.
Chaque lien a sa propre adresse : https://qvard.com/l/<slug>. Le client l’ouvre, choisit le jeton et le réseau, puis voit la page de paiement habituelle.
Vous pouvez télécharger le lien sous forme de QR code PNG, pour les factures imprimées, les tickets et les affiches. Le bouton « Partager » vous donne le lien à envoyer par le canal de votre choix.
Un lien par client via l’API
Pour savoir précisément qui paie, créez un paiement pour chaque client via l’API depuis votre serveur, puis envoyez au client le redirectUrl de la réponse. La clé secrète (qvard_sk_…) doit rester sur votre serveur.
Exemple de requête
# Create a payment for one customer
curl -X POST https://api.qvard.com/api/v1/payment \
-H 'x-api-key: qvard_sk_YOUR_SECRET_KEY' \
-H 'Content-Type: application/json' \
-d '{"price":12499.00,"currency":"INR","id":"order-123"}'
# The response contains "data": { "redirectUrl": "https://my.qvard.com/pay/..." }
# Send that redirectUrl to the customer.// Run on your server only: the secret key must not reach the browser
async function createPaymentLink(orderId, amount) {
const res = await fetch('https://api.qvard.com/api/v1/payment', {
method: 'POST',
headers: {
'x-api-key': process.env.QVARD_SECRET_KEY,
'Content-Type': 'application/json'
},
body: JSON.stringify({ price: amount, currency: 'INR', id: orderId })
});
if (!res.ok) throw new Error('Qvard API error: ' + res.status);
const payment = await res.json();
return payment.data.redirectUrl; // send this link to the customer
}
// Usage inside an async handler: const link = await createPaymentLink('order-123', 10);La réponse contient l’id du paiement et le redirectUrl, par exemple https://my.qvard.com/pay/<uuid>. Envoyez le redirectUrl au client. La valeur id de la requête est votre numéro de commande.
Ne placez jamais la clé secrète (qvard_sk_…) dans du code exécuté dans le navigateur ni dans un dépôt public. Créez les paiements uniquement depuis le serveur.
Vente limitée et lien à usage unique
Un lien à usage unique accepte un paiement, ce qui convient à une facture. Un lien limité à N paiements en accepte N puis s’arrête, ce qui convient à une offre limitée, par exemple 100 places.
Statuts du lien
- Actif : le lien accepte les paiements.
- Désactivé : vous avez désactivé le lien dans le tableau de bord. Il n’accepte aucun paiement tant que vous ne le réactivez pas.
- Expiré : la durée (1, 7 ou 30 jours) est écoulée.
- Épuisé : la limite de paiements est atteinte.
Webhook pour les paiements issus d’un lien
Les paiements créés à partir d’un lien envoient le même webhook et portent le même en-tête X-Qvard-Signature. Leur corps contient deux champs supplémentaires facultatifs : paymentLink, c’est-à-dire le slug du lien, et customerEmail, l’e-mail saisi par le client si le lien le demandait. Les autres paiements n’ont pas ces champs.
Comment vérifier la signature du webhook
Ce que le lien ne dit pas
Un lien réutilisable n’indique pas qui a payé. Le webhook signale le paiement, pas l’acheteur.
Le champ customerEmail est facultatif et non vérifié : le client le saisit lui-même et personne ne le contrôle. Si vous devez connaître l’acheteur, créez un paiement par API pour chaque acheteur.