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

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

## 概要

Mastercard DSRP リモート決済を使用して、リモート受付（例：eコマース）のための支払いデータを生成します。

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

DSRP リモート決済を実装する前に、次を完了してください **トークン化**。参照してください [カードをトークン化する](/nfc-wallet-sdk-ios/ja/implement-nfc-wallet/tokenize-a-card.md).

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

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

## SDK統合

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

次を使用してデジタルカードが DSRP リモート決済をサポートしていることを確認します `DigitalCard.Details.isPaymentTypeSupported()` 次のパラメータで `PaymentType.dsrp`.

```swift
func checkCardSupportForDSRP(card: DigitalCard) async throws -> Bool {
    return try await card.details.isPaymentTypeSupported(.dsrp)
}
```

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

DSRP 支払いデータを生成する前に、入力データを次で提供する必要があります `RemotePaymentInputData`.

```swift
func buildRemoteInputData() -> RemotePaymentSession.RemotePaymentInputData  {
    let amount = "000000500030"  // 少数単位で 5000.30 EUR
    let currencyCode = "978"     // ISO 4217 数値コード
    let countryCode = "840"      // ISO 3166-1 数値コード（例：US）
    let unpredictableNumber = "12345"
    
    return RemotePaymentSession.RemotePaymentInputData(
        amount: amount,
        currencyCode: currencyCode,
        transactionType: .purchase,
        unpredictableNumber: unpredictableNumber,
        countryCode: countryCode,
        cryptogramType: .de55
    )
}
```

`RemotePaymentSession.RemotePaymentInputData` は次のフィールドを持ちます：

<table><thead><tr><th width="196">入力データ</th><th width="120">型</th><th width="150">形式</th><th>説明</th></tr></thead><tbody><tr><td><code>amount</code></td><td>文字列</td><td>数値、少数単位</td><td><strong>必須</strong><br>小数点区切りなしの少数単位での取引金額。例えば、119.00 USD は <code>11900</code> （統合が固定長を要求する場合は左パディング）。</td></tr><tr><td><code>currencyCode</code></td><td>文字列</td><td>3桁の ISO 4217 数値コード</td><td><strong>必須</strong><br>取引通貨コード。例えば、USD は <code>840</code>.</td></tr><tr><td><code>countryCode</code></td><td>文字列</td><td>3桁の ISO 3166-1 数値コード</td><td><strong>必須</strong><br>マーチャントの国コード。例えば、United States は <code>840</code>.</td></tr><tr><td><code>transactionType</code></td><td>列挙型</td><td><code>.purchase</code></td><td><strong>必須</strong><br>金融取引の種類。DSRP 支払いでは、を使用します <code>.purchase</code>.</td></tr><tr><td><code>cryptogramType</code></td><td>列挙型</td><td><code>.ucaf</code> または <code>.de55</code></td><td><strong>必須</strong><br>SDK によって返されるクリプトグラムデータの形式。</td></tr><tr><td><code>unpredictableNumber</code></td><td>文字列</td><td>数値</td><td><strong>必須</strong><br>マーチャントまたは決済ゲートウェイによって生成されたランダム番号。</td></tr></tbody></table>

### DSRP 支払いデータを生成する

デジタルウォレットアプリ内で、次を呼び出します `RemotePaymentSession.generateRemotePayment()`.

