独立サイトのAPI連携:REST API、Webhook、外部システムとの接続方法

独立サイトをCRM、メールマーケティング、決済ゲートウェイ、分析ツールと連携する方法は、本質的に2つだけです。REST APIで能動的に取得する(Pull)か、Webhookで受動的に受け取る(Push)か。直感に反しますが...

独立站 API 集成:REST 拉取 与 Webhook 推送的分工API Integration: REST pull vs Webhook push Webhook 失败了你不知道 —— 关键数据同步必须用定时拉取做对账Webhook failures are silent — use scheduled pull for critical reconciliation 对比维度Dimension REST API(拉)REST API (pull) Webhook(推)Webhook (push) 触发方式Trigger 定时轮询 / 主动请求Scheduled polling 事件发生时对方主动推On event, pushed by source 实时性Realtime 分钟级延迟(轮询间隔)Minute-level lag 秒级实时Second-level realtime 失败可见性Failure visibility 请求失败立即可见,自动重试Errors visible, auto-retry 推送失败对方重试,你不知道Failures silent to you 适用场景Use case 数据同步、报表、对账Sync, reporting, reconciliation 新线索通知、订单状态变更New lead alert, order update 认证方式Auth API Key / OAuth 2.0API Key / OAuth 2.0 签名验证(HMAC)HMAC signature verification 推荐组合:Webhook 做实时通知 + 每小时定时 REST 拉取做对账兜底Best combo: webhook for realtime + hourly REST pull as backup Webhook 负责秒级通知,REST 每小时拉一次增量数据,两边不一致以 REST 为准Webhook alerts in seconds, hourly REST pulls catch what webhook missed 红线:不要把 API Key 写在前端 JavaScript 里 —— 任何人 F12 就能看到Red line: never expose API keys in frontend JS 所有 API 请求必须走后端代理,前端只调自己服务器的接口Proxy all calls through your backend
REST APIの取得とWebhookの送信を5つの軸で比較し、おすすめの組み合わせを解説

独立サイトのAPI連携:REST API、Webhook、外部システムとの接続方法

結論から言うと:独立サイトをCRM、メールマーケティング、決済ゲートウェイ、分析ツールと連携する方法は、本質的に2つだけです。REST APIで能動的に取得する(Pull)か、Webhookで受動的に受け取る(Push)か。直感に反する判断ですが、Webhookは万能ではありません。秒単位のリアルタイム通知には向きますが、Webhookが失敗してもこちら側では気づけません。重要なデータの同期は、1時間ごとの定時REST取得で突合して補う必要があります。おすすめの組み合わせは、Webhookでリアルタイム通知、定時RESTでデータ突合の2層構成で、どちらも欠かせません。API Keyは必ずバックエンドに置いてください。フロントエンドでF12を押せば見えるKeyは、公開されているのと同じです。

1. WordPress REST API:まず標準機能を理解する

WordPressは4.7以降、REST APIを標準搭載しており、プラグインなしで使えます。エンドポイントの形式は https://あなたのドメイン/wp-json/wp/v2/posts で、ブラウザで直接開けばJSON形式の記事一覧が表示されます。このAPIは標準で公開されており、誰でもあなたの記事、ページ、メディアライブラリを読み取れます。これは利点(連携が簡単)であると同時にリスク(内部データの露出)でもあります。

書き込み操作(記事の新規作成、注文の変更、ユーザーの追加)には認証が必要です。WordPressは2つの認証方式に対応しています。アプリケーションパスワード(Application Passwords、シンプル。ユーザープロフィール画面で生成でき、自社サーバーからの呼び出しに適する)とOAuth 2.0(複雑。サードパーティアプリの認可に適する)です。独立サイトを自社のCRMと連携するならアプリケーションパスワードで十分です。簡単だからといって、adminアカウントのパスワードをコードに直書きしないでください。

判断の枠組み:WordPressからデータを読み取るのか、書き込むのか。読み取りのみ(記事一覧や注文履歴の取得)なら、GETリクエストとアプリケーションパスワードで足ります。書き込み(注文の作成、ユーザーの更新、Webhookの送信)ならPOST/PUTリクエストが必要で、権限範囲は最小限にしてください。たとえば「注文の編集」権限だけを与え、「すべての設定の管理」権限は与えないこと。技術スタックの組み方は、こちらをご覧ください環形山テックスタック。

