Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Merpay Tech Fest 2021_メルペイの共通QRコード決済システムの裏側 / The other side of the common QR code payment system of Merpay

Merpay Tech Fest 2021_メルペイの共通QRコード決済システムの裏側 / The other side of the common QR code payment system of Merpay

Merpay Tech Fest 2021は5日間のオンライン技術カンファレンスです。

IT企業で働くソフトウェアエンジニアおよびメルペイの技術スタックに興味がある方々を対象に2021年7月26日(月)から7月30日(金)までの5日間、開催します。 Merpay Tech Festは事業との関わりから技術への興味を深め、プロダクトやサービスを支えるエンジニアリングを知れるお祭りです。 セッションでは事業を支える組織・技術・課題などへの試行錯誤やアプローチを紹介予定です。お楽しみに!

■イベント関連情報
- 公式ウェブサイト:https://events.merpay.com/techfest-2021/
- 申し込みページ:https://mercari.connpass.com/event/215035/
- Twitterハッシュタグ: #MerpayTechFest

■リンク集
- メルカリ・メルペイイベント一覧:https://mercari.connpass.com/
- メルカリキャリアサイト:https://careers.mercari.com/
- メルカリエンジニアリングブログ:https://engineering.mercari.com/blog/
- メルカリエンジニア向けTwitterアカウント:https://twitter.com/mercaridevjp
- 株式会社メルペイ:https://jp.merpay.com/

92cdcff298e89e2fcd2fb705155c2d4b?s=128

mercari
PRO

July 26, 2021
Tweet

