この記事は、dev.toに公開されているRichard Marmorstein氏によって書かれた英語記事の日本語訳です。
はじめに
この投稿では、Deno環境でのstripe-node
の使用方法を示します。この記事の他にも、動画チュートリアルやstripe-nodeリポジトリ自体にあるDenoの例、さらにはGithubで閲覧・クローン可能なStripeのサンプルがあります。コードだけを見たい場合はGithubへどうぞ。コードサンプルをドラマチックな解説と共に観たい場合は、こちらにとどまってください。
背景
2023年初め、stripe-node
のv11.15.0で、stripe-nodeをESモジュールとしてインポートするサポートを追加しました。これにより、Cloudflare WorkersやDenoのようなNodeJS以外のランタイム環境でStripeを利用することが非常に便利になりました。皮肉なことに、「stripe-node」という名前は今や少し語弊があるかもしれません。もうNodeだけではありません。stripe-server-js
の方が正確かもしれませんが、言い回しがそこまでスムーズではないですね。とはいえ、stripe-node
のままにしておきましょう。私たちの意味するところは理解してもらえると確信しています。
前提条件
- Stripe CLIのインストールが必要です
- Denoのバージョンは1.28以降が必要です
プロジェクトの開始
ゼロから始める場合は、ここでdeno init
を実行しましょう。すでにDenoプロジェクトがある場合はざっと進めていると言えますね!しかし、残りの手順を適応する必要があるかもしれません。
Stripeのインポート
deno init
はいくつかのファイルを作成しますが、その中にはアプリのエントリポイントであるmain.ts
も含まれています。これをコードエディタで開きます。Denoではnpm install
の必要はありません。このように書くだけです。
import Stripe from "npm:stripe@^13.0.0"
この記事を書いている時点で、13.x.x
はstripe-nodeの最新のメジャーバージョンですが、未来から来た方はnpm view stripe version
で最新バージョンを確認してください。
注意: stripe-nodeのnpmバージョンをインポートする必要があります。unpkg.comやdeno.landのバージョンは、ソースコードのインポート文の書き方の関係でうまく機能しないことがあります。
Denoのインポートマップの使用
複数のファイルでstripe
をインポートする場合は、Stripeライブラリの更新時にすべてのインポート文を更新するのは面倒かもしれません。この場合は、Denoのインポートマップを使用したいところ。インポート文を以下のように変更する必要があります。
- import Stripe from "npm:stripe@^13.0.0"
+ import Stripe from "stripe"
そして、deno.jsonc
を編集して、"imports"マップにstripeのエントリを追加します。
{
"tasks": {
"dev": "deno run --watch main.ts"
},
"imports": {
"stripe": "npm:stripe@^13.0.0"
}
}
これで完了です!
Stripeの使用
Denoでは、他のTypeScriptコードベースと同じようにStripeを使用します。たとえば、顧客のリストを取得するAPIコールを行いたい場合、次のようにStripeクライアントを初期化し、APIコールを行います。
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で導入、1.28で安定化)、以下のように書く必要がありました。
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バージョンであっても、互換レイヤーを飛ばして舞台裏をシンプルに保つためにこれを行うことをお勧めします。
型チェック、実行、許可を求める
コードを実行する前に、型チェックを行いましょう。
$ deno check main.ts
もし何かしらのエラーが出れば、それに対処し、deno check main.ts
を再実行して、問題が解消されたらプログラムを実行します。
$ deno run main.ts
Denoの特徴的な「パーミッションシステム」が働きます。ある程度の不便と引き換えに、心の平安を提供します。api.stripe.com
がドメイン名として表示されれば、誰もstripe-node
の供給を悪用してあなたのStripeの資格情報を別のドメインに送信していないとわかります。y
を押してプログラムを実行しましょう。
その後、プロンプトをバイパスするためにコマンドラインフラグを使用して実行します。
$ deno run --allow-net=api.stripe.com main.ts
これはかなり長いので、deno.jsonc
に「タスク」として作成し、毎回タイプする必要がないようにすることをお勧めします。
{
"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でGithub issueのフィードバックを残せるという言葉をお届けします。幸運を祈ります!