Shopify API与GraphQL开发求助:无头定时应用认证及请求报错
解决方案:无头定时任务访问Shopify GraphQL API问题
1. 关于Auth0认证的疑问
你的无头定时任务完全不需要Auth0或会话令牌认证。Shopify GraphQL API支持两种认证模式:
- 用户会话认证:示例中用的Auth0属于这类,适合需要用户交互的前端/嵌入应用,依赖OAuth流程获取会话令牌。
- 服务器端令牌认证:针对无头、定时任务这类后台应用,直接使用Shopify私有应用(或自定义应用)的访问令牌即可,无需Auth0。
API密钥+访问令牌足够完成所有后台操作(读取商品、更新库存等),这才是你应该采用的认证方式。
2. 解决curl错误“Could not resolve host: login”
这个错误是因为请求URL格式错误,导致域名解析失败。正确的Shopify GraphQL端点格式为:
https://{shop-name}.myshopify.com/admin/api/{api-version}/graphql.json
检查你的URL:
- 是否遗漏了
.myshopify.com后缀? - 是否误将
login包含在域名中(比如写成https://login.xxxxxx...)?
修正URL后,域名即可正常解析。
3. 浏览器访问弹出登录框的原因
浏览器直接访问GraphQL端点时,没有携带X-Shopify-Access-Token请求头,Shopify会自动触发基本认证 fallback,因此弹出登录对话框。这是正常现象,你的定时任务请求只要正确携带令牌,就不会出现这个问题。
4. 正确的PHP请求示例(无需Auth0)
以下是适合定时任务的PHP请求代码,直接使用访问令牌完成认证:
<?php $shopDomain = 'your-shop.myshopify.com'; // 替换为你的店铺域名 $accessToken = 'your-server-access-token'; // 替换为私有应用/自定义应用的访问令牌 $apiVersion = '2025-01'; $graphqlUrl = "https://{$shopDomain}/admin/api/{$apiVersion}/graphql.json"; // 示例查询:获取第一个商品的库存信息 $query = '{ products(first: 1) { edges { node { id title inventoryItems(first: 1) { edges { node { id inventoryQuantity } } } } } } }'; $ch = curl_init($graphqlUrl); curl_setopt_array($ch, [ CURLOPT_RETURNTRANSFER => true, CURLOPT_POST => true, CURLOPT_HTTPHEADER => [ 'Content-Type: application/json', "X-Shopify-Access-Token: {$accessToken}" ], CURLOPT_POSTFIELDS => json_encode(['query' => $query]) ]); $response = curl_exec($ch); if (curl_errno($ch)) { die('Curl Error: ' . curl_error($ch)); } $responseData = json_decode($response, true); print_r($responseData); curl_close($ch); ?>
5. 关键注意事项
- 确保访问令牌拥有足够权限(如
read_products、write_inventory),创建应用时需勾选对应权限。 - 私有应用的访问令牌永久有效,自定义应用的服务器端令牌若设置了过期时间,需定期刷新。
- 访问令牌仅在后台定时任务中使用,禁止在前端代码中暴露。
内容的提问来源于stack exchange,提问作者Barry White
相关产品推荐
相关产品推荐