エンドポイント 方法 用途 認証要件
/wp-json/wp/v2/posts GET 記事一覧を取得 公開(公開済み)
/wp-json/wp/v2/posts POST 記事を新規作成 アプリケーションパスワード
/wp-json/wc/v3/orders GET WooCommerceの注文を取得 コンシューマーキー
/wp-json/wc/v3/orders POST 注文を新規作成 コンシューマーキー
/wp-json/wp/v2/users GET ユーザー一覧を取得 管理者パスワード
/wp-json/wp/v2/media POST 画像をアップロード 上記のパスワードを編集

2. Webhook:イベント駆動のリアルタイム通知

Webhook と REST API の違いは、データの流れる向きが逆だという点です。REST は自分から相手のサーバーへデータを取りに行く方式で、Webhook はイベントが起きたときに相手のサーバーから自分のところへデータを push してくる方式です。たとえば WooCommerce で新しい注文が入ると、Webhook の設定に入力した URL へ POST リクエストを送り、body に注文詳細の JSON が入っています。毎分ポーリングして「新しい注文はないか」と確認する必要はなく、注文が入った時点で自動的に push されてきます。

WooCommerce は Webhook を標準でサポートしています。WooCommerce → 設定 → 詳細設定 → Webhooks から追加します。入力が必要な項目は次のとおりです。トリガーイベント(注文の作成、注文の更新、注文のキャンセル)、受信 URL(自分のサーバー上のエンドポイント。例: https://your-domain/wp-json/custom/v1/new-order)、署名方式(HMAC-SHA256。シークレットキーで、リクエストが本当に WooCommerce から来たもので、他人による偽造ではないことを検証します)。

直感に反する判断:Webhook の push が失敗しても、自分の側ではほとんど気づけません。WooCommerce が Webhook を push したときにサーバーが 500 を返すと、数回リトライします(デフォルトで最大 5 回、間隔は徐々に広がります)。しかし 5 回すべて失敗すると、そこで諦めてしまいます。自分の側ではデータを受け取れないうえ、アラートも一切ありません。だからこそ重要なデータを Webhook だけに任せてはいけません。定期取得によるフォールバックが必須です。CRM との連携方法は独立系サイトの CRM 連携。

イベント WooCommerceフック push 先 優先度
新規注文の作成 woocommerce_order_created CRM + Slack通知 最高
注文ステータスの変更 woocommerce_order_status_changed 顧客へのメール + CRM 更新 高
決済成功 woocommerce_payment_complete 会員システムのアップグレード 高
返金の開始 woocommerce_order_refunded CRM への記録 + 経理への通知 中
新規ユーザー登録 user_register メールマーケティングのリスト 中
商品の公開/非公開 woocommerce_product_set_visibility 在庫システムの同期 低

三、REST による定期取得: 突合のフォールバック

Webhook は秒単位のリアルタイム通知を担いますが、そこに定期取得の層を必ず足して突合します。やり方は簡単です。WP-Cron のスクリプトを書いて 1 時間に 1 回実行し、WooCommerce REST API を呼んで直近 1 時間に作成または更新された注文を取得し、自分のデータベースにある注文と突き合わせます。Webhook が取りこぼした注文(Webhook の push 時にサーバーが 502 を返した場合など)があれば、定期取得が補完します。

定期取得のクエリパラメータにはタイムスタンプを付けます。たとえば GET /wp-json/wc/v3/orders?after=2026-09-21T10:00:00&per_page=100 は、10 時以降のすべての注文を 1 ページ 100 件で返します。100 件返ってきたら、まだ続きがある可能性が高いのでページをめくって取得を続けます。取得後は注文 ID で重複を排除し、すでにデータベースにあるものはスキップし、ないものだけを挿入します。これが最もシンプルな突合ロジックです。

シナリオ例:水曜午後3時にサーバーのSSL証明書が期限切れで525を返し、40分間続きました。この間、新規注文3件のWebhookがすべて失敗。Webhookだけならこの3件は失われます。しかし毎時ポーリングを設定しておけば、4時の実行で漏れた3件を補完し、顧客に確認メールが届きます。監視の設定方法はこちらサイト監視とアラート。

同期方式 頻度 遅延 失敗時の対応
Webhookプッシュ イベントトリガー 秒単位 相手が5回リトライして諦める
毎時ポーリング 毎時0分 分単位 失敗したら次回自動リトライ
毎日全件照合 毎日午前3時 日単位 差分レポートを生成し人が確認
リアルタイムWebSocket リアルタイム ミリ秒単位 切断されたら再接続が必要

四、認証とセキュリティ:Keyはバックエンドに、リクエストは署名検証

API連携で最もよくあるセキュリティミスは、API KeyをフロントエンドのJavaScriptに書いてしまうことです。誰でもブラウザでF12 → Networkタブを開けばあなたのKeyが見え、それを使ってAPIを自由に呼べてしまいます。正しい方法は、フロントエンドは自分のサーバーのエンドポイントだけを呼び、サーバーがバックエンドでAPI Keyを付けて第三者へ転送する構成です。このバックエンドプロキシは、WordPressのカスタムRESTエンドポイントでも、簡単なNode.js/Pythonサービスでも構いません。

Webhookを受け取るときは必ず署名を検証します。WooCommerceがWebhookを送る際、HTTP HeaderにX-WC-Webhook-Signatureを付けます。これはあなたのWebhook SecretでbodyをHMAC-SHA256署名したものです。受け取り側で同じ署名を計算し、Headerの値と一致すれば処理します。一致しなければ誰かが偽造したリクエストなので、そのまま403を返します。検証しない場合、誰でもあなたのエンドポイントに偽の注文をPOSTでき、CRMにゴミのようなリードが大量に発生します。

シナリオ例:HubSpot Webhookを連携していて、誰かがあなたの受け取りURLを知り、偽の「新規リード」POSTリクエストを作成しました。署名検証がなければこの偽リードがHubSpotに入り、営業が半日フォローしてから偽物だと気づきます。HMAC検証を追加すれば、HubSpotのリクエストは正しい署名を持ち、偽リクエストは署名が合わず403でブロックされます。CRM連携の詳細はこちら独立系サイトの CRM 連携。

セキュリティ項目 誤ったやり方 正しい方法
API Keyの場所 フロントエンドJSに記述 サーバーの環境変数に保存
リクエストプロキシ フロントエンドから第三者APIを直接呼ぶ フロントエンドは自分のサーバーを呼び、バックエンドが転送
Webhook署名検証 検証せず、受信したら処理 HMAC-SHA256でHeaderと比較
HTTPS HTTPでWebhookを受信 HTTPS必須、TLS 1.2以上
IPホワイトリスト 送信元IPを制限しない 第三者の公式IPレンジでホワイトリスト
エラーログ 失敗しても記録しない すべての非2xxレスポンスをログ記録

五、よくある第三者連携一覧

独立サイトでよく使う外部連携は5種類あります。CRM(HubSpot、Salesforce、Zoho)、メール配信(Mailchimp、ConvertKit、Klaviyo)、決済ゲートウェイ(Stripe、PayPal)、分析ツール(Google Analytics 4、Hotjar)、チャットサポート(Intercom、Zendesk)です。連携方法はそれぞれ違いますが、原則は同じです。Webhook でできるものは Webhook でリアルタイムに連携し、重要なデータは定期取得も組み合わせて取りこぼしを防ぎます。

まず自分でコードを書いて連携しようと考えないでください。WordPress のプラグインディレクトリに既成プラグインがないか探しましょう。HubSpot には公式プラグイン、Mailchimp には公式プラグイン、Stripe には WooCommerce 公式拡張があります。既成プラグインで8割のケースはカバーでき、残りの2割(カスタムフィールドのマッピングなど)は Webhook やカスタムコードで補います。2つのシステムを自分でコードでつなぐと、デバッグに20時間以上かかるのが普通ですが、既成プラグインなら1時間で完了します。CRM プラグインの選び方はこちらをご覧ください。サイトのリードから CRM へ。

システムの種類 推奨プラン 連携方法 想定工数
CRM(HubSpot) 公式プラグイン + Webhook プラグインが自動同期 2〜4時間
メール配信(Mailchimp) 公式プラグイン ユーザー登録でリストに自動追加 1〜2時間
決済(Stripe) WooCommerce 公式拡張 Webhook で注文ステータスを同期 1〜2時間
分析(GA4) Site Kit by Google プラグイン フロント側で自動計測 30分
チャットサポート(Intercom) 公式チャットプラグイン フロント側のコードスニペット 30分
カスタム ERP 自分で REST 連携を実装 定期取得 + Webhook 20時間以上

FAQ よくある質問

REST API と Webhook は何が違う?どちらが優れている?
データの流れる向きが逆です。REST API は自分から相手のサーバーにデータを取りに行く方式(Pull)で、定期的にポーリングが必要です。遅延は分単位ですが、失敗は検知できます。Webhook はイベント発生時に相手からデータを送ってもらう方式(Push)で、秒単位のリアルタイム性がありますが、失敗しても気づかないことがあります。どちらが優れているということはなく、組み合わせて使うのがおすすめです。Webhook でリアルタイム通知(新規注文や新規リードを秒単位で受け取る)、毎時0分の REST 定期取得で突合と取りこぼし防止(Webhook が漏らした分を補う)という使い方です。重要なデータを Webhook だけに頼らないでください。
WordPress の REST API はプラグインが必要?
不要です。WordPress 4.7 以降は REST API が標準で組み込まれており、エンドポイントは /wp-json/wp/v2/posts です。公開済みコンテンツの読み取りは誰でも可能ですが、書き込み操作(投稿の新規作成、注文の変更)にはアプリケーションパスワードによる認証が必要です。WooCommerce の API は /wp-json/wc/v3/ 以下にあり、WooCommerce の設定で Consumer Key と Consumer Secret を生成する必要があります。カスタムエンドポイントを追加したい場合(Webhook の受け口など)は、WordPress 標準の register_rest_route() 関数で書けるので、追加プラグインは不要です。
API Key はどこに置くべき?フロント側で使える?
フロントエンドの JavaScript には絶対に置かないでください。誰でも F12 で Key を見られて、それを使って API を好き放題に呼ばれてしまいます。正しい方法は、Key をサーバーの環境変数(wp-config.php または .env ファイル)に保存し、フロントエンドは自分のサーバーのエンドポイントだけを呼び、バックエンドが Key を付けて第三者へ転送する構成です。フロントエンドから第三者 API を直接呼ぶ必要がある場合(Stripe.js など)は、第三者が提供する Publishable Key(公開鍵、もともとフロントエンド用に設計されたもの)を使い、Secret Key は常にバックエンドに置きます。
Webhook の受信側でリクエストが本物かどうかを検証するには?
HMAC 署名で検証します。WooCommerce、Stripe、HubSpot などが Webhook を送信するとき、HTTP Header に署名値(X-WC-Webhook-Signature など)を付けます。受信側で取り決めた Secret を使い、生の body に対して HMAC-SHA256 を計算し、Header の値と比較します。一致すれば処理し、一致しなければ 403 を返します。注意点として、必ず生の body 文字列で計算してください。パース後に再シリアライズした JSON を使うと、空白や改行の違いで署名が一致しなくなります。
Webhook の送信が失敗したらどうなる?
WooCommerce はデフォルトで、受信側が非 2xx のステータスコードを返すと再試行します。最大 5 回で、間隔は徐々に延びます(1 分、5 分、15 分、1 時間、3 時間)。5 回すべて失敗すると諦めます。こちら側でやることは 2 つです。1 つ目は、受信側でエラー時にログを残し、後から調査できるようにすること。2 つ目は、1 時間ごとの定期 REST 取得を保険として追加し、Webhook が取りこぼした注文を補うことです。Webhook が 100% 信頼できると仮定しないでください。サーバーの一時的なダウン、SSL の期限切れ、ネットワークの揺らぎでデータは失われます。
第三者システムとの連携は既成プラグインを使うべきか、自分で書くべきか?
80% のケースは既成プラグインで済みます。HubSpot、Mailchimp、Stripe、GA4 には公式プラグインがあり、インストールして API Key を入力すれば完了、1 から 4 時間で終わります。残り 20% のカスタム要件(特殊なフィールドマッピング、複数システムの連携、社内 ERP との接続)でのみ自分でコードを書きます。2 つのシステムを REST でつなぐコードを自分で書くと、デバッグ時間は通常 20 時間からです。認証、エラー処理、再試行、ログが含まれます。判断基準は、プラグインがフィールドマッピングの 80% をカバーできるならプラグインを使い、そうでなければ自社開発を検討します。

最後に

API 連携は複雑であるほど良いのではなく、信頼できるほど良いのです。目標はただ 1 つ、データを失わない、状態を間違えない、問題が起きたら調べられること。Webhook は速いが信頼性が低く、REST は遅いが制御しやすい。この 2 つを重ねて初めて本番レベルの仕組みになります。どちらか片方だけでは、いつか必ずデータを失います。

実装は 3 ステップです。重要な連携は Webhook でリアルタイム通知し、受信側で HMAC 検証を追加します。1 時間ごとの定期 REST 取得を追加して突合し、Webhook が取りこぼした分を自動で補います。すべての API Key はバックエンドの環境変数に置き、フロントエンドは自分のサーバーのプロキシエンドポイントだけを呼びます。

覚えておきたい一言。Webhookは「即時通知」、RESTは「定期照合」。通知だけに頼って照合をしないのは、チャイムの音だけ聞いて宅配ボックスを確認しないのと同じです。

环形山
环形山 クレーター専門家

公式アカウント · 環形山 Crater

環形山(Crater)は、WordPress独立サイト開発+Google SEO+GEO全域成長に特化した海外展開支援会社で、スマートハードウェア、産業機器、SaaS、新エネルギーなどの分野を手がけています。

プロダクト能力方法論ホワイトペーパー業界レポート
965件のシェア
78件のナレッジベース