Coupure réseau pendant un paiement mobile : comment garantir la cohérence ?

poze a month ago277 gadefr

1

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

9
✓
✓ Repons yo aksepte

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.

answered a month ago

Sign in and verify your email to post an answer.