嗨, 大家好, 我是小白, 好久没写博客了, 最近公司搞什么 python 的接口测试, 心里一阵狂喜, 在公司上百个接口里拿出一个主要接口一顿乱搞, 好在搞通了
但是在这过程中也碰到了好多的问题, 决定将问题分享出来能够对你们提供一丝丝的帮助!
工具: pycharm+requests+python3+fiddler
我暂时将我使用的接口称为 A 接口
第一步:
首先我们手工发起一笔成功的 A 接口,
返回的 JSON 字符串:{"requestId":"20190220095236495","result":"00000","signature":"******","sum":"0.03"}
从字符串中的 result 我们知道返回成功了, signature 为对返回结果进行了签名, 使用到的是 MD5 签名
第二步:
查看 fiddler, 在 Inspectors-Raw 下边提炼出我们想要的一些信息
从图中我们知道这个请求为 POST 请求, content-Type:application/x-www-form-urlencoded,encoding:GBK 保存这些信息
第三步:
打开 pycharm, 在里边通过字典设置 A 接口的各个参数, 由于输入参数 signature 是对所有参数进行 MD5 签名, 所以我们设置为空值,
对字典的 value 值进行 for 循环拼接, 并调用 MD5 签名方法进行签名, 方法如下:
然后我们再将返回的 enc_res 回传到字典的键 signature 所对应的值
1) 设置 A 接口发起请求的 url
2) 设置字典 headers(直接从 fiddler 抓包的 raw 数据里 copy 过来), 如下:
3) 从抓包我们知道 content-Type:application/x-www-form-urlencoded, 所以发起 post 请求的参数为 data 而不是 JSON
requests.post(url=url,data=payload,headers=headers)
通过返回结果的 status 为 200 我们知道请求成功了, 但是返回的 result 是一个错误码, 通过日志我们找到了原因如下:
可以看出 accountName 参数传到后台为乱码, 因为 pycharm 里边传过去的中文, 编码都是 UTF-8 的, 而后台编码从抓包我们可以看到是 GBK 的形式,
所以我们需要改变一下这个参数编码格式如图:
因为 A 接口输入参数有一个 MD5 的签名参数, 所以中文参数的这段编码要放在输入参数签名之后, 然后回传进行覆盖, 进行 post 请求
再试一遍, 我们发现返回结果成功了, 并且我们对返回的参数再次进行调用 MD5 签名校验
没有看懂的小伙伴可以留言, 我们可以一起交流讨论, 哈哈, 我是小白, 欢迎阅读!
源码分享一下, 写的没什么层次, 还请多多批评:
- # -*- coding:utf-8 -*-
- #autor :xiaobai
- import requests
- from requests.cookies import RequestsCookieJar
- import JSON
- import hmac
- import hashlib
- import time
- import random
- #################### 设置 Key 值 ##############
- def hashstring(to_enc,ekey):
- enc_res = hmac.new(ekey.encode(), to_enc.encode(), hashlib.md5).hexdigest()
- # print(enc_res)
- return enc_res
- if __name__=='__main__':
- print("开始进行 ** 测试:")
- url='http://**********'
- #设置随机值作为入参 id
- id = []
- id = ''.join(str(i) for i in random.sample(range(0, 9), 2)) # sample(seq, n) 从序列 seq 中选择 n 个随机且独立的元素;
- CurrentTime = time.strftime('%Y%m%d%H%M%S', time.localtime(time.time()))
- requestid=CurrentTime+id
- #请求参数
- payload={'requestId':'',
- 'merchantCode':'',
- 'transferType':'',
- 'transToMerCode':'',
- 'transToMerName':'',
- 'unionBankNum':'',
- 'openBankName':'',
- 'openBankProvince':'',
- 'openBankCity':'',
- 'sum':'0.03',
- 'accountType':'1',
- 'accountName':'***',
- 'bankCode':'***',
- 'bankAccount':'*******',
- 'reason':'1555',
- 'noticeUrl':'**********',
- 'refundNoticeUrl':'*************',
- 'transferPayType':'*',
- 'signature':''
- }
- payload['requestId']=requestid
- #初始化字符串并进行加密拼接
- to_enc='' ekey='CSSH_KEY'
- for i in payload:
- to_enc=to_enc+payload[i]
- # print(to_enc)
- payload['signature'] = hashstring(to_enc, ekey)
- '''将中文进行 GBK 转化'''
- str='***' #这个字符串与字典里 accountName 对应 value 一致
- strGBK=str.encode('GBK')
- '''转化完的中文回传到字典中'''
- payload['accountName']=strGBK
- headers={
- 'Connection':'keep-alive',
- 'Content-Length':'543',
- 'Cache-Control':'max-age=0',
- 'Origin':'http://**********',
- 'Upgrade-Insecure-Requests':'1',
- 'Content-Type':'application/x-www-form-urlencoded',
- 'User-Agent':'**********************************************************',
- 'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',
- 'Referer':'******************',
- 'Accept-Encoding':'gzip, deflate, br',
- 'Accept-Language':'zh-CN,zh;q=0.9',
- }
- s=requests.post(url=url,data=payload,headers=headers)
- print(s.text)
- print("status:",s.status_code)
- print("****************************************************")
- print("开始进行返回结果验证签名:")
- '''返回结果进行验签'''
- ResultDict=s.JSON()
- synchronizationStr=ResultDict['requestId'] + ResultDict['result'] + ResultDict['sum']
- signature11=hashstring(synchronizationStr, ekey)
- try:
- if(ResultDict['result']=='00000' and signature11==ResultDict['signature']):
- print("恭喜你, 同步返回验签成功")
- else:
- print("result 错误码:", ResultDict['result'])
- except BaseException as msg:
- print(msg)
- finally:
- print("** 处理完毕")
- print("****************************************************")
来源: http://www.bubuko.com/infodetail-2961454.html