1. https://open.bot.tmall.com/   首先了解天猫精灵智能设备的对接文档

2.创建技能什么的都不用讲了,这里主要讲一下服务配置

3.服务配置好以后,我们开始搭建OAuth2授权服务器,这里我选用JAVA,本身自己就是做安卓的,JAVA会比较容易上手

直接贴代码

package com.hjzn.oauth.controller;import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.HttpURLConnection;
import java.net.URI;
import java.net.URL;
import java.net.URLConnection;
import java.nio.charset.Charset;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.Enumeration;
import java.util.List;
import java.util.UUID;import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.tools.JavaCompiler;import org.apache.oltu.oauth2.as.issuer.MD5Generator;
import org.apache.oltu.oauth2.as.issuer.OAuthIssuer;
import org.apache.oltu.oauth2.as.issuer.OAuthIssuerImpl;
import org.apache.oltu.oauth2.as.request.OAuthAuthzRequest;
import org.apache.oltu.oauth2.as.request.OAuthRequest;
import org.apache.oltu.oauth2.as.request.OAuthTokenRequest;
import org.apache.oltu.oauth2.as.response.OAuthASResponse;
import org.apache.oltu.oauth2.common.OAuth;
import org.apache.oltu.oauth2.common.exception.OAuthProblemException;
import org.apache.oltu.oauth2.common.exception.OAuthSystemException;
import org.apache.oltu.oauth2.common.message.OAuthResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.http.HttpStatus;import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.google.gson.Gson;
import com.hjzn.oauth.entity.HotelRoom;
import com.hjzn.oauth.entity.Room;
import com.hjzn.oauth.entity.User;
import com.hjzn.oauth.service.RoomService;
import com.hjzn.oauth.service.UserService;
import com.hjzn.oauth.utils.JnaNative;
import com.hjzn.oauth.utils.JnaUtils;
import com.sun.jna.Native;@Controller
public class OAuthController {@Autowiredprivate UserService userService;       //登录授权数据层@Autowiredprivate RoomService roomService;private String baseURL = "https://www.xxxxx.com";    //OAuth2授权服务器发布的地址//private String baseURL = "https://4598907a.ngrok.io";private String cutURL = baseURL+"/HjznOAuth2/";     //天猫精灵请求授权接口private String OAuthURL = baseURL+"/HjznOAuth2/responseCode";   //登录成功后将code通过天猫回调地址返回给天猫private int cutlength = cutURL.length();  //截去参数的时候需要private String userName; //登录帐号/*** 用户登录授权界面* @param request* @param response* @return* @throws IOException* @throws OAuthSystemException*/@RequestMapping("/userLogin")public String userlogin(HttpServletRequest request) throws IOException, OAuthSystemException{String url = request.getHeader("referer");//获取到登录帐号String username = request.getParameter("username");//获取登录密码String password = request.getParameter("password");//登录验证User user= userService.userLogin(username, password);if(user!= null){userName = user.getUsername();log("登录成功!");String outURL = java.net.URLDecoder.decode(url, "GBK");log("decode后的地址:"+outURL);int outlength = outURL.length();   //解密后的请求参数长度String responseURL = outURL.substring(cutlength, outlength);log("截取出请求的参数:"+responseURL);String responseCodeUrl = OAuthURL + responseURL;log("拼接responseCodeUrl接口:"+responseCodeUrl);/** 拼接完后应该这样子 https://www.xxxxx.com/HjznOAuth2/responseCode?redirect_uri=https://open.bot.tmall.com/oauth/callback?skillId=20690&token=NDExNjU2Nzg1M0FGRUhJTkZEVlE=&client_id=123&response_type=code&state=0.7387369400561126* */return "redirect:" + responseCodeUrl; //重定向后就会进入/responseCode }else{return "redirect:/error.jsp";}return "redirect:/error.jsp";}/***   登录成功将code返回给客户端* @param model* @param request* @return*/@RequestMapping("/responseCode")public String rspCode(HttpServletRequest request){log("进入responseCode");try {//构建OAuth授权请求OAuthAuthzRequest oauthRequest = new OAuthAuthzRequest(request);String token = oauthRequest.getParam("token");String state = oauthRequest.getParam("state");if (oauthRequest.getClientId()!=null&&oauthRequest.getClientId()!="") {//设置授权码String authorizationCode = UUID.randomUUID().toString().replace("-", "").substring(0, 18);log("生成code:"+authorizationCode);//利用oauth授权请求设置responseTypeOAuthASResponse.OAuthAuthorizationResponseBuilder builder=OAuthASResponse.authorizationResponse(request,HttpServletResponse.SC_FOUND);//设置授权码builder.setParam("token", token);System.out.println(state);builder.setParam("state", state);builder.setCode(authorizationCode);//得到客户端重定向的地址String redirectURI = oauthRequest.getParam(OAuth.OAUTH_REDIRECT_URI);log("客户端回调地址:"+redirectURI);//构建响应OAuthResponse response = builder.location(redirectURI).buildQueryMessage();String responseUri =response.getLocationUri();log("responseUri:"+responseUri);return "redirect:"+responseUri; }} catch (Exception e) {}return null;   }/*** 客户端使用code请求AccessToken* @param request* @return* @throws OAuthSystemException*/@RequestMapping(value = "/responseAccessToken",method = RequestMethod.POST)  public HttpEntity token(HttpServletRequest request) throws OAuthSystemException{log("进入responseAccessToken");OAuthIssuer oauthIssuerImpl=null;OAuthResponse response=null;//构建OAuth请求  try {OAuthTokenRequest oauthRequest = new OAuthTokenRequest(request);String authCode = oauthRequest.getParam(OAuth.OAUTH_CODE); String clientSecret = oauthRequest.getClientSecret();if(clientSecret!=null||clientSecret!=""){//生成Access TokenoauthIssuerImpl = new OAuthIssuerImpl(new MD5Generator());final String accessToken = oauthIssuerImpl.accessToken();final String refreshToken = oauthIssuerImpl.refreshToken();//生成OAuth响应response = OAuthASResponse.tokenResponse(HttpServletResponse.SC_OK).setAccessToken(accessToken).setRefreshToken(refreshToken).setParam("expires_in", "17600000") .buildJSONMessage();try {//这里可以将用户名和token绑定起来 ,在控制设备的时候,可以识别token对应的用户userService.updateToken(userName, accessToken);} catch (Exception e) {log(e.getMessage());}}log("response.getBody:"+response.getBody().toString());//根据OAuthResponse生成ResponseEntityreturn new ResponseEntity(response.getBody(), HttpStatus.valueOf(response.getResponseStatus()));} catch (OAuthSystemException e) {response = OAuthASResponse.tokenResponse(HttpServletResponse.SC_OK).setParam("error", "101").setParam("error_description", "内部错误").buildJSONMessage();log("错误"+response.getBody().toString());return new ResponseEntity(response.getBody(), HttpStatus.valueOf(response.getResponseStatus()));} catch (OAuthProblemException e) {response = OAuthASResponse.tokenResponse(HttpServletResponse.SC_OK).setParam("error", "102").setParam("error_description", "参数错误").buildJSONMessage();log("错误"+response.getBody().toString());log(OAuthURL);return new ResponseEntity(response.getBody(), HttpStatus.valueOf(response.getResponseStatus()));}}private void log(String msg){SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//设置日期格式System.out.println(df.format(new Date())+"\t"+msg);}  // 接收天猫精灵发送过来的命令,可以通过json中的namespace来区分命令类型,这里没有进行区分,只做了设备列表假数据的返回@RequestMapping(value ="/getMessage",method = RequestMethod.POST,produces = "application/json;charset=utf-8")@ResponseBodypublic List<String> getMessage(HttpServletRequest request, HttpServletResponse response,BufferedReader br){log("模拟智能设备进行返回");//Header部分JSONObject MerchineList = new JSONObject();JSONArray jSONArray = new JSONArray();JSONObject header = new JSONObject();JSONObject payload = new JSONObject();List<JSONObject> devices =  new ArrayList();List<JSON> properties = new ArrayList();List actions = new ArrayList();JSONObject extentions = new JSONObject();log(request.getHeaderNames());Enumeration<?> enum1 = request.getHeaderNames();while (enum1.hasMoreElements()) {String key = (String) enum1.nextElement();String value = request.getHeader(key);log(key + "\t" + value);}//body部分String inputLine;String str = "";try {while ((inputLine = br.readLine()) != null) {str += inputLine;}br.close();} catch (IOException e) {log("IOException: " + e);}log("请求参数:" + str);JSONObject recieveHeader = new JSONObject();recieveHeader = JSON.parseObject(str);String str1 = recieveHeader.getString("header");log("header:" + recieveHeader.getString("header"));JSONObject recieveMessageId = new JSONObject();recieveMessageId = JSON.parseObject(str1);header.put("namespace", "AliGenie.Iot.Device.Discovery");header.put("name", "DiscoveryDevicesResponse");header.put("messageId", recieveMessageId.getString("messageId"));header.put("payLoadVersion", 1);JSONObject device = new JSONObject();JSONObject propertie = new JSONObject();device.put("deviceId", "34ea34cf2e63");device.put("deviceName", "单孔插座");device.put("deviceType", "outlet");device.put("zone", "test");device.put("brand", "test");device.put("model", "test");device.put("icon", "https://ss0.bdstatic.com/94oJfD_bAAcT8t7mm9GUKT-xh_/timg?image&quality=100&size=b4000_4000&sec=1531878000&di=c989660f4b827a0049c3b7aec4fe38e1&src=http://img.czvv.com/sell/599adfe4d2f0b1b2f118606f/20170905113247194.jpg");propertie.put("name", "powerstate");propertie.put("value", "off");properties.add(propertie);device.put("properties", properties);actions.add("TurnOn");actions.add("TurnOff");device.put("actions", actions);extentions.put("extension1", "tset");extentions.put("extension2", "test");device.put("extentions", extentions);devices.add(device);payload.put("devices", devices);MerchineList.put("header", header);MerchineList.put("payload", payload);log(MerchineList.toString());List<String> json = new ArrayList<String>();json.add(MerchineList.toString());return json;}}

4.授权服务器搭建好后,进入下面第四步,点击测试验证中帐号设置进入你自己写的H5登录授权界面

5.输入帐号密码

6.登陆成功后,你的服务器会自己调用下面的接口,然后生成code传给天猫精灵。

7.天猫精灵携带code,通过下面去请求token

8.返回token到天猫精灵,整个授权流程结束

使用Java实现与天猫精灵智能设备的对接(小度是同样的方式)相关推荐

