记录对接京东宙斯API -- 发布商品
1. SDK的问题
第一次下载的SDK用不了, JAR 里缺失的代码非常多. 连最起码的文档中的demo也无法执行.
面对这种问题, 咱也没辙, 只能去京东JOS哪里提交工单, 询问客服了!!!
2. 提交工单, 反应不及时的问题(纯属吐槽, 勿怪!!!).
当你去提交工单咨询问题的时候, 那真是时慢时快;
慢的时候能让你等半天, 快的时候基本上十五钟内基本也有回复了.
3. 对接同步SOP类型的商品信息API
1. 需求: 把本系统发布的商品同步到旗舰店内. 从而到达在本系统发布的商品不用在京东店铺进行二次发布.
2. 实际对接的状况:
1). 因为之前SDK的问题. 而导致无法使用官方Demo中案例进行请求接口. 所以帖主就在寻找其他请求的办法,
最终在文档API最下方发现了一个供开发人员测试调用接口的测试工具.
京东宙斯发布商品的API链接: 发布商品
2). 在看完文档API后, 发现要把本系统的商品同步到京东店铺内, 还真不是一件容易的事情,
最重要的一点要彼此的结构差不多, 当然你的产品在设计原型的时候知道有这个需求, 在设计原型的就会考虑到模仿京东的发布商品页面的格式(暂时就这样说吧.),
所以在设计表结构的时候, 也自然会向这个方向靠拢(ennn...废话有点多.), 但想法是好的,
现实是骨感的, 而我就遇到了很多问题.
比如: 类目ID, 京东这边发布商品需要审核通过的三级类目ID(目前必须是审核通过且为三级的类目), 否则无法发布成功.
关于类目还有一点问题: 在我对接的时候, 刚好遇上京东对商品这一块的业务进行升级, 原有的三级类目升级成了四级,
但我在发布商品的时候又告诉我 "类目必须是三级", 而我传递的类目ID明明是三级的,且又不行,
还有就是返回的提示语也有问题, 我这明明是发布商品, 然后返回的提示语却是修改商品醉了,
后来去提问工单后, 才了解到京东升级了商品这一块的业务后, 需要人工手动去商家后台进行迁移类目,
等客户那边迁移好, 几天过去了, 心好累....
废话过后, 接下来就是帖代码了:
3.1. 通过类目和属性类型,获取类目的属性列表,不限制等级,可以查询销售属性
PS: 我这种调用方式是因为SDK缺失的缘故, 如果不缺失的话, 还是按照官方Demo来.
/**
* @Author
* @Description 通过类目和属性类型,获取类目的属性列表,不限制等级,可以查询销售属性
* @Date 13:58 2019/6/18
* @Param [accessToken, cid]
* @Param [accessToken, 类目ID]
* @return com.alibaba.fastjson.JSONObject
**/
public JSONObject findAttrsByCategoryIdUnlimitCate(String accessToken, Integer cid){
String method = "jingdong.category.read.findAttrsByCategoryIdUnlimitCate";
String timestamp = DateUtils.convertDate2String("yyyy-MM-dd HH:mm:ss", new Date());
Map<String, Object> map = new HashMap<>();
map.put("cid", cid);
map.put("field", "attrValueList,attrGroup");
// map.put("attributeType", 4); // 属性类型:1.关键属性 2.不变属性 3.可变属性 4.销售属性 目前暂时限制死.
String requestParam = JSONUtils.toJsonString(map);
HashMap<String, Object> params = new HashMap<>();
params.put("v", V);
params.put("method", method);
params.put("timestamp", timestamp);
params.put("app_key", APPKEY);
params.put("app_secret", APPSECRET);
params.put("access_token", accessToken);
params.put("360buy_param_json", map);
// 生成签名
String sign = jdSign(params);
try {
String url = SERVER_URL +
"?v=" + V +
"&method=" + method +
"&app_key=" + APPKEY +
"&access_token=" + accessToken +
"&360buy_param_json=" + URLEncoder.encode(requestParam, "UTF-8") +
"×tamp=" + URLEncoder.encode("timestamp", "UTF-8") +
"&sign=" + sign;
LOGGER.warn("=============== URL: " + url);
JSONObject jsonObject = HttpUtils.doGetJson(url);
LOGGER.warn("===============京东API 通过类目和属性类型, 获取类目的属性列表: " + jsonObject.toString() + "=====================");
return jsonObject;
} catch (Exception e) {
LOGGER.warn("===============京东API 通过类目和属性类型, 获取类目的属性列表!!! =====================");
e.printStackTrace();
}
return null;
}
类目API的链接: 通过类目和属性类型,获取类目的属性列表,不限制等级,可以查询销售属性
3). 商品图片的问题.
想要发布商品成功, 你必须要使用京东内的图片, 也就是说: 你需要在同步商品之前就把商品图片上传到京东服务器内. 这个操作很简单, 估计大家都做过, 这里我就不多废话了.
直接贴代码:
3.2. 上传单张图片
/**
* @Author
* @Description 上传单张图片
* @Date 11:29 2019/7/17
* @Param [accessToken, imageData, pictureCateId, pictureName]
* @Param [accessToken, 图片二进制文件流,允许png、jpg、gif、jpeg、bmp图片格式,1M以内,
* 上传到的图片分类ID,为空上传至 默认分类,
* 图片名称,不超过64字节,为空默认 未命名]
* @return com.alibaba.fastjson.JSONObject
**/
public ImgzonePictureUploadResponse pictureUpload(String accessToken, byte[] imageData, Long pictureCateId, String pictureName){
try {
JdClient client = new DefaultJdClient(SERVER_URL, accessToken, APPKEY, APPSECRET);
ImgzonePictureUploadRequest request = new ImgzonePictureUploadRequest();
request.setImageData(imageData);
request.setPictureCateId(pictureCateId);
request.setPictureName(pictureName);
ImgzonePictureUploadResponse response = client.execute(request);
LOGGER.warn("===============京东API 上传单张图片: " + JSONUtils.toJsonString(response) + "=====================");
return response;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
京东上传图片的API链接: 上传单张图片
4). SKU设置的问题.
帖主在这里可是踩了很多坑, 因为你设置了SKU, 那必须要在添加类目的属性(即三级类目的属性值).
填写SKU属性时(saleAttrs), 有一个必要的条件: 在类目属性返回的字段中, 有一个 attributeType 字段, 只有这个字段为 4 的时候, 才可以添加进去,
而且必须要字符串数组; 当然文档上有说明.
还有一点就是现在的我也没有搞明白: 就是你设置了 saleAttrs 值时, 你也要传递 multiCateProps 值,
否则如果不传递的话, 会出现一个情况: 有时可以发布成功, 有时会失败. 头大!!(还是自己太菜了导致的, 唉....)
5). 以上四点搞好了, 基本也就差运费模板(transportId)和品牌ID(brandId)了.
这里我说明一下, 在发布商品的API文档中品牌ID不是必填的, 在实际操作发现如果你不填的话,
如导致发布失败, 出现稀奇古怪的错误提示.
还有一个关联板式(templateId)的字段也是, 即使可以不填, 也填上 0L(预防万一).
如果有其他大神看到了, 发现我说的是不对的, 麻烦及时告知我一下, 我马上修改过来. (新人一枚, 大家勿怪!!!)
3.3. 下面直接上运费模板和获取品牌的代码:
运费模板:
运费模板API的链接: 根据venderId获取单品模板
/**
* @Author
* @Description 获取京东商家的单品运费模板.
* @Date 15:18 2019/6/12
* @Param [accessToken]
* @return com.alibaba.fastjson.JSONObject
**/
public JSONObject findFreightTemplateListData(String accessToken){
String method = "jingdong.SkuFareTemplateService.getTemplates";
String timestamp = DateUtils.convertDate2String("yyyy-MM-dd HH:mm:ss", new Date());
HashMap<String, Object> params = new HashMap<>();
params.put("v", V);
params.put("method", method);
params.put("timestamp", timestamp);
params.put("app_key", APPKEY);
params.put("app_secret", APPSECRET);
params.put("access_token", accessToken);
String sign = jdSign(params);
try {
String url = "https://api.jd.com/routerjson?" +
"v=" + V +
"&method=" + method +
"&app_key=" + APPKEY +
"&access_token=" + accessToken +
"×tamp=" + URLEncoder.encode(timestamp, "UTF-8") +
"&sign=" + sign;
LOGGER.warn("=============== URL: " + url);
JSONObject jsonObject = HttpUtils.doGetJson(url);
LOGGER.warn("===============京东API 获取京东商家的单品运费模板: " + jsonObject.toString() + "=====================");
return jsonObject;
} catch (Exception e) {
LOGGER.warn("===============京东API 获取京东商家的单品运费模板!!! =====================");
e.printStackTrace();
}
return null;
}
品牌
品牌API的链接: 查询商家已授权的品牌
/**
* @Author
* @Description 查询商家已授权的品牌
* @Date 14:54 2019/7/18
* @Param [accessToken]
* @return java.util.List<com.jd.open.api.sdk.response.list.VenderBrandPubInfo>
**/
public List<VenderBrandPubInfo> venderBrandQuery(String accessToken){
try {
JdClient client = new DefaultJdClient(SERVER_URL, accessToken, APPKEY, APPSECRET);
PopVenderCenerVenderBrandQueryRequest request = new PopVenderCenerVenderBrandQueryRequest();
// request.setName("填写京东店铺内的品牌名称"); // 可以指定查询
PopVenderCenerVenderBrandQueryResponse response = client.execute(request);
List<VenderBrandPubInfo> brandList = response.getBrandList();
LOGGER.warn("===============京东API 获取商家可用的经营分类列表: " + JSONUtils.toJsonString(response) + "=====================");
return brandList;
} catch (Exception e) {
LOGGER.warn("===============京东API 获取商家可用的经营分类列表失败!!! =====================");
e.printStackTrace();
}
return null;
}
4. 修改商品.
修改商品的接口, 其实和发布商品的差别不大, 你既然可以成功调用发布商品的接口, 那修改商品的接口也一样可以调用成功.
只不过, 调用修改商品的接口, 需要你必须传递商品, 还有就是你修改商品信息的参数.
PS: 记录日常开发中的点点滴滴…