组装package需要的参数如上面代码所示,所以我们需要准备一个params,然后准备签名,签名流程如下:
1.按照key的字典序,对params进行排序,然后拼接成字符串,注意这些key不包括sign
2.在上面的字符串后面拼接key=paternerKey,然后对整个字符串进行md5签名,然后转换成大写,此时我们就得到了签名
然后我们将所有params的value进行urlencode转码,然后后面拼接上sign=signValue,就得到了package字符串。
这里创建MD5的过如下:
def createMD5Signature(self, signParams):
‘‘‘先排序‘‘‘
sortedParams = sorted(signParams.iteritems(), key=lambda d:d[0])
‘‘‘拼接‘‘‘
stringSignTemp = "&".join(["%s=%s" % (item[0], item[1]) for item in sortedParams if item[0] != ‘sign‘ and ‘‘ != item[1]])
#加上财付通商户权限密钥
stringSignTemp += ‘&key=%s‘ % (self.partnerKey)
#使用MD5进行签名,然后转化为大写
stringSign = hashlib.md5(stringSignTemp).hexdigest().upper() #Upper
return stringSign
组装package的代码:
def getPackage(self, packageParams):
‘‘‘先获取params的sign,然后将params进行urlencode,最后拼接,加上sign‘‘‘
sign = self.createMD5Signature(packageParams)
packageParams = sorted(packageParams.iteritems(), key=lambda d:d[0])
stringParams = "&".join(["%s=%s" % (item[0], urllib.quote(str(item[1]))) for item in packageParams])
stringParams += ‘&sign=%s‘ % (sign)
return stringParams
继续组装参数
得到package后,我们继续组装参数:
这里需要的参数为:
appid=wxd930ea5d5a258f4f appkey=L8LrMqqeGRxST5reouB0K66CaY A WpqhA Vsq7ggKkxHCOastWksvuX1uvmvQcl xaHoYd3ElNBrNO2DHnnzgfVG9Qs473M3DTOZug5er46FhuGofumV8H2FVR9qkjSlC5K noncestr=e7d161ac8d8a76529d39d9f5b4249ccb package=bank_type=WX&body=%E6%94%AF%E4%BB%98%E6%B5%8B%E8%AF%95 &fee_type=1&input_charset=UTF-8¬ify_url=http%3A%2F%2Fweixin.qq.com&out_trade_no =7240b65810859cbf2a8d9f76a638c0a3&partner=1900000109&spbill_create_ip=196.168.1.1&tot al_fee=1&sign=7F77B507B755B3262884291517E380F8 timestamp=1399514976
traceid=test_1399514976
注意这里有个坑:
参与签名的是上面的参数,但是最后的参数中不包括appKey,签名后要记得删除。
1.所有参数按照字典序排序,然后拼接
2.进行sha1签名,拼接到上面字符串的后面
3.注意这里要删除appKey,然后加上sign
获取sha1签名的代码如下:
def createSHA1Signature(self, params):
‘‘‘先排序,然后拼接‘‘‘
sortedParams = sorted(params.iteritems(), key=lambda d:d[0])
stringSignTemp = "&".join(["%s=%s" % (item[0], item[1]) for item in sortedParams])
stringSign = hashlib.sha1(stringSignTemp).hexdigest()
return stringSign







