> 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/nfc-wallet-sdk-android/ja/implement-nfc-wallet/make-payment/other-payment-methods/implement-dsrp-remote-payment.md).

# DSRP リモート決済を実装する

## 概要

リモート受け入れ（例：eコマース）の支払いデータを生成するために、Mastercard Digital Secure Remote Payment（DSRP）を使用します。

このフローでは、あなたの **デジタルウォレットアプリケーション** が支払いデータを生成します。あなたはそのデータを認可のためにマーチャントシステムまたは決済ゲートウェイに渡します。

開始する前に、次を完了してください **トークナイゼーション**。参照： [カードをトークン化する](/nfc-wallet-sdk-android/ja/implement-nfc-wallet/tokenize-a-card.md).

{% hint style="warning" %}
NFC Wallet SDKは、次のためのDSRPリモート決済をサポートします： **Mastercard** 次の条件を満たすデジタルカードで、 **MCBP 2.x プロファイル** のみ。

別のプロファイルや決済ネットワークでのDSRPリモート決済が必要な場合は、Thalesのデリバリーチームに連絡してください。
{% endhint %}

## SDK 統合

### 前提条件を確認する

DigitalizedCardDetails.paymentTypeSupported() を使用してデジタルカードがDSRPリモート決済をサポートしていることを確認します。 `DigitalizedCardDetails.paymentTypeSupported()`。このAPIはサポートされる支払いタイプの一覧を返します。次を確認してください： `PaymentType.DSRP` が存在すること。

```java
public boolean isDsrpSupported(DigitalizedCardDetails card) {
    final PaymentType[] supported = card.paymentTypeSupported();

    for (PaymentType p : supported) {
        if (p == PaymentType.DSRP) {
            return true;
        }
    }
    return false;
}
```

### DSRP支払いの入力データを作成する

作成 `PaymentInputData`。これはDSRPリモート支払いのペイロードを生成するために使用されるトランザクションパラメータを含みます。

使用する `PaymentInputData.PaymentInputBuilder` 次を使用：

* `withRemotePaymentParameters` を提供するために `amount（金額）` と `currencyCode（通貨コード）`
* `withMCRemotePaymentParameters` を提供するために `countryCode（国コード）`, `transactionType（取引種別）`, `cryptogramDataType（クリプトグラムデータ形式）`、および `unpredictableNumber（予測不可能番号）`

次のサンプル値をプレースホルダとして使用してください。

```java
long amount = 11900; // マイナー単位。例：119.00
char currencyCode = 702; // SGD（ISO 4217 数値コード）
char countryCode = 702; // シンガポール（ISO 3166-1 数値コード）
TransactionType transactionType = TransactionType.PURCHASE;
long unpredictableNumber = 12345;
PaymentInputData paymentInputData = new PaymentInputData.PaymentInputBuilder(PaymentType.DSRP)
                .withRemotePaymentParameters(amount, currencyCode)
                .withMCRemotePaymentParameters(countryCode, transactionType, CryptogramDataType.DE55, unpredictableNumber)
                .build();
```

`PaymentInputData` DSRP支払いのためのは次のフィールドを持ちます：

| フィールド                              | 型           | 形式                                                      | 必須／要件 | 説明                                                                |
| ---------------------------------- | ----------- | ------------------------------------------------------- | ----- | ----------------------------------------------------------------- |
| `amount（金額）`                       | `long`      | 数値、マイナー単位                                               | 必須    | トランザクション金額をマイナー単位で設定してください（小数点区切りなし）。例：119.00 USD は `11900`.      |
| `currencyCode（通貨コード）`              | `char` （整数） | 3桁のISO 4217 数値コード                                       | 必須    | トランザクションの通貨コードを設定します。例：USD は `840`.                               |
| `countryCode（国コード）`                | `char` （整数） | 3桁のISO 3166-1 数値コード                                     | 必須    | 加盟店の国コードを設定します。例：アメリカ合衆国 は `840`.                                 |
| `transactionType（取引種別）`            | 列挙型（Enum）   | `TransactionType.PURCHASE`                              | 必須    | 金融取引の種類を設定します。DSRPリモート決済では、を使用してください： `TransactionType.PURCHASE`. |
| `cryptogramDataType（クリプトグラムデータ形式）` | 列挙型（Enum）   | `CryptogramDataType.UCAF` または `CryptogramDataType.DE55` | 必須    | SDKが返すクリプトグラム形式を設定します。                                            |
| `unpredictableNumber（予測不可能番号）`     | `long`      | 数値（Numeric）                                             | 必須    | 加盟店または決済ゲートウェイによって生成されたランダムな番号を提供してください。                          |

