python中sign函数图片_python接口自动化-实现sign签名(MD5加密)
一,前序
今天在学习sign签名的的时候,了解了下常用的sign加密算法,突然心血来潮,想用python试着将签名生成的通用步骤用代码实现出来,虽然中间经历了一点小波折,请教了开发同事后,按照他给的思路建议,搞定了。我实现的是微信支付的签名算法规则。
二,加密业务规则
签名生成的通用步骤如下:
第一步,设所有发送或者接收到的数据为集合M,将集合M内非空参数值的参数按照参数名ASCII码从小到大排序(字典序),使用URL键值对的格式(即key1=value1&key2=value2…)拼接成字符串stringA。
特别注意以下重要规则:
1.参数名ASCII码从小到大排序(字典序);
2.如果参数的值为空不参与签名;
3.参数名区分大小写;
4.验证调用返回或微信主动通知签名时,传送的sign参数不参与签名,将生成的签名与该sign值作校验。
5.微信接口可能增加字段,验证签名时必须支持增加的扩展字段。
第二步,在stringA最后拼接上key得到stringSignTemp字符串,并对stringSignTemp进行MD5运算,再将得到的字符串所有字符转换为大写,得到sign值signValue。
三,代码设计
3.1 参数类型确定
由微信支付签名生成规则描述可知,需要加密的参数数据是按照键值对的形式拼接,且参数名区分大小写,将参数数据定义为字典Dict类型特别合适,由于python本身区分大小写,字典键值也区分大小写。
#如代码所示:
>>> data={'q':'apple','Q':'orange'}
>>> data['q']
'apple'
>>> data['Q']
'orange'
3.2 参数设计
为了满足"参数的值为空不参与签名,传送的sign参数不参与签名,接口参数支持扩展”的签名算法规则,参数字典data在设计的时候除了要包含微信支付接口提供的必传参数外,另外我补充了参数值为空和参数名为sign的参数,如下:
#string1,string2用户扩展,增加参数名sign的参数
data={
'appid':'wxd930ea5d5a258f4f',
'mch_id':'10000100',
'device_info':'1000',
'body':'test',
'nonce_str':'ibuaiVcKdpRxkhJA',
'string1':'',
'string2':'',
'sign':'fdsfdhgjghjf'
}
3.3 自定义函数设计
参数data确定下来后,由于存在参数名为sign或者参数值为空的参数,这两种参数是不参与签名的。需要写一个函数,用于排除参数名为sign或者参数值为空的参数。另外参与签名的参数生成后,参数名要按照ASCII进行从小到大排序,然后跟参数值进行拼接,这里需要设计一个拼接函数。拼接函数需要实现参数名排序,python数据类型中,字典没有排序功能,但是列表有一个sort()函数可实现对象排序,因此要把字典的键值单独取出来存放到列表中进行排序,排序完成后再根据键名取字典对应的键值。
3.4 加密函数
需要加密的字符串生成后,可以利用python的hashlib模块对字符串进行加密。Python的hashlib提供了常见的摘要算法,如MD5,SHA1等等,这里我用md5加密。加密后把字符串转换成大写,生成sign签名。
3.5 签名实现逻辑
1.将传的参数定义成字典类型数据A。
2.排除参数名为sign或者参数值为空的参数,另存为新的字典类型数据B。
3.将参数名用ASCII进行从小到大排序,参数名保存成列表对象。
4.用排序完成的参数名循环遍历字典数据B,跟参数值拼接。参数名1=参数值&参数名2=参数值&...
5.参数拼接完成,每个商户的key值也需要拼接,生成拼接API秘钥。
6.拼接完成的字符串,MD5加密,使用hashlib模块。
7.将加密得到的字符串所有字符转换为大写,得到sign值signValue。
四,代码实现
完整代码如下:
"""
接口名称:微信支付
实现目标:微信支付sign签名MD5加密
签名算法规则:
1.参数名ASCII码从小到大排序(字典序)
2.如果参数的值为空不参与签名
3.参数名区分大小写
4.验证调用返回或微信主动通知签名时,传送的sign参数不参与签名,将生成的签名与该sign值作校验
5.微信接口可能增加字段,验证签名时必须支持增加的扩展字段
"""
#导入数据处理加密的包
import hashlib
keyString="192006250b4c09247ec02edce69f6a2d"
#所有发送或者接收到的数据定义为字典类型数据
data={
'appid':'wxd930ea5d5a258f4f',
'mch_id':'10000100',
'device_info':'1000',
'body':'test',
'nonce_str':'ibuaiVcKdpRxkhJA',
'string1':'',
'string2':'',
'sign':'fdsfdhgjghjf'
}
#定义函数作用:去除参数的值为空或者参数名为sign的数据,返回参与签名的字典类型数据
def GetSignData(data):
signData={}
for key, value in data.items():
if value != "" and key != "sign":
signData[key] = value
return signData
#对参数按照key=value的格式,并按照参数名ASCII字典序排序拼接成字符串stringA,最后拼接上key,返回拼接API密钥。
def SignString(signData,key):
#定义空列表
list=[]
# 定义空字符串
stringA=""
#循环遍历字典数据的键值,取出存放到列表中
for key in signData.keys():
list.append(key)
#对列表的对象进行排序,默认升序,即按照ASCII码从小到大排序
list.sort()
#循环遍历排序后的列表,根据键值取出字典键对应的值
for i in list:
stringA += i+"="+signData[i]+"&"
#参数拼接成需要加密的字符串
stringA += "key"+"="+keyString
return stringA
#调用GetSignData函数,获取参与签名的参数,返回新的字典数据
signData=GetSignData(data)
#调用函数,返回需要加密的字符串
signBody=SignString(signData,keyString)
print(signBody)
#创建对象md
md=hashlib.md5()
#对stringA字符串进行编码
md.update(signBody.encode('utf-8'))
#数据加密
signValue=md.hexdigest()
#把加密的结果,小写转换成大写,upper函数
signValue=signValue.upper()
print(signValue)
代码演示:
用python代码编写生成的sign签名与微信支付网页的签名一样,说明代码正确,如图:
python中sign函数图片_python接口自动化-实现sign签名(MD5加密)相关推荐
- python中max函数用法_Python中max函数用法实例分析
Python中max函数用法实例分析 更新时间:2015年07月17日 15:45:09 作者:优雅先生 这篇文章主要介绍了Python中max函数用法,实例分析了Python中max函数的功能与使用 ...
- python中pivot函数用法_python中pivot()函数基础知识点
不同于以往为大家介绍的函数使用,我们利用pivot函数可以实现的方式,就是用来重塑数据使用的,在python的使用上并不常见,但是如果需要利用这种功能,基本上能够被我们选择调用的函数,pivot函数一 ...
- python中sort函数源代码_Python中sort和sorted函数代码解析
Python中sort和sorted函数代码解析 本文研究的主要是Python中sort和sorted函数的相关内容,具体如下. 一.sort函数 sort函数是序列的内部函数 函数原型: L.sor ...
- python中sleep函数用法_python中sleep函数用法实例分析
本文实例讲述了python中sleep函数用法.分享给大家供大家参考.具体如下: Python中的sleep用来暂停线程执行,单位为秒 #------------------------------- ...
- python中format函数作用_python中format函数什么意思
python中format函数什么意思? Python2.6 开始,新增了一种格式化字符串的函数 str.format(),它增强了字符串格式化的功能. 基本语法是通过 {} 和 : 来代替以前的 % ...
- python 从excel中抓取数据_python接口自动化(三)——从excel中获取数据
python接口自动化(三)--从excel中获取数据 1.按照之前的设计思路,我们需要从excel中去获取测试用例,所我们先封装一个获取数据的工具 from Data.with_config imp ...
- python中主函数循环_python入门(三):分支、循环、函数详解
1.分支 if循环格式: if condition_1: statement_block_1 elif condition_2: statement_block_2 else: statement_b ...
- python中sort函数字符串_python中的sort方法使用详解
< Python树莓派编程>--3.3 Python入门 本节书摘来自华章出版社<Python树莓派编程>一书中的第3章,第3.3节,作者:[美]沃尔弗拉姆·多纳特(Wolfr ...
- python中get函数作用_python get函数有什么作用?示例解析
这篇文章之中我们来了解一下关于python字典之中的pythonget函数的相关知识,get函数是什么意思,他有什么作用都将会在接下来的文章之中得到解答. 描述 Python 字典(Dictionar ...
最新文章
- 深度理解目标检测(MMdetection)-HOOK机制
- 修改VMOS2的SID 并成为成员服务器,求助SAS9.4服务器版的sid!!!急急!
- Java异常类(Throwable)
- PHP大批量正则,php – 正则表达式匹配无限数量的选项
- MySQL缓存之Qcache与buffer pool对比
- 技术选型方案怎么写_活动运营方案怎么写?
- 2013年c语言课后作业答案,2013年计算机二级C语言课后模拟题三及答案
- Linux系统有od程序吗,Linux od命令
- iOS 计步器的几种实现方式
- 开课吧:常见的数据可视化分析工具有哪些?
- linux下批量查找UTF-8的BOM文件,并去除BOM
- abb变频器580系列改中文_ABB变频器ACS580系列
- VSCode改变字体颜色
- MiniGUI中的几个画线函数
- 趣图:各种程序员的键盘热力图
- 项目经理PMO必备的工作汇报技巧
- CCNP 6 ISIS
- steps函数--参数意思和用法
- 正反斜杠的区别_正斜杠(/)和反斜杠(\)的区别
- Oracle Windows ODBC 数据源配置
热门文章
- 你的 CRF 层的学习率可能不够大
- 入门必备!生物医学命名实体识别(BioNER)最全论文清单,附SOTA结果汇总
- “噪声对比估计”杂谈:曲径通幽之妙
- 三维点云数据处理软件供技术原理说明_海量点云数据处理理论与技术
- python电商爬虫源码_吴裕雄--天生自然PYTHON爬虫:爬取某一大型电商网站的商品数据...
- PaddleOCR——Visual Studio 2019 环境下C++推理部署 CMake 编译解决方案
- SQL——一种简单的基于角色控制的权限管理数据库设计DEMO
- UCloud UFile——对象存储UFile SDK基本使用
- Eclipse——WindowBuilder下载错误导致的安装失败解决方案
- Perfect Permutation