官方文档
记录日期于2022-12-08,官方可能会随时更新计算方法,以官方为准;一千年以后请忽略此文。
e签宝请求签名鉴权官方文档地址。
官方给出了JAVA示例,但对JAVA不熟悉,难理解,搞得折腾浪费了一整天的时间,记录错误便于后来者。
PHP示例
生成待签字符串
- 此处刚开始做的时候,犯了低级错误,所有数据都对了,就是写错了
$Accept
的值 文档要求的是*/*
,我写成/
;导致请求一直被拒绝,拒绝到怀疑人生。 - 官方文档说的
URL
也需要谨慎:不含主机信息,如:/v2/identity/auth/web/indivAuthUrl
- 在我的使用中 签名的计算没有有用到
Headers
,所以下列代码$headersStr
的正确性没有进行验证。
/**
* 生成请求签名
* @param string $HTTPMethod 请求类型
*/
private function getSignature(string $HTTPMethod, string $ContentMD5, string $Url, string $ContentType="application/json;charset=UTF-8", string $Accept="*/*", $Date = null, array $Headers = null)
{
$signString = "$HTTPMethod\n$Accept\n$ContentMD5\n$ContentType\n$Date\n";
$headersStr = "";
if (!empty($Headers)) {
foreach ($Headers as $key => $val) {
$headersStr .= "$key:$val\n";
}
}
if (!empty($headersStr)) {
$signString .= $headersStr."\n";
}
$signString .= $Url;
// Log::write("signString: $signString","info");
$signature = hash_hmac("sha256",utf8_encode($signString), utf8_encode($this->secret), true);
$signatureBase64 = base64_encode($signature);
return $signatureBase64;
}//getSignature end
生成Content-MD5
/**
* 获取 ContentMD5 数据
*/
private function getContentMD5($data)
{
$datastr = json_encode($data);
//官方给的示例代码是用 md5_file,但md5_file只针对文件,如果请求是json的话,还是需要用md5
$md5Data = md5($datastr, true);
return base64_encode($md5Data);
}//getContentMD5 end
其他
请求头,参照文档拼接上去即可,容易理解。
有一哥们进行了封装:其他大佬封装的代码