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

对接饿了么开放平台(Java)

程序员文章站 2022-03-05 15:09:15
...

背景

最近在做一个项目,我负责对接饿了么开放平台,这也是第一次尝试接入开放平台,走了许多弯路,最后还是成功接入了.

这里借鉴了几篇博客,感谢大佬的指路.

关于注册和申请

https://blog.csdn.net/woshisangsang/article/details/79494316

对接店铺

https://blog.csdn.net/woshisangsang/article/details/79666260

 

注册:

注册申请地址:饿了么开放平台   https://open.shop.ele.me/openapi

点击右上角注册,注册过程非常简单,常规操作.

开发资质认证

点击【个人中心】-【申请认证】就可以开始申请了

我们是做为第三方Erp厂商接入的, 申请过程中需要提供  [营业执照] 截图,这个没有的话接下来的步骤就无从谈起了.

信息提交完成后就可以开始创建应用了.

 

创建应用

点击【管理中心】-【新建应用】就可以创建应用了

应用类型分为

平台应用: 是面向大客户的(要求服务1万家以上商户),这个估计有点难,反正我们公司暂时达不到。

企业应用: 就是面向普通公司的,我们就选这个。

线下服务: 无需代码开发,这个跟我们程序员关系不大,果断抛弃。

 

作为第三方接入的话一般选择企业应用

 

测试环境

在创建应用之后就会得到一些开发的必要信息

对接饿了么开放平台(Java)

这里会给你一个测试店铺的id和密码,是可以通过测试店铺 URL登录的,在店铺里面可以操作测试铺的数据,后期测试菜品和订单之类的接口会用到.

回调地址后面会讲

其他的参数在后面都会用到,到时再具体讲.

 

接下来就时测试  demo 了,这一块饿了么做的挺好的,基本上要用的都已经封装好了,简单的不要不要的.

饿了么把发送请求什么的都已经封装好了,最开始还比较疑惑呢,我是怎么在本地直接通过代码操作了店铺上的菜品数据,后来才发现饿了吗的sdk把什么都做好了.

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

2.这里的sdk可以直接通过maven导入(我的demo是通过spring框架写的)

对接饿了么开放平台(Java)

 

可能有些同学没有过maven这个东西,习惯了直接导入 jar 包,这个也是可以的

对接饿了么开放平台(Java)

下载下来导入项目就好了

 

新建  springboot 项目

 

不管你建立的JavaWeb项目还是其他的,反正能抛出接口就行了

 

 

需要建立一些配置类

说明: 我们调用饿了么API的那些接口都必须传入两个参数,这两个参数的构建就需要用到沙箱环境的那些参数了

第一个参数 : Config 对象,Config对象在sdk中时已经封装好了的,我们只需要传入 [沙箱环境] 的参数就可以得到.作用就是对应你的地店铺信息

第二个参数:token(类似授权码) 就是商家给你的授权证明

常量类:把数据保存下来,方便调用

 

 
package org.panda.eleme.api.elm.util;

/**
 * 饿了么-常量类
 * @author cyg
 * @date 18-3-24 下午6:21
 **/
public class ElemeConstants {

    //标志是否为沙箱环境
    public final static boolean IS_SANDBOX=true;
    //沙箱环境参数
    //对应Key 表示沙箱环境的应用Key
    public final static String SANDBOX_APP_KEY="";
    //对应Secret 表示沙箱环境的应用Secret
    public final static String SANDBOX_APP_SECRET="";
    //对应沙箱环境回调地址URL
    public final static String SANDBOX_REDIRECT_URL="";
    //对应沙箱环境店铺ID
    public final static long SANDBOX_STORE_ID=0;
    //对应沙箱环境店铺URL
    public final static String SANDBOX_STORE_URL="";
    //对应沙箱环境店铺密码
    public final static String SANDBOX_STORE_PASS="";

    //正式环境参数 暂时么有

}

工具类: 里面有两个方法,  1.得到配置类的方法 2.得到授权url地址(给商家用的)

package org.panda.eleme.api.elm.util;

import eleme.openapi.sdk.config.Config;
import eleme.openapi.sdk.oauth.OAuthClient;

/**
 * 饿了么-工具类
 * @author cyg
 * @date 18-3-24 下午6:25
 **/
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;
    }

}

 

