最近更新时间:2024-02-26 15:54:33
第一步:请求参数排序
请求参数包括公共参数和业务参数,不包含公共参数Signature。
排序规则以参数名按照字典排序。
第二步:请求参数编码
使用UTF-8字符集按照RFC3986规则编码请求参数和参数取值,编码规则如下:
对于字符A ~ Z、a ~ z、0 ~ 9以及字符-、_、.和~不编码。
对于其他字符编码成%XY的格式,其中XY是字符对应ASCII码的16进制(大写)。
不同语言实现的URLEncode方式不同,为了得到RFC3986规则的编码,分别说明如下:
如果您使用的是Java中的java.net.URLEncoder,可以先用URLEncoder.encode方法编码,随后将编码后的字符中加号(+)替换为%20、星号(*)替换为%2A、%7E替换为波浪号(~)即可;
如果您使用的是golang中的net/url,可以用url.Values.Encode方法编码,随后将编码后的字符中加号(+)替换为%20即可;
如果您使用的是php中的rawurlencode方法,不需要替换;
如果您使用的是python3中的urllib.request,可以用urllib.request.quote方法,需要指定字符串中的波浪号(~)不编码,例如urllib.request.quote(str, ‘~’),str为待编码字符串;
第三步:请求参数拼接成CanonicalizedQueryString
每对URLEncode后的参数名称和参数值,用=进行连接。每对之间使用&进行连接。得到规范化请求字符串CanonicalizedQueryString。
sign = hash_hmac(‘sha256’, CanonicalizedQueryString, sk)
sign值为签名算法返回的16进制格式小写字符串
签名样例:
5346bfebeb3f2162e2459e09a52b640584e5f1aa5012b15c6b85388680d4663e
计算签名时使用的sk为Accesskey对应的秘钥,使用的哈希算法是:HMAC-SHA256。
纯净模式