京东工业(JD Industrial)是京东旗下专注于工业供应链的服务平台,其开放 API 接口主要面向企业客户,提供工业商品采购、库存查询、订单管理、供应商合作等全链路服务。以下从接口体系、认证机制、核心功能展开分析,并提供 Python 调用实现(以商品查询和库存接口为例)。
一、京东工业 API 核心特性分析
- 接口体系与功能域
京东工业 API 基于京东开放平台(JD Open Platform)架构,核心功能域包括:
商品管理:工业商品详情查询、商品列表搜索、规格参数查询等;
库存与价格:实时库存查询、协议价查询(针对企业客户的专属价格);
订单处理:订单创建、订单状态查询、物流跟踪等;
供应商管理:供应商信息查询、合作状态管理等。
接口设计遵循 RESTful 规范,支持 HTTPS,响应格式为 JSON,网关地址统一为。 - 认证与签名机制
京东工业 API 采用 “appkey + appsecret + 签名” 的认证体系,核心流程:
参数准备:公共参数(app_key、method、timestamp、format等)+ 业务参数;
签名生成:
按参数名 ASCII 升序排序;
拼接为key=value&key=value格式;
末尾拼接appsecret,通过 MD5 加密生成 32 位小写签名(sign);
请求发送:将参数(含签名)通过 GET/POST 提交至网关。
注:部分高权限接口(如订单创建)需额外获取access_token(通过用户授权流程)。 - 核心接口参数与响应示例
以商品详情查询和库存查询为例:
接口名称 核心参数 响应核心字段
jd.industry.product.get product_id(商品 ID) product_name(商品名)、price(价格)、specs(规格)、brand(品牌)
jd.industry.stock.get product_id、area_id(区域 ID) stock_num(库存数)、available(是否可售)、warehouse(仓库信息)
二、Python 脚本实现
以下实现京东工业 API 的通用调用框架,包含签名生成、接口调用、响应解析,并示例商品详情和库存查询功能。
import requests
import hashlib
import time
import json
import logging
from typing import Dict, Optional, List
from requests.exceptions import RequestException
配置日志
logging.basicConfig(
level=logging.INFO,
format="%(asctime)s - %(levelname)s - %(message)s"
)
class JDIndustryAPI:
def init(self, appkey: str, appsecret: str, access_token: str = ""):
"""
初始化京东工业API客户端
:param appkey: 应用appkey(京东开放平台获取)
:param appsecret: 应用appsecret
:param access_token: 用户授权令牌(部分接口需要)
"""
self.appkey = appkey
self.appsecret = appsecret
self.access_token = access_token
self.base_url = "https://api.jd.com/routerjson"
self.session = requests.Session()
def _generate_sign(self, params: Dict) -> str:
"""生成签名(京东API规则)"""
# 1. 按参数名ASCII升序排序
sorted_params = sorted(params.items(), key=lambda x: x[0])
# 2. 拼接为key=value&key=value格式
sign_str = "&".join([f"{k}={v}" for k, v in sorted_params])
# 3. 拼接appsecret并MD5加密(小写)
sign_str += self.appsecret
return hashlib.md5(sign_str.encode("utf-8")).hexdigest().lower()
def _get_timestamp(self) -> str:
"""生成时间戳(格式:yyyy-MM-dd HH:mm:ss)"""
return time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
def call_api(self, method: str, biz_params: Dict) -> Optional[Dict]:
"""
通用API调用方法
:param method: 接口方法名(如jd.industry.product.get)
:param biz_params: 业务参数
:return: 接口响应数据(业务部分)
"""
# 1. 公共参数
public_params = {
"app_key": self.appkey,
"method": method,
"timestamp": self._get_timestamp(),
"format": "json",
"v": "1.0",
"sign_method": "md5"
}
# 2. 加入access_token(如需要)
if self.access_token:
public_params["access_token"] = self.access_token
# 3. 合并参数(业务参数需序列化为JSON字符串)
all_params = {**public_params, "param_json": json.dumps(biz_params)}
# 4. 生成签名
sign = self._generate_sign(all_params)
all_params["sign"] = sign
try:
# 5. 发送POST请求(京东工业API推荐POST)
response = self.session.post(
self.base_url,
data=all_params,
timeout=15
)
response.raise_for_status()
result = response.json()
# 6. 处理错误响应(京东API错误码在根节点)
if "error_response" in result:
error = result["error_response"]
logging.error(f"API错误:{error['msg']}(错误码:{error['code']})")
return None
# 7. 提取业务响应(格式:{method}_response)
response_key = method.replace(".", "_") + "_response"
if response_key not in result:
logging.error(f"响应格式错误,缺少{response_key}字段")
return None
return result[response_key]
except RequestException as e:
logging.error(f"请求异常:{str(e)},接口:{method}")
return None
except json.JSONDecodeError:
logging.error(f"响应解析失败:{response.text[:200]}...")
return None
def get_product_detail(self, product_id: str) -> Optional[Dict]:
"""
获取工业商品详情
:param product_id: 商品ID(工业商品唯一标识)
:return: 商品详情字典
"""
method = "jd.industry.product.get"
params = {"product_id": product_id}
result = self.call_api(method, params)
if not result:
return None
# 解析商品详情
return {
"product_id": product_id,
"name": result.get("product_name"),
"brand": result.get("brand_name"),
"specs": result.get("spec_info"), # 规格参数(如"型号:M10;材质:不锈钢")
"price": float(result.get("price", 0)), # 单价(元)
"market_price": float(result.get("market_price", 0)), # 市场价
"description": result.get("product_desc"), # 商品描述
"images": result.get("image_urls", "").split(","), # 图片URL列表
"category": result.get("category_name") # 所属分类
}
def get_product_stock(self, product_id: str, area_id: str = "1_72_28199") -> Optional[Dict]:
"""
查询商品库存(默认区域:北京朝阳区)
:param product_id: 商品ID
:param area_id: 区域ID(格式:省_市_区,如"1_72_28199"代表北京朝阳区)
:return: 库存信息字典
"""
method = "jd.industry.stock.get"
params = {
"product_id": product_id,
"area_id": area_id
}
result = self.call_api(method, params)
if not result:
return None
# 解析库存信息
return {
"product_id": product_id,
"area_id": area_id,
"stock_num": int(result.get("stock_num", 0)), # 库存数量
"available": result.get("is_available", False), # 是否可售
"warehouse": result.get("warehouse_name"), # 发货仓库
"arrival_time": result.get("arrival_time") # 预计到货时间(无货时)
}
示例调用
if name == "main":
# 替换为实际参数(从京东开放平台获取)
APPKEY = "your_appkey"
APPSECRET = "your_appsecret"
ACCESS_TOKEN = "your_access_token" # 可选,部分接口需要
PRODUCT_ID = "100012345678" # 工业商品ID(从京东工业平台商品详情页获取)
AREA_ID = "1_72_28199" # 北京朝阳区(可根据需求修改)
# 初始化客户端
jd_industry = JDIndustryAPI(
appkey=APPKEY,
appsecret=APPSECRET,
access_token=ACCESS_TOKEN
)
# 1. 获取商品详情
product_detail = jd_industry.get_product_detail(PRODUCT_ID)
if product_detail:
print(f"商品名称:{product_detail['name']}")
print(f"品牌:{product_detail['brand']} | 分类:{product_detail['category']}")
print(f"规格:{product_detail['specs']}")
print(f"价格:{product_detail['price']}元(市场价:{product_detail['market_price']}元)")
print(f"主图:{product_detail['images'][0] if product_detail['images'] else '无'}")
# 2. 查询库存
stock_info = jd_industry.get_product_stock(PRODUCT_ID, AREA_ID)
if stock_info:
print(f"\n库存信息(区域:{AREA_ID}):")
print(f"库存数量:{stock_info['stock_num']}件 | 可售状态:{'是' if stock_info['available'] else '否'}")
print(f"发货仓库:{stock_info['warehouse']}")
if stock_info["arrival_time"]:
print(f"预计到货:{stock_info['arrival_time']}")
三、关键技术解析
- 签名生成核心逻辑
京东工业 API 的签名生成是关键步骤,需严格遵循:
参数按 ASCII 升序排序(避免因顺序导致签名错误);
业务参数需序列化为 JSON 字符串(param_json字段);
签名结果为 32 位小写 MD5 值(与阿里系 API 的大写签名不同)。 - 接口权限与限制
权限申请:需在京东开放平台注册企业开发者账号,创建应用并申请 “工业供应链” 相关权限;
调用限制:默认 QPS 为 5(每秒 5 次),企业客户可申请提升至 10-20;
区域 ID:库存查询依赖areaid(省市_区三级编码),可通过京东地址编码接口获取。 - 典型错误处理
错误码 说明 解决方案
1000 签名错误 检查参数排序、appsecret及加密逻辑
2001 权限不足 在开放平台申请对应接口权限
3002 商品 ID 不存在 确认product_id是否为京东工业平台有效 ID
4003 QPS 超限 降低调用频率,或申请提高 QPS 限制
四、应用场景与扩展 - 典型场景
工业采购系统对接:企业 ERP 通过 API 实时获取商品价格、库存,自动生成采购订单;
供应商管理:查询合作供应商的商品目录、库存分布,优化供应链效率;
价格监控:定期调用接口跟踪工业物料价格波动,辅助成本控制。 - 扩展建议
增加批量查询功能;
实现订单创建与跟踪;
添加代理池和重试机制,应对网络波动和 QPS 限制;
结合数据库缓存商品基础信息,减少重复调用。
总结
京东工业 API 为企业提供了标准化的工业供应链对接能力,核心在于严格的签名认证和权限控制。Python 实现需重点处理签名生成和错误响应,结合业务场景合理设计调用逻辑。使用时需遵守京东开放平台规范,确保企业资质合规,避免滥用接口导致权限封禁。