Documentation Index
Fetch the complete documentation index at: https://waffo.com/docs/llms.txt
Use this file to discover all available pages before exploring further.
各 Webhook リクエストのヘッダーには X-SIGNATURE が含まれており、Waffo の秘密鍵で署名されています。加盟店は Waffo の公開鍵を使用して署名を検証する必要があります。
Waffo 公開鍵の取得
マーチャントポータル → Integration メニューにログインすると、Waffo 公開鍵を確認してコピーできます。
このページにアクセスするには、Dev または Admin ロールの権限が必要です。
推奨アプローチ: SDK を使用する
SDK の handleWebhook() メソッドは、署名検証、イベント解析、ルーティング、応答の署名を自動的に実行します。
app.post('/webhook', express.raw({ type: 'application/json' }), async (req, res) => {
const body = req.body.toString();
const signature = req.headers['x-signature'] as string;
const result = await waffo.webhook().handleWebhook(body, signature);
res.setHeader('X-SIGNATURE', result.responseSignature);
res.setHeader('Content-Type', 'application/json');
res.status(200).send(result.responseBody);
});
手動での検証
SDK を使用せず手動で処理する必要がある場合、検証手順は以下のとおりです。
署名の取得
リクエストヘッダーから X-SIGNATURE を取得します。
生のボディの取得
生のリクエストボディ文字列を取得します (JSON のパース後に再度文字列化しないでください)。
署名の検証
Waffo 公開鍵と SHA256WithRSA を使用して署名を検証します。
イベントの処理
署名検証が通ったあとにイベントを処理します。
応答の署名
応答に X-SIGNATURE ヘッダーを設定する必要があります (加盟店の秘密鍵で応答ボディを署名してください)。
手動実装の例
import { createVerify, createSign } from 'crypto';
function verifyWaffoSignature(body: string, signature: string): boolean {
const verify = createVerify('SHA256');
verify.update(body);
return verify.verify(process.env.WAFFO_PUBLIC_KEY!, signature, 'base64');
}
function signResponse(responseBody: string): string {
const sign = createSign('SHA256');
sign.update(responseBody);
return sign.sign(process.env.MERCHANT_PRIVATE_KEY!, 'base64');
}
app.post('/webhook', express.raw({ type: 'application/json' }), (req, res) => {
const body = req.body.toString();
const signature = req.headers['x-signature'] as string;
if (!verifyWaffoSignature(body, signature)) {
const failedBody = JSON.stringify({ message: 'failed' });
res.setHeader('X-SIGNATURE', signResponse(failedBody));
return res.status(200).send(failedBody);
}
// Process the event...
const successBody = JSON.stringify({ message: 'success' });
res.setHeader('X-SIGNATURE', signResponse(successBody));
res.status(200).send(successBody);
});
注意事項
- イベントを処理する前に必ず署名を検証してください。先に応答を返してから検証するのは避けてください。
- 応答には必ず
X-SIGNATURE ヘッダーを含めてください。含まれていない場合、Waffo は配信失敗として扱います。
- 署名検証には生のリクエストボディを使用し、JSON のパース後に再度文字列化しないでください。
- SDK は完全な Webhook 処理パイプラインを提供しています。手動での処理よりも SDK の利用を推奨します。