如果是javaweb的话可以新建一个主函数调用上面的方法,自己写一下主函数封装

 

eleme.openapi.sdk.config.Config config1 = ElmUtil.getConfig(true);
String url= ElmUtil.getAuthUrl(config1);
System.out.println(url);

然后就可以在控制台看到一个url地址

对接饿了么开放平台(Java)

这个地址就是商家登录授权的地址,商家在点击之后就会到达,你输入沙箱环境的店铺帐号和密码进行登录

 

对接饿了么开放平台(Java)

 

登录之后就到达了授权页面(copy)

对接饿了么开放平台(Java)

 

 

点击同意授权后,平台就会发送一个code(授权吗),发送到哪呢,发送到的地址就是你需要在沙箱环境和上面的配置类填的回调地址

这个回调地址是什么? 简单来说可以是个servlet 或者是个接口,必须是个可以访问的地址,否则填写到沙箱环境会失败.

 

package org.panda.eleme.api.elm.controller;

import eleme.openapi.sdk.api.exception.ServiceException;
import lombok.extern.slf4j.Slf4j;
import org.panda.eleme.api.elm.service.ElmOrderService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * @author cyg
 * @date 18-3-24 下午6:49
 **/
@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("<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();
        return "test";

    }
    
}

在本地tomcat可以先测试一下能否访问:

http://localhost:8081/test/elm?method=auth_back 其中端口号也可能是其他的,我这是8081

如果是可以访问的就可以部署到服务器了,或者是其他方法,反正你得让这个地址在任何网络都能访问,否则是不能接收到饿了吗的授权信息的.

部署到服务器后,就可以把localhost改为你的服务器ip地址或者域名,端口号也对应修改

http://服务器ip:服务器对应端口/test/elm?method=auth_back

修改过后就可以填到沙箱环境和代码的常量类了

然后点击上图的同意授权,这时就会跳到你的回调地址

对接饿了么开放平台(Java)

就此就得到了code参数,这就是商家给你的授权码,这个需要记录下来.

这个code怎么用呢,我们上面说到 我们调用饿了么API的那些接口都必须传入两个参数

第二个参数 token 就是根据这个code得到的

code 是能得到第一个token的,token不是一个值,而是一个对象,具体结构如下

Token{accessToken='06f18e076b6d5d40ef03e2b368665089', tokenType='Bearer', expires=86400, refreshToken='4fd0c0748e8fc1b262c33325e2b48967'}

其中accessToken和tokenType不用管,

expires: 是有效时长 86400秒,也就是24小时,在正式环境是一个月.

refreshToken: 这个一定要记住,因为第一个token过期后,后面的token时根据这个来得到下一次的token.

怎么通过code得到第一次token呢

 

token = client.getTokenByCode
        (authCode,ElemeConstants.SANDBOX_REDIRECT_URL);

这里面的参数

authCode就是我们得到的code

第二个就是设置好的回调地址.

根据得到的token来得到下一次的token

 

token = client.getTokenByRefreshToken("4fd0c0748e8fc1b262c33325e2b48967");

这里面的参数就是上一次token的refreshToken

自己可以把得到token的方法封装为一个工具类,后面会常用

 

测试: 如果你成功到这一步了,那我相信你还是有些体会了,接下来的接入就很简单了.

假如我要测试查询菜品这个接口

ProductService productService = new ProductService(config, token);

productService.getItem(27980000010L);

这是api中提供的代码

你只需要将Config的对象实例化,将config和token传入,就可以得到productService对象,利用这个对象就可以直接使用平台提供的方法.

真的很简单.

 

其他的接口都差不多同样的测试方法,测试添加菜品的时候可能有坑,参数好好检查一下,我尝试了好久才弄起.

测试订单类的接口,需要注册一个饿了么的用户帐号,在自己的测试店铺下单

就可以得到订单的信息

在沙箱环境的测试店铺URL输入自己的用户(下单的)帐号密码(不是商家帐号密码)

下单的时候如果电脑端不能选择地址的话可以把地址发送到手机,手机可以解决.

建议手机下单(如果菜品价格体太低,可能被系统检查出刷单的行为,就下不了单了,测试店铺也一样).1元以上就好

 

 

就讲到这了,还得去测试剩下的接口,如果有什么疑问可以留言.