#输入
'''order_id:31489
join_course[0][join_tel]:13130999882
join_course[0][join_name]:任学雨
join_course[0][join_card_afterfour]:043X
join_course[0][join_school]:铭博教育咨询
join_course[1][join_tel]:13130999883
join_course[1][join_name]:任学雨
join_course[1][join_card_afterfour]:043X
join_course[1][join_school]:铭博教育咨询
join_course[2][join_tel]:13130999884
join_course[2][join_name]:任学雨
join_course[2][join_card_afterfour]:043X
join_course[2][join_school]:铭博教育咨询
join_course[3][join_tel]:13130999885
join_course[3][join_name]:任学雨
join_course[3][join_card_afterfour]:043X
join_course[3][join_school]:铭博教育咨询
timestamp:1574921552698
sign:8936b324e417b31d97f0c3e9a904dssss3'''
#输出
join_course[{"join_tel":"13130999882","join_name":"任学雨","join_card_afterfour":"043X","join_school":"铭博教育咨询"},{"join_tel":"13130999883","join_name":"任学雨","join_card_afterfour":"043X","join_school":"铭博教育咨询"},{"join_tel":"13130999884","join_name":"任学雨","join_card_afterfour":"043X","join_school":"铭博教育咨询"},{"join_tel":"13130999885","join_name":"任学雨","join_card_afterfour":"043X","join_school":"铭博教育咨询"}]order_id31489timestamp1575001757726994(str_encrypt)固定加密字符串

 #大概思路:

  1.将输入字符串切割为list

  2.提取数组指定参数

  3.提取除sign之外的非数组指定参数并排序(asicc码排序)

  4.处理数组参数拼接问题(先处理数组内参数,将key与value转换为字典,再将字典添加至list,最后拼接字符串’join_course‘,拼接非数组参数与加密字符串)

  5.计算加密字符串sign并提取输入的字符串

  6.拼接最终的字符串,并处理请求数据格式

