PHP调用Shopee RefreshAccessToken接口始终返回error_param报错求助
PHP调用Shopee RefreshAccessToken接口返回error_param错误排查
你的代码存在3处直接触发参数错误的问题,逐一列示:
- 签名计算变量名不匹配:你定义的密钥变量为
$partner_key,但调用hash_hmac计算签名时传入的是未定义的$key变量,直接导致签名计算结果错误。 - POST参数键名错误:请求体数组中
refresh_token:、partner_id:两个键名末尾多写了多余的冒号,接口无法识别这两个参数。 - 请求体格式不匹配:你在请求头中声明
Content-Type: application/json,但直接将PHP数组传入CURLOPT_POSTFIELDS时,cURL会默认将数据编码为multipart/form-data格式,和声明的JSON类型不符,接口无法正确解析参数。 - 补充注意:计算签名时传入的时间戳必须是10位秒级时间戳,不能传毫秒级,你当前用
time()获取的数值符合要求,无需修改。
修正后的可运行代码
<?php $partner_id = '你的partner_id'; $partner_key = '你的partner_key'; $timest = time(); $shop_id = '你的shop_id'; $refresh_token = '你的refresh_token'; $host = 'https://partner.shopeemobile.com'; $path = '/api/v2/auth/access_token/get'; $base_string = sprintf("%s%s%s",$partner_id,$path,$timest); // 修正:传入正确的密钥变量$partner_key $sign = hash_hmac('sha256', $base_string, $partner_key, false); $url = $host.$path.sprintf("?timestamp=%s&partner_id=%s&sign=%s",$timest,$partner_id,$sign); // 修正:去掉参数键名多余的冒号,对ID类参数做整数类型转换更稳妥 $data = array( 'shop_id' => intval($shop_id), 'refresh_token' => $refresh_token, 'partner_id' => intval($partner_id), ); $curl = curl_init(); curl_setopt_array($curl, array( CURLOPT_URL => $url, CURLOPT_RETURNTRANSFER => true, CURLOPT_ENCODING => '', CURLOPT_MAXREDIRS => 10, CURLOPT_TIMEOUT => 0, CURLOPT_FOLLOWLOCATION => true, CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, CURLOPT_SSL_VERIFYPEER => false, CURLOPT_SSL_VERIFYHOST => false, // 修正:将数组转为JSON字符串传入,匹配Content-Type要求 CURLOPT_POSTFIELDS => json_encode($data), CURLOPT_CUSTOMREQUEST => 'POST', CURLOPT_HTTPHEADER => array( 'Content-Type: application/json' ), )); $response = curl_exec($curl); $err = curl_error($curl); curl_close($curl); if ($err) { echo "cURL请求错误: " . $err; } else { echo $response; } ?>
接口请求成功时返回示例:
{"access_token":"新生成的access_token","expire_in":14400,"refresh_token":"新的refresh_token","request_id":"请求唯一ID"}
内容的提问来源于stack exchange,提问作者Victor Leonardo
相关产品推荐
相关产品推荐

