HikCentral Professional OpenAPI认证异常:200状态无有效JSON响应求助
问题:PHP cURL调用HikCentral Professional停车费计算API返回200但无法解析JSON
我使用PHP cURL调用HikCentral Professional的parkingfee/calculate API时,请求返回200状态码,但解码响应时提示**“控制字符错误,可能编码不正确”**,无法获取预期的停车费计算JSON结果。此前曾遇到400错误,调整请求头后状态码变为200,但问题仍未解决。怀疑问题出在签名计算或请求头配置上,联系海康技术支持未获得针对性帮助,附上相关代码及错误信息,恳请协助排查。
相关代码
<?php $apiUrl = "https://your-hikcentral-domain/parkingfee/calculate"; $apiKey = "YOUR_API_KEY"; $apiSecret = "YOUR_API_SECRET"; // 构造请求参数 $requestParams = [ "parkingLotId" => "PL_001", "plateNo" => "京A12345", "entryTime" => "2024-06-01 09:00:00", "exitTime" => "2024-06-01 11:30:00" ]; // 签名计算(按自身理解实现的逻辑) $signRaw = http_build_query($requestParams) . $apiSecret; $sign = md5($signRaw); // 初始化cURL $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $apiUrl); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($requestParams)); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_HTTPHEADER, [ "Content-Type: application/json", "X-Api-Key: {$apiKey}", "X-Signature: {$sign}" ]); // 执行请求 $response = curl_exec($ch); $httpStatusCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); curl_close($ch); // 尝试解析JSON var_dump($httpStatusCode); // 输出:int(200) $parsedData = json_decode($response, true); var_dump(json_last_error_msg()); // 输出:string(42) "控制字符错误,可能编码不正确" ?>
错误信息
json_last_error_msg() 返回:控制字符错误,可能编码不正确
排查建议
- 检查响应原始内容:直接
var_dump($response)或用bin2hex($response)查看十六进制形式,确认返回内容是否为标准JSON,是否存在不可见控制字符(如\0、\x01等)或乱码。 - 核对签名计算逻辑:严格对照海康API文档的签名规则:
- 确认参数是否按指定规则排序(如字典序升序)
- 确认签名拼接字符串是否包含所有必要元素(如请求方法、URL路径、参数串、密钥的组合顺序)
- 确认哈希算法是否与文档一致(如SHA256而非MD5)
- 校验请求头配置:
- 确认
Content-Type与API要求匹配(部分API可能要求application/x-www-form-urlencoded而非application/json) - 检查请求头是否存在多余空格、换行符或编码错误的字符
- 确认
- 处理响应压缩:添加cURL选项
CURLOPT_ENCODING => 'gzip, deflate',自动解压API返回的压缩内容,避免因未解压导致的解析异常。 - 统一响应编码:用
mb_detect_encoding($response)检测响应编码,若不是UTF-8,转码后再解析:$response = mb_convert_encoding($response, 'UTF-8', mb_detect_encoding($response));
内容的提问来源于stack exchange,提问作者abraham
相关产品推荐
相关产品推荐

