PHP开发Shopify应用:如何在应用安装时注册Webhooks?
嘿,刚好我之前用PHP开发Shopify应用的时候也遇到过这个需求,来给你详细说说怎么在应用安装时自动注册Webhooks,不用手动去后台操作~
核心思路
其实很简单:在你的应用完成Shopify OAuth授权流程、拿到店铺的access token之后,直接调用Shopify的Admin API来创建Webhooks就行。整个流程可以嵌入到OAuth回调的处理逻辑里,用户安装应用时自动完成注册。
具体实现步骤(PHP版本)
1. 确认前置条件
在开始之前,你需要确保:
- 应用已经完成OAuth流程,能获取到店铺域名(比如
my-shop.myshopify.com)和有效的access token - 应用的OAuth scopes已经包含
write_webhooks权限,同时还要加上对应事件的权限(比如要监听customers/create就需要read_customers,监听orders/create需要read_orders) - 准备好公网可访问的HTTPS地址作为Webhook接收URL(Shopify不支持HTTP地址)
2. 用Shopify官方PHP SDK实现(推荐)
官方SDK已经封装了很多细节,用起来更省心。首先通过Composer安装SDK:
composer require shopify/shopify-api
然后在OAuth回调的处理代码里加入Webhook注册逻辑:
use Shopify\Clients\Rest; use Shopify\Utils; // 先初始化SDK配置 Utils::initialize( apiKey: '你的应用API Key', apiSecretKey: '你的应用API Secret', scopes: ['write_webhooks', 'read_customers', 'read_orders'], // 按需调整权限 hostName: '你的应用域名', apiVersion: '2024-07', // 用最新稳定版API ); // 从OAuth回调参数中获取店铺信息和access token(这里假设你已经拿到了) $shopDomain = $_GET['shop']; $accessToken = '获取到的店铺access token'; // 创建Rest客户端 $client = new Rest($shopDomain, $accessToken); // 定义需要注册的Webhooks列表 $webhookList = [ [ 'topic' => 'customers/create', // 新客户注册事件 'address' => 'https://你的应用域名/webhooks/customer-created', // 接收通知的接口 'format' => 'json' ], [ 'topic' => 'orders/create', // 订单创建事件 'address' => 'https://你的应用域名/webhooks/order-created', 'format' => 'json' ] ]; // 逐个注册Webhook foreach ($webhookList as $webhook) { try { $response = $client->post( path: '/admin/api/2024-07/webhooks.json', body: ['webhook' => $webhook] ); if ($response->getStatusCode() === 201) { // 注册成功,可以记录日志或做其他处理 error_log("Webhook {$webhook['topic']} 注册成功"); } else { error_log("Webhook {$webhook['topic']} 注册失败: " . json_encode($response->getDecodedBody())); } } catch (\Exception $e) { error_log("注册Webhook时出错: " . $e->getMessage()); } }
3. 原生cURL实现(不用SDK的情况)
如果不想依赖官方SDK,也可以用原生cURL调用API:
$shopDomain = 'my-shop.myshopify.com'; $accessToken = '获取到的店铺access token'; $apiVersion = '2024-07'; $webhookList = [ [ 'topic' => 'customers/create', 'address' => 'https://你的应用域名/webhooks/customer-created', 'format' => 'json' ], [ 'topic' => 'orders/create', 'address' => 'https://你的应用域名/webhooks/order-created', 'format' => 'json' ] ]; foreach ($webhookList as $webhook) { $apiUrl = "https://{$shopDomain}/admin/api/{$apiVersion}/webhooks.json"; $ch = curl_init($apiUrl); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode(['webhook' => $webhook])); curl_setopt($ch, CURLOPT_HTTPHEADER, [ "Content-Type: application/json", "X-Shopify-Access-Token: {$accessToken}" ]); $response = curl_exec($ch); $statusCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); curl_close($ch); if ($statusCode === 201) { error_log("Webhook {$webhook['topic']} 注册成功"); } else { error_log("Webhook {$webhook['topic']} 注册失败: {$response}"); } }
关键注意事项
- 权限必须正确:如果没有
write_webhooks权限,API调用会返回403错误,所以一定要在OAuth scopes里加上 - 验证Webhook签名:Shopify会给每个Webhook请求带上签名,你的接收接口必须验证签名,防止伪造请求。官方SDK里可以用
Utils::verifyWebhook()方法,原生实现的话可以参考Shopify文档的签名验证逻辑 - 测试接收接口:可以用工具把本地接口暴露到公网,方便测试Webhook是否能正常接收
- API版本兼容:尽量使用Shopify最新的稳定API版本,避免旧版本接口被废弃
内容的提问来源于stack exchange,提问作者Rohit Goel
相关产品推荐
相关产品推荐

