> 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-qr-code-payment.md).

# QR コード決済を実装する

## 概要

NFC Wallet SDK は、Thales のホワイトラベル EMV PURE カードでのみ QR コード決済をサポートします。

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

## SDK統合

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

次を使用して、デジタルカードが QR コード決済をサポートしていることを確認します `DigitalCard.Details.isPaymentTypeSupported()` で `PaymentType.qr`.

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

### QR 決済の入力データを作成する

作成 `QRPaymentSession.QRPaymentInputData`。これには、QR コード決済のペイロードを構築するために使用されるトランザクション パラメータが含まれます。

```swift
let amount   = "000000500030"  // 5000.30 EUR
let currency = "0978" // EUR
let aid      = "00000000000000000000000000000000"    // 16 bytes long
let idd      = "000000000000000000000000000000"      // 15 bytes long
let inputData = QRPaymentSession.QRPaymentInputData(amount: amount, currencyCode: currency, aid: aid, idd: idd)
```

`QRPaymentSession.QRPaymentInputData` には次のフィールドがあります:

<table><thead><tr><th width="138">入力データ</th><th width="160">形式</th><th width="169">長さ</th><th>説明</th></tr></thead><tbody><tr><td><code>aid</code></td><td><p>16進数</p><p>ISO/IEC 7816-5</p></td><td>10～32文字</td><td><p><strong>必須</strong></p><p>"0000000000" を使用して、SDK にプライマリ AID を使用させます。</p></td></tr><tr><td><code>amount</code></td><td>BCD エンコードされた16進数</td><td>12文字</td><td><p><strong>必須</strong></p><p>BCD 形式の取引金額。</p><p>5.22 EUR の金額の値は “000000000522” です。</p></td></tr><tr><td><code>currencyCode</code></td><td><p>ISO-4217</p><p>数値文字列</p></td><td>4文字</td><td><p><strong>必須</strong><br>取引通貨。</p><p>EUR には "0978" を使用します。</p></td></tr><tr><td><code>idd</code></td><td>16進数</td><td>30文字</td><td><p><strong>任意</strong></p><p>イシュア固有データ</p></td></tr></tbody></table>

### QR 決済データを生成

デジタルウォレットアプリケーションで、次を呼び出します `generateQRPaymentData` QR コードにエンコードするペイロードを生成するために。

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

成功すると、この API は `QRPaymentOutputData` 次のフィールドを含みます:

<table><thead><tr><th width="220">パラメーター</th><th>説明</th><th data-hidden>例</th></tr></thead><tbody><tr><td><code>statusWord</code></td><td>取引ステータスワード。 <strong>9000</strong> 成功を示します。<br>参照 <a href="#handle-status-word">ステータスワードを処理</a></td><td><code>"000000500030"</code></td></tr><tr><td><code>cid</code></td><td>暗号情報データ。この取引で CDCVM が必要かどうかを判定します。</td><td><code>"0978"</code></td></tr><tr><td><code>chipDataField</code></td><td>NFC によって計算された、暗号文を含むチップデータフィールド。</td><td><code>"00000000000000000000000000000000"</code></td></tr><tr><td><code>condensedPaymentData</code></td><td>該当なし</td><td></td></tr><tr><td><code>cardMainAid</code></td><td>支払いに使用されるカードのメイン AID。</td><td></td></tr><tr><td><code>cardMainAppTemplate</code></td><td>支払いに使用されるカードのメイン Application Template。</td><td></td></tr><tr><td><code>cardAliasAid</code></td><td>支払いに使用されるカードの代替 AID。</td><td></td></tr><tr><td><code>cardAliasAppTemplate</code></td><td>支払いに使用されるカードの代替 Application Template。</td><td></td></tr><tr><td><code>commonDataTemplate</code></td><td>支払い中に計算される Common Data Template。</td><td></td></tr></tbody></table>

{% hint style="info" %}
を渡すことで、QR コード決済にデフォルト以外のデジタルカードを使用できます `digitalCardID` を `generateQRPaymentData`.
{% endhint %}

### ステータスワードを処理

必ず確認してください `statusWord` 他のフィールドを使用する前に。

