

【トラブルシューティング】Stripe SDK を Cloudflare Workers で動かす
Stripe.createFetchHttpClient() で Fetch API ベースに切り替える解決策と、Webhook 設定までの全フローを解説します。はじめに
Stripe Checkout でサブスクリプション決済を実装しているアプリを Cloudflare Workers に移行したところ、Stripe API への接続でエラーが発生しました。原因と解決策を共有します。
この記事でわかること
-
Workers で Stripe SDK が動かない原因
-
Stripe.createFetchHttpClient()による解決方法 -
Workers 環境での Stripe Webhook 設定
-
デバッグのコツ
対象読者
-
Stripe SDK を Cloudflare Workers で使おうとしてエラーになった方
-
サーバーレス環境で Stripe を動かしたい方
前提条件
-
Stripe SDK v12+
-
Cloudflare Workers デプロイ環境
-
Stripe アカウント
1. エラーの内容
Workers 上で Stripe Checkout Session を作成すると、以下のエラーが発生します。
An error occurred with our connection to Stripe.
Request was retried 2 times.
原因
Stripe SDK はデフォルトで Node.js の http/https モジュールを使って HTTP リクエストを送信します。Cloudflare Workers にはこれらのモジュールが存在しないため、接続エラーになります。
2. 解決策: Fetch API ベースの HTTP クライアント
Stripe SDK に内蔵されている Fetch API ベースのクライアントを使用します。
// src/lib/stripe.ts
import Stripe from "stripe";
if (!process.env.STRIPE_SECRET_KEY) {
throw new Error("STRIPE_SECRET_KEY is not set");
}
export const stripe = new Stripe(process.env.STRIPE_SECRET_KEY, {
typescript: true,
httpClient: Stripe.createFetchHttpClient(),
});
Stripe.createFetchHttpClient() は Stripe SDK v12+ に内蔵されている Fetch API ベースのクライアントです。Workers の Fetch API と完全互換で、この 1 行を追加するだけで解決します。3. Workers での Webhook 設定
Stripe CLI で Webhook エンドポイントを作成します。
# Webhook エンドポイント作成
stripe webhook_endpoints create \
--url https://your-app.workers.dev/api/stripe/webhook \
--enabled-events checkout.session.completed,customer.subscription.updated,customer.subscription.deleted
Webhook Secret を Workers の環境変数に設定します。
npx wrangler secret put STRIPE_WEBHOOK_SECRET
4. 検証したフロー
以下の全フローが Workers 上で動作することを確認しました。
-
/api/stripe/checkout→ Stripe 決済ページにリダイレクト -
テストカード(4242 4242 4242 4242)で決済完了
-
Webhook で
checkout.session.completedイベント受信 -
DB のユーザープランが
proに更新 -
/api/stripe/portal→ Customer Portal でプラン管理
Tips
wrangler secret put コマンドで行います。wrangler.jsonc には書かないでください。まとめ
-
Stripe SDK はデフォルトで Node.js
httpを使うため Workers でエラー -
Stripe.createFetchHttpClient()で Fetch API ベースに切り替えて解決 -
Webhook Secret は
wrangler secret putで設定 -
エラーメッセージが曖昧なので、デバッグ時はレスポンスに詳細を含めるのがコツ


