はじめに
こんにちは!この記事では、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 メール送信 | 
はじめる前に
このガイドでは、次の内容について説明します:
- KOMOJUでWebhookを設定する方法。
- AWS Lambdaでサーバーレス関数を設定し、Webhookペイロードを処理する方法。
- AWS SESを設定し、Lambda関数がペイロードを処理した後にメールを送信する方法。
- Webhookペイロードが正常に処理され、Lambda関数が正しくメールを送信することを確認するためのテスト。
1. Webhookの設定
まず、KOMOJUでWebhookを設定します。
このガイドでは、 payment.captured イベントが発生したときにペイロードをエンドポイントに送信するWebhookを作成します(つまり、お客様の支払いがキャプチャされたときにトリガーされます)。 Webhookは、ダッシュボードの左側にある「管理」ドロップダウンメニューから「Webhooks」ページに移動して作成できます。 
Webhookを設定するには、次のものが必要です:
- WebhookのURL
- シークレットキー
- 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: 'メールの送信に失敗しました。' }),
    };
  }
}; 
				
			
		このコードは以下の操作を行います:
- KOMOJUから送信された署名が一致していることを検証
- 支払いID、合計金額、支払い日をWebhookペイロードから解析
- sender@example.comから- receiver@example.comにAWS SESを使ってメールを送信
コード内で次の値を置き換える必要があります:
- AWSリージョン
- KOMOJUのWebhookシークレット(関数設定で環境変数として保存)
- メール本文の内容
- 送信者、受信者のメールアドレス
コードをローカルに保存し、npm install で必要なパッケージをインストールし、ディレクトリをZIPファイルに圧縮してからLambda関数にアップロードしてください。
注意: サンプルコードにはメールテンプレートが直接含まれていますが、AWS SESでメール本文をテンプレートとして作成することも可能です。
3. AWS SESの設定
メールを送信するために、AWS SESでアイデンティティを設定する必要があります。以下のガイドに従ってください:
Amazon SES の ID の作成と検証 
Lambda関数コードで指定した送信者アドレスと、SESに登録したメールアドレスが一致していることを確認してください。
4. レビューとテスト
最後に、統合が機能することをテストする必要があります。進める前に、以下を確認してください:
- KOMOJUのWebhook URLをLambda関数のURL(または他の適用可能なURL)に更新したこと
- KOMOJUのWebhookシークレットが適切に保存され、関数コードに反映されていること
- Lambda関数がアクセス可能であること
- Lambda関数がSESにアクセスするための必要な権限を持っていること
				
					{
    "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"
                }
            }
        }
    ]
} 
				
			
		 
															今回もお読みくださりありがとうございました!次回もお楽しみに。
 
															 
										 
										 
										















