feat(utils): 添加MD5签名生成工具

- 实现了基于Java规则的MD5签名计算方法
- 支持参数映射排序与URL编码处理
- 添加了空格去除和特殊字符处理逻辑
- 集成了时间戳、随机字符串生成功能
- 提供完整的curl请求示例输出
- 支持复杂对象序列化为JSON请求体
- 实现了多层级参数拼接与签名验证
main
wsy182 2025-11-24 11:12:25 +08:00
parent 167d96b6ba
commit 8c4e48f0ef
1 changed files with 97 additions and 0 deletions

97
generateSign.py Normal file
View File

@ -0,0 +1,97 @@
import json
import time
import uuid
import urllib.parse
import hashlib
# =================== MD5签名计算 ===================
def calculate_md5(param, secret_key):
# Java 规则MD5(secretKey + param)
return hashlib.md5((secret_key + param).encode('utf-8')).hexdigest()
def create_sign(param_map, secret_key):
sorted_keys = sorted(param_map.keys())
parts = []
for key in sorted_keys:
val = param_map[key]
if val is None:
parts.append(f"{key}=")
continue
if isinstance(val, list):
for item in val:
encoded_val = urllib.parse.quote(str(item), encoding='utf-8')
parts.append(f"{key}={encoded_val}")
continue
val_str = str(val)
if key != "REQUEST_BODY_CONTENT":
val_str = urllib.parse.quote(val_str, encoding='utf-8')
parts.append(f"{key}={val_str}")
param = "&".join(parts)
# Java逻辑: .replaceAll("\\s", "")
param = "".join(param.split())
print("参数明文 param:", param)
sign = calculate_md5(param, secret_key)
print("生成签名 sign:", sign)
return sign
# =================== Python 主程序 ===================
if __name__ == '__main__':
platform_ifc_system_code = "9f5bbb73710c4a6a8923c278ffa00d50"
systemCode = "57395d2bc668496c9c57d8f2b19bd516"
appId = "57395d2bc668496c9c57d8f2b19bd516"
secret_key = "lC4&NvBQcnvgH@i+io=k#K3HO5aCiuHD"
ts = str(int(time.time() * 1000))
randomString = uuid.uuid4().hex
selector = {
"searchKeys": ["b353614a47e2425a8a8885d270267407", "3DC1B33E1B5B431E99FA163BF9E86E6A", "9cb864213c6f48ceaf90e98e7ca375e9"],
"userType": "0",
"hasCascade": True
}
request_body_json = json.dumps(selector, separators=(',', ':'))
param_map = {
"systemCode": systemCode,
"timestamp": ts,
"nonce": randomString,
"REQUEST_BODY_CONTENT": request_body_json
}
sign = create_sign(param_map, secret_key)
ifcUrl = "https://dpc.cet.cnooc/prod-api/cenertech-interface-center/IFC2"
apiPath = "/userListByDeptSearch"
fullUrl = f"{ifcUrl}/{platform_ifc_system_code}{apiPath}"
curl = f"""
curl -X POST "{fullUrl}" \\
-H "Content-Type: application/json" \\
-H "systemCode: {systemCode}" \\
-H "timestamp: {ts}" \\
-H "nonce: {randomString}" \\
-H "sign: {sign}" \\
-H "App-Id: {appId}" \\
-d '{request_body_json}'
"""
print("\n===== 最终 curl 请求 =====\n")
print(curl)