カスタマイズされた通知を送信する方法

Share

はじめに

こんにちは!この記事では、KOMOJUのWebhookによってトリガーされるカスタマイズされた通知をメールアドレスに送信する方法について説明します。また、AWS Lambda関数を使用してWebhookペイロードを処理する手順をガイドし、サンプルコードも提供します。

基本用語/サービス

「Webhook」や「ペイロード」といった用語に馴染みがない方のために、いくつかの基本的な概念とサービスについて簡単に説明します。

用語 定義 参考リンク
Webhook 特定のイベントが発生したときに、あるアプリケーションから別のアプリケーションにデータを送信するメカニズムです。通常、HTTP POSTリクエストを使用して行われます。 KOMOJU Webhooks
エンドポイント Webhookがデータを送信する場所です。 Lambda 関数 URL の作成と管理
ペイロード POSTリクエストと共に送信されるデータです。 ペイロードの例
イベント KOMOJU上で発生するアクションです。 KOMOJU イベント
シークレットトークン WebhookペイロードがKOMOJUから送信されていることを確認するために使用されます。 シークレットトークン
サーバーレス関数 特定のアクションを実行するためにトリガーされるステートレスなコードです。 AWS Lambda とは
AWS Lambda コードを実行するためのサーバーレスコンピュートサービスです。 AWS Lambda とは
AWS SES クラウドベースのメール送信サービスです。 Amazon SES を使用した E メール送信

はじめる前に

このガイドでは、次の内容について説明します:

  1. KOMOJUでWebhookを設定する方法。
  2. AWS Lambdaでサーバーレス関数を設定し、Webhookペイロードを処理する方法。
  3. AWS SESを設定し、Lambda関数がペイロードを処理した後にメールを送信する方法。
  4. Webhookペイロードが正常に処理され、Lambda関数が正しくメールを送信することを確認するためのテスト。

1. Webhookの設定

まず、KOMOJUでWebhookを設定します。
このガイドでは、 payment.captured イベントが発生したときにペイロードをエンドポイントに送信するWebhookを作成します(つまり、お客様の支払いがキャプチャされたときにトリガーされます)。 Webhookは、ダッシュボードの左側にある「管理」ドロップダウンメニューから「Webhooks」ページに移動して作成できます。
Webhookを設定するには、次のものが必要です:

  1. WebhookのURL
  2. シークレットキー
  3. Webhookをトリガーするイベント

現在URLがない場合は、一時的なURLを入力しておいてください。AWS Lambda関数の設定後に更新できます。シークレットキーは任意の値で設定可能で、後でKOMOJUから送信されるペイロードを確認するために使用します。イベントには payment.captured を有効にしてください。

2. AWS Lambdaでサーバーレス関数を設定する

次に、KOMOJUから送信されたWebhookペイロードを処理するための関数を設定します。
AWS Lambdaの設定に関する詳細は、こちらのチュートリアルをご覧ください。
これを設定するには、Webhookを処理するコードと前のステップで設定したシークレットキーが必要です。また、KOMOJUがペイロードを送信できるようにLambda関数の権限を設定する必要があります。 以下は、Node.jsでのサンプルコードです:

				
					import crypto from 'crypto';
import { SESClient, SendEmailCommand } from '@aws-sdk/client-ses';

// AWS SESクライアントを初期化
const sesClient = new SESClient({ region: 'ap-northeast-1' });

