これはITエンジニアの業だな、と思う。
先日ECサイトで商品を予約した際にクレジットカードのセキュリティコードを間違えて入力してしまった。
この入力ミス自体はしばしばしてしまうのだけれど、多くのサービスでは即座に「決済に失敗しました」のようなメッセージが表示され、決済情報の再入力を求められる。
これに対してそのECサイトは予約注文の受付は完了し、入金確認中ステータスとなった。
その瞬間「お、これは決済失敗した時にどうリカバリしてるのか観察できるぞ?」とテンションが上がってしまった。
業だ。
結果、しばらくして決済失敗したので決済情報入力しなおしてくれ的な案内メールが来た。正しいセキュリティコードを入力して再決済、無事入金が確認された。
めでたしめでたし。
なお、ワクワクしている様子はこの辺りで確認できる。
散財して満足した。が、マミさんクレカのセキュリティコード間違えたのでオーソリ通らんねこれは。ミスってもエラーじゃなくて注文完了しちゃうのはどうなの?
— 光電/7474 (@koudenpa) 2022年7月12日
多分こんな処理してるんだろう
要するにこれは自サイトのトランザクションと、外部のトランザクションをどういうタイミングで処理し、どうユーザーに見せてるのか? の差になる。
物理的な商品のあるECサイトでは注文受付時には自サイトのトランザクション内で在庫の整合性を担保しなくてはならない。
クレジットカード決済は外部のトランザクションになるので在庫の整合性担保とは別になる。在庫が担保できないのに決済はできないので、自サイトのトランザクションの後に行うことになる。
多くのサービスでは即座に「決済に失敗しました」のようなメッセージが表示され、決済情報の再入力を求められる
これは、ユーザーの注文操作の後「自サイトのトランザクション」と「外部のトランザクション」を連続して処理し、後者のトランザクションに失敗したら前者をロールバックした上でユーザーに「やりなおしてくれ」と案内する流れだろう。
そのECサイトは予約注文の受付は完了し、入金確認中ステータスとなった
これに対して、ヨドバシ・ドット・コムは「自サイトのトランザクション」が成功したらユーザーに一旦「注文受付ました」と案内し、別途非同期に「外部のトランザクション」を試行、その状態をマイページなどに表示する形を取っているようだった。この際注文を受け付けましたメールが送られてくる。
正常に決済が完了するケースでは概ね1分以内に決済完了しましたメールが送られてくる。
今回決済が失敗しましたメールは1時間半以上経過してから送られてきた。最終的に外部トランザクションを失敗と見なすまでに何やらいろいろあるのだろう。
その後、決済情報を更新すると「外部トランザクション」が再試行されるようだった。
決済情報を24時間更新しないと「自サイトのトランザクション」をロールバック(注文無効に)するようだった。
TODO 気が向いたらシーケンスなりフローなりを作図すると分かりやすそう←このTODOは多分消化しない
お気持ち
ふとした時に異常系に出会うと色々試案出来て面白い。面白いうえに自分の仕事を進めるうえでの処理パターンの引き出しにもなるので得しかない。
気持ちに余裕があるときにはどんどん異常系に遭遇したい。
しかし、気持ちに余裕がないときに異常系に遭遇するとめちゃくちゃイラつく。
その辺世のWebサービスは僕の気持ちを理解して異常系を提供して欲しい。