# 地域的な考慮事項

各国で Terminal を導入する際の地域的な考慮事項についてご紹介します。

ほとんどの場合、サポート対象のすべての国で、同一の Terminal の導入を使用できます。ただし、現地の支払い方法や規制により、いくつか国別の要件があります。[導入サンプル](https://docs.stripe.com/terminal/quickstart.md)を確認した後、このガイドを使用して、Terminal の国別の要件をご確認ください。

> Terminal の支払いを処理するには、売上を受け取る Stripe アカウントとリーダーに関連付けられた[店舗](https://docs.stripe.com/terminal/fleet/locations-and-zones.md)の両方が同じ国に所在し、現地通貨のみを受け付けてなければなりません。

## 国別の提供状況

次の表を参照して、各国で使用できるリーダーを理解してください。

| 国 | [スマートリーダー](https://docs.stripe.com/terminal/smart-readers.md) | [モバイルリーダー](https://docs.stripe.com/terminal/mobile-readers.md) | [Tap to Pay](https://docs.stripe.com/terminal/payments/setup-reader/tap-to-pay.md) |
| --- | --- | --- | --- |
| US | - BBPOS WisePOS E
- Stripe Reader T600
- Stripe Reader S710
- Stripe Reader S700
- Verifone P630, UX700, V660p
- Verifone M425 | - Stripe Reader M2 | - Android のタッチ決済
- iPhoneのタッチ決済 |
| AU | - BBPOS WisePOS E
- Stripe Reader T600
- Stripe Reader S710
- Stripe Reader S700
- Verifone V660p, UX700, P630 | - BBPOS WisePad 3 | - Android のタッチ決済
- iPhoneのタッチ決済 |
| - BE
- IT
- NL
- NO
- ES
- SE | - BBPOS WisePOS E
- Stripe Reader T600
- Stripe Reader S710
- Stripe Reader S700
- Verifone V660p, UX700, P630 | - BBPOS WisePad 3 | - Android のタッチ決済
- iPhoneのタッチ決済 |
| NZ | - BBPOS WisePOS E
- Stripe Reader T600
- Stripe Reader S710
- Stripe Reader S700
- Verifone V660p, UX700, P630 | - BBPOS WisePad 3 | - Android のタッチ決済
- iPhoneのタッチ決済 |
| CA | - BBPOS WisePOS E
- Stripe Reader T600
- Stripe Reader S710
- Stripe Reader S700
- Verifone V660p, UX700, P630, M425 | - BBPOS WisePad 3 | - Android のタッチ決済
- iPhoneのタッチ決済 |
| - IE
- GB | - BBPOS WisePOS E
- Stripe Reader T600
- Stripe Reader S710
- Stripe Reader S700
- Verifone V660p, UX700, P630 | - BBPOS WisePad 3 | - Android のタッチ決済
- iPhoneのタッチ決済 |
| SG | - BBPOS WisePOS E
- Stripe Reader T600
- Stripe Reader S710
- Stripe Reader S700
- Verifone V660p, P630 | - BBPOS WisePad 3 | - Android のタッチ決済
- iPhoneのタッチ決済 |
| - AT
- CH
- CZ
- DK
- FI
- LU
- PT | - BBPOS WisePOS E
- Stripe Reader T600
- Stripe Reader S710
- Stripe Reader S700
- Verifone V660p, UX700, P630 | - BBPOS WisePad 3 | - Android のタッチ決済
- iPhoneのタッチ決済 |
| PL | - BBPOS WisePOS E
- Stripe Reader T600
- Stripe Reader S710
- Stripe Reader S700 | - BBPOS WisePad 3 | - Android のタッチ決済
- iPhoneのタッチ決済 |
| FR | - Stripe Reader T600
- Stripe Reader S710
- Stripe Reader S700
- Verifone V660p, UX700, P630 | - BBPOS WisePad 3 | - Android のタッチ決済
- iPhoneのタッチ決済 |
| DE | - BBPOS WisePOS E
- Stripe Reader S700 | - BBPOS WisePad 3 | - Android のタッチ決済
- iPhoneのタッチ決済 |
| JP | - Stripe Reader S700 | - BBPOS WisePad 3 | - iPhoneのタッチ決済 |
| MY | - BBPOS WisePOS E
- Stripe Reader T600
- Stripe Reader S710
- Stripe Reader S700 | - BBPOS WisePad 3 | - Android のタッチ決済
- iPhone のタッチ決済 |
| MX |  |  | - iPhone のタッチ決済 |
| - BG
- HR
- CY
- EE
- HU
- LV
- LI
- LT
- MT
- RO
- SK
- SI | - BBPOS WisePOS E
- Stripe Reader S710 | - BBPOS WisePad 3 | - Android のタッチ決済
- iPhoneのタッチ決済 |
| - GI |  |  | - Android のタッチ決済 |
| HK |  |  | - Android のタッチ決済
- iPhoneのタッチ決済 |

## 国別の地域的な考慮事項

国を選択して、地域固有の考慮事項を表示します

# カナダ (CA)


## カナダで Terminal を導入する

Stripe はカナダで、Visa、Mastercard、アメリカン・エキスプレス、Discover、および [Interac](https://docs.stripe.com/terminal/payments/regional.md?integration-country=CA#interac-payments) による支払いに対応しています。取引はすべて、カナダドル (CAD) で行う必要があります。カナダで Terminal での決済を受け付けるには、プラットフォームアカウントまたは連結アカウントのいずれかがカナダにある必要があります。

### 店舗を使用する

CA の所在地でビジネスの [店舗](https://docs.stripe.com/api/terminal/locations/create.md)を作成し、[その店舗にリーダーを関連付けます](https://docs.stripe.com/terminal/fleet/locations-and-zones.md)。これにより、CA で支払いを適切に処理するために必要な設定が自動的にダウンロードされます。CA の有効な [店舗の住所](https://docs.stripe.com/api/terminal/locations/create.md#create_terminal_location-address)には、 プロパティを含める必要があります。

#### curl

```bash
curl https://api.stripe.com/v1/terminal/locations \
  -u <<YOUR_SECRET_KEY>>: \
  -d "display_name"="HQ" \
  -d "address[line1]"="3040 Bur Oak Ave" \
  -d "address[city]"="Markham" \
  -d "address[state]"="ON" \
  -d "address[country]"="CA" \
  -d "address[postal_code]"="L6B 0R1" \
```

### リーダーソフトウェアのバージョン

BBPOS WisePad 3 リーダーを使用するには、リーダーソフトウェアのバージョンが `4.01.07.00_Prod_NA_off_v30_480001` 以降である必要があります。詳しくは、[BBPOS WisePad 3 ソフトウェアの更新](https://docs.stripe.com/terminal/payments/connect-reader.md?reader-type=bluetooth#update-reader)をご覧ください。

### 翻訳

[言語に関する規制](http://www.legisquebec.gouv.qc.ca/en/showdoc/cs/C-11#ga:l_i-gb:l_vii-h1)により、POS サービスなどのサービスは、カード保有者とカード発行会社が英語の使用に同意した場合を除き、Frenchでサービスを提供する必要があります。規制がお客様のビジネスに該当する場合、Terminal は要件に準拠できるようにサポートします。

#### リーダーのデフォルトの言語

[BBPOS WisePOS E](https://docs.stripe.com/terminal/readers/bbpos-wisepos-e.md) と [Stripe Reader S700/S710](https://docs.stripe.com/terminal/readers/stripe-reader-s700-s710.md) は、Settings (設定) パネルでリーダーの言語変更をサポートします。画面を右にスワイプして Settings (設定) パネルにアクセスし、言語を選択します。

[BBPOS WisePad 3](https://docs.stripe.com/terminal/readers/bbpos-wisepad3.md) は、リーダーインターフェイスで直接リーダーの言語を変更できます。リーダーを、CA 内の所在地で [Location (店舗)](https://docs.stripe.com/api/terminal/locations.md) に登録すると、リーダーは、その地域に対応する言語パックがインストールされていなければ、そのパックをインストールします。使用できる言語オプションを表示して言語を選択するには、**Power / Settings (電源 / 設定)** ボタンをクリックし、矢印キーを使用して下にスクロールして言語選択メニューに移動します。希望の言語をハイライトし、緑の **Enter** キーを押します。

#### 取引言語

カード保有者がカードを提示すると、リーダーはカード保有者の優先言語を判定します。その時点以降の画面は、カード保有者の言語設定に基づいて翻訳されます。

#### その他の翻訳

Frenchでサービスを提供する必要がある場合、またはテキストを英語に加えてこの言語に翻訳する必要がある場合は、[カスタムのリーダー画面](https://docs.stripe.com/terminal/features/display.md)と[領収書](https://docs.stripe.com/terminal/features/receipts.md)の両方に適切な翻訳が表示されるようにします。

## Interac 支払い

Interac は、カナダの銀行間のネットワークであり、デビットカード支払いの経路選定を処理します。カナダの顧客用デビットカードには Interac ロゴが付きますが、別の決済ネットワークのロゴがブランド提携されていることもあります。ただし、カードがブランド提携されている場合でも、すべての Interac デビット取引は Interac を経由する必要があります。カードの受け付けを最大化するには、自社の実装に Interac サポートを構築する必要があります。

> [オフラインで実行](https://docs.stripe.com/terminal/features/operate-offline/overview.md)しているとき、Interac はサポートされません。

### PaymentIntent を作成する

Interac 取引を受け付けるには、`interac_present` の支払い方法タイプを使用して決済を作成する必要があります。Visa、Mastercard、アメリカン・エキスプレスによる決済を受け付ける場合は、`card_present` の支払い方法タイプも含めます。

> [対面の PaymentIntent フロー](https://docs.stripe.com/terminal/payments/collect-card-payment.md)の詳細をご覧ください。

**クライアント側**

以下のいずれかのオプションを使用して、クライアントから `PaymentIntent` を作成します。

#### サーバー主導型

> クライアント側では iOS SDK、Android SDK、React Native SDK を使用して `PaymentIntent` を作成できます。サーバー主導型の実装を使用している場合は、サーバー側で `PaymentIntent` を作成します。

#### JavaScript

> クライアント側では、他のクライアント SDK を使用して `PaymentIntent` を作成できます。Stripe Terminal で JavaScript SDK を使用している場合は、サーバ側で `PaymentIntent` を作成します。

#### iOS

- [createPaymentIntent (iOS)](https://stripe.dev/stripe-terminal-ios/docs/Classes/SCPTerminal.html#/c:objc\(cs\)SCPTerminal\(im\)createPaymentIntent:completion:)

#### Swift

```swift
import UIKit
import StripeTerminal

class PaymentViewController: UIViewController {

    // ...

    // Action for a "Checkout" button
    func checkoutAction() throws {
        let params = PaymentIntentParametersBuilder(amount: 1000, currency: "cad")
                        .setPaymentMethodTypes([.cardPresent, .interacPresent])
                        .build()
        Terminal.shared.createPaymentIntent(params) { createResult, createError in
            if let error = createError {
                print("createPaymentIntent failed: \(error)")
            }
            else if let paymentIntent = createResult {
                print("createPaymentIntent succeeded")
                // ...
            }

        }
    }

    // ...
}
```

#### Android

- [createPaymentIntent (Android)](https://stripe.dev/stripe-terminal-android/core/com.stripe.stripeterminal/-terminal/create-payment-intent.html)

#### Kotlin

```kotlin
val params = PaymentIntentParameters.Builder(
    listOf(
        PaymentMethodType.CARD_PRESENT,
        PaymentMethodType.INTERAC_PRESENT
    )
)
    .setAmount(1000)
    .setCurrency("cad")
    .build()
Terminal.getInstance().createPaymentIntent(
    params,
    object : PaymentIntentCallback {
        override fun onSuccess(paymentIntent: PaymentIntent) {
            // Placeholder for handling successful operation
        }

        override fun onFailure(e: TerminalException) {
            // Placeholder for handling exception
        }
    }
)
```

#### React Native

- [createPaymentIntent (React Native)](https://stripe.dev/stripe-terminal-react-native/api-reference/interfaces/StripeTerminalSdkType.html#createPaymentIntent)

```tsx
const {error, paymentIntent} = await createPaymentIntent({
  amount: 1000,
  currency: "cad",
  paymentMethodTypes: ["cardPresent", "interacPresent"],
});
```

また、Interac 決済は自動キャプチャが必要ですが、他の決済手段で手動キャプチャを使用したい場合は、`manual_preferred` を使用します。

#### サーバー主導型

> クライアント側では iOS SDK、Android SDK、React Native SDK を使用して `PaymentIntent` を作成できます。サーバー主導型の実装を使用している場合は、サーバー側で `PaymentIntent` を作成します。

#### JavaScript

> クライアント側では、他のクライアント SDK を使用して `PaymentIntent` を作成できます。Stripe Terminal で JavaScript SDK を使用している場合は、サーバ側で `PaymentIntent` を作成します。

#### iOS

#### Swift

```swift
let cardPresentParams = try CardPresentParametersBuilder()
    .setCaptureMethod(.manualPreferred)
    .build()
let paymentMethodOptionsParams = try PaymentMethodOptionsParametersBuilder()
    .setCardPresentParameters(cardPresentParams)
    .build()
let params = try PaymentIntentParametersBuilder(amount: 1000, currency: "cad")
    .setPaymentMethodTypes([.cardPresent, .interacPresent])
    .setPaymentMethodOptionsParameters(paymentMethodOptionsParams)
    .build()
Terminal.shared.createPaymentIntent(params) { createResult, createError in
    if let error = createError {
        print("createPaymentIntent failed: \(error)")
    }
    else if let paymentIntent = createResult {
        print("createPaymentIntent succeeded")
        // ...
    }
}
```

#### Android

#### Kotlin

```kotlin
val cardPresentParams = CardPresentParameters.Builder()
    .setCaptureMethod(CardPresentCaptureMethod.ManualPreferred)
    .build()
val paymentMethodOptionsParams = PaymentMethodOptionsParameters.Builder()
    .setCardPresentParameters(cardPresentParams)
    .build()
val params = PaymentIntentParameters.Builder(
    listOf(
        PaymentMethodType.CARD_PRESENT,
        PaymentMethodType.INTERAC_PRESENT
    )
)
    .setAmount(1000)
    .setCurrency("cad")
    .setPaymentMethodOptionsParameters(paymentMethodOptionsParams)
    .build()
Terminal.getInstance().createPaymentIntent(
    params,
    object : PaymentIntentCallback {
        override fun onSuccess(paymentIntent: PaymentIntent) {
            // Placeholder for handling successful operation
        }

        override fun onFailure(e: TerminalException) {
            // Placeholder for handling exception
        }
    }
)
```

#### React Native

```tsx
const {error, paymentIntent} = await createPaymentIntent({
  amount: 1000,
  currency: "cad",
  paymentMethodTypes: ["cardPresent", "interacPresent"],
  paymentMethodOptions: {
    captureMethod: "manual_preferred",
  },
});
```

**サーバー側**

- [PaymentIntent を作成する](https://docs.stripe.com/api/payment_intents/create.md)

JavaScript SDK とサーバー主導型の実装では、サーバーで `PaymentIntent` を作成する必要があります。その他のクライアントの SDK で、支払いの開始に必要な情報がアプリですぐに利用できない場合は、サーバで `PaymentIntent` を作成できます。

```curl
curl https://api.stripe.com/v1/payment_intents \
  -u "<<YOUR_SECRET_KEY>>:" \
  -d amount=999 \
  -d currency=cad \
  -d "allowed_payment_method_types[]=card_present" \
  -d "allowed_payment_method_types[]=interac_present" \
  -d capture_method=automatic
```

また、Interac 決済は自動キャプチャが必要ですが、他の決済手段で手動キャプチャを使用したい場合は、`manual_preferred` を使用します。

```curl
curl https://api.stripe.com/v1/payment_intents \
  -u "<<YOUR_SECRET_KEY>>:" \
  -d amount=999 \
  -d currency=cad \
  -d "allowed_payment_method_types[]=card_present" \
  -d "allowed_payment_method_types[]=interac_present" \
  -d "payment_method_options[card_present][capture_method]=manual_preferred"
```

### 支払いを回収して処理する

[支払いを処理する](https://docs.stripe.com/terminal/payments/collect-card-payment.md)と、リーダーは提示されたカードのプロフィールに基づき、Interac ネットワーク全体で支払いの経路を選定するかどうかを判断します。

Interac カードが提携ブランドのものである場合には、PaymentIntent の返された [charge](https://docs.stripe.com/api/charges/object.md#charge_object-payment_method_details-interac_present-brand) の `payment_method_details.interac_present.brand` フィールドに、提携ブランドが示されます。Interac 取引の `payment_method` の type フィールドは、常に `interac_present` です。

さらにいくつかの Interac の要件に、Stripe が自動的に対処します。追加の組み込み作業を行う必要はありません。

- カードが提示されるまで、画面上の指示はリーダーのデフォルト言語で表示されます。カード情報の収集後は、提示されたカードの設定言語に従ってローカライズされます。
- リーダーは必要に応じて自動的に PIN を要求します。
- Interac Flash (非接触型) 支払いは、250 CAD までに制限され、通常 3 回まで続けて実行できます。250 CAD を超える取引や、連続 4 回目以降の非接触型取引では、顧客は Interac カードを差し込み、PIN を入力する必要があります。

### キャプチャーと照合

Interac は、1 回のステップでオーソリとキャプチャーを行う決済のみをサポートします。Visa や Mastercard などのネットワークとは異なり、Interac ではカードの利用枠を一時的に確保し、後で資金を確定することはできません。Interac では `automatic` または `automatic_async` または `manual_preferred` のキャプチャータイプを使用した決済のみを処理できます。

| キャプチャータイプ             | 実装                                                                                                                                                                                                                             | 結果                                                                                                                                                                                                                              |
| --------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **automatic**         | PaymentIntent の [capture_method](https://docs.stripe.com/api/payment_intents/create.md#create_payment_intent-capture_method) を `automatic` に設定します。                                                                             | すべてのカード決済は 1 回のステップでオーソリとキャプチャーが行われます。                                                                                                                                                                                          |
| **automatic\_async**  | PaymentIntent の[capture_method](https://docs.stripe.com/api/payment_intents/create.md#create_payment_intent-capture_method)] を `automatic_async` に設定します。                                                                       | すべてのカード決済は、1 つのステップで非同期でオーソリおよびキャプチャーされます。                                                                                                                                                                                      |
| **manual\_preferred** | ネストされた `payment_method_options.card_present` 属性の [capture_method](https://docs.stripe.com/api/payment_intents/create.md#create_payment_intent-payment_method_options-card_present-capture_method) を `manual_preferred` に設定します。 | Interac カード決済は 1 回のステップでオーソリとキャプチャーが行われます。

  Interac 以外のカード決済のみがオーソリされます。[資金をキャプチャー](https://docs.stripe.com/terminal/payments/collect-card-payment.md?terminal-sdk-platform=server-driven#capture-payment)するには、別途リクエストしてください。 |
| **manual**            | PaymentIntent の [capture_method](https://docs.stripe.com/api/payment_intents/create.md#create_payment_intent-capture_method) を `manual` に設定します。                                                                                | Interac カード決済は常に拒否されます。

  Interac 以外のカード決済のみがオーソリされます。[資金をキャプチャー](https://docs.stripe.com/terminal/payments/collect-card-payment.md?terminal-sdk-platform=server-driven#capture-payment)するには、別途リクエストしてください。                    |

Interac 取引の場合、アプリケーションは `PaymentIntent` のキャプチャを続けてはいけません。`interac_present` 決済のキャプチャを試みると、Stripe API はエラーを返します。統合時に意図しない決済や重複が発生しないよう注意してください。処理中に失敗や拒否があった場合は、元の取引の同じ `PaymentIntent` を再利用して二重請求を防止できます。

> `2025-03-31.basil` API バージョン以降、`interac_present` 決済では、`PaymentIntent` で [capture_method](https://docs.stripe.com/api/payment_intents/create.md#create_payment_intent-capture_method) パラメーターを `automatic`、`automatic_async`、または `manual_preferred` に設定する必要があります。

### Interac 支払いを返金する

カナダの Interac 取引では、対面での返金が必須とされます。このタイプの支払いには、API やダッシュボードで返金を作成することはできません。このフローでは、リーダーがカード保有者に対し、元の支払いに使用されたカードを提示するように求めます。カード詳細が読み込まれると、お客様のアプリケーションで返金を処理できるようになります。オンラインでの返金と同様に、元の取引額よりも少ない金額を渡して一部返金を行うこともできます。

返金処理に使用される通貨とカードは、元の支払いのものと一致する必要があります。異なる場合、リクエストがエラーになって失敗します。

フォールバックとして、ストアクレジットや現金など、さまざまな支払い方法での返金機能を提供できます。

#### サーバー主導型

Interac 支払いで対面での返金を開始するには、[refund_payment](https://docs.stripe.com/api/terminal/readers/refund_payment.md) エンドポイントを呼び出します。

```curl
curl https://api.stripe.com/v1/terminal/readers/tmr_xxx/refund_payment \
  -u "<<YOUR_SECRET_KEY>>:" \
  -d payment_intent=pi_xxx \
  -d amount=2000
```

次の例に示すように、顧客がカードをリーダーに提示するまで、[リーダーのアクションステータス](https://docs.stripe.com/api/terminal/readers/object.md#terminal_reader_object-action-status)は `in_progress` になります。

```json
{
  "id": "tmr_xxx",
  "object": "terminal.reader",
  "action": {
    "type": "refund_payment",
    "refund_payment": {
      "payment_intent": "pi_xxx"
    },
    "status": "in_progress"
    "failure_code": null,
    "failure_message": null
  },
  …
}
```

[シミュレーションされたリーダー](https://docs.stripe.com/terminal/payments/collect-card-payment.md?terminal-sdk-platform=server-driven&reader=simulated)を使用している場合、[present_payment_method](https://docs.stripe.com/api/terminal/readers/present_payment_method.md) エンドポイントを使用して支払い方法の提示をシミュレーションできます。

```curl
curl https://api.stripe.com/v1/test_helpers/terminal/readers/tmr_xxx/present_payment_method \
  -u "<<YOUR_SECRET_KEY>>:" \
  -d type=interac_present
```

返金に成功すると [terminal.reader.action_succeeded](https://docs.stripe.com/api/events/types.md#event_types-terminal.reader.action_succeeded) イベントが生成されます。リーダーの `action.status` の値は `succeeded` に変わり、`action.refund_payment` には [refund](https://docs.stripe.com/api/terminal/readers/object.md#terminal_reader_object-action-refund_payment-refund) 属性が含まれます。

返金に失敗すると [terminal.reader.action_failed](https://docs.stripe.com/api/events/types.md#event_types-terminal.reader.action_failed) イベントが生成されます。リーダーの `action.status` の値は `failed` に変わり、[action.failure_code](https://docs.stripe.com/api/terminal/readers/object.md#terminal_reader_object-action-failure_code) および [action.failure_message](https://docs.stripe.com/api/terminal/readers/object.md#terminal_reader_object-action-failure_message) のプロパティにはそれぞれ失敗についての詳細な説明が含まれます。`action.refund_payment` プロパティには `refund` 属性は設定されません。

リーダーのアクションステータスの変化を追跡するために [Webhook](https://docs.stripe.com/terminal/payments/collect-card-payment.md?terminal-sdk-platform=server-driven#webhooks) を使用することをお勧めします。

#### JavaScript

```javascript
    const result = await this.terminal.collectRefundPaymentMethod(
    "ch_xxxxxxxxxx",
    2000,
    "cad"
  );

  if (result.error) {
    // Placeholder for handling result.error
  } else {
    const refund = await this.terminal.processRefund();
    if (refund.error) {
      // Placeholder for handling refund.error
    } else {
      console.log("Charge fully refunded!");
      return refund;
    }
  }
```

#### iOS

#### Swift

```swift
let refundParams = try ProcessRefundParametersBuilder(
    chargeId: "ch_1FLyVV2eZvKYlo2C9Z8rmX02",
    amount: 1000,
    currency: "cad"
).build()

self.refundCancelable = Terminal.shared.processRefund(refundParams) { processedRefund, processError in
    if let error = processError {
        print("processRefund failed. \(error)")
    } else if let refund = processedRefund, refund.status == .succeeded {
        print("processRefund successful! \(refund)")
    } else {
        print("Refund pending or unsuccessful.")
    }
}
```

#### Android

#### Kotlin

```kotlin
val refundParams = ProcessRefundParameters.ByChargeId(
  id = "ch_1FLyVV2eZvKYlo2C9Z8rmX02",
  amount = 1000,
  currency = "cad"
).build()

val refundCancelable = Terminal.getInstance().processRefund(
    refundParams,
    object : RefundCallback {
        override fun onSuccess(refund: Refund) {
            if (refund.status == "succeeded") {
                println("processRefund successful!")
            } else {
                println("Refund pending or unsuccessful.")
            }
        }

        override fun onFailure(e: TerminalException) {
            // Placeholder for handling exception
        }
    }
)
```

#### React Native

```tsx
const { refund, error } = await processRefund({
  chargeId: 'ch_1FLyVV2eZvKYlo2C9Z8rmX02',
  amount: 2000,
  currency: 'cad',
});

if (error) {
  // Handle error
  return;
}

if (!refund || refund.status !== 'succeeded') {
  // Refund pending or unsuccessful.
  return;
}

// Process refund successful!
```

