对接饿了么开放平台(Java)
背景
最近在做一个项目,我负责对接饿了么开放平台,这也是第一次尝试接入开放平台,走了许多弯路,最后还是成功接入了.
这里借鉴了几篇博客,感谢大佬的指路.
关于注册和申请
https://blog.csdn.net/woshisangsang/article/details/79494316
对接店铺
https://blog.csdn.net/woshisangsang/article/details/79666260
注册:
注册申请地址:饿了么开放平台 https://open.shop.ele.me/openapi
点击右上角注册,注册过程非常简单,常规操作.
开发资质认证
点击【个人中心】-【申请认证】就可以开始申请了
我们是做为第三方Erp厂商接入的, 申请过程中需要提供 [营业执照] 截图,这个没有的话接下来的步骤就无从谈起了.
信息提交完成后就可以开始创建应用了.
创建应用
点击【管理中心】-【新建应用】就可以创建应用了
应用类型分为
平台应用: 是面向大客户的(要求服务1万家以上商户),这个估计有点难,反正我们公司暂时达不到。
企业应用: 就是面向普通公司的,我们就选这个。
线下服务: 无需代码开发,这个跟我们程序员关系不大,果断抛弃。
作为第三方接入的话一般选择企业应用
测试环境
在创建应用之后就会得到一些开发的必要信息
这里会给你一个测试店铺的id和密码,是可以通过测试店铺 URL登录的,在店铺里面可以操作测试铺的数据,后期测试菜品和订单之类的接口会用到.
回调地址后面会讲
其他的参数在后面都会用到,到时再具体讲.
接下来就时测试 demo 了,这一块饿了么做的挺好的,基本上要用的都已经封装好了,简单的不要不要的.
饿了么把发送请求什么的都已经封装好了,最开始还比较疑惑呢,我是怎么在本地直接通过代码操作了店铺上的菜品数据,后来才发现饿了吗的sdk把什么都做好了.
1、首先从【饿了么开放平台】-【文档中心】-【开发文档】-【sdk使用说明】中点击【Java SDK访问地址】,如果是其他语言的话点击对应链接即可。
2.这里的sdk可以直接通过maven导入(我的demo是通过spring框架写的)
可能有些同学没有过maven这个东西,习惯了直接导入 jar 包,这个也是可以的
下载下来导入项目就好了
新建 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地址
这个地址就是商家登录授权的地址,商家在点击之后就会到达,你输入沙箱环境的店铺帐号和密码进行登录
登录之后就到达了授权页面(copy)
点击同意授权后,平台就会发送一个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
修改过后就可以填到沙箱环境和代码的常量类了
然后点击上图的同意授权,这时就会跳到你的回调地址
就此就得到了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元以上就好
就讲到这了,还得去测试剩下的接口,如果有什么疑问可以留言.
上一篇: 物理返回键事件处理