Slide 1

Slide 1 text

ワンバンクのApple Pay対応の裏側 PassKitでつくるカード追加体験

Slide 2

Slide 2 text

金子 将太 SmartBank, Inc. iOS Engineer @ska_nekoo @s-kaneko0617 2

Slide 3

Slide 3 text

No content

Slide 4

Slide 4 text

4

Slide 5

Slide 5 text

オープニング 今日話すこと 1. Provisioning カードがWalletに登録される仕組みと、PassKitでの実装 2. モバイルアプリが考えるべきこと 登録状況のステータス管理と、ワンバンクでの実装例 3. まとめ 今日の内容の振り返り 5

Slide 6

Slide 6 text

Provisioning

Slide 7

Slide 7 text

Provisioning Provisioningとは カード情報はそのままデバイスに保存されず、 トークン化されたDPANとしてSecure Elementに保存される。 この一連のフローがProvisioningと呼ばれる 7

Slide 8

Slide 8 text

Provisioning 登場する用語 DPAN Device PAN。トークン化された、デバイスごとの決済用番号 Secure Element DPANを保存するデバイス内の認定チップ Apple Payサーバ Walletへのカード追加を仲介するAppleのサーバ Issuer カードを発行し口座を管理する事業者 TSP Token Service Provider。トークンを発行・管理する 8

Slide 9

Slide 9 text

Provisioning Provisioningの経路 Manual Provisioning Walletアプリから手入力で追加する In-App Provisioning Issuerアプリの導線から追加する Wallet Extension Walletのカード追加導線からIssuerアプリ経由で追加する 9

Slide 10

Slide 10 text

Provisioning Provisioningの経路 Manual Provisioning Walletアプリから手入力で追加する In-App Provisioning Issuerアプリの導線から追加する Wallet Extension Walletのカード追加導線からIssuerアプリ経由で追加する 10

Slide 11

Slide 11 text

Manual Provisioning Manual Provisioning ユーザーの操作 Walletの「+」ボタンからカードを追加し、カード番号・カード名義・ 有効期限・セキュリティコードを自分で入力する iPhoneだけでなくApple WatchのWalletからも追加できる Issuerアプリの実装 Walletアプリで完結するため、Issuerアプリの実装は関与しない 登録可否の判断や本人確認はIssuerサーバ側で行う 11

Slide 12

Slide 12 text

Manual Provisioning Manual Provisioningのシーケンス カード番号・有効期限などを入力 Apple Payサーバを経由してTSPへ連携 Issuerが登録可否を判断(適格性確認) 規約同意 → トークンの発行要求 DPANを暗号化して送付 → Secure Elementへ 12

Slide 13

Slide 13 text

Provisioning Provisioningの経路 Manual Provisioning Walletアプリから手入力で追加する In-App Provisioning Issuerアプリの導線から追加する Wallet Extension Walletのカード追加導線からIssuerアプリ経由で追加する 13

Slide 14

Slide 14 text

In-App Provisioning In-App Provisioning ユーザーの操作 Issuerアプリ内に設置した導線からカードを追加する カード情報の入力は不要で、規約への同意と必要に応じた本人確認だ けで登録が完了する Issuerアプリの実装 導線の設置からカード追加まで、アプリ上での実装が必要 PassKitのAPIを使い、Apple PayサーバとIssuerサーバを中継する 14

Slide 15

Slide 15 text

In-App Provisioning developer.apple.com/documentation/passkit Apple PayやWalletを扱うための標準API PKPaymentRequestやPKPaymentAuthorizationControllerのような決済に関するAPIの他に、 Provisioningを行う際のIssuer側の実装も用意されている 15

Slide 16

Slide 16 text

In-App Provisioning PKAddPaymentPassViewController developer.apple.com/documentation/passkit/pkaddpaymentpassviewcontroller ・PKAddPaymentPassRequestConfiguration: Provisioningに必要な情報を渡す ・PKAddPaymentPassViewControllerDelegate: Issuerサーバとの連携を担う 16

Slide 17

Slide 17 text

In-App Provisioning › Configuration PKAddPaymentPassRequestConfiguration 登録するカードをViewControllerに伝えるための設定。 カード番号そのものは渡さず、表示用の情報と識別子だけ を持つ developer.apple.com/documentation/passkit/pkaddpaymentpassrequestconfiguration 17 17

Slide 18

Slide 18 text

In-App Provisioning › Configuration PKAddPaymentPassRequestConfiguration 18

Slide 19

Slide 19 text

In-App Provisioning › Configuration PKAddPaymentPassRequestConfiguration Step 1 暗号化方式とカードブランドは、アプリが選ぶ値ではなくTSPとの取り決めで決まる 19

Slide 20

Slide 20 text

