signature.py 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. #!/usr/bin/python
  2. # -*- coding: UTF-8 -*-
  3. #
  4. # 签名
  5. # 字典升序
  6. # 拼接规则:secret_key_value+key+value
  7. # author: Scott Chen
  8. # date: 2019-12-17
  9. import time
  10. from hashlib import md5
  11. from log_ware import LogWare
  12. logger = LogWare().get_logger()
  13. class Signature:
  14. def __init__(self, in_params_map, secret_key):
  15. self.__params = in_params_map
  16. self.__secret_key = secret_key
  17. self.__sort_params = {}
  18. self.__joint_str = ''
  19. self.__out_params = in_params_map
  20. # 请求参数字典排序-升序
  21. def __dict_sort_asc(self):
  22. temp = sorted(self.__params.items())
  23. for i in temp:
  24. self.__sort_params[i[0]] = i[1]
  25. logger.debug('升序排列后:%s', str(self.__sort_params))
  26. # 参数拼接
  27. def __params_joint(self):
  28. self.__joint_str += self.__secret_key
  29. for k, v in self.__sort_params.items():
  30. self.__joint_str += (k + v)
  31. logger.debug('参数拼接后:%s', str(self.__joint_str))
  32. # md5签名
  33. def sign_with_md5(self):
  34. self.__dict_sort_asc()
  35. self.__params_joint()
  36. sign_str = md5(self.__joint_str.encode("utf-8")).hexdigest()
  37. logger.debug('md5签名的参数值:%s', sign_str)
  38. self.__out_params['sign'] = sign_str
  39. logger.debug('请求参数签名结果:%s', str(self.__out_params))
  40. return self.__out_params
  41. # 单元测试
  42. if __name__ == '__main__':
  43. data = {
  44. 'merchId': '111',
  45. 'merchName': '商户',
  46. 'thirdPartyMerchCode': '222',
  47. 'thirdPartyMerchName': '三方商户',
  48. 'name': '张三',
  49. 'idCard': '440305198009183074',
  50. 'isCheckIdCard': '0'
  51. }
  52. params_map = {
  53. 'merchId': '111',
  54. 'data': str(data),
  55. 'timestamp': str(int(time.time()))
  56. }
  57. secret_key = 'abc789'
  58. instance = Signature(params_map, secret_key)
  59. ret = instance.sign_with_md5()
  60. logger.debug(str(ret))