* `9000` ペイロードの生成が成功したことを示します。次の他のフィールドを読み取れます `QRPaymentOutputData`.
* それ以外の値は失敗を示します。次の他のフィールドは使用しないでください `QRPaymentOutputData`.

詳細は以下の表を参照してください:

<table><thead><tr><th width="225">ステータスワードの値</th><th>説明</th></tr></thead><tbody><tr><td>9000</td><td><p>成功した取引です。次のオブジェクト内のすべてのフィールド <code>QRPaymentOutputData</code> オブジェクトは、次の場合に取得できます <code>cid</code> 値が <code>0x8x</code>。<br>ここで:</p><ul><li>1桁目は「取引をオンラインで処理する要求」を示します。</li><li>2桁目は、CVM 不要、ローカル CDCVM 入力済み、ローカル CDCVM 必須などの CVM 情報を示します。CID が 0x8x 形式でない場合、フィールドは空です。</li></ul></td></tr><tr><td>6989</td><td>CIAC 値により顧客確認が必要ですが、Application Control で方法が定義されていません。</td></tr><tr><td>6988</td><td>取引金額を 0 にすることはできません。</td></tr><tr><td>6987</td><td>取引金額がカードイシュア定義の上限を超えています。</td></tr><tr><td>6986</td><td>取引金額が消費者定義の上限を超えています。</td></tr><tr><td>6985</td><td>ATC 上限に達したか、選択した AID がこの仕様に準拠する決済アプリケーションを参照していません。</td></tr></tbody></table>

### エラーを処理する

もし `generateQRPaymentData` がエラーをスローした場合は、支払い失敗として扱います。UI 状態をリセットし、エンドユーザーを次に取るべき最善のアクションへ誘導してください。

<table><thead><tr><th width="274">エラー</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>unsupportedPaymentType</code></td><td>デジタルカードは QR コード決済をサポートしていません。</td></tr><tr><td><code>invalidQRInputData</code></td><td>次のいずれかのフィールドが <code>QRPaymentInputData</code> 不足しているか、形式が正しくありません。</td></tr><tr><td><code>qrPaymentFailed</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 generateOutputData(digitalCard: DigitalCard?) async -> QRPaymentSession.QRPaymentOutputData? {
    do {
        let paymentSession = QRPaymentSession()
        // QR コード決済に適用可能な場合は、最大金額を使用してください。
        let amount   = "000000000000"
        let currency = "0000"
        let aid      = "00000000000000000000000000000000"
        let idd      = "000000000000000000000000000000"
        let inputData = QRPaymentSession.QRPaymentInputData(amount: amount, currencyCode: currency, aid: aid, idd: idd)
        
        if let digitalCard = digitalCard, try await digitalCard.isDefaultCard {
            // デフォルトカードでの QR コード決済
            return try await paymentSession.generateQRPaymentData(withQRPaymentInputData: inputData, userPrompt: "認証")
        } else {
            // 指定したデジタルカードでの QR コード決済
            return try await paymentSession.generateQRPaymentData(withQRPaymentInputData: inputData, digitalCardID: digitalCard?.digitalCardID, userPrompt: "認証")
        }
        
    } catch {
        // エラーを処理
        if let error = error as? QRPaymentSession.Error {
            switch error {
            case.deviceEnvironmentUnsafe(_): break
            case .sessionInProgress: break
            case .unsupportedPaymentType(_): break
            case .invalidQRInputData(_): break
            case .qrPaymentFailed(_): break
            case .authenticationKeyInvalidated(_): break
            case .biometricNotEnrolled(_): break
            @unknown default:
                break
            }
        } else {
            //
        }
        return nil
    }
}
```

{% endcode %}

### QR コード画像を生成して表示

お使いのデジタルウォレットアプリケーションは、NFC Wallet SDK が返す出力を使用して QR コード画像を生成し、表示する責任があります。

受信後 `QRPaymentOutputData` QR コード決済では、デジタルウォレットアプリケーションは次を実行する必要があります:

1. QR コードのペイロードを構築します。
2. QR コード画像を生成します。
3. エンドユーザーが POS で提示できるように QR コード画像を表示します。

{% hint style="info" %}
iOS は QR コード生成をネイティブでサポートしています (Core Image)。
{% endhint %}


---

# 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-qr-code-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.