def fwh_sign_sha1_Array(self,str_in):#服务请求签名处理封装(请求格式为数组时的封装)
search_time_str='timestamp:'
search_sign_str='sign:'
str_inSource=re.search('(%s.+)'%(search_time_str),str_in)#匹配字段时间戳(timestamp)
if str_inSource is not None:
time_str=self.get_timestamp()#最终需要的时间戳,13位
str_inSource=str_inSource.group()
search_str_inSource=re.search('\s',str_inSource)
#匹配时间戳,key与value是否包含空格
#如果包含空格,替换时加上空格,如果不处理会有问题(字符串格式与其他地方不一致)
if search_str_inSource is not None:
str_equalSource=re.sub(str_inSource,'%s%s%s'%(search_time_str,search_str_inSource.group(),time_str),
str_in)#将输入的时间戳替换为需要的时间戳,并加上匹配出来得空格
else:
str_equalSource=re.sub(str_inSource,'%s%s'%(search_time_str,time_str),
str_in)#将输入的时间戳替换为需要的时间戳
input_list_source=str_equalSource.split('\n')#以换行符分隔字符串并转换位列表
input_list=[a for a in input_list_source
if (search_sign_str or '%s\s'%(search_sign_str) ) not in a]#列表过滤字段sign
out_str='\n'.join(input_list)#将排序后的list拼接为字符串
out_list_join_course=[a for a in input_list if ('[' and ']') in a ]#去除数组外的其他参数
input_list_other=sorted([a for a in input_list if ('[' or ']') not in a ])#获取数组外的其他参数并排序
input_list_other_str='\n'.join(input_list_other)#将排序后的list拼接为字符串
input_out_list_other_str=self.requestDataToStr_firefoxAndChrome(input_list_other_str,'','').decode()#获取拼接完成后的请求参数字符串(sign)
join_course_list=[]#数组
join_course_dict={}#数组中的dict
for index,i in enumerate(out_list_join_course):
join_course_index=i.find('[')
join_course=i[:join_course_index]#匹配join_course
Array_index=i[join_course_index:].find(']')#匹配[index]的下标
Array=i[join_course_index:][:Array_index+1]#取出[index]
Array_key_data=i[join_course_index:][Array_index+1:]#取出[0]后面的值
search_colon=Array_key_data.find(':')#匹配出冒号的index
Array_key=Array_key_data[1:search_colon-1]#匹配key(冒号前面的值)并去除[]
Array_value=Array_key_data[search_colon+1:]#匹配value(冒号后面的值)
join_course_dict[Array_key]=Array_value#将匹配出来的key与value添加至dict
if index+1<len(out_list_join_course):
#判断上一个元素的部分内容(索引前的内容)是否包含于list下一个元素的内容
#(如果不包含那么说明当前元素就是本组数据的最后一个,此时将dict添加至对应的list)
#并清空字典(不清除会导致最终插入的值是重复的,因为key是一样的)
if join_course+Array not in(out_list_join_course[index+1]):
join_course_list.append(join_course_dict)
join_course_dict={}
else:#如果当前元素是list中的最后一个元素那么直接添加将dict至对应的list
join_course_list.append(join_course_dict)
join_course_dict={}
#将list里面的数组转换为json格式,这里只能对list进行使用,不用对数组中的dict使用
#ensure_ascii:防止中文被转义,separators:去除字符串中多余的空格
join_course_list=json.dumps(join_course_list,ensure_ascii=False,separators=(',', ':'))
#拼接加密前的请求字符串,用换行符区分数组参数与非数组参数(目的是方便转换为list)
join_course_str=join_course+str(join_course_list)+'\n'+input_out_list_other_str
join_course_str_list=sorted(join_course_str.split('\n'))#对list进行排序处理
join_course_last_str=''.join(join_course_str_list)#对排序后的list拼接为字符串
out_sign_str=self.sha1_Encry(join_course_last_str)#得到加密后的加密字符串
str_inSource_sign=re.search('(%s.+)'%(search_sign_str),str_in)#匹配字段签名验证(sign)
if str_inSource_sign is not None:
str_inSource_sign=str_inSource_sign.group()
search_inSource_sign=re.search('\s',str_inSource)
#匹配sign,key与value是否包含空格
#如果包含空格,替换时加上空格,如果不处理会有问题(字符串格式与其他地方不一致)
if search_inSource_sign is not None:
str_last_sign=re.sub(str_inSource_sign,'%s%s%s'%(search_sign_str,search_inSource_sign.group(),
out_sign_str),str_equalSource)#将输入的时间戳替换为需要的时间戳
else:
str_last_sign=re.sub(str_inSource_sign,'%s%s'%(search_sign_str,out_sign_str),
str_equalSource)#将输入的时间戳替换为需要的时间戳
# print(str_last_sign)
str_give=self.requestDataToStr_firefoxAndChrome(str_last_sign)
return str_give else:
print('输入字符串没有sign对象:sign,无法完成数据转换')
return None else:
print('输入字符串没有时间戳对象:timestamp,无法完成数据转换')
return None

