使用Shopify API PHP添加商品:价格与图片未生效的数组问题排查
问题诊断与修复方案
嘿,我帮你排查出了核心问题,主要集中在请求格式和参数细节上,一步步来解决:
1. 最关键的问题:请求体编码格式错误
Shopify的REST API要求POST/PUT请求的主体必须是JSON格式,但你的代码里把请求数组用http_build_query()转成了URL编码格式(比如product[title]=TITLE&product[variants][0][price]=1160),这种格式和API的要求不匹配,导致价格、图片这类嵌套字段无法被正确解析。
看你代码里这段有问题的逻辑:
if ($method != 'GET' && in_array($method, array('POST', 'PUT'))) { if (is_array($query)) $query = http_build_query($query); curl_setopt ($curl, CURLOPT_POSTFIELDS, $query); }
这里应该把数组转成JSON字符串,而不是URL编码。
2. 缺少必要的请求头
发送JSON数据时,必须在请求头里声明Content-Type: application/json,否则Shopify无法识别请求体的格式,自然也解析不了里面的价格和图片字段。
3. 可选的参数细节优化
- 价格字段
price建议传字符串类型(比如"1160.00"),虽然Shopify也接受数字,但字符串能避免浮点数精度问题; - 图片的
src必须是公开可访问的HTTPS链接,如果是HTTP链接或者本地路径,Shopify会拒绝抓取图片。
修复后的代码调整
把你的shopify_call函数里的请求头和POST/PUT处理部分修改如下:
// Setup headers $request_headers[] = ""; if (!is_null($token)) { $request_headers[] = "X-Shopify-Access-Token: " . $token; } // 添加JSON格式的Content-Type头 if (in_array($method, array('POST', 'PUT'))) { $request_headers[] = "Content-Type: application/json"; } curl_setopt($curl, CURLOPT_HTTPHEADER, $request_headers); if ($method != 'GET' && in_array($method, array('POST', 'PUT'))) { // 将数组转为JSON字符串,替代URL编码 if (is_array($query)) { $query = json_encode($query); } curl_setopt ($curl, CURLOPT_POSTFIELDS, $query); }
验证你的请求数组
确保你的$query数组结构正确,补充细节优化:
$query = array( 'product' => array( 'title' => 'TITLE', 'body_html' => '<p><strong>DESCRIPTION</strong></p>', 'vendor' => 'TESTSTORE', 'product_type' => '', 'tags' => '', 'published' => 1, 'variants' => array( array( 'price' => '1160.00' // 用字符串格式更稳妥 ) ), 'images' => array( array('src' => 'https://yourdomain.com/urlofimage.jpg'), // 必须是HTTPS公开链接 array('src' => 'https://yourdomain.com/urlofimage2.jpg') ) ) );
调试小技巧
修改后可以先打印json_encode($query)的结果,确认JSON格式正确;如果还有问题,直接print_r($response)查看Shopify返回的错误信息——Shopify的错误响应会明确告诉你哪个字段不符合要求,非常好排查。
内容的提问来源于stack exchange,提问作者Ako Si
相关产品推荐
相关产品推荐

