php - HTTP POST curl php时的GDMS(Grandstream)API问题
问题描述
我正在尝试通过 php 中的 curl 向新的 Grandstream API 发送 HTTP POST 请求,但每次都会遇到相同的错误。我不得不说我目前能够成功地执行 GET 请求,但是当必须在 POST 中发送正文时问题就开始了。
$gdms_domain = "eu.gdms.cloud";
$timestamp = round(microtime(true)*1000);
$params_data = array(
'access_token' => '*********',
'client_id' => '*****',
'client_secret' => '************',
'timestamp' => $timestamp
);
$body_data = array(
'pageSize' => "",
'pageNum' => "",
'order' => "",
'type' => "",
'orgId' => ""
);
$params = http_build_query($params_data);
$body = json_encode($body_data);
$signature = hash("sha256","&".$params."&");
$payload_data = array(
'access_token' => $token,
'signature' => $signature,
'timestamp' => $timestamp
);
$payload = http_build_query($payload_data);
$ch = curl_init();
$options = array(
CURLOPT_RETURNTRANSFER => true,
CURLOPT_SSL_VERIFYPEER => false,
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => $body,
CURLOPT_URL => 'https://'.$gdms_domain.'/oapi/v1.0.0/device/list'."?".$payload,
CURLOPT_HTTPHEADER => array(
"Content_type: application/json"
)
);
curl_setopt_array($ch, $options);
$response = curl_exec($ch);
if(curl_error($ch)){
echo 'Request Error:'.curl_error($ch);
}else{
$response = json_decode($response);
print_r($response);
return $response;
}
curl_close($ch);
返回的错误是:
(
[data] =>
[msg] => bad signature
[retCode] => 40003
)
API 文档在这里GDMS API。我尝试根据文档以两种可能的方式构建签名并以不同的方式发送正文。
谢谢
解决方案
您应该将散列正文添加到签名中。
$body_signature = hash("sha256",$body);
那么最终签名应该是
$signature = hash("sha256","&".$params."&".$body_signature."&");
推荐阅读
- python - 递归解析文件夹和子文件夹
- java - 为什么这个游戏循环实现的帧速率比每次迭代执行更多计算的帧速率低?
- javascript - JSON:在可变深度分支中访问特定的叶子
- asp.net-core - 404 将 asp.net core 托管的 blazor webassembly 部署到 Netlify
- docker - 如何使 GitHub 工作流依赖于另一个工作流的成功?
- java - Java Maven ClassNotFoundException:com.mysql.cj.jdbc.Driver
- reactjs - 如何在前端文件夹之外加载图像
- react-native - 反应原生,使用 TouchableOpacity onPress
- c++ - 如何在 C++ 中的 5 张牌中找到“四种”
- coq - 如何使用 ssreflect 进行反射:无法将 ?x == ?y 与“n = n0”统一