Hero img
StripeのWebHook

Stripeの通知を受け取るWebHook

Stripeで発生したイベントの通知を受け取るWebhookを使ってイベントの通知を受け取る。


目次

  • Stripe Webhook
  • Stripeで設定する
  • ローカルの環境でテスト
  • CLIをダウンロードする
  • webhook転送を有効にし確認してみる
  • サーバーを起動させる
  • まとめ

Stripe Webhook

StripeではWebhookを用意してくれています。そのため、Stripeで商品関連、決済関連、カスタマー関連、リンク関連 作成、追加変更、支払い完了等ほぼ全てのイベントの通知を受け取ることができます。あまりにも多いので、今回は支払い完了時にイベントを受け取るWebhookを使ってみます。
local環境でもテストができるようになっているので開発がし易い点も非常にありがたいです。

Stripeで設定する

Webhookを使うにはまずstirpeのウェブページで設定をする必要があります。
開発者のwebhookのページを開いてエンドポイントを追加します。 ページを探せない場合ここからでも開けます。

stripe-webhookpage

ローカルの環境でテスト

まずはローカルの環境でテストをしてみます。
ローカルの環境でテストするためには、CLIソフトが必要になっています。私の場合windowsなのでwindows用のソフトをダウンロードします。

CLIをダウンロードする

stripe-webhook-cli-site stripe-webhook-cli-downloadpage
stripe-webhook-download

解凍したら「stripe.exe」ができるのでコマンドプロンプトで起動しloginを実行します。
ブラウザーで認証の確認ページが表示されるので認証許可をします。 stripe-webhook-cli-login

webhook転送を有効にし確認してみる

stripeでwebhookを転送を実行をします。 ポートは各自お好みで変更できます。

stripe listen --forward-to localhost:4242/webhook

コマンドプロンプトをもう一つ開きイベントを実行して見ます。

stripe trigger payment_intent.succeeded

成功すると次のように-->charge.succeededとなります。 ここでエラーが発生しているのはlocal:4242/webhookにpostが失敗したからです。何もサーバーを起動していないので当たり前ですが...

stripe-webhook-cli-demo

サーバーを起動させる

次にNext.jsでサーバーを起動させてPOSTメッセージを受け取ってみます。

api/webhook/route.ts
import { NextResponse, NextRequest } from 'next/server';
import Stripe from 'stripe';
import { buffer } from "node:stream/consumers";
const stripe = new Stripe(process.env.NEXT_PUBLIC_STRIPE_SECKEY || '', {})
const endpointSecret = "whsec_163c10xxxxxxxxxxxxxxxxxxxxxxxxxxxf31191323h5s03013gj2852cfb46984";
//endpointSecretを変更してください

export const POST = async (req: NextRequest, res: NextResponse) => {
    const rawBody = await buffer(req.body);
    let event;
    try {
        event = stripe.webhooks.constructEvent(
            rawBody,
            req.headers.get("stripe-signature") as string,
            endpointSecret
        );
    } catch (err) {
        return NextResponse.json(
            { message: "Error" },
            { status: 400 }
        );
    }

    // Handle the event
    switch (event.type) {
            case 'payment_intent.succeeded':
            const paymentIntentSucceeded = event.data.object;
            console.log(paymentIntentSucceeded);

      break;

        default:
            console.log(`Unhandled event type ${event.type}`);
    }


    return NextResponse.json(
        { message: "successfully received" },
        { status: 200 }
    );
};

endpointSecret

endpointSecretは適切な値に設定してください。

endpointSecret

ブラウザーまたは、コマンドから確認ができます。 本番環境用はまた別になりますのでご確認ください。

stripe-webhook-endpoint-secret-browser stripe-webhook-endpiont-secret-cmmand
stripe-webhook-endpoint-secret-check

Nextjsで確認

  1. 1.Next.jsを起動します。
npm run dev
  1. 2.デフォルトでport 3000で起動するため、stripe.exeの起動もポートと、パスを変更します。
stripe listen --forward-to localhost:3000/api/webhook
  1. 3.最後にテストでイベントを発生させるstirpe.exeを起動させます。
stripe trigger payment_intent.succeeded

このようにコマンドプロンプトが3つ開いてテストします。 stripe-webhook-nextjstest

イベントリスト

webhookのイベントはここで確認ができます。

stripe-webhook-events

まとめ

サーバーでイベントの取得ができました。これでstripeでイベント実行された場合でもlineや、メールに通知することですぐに状況が分かります。
bot等で自動メール送信してもいいですね。

関連記事

コメント

コメントを書く

質問や、間違いがありましたら、お気軽にどうぞ

※お名前とコメントの内容を入力してください。
※全てこのブログ上に公表されます。
※許可なく管理者によって修正・削除する場合がございます。 詳しくはプライバシーポリシーを参照ください