> 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リモート決済を実装する

## 概要

Mastercard Digital Secure Remote Payment（DSRP）を使用して、eコマースなどのリモート受け入れ向けの支払いデータを生成します。

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

始める前に、次を完了してください **トークン化**。参照してください [カードをトークン化する](/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 統合

### 前提条件を確認

デジタルカードが 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` を提供するために `金額` と `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 決済には次のフィールドがあります:

| フィールド                 | 型           | 形式                                                      | 要件 | 説明                                                              |
| --------------------- | ----------- | ------------------------------------------------------- | -- | --------------------------------------------------------------- |
| `金額`                  | `long`      | 数値、小数単位                                                 | 必須 | 取引金額を小数単位で設定します（小数点なし）。例: 119.00 USD は `11900`.                 |
| `currencyCode`        | `char` （整数） | 3桁の ISO 4217 数値コード                                      | 必須 | 取引通貨コードを設定します。例: USD は `840`.                                   |
| `countryCode`         | `char` （整数） | 3桁の ISO 3166-1 数値コード                                    | 必須 | 加盟店の国コードを設定します。例: 米国は `840`.                                    |
| `transactionType`     | 列挙型         | `TransactionType.PURCHASE`                              | 必須 | 金融取引タイプを設定します。DSRP リモート決済では、次を使用します `TransactionType.PURCHASE`. |
| `cryptogramDataType`  | 列挙型         | `CryptogramDataType.UCAF` または `CryptogramDataType.DE55` | 必須 | SDK が返す暗号化文字列の形式を設定します。                                         |
| `unpredictableNumber` | `long`      | 数値                                                      | 必須 | 加盟店または決済ゲートウェイによって生成されたランダム番号を指定します。                            |

### リモート決済の暗号化文字列を生成します

デジタルウォレットアプリケーションで、次を呼び出します `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()`.

  データを取得した後、ペイメントサービスを無効化してください。無効化を省略すると、次の生成が次のエラーで失敗する可能性があります `REMOTE_PAYMENT_WRONG_STATE`.
* `onError`

  SDK はリモート決済の生成中に失敗に遭遇しました。

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

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

{% code expandable="true" %}

```java
public class MyRemotePaymentPaymentServiceListener implements RemotePaymentServiceListener{
    /**********************************************************/
    /*                ペイメントサービスのリスナー                */
    /**********************************************************/
    @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, "認証方法 " + chVerificationMethod + " は現在サポートされていません!");
            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(...)`.

### 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` には以下が含まれます:

* 主口座番号
* フィールド区切り文字（hex `D`)
* 有効期限（`YYMM`)
* サービスコード
* 任意データ（決済ネットワークで定義）
* オプションの hex によるパディング `F` を1バイト単位に揃えるために

### エラーを処理する

～の場合 `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.
