1、根据请求参数(公共参数和业务参数,不包含公共参数Signature)构造规范化请求字符串:CanonicalizedQueryString
第一步:请求参数排序。排序规则以参数名按照字典排序
第二步:请求参数编码。使用UTF-8字符集对每个请求参数的名称和参数取值进行URLEncode,一般在URLEncode后需对三种字符替换:加号(+)替换成 %20、星号(*)替换成 %2A、 %7E 替换回波浪号(~)
第三步:每对URLEncode后的参数名称和参数值,用=进行连接。每对之间使用&进行连接。得到规范化请求字符串CanonicalizedQueryString。
2、计算签名。
sign = hash_hmac(‘sha256’, CanonicalizedQueryString, sk)
sign值为签名算法返回的16进制格式小写字符串
签名样例:
88b203541ce8c757d7d554af2a25de036d3d9a636d91fb44d01bf82dc67a6941
计算签名时使用的sk为Accesskey对应的秘钥,使用的哈希算法是:HMAC-SHA256。
3、将签名值作为Signature参数值添加到请求参数中。
1、 构造规范化请求字符串样例
请求参数数组:
array (
'Mobile' => '1xxxx',
'TplId' => '1xxx',
'TplParams' => '{"key":"v~al"}',
'SignName' => '签名',
'Action' => 'SendSms',
'Version' => '2019-05-01',
'SignatureVersion' => '1.0',
'SignatureMethod' => 'HMAC-SHA256',
'Timestamp' => '2019-08-13T17:18:36Z',
'Service' => 'ksms',
'Accesskey' => 'xxx',
)
第一步,请求参数排序:排序结果如下。
array (
'Accesskey' => 'xxx',
'Action' => 'SendSms',
'Mobile' => '1xxxx',
'Service' => 'ksms',
'SignName' => '签名',
'SignatureMethod' => 'HMAC-SHA256',
'SignatureVersion' => '1.0',
'Timestamp' => '2019-08-13T17:18:36Z',
'TplId' => '1xxx',
'TplParams' => '{"key":"v~al"}',
'Version' => '2019-05-01',
)
第二步请求参数和参数值URLEncode,结果如下:
array (
'Accesskey' => 'xxx',
'Action' => 'SendSms',
'Mobile' => '1xxxx',
'Service' => 'ksms',
'SignName' => '%E7%AD%BE%E5%90%8D',
'SignatureMethod' => 'HMAC-SHA256',
'SignatureVersion' => '1.0',
'Timestamp' => '2019-08-13T17%3A18%3A36Z',
'TplId' => '1xxx',
'TplParams' => '%7B%22key%22%3A%22v~al%22%7D',
'Version' => '2019-05-01',
)
第三步字符串拼接如下:
Accesskey=xxx&Action=SendSms&Mobile=1xxxx&Service=ksms&SignName=%E7%AD%BE%E5%90%8D&SignatureMethod=HMAC-SHA256&SignatureVersion=1.0&Timestamp=2019-08-13T17%3A18%3A36Z&TplId=1xxx&TplParams=%7B%22key%22%3A%22v~al%22%7D&Version=2019-05-01
2、根据待签串计算签名
sk = 123456
CanonicalizedQueryString = "Accesskey=xxx&Action=SendSms&Mobile=1xxxx&Service=ksms&SignName=%E7%AD%BE%E5%90%8D&SignatureMethod=HMAC-SHA256&SignatureVersion=1.0&Timestamp=2019-08-13T17%3A18%3A36Z&TplId=1xxx&TplParams=%7B%22key%22%3A%22v~al%22%7D&Version=2019-05-01"
//sign = hash_hmac('sha256', CanonicalizedQueryString, sk)
sign: e2925c6745e11b06107920591b318c883b3b825bbc47fded40489bfbff6e660e
function sign($params, $secret_key)
{
ksort($params, SORT_STRING);
$str_encode = '';
foreach($params as $k=>$v) {
$str_encode .= rawurlencode($k).'='.rawurlencode($v).'&';
}
$str_encode = substr($str_encode, 0, -1);
return hash_hmac("sha256", $str_encode, $secret_key);
}
//rawurlencode 实现的urlencode,符合上述签名URLEncode的要求,所以无需做替换
#-*- coding:utf-8 -*-
import sys, os, base64, datetime, hashlib, hmac
import urllib
def sign(params, secret_key):
str_encode = ''
param_keys = sorted(params.keys())
for key in param_keys:
str_encode += urllib.quote(key,'~') + '=' + urllib.quote(str(params[key]),'~') + '&'
print(str_encode[:-1])
return hmac.new(secret_key, str_encode[:-1], hashlib.sha256).hexdigest()
文档内容是否对您有帮助?
评价建议不能为空
非常感谢您的反馈,我们会继续努力做到更好!