> 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/implement-contactless-payment/4.-implement-payment.md).

# 4. 決済を実装する

次の各タッチ決済体験を実装できます：

* **ダブルクリック**：デフォルトの支払いカードを使ってタッチ決済を開始します。
* **フィールド検出**：POSリーダーが検出されたときにタッチ決済を開始します。
* **マニュアルモード**：エンドユーザーがカードを選択した後にタッチ決済を開始します。

については、 **フィールド検出**、エンドユーザーに続行を促す必要がある場合があります。次のいずれかを使用してください **ダブルクリック** または **手動モード**.

については、 **手動モード**、エンドユーザーがカードを選択できるUIを追加します。続いてそのカードで支払いを開始します。

### 支払いを開始 <a href="#start-payment" id="start-payment"></a>

次を呼び出してタッチ決済を開始します `startPayment(withDigitalCardID:)`.

{% hint style="info" %}
`digitalCardID` は任意です。

* を指定して `digitalCardID` で特定のカードで支払います。\
  これを使用するのは **手動モード**.
* を省略して `digitalCardID` SDKにデフォルトの支払いカードを使用させます。\
  これを使用するのは **ダブルクリック**.

デフォルトの支払いカードがどのように選択されるかを確認するには、次を参照してください [デフォルトの支払いカードを設定する](/nfc-wallet-sdk-ios/ja/implement-nfc-wallet/manage-digital-cards/set-default-payment-card.md).
{% endhint %}

```swift
// 提供された digitalCardID で支払いを開始
// ユースケース: 手動モード（ユーザー操作あり）
await session.startPayment(withDigitalCardID: digitalCardID)

// デフォルトのカードで支払いを開始
// ユースケース: ダブルクリック
await session.startPayment()
```

この呼び出しは支払いセッションを開始します。

その後、あなたのイシュアアプリケーションは次を行う必要があります：

1. をリッスンする `ContactlessPaymentSession.eventStream`.
2. 各イベントを処理する。

{% hint style="info" %}
あなたのデジタルウォレットアプリケーションはトランザクションデータを添付することもできます。参照： [ウォレットのトランザクションデータを設定する](/nfc-wallet-sdk-ios/ja/additional-features/add-wallet-transaction-data.md).
{% endhint %}

### タッチ決済イベントを処理する

を呼び出した後、 `startPayment(...)`、を反復処理します `ContactlessPaymentSession.eventStream`。各アイテムは `ContactlessPaymentSession.Event`.

フローがで終了するまでイベントを処理します `.transactionCompleted` または `.errorEncountered`.

* `.authenticationRequired(let authentication)`：エンドユーザー認証を要求します（例：Touch IDやFace ID）。
  * 呼び出す `authentication.proceed()` で認証を促してフローを続行します。
  * 呼び出す `authentication.cancel()` でフローを停止します。その後あなたはを受け取ります `.errorEncountered` 次のパラメータで `cancelled`.
* `.authenticationCompleted`：認証が成功したことを確認します。通常は次にカードエミュレーションを開始します。
* `.posConnected`：デバイスがPOS端末のRFフィールド内にあることを示します。\
  iOS 18では、このイベントを受け取るにはプレゼンテーションインテントアサーションを使用する必要があります。