Transcript

  1. #MerpayTechFest Session Title 共通QRコード決済システム 裏側 Taro Aoki Backend Engineer (Code

    Payment Team)
  2. #MerpayTechFest

  3. #MerpayTechFest Backend Engineer / Code Payment Team Taro Aoki (@ktr)

  4. #MerpayTechFest QRコード決済におけるお金 流れ

  5. #MerpayTechFest キャッシュレス関連用語集 を元に改変 https://www.meti.go.jp/policy/mono_info_service/cashless/image_pdf_movie/cashless_glossary_R1_06.pdf メルペイ みで完結している決済 流れ 購入代金 支払い 購入代金

    支払い お客さま お店 (加盟店) 商品・サービス提供 QRコード決済 メルペイ イシュアー アクワイアラー
  6. #MerpayTechFest イシュアー お客さま 残高をもとに決済処理を行う 事業者 イシュアーとして メルペイ 購入代金 支払い 購入代金

    支払い お客さま お店 (加盟店) 商品・サービス提供 QRコード決済 メルペイ イシュアー アクワイアラー
  7. #MerpayTechFest アクワイアラー 決済サービスを使えるお店 (加盟店)を増 やす事業者。加盟店管理や加盟店へ 入 金、加盟店向け サービス 提供も行う。 アクワイアラーとして

    メルペイ 購入代金 支払い 購入代金 支払い お客さま お店 (加盟店) 商品・サービス提供 QRコード決済 メルペイ イシュアー アクワイアラー
  8. #MerpayTechFest 共通QRコード決済におけるお金 流れ

  9. #MerpayTechFest 購入代金 支払い 購入代金 支払い お客さま お店 (加盟店) 商品・サービス提供 QRコード決済

    メルペイ アクワイアラー d払い イシュアー 決済確定 通知 共通QRコード決済におけるお金 流れ
  10. #MerpayTechFest 購入代金 支払い 購入代金 支払い お客さま お店 (加盟店) 商品・サービス提供 QRコード決済

    メルペイ アクワイアラー d払い イシュアー 決済確定 通知 共通QRコード決済におけるお金 流れ
  11. #MerpayTechFest 購入代金 支払い 購入代金 支払い お客さま お店 (加盟店) 商品・サービス提供 QRコード決済

    メルペイ アクワイアラー d払い イシュアー 決済確定 通知 共通QRコード決済におけるお金 流れ
  12. #MerpayTechFest 購入代金 支払い 購入代金 支払い お客さま お店 (加盟店) 商品・サービス提供 QRコード決済

    メルペイ アクワイアラー d払い イシュアー 決済確定 通知 共通QRコード決済におけるお金 流れ
  13. #MerpayTechFest 決済処理

  14. #MerpayTechFest 決済処理 ① 加盟店で 決済可否 ② 決済通知 受け付け

  15. #MerpayTechFest 決済処理 ① 加盟店で 決済可否 ② 決済通知 受け付け

  16. #MerpayTechFest ① 加盟店で 決済可否 加盟店ステータス • アクティブ • 解約中 •

    解約済み 決済ステータス • アクティブ • 停止中 • 強制停止中
  17. #MerpayTechFest 決済処理 ① 加盟店で 決済可否 ② 決済通知 受け付け

  18. #MerpayTechFest ② 決済通知 受け付け • メルペイ (アクワイアラー) とイシュアー間で決済 データを連携する •

    イシュアー側で確定された決済が連携される
  19. #MerpayTechFest 決済 確定済み 決済 確定中 決済通知 決済確定 決済 ステートマシン ②

    決済通知 受け付け
  20. #MerpayTechFest 返金処理

  21. #MerpayTechFest 返金処理 ① 加盟店向け管理画面から 返金 ② イシュアーへ 返金リクエスト

  22. #MerpayTechFest 返金処理 ① 加盟店向け管理画面から 返金 ② イシュアーへ 返金リクエスト

  23. #MerpayTechFest ① 加盟店向け管理画面から 返金

  24. #MerpayTechFest 返金処理 ① 加盟店向け管理画面から 返金 ② イシュアーへ 返金リクエスト

  25. #MerpayTechFest ② イシュアーへ 返金リクエスト 管理画面 から返金 購入代金 返金 お客さま お店

    (加盟店) メルペイ アクワイアラー d払い イシュアー 返金 リクエスト
  26. #MerpayTechFest ② イシュアーへ 返金リクエスト TCCベース インターフェース • 複数サーバ間でデータ 一貫性を保つパターン •

    TCC: Try-Confirm/Cancel
  27. #MerpayTechFest ② イシュアーへ 返金リクエスト TCCベース インターフェース • Try で返金ができる状態にする •

    Confirm で返金を確定 • Cancel で返金をキャンセル
  28. #MerpayTechFest ② イシュアーへ 返金リクエスト TCCを使わない場合 お店 (加盟店) メルペイ d払い

  29. #MerpayTechFest ② イシュアーへ 返金リクエスト TCCを使わない場合 メルペイ すでに 返金してしまっている! お店 (加盟店)

    メルペイ d払い
  30. #MerpayTechFest ② イシュアーへ 返金リクエスト TCCを使っている場合 メルペイ 単純に 返金をキャンセルできる! お店 (加盟店)

    メルペイ d払い
  31. #MerpayTechFest 返金済み 返金中 返金 リクエスト 返金成功 返金 ステートマシン キャンセル成功 事前条件エラー

    キャンセル 済み キャンセル 中 ② イシュアーへ 返金リクエスト
  32. #MerpayTechFest 可用性を高めるアーキテクチャ

  33. #MerpayTechFest 可用性を高めるアーキテクチャ ① 非同期処理を中心としたAPI ② リトライセーフなAPI

  34. #MerpayTechFest 可用性を高めるアーキテクチャ ① 非同期処理を中心としたAPI ② リトライセーフなAPI

  35. #MerpayTechFest ① 非同期処理を中心としたAPI 同期処理にしなけれ いけない処理以外 すべて非同期処理とする

  36. #MerpayTechFest ① 非同期処理を中心としたAPI お金を減らす処理 同期的に行う • 決済におけるお客さま 残高 • 返金における加盟店さま

    残高
  37. #MerpayTechFest ① 非同期処理を中心としたAPI お金を増やす処理 非同期的に行う • 決済における加盟店さま 売上反映 • 返金におけるお客さまへ

    返金額 反映
  38. #MerpayTechFest ① 非同期処理を中心としたAPI そ 他 処理 非同期的に行う • 加盟店さまへ メール送信

    • データ 整合性チェック • etc.
  39. #MerpayTechFest 可用性を高めるアーキテクチャ ① 非同期処理を中心としたAPI ② リトライセーフなAPI

  40. #MerpayTechFest ② リトライセーフなAPI どんなタイミングであっても 何度でも安全にリトライできるAPI

  41. #MerpayTechFest ② リトライセーフなAPI どんなタイミングであっても 何度でも安全にリトライできるAPI 冪等性を持つAPI

  42. #MerpayTechFest ② リトライセーフなAPI なぜ冪等性を持ったAPIが重要か? • クライアント側 ロジックがシンプルになる • API 呼び出しがexactly-onceと

    限らない
  43. #MerpayTechFest 冪等性 ないAPIとリトライ ② リトライセーフなAPI サーバ クライアント リソース作成

  44. #MerpayTechFest 冪等性 ないAPIとリトライ ② リトライセーフなAPI リソース 作成済み サーバ クライアント

  45. #MerpayTechFest 冪等性 ないAPIとリトライ ② リトライセーフなAPI リソース 作成済み サーバ クライアント

  46. #MerpayTechFest 冪等性 ないAPIとリトライ ② リトライセーフなAPI リソース 作成済み 重複して作成 してしまう! サーバ

    クライアント
  47. #MerpayTechFest 冪等性 あるAPIとリトライ ② リトライセーフなAPI リソース 作成済み すでに作成されているリ ソースを返却 サーバ

    クライアント
  48. #MerpayTechFest ② リトライセーフなAPI 決済通知 決済確定 決済 ステートマシン 決済 確定済み 決済

    確定中
  49. #MerpayTechFest ② リトライセーフなAPI 決済通知 決済確定 冪等キー deadbeef 決済 確定済み 決済

    確定中
  50. #MerpayTechFest ② リトライセーフなAPI 決済通知 決済確定 冪等キー deadbeef リソース 作成されていない で

    安全にリトライできる 決済 確定済み 決済 確定中
  51. #MerpayTechFest ② リトライセーフなAPI 決済通知 決済確定 冪等キー deadbeef リソース作成時に冪等キーと 現在 状態を記録

    決済 確定済み 決済 確定中
  52. #MerpayTechFest ② リトライセーフなAPI 決済通知 決済確定 冪等キー deadbeef 決済 確定済み 決済

    確定中
  53. #MerpayTechFest ② リトライセーフなAPI 決済通知 決済確定 冪等キー deadbeef リトライ時 冪等キーから対応する リソースが判別できる

    決済 確定済み 決済 確定中
  54. #MerpayTechFest ② リトライセーフなAPI 決済通知 決済確定 冪等キー deadbeef 記録した状態からどこまで処理が 進んでいたかが分かる 決済

    確定済み 決済 確定中
  55. #MerpayTechFest ② リトライセーフなAPI 決済通知 決済確定 冪等キー deadbeef 決済 確定済み 決済

    確定中
  56. #MerpayTechFest 整合性を担保する取り組み

  57. #MerpayTechFest 整合性を担保する取り組み ① バッチによるデータ不整合 修復 ② 決済・返金 リコンサイル

  58. #MerpayTechFest 整合性を担保する取り組み ① バッチによるデータ不整合 修復 ② 決済・返金 リコンサイル

  59. #MerpayTechFest ① バッチによるデータ不整合 修復 • 数分程度 短いインターバルで実行 ◦ なるべく加盟店さまとお客さま 体験を

    損 ないように • 中間状態 決済・返金をリトライ • API リトライモデルとまったく同じ
  60. #MerpayTechFest 決済 確定済み 決済 確定中 ① バッチによるデータ不整合 修復

  61. #MerpayTechFest 返金済み 返金中 キャンセル 済み キャンセル 中 ① バッチによるデータ不整合 修復

  62. #MerpayTechFest 整合性を担保する取り組み ① バッチによるデータ不整合 修復 ② 決済・返金 リコンサイル

  63. #MerpayTechFest ② 決済・返金 リコンサイル 2つ システム間でデータ 整合性が取 れているかを確認すること

  64. #MerpayTechFest ② 決済・返金 リコンサイル アクワイアラー メルペイ イシュアー d払い アクワイアラーとイシュアー間 •

    前日 取引を対象に行う • 元データを持つイシュアーが正 • 成功可否、金額、店舗など
  65. #MerpayTechFest ② 決済・返金 リコンサイル データ不整合 解決 メルペイに決済データが存在しない場合 新たに決済データを作成する

  66. #MerpayTechFest ② 決済・返金 リコンサイル 一時的にメルペイが利用できなくても 決済 可用性を損 ない

  67. #MerpayTechFest まとめ

  68. #MerpayTechFest 購入代金 支払い 購入代金 支払い お客さま お店 (加盟店) 商品・サービス提供 QRコード決済

    メルペイ イシュアー アクワイアラー メルペイ みで完結している決済 流れ
  69. #MerpayTechFest 購入代金 支払い 購入代金 支払い お客さま お店 (加盟店) 商品・サービス提供 QRコード決済

    メルペイ アクワイアラー d払い イシュアー 決済確定 通知 共通QRコード決済におけるお金 流れ
  70. #MerpayTechFest 決済 確定済み 決済 確定中 決済通知 決済確定 ステートマシンを中心としたシステムと リトライセーフなAPI

  71. #MerpayTechFest 決済 確定済み 決済 確定中 バッチによる未完了処理 リトライ

  72. #MerpayTechFest リコンサイルによる整合性 担保 • イシュアーを正としてアクワイアラー データ 不整合を修 復する • 一時的にメルペイが利用できなくても可用性を損

    ない