オーソリと売上確定のあいだで金が漏れる場所
一言でいうと
カード決済は、オーソリと売上確定という2つの出来事に分かれていて、その間に数時間から数日の間隔があります。その間隔で、売上確定の漏れ・一部売上確定の残額・冪等キーの失敗による二重請求が生じます。
なぜ必要なのか
PG(決済代行)会社に入ると、最初に受ける質問は、たいていこれです。「オーソリの件数と売上確定の件数が、なぜ違うのですか」。
違うのが正常です。カード決済は、1回では終わりません。
승인 authorization 이 카드로 이만큼 쓸 수 있는지 확인하고
그만큼을 한도에서 떼어 둔다. 돈은 아직 안 움직인다.
매입 capture 실제로 청구한다. 여기서 돈이 움직인다.
2つの韓国語コメントは、順に、オーソリ(authorization)はこのカードでこれだけ使えるかを確認し、その分を限度額から取り置くもので、お金はまだ動かないこと、売上確定(capture)は実際に請求するもので、ここでお金が動くことを述べています。
配送が終わったあとで売上確定する加盟店が多いので、2つの間は、数時間から数日まで開きます。そのため、オーソリの件数と売上確定の件数は、もともと違います。問題は、違うという事実ではなく、どんな理由で違うのかを言えないことです。理由を言えなければ、その差の中に本当の事故が混ざっていても、わかりません。
どう動くのか
オーソリ1つは、結局、3つのうちの1つになります。
전량 매입 승인 금액만큼 청구됐다. 정상 종료.
부분 매입 승인 금액보다 적게 청구됐다. 주문 일부 취소·품절이 원인.
차액은 승인 취소를 따로 내지 않으면 고객 한도에 계속 묶인다.
매입 없음 승인만 나고 끝났다. 여기가 위험하다.
3つの韓国語コメントは、順に、全額売上確定はオーソリ金額どおりに請求されて正常終了、一部売上確定はオーソリ金額より少なく請求され、注文の一部取消や品切れが原因で、差額はオーソリ取消を別に出さなければ顧客の限度額に取り置かれたままになること、売上確定なしはオーソリだけで終わった状態で、ここが危険であることを述べています。
売上確定のないオーソリが危険な理由は、オーソリに有効期限があるからです。通常は数日から1か月の間に自動で解除され、解除されたあとに売上確定を試みると、拒否されます。その時点では、元に戻す方法がありません。加盟店は商品を送ったのに、お金を受け取れない状態で終わります。そのため、オーソリだけがあって売上確定がない件は、有効期限が切れる前に見つける必要があり、これは、バッチで毎日回すべき種類の点検です。
一部売上確定の残額も、性質は同じです。5万ウォンのオーソリに対して3万ウォンだけ売上確定したなら、2万ウォンは、オーソリ取消(void)を別に出さない限り、顧客の限度額に取り置かれたままです。顧客は、使ってもいない2万ウォンのために次の決済を拒否され、その問い合わせがコールセンターに来ます。
冪等キーと二重請求。決済リクエストは、タイムアウトになっても、実際には成功していることがあります。レスポンスを受け取れなかったクライアントはリトライし、サーバーが同じリクエストに同じ結果を返さなければ、オーソリが2回出ます。2つのオーソリがそれぞれ売上確定されれば、顧客は2回請求されます。
ここで最も重要な事実は、これです。2つのオーソリは、auth_idが違います。オーソリ番号で重複を探しても、何も出てきません。同じことを2回したという事実は、冪等キーにだけ残っています。そのため、二重請求の調査は、常に冪等キーを基準にした集計から始まります。冪等キーをそもそも保存しないシステムなら、その事実自体が、最初の報告項目です。
現場での姿
あるPGで、特定の加盟店の二重請求の苦情が集中したことがあります。その加盟店の決済モジュールは、レスポンスのタイムアウトを3秒に設定していましたが、カード会社のオーソリのレスポンスは、普段2.8秒ほどかかっていました。普段はギリギリで通過していても、カード会社側が少し遅くなると、タイムアウトが大量に発生し、そのたびにリトライが出ていきました。冪等キーはリクエスト本文にありましたが、PGサーバーはそれを保存せず、そのまま通過させていました。
直したのは、2つでした。タイムアウトを延ばしたのではなく、冪等キーを保存し、同じキーには同じレスポンスを返すようにしたのです。リトライはなくならないので、受け取る側で防がなければなりません。そして、すでに発生した二重請求を探して返金したのですが、その一覧を作るのに使ったのが、冪等キーを基準にした集計でした。オーソリ番号でいくら調べても出てこなかった45件が、冪等キーでまとめた瞬間に、一度に出てきました。
オーソリ・売上確定の時間差は、証券のT+2と同じ構造です。出来事が2つに分かれていて、その間に状態が生きており、その状態を監視しなければ、お金が漏れます。ドメインは違っても、扱うべき問題の形は同じです。
次のラボですること
オーソリ3,045件と売上確定2,745件のログを作り、その差を、オーソリ取消・拒否・一部売上確定・売上確定なしで、残さず説明します。売上確定のないオーソリの金額と、一部売上確定の残額をそれぞれ出し、最後に冪等キーを基準にまとめて、二重請求された金額を探します。