[日本語訳] Deno環境でStripeのNode.js SDKを利用する方法

:::note
この記事は、[dev.to](https://dev.to/stripe)に公開されている[Richard Marmorstein氏](https://twitter.com/twitchard)によって書かれた英語記事の日本語訳です。


元記事: [stripe-node with Deno](https://dev.to/stripe/stripe-node-with-deno-1fc4)
:::

## はじめに

この投稿では、Deno環境での`stripe-node`の使用方法を示します。この記事の他にも、[動画チュートリアル](https://www.youtube.com/watch?v=epCHqHEdz8I)やstripe-nodeリポジトリ自体にある[Denoの例](https://github.com/stripe/stripe-node/blob/master/examples/webhook-signing/deno/main.ts)、さらにはGithubで閲覧・クローン可能な[Stripeのサンプル](https://github.com/stripe-samples/stripe-node-deno-samples/blob/main/checkout-integration/main.js)があります。コードだけを見たい場合はGithubへどうぞ。コードサンプルをドラマチックな解説と共に観たい場合は、こちらにとどまってください。

## 背景

2023年初め、`stripe-node`の[v11.15.0](https://github.com/stripe/stripe-node/releases/tag/v11.15.0)で、stripe-nodeをESモジュールとしてインポートするサポートを追加しました。これにより、Cloudflare WorkersやDenoのようなNodeJS以外のランタイム環境でStripeを利用することが非常に便利になりました。皮肉なことに、「stripe-node」という名前は今や少し語弊があるかもしれません。もうNodeだけではありません。`stripe-server-js`の方が正確かもしれませんが、言い回しがそこまでスムーズではないですね。とはいえ、`stripe-node`のままにしておきましょう。私たちの意味するところは理解してもらえると確信しています。

## 前提条件

- Stripe CLIのインストールが必要です
- Denoのバージョンは[1.28](https://github.com/denoland/deno/releases/tag/v1.28.0)以降が必要です

## プロジェクトの開始

ゼロから始める場合は、ここで`deno init`を実行しましょう。すでにDenoプロジェクトがある場合はざっと進めていると言えますね！しかし、残りの手順を適応する必要があるかもしれません。

## Stripeのインポート

`deno init`はいくつかのファイルを作成しますが、その中にはアプリのエントリポイントである`main.ts`も含まれています。これをコードエディタで開きます。Denoでは`npm install`の必要はありません。このように書くだけです。

```typescript
import Stripe from "npm:stripe@^13.0.0"
```

この記事を書いている時点で、`13.x.x`はstripe-nodeの最新のメジャーバージョンですが、未来から来た方は`npm view stripe version`で最新バージョンを確認してください。

:::note warn
**注意：** stripe-nodeのnpmバージョンをインポートする必要があります。unpkg.comやdeno.landのバージョンは、ソースコードのインポート文の書き方の関係でうまく機能しないことがあります。
:::

## Denoのインポートマップの使用

複数のファイルで`stripe`をインポートする場合は、Stripeライブラリの更新時にすべてのインポート文を更新するのは面倒かもしれません。この場合は、[Denoのインポートマップ](https://deno.land/manual@v1.36.4/basics/import_maps)を使用したいところ。インポート文を以下のように変更する必要があります。

```diff
- import Stripe from "npm:stripe@^13.0.0"
+ import Stripe from "stripe"
```

そして、`deno.jsonc`を編集して、"imports"マップにstripeのエントリを追加します。

```json
{
  "tasks": {
    "dev": "deno run --watch main.ts"
  },
  "imports": {
    "stripe": "npm:stripe@^13.0.0"
  }
}
```

これで完了です！

## Stripeの使用

Denoでは、他のTypeScriptコードベースと同じようにStripeを使用します。たとえば、顧客のリストを取得するAPIコールを行いたい場合、次のようにStripeクライアントを初期化し、APIコールを行います。

```typescript
const stripe = new Stripe("<YOUR (TEST MODE) API KEY GOES HERE>", {
  apiVersion: "2023-08-16",
})

if (import.meta.main) {
  const customers = await stripe.customers.list({limit: 5})
  console.log(customers.data.length)
  console.log(customers.data.map(c => c.email))
}
```

このコードは、APIキーを設定し、5件の顧客を取得した上でその数とメールアドレスをコンソールに出力します。

## Fetchとnpm:https

最近のDenoバージョンでは、Nodeの標準ライブラリ用の互換シムが追加されたため、このコードはそのままで機能するはずです。Nodesの互換モードが導入される前のDenoバージョンでは（[v1.15](https://deno.com/blog/v1.15#improving-node-compatibility)で導入、[1.28](https://deno.com/blog/v1.28)で安定化）、以下のように書く必要がありました。

```typescript
const stripe = new Stripe("<YOUR API KEY GOES HERE>", {
  apiVersion: "2023-08-16",
  httpClient: Stripe.createFetchHttpClient(),
})
```

これは、Nodeの標準ライブラリである`node:https`モジュール（stripe-nodeがデフォルトで使用しようとするもの）の代わりに、「fetch」API（ウェブおよびDenoにネイティブ）を使用することをstripe-nodeに伝えるためです。新しいDenoバージョンであっても、互換レイヤーを飛ばして舞台裏をシンプルに保つためにこれを行うことをお勧めします。

## 型チェック、実行、許可を求める

コードを実行する前に、型チェックを行いましょう。

```shell
$ deno check main.ts
```

もし何かしらのエラーが出れば、それに対処し、`deno check main.ts`を再実行して、問題が解消されたらプログラムを実行します。

```shell
$ deno run main.ts
```

Denoの特徴的な「パーミッションシステム」が働きます。ある程度の不便と引き換えに、心の平安を提供します。`api.stripe.com`がドメイン名として表示されれば、誰も`stripe-node`の供給を悪用してあなたのStripeの資格情報を別のドメインに送信していないとわかります。`y`を押してプログラムを実行しましょう。

その後、プロンプトをバイパスするためにコマンドラインフラグを使用して実行します。

```shell
$ deno run --allow-net=api.stripe.com main.ts
```

これはかなり長いので、`deno.jsonc`に「タスク」として作成し、毎回タイプする必要がないようにすることをお勧めします。

```json
{
  "tasks": {
    "dev": "deno run --watch --allow-net=api.stripe.com main.ts"
  }
}
```

以上で、Deno環境におけるstripe-nodeの基本的な使用方法を説明しましたが、次に考慮すべきステップがいくつかあります。

- 署名シークレットとAPIキーに環境変数を使用する
- ローカルホストではなくインターネット上のサーバーにデプロイし、そのサーバーにStripeイベントを送信するためのウェブフックエンドポイントを作成する
- アプリに実際に必要なStripe関連のロジックを書く。顧客のリストは始まりに過ぎません

最後に、stripe-nodeのDenoサポートに問題があると感じたり、提案がある場合は、いつでも[github.com/stripe/stripe-node](https://github.com/stripe/stripe-node/issues)でGithub issueのフィードバックを残せるという言葉をお届けします。幸運を祈ります！