signature_check_demo.py 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. # -*- coding: UTF-8 -*-
  2. import hmac
  3. from _sha256 import sha256
  4. import esigntool
  5. from esigntool import esign_run_print_outer
  6. # 回调通知验证签名方法:通过对返回参数计算签名,并和回调中的签名对比,如一致则验证成功
  7. config = esigntool.config() # 初始化配置类
  8. @esign_run_print_outer
  9. def signatureCheck():
  10. # notifyUrl = "http://saledemo.tsign.cn:9090/asyn/notify?belong=tianyin" 例:异步通知请求地址
  11. scert = config.scert # 项目密钥
  12. signture = "0e437d238*********8b3d72d6a7393af9f7e947" # 异步通知获取到的签名值
  13. time_stamp = "1661****383" # 回调header的X-Tsign-Open-TIMESTAMP
  14. query_param = "" # 客户设置的回调地址可能包含query数据,例如callback?accountId=aaa&orderNo=001。(e签宝平台不会追加任何参数)
  15. receive_body = "{\"action\":\"SIGN_MISSON_COMPLETE\",\"timestamp\":1661941631789," \
  16. "\"signFlowId\":\"227b71ae3*********e612a12a1\",\"customBizNum\":\"202200001111\"," \
  17. "\"signOrder\":1,\"operateTime\":166*****31000,\"signResult\":2,\"resultDescription\":\"签署完成\"," \
  18. "\"organization\":{\"orgId\":\"f0fee875*****00885a66d83\",\"orgName\":\"**测试企业\"}}"
  19. # 即通知实际内容,按照整体的字节流来处理
  20. sign_body = time_stamp + query_param + receive_body # 最终参与验签的请求参数
  21. print(sign_body)
  22. req_signature = doSignature(sign_body, config.scert)
  23. print(req_signature)
  24. if req_signature == signture:
  25. return print("验签成功")
  26. else:
  27. return print("验签失败")
  28. def doSignature(message, secret):
  29. """
  30. 根据待签字符串计算签名值
  31. :param message: 待签名字符串
  32. :param secret:密钥
  33. :return:
  34. """
  35. key = secret.encode('utf-8') # sha256加密的key
  36. message = message.encode('utf-8') # 待sha256加密的内容
  37. sign = hmac.new(key, message, digestmod=sha256).hexdigest()
  38. return sign
  39. if __name__ == '__main__':
  40. signatureCheck() # 执行验签