1.简介
微盟商家 微盟
2.微盟接口
微盟商品、订单涉及到的接口有
查询类目 /category/queryChildrenCategory
查询规格值 ec/category/queryCategoryAttrInfo
获取配送方式 /goods/findDeliveryTypeList
获取运费模板 /goods/findFreightTemplateList
添加规格值 ec/category/addAttrValue
添加商品 ec/goods/addGoods
上传图片 ec/goodsImage/uploadImg
获取分组 ec/goodsClassify/queryClassifyInfoList
添加分组 ec/goodsClassify/addClassify
批量上下架 ec/goods/updateGoodsShelfStatus
查询订单列表 ec/order/queryOrderList
查询订单详情 ec/order/queryOrderDetail
微盟http请求方法
public JSONObject httpPostRaw(String url, JSONObject bodyJson, JSONObject headerMap)
{
// post请求返回结果
CloseableHttpClient httpClient = HttpClientBuilder.create().build(); // 获取DefaultHttpClient请求
HttpPost httpPost = new HttpPost(url);
try {
// 设置http头
httpPost.setHeader("Content-Type", "application/json"); // 默认json
if (null != headerMap && headerMap.size() > 0){
for (String name : headerMap.keySet())
{
httpPost.setHeader(name, headerMap.getString(name));
}
}
// 设置body
if(bodyJson != null){
StringEntity entity = new StringEntity(bodyJson.toJSONString(),"UTF-8");
entity.setContentEncoding("UTF-8");
entity.setContentType("application/json");
httpPost.setEntity(entity);
}
HttpResponse result = httpClient.execute(httpPost);
url = URLDecoder.decode(url, "UTF-8");
// 请求发送成功,并得到响应
try {
String str = EntityUtils.toString(result.getEntity());
return JSON.parseObject(str);
} catch (Exception e) {
logger.error("post请求提交失败:" + url, e);
}
} catch (IOException e) {
logger.error("post请求提交失败:" + url, e);
}
finally {
try {
httpClient.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return null;
}
public static void main(String[] args) {
HttpRequestUtils httpRequestUtil = new HttpRequestUtils();
String weiMengBaseUrl = "https://dopen.weimob.com";
String addAttrValue = "/api/1_0/ec/category/addAttrValue";
JSONObject bodyJson = new JSONObject();
bodyJson.put("categoryId", 44);
bodyJson.put("attrId", 53000);
JSONArray noExistJson = new JSONArray();
JSONObject tmp = new JSONObject();
tmp.put("value", "01白色");
noExistJson.add(tmp);
bodyJson.put("attrValueList", noExistJson);
JSONObject retJson = httpRequestUtil.httpPostRaw(weiMengBaseUrl + addAttrValue + "?accesstoken=87186ee0-b557-47f8-89d9-230cb3a1669f", bodyJson, null);
System.out.println(retJson.toJSONString());
}
添加商品
https://dopen.weimob.com/api/1_0/ec/goods/addGoods?accesstoken=a9dc920d-c488-4354-9c09-1c0d0463ceb5
传参:
{"goods":{"b2cGoods":{"b2cGoodsType":0,"deliveryTypeIdList":[3920196],"freightTemplateId":229050849},"categoryId":44,"deductStockType":1,"goodsDesc":"仙女裙","goodsImageUrl":["https://image-c.weimobwmc.com/openruntime/3ea7f5949c50488a8c436fa3073eea20.jpg"],"isMultiSku":1,"isPutAway":1,"selectedSaleAttrList":[{"attrValueList":[{"key":"148252623149"}],"attributeId":"53000"},{"attrValueList":[{"key":"148250430149"},{"key":"148250431149"}],"attributeId":"52000"}],"sellModelType":1,"skuList":[{"b2cSku":{"volume":"0.1","weight":"0.4"},"editStockNum":"0","outerSkuCode":"6018#","salePrice":"154.00","skuAttrMap":{"53000":{"name":"颜色","value":"40杏色","key":"148252623149"},"52000":{"name":"尺寸","value":"S","key":"148250430149"}}},{"b2cSku":{"volume":"0.1","weight":"0.4"},"editStockNum":"0","outerSkuCode":"6018#","salePrice":"154.00","skuAttrMap":{"53000":{"name":"颜色","value":"40杏色","key":"148252623149"},"52000":{"name":"尺寸","value":"M","key":"148250431149"}}}],"title":"6018#秋装新款可盐可甜亮片连衣裙网纱仙女裙性感晚礼服超仙"}}
返回数据:
{"globalTicket":"907260111855793408","code":{"errcode":"0","errmsg":"处理成功"},"data":{"result":true,"applyId":null,"skuList":[{"goodsId":null,"validateId":null,"imageUrl":null,"outerSkuCode":"6018#","storeId":null,"title":null,"skuId":2082944090149},{"goodsId":null,"validateId":null,"imageUrl":null,"outerSkuCode":"6018#","storeId":null,"title":null,"skuId":2082944100149}],"distributorId":null,"goodsId":1370590010149,"notDelDeliveryGoodsIds":null,"outerGoodsIdList":null,"deletedGoodsIds":null,"distributorResponse":null}}
3.获取微盟订单列表
获取微盟订单列表结构如下,pageList为订单数组。
itemList为商品列表,
商品中goodsCode为商品中的SPU编码,groupList为分组信息列表(可以在商品中进行设置,订单商品的这里也可以获取到,可用于区分不同平台商品)。
4.附录
应网友要求,把迭代生成微盟规格的方法放上来,供大家参考。
/**
* <一句话功能简述> 递归遍历所有规格的规格值,并生成微盟所需的saleStandard和skuList
* <功能详细描述>
* author: zhanggw
* 创建时间: 2021/12/15
* @param allStandardPriceArray json格式的所有规格
* [{
* "children": [{
* "children": [{
* "imgUrl": "",
* "isShow": true,
* "name": "中级",
* "price": 180,
* "specifications": "等级"
* }],
* "imgUrl": "",
* "isShow": true,
* "name": "S",
* "specifications": "尺码" * }],
* "imgUrl": "",
* "isShow": true,
* "name": "01白色",
* "specifications": "颜色"
* }]
* @param weiMengStandardJson 微盟规格和规格值映射{"treeStandard":{"颜色":{"attributeId":"53000","attr":{"01白色":"148597579149"}}}}
* @param retMap 用于迭代保存数据和传入特定数据
*/
private void processWmStandardRecursion(JSONArray allStandardPriceArray, JSONObject weiMengStandardJson, Map<String, Object> retMap) {
try{
// 递归层数
Integer layerNum = retMap.get("layerNum") == null ? 1 : Integer.parseInt(retMap.get("layerNum").toString()) + 1;
retMap.put("layerNum", layerNum);
// 保存递归层数路径,方便最后一层按顺序取到前面规格数据
List<Integer> routeList = retMap.get("route") == null ? new ArrayList<>() : (ArrayList<Integer>)retMap.get("route");
routeList.add(layerNum);
retMap.put("route", routeList);
// 遍历当前规格的所有规格值,注意当存在多种规格时,会通过链表的方式关联下一种规格,children为下一种规格的所有信息
for(int i=0; i < allStandardPriceArray.size(); i++){
JSONObject childStandardJson = allStandardPriceArray.getJSONObject(i);
String mainStandardName = childStandardJson.getString("specifications"); // 规格名称 颜色
String mainStandardValue = childStandardJson.getString("name"); // 规格值 01白色
JSONObject mainStandard = weiMengStandardJson.getJSONObject("treeStandard").getJSONObject(mainStandardName); // 规格对象 {"attributeId":"53000","attr":{"01白色":"148597579149"}}
String attributeId = mainStandard.getString("attributeId"); // 规格名称(颜色)对应微盟id
String mainStandardValueId = mainStandard.getJSONObject("attr").getString(mainStandardValue); // 规格值(01白色)对应微盟id
logger.debug("开始递归循环规格,递归层数:{},for次序:{},规格名称:{},规格值:{}", layerNum, i, mainStandardName, mainStandardValue);
// 业务:设置迭代每层规格对象 "53000":{"name":"颜色","value":"01白色","key":148597579149}
Map<String, JSONObject> subSkuAttrMap = new HashMap<>();
JSONObject skuAttr = new JSONObject();
skuAttr.put("name", mainStandardName);
skuAttr.put("value", mainStandardValue);
skuAttr.put("key", mainStandardValueId);
subSkuAttrMap.put(attributeId, skuAttr);
retMap.put("layerSku_"+layerNum, subSkuAttrMap);
// 业务:添加销售规格
Object saleStandardObj = retMap.get("saleStandard");
JSONObject saleStandard;
if(saleStandardObj == null){
saleStandard = new JSONObject();
}else{
saleStandard = (JSONObject)saleStandardObj;
}
JSONObject selectedSaleAttr = saleStandard.getJSONObject(mainStandardName);
if(selectedSaleAttr == null){
selectedSaleAttr = new JSONObject();
selectedSaleAttr.put("attributeId", attributeId);
}
// 业务:销售规格中添加规格值
JSONArray attrValueArray = selectedSaleAttr.getJSONArray("attrValueArray"); // 与attrValueList不同
if(attrValueArray == null){
attrValueArray = new JSONArray();
}
if(!attrValueArray.contains(mainStandardValueId)){
attrValueArray.add(mainStandardValueId);
}
selectedSaleAttr.put("attrValueArray", attrValueArray);
saleStandard.put(mainStandardName, selectedSaleAttr);
retMap.put("saleStandard", saleStandard);
logger.debug("retMap:{}", retMap);
JSONArray childrenArray = childStandardJson.getJSONArray("children");
if(childrenArray != null){ // 还有其它规格未遍历,递归遍历其它规格
processWmStandardRecursion(childrenArray, weiMengStandardJson, retMap);
}else{ // 没有其它规格,已关联上所有规格
BigDecimal price = childStandardJson.getBigDecimal("price"); // 规格价格,只有最底层有
if(price != null){ // 具有价格才有意义
boolean isShow = childStandardJson.getBooleanValue("isShow"); // 是否展示,true:显示,默认库存量50 false:不显示,库存量0
// 开始生成skuMap
JSONObject skuAdditional = weiMengStandardJson.getJSONObject("skuAdditional");
Map<String, Object> skuMap = new HashMap<>();
skuMap.put("b2cSku", skuAdditional.get("b2cSku"));
skuMap.put("salePrice", skuAdditional.getBigDecimal("salePrice"));
skuMap.put("costPrice", skuAdditional.getBigDecimal("costPrice"));
skuMap.put("outerSkuCode", skuAdditional.get("productCode"));
if(isShow){
skuMap.put("editStockNum", 50);
}else{
skuMap.put("editStockNum", 0);
}
Map<String, JSONObject> skuAttrMap = new HashMap<>();
for(Integer routeNum:routeList){
skuAttrMap.putAll((Map<String, JSONObject>)retMap.get("layerSku_"+routeNum));
}
skuMap.put("skuAttrMap", skuAttrMap);
// 将skuMap保存到skuList
List<Map<String, Object>> skuList = retMap.get("skuList") == null ? new ArrayList<>() : (List<Map<String, Object>>)retMap.get("skuList");
skuList.add(skuMap);
retMap.put("skuList", skuList);
}
}
}
// 返回上一层或结束
retMap.put("layerNum", layerNum-1); // 层级上升
// 更新递归层数路径,去掉当前这一层(也就是最后)
routeList.remove(routeList.size()-1);
retMap.put("route", routeList);
}catch (Exception e){
logger.error("递归生成微盟商品规格信息异常!", e);
}
}