  1. 天猫精灵智能设备对接(3)

    这一篇文章主要讲解服务器端的设置,这里我使用的是腾讯云,当时学生价1块钱一个月买的,现在的学生价涨到了10块,为我当时的机智点赞.为什么一定要使用服务器呢,这个是因为天猫精灵协议的对接是云服务器与云服 ...

  2. 天猫精灵智能家居对接,及天猫iot官网配置图文讲解(二)

    天猫精灵智能家居对接,及天猫iot官网配置图文讲解(二) 2.天猫精灵设备对接 2-1.介绍 ​ 上一章里,我已经讲了天猫精灵的技能配置,设备创建,登录验证这三个部分做了,此次篇文章就讲之后的设备查询 ...

  3. 天猫精灵智能设备对接—前篇(1)

    本系列文章小狂决定一步步来完成其他智能设备与天猫精灵的对接,简单粗暴的目的就是使用ESP8266或者其他的wifi设备制造一个智能设备,完成一次天猫精灵智能音箱对我们自己制造的智能设备的控制,以来验证 ...

  4. 天猫精灵智能设备对接(2)

    一.准备条件 1.  云服务器的支持(当然可以使用内网穿透) 2.  域名的支持 3.  SSL认证书. 4.  当然最重要的要有一个天猫精灵,我99买的,我99买的,我99买的,(秀一波) 二.软件 ...

