Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

#MerpayTechFest

Slide 3

Slide 3 text

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

Slide 4

Slide 4 text

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

Slide 5

Slide 5 text

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

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

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

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

#MerpayTechFest 決済処理

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

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

Slide 20

Slide 20 text

#MerpayTechFest 返金処理

Slide 21

Slide 21 text

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

Slide 22

Slide 22 text

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

Slide 23

Slide 23 text

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

Slide 24

Slide 24 text

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

Slide 25

Slide 25 text

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

Slide 26

Slide 26 text

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

Slide 27

Slide 27 text

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

Slide 28

Slide 28 text

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

Slide 29

Slide 29 text

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

Slide 30

Slide 30 text

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

Slide 31

Slide 31 text

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

Slide 32

Slide 32 text

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

Slide 33

Slide 33 text

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

Slide 34

Slide 34 text

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

Slide 35

Slide 35 text

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

Slide 36

Slide 36 text

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

Slide 37

Slide 37 text

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

Slide 38

Slide 38 text

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

Slide 39

Slide 39 text

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

Slide 40

Slide 40 text

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

Slide 41

Slide 41 text

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

Slide 42

Slide 42 text

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

Slide 43

Slide 43 text

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

Slide 44

Slide 44 text

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

Slide 45

Slide 45 text

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

Slide 46

Slide 46 text

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

Slide 47

Slide 47 text

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

Slide 48

Slide 48 text

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

Slide 49

Slide 49 text

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

Slide 50

Slide 50 text

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

Slide 51

Slide 51 text

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

Slide 52

Slide 52 text

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

Slide 53

Slide 53 text

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

Slide 54

Slide 54 text

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

Slide 55

Slide 55 text

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

Slide 56

Slide 56 text

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

Slide 57

Slide 57 text

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

Slide 58

Slide 58 text

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

Slide 59

Slide 59 text

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

Slide 60

Slide 60 text

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

Slide 61

Slide 61 text

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

Slide 62

Slide 62 text

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

Slide 63

Slide 63 text

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

Slide 64

Slide 64 text

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

Slide 65

Slide 65 text

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

Slide 66

Slide 66 text

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

Slide 67

Slide 67 text

#MerpayTechFest まとめ

Slide 68

Slide 68 text

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

Slide 69

Slide 69 text

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

Slide 70

Slide 70 text

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

Slide 71

Slide 71 text

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

Slide 72

Slide 72 text

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