当前位置:网站首页 >  攻略

Python调用京东联盟API获取成交数据实操指南

时间:2026年06月07日 10:38:28 来源:易频IT社区

准备工作

在开始编写代码之前,必须完成京东联盟账号的注册以及API调用凭证的获取。这是数据获取的合法入口,无法跳过。

注册京东联盟账号与获取Key

如果尚未注册京东联盟(京粉)账号,需要先访问 https://union.jd.com/ 进行注册。注册完成后,登录账号,进入后台管理页面。

获取AppKey和SecretKey的具体步骤如下:

  • 在京东联盟后台首页顶部导航栏中,找到并点击【推广工具】菜单。
  • 在左侧菜单栏中,选择【API管理】下的【我的API】选项。
  • 如果是首次使用,需要先创建一个应用。点击【创建应用】按钮,应用名称可以随意填写(例如“OrderDataTool”),选择应用类型为“自用”,审核说明填写“获取订单数据”即可提交。
  • 应用创建通过审核后,在应用列表中即可看到App KeyApp Secret。请务必将这两个字符串复制保存到本地文本文件中,后续代码中会直接使用。

安装Python环境与依赖库

本指南使用Python作为开发语言,因为它拥有强大的数据处理库。确保你的电脑上安装了Python 3.6或更高版本。可以通过在终端输入 python --version 来检查。

我们需要安装 requests 库来发送HTTP请求,以及 hashlib(Python内置,用于签名计算)。请在终端执行以下命令安装依赖:

```bash pip install requests ```

核心代码实现

京东联盟API采用RPC风格调用,所有请求必须经过MD5签名验签。签名逻辑是整个对接过程中最关键的部分,任何参数错误都会导致签名校验失败。

签名算法实现

京东API的签名规则是将所有请求参数(除sign本身外)按字典序排序,然后拼接成“key+value”的字符串,并在首尾分别加上AppSecret,最后进行MD5计算并转大写。以下是签名函数的完整实现:

```python import hashlib def generate_sign(app_secret, params): 1. 过滤掉sign参数和空值参数 filtered_params = {k: v for k, v in params.items() if v is not None and v != ""} 2. 按Key的字典序排序 sorted_params = sorted(filtered_params.items()) 3. 拼接字符串 concat_str = "" for k, v in sorted_params: concat_str += str(k) + str(v) 4. 首尾加上AppSecret final_str = app_secret + concat_str + app_secret 5. MD5加密并转大写 md5 = hashlib.md5() md5.update(final_str.encode('utf-8')) return md5.hexdigest().upper() ```

请求参数构造

Python调用京东联盟API获取成交数据实操指南

我们使用的API方法是 jd.union.open.order.query,用于查询推广订单。该接口需要构造一个JSON格式的业务参数 orderReq。为了确保代码能直接运行,我们需要定义查询的时间范围和分页参数。

关键参数说明:

  • method: 固定值 jd.union.open.order.query
  • orderReq: JSON字符串,包含查询条件。
    • startDate: 查询开始时间,格式 yyyy-MM-dd HH:mm:ss
    • endDate: 查询结束时间。
    • pageNo: 页码,从1开始。
    • pageSize: 每页数量,最大100。

发起HTTP请求与解析

请求地址统一为 https://api.jd.com/routerjson。我们需要将业务参数放入公共参数字典中,计算签名,然后通过POST方式发送请求。响应数据为JSON格式,我们需要提取其中的订单信息。

注意:京东API对时间戳格式要求严格,必须精确到秒。

```python import requests import time import json def get_jd_orders(app_key, app_secret, start_date, end_date, page_no=1, page_size=100): API地址 url = "https://api.jd.com/routerjson" 业务参数JSON order_req = { "startDate": start_date, "endDate": end_date, "pageNo": page_no, "pageSize": page_size, "type": 1 1: 按更新时间查询 } 公共参数 params = { "method": "jd.union.open.order.query", "app_key": app_key, "timestamp": time.strftime("%Y-%m-%d %H:%M:%S"), "v": "2.0", "format": "json", "sign_method": "md5", "orderReq": json.dumps(order_req) 将字典转为JSON字符串 } 生成签名 sign = generate_sign(app_secret, params) params["sign"] = sign try: 发送POST请求 response = requests.post(url, data=params) res_json = response.json() 检查是否有错误 if "errorResponse" in res_json: print(f"API请求失败: {res_json['errorResponse']['zhDesc']}") return [] 提取数据 data = res_json.get("jd_union_open_order_query_response", {}) return data.get("data", []) except Exception as e: print(f"请求发生异常: {e}") return [] ```

完整代码与运行

将上述所有逻辑整合,形成一份完整的可执行脚本。请将脚本中的 YOUR_APP_KEYYOUR_APP_SECRET 替换为你在准备工作中获取的真实凭证。

完整可执行脚本

```python import hashlib import requests import time import json 配置区域:请替换为你的真实Key APP_KEY = "YOUR_APP_KEY" APP_SECRET = "YOUR_APP_SECRET" def generate_sign(app_secret, params): filtered_params = {k: v for k, v in params.items() if v is not None and v != ""} sorted_params = sorted(filtered_params.items()) concat_str = "" for k, v in sorted_params: concat_str += str(k) + str(v) final_str = app_secret + concat_str + app_secret md5 = hashlib.md5() md5.update(final_str.encode('utf-8')) return md5.hexdigest().upper() def get_jd_orders(app_key, app_secret, start_date, end_date, page_no=1, page_size=20): url = "https://api.jd.com/routerjson" order_req = { "startDate": start_date, "endDate": end_date, "pageNo": page_no, "pageSize": page_size, "type": 1 } params = { "method": "jd.union.open.order.query", "app_key": app_key, "timestamp": time.strftime("%Y-%m-%d %H:%M:%S"), "v": "2.0", "format": "json", "sign_method": "md5", "orderReq": json.dumps(order_req) } sign = generate_sign(app_secret, params) params["sign"] = sign response = requests.post(url, data=params) return response.json() if __name__ == "__main__": 查询当前时间往前推24小时的数据 end_time = time.strftime("%Y-%m-%d %H:%M:%S") start_time = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(time.time() - 86400)) print(f"正在查询时间范围: {start_time} 至 {end_time}") result = get_jd_orders(APP_KEY, APP_SECRET, start_time, end_time) if "errorResponse" in result: print("错误信息:", result["errorResponse"]) else: order_list = result.get("jd_union_open_order_query_response", {}).get("data", []) print(f"成功获取到 {len(order_list)} 条订单数据。") 打印前3条关键信息 for order in order_list[:3]: print(f"订单号: {order.get('id')}, 商品名称: {order.get('skuName')}, 佣金: {order.get('estimateFee')}") ```

运行与验证

将上述代码保存为 jd_orders.py。在终端中运行命令:

```bash python jd_orders.py ```

如果配置正确,终端将输出获取到的订单数量以及前3条订单的详细信息,包括订单号、商品名称和预估佣金。如果返回错误信息,请检查AppKey/Secret是否正确,或者系统时间是否与标准时间同步(时间戳偏差过大会导致请求失败)。

相关推荐

最新

热门

推荐

精选

标签

易频IT社区是综合性互联网IT技术门户网站,专注分享网络技术、服务器运维、网络安全、编程开发、系统架构、云计算、大数据等行业干货,实时更新IT行业资讯、零基础教程、实战案例,为IT从业者、技术爱好者提供专业的学习交流平台。

Copyright © 2021-2026 易频IT社区. All Rights Reserved. 备案号:闽ICP备2023013482号 网站地图