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/

mercari
PRO

July 26, 2021
Tweet

More Decks by mercari

Other Decks in Technology

Transcript

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

    View Slide

  2. #MerpayTechFest

    View Slide

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

    View Slide

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

    View Slide

  5. #MerpayTechFest
    キャッシュレス関連用語集 を元に改変
    https://www.meti.go.jp/policy/mono_info_service/cashless/image_pdf_movie/cashless_glossary_R1_06.pdf
    メルペイ みで完結している決済 流れ
    購入代金
    支払い
    購入代金
    支払い
    お客さま
    お店
    (加盟店)
    商品・サービス提供
    QRコード決済
    メルペイ
    イシュアー アクワイアラー

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  13. #MerpayTechFest
    決済処理

    View Slide

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

    View Slide

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

    View Slide

  16. #MerpayTechFest
    ① 加盟店で 決済可否
    加盟店ステータス
    ● アクティブ
    ● 解約中
    ● 解約済み
    決済ステータス
    ● アクティブ
    ● 停止中
    ● 強制停止中

    View Slide

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

    View Slide

  18. #MerpayTechFest
    ② 決済通知 受け付け
    ● メルペイ (アクワイアラー) とイシュアー間で決済
    データを連携する
    ● イシュアー側で確定された決済が連携される

    View Slide

  19. #MerpayTechFest
    決済
    確定済み
    決済
    確定中
    決済通知 決済確定
    決済 ステートマシン
    ② 決済通知 受け付け

    View Slide

  20. #MerpayTechFest
    返金処理

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  25. #MerpayTechFest
    ② イシュアーへ 返金リクエスト
    管理画面
    から返金
    購入代金
    返金
    お客さま
    お店
    (加盟店)
    メルペイ
    アクワイアラー
    d払い
    イシュアー
    返金
    リクエスト

    View Slide

  26. #MerpayTechFest
    ② イシュアーへ 返金リクエスト
    TCCベース インターフェース
    ● 複数サーバ間でデータ 一貫性を保つパターン
    ● TCC: Try-Confirm/Cancel

    View Slide

  27. #MerpayTechFest
    ② イシュアーへ 返金リクエスト
    TCCベース インターフェース
    ● Try で返金ができる状態にする
    ● Confirm で返金を確定
    ● Cancel で返金をキャンセル

    View Slide

  28. #MerpayTechFest
    ② イシュアーへ 返金リクエスト
    TCCを使わない場合
    お店
    (加盟店)
    メルペイ d払い

    View Slide

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

    View Slide

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

    View Slide

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

    ② イシュアーへ 返金リクエスト

    View Slide

  32. #MerpayTechFest
    可用性を高めるアーキテクチャ

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  38. #MerpayTechFest
    ① 非同期処理を中心としたAPI
    そ 他 処理 非同期的に行う
    ● 加盟店さまへ メール送信
    ● データ 整合性チェック
    ● etc.

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  59. #MerpayTechFest
    ① バッチによるデータ不整合 修復
    ● 数分程度 短いインターバルで実行
    ○ なるべく加盟店さまとお客さま 体験を
    損 ないように
    ● 中間状態 決済・返金をリトライ
    ● API リトライモデルとまったく同じ

    View Slide

  60. #MerpayTechFest
    決済
    確定済み
    決済
    確定中
    ① バッチによるデータ不整合 修復

    View Slide

  61. #MerpayTechFest
    返金済み
    返金中
    キャンセル
    済み
    キャンセル

    ① バッチによるデータ不整合 修復

    View Slide

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

    View Slide

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

    View Slide

  64. #MerpayTechFest
    ② 決済・返金 リコンサイル
    アクワイアラー
    メルペイ
    イシュアー
    d払い
    アクワイアラーとイシュアー間
    ● 前日 取引を対象に行う
    ● 元データを持つイシュアーが正
    ● 成功可否、金額、店舗など

    View Slide

  65. #MerpayTechFest
    ② 決済・返金 リコンサイル
    データ不整合 解決
    メルペイに決済データが存在しない場合
    新たに決済データを作成する

    View Slide

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

    View Slide

  67. #MerpayTechFest
    まとめ

    View Slide

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

    View Slide

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

    View Slide

  70. #MerpayTechFest
    決済
    確定済み
    決済
    確定中
    決済通知 決済確定
    ステートマシンを中心としたシステムと
    リトライセーフなAPI

    View Slide

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

    View Slide

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

    View Slide