一、前置准备:获取接口调用权限
1. 平台注册与应用创建
注册开发者账号(企业 / 个人均可,企业权限更完整);
进入控制台,创建第三方应用,获取核心凭证:
appKey:应用唯一标识appSecret:应用密钥(用于签名加密,务必保密)
2. 申请商品详情接口权限
alibaba.item.get(获取单个商品详情),需要在开放平台申请接口权限:进入「应用管理」→「接口权限」,搜索并申请
alibaba.item.get接口;部分接口需要资质审核,审核通过后才能调用。
3. 核心接口信息
接口名称:
alibaba.item.get请求方式:HTTP POST
接口地址:
https://gw-api.open.1688.com/router/rest返回格式:JSON
必传参数:商品 ID(offerId)、授权信息、签名等
二、接口调用核心原理
拼接公共请求参数(appKey、接口名、时间戳、格式、版本等);
拼接业务参数(offerId 商品 ID);
使用
appSecret对所有参数进行MD5 签名;发送 HTTP 请求,解析返回的 JSON 数据。
三、Java 实现代码(可直接运行)
1. 项目依赖
2. 完整工具类代码
import java.io.BufferedReader;import java.io.InputStreamReader;import java.io.OutputStream;import java.net.HttpURLConnection;import java.net.URL;import java.net.URLEncoder;import java.nio.charset.StandardCharsets;import java.security.MessageDigest;import java.util.*;/**
* 阿里巴巴商品详情接口调用工具类
* 接口:alibaba.item.get(获取单个商品详情)
*/public class AlibabaItemApiUtil {
// ====================== 配置项(替换为你自己的) ======================
private static final String APP_KEY = "你的appKey";
private static final String APP_SECRET = "你的appSecret";
// 阿里巴巴开放平台网关地址
private static final String API_URL = "https://gw-api.open.1688.com/router/rest";
// ====================== 接口固定参数 ======================
private static final String METHOD = "alibaba.item.get";
private static final String FORMAT = "json";
private static final String V = "2.0";
private static final String SIGN_METHOD = "md5";
/**
* 获取阿里巴巴商品详情
* @param offerId 阿里巴巴商品ID(必填)
* @return 商品详情JSON字符串
* @throws Exception
*/
public static String getItemDetail(Long offerId) throws Exception {
// 1. 组装所有请求参数
Map<String, String> params = new HashMap<>();
// 公共参数
params.put("app_key", APP_KEY);
params.put("method", METHOD);
params.put("timestamp", String.valueOf(System.currentTimeMillis()));
params.put("format", FORMAT);
params.put("v", V);
params.put("sign_method", SIGN_METHOD);
// 业务参数(商品ID,核心参数)
params.put("offerId", String.valueOf(offerId));
// 2. 生成签名(阿里巴巴接口核心)
String sign = generateSign(params, APP_SECRET);
params.put("sign", sign);
// 3. 发送POST请求,获取返回结果
return sendPostRequest(API_URL, params);
}
/**
* 生成阿里巴巴开放平台签名
* 规则:appSecret + 参数key按ASCII排序 + 参数值 + appSecret → MD5加密 → 转大写
*/
private static String generateSign(Map<String, String> params, String appSecret) throws Exception {
// 1. 参数按key的ASCII码升序排序
List<String> sortedKeys = new ArrayList<>(params.keySet());
Collections.sort(sortedKeys);
// 2. 拼接签名字符串:appSecret + key1value1key2value2... + appSecret
StringBuilder sb = new StringBuilder(appSecret);
for (String key : sortedKeys) {
String value = params.get(key);
if (value != null && !value.isEmpty()) {
sb.append(key).append(value);
}
}
sb.append(appSecret);
// 3. MD5加密并转大写
return md5Encrypt(sb.toString()).toUpperCase();
}
/**
* MD5加密工具方法
*/
private static String md5Encrypt(String str) throws Exception {
MessageDigest md = MessageDigest.getInstance("MD5");
byte[] bytes = md.digest(str.getBytes(StandardCharsets.UTF_8));
StringBuilder result = new StringBuilder();
for (byte b : bytes) {
String hex = Integer.toHexString(b & 0xFF);
if (hex.length() == 1) {
result.append("0");
}
result.append(hex);
}
return result.toString();
}
/**
* 发送HTTP POST请求
*/
private static String sendPostRequest(String url, Map<String, String> params) throws Exception {
// 拼接请求体参数
StringBuilder postData = new StringBuilder();
for (Map.Entry<String, String> entry : params.entrySet()) {
if (postData.length() > 0) {
postData.append("&");
}
postData.append(URLEncoder.encode(entry.getKey(), "UTF-8"));
postData.append("=");
postData.append(URLEncoder.encode(entry.getValue(), "UTF-8"));
}
// 创建连接
URL apiUrl = new URL(url);
HttpURLConnection conn = (HttpURLConnection) apiUrl.openConnection();
conn.setRequestMethod("POST");
conn.setConnectTimeout(10000);
conn.setReadTimeout(10000);
conn.setDoOutput(true);
conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded;charset=UTF-8");
// 写入请求参数
try (OutputStream os = conn.getOutputStream()) {
os.write(postData.toString().getBytes(StandardCharsets.UTF_8));
os.flush();
}
// 读取响应结果
int responseCode = conn.getResponseCode();
StringBuilder result = new StringBuilder();
try (BufferedReader br = new BufferedReader(
new InputStreamReader(responseCode == 200 ? conn.getInputStream() : conn.getErrorStream(), StandardCharsets.UTF_8))) {
String line;
while ((line = br.readLine()) != null) {
result.append(line);
}
}
conn.disconnect();
return result.toString();
}
// ====================== 测试入口 ======================
public static void main(String[] args) {
try {
// 替换为真实的阿里巴巴商品ID
Long offerId = 789012345678L;
// 调用接口获取商品详情
String itemDetail = getItemDetail(offerId);
// 打印结果
System.out.println("阿里巴巴商品详情:");
System.out.println(itemDetail);
} catch (Exception e) {
System.err.println("调用接口失败:");
e.printStackTrace();
}
}}四、代码核心说明
1. 核心参数解释
offerId:阿里巴巴商品 ID(商品详情页 URL 中的数字 ID,必填);appKey/appSecret:开放平台应用凭证,必须替换为自己的;timestamp:时间戳,接口防重放校验;sign:签名,阿里巴巴接口鉴权核心,必须按规则生成。
2. 签名生成规则(重点)
所有参数按Key 的 ASCII 升序排序;
拼接格式:
appSecret + 排序后的key+value + appSecret;对拼接字符串做MD5 加密,结果转大写。
3. 返回数据解析
{
"alibaba_item_get_response": {
"result": {
"offerId": 789012345678,
"subject": "商品标题",
"price": "99.00",
"quantity": 100,
"images": ["https://xxx.jpg"],
"skuInfos": [...],
"productFeatures": [...],
"detailUrl": "https://xxx"
},
"success": true
}}subject:商品标题price:商品价格quantity:库存images:商品主图列表skuInfos:SKU 规格信息productFeatures:商品参数
五、常见问题与解决方案
1. 签名错误(error 20001)
原因:签名规则错误、参数未排序、appSecret 错误;
解决:严格按照 ASCII 排序参数,检查拼接格式,核对凭证。
2. 权限不足(error 40001)
原因:未申请
alibaba.item.get接口权限;解决:开放平台重新申请接口权限,等待审核通过。
3. 商品 ID 不存在(error 40004)
原因:
offerId错误或商品已下架;解决:核对商品 ID,确认商品状态正常。
4. 请求超时
原因:网络问题、接口限流;
解决:检查网络,增加超时时间,控制调用频率。
六、进阶优化
框架集成:项目中可替换为
OkHttp/RestTemplate发送 HTTP 请求,提升性能;异常处理:完善全局异常捕获,区分业务异常和系统异常;
结果封装:将 JSON 返回结果解析为 Java 实体类,方便业务使用;
限流处理:阿里巴巴接口有调用频率限制,增加限流逻辑避免被封禁。
七、注意事项
严格遵守阿里巴巴开放平台使用规范,禁止非法采集数据;
appSecret属于敏感信息,禁止明文泄露,建议配置在环境变量中;接口权限和调用频率以开放平台官方文档为准。
总结
开放平台权限申请与凭证获取;
接口签名规则与实现;
可直接运行的 Java 工具类代码;
常见问题排查与优化建议。
appKey、appSecret 和商品 ID,即可快速集成到项目中,稳定获取阿里巴巴商品详情数据。