Shopify客户删除Webhook问题:无customer_deleted对象如何判断删除事件
Shopify客户删除Webhook问题排查与修复
核心问题分析
你的代码存在两个关键问题:
- 重复读取
php://input:这个输入流是一次性的,第一次用fopen读取后,第二次file_get_contents会返回空值,导致$webhookData解析失败。 - 事件类型判断逻辑错误: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
相关产品推荐
相关产品推荐

