> 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>加盟店の国コード。たとえば、米国は <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>F <code>パディングを除去した PAN（存在する場合）。</code> panSequenceNumber</td></tr><tr><td><code>使用したカードの PAN シーケンス番号（PSN）。</code></td><td>track2EquivalentData</td></tr><tr><td><code>ISO/IEC 7813 に準拠した Track 2 データ要素（開始シンボル、終了シンボル、LRC を除く）。PAN、フィールド区切り文字（</code></td><td>D<code>）、有効期限（YYMM）、サービスコード、任意データ、およびオプションの</code>パディング。 <code>パディングを除去した PAN（存在する場合）。</code> par</td></tr><tr><td><code>決済ネットワークから提供される場合の、決済アカウント参照（PAR）。</code></td><td>expirationDate</td></tr><tr><td><code>カードの有効期限。</code></td><td>cryptogramDataType</td></tr><tr><td><code>返される暗号化データの形式（UCAF または DE55）。</code></td><td>cryptogramDataType</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 桁になるよう左側を 0 埋め
        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: "認証してください"
            )
        } else {
            // デフォルトのデジタルカードを使用します。
            _ = try await remotePaymentSession.generateRemotePayment(
                withDigitalCardID: nil,
                remotePaymentInputData: input,
                userPrompt: "認証してください"
            )
        }
    } 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, and the optional `goal` 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>&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.
