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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:07:48