京东API调用,老是返回不存在的方法名,我确定方法名正确(从官方文档复制下来的),响应码200。
官方API测试也能返回数据,就是在python测试就不行。
京东工单迟迟不回复,求指点
import requests
import hashlib
import json
from datetime import datetime
from urllib.parse import urlencode
def generate_jd_sign(app_secret, method, app_key, timestamp, params):
"""生成签名(自动处理URL编码)"""
# 序列化参数时确保无空格
param_json = json.dumps(params, separators=(',', ':'), ensure_ascii=False)
system_params = {
"360buy_param_json": param_json,
"app_key": app_key,
"format": "json",
"method": method,
"sign_method": "md5",
"timestamp": timestamp,
"v": "2.0",
}
# 按参数名ASCII排序
sign_str = app_secret + ''.join(f"{k}{v}" for k, v in (system_params.items())) + app_secret
return hashlib.md5(sign_str.encode('utf-8')).hexdigest().upper()
# 配置信息
app_key = "..."
app_secret = "..." # 替换为你的app_secret
method = "jd.union.open.goods.jingfen.query"
timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
# 业务参数(可包含中文)
business_params = {
"goodsReq": {
"eliteId": 1,
"pageSize": 10,
"pageIndex": 1,
"keyword": "手机" # 测试中文参数
}
}
# 生成签名
sign = generate_jd_sign(app_secret, method, app_key, timestamp, business_params)
# 构建请求数据
request_data = {
"app_key": app_key,
"format": "json",
"method": method,
"param_json": json.dumps(business_params, ensure_ascii=False),
"sign": sign,
"timestamp": timestamp,
"v": "2.0",
}
# 对每个参数值进行URL编码
encoded_data = urlencode(request_data)
# 请求头(明确声明UTF-8)
headers = {
"Content-Type": "application/x-www-form-urlencoded; charset=UTF-8",
"User-Agent": "JD-API-Client"
}
# 发送请求
try:
response = requests.post(
url="https://api.jd.com/routerjson", # 修正URL
data=encoded_data,
headers=headers
)
response.encoding = 'utf-8' # 确保响应内容的编码是UTF-8
print("响应状态码:", response.status_code)
print("响应内容:", response.json())
except Exception as e:
print(f"请求失败: {str(e)}")
print("实际发送的数据:", encoded_data)