JSAPI⽀付签名算法(附通⽤代码)
签名算法
签名⽣成的通⽤步骤如下:
第⼀步,设所有发送或者接收到的数据为集合M,将集合M内⾮空参数值的参数按照参数名ASCII码从⼩到⼤排序(字典序),使⽤URL键值对的格式(即key1=value1&key2=value2…)拼接成字符串stringA。
特别注意以下重要规则:
◆ 参数名ASCII码从⼩到⼤排序(字典序);
◆ 如果参数的值为空不参与签名;
◆ 参数名区分⼤⼩写;
◆ 验证调⽤返回或主动通知签名时,传送的sign参数不参与签名,将⽣成的签名与该sign值作校验。
◆ 接⼝可能增加字段,验证签名时必须⽀持增加的扩展字段
第⼆步,在stringA最后拼接上key得到stringSignTemp字符串,并对stringSignTemp进⾏MD5运算,再将得到的字符串所有字符转换为⼤写,得到sign值signValue。
◆ key设置路径:商户平台(pay.weixin.qq)–>账户设置–>API安全–>密钥设置
举例:
假设传送的参数如下:
appid: wxd930ea5d5a258f4f
mch_id:10000100
device_info:1000
body: test
nonce_str: ibuaiVcKdpRxkhJA
第⼀步:对参数按照key=value的格式,并按照参数名ASCII字典序排序如下:
stringA="appid=wxd930ea5d5a258f4f&body=test&device_info=1000&mch_id=10000100&nonce_str=ibuaiVcKdpRxkhJA";
第⼆步:拼接API密钥:
stringSignTemp=stringA+"&key=192006250b4c09247ec02edce69f6a2d"# 注:key为商户平台设置的密钥key
sign=MD5(stringSignTemp).toUpperCase()="9A0A8659F005D6984697E2CA0A9CF3B7"# 注:MD5签名⽅式
最终得到最终发送的数据:
<xml>
<appid>wxd930ea5d5a258f4f</appid>
<mch_id>10000100</mch_id>
<device_info>1000</device_info>
<body>test</body>
<nonce_str>ibuaiVcKdpRxkhJA</nonce_str>
<sign>9A0A8659F005D6984697E2CA0A9CF3B7</sign>
</xml>
贴上我的通⽤代码:
不管是验证调⽤返回或主动通知签名时,只要将所有发送或者接收到的数据传⼊函数(当然接收到的签名(sign)不能传⼊),即可得到签名.同时当接⼝可能增加字段时,完美⽀持增加的扩展字段.
from hashlib import md5, sha1
def get_sign(kwargs, sign_type='MD5', pay_sign_key=None, is_upper=True):
"""
签名参数组装
@param: kwargs 参与签名的参数 dict类型
@param: sign_type 签名类型
@param: pay_sign_key 是否需要⽀付密钥
@return: sign, sign_type
"""
# 根据ascii码进⾏排序
代码转换params =list(kwargs.items())
params.sort()
# url拼接
string ="&".join(["%s=%s"%(str(p[0]),str(p[1]))for p in params])
if pay_sign_key:
string +="&key=%s"% pay_sign_key
string =bytes(string,"UTF-8")
# ⽣成签名 Point: 这⾥签名时间戳,必须与wxconfig中得时间戳⼀致
sign =""
if sign_type =="MD5":
sign = md5(string).hexdigest().upper()if is_upper else md5(string).hexdigest()
if sign_type =="SHA1":
sign = sha1(string).hexdigest().upper()if is_upper else sha1(string).hexdigest()
# sign为签名,sign_type为签名类型
return sign, sign_type
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论