欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-03-26 11:37:46
...

概述

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

时间拍马而过,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的就表示店铺同意该开发者使用店铺数据。

妥妥的,没毛病。

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