// Lambdaハンドラー
export const handler = async (event) => {
  try {
    const WEBHOOK_SECRET_TOKEN = process.env.SECRET_KEY;

    // リクエストボディと署名をヘッダーから取得
    const requestBody = event.body ? event.body.toString() : '';
    const komojuSignature = event.headers['X-Komoju-Signature'] || event.headers['x-komoju-signature'];

    // 受信したWebhookペイロードをログに記録
    console.log('Incoming webhook payload:', requestBody);

    if (!komojuSignature) {
      console.error('署名がありません');
      return {
        statusCode: 400,
        body: JSON.stringify({ message: '署名がありません' }),
      };
    }

    // 署名を検証
    const computedSignature = crypto
      .createHmac('sha256', WEBHOOK_SECRET_TOKEN)
      .update(requestBody, 'utf8')
      .digest('hex');

    if (Buffer.byteLength(computedSignature) !== Buffer.byteLength(komojuSignature)) {
      console.error('署名の長さが一致しません');
      return {
        statusCode: 400,
        body: JSON.stringify({ message: '署名の長さが一致しません' }),
      };
    }

    if (!crypto.timingSafeEqual(Buffer.from(computedSignature), Buffer.from(komojuSignature))) {
      console.error('無効な署名です');
      return {
        statusCode: 400,
        body: JSON.stringify({ message: '無効な署名です' }),
      };
    }

    // KOMOJUからのWebhookペイロードを解析し、必要な情報を抽出
    const { data: { id: paymentId, total: totalAmount, payment_details: { email }, created_at: createdAt } } = JSON.parse(requestBody);

    // メール本文の内容
    const body = `こんにちは、

支払いを受け取りました:

支払いID: ${paymentId}
合計金額: ${totalAmount} JPY
支払い日: ${createdAt}`;

    // メール本文をコンソールに記録
    console.log('Email body:', body);

    // AWS SESを使用してメールを送信
    const params = {
      Source: 'sender@example.com', // SESで検証済みのメールアドレスに置き換えてください
      Destination: {
        ToAddresses: ["receiver@example.com"], // 送信先のメールアドレスに置き換えてください
      },
      Message: {
        Subject: {
          Data: `支払い確認 - 支払いID: ${paymentId}`,
        },
        Body: {
          Text: {
            Data: body,
          },
        },
      },
    };

    const command = new SendEmailCommand(params);
    await sesClient.send(command);

    // 成功レスポンスを返す
    return {
      statusCode: 200,
      body: JSON.stringify({ message: 'メールが正常に送信されました。' }),
    };
  } catch (error) {
    console.error('メール送信中のエラー:', error);
    return {
      statusCode: 500,
      body: JSON.stringify({ message: 'メールの送信に失敗しました。' }),
    };
  }
};
				
			

このコードは以下の操作を行います:

  1. KOMOJUから送信された署名が一致していることを検証
  2. 支払いID、合計金額、支払い日をWebhookペイロードから解析
  3. sender@example.com から receiver@example.com にAWS SESを使ってメールを送信

コード内で次の値を置き換える必要があります:

  1. AWSリージョン
  2. KOMOJUのWebhookシークレット(関数設定で環境変数として保存)
  3. メール本文の内容
  4. 送信者、受信者のメールアドレス

コードをローカルに保存し、npm install で必要なパッケージをインストールし、ディレクトリをZIPファイルに圧縮してからLambda関数にアップロードしてください。
注意: サンプルコードにはメールテンプレートが直接含まれていますが、AWS SESでメール本文をテンプレートとして作成することも可能です。

3. AWS SESの設定

メールを送信するために、AWS SESでアイデンティティを設定する必要があります。以下のガイドに従ってください:
Amazon SES の ID の作成と検証
Lambda関数コードで指定した送信者アドレスと、SESに登録したメールアドレスが一致していることを確認してください。

4. レビューとテスト

最後に、統合が機能することをテストする必要があります。進める前に、以下を確認してください:

  1. KOMOJUのWebhook URLをLambda関数のURL(または他の適用可能なURL)に更新したこと
  2. KOMOJUのWebhookシークレットが適切に保存され、関数コードに反映されていること
  3. Lambda関数がアクセス可能であること
  4. Lambda関数がSESにアクセスするための必要な権限を持っていること
以下は4. のサンプルポリシーです:
				
					{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "ses:SendEmail",
            "Resource": "arn:aws:ses:ap-northeast-1:123456123456:identity/sender@example.com",
            "Condition": {
                "StringEquals": {
                    "ses:FromAddress": "sender@example.com"
                }
            }
        }
    ]
}
				
			
すべて設定し終えたら、KOMOJUのマーチャントアカウントを使用して支払いを行います。正しく構成されていれば、コード内で指定した受信者アドレスにメールが届くはずです。

今回もお読みくださりありがとうございました!次回もお楽しみに。

Stay up to date

Sign up to receive the latest news to your email

Payment methods

All Payment Methods