In-App Provisioning › Configuration PKAddPaymentPassRequestConfiguration Step 2 画面に表示されるカード名義と末尾4桁。Issuerサーバから取得した正しい値を渡す 20

Slide 21

Slide 21 text

In-App Provisioning › Configuration PKAddPaymentPassRequestConfiguration Step 3 カードアカウントを識別するID。Issuerサーバから取得して渡す 21

Slide 22

Slide 22 text

In-App Provisioning › Configuration primaryAccountIdentifier 指定すると、未登録のデバイスだけが Provisioningの候補になる ・DPANはデバイス単位、このIDはカード単位 ・iPhoneでもApple Watchでも同じ値 ・初回のProvisioningで採番。未採番はnil 22

Slide 23

Slide 23 text

In-App Provisioning › Delegate PKAddPaymentPassViewControllerDelegate Provisioningの実処理と完了のハンドリングを担う ViewControllerがフローを進め、登録リクエストの生成 と完了のタイミングでIssuerアプリを呼び返す developer.apple.com/documentation/passkit/pkaddpaymentpassviewcontrollerdelegate 23 23

Slide 24

Slide 24 text

In-App Provisioning › Delegate generateRequestWithCertificateChain 24

Slide 25

Slide 25 text

In-App Provisioning › Delegate generateRequestWithCertificateChain Step 1 Apple Payサーバから受け取った証明書とnonceをそのままIssuerサーバに渡す 25

Slide 26

Slide 26 text

In-App Provisioning › Delegate generateRequestWithCertificateChain Step 2 暗号化済みの値からRequestを組み立て、completionHandlerで返す 26

Slide 27

Slide 27 text

In-App Provisioning › Delegate didFinishAdding 登録フローの結果が通知される 27

Slide 28

Slide 28 text

In-App Provisioning In-App Provisioning 28

Slide 29

Slide 29 text

Provisioning Provisioningの経路 Manual Provisioning Walletアプリから手入力で追加する In-App Provisioning Issuerアプリの導線から追加する Wallet Extension Walletのカード追加導線からIssuerアプリ経由で追加する 29

Slide 30

Slide 30 text

Wallet Extension Wallet Extension ユーザーの操作 Walletのカード追加画面に表示されたIssuerアプリのアイコンを選び、 入力なしでカードを追加する 入口はWalletのまま、In-Appと同じ登録体験になる Issuerアプリの実装 App Extensionとしてアプリ側の実装が必要 Walletからの呼び出しに応えて、追加可能なカードの一覧と登録リク エストを返す 30

Slide 31

Slide 31 text

Wallet Extension ユーザー操作とExtensionの呼び出し Step 1 カード追加画面を開く status: アプリを表示するかを判定 Step 2 アプリのアイコンを選ぶ passEntries / remotePassEntries: 追加可能なカード一覧を返す Step 3 カードを選ぶ generate: 登録リクエストを組み立てる 31

Slide 32

Slide 32 text

Wallet Extension PKIssuerProvisioningExtensionHandler developer.apple.com/documentation/passkit/pkissuerprovisioningextensionhandler 32

Slide 33

Slide 33 text

Wallet Extension カード追加画面を開く Walletアプリが、追加可能なカードがあるかをExtension に問い合わせる 追加可能なカードがあるときだけ、Issuerアプリのアイコ ンが表示される 33

Slide 34

Slide 34 text

Wallet Extension status Step 1 追加可能なカードがあるときだけ、Walletにアプリを表示する 34

Slide 35

Slide 35 text

Wallet Extension アプリのアイコンを選ぶ Walletアプリが、追加可能なカードの一覧をExtensionに 求める 追加可能なカードの一覧がWalletアプリ上に表示される 35

Slide 36

Slide 36 text

Wallet Extension passEntries / remotePassEntries Step 2 追加可能なカードをPassEntryとして返す 36

Slide 37

Slide 37 text

Wallet Extension カードを選ぶ Walletアプリが暗号化用の情報を渡し、選ばれたカードの登録リクエストを Extensionに求める In-App ProvisioningのDelegateと同様、Issuerサーバで暗号化を行いリ クエストを返す。その後は同じフローでSecure ElementにDPANが登録さ れる 36

Slide 38

Slide 38 text

Wallet Extension generate Step 3 カード選択時に呼ばれ、In-AppのDelegateと同じく暗号化済みのRequestを返す 37

Slide 39

Slide 39 text

モバイルアプリが考えるべきこと 39

Slide 40

Slide 40 text

モバイルアプリが考えるべきこと モバイルアプリの仕事は、 Apple PayサーバとIssuerサーバの中継だけ? 40

Slide 41

Slide 41 text

ステータス管理 ステータス管理が必要な場面 Wallet Extension アプリ内の追加導線 登録状況の表示 41

