Coupure réseau pendant un paiement mobile : comment garantir la cohérence ?
poze a month ago278 gadefr
Cas réel : mon serveur appelle l'API de paiement, la connexion coupe, et je ne sais pas si le paiement a été créé ou non. Comment éviter les états incohérents ?
Dyagnostik IA
Se IA ki fè l. Se pa yon repons — kominote a anba a konfime oswa korije l. Toujou verifye anvan ou fye l.
1 Repons
Le principe : écrire votre intention avant d'appeler, et réconcilier après au lieu de deviner.
1. Enregistrer d'abord, appeler ensuite
const attempt = await db.paymentAttempt.create({
data: { id: newId(), orderId, provider: "MONCASH", amountHtgCents, status: "CREATING" },
});
try {
const redirect = await provider.start({ attemptId: attempt.id, amountHtgCents });
await db.paymentAttempt.update({ where: { id: attempt.id }, data: { status: "PENDING" } });
return redirect;
} catch (err) {
// Timeout ≠ échec : on ne sait pas. On laisse la tentative en CREATING.
throw new RetryableError("Paiement indisponible, réessayez dans un instant.");
}
2. Timeouts courts et explicites (10 à 20 s). Sans timeout, une requête peut rester bloquée indéfiniment sur un réseau instable.
3. Réconciliation automatique : un job reprend les tentatives CREATING ou PENDING anciennes et interroge le fournisseur par votre identifiant (RetrieveOrderPayment pour MonCash). Selon la réponse : payé, en attente ou expiré.
4. Réessais sûrs : si le client clique à nouveau, créez une nouvelle tentative (nouvel identifiant) plutôt que de rejouer l'ancienne à l'aveugle, puis vérifiez l'ancienne avant tout remboursement ou nouvelle facturation.
5. Côté interface : ne dites jamais « échec » sur un timeout. Dites « Nous vérifions votre paiement… » et mettez à jour l'écran quand la réconciliation a tranché.
Konekte pou di lòt moun si li te mache.
Sign in and verify your email to post an answer.