← Back to Case Studies
Integration Omni-channel

オムニチャネル在庫同期システムの構築

The Challenge

実店舗(Square)とオンラインショップ(WooCommerce)の間で在庫情報をリアルタイムに同期させ、機会損失の防止と売り越しによる顧客体験の低下を同時に防ぐ必要がありました。APIベースの連携において、いかに「確実性」と「セキュリティ」を担保するかが課題となりました。

Analysis: 分散システムにおける信頼性の確保

外部 API の Webhook を利用する場合、以下の 2 点が致命的なリスクとなります。 1. なりすましリクエスト: 正当な送信元以外からのデータ書き換え。 2. 重複配信: ネットワーク遅延などで同一イベントが複数回届き、在庫数が不整合になること。

Implementation: セキュリティと冪等性の実装

HMAC-SHA256 を用いた署名検証を導入し、 Square からの正当なリクエストのみを受理する仕組みを構築。また、イベント ID を DB で管理し、一度処理したイベントは無視する「冪等性」を確保することでデータの整合性を完全なものにしました。

square_webhook_handler.php Security & Idempotency
// Webhook署名検証によるセキュリティ担保
function verifyWebhookSignature($signature, $body, $signatureKey) {
    $url = 'https://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
    $payload = $url . $body;
    $expectedSignature = base64_encode(hash_hmac('sha256', $payload, $signatureKey, true));

    return hash_equals($expectedSignature, $signature);
}

// 冪等性の確保:重複イベントの排除
try {
    $stmt = $conn->prepare("INSERT INTO square_webhook_log (event_id, event_type, payload) VALUES (:event_id, :event_type, :payload)");
    $stmt->execute([
        ':event_id'   => $eventId,
        ':event_type' => $eventType,
        ':payload'    => $body,
    ]);
} catch (PDOException $e) {
    if ($e->getCode() == 23000) {
        // UNIQUE制約違反 = 重複イベントとしてスキップ
        return ['success' => true, 'message' => 'Duplicate event'];
    }
}

Result & Outcome

店舗での決済と同時に EC サイトの在庫が秒単位で更新される環境を実現。手動同期の手間を完全に排除し、人的ミスによる在庫不整合をゼロに抑えることに成功しました。