Slide 42

Slide 42 text

ステータス管理 SecureElementPassの取得と照合 Walletに登録したカードは、PassKitからPKSecureElementPassとして取得する 42

Slide 43

Slide 43 text

ステータス管理 SecureElementPassの取得と照合 Walletに登録したカードは、PassKitからSecureElementPassとして取得する Step 1 iPhoneに登録済みのPassを取得する。返るのは自アプリのPassのみ 自アプリのPassに限られるのは、payment-pass-provisioningのEntitlementと、TSP側でIssuerアプリとカードを紐づける設定による 43

Slide 44

Slide 44 text

ステータス管理 SecureElementPassの取得と照合 Walletに登録したカードは、PassKitからSecureElementPassとして取得する Step 2 Apple Watchは事前にWCSessionでペアリングを判定してから取得する 44

Slide 45

Slide 45 text

ステータス管理 SecureElementPassの取得と照合 Walletに登録したカードは、PassKitからSecureElementPassとして取得する Step 3 primaryAccountIdentifierで照合し、このカードのPassが見つかれば登録済み 45

Slide 46

Slide 46 text

ステータス管理 passActivationState Passの有効化状態。決済できるのはactivatedのときだけ developer.apple.com/documentation/passkit/pksecureelementpass/passactivationstate 46

Slide 47

Slide 47 text

ステータス管理 requiresActivation Passは既にSecure Element上にあるが、 ユーザーから見ると決済できない状態 本人確認はIssuerが選択した方法で、 Walletアプリ上で完了させる必要がある 47

Slide 48

Slide 48 text

ステータス管理 リスク判定 Color PathはAppleからの推奨。本人確認を求めるかはIssuerが決める Yellow Pathで本人確認を 求められたPassが requiresActivation 48

Slide 49

Slide 49 text

ステータス管理 5つのStateのうち、どのStateで 「Walletに追加」の導線を出すべき? 49

Slide 50

Slide 50 text

ワンバンクでの実装例 passActivationStateと導線の対応 "Walletに追加"ボタンを出すかどうかを、Passの状態ごとに決める passActivationState Wallet上のカードの状況 "Walletに追加"ボタン Passなし 未登録 出す deactivated 無効化済み 出す requiresActivation 本人確認待ち 出す activated 登録済み 出さない activating 有効化の処理中 出さない suspended 一時停止中 出さない 50

Slide 51

Slide 51 text

ワンバンクでの実装例 requiresActivationの導線 ボタンの見た目は同じまま、タップ時の挙動をpassActivationStateで出し分ける SecureElementPassは既にSecure Element上にあり、再度Provisioningしても 解決しないため先に本人確認を完了させる 51

Slide 52

Slide 52 text

ワンバンクでの実装例 取得タイミング Walletアプリで本人確認を終えて戻ってくることもあるため、 画面遷移の際に一度取得するだけでは足りない ・アプリがフォアグラウンドへ復帰した際に再取得する ・PKPassLibraryDidChange通知でStateを更新する (Apple Watch側にはPKPassLibraryRemotePaymentPassesDidChange) 52

Slide 53

Slide 53 text

まとめ 53

Slide 54

Slide 54 text

まとめ 今日話したこと 1. Provisioning カード情報はトークン化されたDPANとしてSecure Elementに保存される。 この一連のフローがProvisioningで、PassKitのAPIで実装できる 2. モバイルアプリが考えるべきこと 登録状況とサービス要件を踏まえ、ユーザーが迷わずWalletに登録できる導線を 設計する 54

Slide 55

Slide 55 text

宣伝 本日(9/12) 16:10 Track C ・ nakamuuu 9/13(日) 16:40(LT・大トリ) Track A パンフレット記事(4ページ) 岩名勇輝 上ちょ / uetyo 55

Slide 56

Slide 56 text

ご清聴ありがとうございました

Slide 57

Slide 57 text

Appendix 参考資料 In-App Provisioning (Apple Pay Demo) applepaydemo.apple.com/in-app-provisioning In-App Provisioning Extension (Apple Pay Demo) applepaydemo.apple.com/in-app-provisioning-extensions PKAddPaymentPassViewController developer.apple.com/documentation/passkit/pkaddpaymentpassviewcontroller PKIssuerProvisioningExtensionHandler developer.apple.com/documentation/passkit/pkissuerprovisioningextensionhandler PKSecureElementPass.PassActivationState developer.apple.com/documentation/passkit/pksecureelementpass/passactivationstate Apple Payのセキュリティ (Apple Platform Security) support.apple.com/ja-jp/guide/security/sec2561eb018/web Apple Pay カード登録の仕組み ─ ウォレットプロビジョニングの裏側 (inSmartBank) blog.smartbank.co.jp/entry/apple-pay-provisioning