前言 点击获取key和secret
工业物资采购ERP、企业集采比价、工业品库存同步、供应链物料管理系统开发场景中,通过关键词批量获取工业设备、五金耗材、劳保物料商品数据是核心基础能力。目前网络现有京东接口教程大多针对零售联盟场景,无法适配京东工业B2B专属规则,普遍存在签名逻辑不标准、缺失工业集采筛选字段、无分页闭环、异常处理简陋等问题。本文基于京东工业开放平台官方稳定搜索接口,严格落地平台标准MD5首尾加密签名,适配工业专属参数筛选、限流退避、结构化数据清洗,全程依托官方合规接口开发,无逆向抓包行为,适合企业级项目落地。
一、本文差异化核心亮点
1. 工业平台标准签名完整落地:严格遵循京东工业参数ASCII升序、空值过滤、首尾拼接密钥的MD5加密规则,解决90%鉴权失败问题,区别零售平台简易签名写法。
2. B2B工业专属筛选体系:支持起订量、工业类目、含税价筛选、现货直发标识过滤,适配企业集采场景,区别普通零售商品搜索逻辑。
3. 生产级风控与异常降级:精准拦截签名错误、配额超限、无匹配商品、网络超时异常,429限流自动休眠重试,规避应用权限封禁。
4. 全自动分页闭环遍历:自动读取总页数循环拉取全量数据,末页自动终止,无需手动维护页码,适配批量物料数据同步。
二、接口基础规范
接口能力:京东工业关键词商品列表查询(B2B集采专用)
请求方式:POST表单请求
签名规则:参数升序拼接,首尾拼接AppSecret后MD5加密,输出大写密文
时间规范:13位毫秒级时间戳,秒级时间戳直接鉴权失败
调用限制:企业开发者QPS≤3,高频并发会触发临时限流
三、完整可运行Python生产代码import requests
import hashlib
import time
import json
from urllib.parse import quote
class JdIndustrySearch:
def __init__(self, app_key, app_secret):
self.app_key = app_key
self.app_secret = app_secret
self.api_url = "https://api.jdindustry.com/open/api"
self.method = "industry.goods.search"
self.session = requests.Session()
def build_sign(self, params):
# 京东工业标准MD5首尾签名算法
valid = {k:v for k,v in params.items() if v}
sorted_items = sorted(valid.items(), key=lambda x:x[0])
sign_str = self.app_secret
for k,v in sorted_items:
sign_str += f"{k}{quote(str(v), safe='')}"
sign_str += self.app_secret
return hashlib.md5(sign_str.encode()).hexdigest().upper()
def single_page(self, keyword, page=1, page_size=20, min_num=None, tax_price=1):
timestamp = str(int(time.time()*1000))
params = {
"app_key": self.app_key,
"method": self.method,
"timestamp": timestamp,
"keyword": keyword,
"page": page,
"page_size": page_size,
"tax_price": tax_price
}
if min_num:
params["min_buy_num"] = min_num
params["sign"] = self.build_sign(params)
headers = {"Content-Type":"application/x-www-form-urlencoded"}
try:
res = self.session.post(self.api_url, data=params, headers=headers, timeout=15)
data = res.json()
if data.get("code") == 429:
time.sleep(2)
return self.single_page(keyword,page,page_size,min_num,tax_price)
if data.get("code") != 0:
return {"code":-1,"msg":data.get("msg"),"list":[]}
goods = data.get("data",{}).get("list",[])
clean = []
for item in goods:
clean.append({
"goods_id":item.get("skuId"),
"title":item.get("name"),
"tax_price":float(item.get("taxPrice",0)),
"market_price":float(item.get("marketPrice",0)),
"min_buy":item.get("minBuyNum",1),
"stock":item.get("stockNum",0),
"is_spot":bool(item.get("isSpot",0)),
"category_name":item.get("categoryName")
})
time.sleep(0.4)
return {"code":200,"total":data.get("total"),"list":clean}
except Exception as e:
return {"code":-2,"msg":str(e),"list":[]}
def get_all_goods(self, keyword, min_num=None):
all_data = []
page = 1
while True:
res = self.single_page(keyword,page,20,min_num)
if res["code"]!=200 or not res["list"]:
break
all_data.extend(res["list"])
if len(res["list"])<20:break
page += 1
return {"keyword":keyword,"total":len(all_data),"data":all_data}
# 调用示例
if __name__ == "__main__":
client = JdIndustrySearch("你的app_key","你的app_secret")
result = client.get_all_goods("劳保手套", min_num=5)
print(json.dumps(result, ensure_ascii=False, indent=2))
四、实战核心避坑要点
1. 京东工业签名必须首尾拼接密钥,仅单侧拼接会直接鉴权失败,零售接口规则无法通用。
2. 必须使用13位毫秒时间戳,参数值中文强制URL编码,是高频报错核心原因。
tax_price含税价参数为工业集采核心字段,开启后才可获取企业真实结算采购价。
工业商品存在最小起订量限制,需通过min_buy_num筛选,适配批量采购业务。