PHP调用KD100实时物流追踪API返回104无效签名问题求助
KD100实时物流追踪API签名无效错误修复
问题表现
调用接口返回104错误码,提示Invalid signature,已确认API Key、Secret Key、运单查询参数填写无误。
原代码存在的规范问题
- 签名传值不一致:代码中计算签名后已做大写转换存入
$header_data数组,但实际传入curl请求头的signature字段使用的是未转大写的原始MD5值,和服务端校验要求的大写签名不匹配 - 请求体格式与声明的Content-Type不符:请求头声明
Content-Type: application/json,但实际传参使用http_build_query()将参数转为表单格式,还额外套了一层param外层键,服务端解析到的请求体和参与签名计算的内容不一致 - 签名计算的基准内容错误:签名计算时使用的是包裹了
param键的表单对应JSON串,和实际要求参与签名的、直接传递的业务参数JSON串不匹配,直接导致签名校验失败
修正后代码
$key = '你的实际API Key'; $secret = '你的实际Secret Key'; $param = array ( 'carrier_id' => 'usps', 'tracking_number' => '实际查询运单号' ); // 直接生成JSON格式请求体,不额外包裹param层,不做表单格式转换 $request_body = json_encode($param, JSON_UNESCAPED_UNICODE); // 按规则生成签名:请求体JSON串拼接API Key、Secret Key后做MD5,结果转大写 $sign = strtoupper(md5($request_body . $key . $secret)); $url = 'https://www.kd100.com/api/v1/tracking/realtime'; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_POSTFIELDS, $request_body); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); curl_setopt($ch, CURLOPT_HTTPHEADER, array( "Content-Type: application/json", "signature: $sign", "API-Key: $key" )); $result = curl_exec($ch); $data = json_decode($result, true); echo '<br/><br/>Start:<br/><pre>'; print_r($data); echo '</pre>';
内容的提问来源于stack exchange,提问作者user19469716
相关产品推荐
相关产品推荐

