Look at
来来回回大改3次,碰到参数相同的情况。
最终发现他的排序方式不是直接key去排序而是根据 str(key=value)的值去排序。
感谢JAVA同学帮我debug运行官方工具类
ps:直接使用param_encrypt_df返回的参数请求即可
import hashlib
from collections import OrderedDict
class Utils:
@staticmethod
def text_to_md5(text):
"""
:param text: 文本类型
:return: md5text
"""
if type(text) == str:
# 生成一个md5对象
m1 = hashlib.md5()
# 使用md5对象里的update方法md5转换
m1.update(text.encode("utf-8"))
md5_text = m1.hexdigest()
return md5_text
else:
raise ValueError("请传入Str类型数据!")
@staticmethod
def param_encrypt_df(data_param, third_type):
"""
笛风加密算法
:param: data_param:传入DICT入参
:param: third_type: 类型,酒店或者机票
:return: 返回加密请求参数,可直接使用参数请求(类型dict)
"""
if third_type == 'hotel':
api_key = 'hoteltest'
secret_key = 'your_secret_key '
elif third_type == 'air':
api_key = 'dflighttest'
secret_key = 'your_secret_key '
else:
raise ValueError("Type错误!")
if type(data_param) == dict:
timestamp = Utils.get_current_datetime()
data_param['apiKey'] = api_key
data_param['timestamp'] = timestamp
sort_param_list = Utils.sort_param(data_param)[1]
# 转换成用&连接的字符串
sort_param_list = sorted(sort_param_list, key=lambda x: x, reverse=False)
str_data = ''
for item in sort_param_list:
str_data += item + '&'
# md5
sign = Utils.text_to_md5(secret_key + '&' + str_data + secret_key).upper()
# 移除项
data_param.pop('apiKey')
data_param.pop('timestamp')
# 拼接最终请求参数
secret_param = dict()
secret_param['apiKey'] = api_key
secret_param['sign'] = sign
secret_param['timestamp'] = timestamp
secret_param['data'] = data_param
return secret_param
else:
raise ValueError("请传入dict类型")
@staticmethod
def sort_param(data_param):
"""
:param data_param:
:return:order_dict,order_list
"""
# 最终需要的参数列表
order_list = []
# 暂存用dict
order_dict = OrderedDict()
# 遍历参数
for key, value in data_param.items():
# 可能存在相同的key所以用list存放
order_dict[key] = []
if type(value) == list:
for item in value:
return_dict = Utils.sort_param(item)
for list_key, list_value in return_dict[0].items():
order_list.append(str(list_key) + '=' + str(*list_value))
elif type(value) == dict:
return_dict = Utils.sort_param(value)
for dict_key, dict_value in return_dict[0].items():
order_list.append(str(dict_key) + '=' + str(dict_value))
else:
if value == '':
# 跳过为空参数
pass
else:
order_list.append(str(key) + '=' + str(value))
order_dict[key].append(value)
return order_dict, order_list