饿了么开放平台接入(2)——使用Java对接店铺

2019-06-15 00:00:00 接入 对接 饿了

概述

上回讲到在饿了么开放平台注册了账户,并申请资质认证,然后还创建了应用,对开放平台、资质认证、应用不了解的同学还是先去看下上一篇文章吧。

时间拍马而过,10几天过去了,上次申请的资质认证早已通过(如下图),此时可以好好打通下沙箱(测试)环境了,并说下这些乱七八糟的概念到底啥意思,实际上就是很简单的一件事么。

《饿了么开放平台接入(2)——使用Java对接店铺》

下载SDK

首先要明确,完全没有必要自己封装接口,封装什么报文,封装什么HTTP、HTTPS请求,饿了么提供的SDK都封装好了。除非大哥牛到一个人干到饿了么一大片团队,所以没有必要自己搞起。

高级语言的终极要义就是拿来主义,站在巨人的肩膀上才能凸显王霸之气。

下载SDK非常简单,不过可能有的同学真的不知道该如何下载,没关系我在这里详细描述下。

1、首先从【饿了么开放平台】-【文档中心】-【开发文档】-【sdk使用说明】中点击【Java SDK访问地址】,如果是其他语言的话点击对应链接即可。
《饿了么开放平台接入(2)——使用Java对接店铺》

2、点击之后跳转到一个叫做Coding的代码托管网站,这个网站有一段介绍如图,可见我们需要一个eleme-openapi-sdk的jar包,这个jar包封装了饿了么API接口。
《饿了么开放平台接入(2)——使用Java对接店铺》

3,没玩过Maven的同学可能就怒了,什么鬼,怎么下载。其实很简单,从这个地址:饿了么SDK下载
点击如图按钮下载即可,如果想了解下maven的可以百度下,我建议暂时不用了解了,先把主要任务做好。
《饿了么开放平台接入(2)——使用Java对接店铺》

4,下载完毕后就OK了,就是这个文件啦:
《饿了么开放平台接入(2)——使用Java对接店铺》

新建Java Web工程

1、为啥要新建web工程,直接建个控制台程序不成吗?不成,这里主要牵扯到饿了么平台通过回调开发者程序以返回一些信息,既然是回调,就是开放平台调咱们写的程序,咱们得提供一个地址让他调,所以得建个Web工程。

2、新建Web工程这个具体过程不讲了,这里用Eclipse建一个名为ElemeWebDemo的Dynamic Web Project。
《饿了么开放平台接入(2)——使用Java对接店铺》

3、新建一个org.panda.eleme.api用于放置饿了么相关代码,并将之前下载的jar包放到web-inf/lib下,这样就可以在工程中使用这个jar包了。

《饿了么开放平台接入(2)——使用Java对接店铺》

新建常量类,保存饿了么沙箱环境参数

现在我们有一个应用,知道应用的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那么上面这些沙箱环境参数从哪里来的呢,其实就是【饿了么开放平台】-【管理中心】-【沙箱环境】里面的,如图:
《饿了么开放平台接入(2)——使用Java对接店铺》

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)——使用Java对接店铺》

2、正常情况下,将该URL发给真实店铺的管理人员,让其登录授权,此时我们沙箱环境下自己就有一个测试店铺。

所以自己从浏览器输入该链接,打开对应网址,如下,将【管理中心】-【沙箱环境】中的【测试店铺账号】和【测试店铺密码输入】后,点击登录,在点击【同意授权】。
《饿了么开放平台接入(2)——使用Java对接店铺》

3、点击【同意授权】
《饿了么开放平台接入(2)——使用Java对接店铺》

4、点击后,饿了么会将该店铺的授权码(code)发送到回调URL,也就是之前咱们编写的ElemeServlet。
ElemeServlet会显示饿了么开放平台发送过来的code。如下图:
《饿了么开放平台接入(2)——使用Java对接店铺》

下一步工作

OK,至此我们拿到了店铺的授权码,这样我们就可以通过饿了么封装的SDK对饿了么进行操作了。

稍微总结下:

Config里面包含了开发者应用的信息,授权码code包含了店铺授权的信息,将这两个参数和请求内容抛送给饿了么平台,饿了么就知道是哪个开发者请求哪个店铺的哪方面数据,而且有code的就表示店铺同意该开发者使用店铺数据。

妥妥的,没毛病。

下一步,咱就有权限了,去操作数据去。

相关文章