commerce-app-webhooks について
commerce-app-webhooks は、既存のアプリに Webhook インターセプターを追加・変更する Adobe Commerce App Builder 開発者向けスキルです。アプリ内のランタイムアクションまたは外部 URL をハンドラーに指定し、設定のビルドと検証まで扱います。
主な機能
- 01操作前または操作後のインターセプト設定
- 02検証・追加・変更の動作設定
- 03ランタイムアクションまたは外部 URL の選択
- 04ハンドラー登録とインストールアクションの生成
- 05ビルドによる Webhook 設定の検証
活用シーン
- 01商品保存前の入力検証
- 02Commerce 操作結果へのデータ追加
- 03外部エンドポイントへの Webhook リクエスト送信
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ adobe/ skills --skill commerce-app-webhooksインストール後、Claude Code で/commerce-app-webhooksを入力して読み込まれたか確認します。
同梱ファイルassets/webhooks-config.tsevals/evals.json
詳細
Commerce App Webhook の設定
既存の app.commerce.config.ts に Webhook インターセプターを追加または変更します。
Webhook は Commerce の操作に割り込みます。操作の実行前または実行後に、入力の検証、データの追加、動作の変更ができます。
その他の拡張領域(イベント、ビジネス設定)は、それぞれのスキルで個別に追加します。
前提条件
- アプリがスキャフォールディングされ、初期化済みであることを確認してください。設定ファイルが存在するだけでは不十分です。以下の両方が必要です。
- プロジェクトのルートに
app.commerce.config.tsがあること、および - プロジェクトが初期化済みであること。これは、生成された
src/commerce-extensibility-1/ディレクトリとインストール済みのnode_modules(@adobe/aio-commerce-lib-app依存関係)で確認できます。
- プロジェクトのルートに
app.commerce.config.tsが存在しない場合は、停止して最初にcommerce-app-initを実行してください(設定ファイルを書き込み、その後初期化を実行します)。- 設定ファイルは存在するが、プロジェクトが初期化されていない場合(
src/commerce-extensibility-1/またはnode_modulesがない場合)は、続行する前にnpx @adobe/aio-commerce-lib-app initを実行してください。init は冪等です。既存の設定ファイルを検出して対話形式のプロンプトをスキップし、依存関係をインストールしてプロジェクトファイルを生成します。 - アクションを TypeScript で作成できるのは、TypeScript の Commerce 設定向けに
initがスキャフォールディングする TypeScript ビルド設定(webpack-config.cjsとルートのtsconfig.json)がプロジェクトにある場合のみです。詳細はcommerce-app-initを参照してください。それ以外の場合は、JavaScript でアクションを作成してください。
Step 1 — 意図の把握
何をどのようにインターセプトするか、ユーザーに確認してください。
- 操作:
webhook_method(Commerce 操作。例:plugin.magento.catalog_product.save)とwebhook_type(beforeまたはafter) - ハンドラーの呼び出し方法:このアプリのランタイムアクション(
runtimeAction: "<package>/<action>")または明示的な外部 URL(webhook.url)のいずれか。これらは相互に排他的です。 - カテゴリ(任意):
validation(無効な場合にブロック)、append(データを追加)、modification(データを変更)のいずれか。競合検出に使用します。 - バッチとフックの識別子:
batch_nameは関連するフックをグループ化し、hook_nameはバッチ内でこのフックを一意に識別します。
Step 2 — 設定値の導出
書き込む前に、以下の検証ルールを適用してください。問題があれば、続行する前にユーザーに伝えてください。
| フィールド | 制約 |
|---|---|
batch_name | [a-zA-Z0-9_]+ のみ。ハイフン、ピリオド、スペースは不可 |
hook_name | [a-zA-Z0-9_]+ のみ。ハイフン、ピリオド、スペースは不可 |
category | 任意。validation、append、modification のいずれか |
runtimeAction | <package>/<action> 形式。webhook.url とは相互に排他的 |
webhook.url | 有効な絶対 URL(https://...)であること。runtimeAction とは相互に排他的 |
label | 必須。空でないこと |
description | 必須。空でないこと |
webhook_type | 必須。before または after であること |
method | 必須。POST、PUT、DELETE、GET のいずれかであること |
timeout / soft_timeout | 任意。正の整数(ミリ秒) |
priority / batch_order | 任意。正の整数 |
ステップ 3 — app.commerce.config.ts を更新する
トップレベルの webhooks 配列にエントリーを追加するか、配列がない場合は作成します。他のドメインはすべてそのまま残してください。設定にすでに webhooks キーがある場合は、置き換えずにエントリーを追加します。
最小限の例:
// Runtime action handler (handler lives in this app)
webhooks: [
{
label: "Validate Product Save",
description: "Validates product data before saving.",
category: "validation", // optional
runtimeAction: "my-package/validate-product", // <package>/<action>
webhook: {
webhook_method: "plugin.magento.catalog_product.save",
webhook_type: "before",
batch_name: "my_app", // [a-zA-Z0-9_]+ only
hook_name: "validate_product", // [a-zA-Z0-9_]+ only
method: "POST",
},
},
];
// URL handler (external endpoint)
webhooks: [
{
label: "Fraud Check",
description: "Calls external fraud service before order placement.",
webhook: {
webhook_method: "plugin.magento.sales_order.place",
webhook_type: "before",
batch_name: "my_app",
hook_name: "fraud_check",
method: "POST",
url: "https://fraud.example.com/check", // inside webhook object, not top level
},
},
];
各エントリーでは、Commerce の特定の環境に適用範囲を限定するための任意の env 配列("paas" / "saas")も指定できます。省略した場合、Webhook はすべての環境に適用されます。指定した場合、インストール時にリストされた環境でのみ登録されます。
注釈付きの完全なリファレンスについては、assets/webhooks-config.ts を参照してください。
ハンドラーアクションの作成
runtimeAction を使用する Webhook エントリーの場合は、アクションファイルを src/actions/ の下に作成し、app.config.yaml に登録します。
アクションを登録する
既存の app-management パッケージと並べて、src/commerce-extensibility-1/ext.config.yaml にユーザー定義パッケージを追加します。フレームワークで予約されている app-management 以外の名前を使用してください。
# src/commerce-extensibility-1/ext.config.yaml
# (add below the auto-generated app-management package)
runtimeManifest:
packages:
app-management:
# ... auto-generated — do not edit
my-app: # your package name — any name except "app-management"
actions:
validate-product:
function: actions/validate-product/index.js # relative to src/commerce-extensibility-1/
web: "yes"
runtime: nodejs:24
annotations:
require-adobe-auth: true
runtimeAction の <package>/<action> 形式は、直接対応します。my-app/validate-product → パッケージ my-app、アクション validate-product です。
ハンドラーの基本構成
// src/commerce-extensibility-1/actions/validate-product/index.ts
import {
ok,
successOperation,
exceptionOperation,
addOperation,
replaceOperation,
removeOperation,
} from "@adobe/aio-commerce-lib-webhooks/responses";
export async function main(params: Record<string, unknown>) {
// params contains the Commerce operation payload
// Allow the operation to proceed
return ok(successOperation());
// Block the operation (validation failure)
// return ok(exceptionOperation("Product SKU is required"));
// Append data to the operation result
// return ok(addOperation("result/custom_field", { value: "appended" }));
// Modify a field in the result
// return ok(replaceOperation("result/price", 99.99));
// Remove a field from the result
// return ok(removeOperation("result/unwanted_field"));
}
操作の種類:
| 応答 | 効果 |
|---|---|
successOperation() | 許可 — 操作は変更されずに続行されます |
exceptionOperation(message) | ブロック — 操作はこのメッセージとともに拒否されます |
addOperation(path, value) | 結果の path にデータを追加します |
replaceOperation(path, value) | 結果の path の値を置き換えます |
removeOperation(path) | 結果から path のフィールドを削除します |
ステップ 4 — installation アクションを再生成する
設定内で、webhooks がインストールを必要とする最初のドメインの場合(その他は eventing.commerce、eventing.external、adminUi、installation.customInstallationSteps です)、次を再実行します。
npx @adobe/aio-commerce-lib-app init
これにより、ext.config.yaml の app-management パッケージに installation アクションが追加されます。aio app build/aio app deploy は既存のファイルを読み取るだけで、再生成はしません。この手順を省略すると、Commerce に呼び出し可能なエンドポイントがなくなるため、Webhook は正常にビルドおよびデプロイされても、実際にはインストールされません。アクションがすでに存在する場合でも、安全に再実行できます。
ステップ 5 — 検証する
プロジェクトをビルドして、更新した設定が有効であることを確認します。
aio app build
検証エラーによるビルド失敗では、問題のある設定フィールドが直接示されます。この Webhook でステップ 4 が必要だった場合は、app-management の下に actions.installation が追加されていることも ext.config.yaml で確認してください。
よくある問題
batch_nameまたはhook_nameが拒否される:区切り文字にはアンダースコアを使用してください(my_app、validate_product_save)。ハイフン、ドット、スペースは使用できません。runtimeActionとwebhook.urlの両方が設定されている:これらは相互排他です。ハンドラーがこのアプリ内にある場合はruntimeActionを、外部エンドポイントの場合はwebhook.urlを使用してください。urlの階層が誤っている:URL を使用するエントリーでは、urlはトップレベルでlabelと並べるのではなく、ネストされたwebhookオブジェクト内に指定する必要があります。app-managementパッケージ名の競合:フレームワークはビルドのたびにext.config.yamlにこのパッケージを生成します。独自のアクションには、ほかの名前を使用してください。- 関数のパスは
src/commerce-extensibility-1/からの相対パスです:src/...やプロジェクトルートからの相対パスは使用しないでください。actions/validate-product/index.jsは正しく解決されますが、src/commerce-extensibility-1/actions/validate-product/index.jsは解決されません。 defineConfigが見つからない:@adobe/aio-commerce-lib-appがインストールされていることを確認し、@adobe/aio-commerce-lib-app/configからdefineConfigをインポートしてください。- Webhook はデプロイされたが、Commerce から呼び出されない:インストールを必要とする最初のドメインを追加した後に
initが再実行されていません(ステップ 4)。installationアクションがないため、インストール用エンドポイントもありません。
品質基準
aio app buildがエラーなしで完了する- この Webhook で必要な場合は、
ext.config.yamlにinstallationアクションが含まれている
連携
aio app build が成功したら、次の操作を行います。
- マーチャント設定を追加する —
commerce-app-business-configを呼び出し、Commerce Admin で設定可能な項目を公開します - イベントサブスクリプションを追加する —
commerce-app-eventingを呼び出し、Commerce または外部のイベントをサブスクライブします - Admin UI を拡張する —
commerce-app-admin-uiを呼び出し、Commerce Admin にカスタム列、一括操作、注文ビューのボタン、またはメニュー項目を追加します - 永続ストレージを追加する —
commerce-app-storageを呼び出し、クエリ可能な DB ストレージを Webhook ハンドラーのバックエンドとして使用します
参考資料
- assets/webhooks-config.ts — ランタイムアクションと URL ベースの Webhook エントリーの両方の形式を示す設定例