这节主要是使用类封装一个签名规则的练习,有一个签名规则的需求是:
A、输入数据:
1、请求数据:
vendorId=1697&posCode=pos006&ip=127.0.0.1&posVersion=2.1.1.1.1&mac=;D4-81-D7-CA-20-29;7C-67-A2-9A-06-05;7C-67-A2-9A-06-06;7C-67-A2-9A-06-09;00-00-00-00-00-0000E0
2:商家编码:
1697
B、计算规则:
1、将商家编码(vendorId)1697进行两次MD5加密得到一个字符串 Astr:09B764965CE4E92BED8BD3140E22D5CF
2、将请求数据
vendorId=1697&posCode=pos006&ip=127.0.0.1&posVersion=2.1.1.1.1&mac=;D4-81-D7-CA-20-29;7C-67-A2-9A-06-05;7C-67-A2-9A-06-06;7C-67-A2-9A-06-09;00-00-00-00-00-0000E0
进行urlDecode处理(编码格式为utf-8)得到一个字符串urlDecodeStr:
vendorId=1697&posCode=pos006&ip=127.0.0.1&posVersion=2.1.1.1.1&mac=;D4-81-D7-CA-20-29;7C-67-A2-9A-06-05;7C-67-A2-9A-06-06;7C-67-A2-9A-06-09;00-00-00-00-00-0000E0
3、urlDecodeStr + Astr 拼接得到一个待加密的字符串 beforeMD5
vendorId=1697&posCode=pos006&ip=127.0.0.1&posVersion=2.1.1.1.1&mac=;D4-81-D7-CA-20-29;7C-67-A2-9A-06-05;7C-67-A2-9A-06-06;7C-67-A2-9A-06-09;00-00-00-00-00-0000E009B764965CE4E92BED8BD3140E22D5CF
然后将 beforeMD5字符串进行加密得到最终的签名:
6F811B63B11D92BA4A359E6DC98EEE31
我们来分析需求:
1、请求数据获取到
2、提取到商家编码
3、将商家编码进程2次md5 得到astr
4、再将请求数据进行一次urldecode,结果是urlstr
5、astr+url_str 进行 MD5得到 beforeMD5
6.将beforeMD5 再次进行md5得到签名
具体代码实现:
from urllib import parse
import hashlib
class Sign(object):#定义类
def __init__(self,req_data): self.req_data = req_data #这写了self的话,在其他的函数里面也可以用self.xx self.get_verid() self.get_sign() def md5(self,s):#定义加密函数 md = hashlib.md5() md.update(s.encode()) return md.hexdigest()#返回加密结果 def get_verid(self):#定义获取vendorId的函数 data_dict = {} sub_list = self.req_data.split('&') #已'&'分割请求数据,得到的结果是vendorId=1697 posCode=pos006 ip=127.0.0.1这样的数据 for i in sub_list: k, v = i.split('=')#以'='分割每次循环i的值 data_dict[k] = v#将分割i得到的k,v存到字典中 self.verid = data_dict.get('vendorId')#取到vendorId def get_sign(self): frist = self.md5(self.verid)#将vendorId进行加密 astr = self.md5(frist)#将vendorId进行第二次加密 url_str = parse.quote_plus(self.req_data)#将请求数据进行urldecode编码处理 self.sign = self.md5(astr+url_str)#将拼接的字符串进行md5加密 return self.sign#得到最终签名 if __name__ == '__main__': s='vendorId=1697&posCode=pos006&ip=127.0.0.1&posVersion=2.1.1.1.1&mac=;D4-81-D7-CA-20-29;7C-67-A2-9A-06-05;7C-67-A2-9A-06-06;7C-67-A2-9A-06-09;00-00-00-00-00-0000E0' abc = Sign(s)#实例化类 print(abc.sign) #运行结果:2e8d260f14fc05a2881470504fb6f9d5