签名错误是开发者在接入API过程中非常常见的错误,如果使用的是PHP或者Java,建议基于官网提供的demo代码来改造,基本能避免这个问题。常见的签名错误分为代码实现错误、调用方式错误和其他错误这几类,以下展开来讲解,并介绍验证签名的简易方法。
官网提供了多种编程语言的签名实现,基本能满足大部分后台开发的需求。对于其他语言的实现以Go语言为例讲解一下需要注意的点,签名代码如下:
/**
* 生成签名
*
* @param secretId 邮件下发的secret_id
* @param secretKey 邮件下发的secret_key
* @param httpMethod http请求方法 GET/POST/PUT等
* @param headerNonce X-TC-Nonce请求头,随机数
* @param headerTimestamp X-TC-Timestamp请求头,当前时间的秒级时间戳
* @param requestUri 请求uri,eg:/v1/meetings
* @param requestBody 请求体,没有的设为空串
* @return 签名,需要设置在请求头X-TC-Signature中
*/
func DoSignature(secretId string, secretKey string, httpMethod string, headerNonce string, headerTimestamp string, requestUri string, requestBody string) string {
//1、串联Header参数
headSignStr := fmt.Sprintf("X-TC-Key=%s&X-TC-Nonce=%s&X-TC-Timestamp=%s",
secretId, headerNonce, headerTimestamp)
//2、组签名串
signStr := fmt.Sprintf("%s\n%s\n%s\n%s", httpMethod, headSignStr, requestUri, requestBody)
//3、计算签名
h := hmac.New(sha256.New, []byte(secretKey))
h.Write([]byte(signStr))
sha := hex.EncodeToString(h.Sum([]byte{}))
//4、Base64编码
signBase64 := base64.StdEncoding.EncodeToString([]byte(sha))
return signBase64
}
根据官网的介绍,我们可以知道签名是分4步的:1、串联Header参数;2、组签名串;3、SHA256计算签名;4、Base64编码。
常见的代码错误主要有3个:
public static String chineseToUnicode(String str) {
String result = "";
for (int i = 0; i < str.length(); i++) {
int chr1 = (char)str.charAt(i);
// 汉字范围 \u4e00 - \u9fa5
if (chr1 >= 19968 && chr1 <= 171941) {
result += "\\u" + Integer.toHexString(chr1);
} else {
result += str.charAt(i);
}
}
return result;
}
在完成接口开发之前是无法通过向服务器发送请求来确认签名是否正确的,因此需要借助官网提供的开发者工具来验证我们的签名算法。为了简单起见,验证签名算法时我们使用没有消息体参数的GET方法,以通过会议ID查询这个接口为例讲讲怎么使用。
按下图填好参数后依次点击生成当前时间戳,生成一个随机数和获取签名按钮。
点击发送请求,然后在下面的原始请求处获取用于签名的参数及签名结果,然后将同样的参数放入自己的签名代码中验证。注意不要在上面的请求头界面直接双击拷贝签名结果,会漏掉最后的两个“=”导致签名计算结果不一样。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。