HTTP POST curl php时的GDMSGrandstreamAPI问题

问题描述

我正在尝试通过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."&");