使用类封装一个签名规则

这节主要是使用类封装一个签名规则的练习,有一个签名规则的需求是:

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
 
 
原文地址:https://www.cnblogs.com/xiehong/p/9140957.html