调用Walmart市场API按SKU获取商品返回401错误求排查方案
问题排查及修复方案
返回401状态码属于接口认证校验失败,具体问题及修复方案如下:
- 打印
CURLOPT_HTTPGET得到80属于正常现象,这是PHP CURL扩展的内置常量值,不是错误返回值,无需处理。 - 核心错误1:商品查询接口的Authorization计算逻辑错误,你将client_id和client_secret用加号
+拼接后做base64编码,正确应该和获取token接口一致,用冒号:拼接,直接导致Basic认证校验不通过。 - 核心错误2:access_token对应的请求头参数名写错,沃尔玛官方要求的请求头为
WM_SEC.ACCESS_TOKEN,你写为了WM_SEC_ACCESS_TOKEN,把点号替换成了下划线,服务端无法识别你传入的access_token。 - 冗余配置:GET请求没有提交请求体,不需要携带
Content-Type: application/json请求头,虽然不会直接导致报错,但属于不合理配置。
修正后的代码片段
$token = getToken(); $data = getWalmartDetail(); $client_id = $data['client_id']; $client_secret = $data['client_secret']; // 修正1:拼接用冒号而非加号 $authorization = base64_encode($client_id.":".$client_secret); $url = "https://marketplace.walmartapis.com/v3/items/1234567?productIdType=SKU"; $ch = curl_init(); $qos = uniqid(); $options = array( CURLOPT_URL => $url, CURLOPT_RETURNTRANSFER => true, CURLOPT_TIMEOUT => 60, CURLOPT_HEADER => false, CURLOPT_HTTPHEADER => array( "WM_SVC.NAME: Walmart Marketplace", "WM_QOS.CORRELATION_ID: $qos", "Authorization: Basic $authorization", // 修正2:请求头用点号而非下划线 "WM_SEC.ACCESS_TOKEN: $token", "Accept: application/json", ), CURLOPT_HTTPGET => true, ); curl_setopt_array($ch, $options); $response = curl_exec($ch); $code = curl_getinfo($ch, CURLINFO_HTTP_CODE); curl_close($ch); if ($code == 201 || $code == 200){ $response = json_decode($response,true); echo "<pre>"; print_r($response); exit(); } else{ print_r("No"); return false; }
修改完成后重新请求即可正常获取商品详情。
内容的提问来源于stack exchange,提问作者raobabar
相关产品推荐
相关产品推荐

