> For the complete documentation index, see [llms.txt](https://docs.payments.thalescloud.io/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.payments.thalescloud.io/classic-push-provisioning/ja/ysuksu/xpayworettohenopusshupurobijoningu/android/pusshupurobijoningu.md).

# プッシュプロビジョニング

### ステップ 1: ウォレットに追加ボタンの表示 <a href="#step-1-showing-the-add-to-wallet-button" id="step-1-showing-the-add-to-wallet-button"></a>

お使いのイシュアアプリケーションは Push Provisioning SDK を使用して、対象の xPay Wallet がデバイスでサポートされているかどうか、およびそのカードにすでにトークンが存在するかどうかを確認します。結果に基づいて、次のボタンを表示または非表示にします。 **ウォレットに追加** ボタン。

次のウォレットブランドガイドラインに従って **ウォレットに追加** をイシュアアプリケーションで使用してください:

* **Google Pay**\
  <https://developers.google.com/pay/api/android/guides/brand-guidelines>
* **Samsung Pay**\
  <https://pay.samsung.com/developers/resource/brand>
* **Huawei Pay**\
  サポートは国内スキームでのみ利用できます。

  > <i class="fa-exclamation-circle">:exclamation-circle:</i>
  >
  > #### 警告 <a href="#warning" id="warning"></a>
  >
  > * Huawei Pay は国際決済ネットワーク（例: Mastercard、Visa）ではサポートされていません。サポート可能なのは [国内](https://thalesgroup.github.io/d1sdk-docs/tpc-sdk/android/1.7.1/com/thalesgroup/tpcsdk/model/CardScheme.html#PAGOBANCOMAT) スキームのみで、特定の場合に限られます。利用条件については Thales にご確認ください。
  > * 2024 年 6 月 10 日以降、 [Google Wallet](https://developers.google.com/wallet/docs/release-notes#June_04_2024) では Android 9 以上が必要です。

PAN の下4桁を使用すると、イシュアアプリケーションは、すでにデバイス上のウォレットにプロビジョニングされているカードのトークンを取得できます（Android 向けの Samsung Pay と Google Pay）。

各トークンには次が含まれます:

* トークン ID。
* デジタルカード（DPAN）の下4桁。
* トークン状態（デジタル化ステータス）。

{% tabs %}
{% tab title="Android 1.7.0+" %}

```java
OEMPayType type = OEMPayType.GOOGLE_PAY; // または OEMPayType.SAMSUNG_PAY
GetTokenInput input = new GetTokenInput("1234"); // 物理カード（FPAN）の下4桁
PushProvisioning pushProvisioning = TPCManager.getInstance().getPushProvisioning(type);
pushProvisioning.getToken(input, new TPCSDKListener<Token>() {
    @Override
    public void onStart() {
    }
    @Override
    public void onSuccess(TPCResult<Token> result) {
        //トークンは result.getResult() を使用して取得できます。
        //OEM ウォレットに対応するトークンが存在しない場合、result.getResult() は null を返します。
        //トークン状態は次のように使用されます:
        if(result.getResult()==null || TextUtils.isEmpty(result.getResult().getState())){
            //API はトークンを返しませんでした。
            //「GPay/SPay に追加」ボタンを表示します。
        }else{
            Token token = result.getResult();
            if(type==OEMPayType.GOOGLE_PAY){
                //Google Pay の場合。
                try {
                    int tokenState = Integer.parseInt(token.getState());
                    switch (tokenState){
                        case CardDigitizationStatus.GOOGLE_PAY_TOKEN_STATE_NEEDS_IDENTITY_VERIFICATION:
                            // アクションの有効化については Token life cycle management を参照してください。
                            // カードは ID&V 保留中です。 
                            break;
                        case CardDigitizationStatus.GOOGLE_PAY_TOKEN_STATE_PENDING:
                        case CardDigitizationStatus.GOOGLE_PAY_TOKEN_STATE_SUSPENDED:
                        case CardDigitizationStatus.GOOGLE_PAY_TOKEN_STATE_ACTIVE:
                            //カードはすでに追加されています。
                            break;
                        case CardDigitizationStatus.GOOGLE_PAY_TOKEN_STATE_UNTOKENIZED:
                            //"GPayに追加"ボタンを表示します。
                            break;
                    }
                } catch (NumberFormatException e) {
                    //例外を処理します。
                }
            }else if(type==OEMPayType.SAMSUNG_PAY){
                //Samsung Pay用。
                String tokenState = token.getState();
                switch (tokenState){
                    case CardDigitizationStatus.SAMSUNG_PAY_PENDING_PROVISION:
                        // アクションの有効化については Token life cycle management を参照してください。
                        // カードはID&Vの保留中です
                        break;
                    case CardDigitizationStatus.SAMSUNG_PAY_ACTIVE:
                    case CardDigitizationStatus.SAMSUNG_PAY_EXPIRED:
                    case CardDigitizationStatus.SAMSUNG_PAY_PENDING_ENROLLED:
                    case CardDigitizationStatus.SAMSUNG_PAY_SUSPENDED:
                    case CardDigitizationStatus.SAMSUNG_PAY_PENDING_ACTIVATION:
                        //カードはすでに追加されています。
                        break;
                    case CardDigitizationStatus.SAMSUNG_PAY_DISPOSED:
                        //"SPayに追加"ボタンを表示します。
                        break;
                }
            }
        }
    }
    @Override
    public void onError(TPCSDKException exception) {
        // Samsung Pay専用
        Throwable exceptionCause = exception.getCause();
        if (exceptionCause != null && exceptionCause instanceof TPCSpayException) {
            // Samsung Payのエラーの詳細を取得
            TPCSpayException spayException = (TPCSpayException) exceptionCause;
        }
    }
});
```

{% endtab %}

{% tab title="Android 1.6.0-" %}

```java
CardInfo cardInfo = new CardInfo();
cardInfo.setScheme(scheme);
cardInfo.setEncryptedPayload(encryptedPayload);
cardInfo.setLast4PanDigits(last4DigitsOfPAN); // Samsung Payのみ

TPCManager.getInstance().getPushProvisioning()
	.isCardDigitized(cardInfo, new TPCSDKListener<CardDigitizationStatus>() {
    @Override
    public void onStart() {
        //開始時 
    }

    @Override
    public void onSuccess(TPCResult<CardDigitizationStatus> result) {
        if (result != null) {
          	CardDigitizationStatus digitizedStatus = result.getResult();

            if (digitizedStatus.getOemPayType() == OEMPayType.GOOGLE_PAY) {
                int cardState = digitizedStatus.getGpayDigitizationStatus();
                String tokenReferenceId = digitizedStatus.getTokenReferenceId();

                if (cardState == CardDigitizationStatus.GOOGLE_PAY_TOKEN_STATE_NEEDS_IDENTITY_VERIFICATION)
                    // カードはID&Vの保留中です
                } else if (cardState == CardDigitizationStatus.CARD_IS_NOT_DIGITIZED) {
                    // カードは追加されていません
                } else {
                    // カードは追加済み
                }
            }
          
            if (digitizedStatus.getOemPayType() == OEMPayType.HUAWEI_PAY) {
                Boolean isCardDigitized = cardDigitizationStatus.getHpayDigitizationStatus();
                String hPayDeviceId = cardDigitizationStatus.getHPayDeviceId();
            }
            
          	if (digitizedStatus.getOemPayType() == OEMPayType.SAMSUNG_PAY) {
                String cardState = digitizedStatus.getSpayDigitizationStatus(); 
            }
        }
    }

    @Override
    public void onError(TPCSDKException exception) {
        Log.e("TAG", "カードのデジタル化ステータスでエラーが発生しました");
    }
});
```

{% endtab %}
{% endtabs %}

Google Pay では、トークンのステータスは次のとおりです:

| Google Pay の状態                                           | 説明                           |
| -------------------------------------------------------- | ---------------------------- |
| GOOGLE\_PAY\_TOKEN\_STATE\_NEEDS\_IDENTITY\_VERIFICATION | カードはデジタル化されており、ID\&V の保留中です。 |
| GOOGLE\_PAY\_TOKEN\_STATE\_PENDING                       | カードはデジタル化されています。             |
| GOOGLE\_PAY\_TOKEN\_STATE\_SUSPENDED                     | カードはデジタル化されています。             |
| GOOGLE\_PAY\_TOKEN\_STATE\_ACTIVE                        | カードはデジタル化されています。             |
| GOOGLE\_PAY\_TOKEN\_STATE\_UNTOKENIZED                   | カードはデジタル化されていません。            |
| CARD\_IS\_NOT\_DIGITIZED                                 | カードはデジタル化されていません。            |

<br>

Samsung Pay では、トークンの状態は次のとおりです:

| Samsung Pay の状態                   | 説明                           |
| --------------------------------- | ---------------------------- |
| SAMSUNG\_PAY\_PENDING\_PROVISION  | カードはデジタル化されており、ID\&V の保留中です。 |
| SAMSUNG\_PAY\_ACTIVE              | カードはデジタル化されています。             |
| SAMSUNG\_PAY\_EXPIRED             | カードはデジタル化されています。             |
| SAMSUNG\_PAY\_PENDING\_ENROLLED   | カードはデジタル化されています。             |
| SAMSUNG\_PAY\_PENDING\_ACTIVATION | カードはデジタル化されています。             |
| SAMSUNG\_PAY\_SUSPENDED           | カードはデジタル化されています。             |
| SAMSUNG\_PAY\_DISPOSED            | カードはデジタル化されていません。            |

> <i class="fa-exclamation-circle">:exclamation-circle:</i>
>
> #### 注意 <a href="#caution" id="caution"></a>
>
> * Google Pay では、カードがまだ次のように表示される場合は `NOT_DIGITIZED` デジタル化後、TSP ポータルでイシュア アプリケーションが正しく設定されていることを確認してください。
> * Samsung Pay では、一部のイシュアは複数の `イシュア名` 値をポータルに登録する必要があります。これはイシュア アプリケーションおよび/または TSP の要件によります。次のことを確認してください。 `イシュア名` API の値がポータルに登録された値と一致していること。API は完全一致のみを返します。
> * その `getToken` Huawei Pay では API はサポートされていません。使用 `isCardDigitized` デジタル化の状態を確認するために。

### ステップ 2: リクエストのプロビジョニング <a href="#step-2-provisioning-a-request" id="step-2-provisioning-a-request"></a>

Android では、成功結果は次によって異なります `OEMPayType`. Samsung Pay では、これは a を返します `カード` オブジェクト。Huawei Pay では、これは a を返します `真偽値`. Google Payでは、SDK 2.0.0以降は1つの `Googleプロビジョニング結果`、利用可能な場合はトークンIDを含みます。

| ウォレット       | 成功結果               |
| ----------- | ------------------ |
| Samsung Pay | `カード`              |
| Google Pay  | `Googleプロビジョニング結果` |
| Huawei Pay  | `真偽値`              |

{% tabs %}
{% tab title="Android 2.0.0以上" %}
{% code overflow="wrap" %}

```java
CardInfo cardInfo = new CardInfo();
cardInfo.setScheme(scheme);
cardInfo.setEncryptedPayload(encryptedPayload);
cardInfo.setAuthorizationCode(authorizationCode);
cardInfo.setLast4PanDigits("1234"); // PANの下4桁を設定します。
cardInfo.setIssuerAppId("TPC_ISSUER"); // テスト用イシュアID。
cardInfo.setCardType("DEBIT"); // Samsung Pay のみ
cardInfo.setProductId("PRODUCTID"); // 国内スキームの場合のみ。イシュア CMS から取得してください。
cardInfo.setBounceProvisioned(true); // Google Pay のみ

UserDetails userDetails = new UserDetails();
userDetails.setAddress1("住所1行目");
userDetails.setAddress2("住所2行目");
userDetails.setAdministrativeArea("州");
userDetails.setLocality("市区町村名");			// 市または町の名前
userDetails.setCountryCode("SG");					// 国コードを設定します。
userDetails.setPostalCode("828126"); 			// 郵便番号を設定します。
userDetails.setPhoneNumber("123456789"); 	// 電話番号を設定します。
userDetails.setName("氏名");							// 住所の本人名を設定します。
cardInfo.setUserDetails(userDetails);

// TPC SDK V2.0.0 以降
Activity activity;

PushProvisioning pushProvisioning;
try {
    pushProvisioning = TPCManager.getInstance().getPushProvisioning();
} catch (TPCSDKException e) {
    e.printStackTrace();
    return;
}

TPCSDKListener<GoogleProvisioningResult> addCardListenerGPay =
        new TPCSDKListener<GoogleProvisioningResult>() {
        @Override
        public void onStart() {
            // 何かを行う
        }

        @Override
        public void onSuccess(TPCResult<GoogleProvisioningResult> result) {
            GoogleProvisioningResult provisioningResult = result.getResult();
            Log.i("TAG", "プッシュプロビジョニングに成功しました。トークンID: "
                    + provisioningResult.getTokenID());
            // 必要に応じて以下を確認できます
            if (!provisioningResult.isCardSavedToGoogle()) {
                Log.w("TAG", "Google Pay はカードを保存しませんでした。ステータスコード: "
                    + provisioningResult.googleCardSavedStatusCode());
            }
        }

        @Override
        public void onError(TPCSDKException exception) {
            logGoogleProvisioningDiagnostic(exception.getAdditionalData());
        }
};

private void logGoogleProvisioningDiagnostic(final Object additionalData) {
        if (additionalData instanceof GoogleProvisioningResult) {
            final GoogleProvisioningResult result = (GoogleProvisioningResult) additionalData;
            Log.w(TAG, "Google プロビジョニングの診断。トークンID: " + result.getTokenID()
                    + ", cardSaved: " + result.isCardSavedToGoogle()
                    + ", cardSavedStatusCode: " + result.getGoogleCardSavedStatusCode());
        }
    }

TPCSDKListener<Card> addCardListenerSPay = new TPCSDKListener<Card>() {
        @Override
        public void onStart() {
            // 何かを行う
        }

        @Override
        public void onSuccess(TPCResult<Card> result) {
            Card card = (Card)result.getResult();
            Log.d(TAG, "last4FPan: " + card.getLast4FPAN() +
                             "\nlast4DPan:" + card.getLast4DPAN() +
                             "\nApp2AppPayLoad: " + card.getApp2AppPayLoad() +
                             "\ntype: " + card.getType() +
                             "\nissuerName: " + card.getIssuerName() +
                             "\nid: " + card.getId() +
                             "\nstate: " + card.getState() +
                             "\nscheme: " + card.getCardScheme());
        }

        @Override
        public void onError(TPCSDKException exception) {
            Log.e("TAG", "プッシュプロビジョニングに失敗しました。エラー: " + exception.getMessage());
            if (exception.getExceptionType() == TPCSDKExceptionType.TPC_SPAY_APP_NEED_TO_UPDATE) {
                // Samsung Pay の更新 UI を表示
                pushProvisioning.updateSamsungPay();
            } else if (exception.getExceptionType() == TPCSDKExceptionType.TPC_SPAY_APP_SETUP_NOT_COMPLETED) {
                // Samsung Pay の有効化 UI を表示
                pushProvisioning.activateSamsungPay();
            } 
            Throwable exceptionCause = exception.getCause();
            if (exceptionCause != null && exceptionCause instanceof TPCSpayException) {
                // Samsung Payのエラーの詳細を取得
                TPCSpayException spayException = (TPCSpayException) exceptionCause;
            }
        }
};

TPCSDKListener<Boolean> addCardListenerHPay = new TPCSDKListener<Boolean>() {
        @Override
        public void onStart() {
            // 何かを行う
        }

        @Override
        public void onSuccess(TPCResult<Boolean> result) {
            Log.i("TAG", "Push Provision Successful");
        }

        @Override
        public void onError(TPCSDKException exception) {
            Log.e("TAG", "プッシュプロビジョニングに失敗しました。エラー: " + exception.getMessage());
        }
};

TPCSDKListener addCardListener = null;
switch (oemPayType) {
    case GOOGLE_PAY:
        addCardListener = addCardListenerGPay;
        break;
    case SAMSUNG_PAY:
        addCardListener = addCardListenerSPay;
        break;
    case HUAWEI_PAY:
        addCardListener = addCardListenerHPay;
        break;
}


if (oemPayType == OEMPayType.GOOGLE_PAY) {
  // TPC SDK V2.0.0 以降
  pushProvisioning.addCard(activity, cardInfo, addCardListenerGPay);
} else {
  pushProvisioning.addCard(cardInfo, addCardListener);
}

// イシュアアプリケーションが Google Pay SDK から onActivityResult を受け取ったら、結果を処理するために SDK に渡します。
@Override
public void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
    pushProvisioning.handleWalletResult(requestCode, resultCode, data);
}

// イシュアアプリケーションが Huawei Pay から onNewIntent を受け取ったら、結果を処理するためにその intent を SDK に渡します。
@Override
protected void onNewIntent(Intent intent) {
    pushProvisioning.handleWalletResult(intent);
}
```

{% endcode %}
{% endtab %}

{% tab title="Android 2.0.0-" %}
{% code overflow="wrap" %}

```java
CardInfo cardInfo = new CardInfo();
cardInfo.setScheme(scheme);
cardInfo.setEncryptedPayload(encryptedPayload);
cardInfo.setAuthorizationCode(authorizationCode);
cardInfo.setLast4PanDigits("1234"); // PANの下4桁を設定します。
cardInfo.setIssuerAppId("TPC_ISSUER"); // テスト用イシュアID。
cardInfo.setCardType("DEBIT"); // Samsung Pay のみ
cardInfo.setProductId("PRODUCTID"); // 国内スキームの場合のみ。イシュア CMS から取得してください。

UserDetails userDetails = new UserDetails();
userDetails.setAddress1("住所1行目");
userDetails.setAddress2("住所2行目");
userDetails.setAdministrativeArea("州");
userDetails.setLocality("市区町村名");			// 市または町の名前
userDetails.setCountryCode("SG");					// 国コードを設定します。
userDetails.setPostalCode("828126"); 			// 郵便番号を設定します。
userDetails.setPhoneNumber("123456789"); 	// 電話番号を設定します。
userDetails.setName("氏名");							// 住所の本人名を設定します。
cardInfo.setUserDetails(userDetails);

//TPC SDK V1.9.0 以降
Activity activity;

PushProvisioning pushProvisioning;

PushProvisioning pushProvisioning = TPCManager.getInstance().getPushProvisioning();

TPCSDKListener<String> addCardListenerGPay = new TPCSDKListener<String>() {
        @Override
        public void onStart() {
            // 何かを行う
        }

        @Override
        public void onSuccess(TPCResult<String> result) {
            Log.i("TAG", "Push Provision Successful with result : " + result.getResult());
        }

        @Override
        public void onError(TPCSDKException exception) {
            Log.e("TAG", "プッシュプロビジョニングに失敗しました。エラー: " + exception.getMessage());
        }
}

TPCSDKListener<Card> addCardListenerSPay = new TPCSDKListener<Card>() {
        @Override
        public void onStart() {
            // 何かを行う
        }

        @Override
        public void onSuccess(TPCResult<Card> result) {
            Card card = (Card)result.getResult();
            Log.d(TAG, "last4FPan: " + card.getLast4FPAN() +
                             "\nlast4DPan:" + card.getLast4DPAN() +
                             "\nApp2AppPayLoad: " + card.getApp2AppPayLoad() +
                             "\ntype: " + card.getType() +
                             "\nissuerName: " + card.getIssuerName() +
                             "\nid: " + card.getId() +
                             "\nstate: " + card.getState() +
                             "\nscheme: " + card.getCardScheme());
        }

        @Override
        public void onError(TPCSDKException exception) {
            Log.e("TAG", "プッシュプロビジョニングに失敗しました。エラー: " + exception.getMessage());
            if (exception.getExceptionType() == TPCSDKExceptionType.TPC_SPAY_APP_NEED_TO_UPDATE) {
                // Samsung Pay の更新 UI を表示
                pushProvisioning.updateSamsungPay();
            } else if (exception.getExceptionType() == TPCSDKExceptionType.TPC_SPAY_APP_SETUP_NOT_COMPLETED) {
                // Samsung Pay の有効化 UI を表示
                pushProvisioning.activateSamsungPay();
            } 
            Throwable exceptionCause = exception.getCause();
            if (exceptionCause != null && exceptionCause instanceof TPCSpayException) {
                // Samsung Payのエラーの詳細を取得
                TPCSpayException spayException = (TPCSpayException) exceptionCause;
            }
        }
};

TPCSDKListener<Boolean> addCardListenerHPay = new TPCSDKListener<Boolean>() {
        @Override
        public void onStart() {
            // 何かを行う
        }

        @Override
        public void onSuccess(TPCResult<Boolean> result) {
            Log.i("TAG", "Push Provision Successful");
        }

        @Override
        public void onError(TPCSDKException exception) {
            Log.e("TAG", "プッシュプロビジョニングに失敗しました。エラー: " + exception.getMessage());
        }
};

TPCSDKListener addCardListener = null;
switch (oemPayType) {
    case OEMPayType.GOOGLE_PAY:
    case GOOGLE_PAY:
        addCardListener = addCardListenerGPay;
        break;
    case OEMPayType.SAMSUNG_PAY:
    case SAMSUNG_PAY:
        addCardListener = addCardListenerSPay;
        break;
    case OEMPayType.HUAWEI_PAY:
    case HUAWEI_PAY:
        addCardListener = addCardListenerHPay;
        break;
}

try {
    if (oemPayType == OEMPayType.GOOGLE_PAY) {
        // TPC SDK V1.9.0 以降
        pushProvisioning.addCard(activity, cardInfo, addCardListenerGPay);
    } else {
        pushProvisioning.addCard(cardInfo, addCardListener);
    }
} catch (TPCSDKException e) {
    e.printStackTrace();
}

// イシュアアプリケーションが Google Pay SDK から onActivityResult を受け取ったら、結果を処理するために SDK に渡します。
@Override
public void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
    pushProvisioning.handleWalletResult(requestCode, resultCode, data);
}

// イシュアアプリケーションが Huawei Pay から onNewIntent を受け取ったら、結果を処理するためにその intent を SDK に渡します。
@Override
protected void onNewIntent(Intent intent) {
    pushProvisioning.handleWalletResult(intent);
}
```

{% endcode %}
{% endtab %}
{% endtabs %}


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation by asking a question.

Perform an HTTP GET request on the following URL with the `ask` and `goal` query parameters:

```
GET https://docs.payments.thalescloud.io/classic-push-provisioning/ja/ysuksu/xpayworettohenopusshupurobijoningu/android/pusshupurobijoningu.md?ask=<question>&goal=<user_goal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is what the user is ultimately trying to achieve, the reason they need the answer. Sharing it helps GitBook give you a better, more relevant answer. A goal is most helpful when it describes the outcome the user wants rather than restating the question. For example, with `ask=how do I create an API token`, a goal like `automate deployments from our CI pipeline` lets GitBook tailor the answer to that use case.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
