はじめに
こんにちは!この記事では、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"
}
}
}
]
}
今回もお読みくださりありがとうございました!次回もお楽しみに。