  5. 天猫精灵智能设备对接(8) 开发者网关地址

    洋洋洒洒六七千字已经搭进去了,终于把服务器篇写的差不多了,当然小狂不是专业的写手,有些东西写的凑合看吧,只是说明过程,并不修饰言辞,看的舒服就点个赞,不舒服就当学东西了吧.这篇文章我们将完成天猫精灵服 ...

  6. Java实现Aligenie天猫精灵OAuth2.0认证授权流程

    由于对智能家居物联网比较感兴趣,之前参考电子发烧友上 小狂的教程,加上自己的想法,完善一版基于PHP的智能家居的设备平台实现, 且天猫精灵的开放性和功能是国内智能音箱中的佼佼者,于是准备用java重构 ...

  7. 天猫精灵 python_跟着小狂玩天猫精灵智能设备对接--硬件篇

    本帖最后由 3guoyangyang7 于 2017-12-12 22:55 编辑 做了三天的东西,写了将近4天的文章,把技术的内容通过语言描述出来还是比本身做技术难得的多也要费时间的多.这也是对接天 ...

  8. 天猫精灵智能设备对接(7) OAuth2.0

    在开始之前先放两篇参考,一篇英文http://bshaffer.github.io/oauth2-server-php-docs/cookbook/,一篇中文https://www.cnblogs.c ...

