×

api开发 电商平台 数据挖掘

京东商品 API 集成指南:从认证授权到获取实时价格与库存

admin admin 发表于2025-11-16 17:08:26 浏览113 评论0

抢沙发发表评论

在电商数据应用开发中,对接官方 API 是获取商品数据的最佳方式 —— 相比网页爬虫,API 接口更稳定、数据结构更规范,且能避免反爬限制。本文将详细介绍京东开放平台(JD Open Platform)的商品 API 集成流程,从账号注册、认证授权到实时价格与库存的获取,提供完整的技术指南和代码实现。

一、京东开放平台准备工作

1. 注册开发者账号

首先访问完成开发者注册:

  • 个人开发者需提供身份证信息

  • 企业开发者需提供营业执照等资质

  • 获取appKeyappSecret(关键接口请求认证信息)

2. 了解 API 权限

京东商品相关核心 API 及权限要求:

  • 商品详情查询:jingdong.ware.product.detail.get(基础权限)

  • 实时价格查询:jingdong.price.get(需申请特殊权限)

  • 库存查询:jingdong.stock.get(需申请特殊权限)

  • 注意:部分 API 需通过企业认证后才能申请使用

二、认证授权机制解析

京东开放平台采用OAuth 2.0授权机制,分为两种模式:

  1. 客户端模式(Client Credentials)适用于服务器端直接调用 API,无需用户授权,流程如下:

    • 使用appKeyappSecret获取访问令牌(Access Token)

    • 令牌有效期通常为 30 天,需定期刷新

  2. 授权码模式(Authorization Code)适用于需要用户授权的场景(如获取用户订单),本文以客户端模式为例。

三、获取 Access Token(认证实现)

1. 接口说明

  • 请求 URL:

  • 请求方式:POST

  • 核心参数:appKeyappSecretgrant_type=client_credentials

2. Python 实现代码

import requests

class JDClient:
    def __init__(self, app_key, app_secret):
        self.app_key = app_key
        self.app_secret = app_secret
        self.token_url = "https://oauth.jd.com/oauth/token"
        self.access_token = None
        self.expires_in = 0  # 令牌有效期(秒)

    def get_access_token(self):
        """获取访问令牌"""
        params = {
            "grant_type": "client_credentials",
            "client_id": self.app_key,
            "client_secret": self.app_secret
        }
        
        try:
            response = requests.post(self.token_url, params=params)
            result = response.json()
            
            if "access_token" in result:
                self.access_token = result["access_token"]
                self.expires_in = result["expires_in"]
                print(f"令牌获取成功,有效期:{self.expires_in}秒")
                return self.access_token
            else:
                print(f"令牌获取失败:{result.get('error_description')}")
                return None
                
        except Exception as e:
            print(f"请求异常:{str(e)}")
            return None

四、获取实时商品价格(API 调用)

1. 接口说明

  • API 名称:jingdong.price.get

  • 请求 URL:https://api.jd.com/routerjson

  • 请求方式:POST

  • 核心参数:access_tokenskuIds(商品 ID,多个用逗号分隔)

2. 签名机制

京东 API 要求对请求参数进行签名,签名算法如下:

  1. 按参数名 ASCII 升序排序

  2. 拼接为key=value&key=value格式

  3. 首尾添加appSecret

  4. 进行 MD5 加密并转为大写

3. 价格查询实现

import time
import hashlib
import json

class JDProductAPI(JDClient):
    def __init__(self, app_key, app_secret):
        super().__init__(app_key, app_secret)
        self.api_url = "https://api.jd.com/routerjson"

    def sign_params(self, params):
        """生成签名"""
        # 1. 排序参数
        sorted_params = sorted(params.items(), key=lambda x: x[0])
        # 2. 拼接参数
        sign_str = self.app_secret
        for k, v in sorted_params:
            sign_str += f"{k}{v}"
        sign_str += self.app_secret
        # 3. MD5加密
        return hashlib.md5(sign_str.encode()).hexdigest().upper()

    def get_product_price(self, sku_ids):
        """获取商品实时价格"""
        # 检查令牌是否有效(简化版,实际需判断过期时间)
        if not self.access_token:
            if not self.get_access_token():
                return None

        # 构建请求参数
        params = {
            "method": "jingdong.price.get",
            "app_key": self.app_key,
            "access_token": self.access_token,
            "timestamp": time.strftime("%Y-%m-%d %H:%M:%S"),
            "format": "json",
            "v": "1.0",
            "skuIds": sku_ids
        }

        # 生成签名
        params["sign"] = self.sign_params(params)

        try:
            response = requests.post(self.api_url, data=params)
            result = response.json()
            
            # 解析价格数据
            if "price_get_response" in result:
                return result["price_get_response"]["result"]
            else:
                print(f"价格查询失败:{result.get('error_response', {}).get('zh_desc')}")
                return None
                
        except Exception as e:
            print(f"请求异常:{str(e)}")
            return None

