yan198404 2025-04-19 00:40 采纳率: 50%
浏览 12
已结题

京东api 不存在的方法名

京东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)

  • 写回答

5条回答 默认 最新

  • yan198404 2025-04-27 19:04
    关注

    如果参数值是dict,要转成字符串(也算一个小坑吧)。从其他文章搜到的,亲测可行。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(4条)

报告相同问题?

问题事件

  • 系统已结题 5月5日
  • 已采纳回答 4月27日
  • 创建了问题 4月19日