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

新手求助:Node.js环境下配置Shopify上架所需GDPR强制Webhooks

Shopify GDPR 强制Webhooks Node.js 实现方案

1. customers/data-request Webhook

该事件触发于用户申请导出个人数据,你需要返回应用中存储的该用户所有个人信息,必须返回200状态码,否则Shopify会重试请求。

实现代码(Express为例)

const express = require('express');
const crypto = require('crypto');
const app = express();
app.use(express.json());

// Webhook签名验证中间件(必加,防止恶意请求)
const verifyShopifyWebhook = (req, res, next) => {
  const hmac = req.headers['x-shopify-hmac-sha256'];
  const secret = process.env.SHOPIFY_APP_SECRET;
  const hash = crypto.createHmac('sha256', secret)
    .update(JSON.stringify(req.body), 'utf8')
    .digest('base64');
  
  hash === hmac ? next() : res.sendStatus(403);
};

// 处理用户数据请求
app.post('/webhooks/customers/data-request', verifyShopifyWebhook, async (req, res) => {
  const customerId = req.body.customer.id;
  
  // 替换为你的实际数据库查询逻辑,获取用户在应用中的所有数据
  const userData = await yourDB.query('SELECT * FROM user_data WHERE customer_id = ?', [customerId]);
  
  // 返回结构化的用户数据,格式不限但需包含所有个人信息
  res.status(200).json(userData);
});

app.listen(3000, () => console.log('Webhook server running on port 3000'));

注意事项

  • 必须返回完整的用户个人数据,包括任何存储的偏好、交易记录、联系方式等
  • 签名验证不可省略,否则Shopify会拒绝你的Webhook配置

2. customers/redact Webhook

该事件触发于用户申请删除个人数据,你需要彻底清除应用中存储的该用户所有个人信息,返回200状态码即可,无需返回数据。

实现代码

// 处理用户数据删除请求
app.post('/webhooks/customers/redact', verifyShopifyWebhook, async (req, res) => {
  const customerId = req.body.customer.id;
  
  // 替换为你的实际数据删除逻辑,包括数据库、缓存、日志中的相关数据
  await yourDB.query('DELETE FROM user_data WHERE customer_id = ?', [customerId]);
  await yourCache.del(`user:${customerId}`);
  
  // 返回200确认删除完成
  res.sendStatus(200);
});

注意事项

  • 确保删除所有关联数据,包括第三方服务中存储的用户信息(如邮件营销工具)
  • 操作需保证幂等性,重复触发不会导致异常

3. shop/redact Webhook

该事件触发于商店关闭或移除你的应用,你需要清除该商店下所有用户的相关数据,返回200状态码即可。

实现代码

// 处理商店数据删除请求
app.post('/webhooks/shop/redact', verifyShopifyWebhook, async (req, res) => {
  const shopDomain = req.body.shop.domain;
  
  // 替换为你的实际数据删除逻辑,根据商店域名清除所有关联数据
  await yourDB.query('DELETE FROM user_data WHERE shop_domain = ?', [shopDomain]);
  await yourCache.del(`shop:${shopDomain}:*`);
  
  res.sendStatus(200);
});

注意事项

  • 用商店域名作为唯一标识,确保不会误删其他商店的数据
  • 如果有定时任务或异步处理,需同步停止该商店的相关任务

配置与验证步骤

  1. 在Shopify Partner后台进入你的应用,到「应用设置」->「Webhooks」
  2. 分别创建三个GDPR事件的Webhook,填写你的公网可访问的端点URL(本地开发可用ngrok暴露端口)
  3. 选择请求格式为JSON,保存后Shopify会发送测试请求,确保你的服务器返回200
  4. 应用密钥从Partner后台获取,存到环境变量中,不要硬编码

内容的提问来源于stack exchange,提问作者Prathamesh Rawool

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 19:43:17