> 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.md).

# Android

### ステップ 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 ウォレットが端末でサポートされているか、およびカードに対してトークンが既に存在するかを確認します。結果に基づいて、次を表示または非表示にします。 **ウォレットに追加** ボタン。

発行元アプリケーションで を使用する際は、これらのウォレットブランドガイドラインに従ってください: **ウォレットに追加** あなたの発行元アプリケーションで:

* **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:
                            // Activate アクションについては Token ライフサイクル管理を参照してください。
                            // カードは 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:
                        // Activate アクションについては Token ライフサイクル管理を参照してください。
                        // カードは 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 の場合、一部の発行元はポータルに複数の `ISSUER NAME` 値を登録する必要があります。これは発行元アプリケーションおよび/または TSP の要件によります。API の値がポータルに登録された値と一致していることを確認してください。API は完全一致のみを返します。 `ISSUER NAME` API が返す値は完全一致のみです。
> * この `getToken` API は Huawei Pay ではサポートされていません。代わりに `isCardDigitized` を使用してデジタル化ステータスを確認してください。

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

Android では、成功結果は `OEMPayType`によって異なります。Google Pay の場合、SDK はトークン ID を返します。Samsung Pay の場合は `Card` オブジェクトを返します。Huawei Pay の場合は boolean を返します。

> <i class="fa-info-circle">:info-circle:</i>
>
> #### 注 <a href="#note" id="note"></a>
>
> TPC SDK v1.9.0 以降、Google Pay のプッシュプロビジョニングは新しい API を使用できます: `addCard(Activity activity, CardInfo cardInfo, TPCSDKListener<T> listener)`.

```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("state");
userDetails.setLocality("city name");			// 市区町村名
userDetails.setCountryCode("SG");					// 国コードを設定します。
userDetails.setPostalCode("828126"); 			// 郵便番号を設定します。
userDetails.setPhoneNumber("123456789"); 	// 電話番号を設定します。
userDetails.setName("name");							// 住所の氏名を設定します。
cardInfo.setUserDetails(userDetails);

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

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", "プッシュプロビジョンが成功しました。結果 : " + 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", "プッシュプロビジョンが成功しました");
        }

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

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

try {
  if (oemPayType == OEMPayType.GOOGLE_PAY) {
    // TPC SDK V1.9.0 以降
    pushProvisioning.addCard(activity, cardInfo, addCardListener);
  } 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 を受け取ったときは、そのインテントを処理するために SDK に渡してください。
@Override
protected void onNewIntent(Intent intent) {
    pushProvisioning.handleWalletResult(intent);
}
```


---

# 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 dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

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

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

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.
