求助:通过PHP实现Shopify订单创建Webhook插入MySQL数据库
解决Shopify订单创建Webhook配置及自动插入MySQL的问题
嘿,你已经搞定了批量导出订单、产品到MySQL的部分,现在卡在订单创建Webhook的配置上对吧?确实定时轮询不仅效率拉胯,还很容易触发Shopify的API限额,Webhook才是更靠谱的实时同步方案。下面我一步步给你捋清楚怎么弄:
一、先在Shopify后台配置Webhook
- 登录你的Shopify店铺后台,进入设置 > 通知 > Webhook
- 点击「创建Webhook」,在「事件」下拉菜单里选订单 > 创建
- 格式选JSON(处理起来最方便)
- 「URL」填你的私有应用用来接收Webhook请求的端点地址,比如
https://your-app-domain.com/webhooks/shopify/order-created - API版本选最新的稳定版就行
- 保存后,Shopify会生成一个Webhook密钥,一定要存好,后面验证请求身份要用
二、在私有应用里实现Webhook接收逻辑
这里有两个核心要点:请求验证(必须做,不然Shopify不认你的请求)和数据插入MySQL。
1. 先做请求验证,确保请求来自Shopify
Shopify会用刚才的密钥给请求签名,你得在后端验证这个签名,防止恶意请求。以Node.js为例(换成你用的语言逻辑是一样的):
const crypto = require('crypto'); function verifyShopifyWebhook(req, res, next) { const hmacHeader = req.get('X-Shopify-Hmac-Sha256'); const rawBody = req.rawBody; // 注意要拿原始请求体,不能是解析后的JSON const secret = '你的Webhook密钥'; const hmac = crypto.createHmac('sha256', secret) .update(rawBody, 'utf8') .digest('base64'); // 用timingSafeEqual防止时序攻击 if (crypto.timingSafeEqual(Buffer.from(hmacHeader), Buffer.from(hmac))) { next(); } else { res.status(403).send('Invalid webhook signature'); } }
注意:不同框架获取原始请求体的方式不一样,比如Express需要用
body-parser的raw模式,别让框架自动解析成JSON,否则验证会失败。
2. 处理订单数据并插入MySQL
验证通过后,就可以解析订单的JSON数据,提取你需要的字段,然后插入数据库。还是用Node.js举例子:
const mysql = require('mysql2/promise'); async function handleOrderCreated(req, res) { const order = req.body; // 提取你需要的字段,比如订单ID、订单号、客户邮箱、总价这些 const orderData = { order_id: order.id, order_number: order.order_number, customer_email: order.customer?.email || null, total_price: order.total_price, created_at: order.created_at }; // 连接MySQL并执行插入 const connection = await mysql.createConnection({ host: '你的MySQL主机地址', user: '数据库用户名', password: '数据库密码', database: '你的数据库名' }); try { await connection.execute( 'INSERT INTO orders (order_id, order_number, customer_email, total_price, created_at) VALUES (?, ?, ?, ?, ?)', [orderData.order_id, orderData.order_number, orderData.customer_email, orderData.total_price, orderData.created_at] ); res.status(200).send('Success'); // 必须返回200!不然Shopify会反复重试 } catch (error) { console.error('插入MySQL失败:', error); res.status(500).send('Internal Server Error'); } finally { await connection.end(); } }
划重点:Shopify要求Webhook端点必须在5秒内返回200响应,如果插入数据的逻辑比较复杂(比如还要处理商品明细),建议把插入操作放到异步队列(比如Redis队列)里,先返回200告诉Shopify“我收到了”,再后台慢慢处理数据,避免Shopify重复发请求。
三、测试你的Webhook配置
- 回到Shopify后台的Webhook列表,找到你创建的订单Webhook,点击「发送测试通知」
- 检查你的应用日志和MySQL数据库,看看测试订单是不是成功插入了
- 如果出问题,先排查这几点:
- 你的端点地址能不能被公网访问?Shopify没法访问本地地址,开发时可以用内网穿透工具把本地端口映射到公网
- 验证逻辑里的密钥是不是和Shopify后台的一致?
- MySQL的连接配置对不对?字段是不是和数据库表匹配?
四、为啥Webhook比轮询好
- 彻底避开API限额:Webhook是Shopify主动推数据给你,不用你主动调用API拉取
- 实时同步:订单一创建就触发,几乎没有延迟
- 省资源:不用定时跑脚本占服务器资源
内容的提问来源于stack exchange,提问作者SimmiS
相关产品推荐
相关产品推荐

