Oyun Kitabı
Preuve de paiement et statut de paiement : pourquoi il ne faut pas confondre (Preuve DE Paiement Et Statut DE Paiement Pourquoi Il Ne Faut Pas Confondre)
Les preuves, c'est ce que PSP prétend. L'état est ce que vous décidez. Si vous conservez ces deux éléments dans le même registre, vous saurez à qui faire confiance lors de la récupération.
Moteur de paiement distribué
Partie 8 de 22
Une série d'architectures de paiement distribuées qui comblent le fossé entre la capture et l'achèvement.
Deux questions différentes, deux enregistrements différents
« Qu'est-ce que la PSP a dit ? » et "qu'avons-nous décidé?" Ce sont deux questions similaires mais en réalité complètement différentes. La réponse à la première est une preuve : le webhook brut de la PSP, la réponse de l’API, l’horodatage – un enregistrement immuable. La réponse à la seconde est la suivante : la décision que vous prenez en combinant ces preuves et vos règles commerciales : paiement Captured ou paiement Completed.```text
Evidence (kanıt) State (durum)
PSP'nin ham cevabı → Sizin kararınız
Değişmez, append-only → Değişebilir, karar tablosu
“Ne oldu” → “Biz ne yaptık”
## Concepts à la première mention```text
📦 Evidence (Kanıt)
Dış sistemin (PSP) size bildirdiği ham gerçeğin, yorumlanmadan ve değiştirilmeden saklanan kaydı.
📦 State (Durum)
Evidence'ları ve iş kurallarını birleştirerek sizin verdiğiniz, ikinci ve dördüncü bölümde tanımladığımız durum makinesindeki karar.
📦 Append-only Log
Sadece ekleme yapılan, mevcut kayıtların asla üzerine yazılmadığı veya silinmediği depolama şekli.
📦 Source of Truth vs. Derived Truth
Birincisi ham, tartışmasız gerçek; ikincisi bu gerçekten türetilen, yorum içeren karar.
📦 Reconciliation
Evidence kayıtlarını tekrar okuyup, mevcut state'in bu kanıtlarla hâlâ tutarlı olup olmadığını doğrulama süreci.
```L'exemple qui démontre le plus clairement cette distinction est le suivant : la charge utile du webhook envoyée par PSP constitue une preuve ; C'est une décision de l'État que vous lisiez cette charge utile et écriviez `Payment.Status = Captured`. Les preuves ne changent jamais ; L'état peut être mis à jour lorsque de nouvelles preuves arrivent.
## Pourquoi ces deux-là ne peuvent-ils pas vivre dans la même table
Certains systèmes écrasent directement la table `payments` par le webhook venant de la PSP : lorsqu'un nouveau webhook arrive, la ligne correspondante est mise à jour, l'ancienne valeur est perdue. Avec cette conception, vous ne pouvez plus répondre à la question « qu’a dit exactement la PSP » – vous ne pouvez répondre qu’à la question « quel a été notre dernier commentaire ?```text
Yanlış model:
payments
id | status | raw_payload
1 | Captured | {...son webhook'un içeriği, öncekiler üzerine yazıldı...}
```Cela signifie que vous perdez les informations (chaîne de preuves antérieure) qui seront les plus utiles lors d'un incident.
## Modèle correct : deux rangements séparés
Les preuves sont stockées dans leur propre table en ajout uniquement ; Chaque nouveau webhook ou réponse API est ajouté sous forme de nouvelle ligne, aucune ligne n'est mise à jour ou supprimée. L'État est la décision actuelle dérivée des preuves contenues dans un tableau séparé.```text
payment_evidence (append-only)
id | payment_id | source | received_at | raw_payload
1 | pay_42 | psp | t1 | {...authorize...}
2 | pay_42 | psp | t2 | {...captured...}
3 | pay_42 | psp | t5 | {...captured (duplicate)...}
payments (state)
id | status
pay_42 | Captured ← evidence #2'den türetildi, #3 aynı sonucu doğruladı
```Grâce à cette distinction, la frontière étatique n’« oublie » jamais quand et pourquoi elle a changé – parce que les preuves qui l’ont produit sont toujours là.
## Pourquoi la récupération lit-elle les preuves et non les états ?
Lorsque vous devez remettre votre système à l'état « correct » après un incident (par exemple, un crash d'un travailleur, un mauvais déploiement, une incohérence suspecte), il est risqué de se fier à l'état actuel, car l'état peut être exactement celui où l'incident s'est produit. Au lieu de cela, relire le journal des preuves et rejouer l’état est un moyen plus fiable de récupérer.```text
Recovery süreci
1. payment_evidence tablosundan pay_42'ye ait tüm kayıtları zaman sırasına göre oku
2. Her evidence'ı iş kurallarına göre tekrar işle (guard'lardan geçir)
3. Sonuçta türeyen state'i mevcut payments tablosundaki değerle karşılaştır
4. Fark varsa, hangisi doğru olduğunu evidence'a dayanarak belirle — state'e değil
```Ce processus constitue la base des travailleurs de la réconciliation que nous aborderons plus loin dans cette série : lorsque l’État est dans le doute, les preuves sont toujours l’arbitre.
## Ne stockez jamais de preuves « interprétées »
Un dernier écueil : même lorsque certains systèmes stockent des preuves, ils les « nettoient » un peu : en supprimant les champs inutiles, en normalisant le format. Cela perd la valeur réelle de la preuve (ce que dit exactement la PSP, octet par octet). Les preuves doivent être la version brute et inchangée de la réponse que vous donne la PSP ; Le travail d’interprétation et de normalisation appartient à l’étape de dérivation de l’état, et non à la preuve elle-même.
## Les confrontations les plus déroutantes de cet épisode```text
❌ Evidence ve state aynı satırda tutulabilir, biri diğerinin üzerine yazılabilir
✓ Evidence append-only'dir; state ayrı bir tabloda, evidence'tan türetilir
❌ Webhook payload'ını saklamadan önce “temizlemek” zararsızdır
✓ Temizlenmiş evidence, PSP'nin tam olarak ne söylediği bilgisini kaybettirir
❌ Bir incident'te mevcut state'e güvenip devam etmek en hızlı yoldur
✓ Incident sırasında state şüphelidir; evidence'tan yeniden türetmek (replay) daha güvenilirdir
❌ Evidence sadece debug/log amaçlıdır, iş kararı için gerekli değildir
✓ Evidence, reconciliation ve recovery'nin tek güvenilir kaynağıdır
Liste de contrôle pour votre distinction Preuve/État
- La charge utile brute du webhook de la PSP est-elle stockée dans une table distincte, en ajout uniquement, ou est-elle écrasée par la table
payments? - Le deuxième ou le troisième webhook pour le même paiement écrase-t-il le premier enregistrement ou une nouvelle ligne de preuve est-elle ajoutée ?
- En cas de suspicion d'incohérence d'état, disposez-vous d'un processus permettant de relire le journal des preuves ?
- Existe-t-il des étapes de « nettoyage » ou de normalisation lors du stockage des preuves ? Si oui, stockez-vous également les données brutes séparément ?
- Pouvez-vous retracer rétrospectivement de quel enregistrement de preuve une ligne de votre table State a été dérivée ?
Si vous répondez « non » à l’une de ces cinq questions, vous ne pourrez peut-être pas répondre à la question « Qu’a réellement dit PSP » lors d’un incident.
Choses à retenir de cette section
- La preuve est la vérité brute et immuable que vous dit la PSP ; L'état est la décision que vous prenez en combinant ces faits avec les règles métier.
- Les preuves doivent être uniquement annexées ; Lorsqu'un nouveau webhook arrive, l'ancien n'est pas écrasé, une nouvelle ligne est ajoutée.
- Les processus de redressement et de réconciliation ne doivent pas dépendre de l’état actuel ; Doit relire le journal des preuves et en déduire l'état.
- « Nettoyer » les preuves lorsque vous les cachez, vous perdez la connaissance de ce que dit exactement la PSP ; Les données brutes doivent toujours être protégées.
L'état est votre commentaire aujourd'hui ; La preuve est le témoin qui ne change jamais. Si vous commencez à remettre en question votre propre interprétation d’un incident plutôt que celle du témoin, vous perdrez.
FAQ
Frequently asked questions
Qu’est-ce que la preuve ?
Un enregistrement de la vérité brute que le système externe (PSP) vous rapporte, stocké sans interprétation ni modification.
Qu’est-ce que l’État ?
La décision que vous prenez en combinant des preuves et des règles métier dans la machine à états que nous avons décrite dans les chapitres deux et quatre.
Est-il vrai que « la preuve et l’état peuvent être conservés sur la même ligne, l’un écrasant l’autre » ?
Les preuves sont uniquement annexées ; l'état est dérivé des preuves dans un tableau séparé
Que corrige cette section ?
Cette section explique pourquoi vous ne devez jamais conserver les deux dans le même journal et pourquoi cette distinction sauve des vies dans les scénarios de sauvetage. La preuve est la vérité brute et immuable que la PSP vous dit ; L'état est la décision que vous prenez en combinant ces faits avec les règles métier. « Qu'est-ce que la PSP a dit ? » et "qu'avons-nous décidé?" Ce sont deux questions similaires mais en réalité complètement différentes. La réponse à la première est une preuve : le webhook brut de la PSP, la réponse de l’API, l’horodatage – un enregistrement immuable. La réponse à la seconde est la suivante : la décision que vous prenez en combinant ces preuves et vos règles commerciales : paiement `Captured` ou paiement `Completed`.
Principes d'ingénierie appris
- Les preuves sont la vérité brute et immuable de la PSP ; L'état est la décision que vous prenez en combinant ce fait avec des règles métier - les deux ne sont pas le même enregistrement.
- Les preuves doivent toujours être annexées uniquement ; Les nouvelles informations ne sont pas écrasées mais ajoutées aux anciennes.
- Le sauvetage et la réconciliation doivent toujours s’appuyer sur des preuves immuables et non sur un état douteux.
Continuer la lecture
Continuer la lecture
Suivant en série
Abstraction du fournisseur sans fuite SDK (kit de développement logiciel) : la limite de la passerelle
Comment la passerelle du fournisseur possède-t-elle le SDK PSP ? Pourquoi l'orchestrateur de paiement ne devrait-il voir qu'une interface sémantique ? Les…
Suivant en série
Modèle de boîte d'envoi/boîte de réception dans les systèmes de paiement
Si l'écriture dans la base de données et la publication d'un événement ne font pas partie de la même transaction, l'une d'elles sera perdue ou répétée.…
Même série
Événement sémantique au lieu de données brutes du fournisseur
Le webhook reçu par la passerelle du fournisseur doit-il atteindre l'aval avec le nom de l'événement du PSP ou un événement sémantique tel que…