アプリ間の検証

カード発行会社は、トークンをプロビジョニングする際に要認証 ID&V 本人確認を完了するためのオプションとして、アプリ間の検証を提供できます。アプリ間の検証は TSP を介して構成されます。Google Pay チームによる構成は必要ありません。このページでは、Google が TSP から受け取ったプロビジョニング情報に基づいて、カード発行会社のアプリと Google ウォレット アプリの間でどのようなやり取りが行われるかについて説明します。

ユーザーがアプリ間の検証機能を有効にすると、Google ウォレットは TSP 構成を介してカード発行会社が指定した Android アクティビティを呼び出し、カード発行会社のアプリを呼び出します。ユーザーが本人確認を行うと、カード発行会社のアプリは Google ウォレットに制御を戻し、プロビジョニング フローを完了します。

アプリがユーザーのデバイスにインストールされていない場合は、Google ウォレットによって Play ストアのアプリのページが表示されます。カード発行会社のアプリをインストールした後、ユーザーはフローを再起動する必要があります。

アプリ間の検証をサポートするには、次のことを行う必要があります。

フローは、アプリ間確認でユーザーが行う操作を示しています。

a2a-sample-flow

TSP の設定

カード発行会社は、以下のパラメータを TSP に提供する必要があります。Google Pay は、トークン化プロセスでこれらのパラメータを TSP から受け取り、アプリを呼び出します。

パラメータ 説明
パッケージ名 com.example.myapp パッケージ名(applicationId)は、インテントを呼び出してアプリ間フローを開始する際に Google Pay が呼び出すカード発行会社のモバイルアプリを表します。アプリがカード所有者のモバイル デバイスにインストールされていない場合は、Google Play ストアからインストールするように指示されます。
アクション com.example.bank.action.ACTIVATE_TOKEN アプリを呼び出すときに、明示的インテントを作成します。アクションは、パッケージ名を含む完全修飾名で指定する必要があります。また、トークンの有効化で使用するため、アクションは具体的に指定する必要があります。
追加のテキスト このパラメータは、インテントに含まれる追加データを渡すために使用します。通常は JSON の構文で、Base64 で暗号化されています。この文字列の値を Google が読み取ることはできません。また、この値は標準フィールド EXTRA_TEXT でそのまま使用されます。

詳しくは、Android でのインテントの送信Android でのインテントの許可についてのドキュメントをご覧ください。

アプリの開発

ユーザーが身元確認にアプリ間メソッドを選択した場合、カード発行会社のアプリは次の処理を行う必要があります。

  1. Google ウォレットからインテントを受信する
  2. カード所有者を認証する
  3. トークンを有効にする
  4. activity.setResult(RESULT_OK, ...) を呼び出して、ユーザーを Google ウォレットに戻す

インテントを受け取る

ユーザーがカード発行会社のアプリを使用して本人確認を行うことを選択すると、Google ウォレットは、EXTRA_TEXT TSP から Google ウォレットに提供されたパッケージ名、アクション、およびデータを使用してアプリを呼び出します。Google ウォレットから Intent を受け取るには、アプリ マニフェストを更新し、トークンを有効にするアクティビティを作成する必要があります。

アプリ マニフェスト

カード発行会社は、Action を処理するようにモバイルアプリの Android マニフェストを更新し、アプリ間フローで Google ウォレットがアプリを呼び出せるようにする必要があります。

アプリ マニフェストが更新されると、Google ウォレットはアプリを呼び出し、アプリでトークンの有効化アクティビティを開始できるようになります。

<activity android:name="AppToAppActivity">
  <!-- This activity handles App To App ACTIVATE_TOKEN action -->
  <intent-filter>
    <action android:name="com.example.bank.action.ACTIVATE_TOKEN"/>
    <category android:name="android.intent.category.DEFAULT"/>
  </intent-filter>
</activity>

Android インテントの詳細については、Android デベロッパー向けドキュメントAndroid デベロッパー向けリファレンスをご覧ください。

トークンの有効化アクティビティ

有効化を完了するには、Intent で渡された有効化パラメータを使用してアクティビティを開始し、トークンの有効化を完了する必要があります。次のサンプルコードは、IntentEXTRA_TEXT からデータにアクセスする方法を示しています。

/*
 * Within issuer's mobile app AppToAppActivity
 */

// Validate caller is Google Wallet
// see Security Considerations section below

String data = getIntent().getStringExtra(Intent.EXTRA_TEXT);

// Parse base64 to retrieve the activation parameters as a JSON object in a String
String decodedData = new String(base64.decodeBase64(data));

// Read the JSON string
ObjectMapper mapper = new ObjectMapper();
JsonNode node = mapper.readTree(decodedData);

// Extract the activation parameters
String tokenRef = node.get("param0").asText());
String tokenParam = node.get("param1").asText());
// etc.

// Authenticate the user
...

Android Debug Bridge(adb)でテストする