### リモート決済クリプトグラムを生成する

デジタルウォレットアプリケーション内で、次を呼び出してください： `PaymentBusinessService.generateApplicationCryptogram()` とともに `PaymentType.DSRP` リモート受け入れ（例：eコマース）のための支払いデータを生成するために。

あなたはを実装する必要があります： `RemotePaymentServiceListener`.

```java
final PaymentBusinessService pbs = PaymentBusinessManager.getPaymentBusinessService();
pbs.generateApplicationCryptogram(
        PaymentType.DSRP, 
        paymentInputData, 
        remotePaymentServiceListener);
```

### 実装する `RemotePaymentServiceListener`

リモート決済リスナーはDSRPクリプトグラム生成中のイベントを処理します。

リスナーには3つのコールバックがあります：

* `onAuthenticationRequired`

  SDKはCDCVM検証が必要であることを示します。参照： [CDCVM 検証を実行する](/nfc-wallet-sdk-android/ja/implement-nfc-wallet/make-payment/implement-contactless-payments/5.-perform-cdcvm-verification.md).
* `onDataReadyForPayment`

  リモート決済の出力データが準備できたら、次を使用して取得します： `PaymentService.getRemotePaymentData()`.

  データを取得したら支払いサービスを無効化（deactivate）してください。無効化をスキップすると、次回の生成が次のエラーで失敗する可能性があります： `REMOTE_PAYMENT_WRONG_STATE`.
* `onError`

  SDKはリモート決済生成中に失敗が発生しました。

  再試行する前に状態をリセットするために支払いサービスを無効化してください。

次のコードスニペットはリスナーの基本的な実装を示します：

{% code expandable="true" %}

```java
public class MyRemotePaymentPaymentServiceListener implements RemotePaymentServiceListener{
    /**********************************************************/
    /*                Payment Service listener                */
    /**********************************************************/
    @Override
    public void onAuthenticationRequired(PaymentService paymentService, CHVerificationMethod chVerificationMethod, long cvmResetTimeout) {
        toggleProgress(false);
        if (chVerificationMethod == CHVerificationMethod.BIOMETRICS
                || chVerificationMethod == CHVerificationMethod.DEVICE_KEYGUARD) {
            Intent intent = new Intent(this, DeviceCVMActivity.class);
            intent.putExtra(DeviceCVMActivity.EXTRA_CVM, chVerificationMethod);
            overridePendingTransition(0, 0);
            startActivityForResult(intent, REQ_CODE_FINGERPRINT);
        } else {
            // 注：他の検証方法はサポートされていません
            AppLogger.e(TAG, "Verification method " + chVerificationMethod + " not currently supported!");
            deactivatePaymentService();
        }
    }

    @Override
    public void onDataReadyForPayment(PaymentService paymentService, TransactionContext transactionContext) {
        toggleProgress(false);
        RemotePaymentOutputData remotePaymentData = paymentService.getRemotePaymentData();
        Toast.makeText(this, "DSRP支払いデータ: " + remotePaymentData.getCryptogramData(), Toast.LENGTH_LONG).show();
        deactivatePaymentService();
    }

    @Override
    public void onError(SDKError<PaymentServiceErrorCode> sdkPaymentServiceErrorCode) {
        AppLogger.e(TAG, "エラーコード " + sdkPaymentServiceErrorCode.getErrorCode() + " によりDSRP支払いデータの生成に失敗しました");
        Toast.makeText(this, "エラーコード " + sdkPaymentServiceErrorCode.getErrorCode() + " によりDSRP支払いデータの生成に失敗しました", Toast.LENGTH_SHORT).show();
        deactivatePaymentService();
    }
}
```

{% endcode %}

