多Shopify客户端Webhook集成:如何区分不同客户端的通知?
区分多Shopify客户端Webhook通知的解决方案
刚好做过类似的多Shopify店铺集成项目,你的问题其实很好解决——Shopify在每个Webhook推送的 payload 里自带了明确的店铺唯一标识符,同时结合签名验证机制,完全可以精准区分不同客户端的通知。
核心区分依据:Shopify自带的唯一标识字段
每个Webhook请求的payload里都会包含两个关键的全局唯一字段:
shop_domain:店铺的专属域名(比如your-client-store.myshopify.com),这是最直观的唯一标识,每个Shopify店铺的域名都是独一无二的。shop_id:Shopify系统给每个店铺分配的数字ID,同样是全局唯一的。
你可以优先用shop_domain来做区分,因为它更容易和你的客户端信息做映射(比如你的客户可能直接给你提供他们的店铺域名)。
具体实现步骤
提前建立映射关系
在你的后端数据库里存储每个客户端的关联信息:- 你的系统内的客户端ID/标识
- 对应的Shopify店铺域名(
shop_domain) - 该店铺的Webhook签名密钥(每个店铺的密钥都是独立的,需要客户从他们的Shopify后台生成并提供给你)
接收Webhook时的区分逻辑
当你的端点收到Shopify的Webhook请求:- 先从payload中提取
shop_domain字段(比如订单Webhook的顶层就有这个字段,客户创建的Webhook同理) - 用
shop_domain查询你的数据库,匹配到对应的客户端 - 拿到该客户端的签名密钥,按照Shopify的规则验证Webhook签名(这一步很重要,既能确保请求合法,也能再次确认对应的客户端身份)
- 先从payload中提取
签名验证示例(伪代码)
验证签名的逻辑大致如下,你可以根据自己的后端语言调整:import hmac import hashlib import base64 def verify_shopify_webhook(request_body, webhook_headers, client_secret): hmac_header = webhook_headers.get('X-Shopify-Hmac-Sha256') digest = hmac.new(client_secret.encode('utf-8'), request_body, hashlib.sha256).digest() computed_hmac = base64.b64encode(digest).decode('utf-8') return hmac.compare_digest(computed_hmac, hmac_header)只有验证通过的请求,才继续处理对应的业务逻辑(比如把订单关联到匹配的客户端)。
额外注意事项
- 不要依赖
store_name这类字段,因为店铺名称可能重复,而shop_domain和shop_id是绝对唯一的。 - 建议同时存储
shop_domain和shop_id作为双重校验,避免极端情况下的域名变更(虽然Shopify店铺域名变更需要重新配置Webhook,但多一层校验更稳妥)。 - 处理Webhook时要做好幂等性,因为Shopify可能会重复推送通知,避免重复处理同一订单/客户数据。
内容的提问来源于stack exchange,提问作者user826323
相关产品推荐
相关产品推荐

