> 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/merchant-tokenization/ja/visa-ctf-to-daf/implement-ctf-and-daf/create-device-binding-green-flow.md).

# デバイスバインディングを作成（緑のフロー）

Visa Cloud Token Framework (CTF) のデバイスバインディングを使用する **グリーンフロー** イシュアがデバイスバインディングを承認したとき **〜なしで** ステップアップ認証。

{% hint style="info" %}
本番環境では、デバイスバインディングはしばしばステップアップ認証を必要とします。その経路は **イエローフロー**.
{% endhint %}

前提条件:

* 決済カードは既にトークン化されています。
* あなたは持っています、 `vProvisionedTokenId`.
* エンドユーザーはデバイス上で認証できます（PIN、パスコード、指紋、Face ID など）。

## フロー

<figure><img src="/files/bac8cdef08e3d7e096ae4f315cfa2abfdc35e591" alt=""><figcaption><p>デバイスバインディング グリーンフロー。</p></figcaption></figure>

<table><thead><tr><th width="100">ステップ</th><th>説明</th></tr></thead><tbody><tr><td>1</td><td>Thales SDK を使用してマーチャントアプリケーションからデバイスバインディングフローを開始します。</td></tr><tr><td>2</td><td>Thales SDK はデバイス ID と CTF 鍵ペアを生成し、その CTF 鍵ペアをデバイス上に安全に保存します。</td></tr><tr><td>3</td><td>Thales SDK はデバイス上でエンドユーザー認証をトリガーします。</td></tr><tr><td>4</td><td>Thales SDK は Visa 定義のペイロードを生成して署名します。</td></tr><tr><td>5</td><td>Thales SDK は署名済みペイロードと CTF 公開鍵を Thales バックエンドに送信します。</td></tr><tr><td>6</td><td>Thales バックエンドは公開鍵を Visa CA を使用して証明書に変換します。</td></tr><tr><td>7</td><td>Thales バックエンドはデバイスを登録し、VTS にデバイスバインディングを要求します。</td></tr><tr><td>8</td><td>VTS はイシュアの決定を確認します。</td></tr><tr><td>9</td><td>イシュアはステップアップ認証なしでデバイスバインディングを承認します。</td></tr><tr><td>10</td><td>VTS は結果を Thales バックエンドに転送します。</td></tr><tr><td>11</td><td>Thales SDK に通知され、トークン識別子をローカルでデバイスにバインドします。</td></tr><tr><td>12</td><td>Thales バックエンドはバインディングの詳細をマーチャント/PSP バックエンドに通知します。</td></tr></tbody></table>

## SDK 統合

### バインディングを作成する

{% tabs %}
{% tab title="Android" %}

```java
String vProvisionedTokenId;
String correlationId;

visaCTFHelper.createBinding(vProvisionTokenId, 
                            correlationId, 
                            new TokenBindingListener() {

        ......
        
        @Override
        public void onDeviceAuthentication(DeviceAuthentication deviceAuthentication) {
            // ユーザー認証を行う
         }

        @Override
        public void onSuccess() { }

        @Override
        public void onError(TMGClientException exception) { 
            // エラーを確認する
            int errorCode = exception.getErrorCode();
            int errorMessage = exception.getMessage();
        }
    });
```

{% endtab %}

{% tab title="iOS" %}

```swift
let vProvisionedTokenID: String = ""
let correlationID: String = ""
// 1. バインディング作成を開始
visaCTFHelper.createBinding(forVProvisionedTokenID: vProvisionedTokenID,
                            correlationID: correlationID,
    deviceAuthenticationHandler: { auth in
        // 2. Face ID
        let customMessage = "" // カスタムメッセージを渡します。例: "Face ID で認証"
        auth.startAuthentication(withMessage: customMessage)
    }, idvSessionHandler: { session in
        // idv セッションを開始する（イエローフローにのみ適用）
        
    }, completionHandler: { session, error in
        // 3. バインディング成功
        if error == nil {
            
        }
        // フェール時にエラーを処理するか idv セッションを再試行する（グリーンフローには該当しません）
    })
```

{% endtab %}
{% endtabs %}

{% hint style="info" %}
`createBinding` は非同期です。アプリケーションが UI を更新する必要がある場合、コールバック内で `runOnUiThread(Runnable)` を呼び出すことを推奨します。
{% endhint %}

### エンドユーザーを認証する

デバイスバインディングを作成するには、エンドユーザーのプレゼンスが必要です。 `deviceAuhenticationHandler` コールバックを実装します。 `createBinding`.

このコールバックを使用してカスタム UI（例えば Face ID の許可プロンプト）を表示します。認証を開始するには `startAuthentication`を呼び出します。認証中に表示するカスタムメッセージを渡すこともできます。

{% tabs %}
{% tab title="Android" %}

```java
@Override
public void onDeviceAuthentication(DeviceAuthentication deviceAuthentication) {
    FragmentActivity fragmentActivity;
    CharSequence title;
    CharSequence subTitle;
    CharSequence description;
    CharSequence negativeButtonText;

    // ユーザー認証を開始する
    deviceAuthentication.startAuthentication(fragmentActivity, 
                                             title, 
                                             subTitle, 
                                             description, 
                                             negativeButtonText);
}
```

{% endtab %}

{% tab title="iOS" %}

```swift
let deviceAuhenticationHandler: ((DeviceAuthentication) -> Void) = {(auth) in
    // ユーザー認証を開始する
    let customMessage = "" // カスタムメッセージを渡します。例: "Face ID で認証"
    auth.startAuthentication(withMessage: customMessage)
}
```

{% endtab %}
{% endtabs %}

#### 結果を処理する

結果は `onSuccess` または `onError` コールバックを通じて返されます。

エラーが発生した場合、例外のエラーコードとメッセージを記録して検査してください。

{% tabs %}
{% tab title="Android" %}

```java
@Override
public void onError(TMGClientException exception) {
    // エラーを確認する
    int errorCode = exception.getErrorCode();
    int errorMessage = exception.getMessage();
}
```

{% endtab %}

{% tab title="iOS" %}

```swift
let vProvisionedTokenID: String = ""
let correlationID: String = ""
// 1. バインディング作成を開始
visaCTFHelper.createBinding(forVProvisionedTokenID: vProvisionedTokenID,
                            correlationID: correlationID,
    deviceAuthenticationHandler: { auth in
        // 2. デバイス認証をキャンセルする
        auth.cancel()
    }, idvSessionHandler: { session in
        // idv セッションを開始する（イエローフローにのみ適用）
        
    }, completionHandler: { session, error in
        if error == nil {
            
        }
        // 3. キャンセルエラーを処理する
    })
```

{% endtab %}
{% endtabs %}


---

# 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/merchant-tokenization/ja/visa-ctf-to-daf/implement-ctf-and-daf/create-device-binding-green-flow.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.
