app/uninstalled Webhook已注册但在/webhooks.json中无法查询
先整理下你提供的注册代码和返回结果,方便咱们分析问题:
注册Webhook的PHP代码
$chh = curl_init(); $params = [ 'webhook' => [ 'topic' => 'app/uninstalled', 'address' => 'https://example.herokuapp.com/delete.php', 'format' => 'json' ] ]; $json_string_params = json_encode($params); $headers = array( 'X-Shopify-Access-Token:'.$access_token, 'Content-Type:application/json' ); curl_setopt($chh, CURLOPT_URL, 'https://example.myshopify.com/admin/webhooks.json'); curl_setopt($chh, CURLOPT_HTTPHEADER, $headers); curl_setopt($chh, CURLOPT_HEADER, false); curl_setopt($chh, CURLOPT_CUSTOMREQUEST, 'POST'); curl_setopt($chh, CURLOPT_POSTFIELDS, $json_string_params); curl_setopt($chh, CURLOPT_RETURNTRANSFER, true); $resultt = curl_exec($chh); $final = json_decode($resultt);
注册成功的返回结果
stdClass Object ( [webhook] => stdClass Object ( [id] => 475440480367 [address] => https://example.herokuapp.com/delete.php [topic] => app/uninstalled [created_at] => 2019-01-18T05:04:20-05:00 [updated_at] => 2019-01-18T05:04:20-05:00 [format] => json [fields] => Array ( ) [metafield_namespaces] => Array ( ) ) )
明明注册返回了有效的Webhook对象,但查询列表却看不到,这大概率是以下几个原因之一,咱们逐个排查:
访问令牌的权限或关联问题
注册Webhook需要write_webhooks权限,而查询Webhook列表需要read_webhooks权限。你要确认你的$access_token是否同时具备这两个权限,另外还要核实这个令牌是不是属于你查询的那个店铺(example.myshopify.com)——有时候可能不小心用了其他店铺的令牌,导致注册到别的店铺去了。Shopify API的缓存延迟
Shopify的后台数据同步偶尔会有延迟,尤其是Webhook这类资源。建议你等个5-10分钟后再重新调用查询接口试试,有时候只是数据还没同步到列表查询的端点。查询接口的API版本问题
你注册的时候用的是无版本的API端点(/admin/webhooks.json),Shopify会默认使用一个旧的API版本;而如果你查询的时候用了不同的版本,可能会看不到这个Webhook。最好在请求里明确指定API版本,比如用最新的稳定版:https://example.myshopify.com/admin/api/2024-07/webhooks.json注册的时候也建议加上版本,避免版本不一致的问题。
直接通过ID查询验证
既然注册返回了Webhook的id(475440480367),你可以直接调用单个Webhook的查询接口来验证它是否存在:https://example.myshopify.com/admin/webhooks/475440480367.json如果这个接口能返回数据,说明Webhook确实存在,只是列表查询可能有问题;如果返回404,那说明注册的时候可能有隐性错误(比如地址不合法,但Shopify当时没检测出来?不过这种情况很少见)。
检查Shopify后台
直接登录到example.myshopify.com的后台,进入“设置->通知->Webhooks”(或者你的应用对应的“Webhooks”页面),手动查看有没有这个Webhook。后台的显示通常会比API查询更及时,能直接确认Webhook是否真的存在。
另外,也可以在注册代码里加上curl_error($chh)来排查请求层面的隐性问题,虽然返回了成功的JSON,但说不定有你没注意到的警告。
内容的提问来源于stack exchange,提问作者satani ketan

