如何在Shopify中创建订单创建Webhook?Node.js开发求助
用Node.js实现Shopify订单创建Webhook
核心步骤概述
要实现订单创建Webhook,你需要完成两个关键部分:搭建可接收Shopify请求的Endpoint,以及通过Shopify API注册Webhook。以下是完整的Node.js示例代码,基于Express框架和官方@shopify/shopify-api包实现。
1. 初始化项目与安装依赖
首先创建项目并安装必要依赖:
npm init -y npm install express @shopify/shopify-api dotenv
2. 配置环境变量
在项目根目录创建.env文件,填入你的Shopify应用信息:
SHOPIFY_API_KEY=你的应用API密钥 SHOPIFY_API_SECRET=你的应用API密钥密码 SHOPIFY_SHOP_DOMAIN=你的店铺域名.myshopify.com SHOPIFY_ACCESS_TOKEN=你的店铺访问令牌
访问令牌可通过Shopify OAuth流程获取,或在店铺后台的应用设置中生成测试令牌。
3. 实现Webhook接收Endpoint
创建server.js文件,编写接收并验证Webhook的逻辑:
const express = require('express'); const shopify = require('@shopify/shopify-api'); const dotenv = require('dotenv'); dotenv.config(); const app = express(); // 初始化Shopify API上下文 shopify.Context.initialize({ API_KEY: process.env.SHOPIFY_API_KEY, API_SECRET_KEY: process.env.SHOPIFY_API_SECRET, SCOPES: ['read_orders'], // 需包含订单读取权限 HOST_NAME: process.env.SHOPIFY_SHOP_DOMAIN.replace('https://', ''), API_VERSION: shopify.ApiVersion.January24, // 使用最新稳定API版本 IS_EMBEDDED_APP: false, // 独立应用设为false }); // 解析请求体并保留原始数据用于签名验证 app.use(express.json({ verify: (req, res, buf) => { req.rawBody = buf; } })); // 订单创建Webhook的接收端点 app.post('/webhooks/orders/create', async (req, res) => { try { // 验证Shopify Webhook签名,防止伪造请求 const isValid = shopify.Webhooks.verify({ rawBody: req.rawBody, authHeader: req.headers['x-shopify-hmac-sha256'], domain: req.headers['x-shopify-shop-domain'], }); if (!isValid) { return res.status(401).send('Invalid webhook signature'); } // 处理订单数据,这里替换为你的业务逻辑 const order = req.body; console.log(`新订单已创建:订单ID ${order.id},客户邮箱 ${order.email}`); // 示例:保存订单到数据库、发送通知等操作 res.status(200).send('Webhook processed'); } catch (err) { console.error('Webhook处理失败:', err); res.status(500).send('Server error'); } }); // 启动服务器 const PORT = process.env.PORT || 3000; app.listen(PORT, () => { console.log(`服务器运行在端口 ${PORT}`); });
4. 注册订单创建Webhook
创建register-webhook.js脚本,用于向Shopify注册Webhook:
const shopify = require('@shopify/shopify-api'); const dotenv = require('dotenv'); dotenv.config(); async function registerOrderWebhook() { try { // 创建Shopify会话 const session = new shopify.Session({ shop: process.env.SHOPIFY_SHOP_DOMAIN, accessToken: process.env.SHOPIFY_ACCESS_TOKEN, }); // 注册订单创建Webhook const result = await shopify.Webhooks.Registry.register({ session, topic: 'orders/create', path: '/webhooks/orders/create', webhookHandler: () => console.log('Webhook注册成功,将接收订单创建事件'), }); if (result.success) { console.log(`Webhook注册完成,ID:${result.id}`); } else { console.error('Webhook注册失败:', result.errors); } } catch (err) { console.error('注册过程出错:', err); } } registerOrderWebhook();
本地开发注意事项
- 本地服务器无法被Shopify直接访问,需使用
ngrok暴露端口:
把生成的HTTPS地址(如ngrok http 3000https://abc123.ngrok.io)作为Webhook的基础URL,完整路径为https://abc123.ngrok.io/webhooks/orders/create - 确保应用权限包含
read_orders或write_orders,否则无法注册订单相关Webhook - 签名验证必须实现,否则Shopify会认为端点无效
内容的提问来源于stack exchange,提问作者Tanvir Ahmed Shiddiquee
相关产品推荐
相关产品推荐