  9. Aligenie语音开发平台(天猫精灵)的对接记录

    首先找到阿里语音开发平台: 用自己的淘宝号登录,进入控制台: 添加新技能: 这里以智能家居接入为例,填写以下信息,填完点击下一步: 填写服务配置: 到此为止,语音开发平台的配置就差不多了,接下来是自己 ...

最新文章

  1. 网站优化上首页不算成功稳定排名才算
  2. EF Core3.0+ 通过拦截器实现读写分离与SQL日志记录
  3. 电脑内部,小贴士:电脑内部连接标准
  4. dcrs 端口配ip_DCRS-5950配置(划分VLAN,根据每个VLAN通过DHCP分配IP地址)
  5. oracle12c linux安装教程
  6. 人件管理与中国古代史:程序员豫让
  7. 微博批量发布,微博定时发布,批量删除,批量评论等功能的实现
  8. 魔兽争霸---------常见简称
  9. java.lang.ClassNotFoundException: org.jaxen.JaxenException 解决方法
  10. 计算机平面设计要学语数英吗,《计算机平面设计与制作》课程标准规范.doc
  11. 0x80004005错误代码解决方法,哪种方法快捷有效?
  12. 每日一记录,2022年1月5日
  13. 数据可视化-echarts入门、常见图表案例、超详细配置解析及项目案例
  14. php画奥运五环颜色,php趣味 - php 奥运五环
  15. Android 卡片、证件识别
  16. 读写锁ReentrantReadWriteLock源码分析
  17. wps文字退格会删掉文字_WPS加字时总是把后面的字删除,如何解决?
  18. 软件工程毕业设计课题(12)基于python的毕业设计python校园二手书籍交易网站系统毕设作品源码
  19. 赠书五本《数据分析咖哥十话》
  20. 【路径规划】基于matlab A_star算法机器人避障最短路径规划【含Matlab源码 2295期】

热门文章

  1. Linux图形界面与字符界面切换
  2. 微信小程序日历加课表项目
  3. 计算机应用基础知识大全
  4. 年轻人为提前退休 毕业十年攒100万
  5. Mac 2020版M1 安装idea+jdk+maven的踩过的坑
  6. 蔬菜咖喱+炸猪排(日式风味)
  7. jenkin安装教程
  8. ADSP21489的算法调用基础
  9. (二十二)岁月无声 - 6
  10. 【EI会议信息】2022年第四届大数据与区块链国际会议(ICBDB 2022)