微盟接口对接记录

本文详细记录了微盟接口对接的过程,包括微盟的商品接口,如查询类目、规格值、配送方式等,以及订单接口,如获取订单列表和详情。通过示例展示了如何使用HTTP请求添加商品,并提供了获取微盟订单列表的结构信息。此外,还分享了迭代生成微盟规格的方法作为附录。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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);
        }
    }

评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

kenick

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值