* `.posDisconnected`：トランザクションが進行中にデバイスがPOS端末のフィールドを離れたことを示します。
* `.transactionCompleted(let transactionContext)`：トランザクションが正常に完了したことを示します。状態やレシートを表示するには次を使用します `transactionContext` を表示するには
* `.errorEncountered(let error)`：エラーによりフローが終了したことを示します。参照： [エラーの処理。](#example-of-a-full-implementation)

```swift
func startContactlessPayment() async {
  let contactlessPaymentSession = ContactlessPaymentSession()
  contactlessPaymentSession.startPayment()
        
  for await state in contactlessPaymentSession.eventStream {
    switch state {
      case .authenticationRequired(let authentication):
        // 認証を続行します。生体認証のプロンプトが表示されます
        authentication.proceed()
        //authentication.cancel()
      case .authenticationCompleted:
        // 認証が成功しました。
        contactlessPaymentSession.startEmulation()
      case .posConnected: break
        // 情報提供: アプリケーションはエンドユーザーに情報を表示します
      case .posDisconnected: break
        // 情報提供: アプリケーションはエンドユーザーに情報を表示します
      case .transactionCompleted(let transactionContext): break
        // エンドユーザーにUIを表示します
      case .errorEncountered(let error): break
        // エンドユーザーにUIを表示します
    }
  }
}
```

### エミュレーションを開始

呼び出す `startEmulation()` を受け取った後、 `ContactlessPaymentSession.Event.authenticationCompleted`.

これでカードエミュレーションが開始され、NFCモーダルUIがエンドユーザーに表示されます：

<div align="left"><figure><img src="/files/feb579dfd5717c2976301b676b384b79f625e57b" alt=""><figcaption><p>認証後に表示されるNFCモーダルユーザーインターフェース。</p></figcaption></figure></div>

NFCモーダルUIが表示されている間、SDKはフィールド検出イベントを抑制します。

SDKはまた、POS端末とのAPDU（Application Protocol Data Unit）交換を有効にします。

エンドユーザーにはタッチ決済を完了するための60秒の猶予があります。

時間切れになった場合、SDKはを発行します `.errorEncountered` 次のパラメータで `maxSessionDurationReached`.

を複数回呼び出すことができます。 `startEmulation()` 複数回。

```swift
contactlessPaymentSession.startEmulation()
```

### 支払いカードを変更する

使用する `startPayment(withDigitalCardID:)` エンドユーザーがデフォルト以外の支払いカードで支払いたいとき。

このAPIは：

* 選択したカードをデフォルトの支払いカードとして設定します（更新が成功した場合）。
* そのカードで支払いフローを続行します。

{% hint style="warning" %}
この呼び出しはデフォルトの支払いカードを **永続的に**変更します。\
SDKがデフォルトの支払いカードの更新に成功した場合、支払いが失敗またはキャンセルされても選択されたままになります。
{% endhint %}

を呼び出すタイミングに基づいて、次のフローのいずれかを選択してください `startEmulation()`.

#### シナリオA: 認証後にエミュレーションを開始

呼び出す `startEmulation()` を受け取ったとき `ContactlessPaymentSession.Event.authenticationCompleted`.

* NFCモーダルUIは認証直後に表示されます。
* カードを変更するには、エンドユーザーは次を行う必要があります：
  1. をタップ **キャンセル** をNFCモーダルUIで行う。
  2. あなたのUIで別のカードを選択します。
  3. 呼び出す `startPayment(withDigitalCardID:)` 新しいで再度 `digitalCardID`.

#### シナリオB: POS端末タップ時にエミュレーションを開始

呼び出す `startEmulation()` を受け取ったとき `ContactlessPaymentSession.Event.posConnected`.

* エンドユーザーはPOS端末をタップする前にあなたのUIでカードを切り替えることができます。
* NFCモーダルUIはデバイスがRFフィールドに入った後にのみ表示されます。

{% hint style="info" %}
シナリオBにはが必要です `NFCPresentmentIntentAssertion` リーダー検出を制御し、システムがデフォルトの支払いアプリケーションを起動するのを防ぎます。

* あなたのイシュアアプリケーションが **再現しない** デフォルトの支払いアプリケーションである場合（iOS 17.4 および iOS 18）、次を使用する必要があります `NFCPresentmentIntentAssertion`. そうでない場合、デフォルトの支払いアプリケーションが起動し、あなたの支払いフローは進行できません。
* あなたのイシュアアプリケーションが **は** デフォルトの支払いアプリケーションである場合（iOS 18）、次を使用して受け取る必要があります `NFCPresentmentIntentAssertion` リーダー検出から `ContactlessPaymentSession.Event.posConnected` 。それがなければ、リーダー検出はあなたの `NFCWindowSceneEvent.readerDetected` の `SceneDelegate`.
  {% endhint %}

### タッチ決済をキャンセルする <a href="#cancel-contactless-payment" id="cancel-contactless-payment"></a>

cancel() を呼び出して進行中のタッチ決済をキャンセルします。 `cancel()`.

その後、あなたのイシュアアプリケーションはを受け取ります `.errorEncountered` 次のパラメータで `cancelled`. を使用してUI状態をリセットします。

```swift
contactlessPaymentSession.cancel()
```

### アラートメッセージを設定する <a href="#set-alert-message" id="set-alert-message"></a>

NFCモーダルUIに表示されるメッセージを設定します。

```swift
contactlessPaymentSession.setAlertMessage("POS Connected")
```

### エラーを処理する <a href="#example-of-a-full-implementation" id="example-of-a-full-implementation"></a>

フローがで終了したとき `ContactlessPaymentSession.Event.errorEncountered(let error)`、支払いを失敗として扱います。以下の表は考えられるエラーの一覧をまとめたものです：

| エラー                                | 説明                                                                                                          |
| ---------------------------------- | ----------------------------------------------------------------------------------------------------------- |
| `cancelled`                        | ユーザーがトランザクションをキャンセルしました。                                                                                    |
| `maxSessionDurationReached`        | セッションは最大許容時間に達したため期限切れになりました。                                                                               |
| `nfcPermissionNotAccepted`         | NFC接続の許可が与えられていません。                                                                                         |
| `systemEligibilityFailed`          | システムがタッチ決済の対象外です。例：Apple IDまたはデバイスの所在地がEEA外です。                                                              |
| `keychainError`                    | キーチェーン操作でエラーが発生しました。                                                                                        |
| `noDefaultCard`                    | トランザクション前にデフォルトカードが設定されていません。                                                                               |
| `noPaymentKeys`                    | カードに支払い用キーがありません。補充を行うために呼び出す必要があります。                                                                       |
| `apduFailure`                      | デバイスとPOS端末間のAPDU交換でエラーが発生しました。                                                                              |
| `transmissionError`                | 一般的な送信エラー。NFCリーダーとの接続がまだ有効な場合、送信操作の再試行が許可されます。                                                              |
| `sessionInvalidated`               | カードセッションがシステムによって無効化されました。例：アプリケーションがバックグラウンドにある場合。                                                         |
| `unknown`                          | トランザクション中に不明なエラーが発生しました。                                                                                    |
| `deviceEnvironmentUnsafe`          | デバイス環境の安全でないエラー。                                                                                            |
| `setDefaultCardFailure`            | API が呼び出されたときに指定されたデジタルカードIDをデフォルトカードとして設定する際にエラーが発生しました。 `startPayment(withDigitalCardID:)` API が呼び出されたとき。 |
| `invalidDigitalCardID`             | 提供されたデジタルカードIDが無効である場合にエラーが発生しました（呼び出し時）。 `startPayment(withDigitalCardID:)`.                               |
| `authenticationExpired` が呼び出されたとき。 | 認証の有効期間が過ぎた後に支払いが行われたときにエラーが発生しました。                                                                         |
| `posNotSupported`                  | 選択されたAIDがPOS端末のリストにない場合にエラーが発生しました。                                                                         |
| `cardNotSupported`                 | そのカードはタッチ決済をサポートしていません。                                                                                     |
| `cardNotActive`                    | カードがアクティブではありません。                                                                                           |
| `authenticationKeyInvalidated`     | デバイスのパスコードがオフにされて安全なデータが消去されたときにエラーが発生しました。パスコードを再度有効にしてセットアップを再初期化してください。                                  |
| `biometricNotEnrolled`             | 生体認証データが登録されていないかサポートされていない場合にエラーが発生しました。                                                                   |
| `authenticationFailed`             | 認証がキャンセルされた、アプリが中断された、またはデバイスのパスコードが欠如している場合にエラーが発生しました。                                                    |

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

あなたのアプリケーションはエンドユーザーに再登録の手順を案内するべきです。
{% 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:

```
GET https://docs.payments.thalescloud.io/nfc-wallet-sdk-ios/ja/implement-nfc-wallet/make-payments/implement-contactless-payment/4.-implement-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.
