# Stripe アプリの仕組み

Stripe でアプリを作成する方法をご紹介します。

Stripe Apps を利用すれば、Stripe ダッシュボードに直接カスタム機能を組み込み、Stripe API をオーケストレーションできます。アプリを構築することで、以下のことが可能になります。

- 顧客情報、注文、請求書などの Stripe データを作成および変更する
- Stripe データを他のシステムに同期
- Stripe のユーザーインターフェイスへのカスタマイズを追加する

Stripe Apps で構築できる内容の詳細な例については、[サンプルアプリ](https://docs.stripe.com/stripe-apps/sample-apps.md)をご覧ください。

Stripe Apps の基本コンポーネント:

Stripe Apps の基本コンポーネント (See full diagram at https://docs.stripe.com/stripe-apps/how-stripe-apps-work)

```text
[Stripe API] --> [UI 拡張機能]
[UI 拡張機能] --> [Stripe API]
[サーバー] --> [UI 拡張機能]
[UI 拡張機能] --> [サーバー]
[Stripe API] -- イベントを取得 --> [サーバー]
[サーバー] -- Stripe にデータを送信 --> [Stripe API]
```

Stripe Apps を使用すると、自分のアカウント用のカスタムアプリを作成したり、[Stripe App Marketplace](https://docs.stripe.com/stripe-apps/distribution-options.md) 経由で他の Stripe ユーザーが自分のアプリを使用できるようにしたりできます。

このガイドを使用して、構築できる 3 つの Stripe Apps タイプと、権限を使用してアプリが必要とする情報にアクセスする方法をご確認ください。

## フルスタックアプリケーション

ほとんどの Stripe Apps には、次の 2 つのコンポーネントがあります。

- *UI 拡張機能* (A set of APIs that allow you to inject user interface elements into the Stripe Dashboard using TypeScript and React)を使用する、Stripe ダッシュボードのフロントエンドコンポーネント
- 状態の保存とバックグラウンド操作の実行を担うバックエンドコンポーネント
![フルスタックアプリケーションのコンポーネント](https://b.stripecdn.com/docs-statics-srv/assets/stripe-apps-full-stack-app.2a8251568ced0f8fa10193d8150aad23.png)

フルスタックアプリケーションのコンポーネント

アプリの UI と対応するバックエンドサービス間の認証は、[OAuth](https://docs.stripe.com/stripe-apps/pkce-oauth-flow.md) または[共有シークレット](https://docs.stripe.com/stripe-apps/build-backend.md#authenticate-ui-to-backend)を使用して行われます。

> フルスタック Stripe アプリを構築するときは、まず [UI Extensions の仕組み](https://docs.stripe.com/stripe-apps/how-ui-extensions-work.md)を、次に、必要に応じて[サーバー側のロジック](https://docs.stripe.com/stripe-apps/build-backend.md)をご覧ください。

## バックエンド専用アプリケーション

UI のない Stripe アプリを構築できます。たとえば、アプリで Stripe から注文データを収集し、フルフィルメントのためにそのデータを別のサービスに送信することが考えられます。

バックエンド専用アプリケーションのコンポーネント:

バックエンド専用アプリのコンポーネント (See full diagram at https://docs.stripe.com/stripe-apps/how-stripe-apps-work)

```text
[Stripe API] -- イベントを取得 --> [サーバー]
[サーバー] -- Stripe にデータを送信 --> [Stripe API]
```

アプリのバックエンドで実行できる処理の詳細については、[サーバー側のロジック](https://docs.stripe.com/stripe-apps/build-backend.md)を確認してください。

## フロントエンド専用アプリケーション

Stripe ダッシュボードを拡張し、追加のバックエンド機能を含めないアプリを構築できます。*UI* (A set of APIs that allow you to inject user interface elements into the Stripe Dashboard using TypeScript and React) のみで Stripe アプリを構成できます。UI 拡張機能を使用して、カスタムの UI を作成し、Stripe ダッシュボードのどこにどのように表示されるかを制御します。
![フロントエンド専用アプリケーションのコンポーネント](https://b.stripecdn.com/docs-statics-srv/assets/stripe-apps-frontend-only-app.f8a4611260e353f1d19028ad5efda70f.png)

フロントエンド専用アプリケーションのコンポーネント

UI 拡張機能を使用するフロントエンド専用アプリケーションは、以下の場合に適しています。

- アプリケーションがバックエンドサービスと通信する必要がない場合
- アプリケーションが Stripe API と通信する必要があるのは、Stripe ダッシュボードにサインインしているユーザーの代理としてのみである場合。
- アプリケーションがユーザーの認証と、他のサービスとの対話に OAuth プロバイダーを使用する場合。

詳細については、[UI Extensions の仕組み](https://docs.stripe.com/stripe-apps/how-ui-extensions-work.md)をご覧ください。

## Stripe Apps の制限事項

### Connect アカウントアクセス

Connect プラットフォームがアプリをインストールすると、そのアプリはプラットフォームのデータにアクセスできます。ただし、プラットフォームの Connect アカウントのデータにはアクセスできず、それらの Connect アカウントに代わって API コールを行うこともできません。

Connect アカウントが直接アプリをインストールした場合、そのアプリは完全な機能を持ちます。アプリをインストールできるのは特定の Connect アカウントのみで、完全な Stripe ダッシュボードへのアクセス権を持つアカウント ([Standard アカウント](https://docs.stripe.com/connect/standard-accounts.md) を含む) や [Embedded Stripe Apps](https://docs.stripe.com/stripe-apps/embedded-apps.md) を通じたアカウントなどが該当します。

### 開発者アカウントへのアプリのインストール

開発者がアプリ作成に使用したアカウントと同じアカウントにそのアプリをインストールする場合、Stripe は開発者とインストーラーの間に `Connection` オブジェクトを作成しません。そのため、インストールされたアプリに対して Connect Webhook は送信されません。

連結アカウントにおけるインストールの Webhook 動作を再現するには、開発者自身のアカウントで Webhook を設定する必要があります。また、開発者のアカウントには要求されたすべての権限がすでに備わっているため、Stripe がアプリに権限を付与することはありません。

## アプリの権限

すべての Stripe アプリは、タイプに関係なく、データにアクセスするための明示的な権限を必要とします。この権限は、次の 2 つの種類に分類されます。

- アプリケーションが読み書きできる Stripe オブジェクトを決定する Stripe 権限
- ユーザーの Stripe データにアクセスできる他のサービスを決定するサードパーティー権限

*アプリマニフェスト* (In a Stripe App, the app manifest is a stripe-app.json file in your app's root directory. It defines your app's ID, views, permissions, and other essential properties)には、アプリに付与された Stripe とサードパーティーの権限が保存されます。

### Stripe 権限

アプリが Stripe データにアクセスできるようにするには、そのデータに対する権限をアプリに付与する必要があります。すべての[権限](https://docs.stripe.com/stripe-apps/reference/permissions.md)のリストをご覧ください。

権限は、いくつかの方法で適用されます。

- アプリが Stripe オブジェクトの *Webhook イベント* (A webhook is a real-time push notification sent to your application as a JSON payload through HTTPS requests)をリッスンできるのは、そのオブジェクトを読み取る権限がある場合のみです。
- アプリが Stripe API コールを実行できるのは、その API がアプリケーションに権限を付与している場合のみです。
- アプリが UI 拡張機能から Stripe API を呼び出すときは、アプリとサインインユーザーの両方に、その API にアクセスする権限がある必要があります。

UI 拡張機能は、サインインユーザーの代わりに Stripe API を呼び出します。アプリには、サインインユーザーができないデータへのアクセスやアクションの実行はできません。アプリが要求しなかった権限がサインインユーザーにある場合でも、アプリはそのデータの読み書きを実行できません。ただし、サインインユーザーにない権限がアプリにある場合、アプリにその実行権限がある限り、アクションを実行できます。この場合、バックエンドサービスが、ユーザーの権限を確認します。

### サードパーティーサービス

Stripe Apps では、Stripe データを受け取る可能性がある Stripe 以外のサービスの URL を明示的にリストする必要もあります。

UI 拡張機能では、コンテンツセキュリティーポリシー (CSP) を適用することでアクセス可能な URL が実行されます。このポリシーにより、`fetch` コールは、*アプリマニフェスト* (In a Stripe App, the app manifest is a stripe-app.json file in your app's root directory. It defines your app's ID, views, permissions, and other essential properties)に明示的にリストされていない限り、すべて失敗します。

### 権限の付与

*アプリマニフェスト* (In a Stripe App, the app manifest is a stripe-app.json file in your app's root directory. It defines your app's ID, views, permissions, and other essential properties)には、アプリケーションのすべての権限が保存されます。特定の Stripe オブジェクトやバックエンドサービスに権限を付与するには、アプリのアップロード時に `stripe app grant` コマンドを使用します。詳細については、すべての[権限](https://docs.stripe.com/stripe-apps/reference/permissions.md)のリストを確認してください。

## See also

- [アプリを作成する](https://docs.stripe.com/stripe-apps/create-app.md)
- [Stripe App CLI リファレンス](https://docs.stripe.com/stripe-apps/reference/cli.md)
- [UI Extensions の仕組み](https://docs.stripe.com/stripe-apps/how-ui-extensions-work.md)
- [サーバー側のロジック](https://docs.stripe.com/stripe-apps/build-backend.md)
- [認証フロー](https://docs.stripe.com/stripe-apps/pkce-oauth-flow.md)
