> 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 バイト
let idd      = "000000000000000000000000000000"      // 15 バイト
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>SDK にプライマリ AID を使用させるには "0000000000" を使用してください。</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>Cryptogram Information Data。 この取引で 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>支払いに使用されるカードのメインアプリケーションテンプレート。</td><td></td></tr><tr><td><code>cardAliasAid</code></td><td>支払いに使用されるカードの代替 AID。</td><td></td></tr><tr><td><code>cardAliasAppTemplate</code></td><td>支払いに使用されるカードの代替アプリケーションテンプレート。</td><td></td></tr><tr><td><code>commonDataTemplate</code></td><td>支払い中に計算された共通データテンプレート。</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>最初の桁は「取引をオンラインで処理する要求」を示します。</li><li>2 番目の桁は、No CVM Required、Local CDCVM entered、Local CDCVM required などの CVM 情報を示します。CID が 0x8x 形式でない場合、フィールドは空になります。</li></ul></td></tr><tr><td>6989</td><td>CIAC 値により顧客認証が必要で、アプリケーション制御にメソッドが定義されていない場合。</td></tr><tr><td>6988</td><td>ゼロ金額の取引は許可されていません。</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: "Authenticate")
        } else {
            // 指定されたデジタルカードでの QR コード支払い
            return try await paymentSession.generateQRPaymentData(withQRPaymentInputData: inputData, digitalCardID: digitalCard?.digitalCardID, userPrompt: "Authenticate")
        }
        
    } 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.