この API はエラーをスローする可能性があります。参照： [エラーを処理する](#handle-errors).

成功すると、API は次を返します `RemotePaymentOutputData` 次のフィールドを持ちます：

<table><thead><tr><th width="217">パラメータ</th><th>説明</th></tr></thead><tbody><tr><td><code>cryptogramData</code></td><td>フォーマットされた応答を含むバイト配列。これはマーチャントが DE-55 を埋めるための UCAF または TLV データのいずれかです。</td></tr><tr><td><code>pan</code></td><td>任意の <code>F</code> パディングが削除された PAN（存在する場合）。</td></tr><tr><td><code>panSequenceNumber</code></td><td>使用されたカードの PAN シーケンス番号（PSN）。</td></tr><tr><td><code>track2EquivalentData</code></td><td>ISO/IEC 7813 に準拠したトラック2 データ要素（開始セントネル、終了セントネル、LRC を除く）：PAN、フィールドセパレータ（<code>D</code>）、有効期限（YYMM）、サービスコード、任意データ、およびオプションの <code>F</code> パディング。</td></tr><tr><td><code>par</code></td><td>支払い口座参照（PAR）、決済ネットワークが提供する場合。</td></tr><tr><td><code>expirationDate</code></td><td>カードの有効期限日。</td></tr><tr><td><code>cryptogramDataType</code></td><td>返されるクリプトグラムの形式（UCAF または DE55）。</td></tr></tbody></table>

### エラーを処理する

もし `generateRemotePayment()` がエラーをスローした場合、支払いは失敗とみなしてください。UI 状態をリセットし、エンドユーザーに次に取るべき最良の行動を案内してください。

<table><thead><tr><th width="260">エラー</th><th>説明</th></tr></thead><tbody><tr><td><code>deviceEnvironmentUnsafe</code></td><td>デバイスがセキュリティ要件を満たしていません。</td></tr><tr><td><code>sessionInProgress</code></td><td>別の決済セッションがまだ実行中です。</td></tr><tr><td><code>invalidInputData</code></td><td>の一つ以上のフィールドが欠落しているか形式が不正です。 <code>RemotePaymentInputData</code> は欠落しているか形式が不正です。</td></tr><tr><td><code>noPaymentKeys</code></td><td>取引に利用できる支払い鍵がありません。</td></tr><tr><td><code>cardNotSupported</code></td><td>デジタルカードは DSRP リモート決済をサポートしていません。</td></tr><tr><td><code>cardNotActive</code></td><td>デジタルカードは有効になっていません。</td></tr><tr><td><code>noDefaultCard</code></td><td>デフォルトカードが設定されていません。</td></tr><tr><td><code>clientError</code></td><td>リモート決済フローはクライアント側のエラー（例：ネットワーク問題）により失敗しました。</td></tr><tr><td><code>authenticationKeyInvalidated</code></td><td>デバイスのパスコードが無効化され、セキュアストレージが消去されました。</td></tr><tr><td><code>biometricNotEnrolled</code></td><td>生体認証が利用できないか登録されていません。</td></tr></tbody></table>

{% hint style="info" %}
各エラーには失敗を説明するメッセージが含まれる場合があります。トラブルシューティングやサポート診断にそれを使用してください。
{% endhint %}

{% hint style="warning" %}
NFC Wallet SDK は、次が発生したときに保存された資格情報を自動的に消去します `authenticationKeyInvalidated` が発生したとき（例：パスコードリセットやセキュリティ変更の後）。

アプリケーションはエンドユーザーを再登録へ導くべきです。
{% endhint %}

### 完全な実装例

このコードサンプルを使用して、前の手順がどのように結びつくかを理解してください。

{% code expandable="true" %}

```swift
func generateDSRP(digitalCard: DigitalCard?) async {
    do {
        let remotePaymentSession = RemotePaymentSession()

        let amount = "000000500030"      // 少数単位で 5000.30、12桁に左パディング
        let currencyCode = "978"         // ISO 4217 数値コード（EUR）
        let countryCode = "840"          // ISO 3166-1 数値コード（US の例）
        let unpredictableNumber = "12345"

        let input = RemotePaymentSession.RemotePaymentInputData(
            amount: amount,
            currencyCode: currencyCode,
            transactionType: .purchase,
            unpredictableNumber: unpredictableNumber,
            countryCode: countryCode,
            cryptogramType: .de55
        )

        if let digitalCard {
            _ = try await remotePaymentSession.generateRemotePayment(
                withDigitalCardID: digitalCard.digitalCardID,
                remotePaymentInputData: input,
                userPrompt: "Authenticate"
            )
        } else {
            // デフォルトのデジタルカードを使用します。
            _ = try await remotePaymentSession.generateRemotePayment(
                withDigitalCardID: nil,
                remotePaymentInputData: input,
                userPrompt: "Authenticate"
            )
        }
    } catch {
        guard let err = error as? RemotePaymentSession.Error else {
            return
        }

        switch err {
        case .deviceEnvironmentUnsafe:
            break
        case .sessionInProgress:
            break
        case .invalidInputData:
            break
        case .authenticationKeyInvalidated:
            break
        case .biometricNotEnrolled:
            break
        default:
            break
        }
    }
}
```

{% endcode %}


---

# 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:

```
GET https://docs.payments.thalescloud.io/nfc-wallet-sdk-ios/ja/implement-nfc-wallet/make-payments/other-payment-methods/implement-dsrp-remote-payment.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
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.
