相关资料:
一、官方规范:传输协议:暂时只支持HTTP协议进行通信数据传输格式:所有接口暂只支持json消息格式编码格式:UTF-8(交互编码格式统一用UTF-8,避免传递中文数据出现乱码)
二、摘要验证失败的官方提供的解决办法:
1、平台采用MD5+BASE64加密,MD5加密后的数据是全小写的; 2、以下为不同方式下对“1”进行加密的结果,请比对是否一致;(不一致则加密方法可能有误) MD5对1加密结果 --- c4ca4238a0b923820dcc509a6f75849b BASE64对1加密结果 --- YzRjYTQyMzhhMGI5MjM4MjBkY2M1MDlhNmY3NTg0OWI= BASE64(MD5)对1解密结果 ---MjhjOGVkZGUzZDYxYTA0MTE1MTFkM2IxODY2ZjA2MzY= 3、参数传递采用http post请求,请求消息头设置:("Content-Type","application/x-www-form-urlencoded;charset=utf-8"); 4、在 我的对接进度-报文校验 窗口中输入请求报文,生成时间戳和签名,检查签名和本地生产上的签名是否一致; 5、对于params参数中有特殊字符的需要进行url转译; 6、检查调用时appkey是否和平台存在差异。 您可前往 对接文档-规范说明-APISDK说明及示例 查看详情。
# -!- coding: utf-8 -!-
# !/usr/bin/python3
import base64
ndard-order/newTraceQuery.action?companyCode=EWBHMJJWJG¶ms=%s&digest=%s×tamp=%s' % (
json.dumps(params_new_track_query, ensure_ascii=False), digest(params_new_track_query), timestamp_13)
response = requests.post(url.encode(), headers=headers)
response1 = requests.post(url1.encode(), headers=headers)
if __name__ == '__main__':
print(response.json())
print(response1.json())
以上代码打印结果:
加密参数为: {"logisticCompanyID": "DEPPON", "province": "湖北省", "city": "武汉市", "county": "武昌区", "address": "南湖李纸路72号", "matchType": "2"}64510296bc2ddf30bd45*******9cf7d1660563919739
Mjc5MjcxNTQ0NzRjYzdjNTkyNjg2ZDFjNzJlOWE2ZjE=
加密参数为: {"mailNo": "479000244251"}64510296bc2ddf30bd******d9cf7d1660563919739
NzgwOGE3MmEwNGFkY2IzNmYwYzNiNWZhNjg5ZGY0ZGE=
这是中文出错的结果:
{'result': 'false', 'reason': '摘要验证失败', 'resultCode': '2002', 'uniquerRequestNumber': '36191221806927382'}
这是英文正常的结果:
{'result': 'true', 'reason': '', 'resultCode': '1000', 'responseParam': {'trace_list': [{'city': '**市(测试)', 'description': '正常签收,签收人类型:本人/同事/门卫 等', 'site': '【***】营业部', 'status': 'SIGNED', 'time': '2021-09-24 13:44:26'}, {'city': '**市(测试)', 'description': '此货已滞留,与客户预约改日派送', 'site': '【***】营业部', 'status': 'ERROR', 'time': '2021-09-24 16:44:26'}, {'city': '**市(测试)', 'description': '拒绝签收:原因', 'site': '【***】营业部', 'status': 'FAILED', 'time': '2021-09-24 13:44:26'}, {'city': '**市(测试)', 'description': '派送中,派送人:**,派送人电话:***********', 'site': '【***】营业部', 'status': 'SENT_SCAN', 'time': '2021-09-24 10:44:26'}, {'city': '**市(测试)', 'description': '货物已到达【***营业部】部门', 'site': '【***】营业部', 'status': 'ARRIVAL', 'time': '2021-09-24 07:44:26'}, {'city': '**市(测试)', 'description': '运输中,离开【上海转运中心】,下一站【***营业部】(出发到达对应多个)', 'site': '****转运中心/营业部/枢纽中心', 'status': 'DEPARTURE', 'time': '2021-09-24 04:44:26'}, {'city': '**市(测试)', 'description': '您的订单已被收件员揽收,【上海***营业部】库存中', 'site': '上海转运中心/营业部/枢纽中心', 'status': 'GOT', 'time': '2021-09-24 02:44:26'}], 'tracking_number': '479000244251'}, 'uniquerRequestNumber': '36198464157138534'}
进程已结束,退出代码0
请问如何解决中文加密的问题?
楼主,中文的要加urlencode才行,麻烦加一下urlencode(params), 引用方法from urllib.parse import urlencode,刚回到家,看来你是有新进展了啊,胜利在望,加油
用这个。这是别人的。
import os
import hashlib
import base64
import time
def mine():
print("-------------------------------------批量加密工具-------------------------------------")
print("关注博主不迷路!!!\nhttps://jiangongfang.blog.csdn.net/\nhttps://blog.51cto.com/u_15449377")
print("使用告知:\n【加密后的文件后缀会多出DATAAES-AI,是为了方便软件检测,请勿乱改加密后的后缀名】")
print("【要加密或解密的文件命名不可有“./\”字符,否则会出错】")
print("【此程序的密码可以使用中文、英文、字符串、数字进行加密,可使用中文和中文字符串】")
print("【重点要注意::程序一旦开始加密或解密,中途不可退出,否则会丢失数据,直到运行完毕方可退出】")
print("-------------------------------------批量加密工具-------------------------------------\n")
DATA_1 = input('请输入要加密或解密的文件路径(不含文件):')
if DATA_1 == '':
print('程序不得为空,请重新输入!!!')
time.sleep(2)
os.system('cls')
mine()
else:
pass
DATA_1 = DATA_1.replace("\\", "/") # 替换
if os.path.isdir(DATA_1) == True:
pass
else:
print('路径错误或文件夹不存在,请重新输入!!!')
time.sleep(2)
os.system('cls')
mine()
str = input('请输入最高可加密的内存MB:')
# 判断是否填写
if int(str) == '':
print('错误,请重新输入!!!')
time.sleep(2)
os.system('cls')
mine()
else:
pass
PassWord_1 = input('请输入要加密或解密的密码(密码):')
# 判断是否填写
if PassWord_1 == '':
print('密码不得为空,请重新输入!!!')
time.sleep(2)
os.system('cls')
mine()
else:
pass
def iterbrowse(path):
for home, dirs, files in os.walk(path):
for filename in files:
yield os.path.join(home, filename)
for fullname in iterbrowse(DATA_1):
NAME = fullname
NAME = NAME.replace("\\", "/") # 替换
def get_FileSize(filePath):
fsize = os.path.getsize(filePath)
fsize = fsize / float(1024 * 1024)
size = "%.0f" % fsize
if int(size) >= int(str):
print('[-!-]: ',NAME, '\t- - - - 内存过大!!!')
pass
else:
#写入的文件
if NAME.split(".")[-1][-10:] == 'DATAAES-AI': # 检测是否是已经加密后的文件,用于检测后缀的DATAAES-AI
#解密
F = NAME.split(os.path.sep)[0].replace("DATAAES-AI", "") #去除DATAAES-AI
print(f'[-.·J·.-]: ',NAME, '\t- - - - 解密成功!!!')
else:
#加密
F = NAME.split(os.path.sep)[0]+"DATAAES-AI"
print(f'[+·J·+]: ', NAME, '\t+ + + + 加密成功!!!')
a = open(NAME, "rb") #读取文件
b = open(F, "wb") #写入文件
#使用MD5进行加密(双层加密)
hl = hashlib.md5()
hl.update(PassWord_1.encode(encoding='utf-8'))
password_list = hl.hexdigest()
#使用MD5进行加密(双层加密)
hl.update(password_list.encode(encoding='utf-8'))
password_list2 = hl.hexdigest()
password_data = password_list+password_list2
#加密
def Encryption_and_decryption():
count = 0 #索引
for now in a:
for nowByte in now:
newByte = nowByte ^ ord(password_data[count % len(password_data)]) #循环遍历出密码的ord值,单个循环
count += 1
b.write(bytes([newByte])) #转换
Encryption_and_decryption()
a.close()
b.close()
os.remove(f'{NAME}')
get_FileSize(NAME)
print('操作完成!!!')
print('正在返回!!!')
time.sleep(2)
os.system('cls')
mine()
mine()