前言:
好久没写过笔记了,感觉上次写笔记已经是上个世纪(嘿嘿~);最近工作中要对接饿了么的平台,从饿了么平台抓取数据,然后放在自己的系统上,这种对接大家都应该做过,而且看上去也没什么难度(但是我做了一个星期,太菜了!),只要按着饿了么的文档来就好了(接口方面);这篇笔记主要分享了自己踩过的一些坑,来避免大家和我一样踩相同的坑
对接饿了么接口(或者说大部分接口),我们要做的东西有三点:
Token:就是访问饿了么的令牌,没这个东西,我们没法访问饿了么的接口,也就是通行证一般的东西;
消息推送和接收:在对接的时候这个很重要,饿了么任何关于订单状态的变更或者配送状态的变更都会通过消息的形式传到和你对接的系统那
接口:不用说了,没接口怎么访问饿了么的开放平台呢?~
下面就这三点进行细说,至于解决方案我觉的官方的文档已经非常详细了,大家如果要做这方面的对接的话完全可以看着文档来;
1.Token
饿了么获取Token非常方便,我们只要引入他相应的sdk(自行去开放平台下载);就可以获取Token。不用繁琐的发送http访问之类的下面;下面给大家提供一些代码,大家可以参考
public class ElmConstants {
//标志是否为沙箱环境
public final static boolean IS_SANDBOX=true;
//沙箱环境参数
//对应Key 表示沙箱环境的应用Key
public final static String SANDBOX_APP_KEY="your key";
//对应Secret 表示沙箱环境的应用Secret
public final static String SANDBOX_APP_SECRET="your secret";
//对应沙箱环境回调地址URL
public final static String SANDBOX_REDIRECT_URL="your redirect url";
//对应沙箱环境店铺ID
public final static long SANDBOX_STORE_ID=you shopId;
//对应沙箱环境店铺URL
public final static String SANDBOX_STORE_URL="";
//对应沙箱环境店铺密码
public final static String SANDBOX_STORE_PASS="";
//正式环境参数 暂时么有
}
这段代码的含义呢,都已经很明显了,就是一些常量,里面填充我们申请到沙箱环境的一些数据就好了,比如key secret
package org.panda.eleme.api.elm.util;
import eleme.openapi.sdk.config.Config;
import eleme.openapi.sdk.oauth.OAuthClient;
/**
* 饿了么-工具类
*
*
**/
public class ElmUtil {
/**
* 获取配置类
* @param isSandbox 是否沙箱
* @return
*/
public static Config getConfig(boolean isSandbox) {
Config config = null;
if (isSandbox == true) {
config = new Config(isSandbox, ElemeConstants.SANDBOX_APP_KEY, ElemeConstants.SANDBOX_APP_SECRET);
} else {
// TODO 填充正式环境数据
}
return config;
}
/**
* 获取店铺授权URL地址
* @desc 每次调用会产生一个新的授权码 需要记录code作为后续凭证
*/
public static String getAuthUrl(Config config){
OAuthClient client = new OAuthClient(config);
String authUrl = client.getAuthUrl(ElemeConstants.SANDBOX_REDIRECT_URL, "all", "1234");
return authUrl;
}
}
工具类: 里面有两个方法, 1.得到配置类的方法 2.得到授权url地址(给商家用的)
如何使用呢?这里我直接main方法使用了,如果web的话可以自己初始化;其实这里的授权还有另外一种方式,就是到饿了么开放平台里面直接点应用授权,也可以授权
public static void main(String[] args) {
Config config = ElmUtil.getConfig(true);
//获取店铺授权的URL
String url = ElmUtil.getAuthUrl(config);
System.out.println(url);
}
下面是回调地址,回调地址就是你授权成功后返回的页面,这里我们可以做一些广告呀~企业 应用的首页,或者直接一些数据的展示,这些都是可以的
@RestController
@RequestMapping("test")
@Slf4j
public class ElmOrderController {
/**
* 饿了么授权回调在此处响应,主要是获取授权码code
*/
@GetMapping("/elm")
public Object doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
log.info("[请求错误]");
response.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=UTF-8");
response.getWriter().write("
ElemeServlet.doGet..");
String method=request.getParameter("method");
//响应授权回调
if("auth_back".equals(method)){
String code=request.getParameter("code");
String state=request.getParameter("state");
response.getWriter().write("
code:"+code);
response.getWriter().write("
state:"+state);
}
response.getWriter().flush();
response.getWriter().close();
return "test";
}
}
通过回调地址拿到Code以后就可以获取Token了,下面是获取Token的方法,我建议可以写在上面的ElmUtil里面,自己封装一个方法,因为后面访问接口都要用到Token
token = client.getTokenByCode
(authCode,ElemeConstants.SANDBOX_REDIRECT_URL);
Token授权下来以后呢,就可以拿着Token到处玩了,那么Token里面包含什么呢
image.png
accessToken:一串字符串,用这个来通行的;
tokenType:见名思意
expires:过期时间(沙箱环境第一次授权为一天,刷新后15天,正式环境第一次30天,刷新后35天)
refreshToken:这个很重要,这个是拿来刷新我们的token的,这样就不用每次去授权了~
刷新Token
token = client.getTokenByRefreshToken("4fd0c0748e8fc1b262c33325e2b48967");
关于Token的一些建议
Token建议放在全局变量里面,毕竟要经常用到,我在项目中存储的话是放在Redis缓存里面,拿出来用也很方便
关于Token的刷新,建议做一个定时任务去刷新Token,最好是每半个月刷新一次(毕竟次数还是挺多的,哈哈哈),刷新完以后更新Redis的时间,同时把新的Token放进Redis里面,这样就OK就不用每次都要自己去授权了;!! 注意,一定要去刷,不然Token过期了,只能重新授权了
2.消息推送
消息推送我踩了好几天的坑,都坑在那个全双工推送里面,重要的是平台还推荐用那个(后面会逐渐取消http的模式;官方原话),后面查了一下原来是基于WebSoket的长连接方式,看起来非常好用,但实际上效果不太好(不知道是不是我一个人的原因),消息会延迟,或者有时候饿了么那边根本检测不到我们这边已经开启了服务,这非常坑。后面改用了Http接收消息的形式,感觉进入到了新世界,消息接收快,就算没接收到也会重发,效率很高。因此,现阶段来说,还是比较推荐用Http接收消息。当然!有哪位大佬用了全双工模式一直跑起来没问题的话,希望可以交流一下~
消息推送如果用http模式的话,要3S内马上响应,不然会有可能会造成漏单的情况或者消息接收过慢,因此消息来的话,我建议开一个线程去跑业务,这样能大概率减少漏单的的情况
3.关于接口方面
接口方面的话其实看文档就能解决大部分问题了,可能有坑的话就是关于配送这一块,自配送接口不是谁都能调用的,饿了么有自己的要求,因此在调用之前最好看一下文档,哪些是符合情况的,不然调了会报错;PS:
沙箱环境可以测试自配送,这个非常好~
沙箱环境不能测试连锁店,这个也能理解,毕竟已经分配了个店铺给你;这个以后上正式环境了有需求的话再做测试