バックエンド・API・データ · 中級
お金を扱う:支払いと課金
一行でいうと: カードの詳細は絶対に保存するな、クライアントから来た金額は絶対に信頼するな、常に不変のイベントログを保持する。
責任の分割
支払いプロバイダーがカードを処理する;あなたが注文を処理する。詳細はプロバイダーのフォームや分離されたコンポーネントに入力され、あなたの側には識別子だけが保存される。これはあなたを重いコンプライアンスの世界のほとんどの外に置く。
金額はあなたの価格からサーバーで計算される。クライアントから来た金額はリクエストであり、事実ではない。
フラグでなく状態
注文は定義された状態を通過する:作成済み、支払い待ち、支払済み、失敗、返金済み。各遷移は時刻と理由とともに記録される。「支払済み」のブール型フラグは、必要なときにちょうど履歴を失う。
支払いプロバイダーからの通知は順不同で、時に二回来る。競合なく安全にイベント識別子で処理する。
照合
あなたのレコードをプロバイダーのレポートと比較する日次プロセスを構築する。不一致は常に起きる;問題はあなたが見つけるか顧客が見つけるかだ。
さらに深く
金額を最小単位の整数として保存し、浮動小数点小数として保存しない、常に通貨コードを付ける。為替レートと実際に表示された価格も保存する——これらはどの紛争やレポートでも必要なデータだ。