前言:文档用于记录美团外卖api的接入过程,美团外卖提供给第三方软件商的接入地址如下,如果是单独的餐饮企业是可以直接接入美团外卖比较成熟的api的。此文是针对第三方软件商想接入美团外卖可以看看。本人接入的时间大概是2016年12月份,当时此网站上是没有javaSDK的,所以一些加密方法都是自己按照文档里面加密的。有SDK还是用SDK吧。本文档只接入了外卖,其它功能未接入。
地址:https://developer.meituan.com/home?applyFrom=waimai_developer
进入后应该是这个界面。
第一步,填一些ERP厂商的基本信息。
第二步,申请一个测试帐号,及门店
测试帐号及门店申请好了,下载一个美团app,定位到你测试门店的位置,就可以下测试单了。
测试门店下单后,那些订单信息是怎么推送给你呢?
第三步,填写推送地址
云端心跳地址:是美团检验你服务器是死是活用的。
推送订单url:是将订单推送给你的url,请填写你自己的地址。
下面几个url看名字就行了。就是这个意思,美团和饿了么api不同,饿了么是同一个推送地址,但是会用type区分是什么操作的推送,美团则是需要填写多个地址。
第四步,开始写代码。
1.将所有的请求地址写在一个util中,并完成签名加密方法。
public class MeidaUrlUtil {
private static Logger logger = Logger.getLogger(MeidaUrlUtil.class);
private static String recEncoding = "UTF-8";
//商家确认订单
public static String mdOrderConfirm(Map params) throws Exception{
String url = Commons.MEIDA_URL+"/order/confirm";
params=commonOrderArgs(params);
return HttpRequestProxy.doPost(url,params,getRecEncoding());
}
//商家取消订单(非美团配送)
public static String mdOrderCancel(Map params) throws Exception{
String url = Commons.MEIDA_URL+"/order/cancel";
params=commonOrderArgs(params);
return HttpRequestProxy.doPost(url,params,getRecEncoding());
}
//商家配送订单(非美团配送)
public static String mdOrderDelivering(Map params) throws Exception{
String url = Commons.MEIDA_URL+"/order/delivering";
params=commonOrderArgs(params);
return HttpRequestProxy.doPost(url,params,getRecEncoding());
}
//商家取消订单(美团配送)
public static String mdLogisticsOrderCancel(Map params) throws Exception{
String url = Commons.MEIDA_URL+"order/cancelDispatch";
params=commonOrderArgs(params);
return HttpRequestProxy.doPost(url,params,getRecEncoding());
}
//商家配送订单(美团配送)
public static String mdLogisticsOrderDelivering(Map params) throws Exception{
String url = Commons.MEIDA_URL+"/order/dispatchShip";
params=commonOrderArgs(params);
return HttpRequestProxy.doPost(url,params,getRecEncoding());
}
//订单已送达
public static String mdOrderArrived(Map params) throws Exception{
String url = Commons.MEIDA_URL+"/order/delivered";
params=commonOrderArgs(params);
return HttpRequestProxy.doPost(url,params,getRecEncoding());
}
//订单同意退款请求
public static String mdOrderRefundAgree(Map params) throws Exception{
String url = Commons.MEIDA_URL+"/order/agreeRefund";
params=commonOrderArgs(params);
return HttpRequestProxy.doPost(url,params,getRecEncoding());
}
//订单驳回退款请求
public static String mdOrderRefundReject(Map params) throws Exception{
String url = Commons.MEIDA_URL+"/order/rejectRefund";
params=commonOrderArgs(params);
return HttpRequestProxy.doPost(url,params,getRecEncoding());
}
//查询订单id查询订单
public static String mdOrderByIdFromMd(Map params) throws Exception{
String url = Commons.MEIDA_URL+"/order/queryById";
params=commonOrderArgs(params);
return HttpRequestProxy.doGet(url,params,getRecEncoding());
}
//查询订单流水号查询订单
public static String mdOrderByDaySeqFromMd(Map params) throws Exception{
String url = Commons.MEIDA_URL+"/order/queryByDaySeq";
params=commonOrderArgs(params);
return HttpRequestProxy.doGet(url,params,getRecEncoding());
}
//心跳上报
public static String mdHeartJump(Map params) throws Exception{
String url = "http://heartbeat.meituan.com/pos/heartbeat";
params=commonOrderArgs(params);
return HttpRequestProxy.doPost(url,params,getRecEncoding());
}
public static String getRecEncoding() {
return recEncoding;
}
public static void setRecEncoding(String recEncoding) {
MeidaUrlUtil.recEncoding = recEncoding;
}
private static Map commonOrderArgs(Map params){
Long currentTimeMillis = MeidaUrlUtil.getCurrentTimeMillis()/1000;
params.put("charset","utf-8");
params.put("timestamp", currentTimeMillis.intValue());
String signature = orderEncrypt(params);
params.put("sign", signature);
return params;
}
private static String orderEncrypt(Map map){
String signature = "";
try {
String result="";
String meituanSort = meiTuanSort(map);
String signkey=Commons.MEIDA_SIGNKEY;
result=signkey+meituanSort;
signature = Sha1Util.getSha1(result);
} catch (Exception e) {
logger.error("获取美大token异常", e);
}
return signature;
}
public static long getCurrentTimeMillis(){
return System.currentTimeMillis();
}
private static String meiTuanSort(Map mapv){
//将appid,timestamp,还有参数这三个进行字母排序
Map map = mapv;
Collection keySet = map.keySet();
List list = new ArrayList(keySet);
Collections.sort(list);
String result = "";
for(int i = 0;i
result+=list.get(i)+map.get(list.get(i));
}
return result;
}
}
不太华丽的分隔线-----------------------------------------------------
上图中MEIDA_SIGNKEY和MEIDA_DEVELOPERID为美团分配,MEIDA_URL为美团服务器地址。
MEIDA_STORE为美团绑定门店ui地址。
MEIDA_PUSH_TMIE为本地推送给设备如果设备没有收到,多久后推送第二次的时间间隔。
上面的方法包括了美团外卖常用的请求地址,及加密签名方法,可以直接复制,也可以下载SDK,因本人是在SDK未出来之间写的,所以应该没有SDK规范。但是加密正确无误。