generateApplicationCryptogram(...) を呼び出す際に、あなたのリスナーインスタンスを渡してください。 `generateApplicationCryptogram(...)`.

### DSRP支払いデータを取得する

取得する `RemotePaymentOutputData` 次のときに： `RemotePaymentServiceListener.onDataReadyForPayment()` がトリガーされたとき。

`RemotePaymentOutputData` は次のフィールドを含みます。

| フィールド                              | 説明                                                                 |
| ---------------------------------- | ------------------------------------------------------------------ |
| `cryptogramData（クリプトグラムデータ）`       | フォーマット済みレスポンスを含むバイト配列。これはマーチャントがDE-55に配置するためのUCAFまたはTLVデータのいずれかです。 |
| `dpan`                             | 任意のパディングが取り除かれたDPAN（存在する場合）。 `F` パディングが取り除かれます（存在する場合）。            |
| `dpanSequenceNumber`               | 使用されたカードのDPANシーケンス番号（PSN）。                                         |
| `track2EquivalentData`             | ISO/IEC 7813に従ったTrack 2等価データ。開始センチネル、終了センチネル、およびLRCは除きます。          |
| `PAR`                              | 支払い口座参照（PAR）。支払いネットワークが提供する場合に含まれます。                               |
| `dPanexpirationDate`               | DPANの有効期限日。                                                        |
| `cryptogramDataType（クリプトグラムデータ形式）` | 返されるクリプトグラム形式（`UCAF` または `DE55`).                                  |

`track2EquivalentData` には次が含まれます：

* 主口座番号（Primary Account Number）
* フィールド区切り（16進数 `D`)
* 有効期限（`YYMM`)
* サービスコード
* 任意データ（支払いネットワークによって定義される）
* バイト境界に合わせるための任意の16進パディング `F` 全バイトに揃えるため

### エラーの処理

次のときに： `RemotePaymentServiceListener.onError(...)` がトリガーされると、SDKはを提供します： `PaymentServiceErrorCode`.

常にを呼び出して、再試行する前に支払いサービスの状態をリセットしてください。 `PaymentBusinessService.deactivate()` に `onError(...)` 再試行する前に支払いサービス状態をリセットするために呼び出してください。

`PaymentBusinessService.generateApplicationCryptogram(...)` は次を投げます： `IllegalArgumentException` もし `paymentInputData` が `null` またはリスナーが `null`.

| 支払いサービスエラーコード                    | 説明                                          | 推奨される対処                                                                                                                  |
| -------------------------------- | ------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------ |
| REMOTE\_PAYMENT\_WRONG\_STATE    | リモート決済を実行しようとしたときに支払いサービスがすでにアクティベートされています。 | 呼び出す `PaymentBusinessService.deactivate()` 各生成後に呼び出してください。エンドユーザがCDCVMをキャンセルした場合にも呼び出してください。                             |
| REMOTE\_PAYMENT\_OUTPUT\_INVALID | 出力データを解析できず、利用できません。                        | トランザクションを再試行してください。                                                                                                      |
| REMOTE\_PAYMENT\_NOT\_SUPPORTED  | デフォルトカードはリモート決済をサポートしていません。                 | 支払前に次を確認してください： `DigitalizedCardDetails.paymentTypeSupported()` 有効なデジタルカードを使用して、がサポートされているか確認してください。 `PaymentType.DSRP`. |
| REMOTE\_PAYMENT\_INPUT\_INVALID  | 入力データは存在しますが、いくつかのフィールドが有効ではありません。          | を有効な値で再構築してください。 `PaymentInputData` すべての必須フィールドが設定されていることを確認してください。                                                      |
| NO\_DEFAULT\_CARD                | デフォルトカードが存在しません。                            | クリプトグラムを生成する前にデフォルトカードを設定してください。                                                                                         |
| CARD\_OUT\_OF\_PAYMENT\_KEYS     | 利用可能な支払い認証情報がありません。                         | 再試行する前に支払い認証情報を補充してください。                                                                                                 |


---

# 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/nfc-wallet-sdk-android/ja/implement-nfc-wallet/make-payment/other-payment-methods/implement-dsrp-remote-payment.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.
