饿了么开放平台接入(2)——使用Java对接店铺
概述
上回讲到在饿了么开放平台注册了账户,并申请资质认证,然后还创建了应用,对开放平台、资质认证、应用不了解的同学还是先去看下上一篇文章吧。
时间拍马而过,10几天过去了,上次申请的资质认证早已通过(如下图),此时可以好好打通下沙箱(测试)环境了,并说下这些乱七八糟的概念到底啥意思,实际上就是很简单的一件事么。
下载SDK
首先要明确,完全没有必要自己封装接口,封装什么报文,封装什么HTTP、HTTPS请求,饿了么提供的SDK都封装好了。除非大哥牛到一个人干到饿了么一大片团队,所以没有必要自己搞起。
高级语言的终极要义就是拿来主义,站在巨人的肩膀上才能凸显王霸之气。
下载SDK非常简单,不过可能有的同学真的不知道该如何下载,没关系我在这里详细描述下。
1、首先从【饿了么开放平台】-【文档中心】-【开发文档】-【sdk使用说明】中点击【Java SDK访问地址】,如果是其他语言的话点击对应链接即可。
2、点击之后跳转到一个叫做Coding的代码托管网站,这个网站有一段介绍如图,可见我们需要一个eleme-openapi-sdk的jar包,这个jar包封装了饿了么API接口。
3,没玩过Maven的同学可能就怒了,什么鬼,怎么下载。其实很简单,从这个地址:饿了么SDK下载
点击如图按钮下载即可,如果想了解下maven的可以百度下,我建议暂时不用了解了,先把主要任务做好。
4,下载完毕后就OK了,就是这个文件啦:
新建Java Web工程
1、为啥要新建web工程,直接建个控制台程序不成吗?不成,这里主要牵扯到饿了么平台通过回调开发者程序以返回一些信息,既然是回调,就是开放平台调咱们写的程序,咱们得提供一个地址让他调,所以得建个Web工程。
2、新建Web工程这个具体过程不讲了,这里用Eclipse建一个名为ElemeWebDemo的Dynamic Web Project。
3、新建一个org.panda.eleme.api用于放置饿了么相关代码,并将之前下载的jar包放到web-inf/lib下,这样就可以在工程中使用这个jar包了。
新建常量类,保存饿了么沙箱环境参数
现在我们有一个应用,知道应用的Key和Secret,我们通过这两个参数跟饿了么确认我们开发者的身份(相当于饿了么开放平台给开发者的用户名和密码)。
然后,作为一个应用,最后肯定要对接店铺,饿了么会给每个店铺,这里不管是测试店铺还是正式上线的店铺,分配店铺编号等参数,开发者也需要知道对接店铺的参数才行。
所以此时我们需要建立一个常量类,保存这些参数。
1、第一步就是新建一个常量类,如下图,需要注意参数不能为空哦,真实的参数值要按对应关系从下图中找出后填写到常量类中,此处为了隐私我写的是空的和-1而已。
package org.panda.eleme.api;
/**
* 饿了么-常量类
* @author easypanda
* @since 2018-03-23
*/
public class ElemeConstants {
//标志是否为沙箱环境
public final static boolean IS_SANDBOX=true;
//沙箱环境参数
public final static String SANDBOX_APP_KEY="";//对应Key 表示沙箱环境的应用Key
public final static String SANDBOX_APP_SECRET="";//对应Secret 表示沙箱环境的应用Secret
public final static long SANDBOX_STORE_ID=-1;//对应沙箱环境店铺ID
public final static String SANDBOX_STORE_URL="";//对应沙箱环境店铺URL
public final static String SANDBOX_STORE_PASS="";//对应沙箱环境店铺密码
public final static String SANDBOX_REDIRECT_URL="";//对应沙箱环境回调地址URL
//正式环境参数 暂时么有
}
2、OK那么上面这些沙箱环境参数从哪里来的呢,其实就是【饿了么开放平台】-【管理中心】-【沙箱环境】里面的,如图:
3、这里需要注意授权回调地址暂时先不用管。
店铺授权URL
好了,此时我们已经掌握了沙箱环境的应用参数、沙箱环境的店铺参数。在实际过程中,我们可能只是开发者,自己并没有店铺,只是测试环境下一起给我们提供了而已。
而不管是测试还是正式环境,店铺都需要给应用授权后,应用才能凭借授权码访问该店铺的数据。现在说下具体的授权过程。
1、首先封装一个ElemeUtil工具类,保存一些对接饿了么常用方法。
第一个方法就是获取Config,这个Config封装了应用信息,我们在跟饿了么交互时通过这个Config类的对象告知我们的应用信息。
好比之前我们要抛一个请求到http://饿了么.开放平台?测试=是&ID=1&SECRET=2&具体业务=123
,现在我们不用这么麻烦了,把参数传到Config里调用api就好了,简而言之:把参数放到该放的位置然后调用方法就行了。
2、封装获取Config的方法如下,可见饿了么只需要知道是否测试环境、Key、Secret三个参数就行了。
/**
* 饿了么-工具类
* @author easypanda
* @since 2018-03-22
*/
public class ElemeUtil {
/**
* 获取配置类
* @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;
}
3、获取授权URL。
店铺要给开发者授权,是通过一个地址,店铺登录这个地址,输入店铺的用户名和密码点“确定授权”就OK了。开发者如果自己有店铺,就可以自己打开URL自行授权;开发者如果是对接别人的店铺,就把这个授权URL发给店铺管理者,让他们登录后输入用户名和密码授权。
说了半天,要通过程序生成这个URL,SDK已经封装了,我们再简单封装如下:
public class ElemeUtil {
//前文已经写过的方法此处不再列出
/**
* 获取店铺授权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;
}
/**
* 获取并输出授权URL到控制台
* @param args
*/
public static void main(String[] args){
Config config=getConfig(true);
String url=getAuthUrl(config);
System.out.println(url);
}
}
这里面有一个方法不好理解,就是OAuthClient.getAuthUrl(String redirect_uri, String scope, String state)
。
这里要仔细解释下,scope为all表示商户授权所有权限。state为1234就是一个验证标志,主要是怕别人欺骗店铺用了假的授权URL,当然此处想不明白的话state随便写一个完全不必理会也行。
最重要的就是redirect_uri,也就是授权回调地址。我们在调用OAuthClient.getAuthUrl
这个饿了么封装的方法时,将redirect_uri作为参数告诉了饿了么开放平台,然后饿了么返回给我们一个授权URL,这个URL给店铺后店铺通过用户名密码授权,授权后会产生一个授权码code,这个code才是我们应用能掌握店铺的钥匙。而这个认证码并不是店铺点了之后就看到的,而是会发送到回调地址上。
OK,现在应该是比较清晰了,回调地址应该是我们开发者自己的一个服务地址,比如是我们的一个Servlet的地址,用于接收饿了么开放平台推送的授权码code。然后我们要生成一个授权URL,这个URL用于发送给店铺给我们的应用授予操作店铺数据的权限。
编写Servlet,用于接收回调的授权码
1、新建一个servlet如下:
package org.panda.eleme.api;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* 饿了么-Servlet
* @author easypanda
* @since 2018-03-23
*/
@WebServlet("/ElemeServlet")
public class ElemeServlet extends HttpServlet{
/**
* 饿了么授权回调在此处响应,主要是获取授权码code
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=UTF-8");
response.getWriter().write("<br>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("<br>code:"+code);
response.getWriter().write("<br>state:"+state);
}
response.getWriter().flush();
response.getWriter().close();
}
}
2、分析下这个Servlet的访问地址
如果是在本地Tomcat部署则,则访问地址应该为: http://localhost:8080/ElemeWebDemo/ElemeServlet
如果将Tomcat部署到IP为xxx.xxx.xxx.xxx的服务器上,且端口改为80(80为默认端口,可以省略),则访问地址为 http://xxx.xxx.xxx.xxx/ElemeWebDemo/ElemeServlet
OK,如果服务器具有域名www.xxx.com,且端口改为80(80为默认端口,可以省略),则访问地址为: http://www.xxx.com/ElemeWebDemo/ElemeServlet
此处笔者的项目是有域名的,为了隐私起见,用www.xxx.com代替。
3、因为method为auth_back时,才输出code和state(主要使用code,state为调用getAuthUrl方法时开发者指定的随机字符串),所以我们配置到ElemeConstants类里的地址应该如下:
http://www.xxx.com/ElemeWebDemo/ElemeServlet?method=auth_back;//此处www.xxx.com改为部署到服务器的真实可访问地址
4、同时在【开放平台】-【管理中心】-【沙箱环境】的回调地址URL里面,也配上地址:http://www.xxx.com/ElemeWebDemo/ElemeServlet?method=auth_back;//此处www.xxx.com改为部署到服务器的真实可访问地址
店铺授权
1、运行ElemeUtil 的main方法,在控制台拿到了咱们的授权 URL:
2、正常情况下,将该URL发给真实店铺的管理人员,让其登录授权,此时我们沙箱环境下自己就有一个测试店铺。
所以自己从浏览器输入该链接,打开对应网址,如下,将【管理中心】-【沙箱环境】中的【测试店铺账号】和【测试店铺密码输入】后,点击登录,在点击【同意授权】。
3、点击【同意授权】
4、点击后,饿了么会将该店铺的授权码(code)发送到回调URL,也就是之前咱们编写的ElemeServlet。
ElemeServlet会显示饿了么开放平台发送过来的code。如下图:
下一步工作
OK,至此我们拿到了店铺的授权码,这样我们就可以通过饿了么封装的SDK对饿了么进行操作了。
稍微总结下:
Config里面包含了开发者应用的信息,授权码code包含了店铺授权的信息,将这两个参数和请求内容抛送给饿了么平台,饿了么就知道是哪个开发者请求哪个店铺的哪方面数据,而且有code的就表示店铺同意该开发者使用店铺数据。
妥妥的,没毛病。
下一步,咱就有权限了,去操作数据去。