京东商品详情API接口开发指南(含Java/Python实现)

64 阅读4分钟

接口概述

京东开放平台为开发者提供了强大的商品详情查询接口,借助该接口,开发者仅需通过SKUID,即可轻松获取商品的全面详细信息,涵盖商品标题、精准价格、高清图片以及丰富的促销信息等。在当前电商市场竞争激烈,数据精准获取与快速响应至关重要的背景下,此接口为开发者提供了高效便捷的数据获取途径。不过,使用该接口前,开发者需要申请API权限并获取认证密钥。

企业微信截图_17525436636275.png

点击获取key和secret

接口特点

  • 批量查询支持:支持批量查询商品信息,一次最多可查询20个SKU,大大提高了数据获取效率,尤其适用于需要大量商品数据对比分析的场景。据市场调研,使用批量查询功能可使数据获取时间缩短70%。
  • 数据格式规范:返回标准的JSON格式数据,便于开发者进行解析和处理,与主流编程语言的数据处理方式高度兼容,降低了开发成本。
  • 安全验证机制:采用签名验证方式,确保数据传输的安全性和完整性,有效防止数据篡改和恶意攻击,保障了开发者和平台的利益。
  • 协议安全可靠:全面支持HTTPS协议,为数据传输提供了加密通道,在当今网络环境日益复杂的形势下,为数据安全保驾护航。

Java实现示例

java
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import org.apache.commons.codec.digest.DigestUtils;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.HashMap;
import java.util.Map;
import java.util.TreeMap;
 
public class JdProductApi {
    private static final String API_URL = "https://api.jd.com/routerjson";
    private static final String VERSION = "1.0";
    
    public static String queryProductDetail(long skuId, String appKey, String appSecret) {
        try {
            // 精心构造请求参数
            Map<String, Object> params = new TreeMap<>();
            params.put("method", "jd.union.open.goods.detail.query");
            params.put("app_key", appKey);
            params.put("timestamp", System.currentTimeMillis());
            params.put("v", VERSION);
            params.put("format", "json");
            
            // 构建商品请求参数
            JSONObject goodsReq = new JSONObject();
            goodsReq.put("skuIds", new long[]{skuId});
            params.put("goodsReq", goodsReq);
            
            // 严格生成签名
            String sign = generateSign(params, appSecret);
            params.put("sign", sign);
            
            // 准确发送请求
            URL url = new URL(API_URL);
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            conn.setRequestMethod("POST");
            conn.setDoOutput(true);
            conn.getOutputStream().write(JSON.toJSONString(params).getBytes());
            
            // 高效处理响应
            BufferedReader reader = new BufferedReader(
                new InputStreamReader(conn.getInputStream()));
            StringBuilder response = new StringBuilder();
            String line;
            while ((line = reader.readLine()) != null) {
                response.append(line);
            }
            return response.toString();
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }
    
    private static String generateSign(Map<String, Object> params, String appSecret) {
        StringBuilder sb = new StringBuilder(appSecret);
        for (Map.Entry<String, Object> entry : params.entrySet()) {
            sb.append(entry.getKey()).append(entry.getValue());
        }
        sb.append(appSecret);
        return DigestUtils.md5Hex(sb.toString()).toUpperCase();
    }
}

Python实现示例

python
import hashlib
import time
import json
import requests
 
class JdProductApi:
    API_URL = "https://api.jd.com/routerjson"
    VERSION = "1.0"
    
    @staticmethod
    def query_product_detail(sku_id, app_key, app_secret):
        params = {
            "method": "jd.union.open.goods.detail.query",
            "app_key": app_key,
            "timestamp": int(time.time() * 1000),
            "v": JdProductApi.VERSION,
            "format": "json",
            "goodsReq": {"skuIds": [sku_id]}
        }
        
        # 严谨生成签名
        sign = JdProductApi.generate_sign(params, app_secret)
        params["sign"] = sign
        
        # 可靠发送请求
        response = requests.post(
            JdProductApi.API_URL,
            json=params,
            headers={"Content-Type": "application/json"}
        )
        return response.json()
    
    @staticmethod
    def generate_sign(params, app_secret):
        param_str = app_secret
        for key in sorted(params.keys()):
            param_str += f"{key}{params[key]}"
        param_str += app_secret
        return hashlib.md5(param_str.encode()).hexdigest().upper()

接口返回示例

json
{ 
    "code": 0, 
    "message": "success", 
    "data": { 
        "skuId": 1234567, 
        "skuName": "示例商品名称", 
        "price": 299.00, 
        "imageList": ["http://img1.jpg", "http://img2.jpg"], 
        "brandName": "示例品牌", 
        "category": "电子产品", 
        "shopId": 10001, 
        "shopName": "官方旗舰店", 
        "promotionList": [ 
            { 
                "promotionId": 1, 
                "promotionName": "满299减30", 
                "startTime": "2025-05-01 00:00:00", 
                "endTime": "2025-05-31 23:59:59" 
            } 
        ] 
    } 
}

开发注意事项

  • 权限申请先行:在使用接口前,务必先在京东开放平台申请API权限,这是使用接口的前提条件,否则无法正常调用接口获取数据。
  • 频率限制牢记:每个应用都有调用频率限制,通常为100次/秒。开发者需要合理规划调用策略,避免因频繁调用触发限制,导致数据获取中断。
  • 签名算法精准:签名算法必须严格按照文档要求实现,任何细微的偏差都可能导致签名验证失败,从而无法获取数据。
  • 协议选择恰当:建议使用HTTPS协议进行数据传输,以保证传输过程的安全性,防止数据泄露和篡改。
  • 异常处理全面:要充分考虑并处理可能出现的异常情况,如网络超时、参数错误等,确保程序的稳定性和可靠性。

以上代码提供了Java和Python两种语言的实现示例,开发者可以根据自己的技术栈选择合适的版本。实际使用时,需要将appKey和appSecret替换为实际获取的值,并添加适当的错误处理逻辑,以应对各种可能出现的异常情况。

欢迎各位大佬评论互动,小编必回