五、获取商品库存信息

1. 接口说明

  • API 名称:jingdong.stock.get

  • 请求参数:skuIdsarea(区域编码,如 1_2800_2855_0 表示北京)

  • 区域编码可通过jingdong.area.get接口获取

2. 库存查询实现

    def get_product_stock(self, sku_ids, area="1_2800_2855_0"):
        """获取商品库存信息"""
        if not self.access_token:
            if not self.get_access_token():
                return None

        params = {
            "method": "jingdong.stock.get",
            "app_key": self.app_key,
            "access_token": self.access_token,
            "timestamp": time.strftime("%Y-%m-%d %H:%M:%S"),
            "format": "json",
            "v": "1.0",
            "skuIds": sku_ids,
            "area": area
        }

        params["sign"] = self.sign_params(params)

        try:
            response = requests.post(self.api_url, data=params)
            result = response.json()
            
            if "stock_get_response" in result:
                return result["stock_get_response"]["result"]
            else:
                print(f"库存查询失败:{result.get('error_response', {}).get('zh_desc')}")
                return None
                
        except Exception as e:
            print(f"请求异常:{str(e)}")
            return None

六、完整使用示例

if __name__ == "__main__":
    # 替换为你的appKey和appSecret
    APP_KEY = "你的appKey"
    APP_SECRET = "你的appSecret"
    
    # 初始化客户端
    jd_api = JDProductAPI(APP_KEY, APP_SECRET)
    
    # 测试商品ID(可替换为实际商品ID)
    test_sku_ids = "100012345678,100008348544"
    
    # 获取价格
    price_data = jd_api.get_product_price(test_sku_ids)
    if price_data:
        print("价格信息:")
        for item in json.loads(price_data):
            print(f"SKU: {item['skuId']}, 价格: {item['price']}元")
    
    # 获取库存
    stock_data = jd_api.get_product_stock(test_sku_ids)
    if stock_data:
        print("\n库存信息:")
        for item in json.loads(stock_data):
            stock_status = "有货" if item["stockState"] == 3 else "无货"
            print(f"SKU: {item['skuId']}, 状态: {stock_status}")

七、进阶技巧与注意事项

1. 令牌管理

  • 实现令牌自动刷新机制(记录获取时间,过期前主动更新)

  • 建议将令牌缓存到本地(如文件或 Redis),避免频繁获取

2. 接口限流处理

  • 京东 API 有调用频率限制(通常为 100 次 / 分钟)

  • 实现请求重试机制,处理429 Too Many Requests错误

import time
from requests.adapters import HTTPAdapter
from urllib3.util.retry import Retry

def create_retry_session():
    """创建带重试机制的会话"""
    session = requests.Session()
    retry = Retry(
        total=3,
        backoff_factor=1,  # 重试间隔:1s, 2s, 4s...
        status_forcelist=[429, 500, 502, 503, 504]
    )
    adapter = HTTPAdapter(max_retries=retry)
    session.mount("https://", adapter)
    return session

3. 错误处理

  • 常见错误码:

    • 1000:参数错误(检查签名或参数格式)

    • 1001:令牌无效(重新获取令牌)

    • 2000:权限不足(申请对应 API 权限)

4. 合规性说明

  • 严格遵守《京东服务协议》

  • 不得将 API 数据用于商业竞争或非法用途

  • 大规模调用需提前与京东开放平台沟通

八、总结

本文详细介绍了京东商品 API 的集成流程,包括认证授权、签名生成、价格与库存查询等核心功能。通过官方 API 获取数据不仅稳定性更高,还能避免法律风险。实际开发中,建议根据业务需求扩展功能(如商品详情、分类查询等),并做好异常处理和性能优化,构建可靠的电商数据应用。


少长咸集

群贤毕至

访客