Coupure réseau pendant un paiement mobile : comment garantir la cohérence ?
asked a month ago279 viewsfr
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 ?
AI diagnosis
AI-generated. Not an answer — the community below confirms or corrects it. Always verify before relying on it.
1 Answer
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é.
Sign in to tell others whether this worked.
Sign in and verify your email to post an answer.