Google ウォレットが送信するインテントをシミュレートするには、コマンドラインから Android Debug Bridge(adbツールを使用します。これにより、アプリのインテント処理を単独でテストできます。次のコマンドを使用します。プレースホルダの値は、特定の構成に置き換えます。

  adb shell am start \
    -a com.your.app.package.a2a \
    -p com.your.app.package \
    --es android.intent.extra.TEXT 'yourBase64EncodedExtraTextFromTSP'

コマンドの内容:

  • -a: TSP で構成されたアクションに対応します。
  • -p: アプリケーションのパッケージ名です。
  • --es: 追加の文字列値を指定します。キーとして android.intent.extra.TEXT を使用し、値として Base64 でエンコードされた JSON ペイロードを指定します。

[アクション] と [パッケージ] の値は、TSP 構成の箇条書きで説明したように、TSP との構成によって異なります。

コマンドが成功すると、アプリの指定されたアクティビティが起動します。失敗した場合、エラー メッセージにはアクティビティが見つからなかったことが示されることが多く、パッケージ名またはアクションの不一致が示されます。これにより、完全なエンドツーエンドのフローをテストする前に、アプリ間インテントを受信するようにアプリが正しく設定されているかどうかを確認できます。

トラブルシューティング: インテントで Google Play ストアが開く

ユーザーがアプリ間の検証を選択したときに、Google ウォレットがアプリではなく Google Play ストアを開いた場合は、Google ウォレットがアプリの起動に必要な Android インテントを解決できなかったことを示します。

アプリを正常に開くには、次の点を確認してください。

  • パッケージ名が一致しない: デバイスにインストールされているアプリのパッケージ名が、TSP で設定されているパッケージ名と完全に一致している必要があります。よくあるエラーは、デバッグビルドでテストすることです。デバッグビルドでは、パッケージ名が異なる場合があります(例: com.example.app.debug)が、TSP で構成された本番環境パッケージ名(com.example.app)よりも優先されます。パッケージ名では大文字と小文字が区別されます。
  • マニフェストの構成: アプリの AndroidManifest.xml がインテント アクションを処理するように正しく構成されていることを確認します。マニフェストの <intent-filter><action> タグは、TSP で構成されたアクション文字列と文字単位で完全に一致している必要があります。
  • TSP の構成: パッケージ名とアクションが TSP から Google Pay に送信されます。これらの値を修正する場合は、TSP に送信するデータまたは TSP の構成ポータルで行う必要があります。Google ウォレットはこれらの値を調整せず、そのまま渡します。詳細については、TSP のドキュメントをご覧ください。

トークンを有効にする

トークンを有効にするには、次の 2 つの方法があります。

TSP サーバー API を使用して有効にする

カード会社のモバイルアプリが TSP API を使用してトークンを有効にすると、カード発行会社のアプリは Intent を受け取り、カード所有者を認証し、TSP の API を呼び出してトークンを有効にします。このフローの最後で、ユーザーを Google ウォレットに戻すときに、有効化の成否を Google ウォレットに通知します。サーバー API を使用してトークンを有効にする方法については、TSP 技術ドキュメントをご覧ください。

TSP API を使用して有効にする場合、アプリは Google ウォレット にコードを返しません。Google Pay から見ると、トークンの有効化は「帯域外」で行われます。

a2a-activation-using-tsp-api

TSP API で有効化プロセスが完了した後にユーザーを Google ウォレットに戻す方法のコードサンプル。

Intent resultIntent = new Intent();

resultIntent.putExtra("BANKING_APP_ACTIVATION_RESPONSE", "approved");
// or "declined", or "failure"

activity.setResult(RESULT_OK, resultIntent);

Android インテント結果と TSP アクティベーション コードを使用して有効化する

カード発行会社のモバイルアプリが TSP からアクティベーション コードを取得して Google ウォレットに通知する際、カード発行会社のアプリはインテント結果に基づきアクティベーション コードを Google ウォレットに通知します。

この方法では、TSP によって生成されたアクティベーション コードが必要です。この方法がサポートされているかどうか、およびアクティベーション コード(認証コードまたは TAV(Tokenization Authentication Value)とも呼びます)の生成方法については、TSP にお問い合わせください。

a2a-activation-using-activation-code

以下は、アクティベーション コードと一緒にユーザーを Google ウォレットに戻す方法を示すサンプルコードです。

Intent resultIntent = new Intent();

resultIntent.putExtra("BANKING_APP_ACTIVATION_RESPONSE", "approved");
// or "declined", or "failure"

// if "approved", also pass the code
resultIntent.putExtra("BANKING_APP_ACTIVATION_CODE", activationCode);

activity.setResult(RESULT_OK, resultIntent);

モバイルアプリのセキュリティ

カード会社のモバイルアプリは、特にインテントの使用について、Android セキュリティ モデルを遵守する必要があります。インテントを受け取ったら、以下に示すように Activity.getCallingPackage を使用して、アクティビティが実際に Google ウォレットであることを確認します。


// Validate caller is Google Wallet (Google Play Services)
if ("com.google.android.gms".equals(getCallingPackage())) {
    // Proceed with token activation
    ...
} else {
    // Abort token activation: handle error
    ...
}

モバイルアプリで次のことを行う必要があります。

  • カード所有者を認証する
  • すべてのデジタル化リクエストにカード所有者の同意を得る
  • デジタル化が正しいカード所有者のアカウントと関連して行われていることを確認する

トークン有効化については、TSP 技術ドキュメントをご覧ください。Intents送信許可受け取りを行う方法については、Android のデベロッパー向けサイトをご確認ください。