💡Stripe SDK を Cloudflare Workers で使うと接続エラーが発生します。Stripe.createFetchHttpClient() で Fetch API ベースに切り替える解決策と、Webhook 設定までの全フローを解説します。
はじめに
Stripe Checkout でサブスクリプション決済を実装しているアプリを Cloudflare Workers に移行したところ、Stripe API への接続でエラーが発生しました。原因と解決策を共有します。
この記事でわかること
-
Workers で Stripe SDK が動かない原因
-
Stripe.createFetchHttpClient() による解決方法
-
Workers 環境での Stripe Webhook 設定
-
デバッグのコツ
対象読者
前提条件
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 ベースのクライアントを使用します。
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 エンドポイントを作成します。
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
1️⃣Stripe のエラーメッセージは「connection to Stripe」としか出ないため、原因特定が難しいです。デバッグ時はレスポンスボディにエラー詳細を一時的に含めると原因特定しやすいです。
2️⃣Workers Secret の設定は wrangler secret put コマンドで行います。wrangler.jsonc には書かないでください。
まとめ
-
Stripe SDK はデフォルトで Node.js http を使うため Workers でエラー
-
Stripe.createFetchHttpClient() で Fetch API ベースに切り替えて解決
-
Webhook Secret は wrangler secret put で設定
-
エラーメッセージが曖昧なので、デバッグ時はレスポンスに詳細を含めるのがコツ