对于还是开发菜鸟阶段的我来说,走了不少弯路,包括文档的一些坑也是自己一个一个慢慢填的。总的来说美团提供的开放平台确实没有饿了么做的好,很多东西写的也不够清楚,希望通过这篇博客分享一些自己开发过程中遇到的一些问题和解决的经验方法。
不过很多问题还是因为自己没有仔细看文档。
重要的事情说三遍:仔细看文档,仔细看文档,仔细看文档!
好了回到正题,想对接外卖平台进行开发的话首先还是要弄清楚你到底要申请什么平台,ERP厂商平台是针对厂商的,可以对多个不同商家店铺进行管理,而如果只是想对连锁店进行管理的话可以直接申请商家开发平台。
1.申请阶段
我们开发的是对接多个外卖平台的,所以是申请的厂商开发平台。最初就是申请的过程有点麻烦,到美团点评的开放平台进行申请。
填完信息后可能会拖个十天半个月,最好是自己打电话过去咨询一下,要不然可能会拖的更久。当然信息最好是属实的,审核期间会要求签一份合作的合同,签完合同之后审核过了就会得到对应的developerId和Sinkey,之后就可以正式开发了。
2.导入对应的依赖
美团目前的sdk包是针对的Java语言开发的,所谓的sdk包就是方便你开发使用,你不用去再自己写加密函数,以及对请求的封装。但是目前还是有一些问题,不管是开发文档还是sdk包使用的时候都有一些误差。但是为了减轻开发的代码量建议还是使用提供的sdk包。下载sdk包后对里面的jar包进行导入,就是导入所谓的依赖。
在Dependencies中选中右侧的+号添加对应的jar包
选择之前你下载的sdk包路径下的jar包就ok。
3.测试门店的申请和映射
3.1测试门店的申请
在开发者中心进行测试门店的申请
注意:只有最开始就提供了的门店帐号是永久可用的,其他帐号有效期都是一个月,如果一个帐号就可以满足业务的需求的话就可以跳过这一步了。
3.2测试门店的映射
3.2.1回调接口的设置
应为开发经常会需要对设置回调接口进行测试,所以这里推荐使用外网穿透的工具进行设置回调的接口ngrok外网穿透
是用的教程网站上有详细的文档,这里就不写了。
应用启动后在终端显示的形式是这种形式。
在绑定之前需要在开发者中心对门店映射的回调接口进行设置,链接后面的是填自己应用的接口,当通过后面3.2.2中映射的后美团会调用我们所填写的回调地址,然后将对应的参数传入我们的接口,这是我们需要对回调数据进行数据库的存储,至少appAuthToken和ePoiId是必须存的。
特别说一下ePoiId和poiId的区别:ePoiId是我们系统中给商家门店设置的id进行唯一标识,而poiId是美团系统中给商家门店设置的id进行唯一标识。
/**
* 美团门店绑定回调接口
* @param request
* @return
*/
@RequestMapping("/MTToken")
public Object pushToken(HttpServletRequest request){
String appAuthToken = request.getParameter("appAuthToken");
String ePoiId = request.getParameter("ePoiId");
String poiId = request.getParameter("poiId");
String poiName = request.getParameter("poiName");
//TODO,门店绑定后的逻辑操作..
// String userId = redisService.getKey(ePoiId);
// if (userId==null){
// log.error("当前时间:{},缓存失效..",new Date());
// throw new MyException(ResultEnum.REDIS_KEY_OUT_OF_TIME);
// }
// mappingService.mappingAllDishes(appAuthToken,ePoiId);
// shopService.saveBaseInfo(appAuthToken,ePoiId, Long.parseLong(userId),"美团");
Map map = new HashMap();
map.put("data","success");
return map;
}
3.2.2映射获取门店appAuthToken
门店映射操作是必接通接口,但是这接口并不需要对应文档的参数进行传参。这里是美团文档的一点小问题。
接口调用:https://open-erp.meituan.com/storemap
调用接口是是需要传入四个字段就可以了:developerId,businessId,ePoiId,signKey,具体每个字段代表什么参考文档
形式:
直接在浏览器上进行访问会得到美团外卖授权的登录界面
输入之前开发者中心申请的测试门店帐号和密码
进行点击绑定,然后回调接口就会接收到对应的参数。
4.测试和封装
首先说一下为什么要先进行测试和封装,因为你不测试是不会知道有哪些坑的,而且美团测试返回的数据全部都是Json的格式,如果是想要保存数据的话肯定是要对返回的Json数据进行解析和封装成对象的。
这里主要说一些简单的工具类后面会附上源码。
4.1测试接口
至于使用每个接口大致都差不多,这里就以查询菜品接口为例:
/**
* 根据ERP方门店Id查询门店下的菜品(不包含美团方的菜品ID)
* @param token
* @param ePoiId
* @param offset
* @param limit
* @return
*/
@Override
public Object queryDishesByePoiId(String token, String ePoiId, Integer offset, Integer limit) {
RequestSysParams params = new RequestSysParams(MyUtil.signKey,token);
CipCaterTakeoutDishQueryByEPoiIdRequest request = new CipCaterTakeoutDishQueryByEPoiIdRequest();
request.setRequestSysParams(params);
request.setePoiId(ePoiId);
request.setOffset(offset);
request.setLimit(limit);
try {
return request.doRequest();
} catch (IOException e) {
e.printStackTrace();
} catch (URISyntaxException e) {
e.printStackTrace();
}
return null;
}
CipCaterTakeout...就是对接外卖业务这块的需要的sdk中提供的对应请求的类。
所有的请求都是用doRequest()进行请求,doRequest()方法调用后返回的就是文档中对应的json数据。
注意:少数接口返回的json数据可能会与文档提供的有不同,开发是以实际返回的参数为准。
4.2json数据的封装
这里需要使用的依赖:
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
</dependency>
基本的封装:
/**
* 解析JsonObject数据
*
* @param jsonString
* Json格式字符串
* @param cls
* 封装类
*
*/
public static <T> T parseObject(String jsonString, Class<T> cls) {
T t = null;
try {
t = JSON.parseObject(jsonString, cls);
} catch (Exception e) {
e.printStackTrace();
}
return t;
}
/**
* 解析JsonArray数据
*
* @param jsonString
* @param cls
* @return
*/
public static <T> List<T> parseArray(String jsonString, Class<T> cls) {
List<T> list = new ArrayList<T>();
try {
list = JSON.parseArray(jsonString, cls);
} catch (Exception e) {
e.printStackTrace();
}
return list;
}
/**
* 解析JsonArray数据,返回Map类型的List
*
* @param jsonString
* @return
*/
public static List<Map<String, Object>> parseObjectListKeyMaps(
String jsonString) {
List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
try {
list = JSON.parseObject(jsonString,
new TypeReference<List<Map<String, Object>>>() {
});
} catch (Exception e) {
e.printStackTrace();
}
return list;
}
后续可以自定义一些对每个接口返回的数据的封装,以及解析的方法的封装,因为当时有点慌后面的源码中写的也比较乱。
本人也只是才开始开发项目的萌新一个,只是就自己所知道的提供一些经验,所以还请大佬们别喷。
最后吐槽一下,美团在与厂商合作的时候,确实很多都做的不到位,本来这个项目是快要做完了的,但是最后居然美团来了个停止与部分厂商进行合作,反正还是很气。