#期间遇到的问题:

  1.dict的单引号在使用json解析时会出问题,需要转换为双引号("),使用json.dumps可处理为这样的格式

  2.json.dumps方法的问题:1.中文会自动转义,需指定参数ensure_ascii=false,默认时true;2.转换是会自动产生空格,然而开发加密时没有空格,需要去掉,需指定参数separators=(',', ':')

  

python完成数组格式的请求参数的加密计算的更多相关文章

  1. python+pytest接口自动化(6)-请求参数格式的确定

    我们在做接口测试之前,先需要根据接口文档或抓包接口数据,搞清楚被测接口的详细内容,其中就包含请求参数的编码格式,从而使用对应的参数格式发送请求.例如某个接口规定的请求主体的编码方式为 applicat ...

  2. 扩展SpringMVC以支持绑定JSON格式的请求参数

    此方案是把请求参数(JSON字符串)绑定到java对象,,@RequestBody是绑定内容体到java对象的. 问题描述: <span style="font-size: x-sma ...

  3. jmeter通过BeanShell 脚本,实现对http请求参数的加密

    jmeter一直是一款很好的接口和性能测试工具,它是开源的,不需要为此支付任何费用,而且可以下载源码,可以在修改源代码并在此基础上拓展自己的功能或插件,它可以跟ant和jenkins结合起来搭建自己的 ...

  4. 【转】js生成接口请求参数签名加密

    js生成接口请求参数签名加密 签名算法规则: 第一步,设所有发送或者接收到的数据为集合M,将集合M内非空参数值的参数按照参数名ASCII码从小到大排序(字典序),使用URL键值对的格式(即key1=v ...

  5. js生成接口请求参数签名加密

    js生成接口请求参数签名加密 定义规则:将所有参数字段按首字母排序, 拼接成key1 = value1 & key2 = value2的格式,再在末尾拼接上key = appSecret, 再 ...

  6. 前端请求参数MD5加密校验,参数串解密

    首先引入MD5加密库:=>https://cdn.bootcss.com/blueimp-md5/2.10.0/js/md5.min.js; 步骤:=>1.请求前对参数进行字典升序排序,排 ...

  7. 从零开始设计SOA框架(三):请求参数的加密方式

    第二章中说明请求参数有哪些,主要是公共参数和业务参数,服务端需要对参数进行效验,已验证请求参数的合法性 参数效验前先解释下以下参数: 1.参数键值对:包括公共参数.业务参数      1.公共参数:按 ...

  8. Python:GeoJson格式的多边形裁剪Tiff影像并计算栅格数值

    JSON是通过键值对表示数据对象的一种格式,其全称为JavaScript Object Notation,它采用完全独立于编程语言的文本格式来存储和表示数据,轻量级.简洁清晰的层次结构.容易解析等特点 ...

  9. 前端请求参数MD5加密发送后台

    最近在项目开发中遇到前端发送参数加密的问题,网上查找半天也是很乱,小编自己在项目开发中总结了一下,写到博客中,希望能够帮助大家. 查看所有代码可到我的github上查看源文件,下载后在控制台查看结果即 ...

随机推荐

  1. 【转帖】HBase之五:hbase的region分区

    HBase之五:hbase的region分区 https://www.cnblogs.com/duanxz/p/3154487.html 一.Region 概念 Region是表获取和分布的基本元素, ...

  2. 简单工厂(SimpleFactory)模式

    简单工厂模式是类的创建模式,又叫做静态工厂方法(Static Factory Method)模式.简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例. 简单工厂就是将多个if,else...代码 ...

  3. SQL IN 子查询返回多对值

    我们常用的IN 操作是这样的: select * from tab twhere t.col1 in ('value1''value2');12但是如果是多个列的取值来自同一个子查询呢? 我们是不是要 ...

  4. docker redis4.0集群搭建

    一.前言 redis集群对于很多人来说非常熟悉,在前些日子,我也有一位大兄弟也发布过一篇关于在阿里云(centOS7)上搭建redis 集群的文章,虽然集群搭建的文章在网上很多,我比较喜欢这篇文章的地 ...

  5. Ambari深入学习(II)-实现细节

    在第一节中,我们简单讲了一下Ambari的系统架构.我们这一节主要分析Ambari的源代码,总览Ambari的具体实现方式及其工作细节. 一.Ambari-Server启动 Ambari-Server ...

  6. js运算符及数据类型转换(二)

    1.一元运算符+.-[将其它类型转化为number类型,相当于调用了Number()函数]var num = +('hello')  NaN  typeof num->numbernum = + ...

  7. git 命令行操作(之前整理在有道的笔记)

    1. 常用命令 切换分支 git checkout [branch_name] 检出分支 git clone [git_URL] 更新分支 git pull origin [branch_name] ...

  8. 申请软件著作权,wps显示代码行号功能

    申请软件著作权时,要提交代码. 格式要求,每页不少于50行,怎么设置格式,保障每页至少50行呢? 选择[页面布局]---[行号]--[每页重编行号]即可显示出来,根据显示出来的行号,调整行距等格式即可 ...

  9. sublime text3常用的一些快捷键

    --------------------------------下面的内容可以打印出来贴在电脑旁提醒自己-------------------- Ctrl + Shift + D  快速复制当前的一行 ...

  10. 分布式数据库中间件、产品——sharding-jdbc、mycat、drds

    一般对于业务记录类随时间会不断增加的数据,当数据量增加到一定量(一般认为整型值为主的表达到千万级,字符串为主的表达到五百万)的时候,性能将遇到瓶颈,同时调整表结构也会变得非常困难.为了避免生产遇到这样 ...