You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Shopify客户删除Webhook问题:无customer_deleted对象如何判断删除事件

Shopify客户删除Webhook问题排查与修复

核心问题分析

你的代码存在两个关键问题:

  1. 重复读取php://input:这个输入流是一次性的,第一次用fopen读取后,第二次file_get_contents会返回空值,导致$webhookData解析失败。
  2. 事件类型判断逻辑错误:Shopify的Webhook事件类型并非通过payload里的event字段传递,而是放在请求头X-Shopify-Topic中;且客户删除事件的主题是customers/delete,不是你代码里写的customer.delete。

另外需要明确:Shopify的customers/delete Webhook payload本身就没有customer_deleted对象,它只会返回被删除客户的基础信息(比如id、email等),不需要依赖这个对象判断删除动作。

修正后的代码

// 读取请求头中的Webhook事件主题
$shopifyTopic = $_SERVER['HTTP_X_SHOPIFY_TOPIC'] ?? '';

// 只处理客户删除事件
if ($shopifyTopic === 'customers/delete') {
    // 一次性读取请求体(注意:php://input只能读取一次)
    $webhookContent = file_get_contents('php://input');
    $webhookData = json_decode($webhookContent, true);

    // 验证payload有效性(至少包含客户ID)
    if (isset($webhookData['id'])) {
        $deletedCustomerId = $webhookData['id'];
        $deletedCustomerEmail = $webhookData['email'] ?? '无关联邮箱';
        mail(
            'test@gmail.com',
            '客户已删除通知',
            "被删除客户ID: $deletedCustomerId\n客户邮箱: $deletedCustomerEmail\n完整Webhook数据:\n" . print_r($webhookData, true)
        );
    }
}

关键说明

  • 通过请求头判断事件类型:所有Shopify Webhook都会通过X-Shopify-Topic请求头告知事件类型,常见的客户相关主题有customers/create、customers/update、customers/delete。
  • customers/delete的payload结构示例:
    {
      "id": 123456789,
      "email": "customer@example.com",
      "phone": "+1234567890",
      "created_at": "2023-01-01T12:00:00Z",
      "updated_at": "2023-10-01T12:00:00Z"
    }
    
    只要X-Shopify-Topic为customers/delete,且payload包含客户ID,即可确认该客户已被删除。
  • 生产环境安全提示:务必通过X-Shopify-Hmac-Sha256请求头验证Webhook签名,防止伪造请求。

内容的提问来源于stack exchange,提问作者Philip Savarirayan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 04:22:37