踩坑之 java微信wifi 配网airkiss
最近在负责微信WiFi连接硬件设备的需求
只想说 坑 坑 坑
配网过程中一直重复报两个错 1、config:fail,Error: 系统错误,错误码:40048,invalid url domain
2、config:fail,Error: 系统错误,错误码:63002,invalid signature
总之 不是报 url错误,就是报 签名无效
崩溃,经过各方大佬的指教,终于求证出来
微信配网总结:1、微信公众号配置
2、先获取AccessToken,
通过AccessToken
来请求票据jsApiTicket,
最后的调用签名signature
第一步:把服务器IP地址配置到微信公众号的白名单中
第二步:接口权限中找到设备功能,确保设备功能接口已获得
第三步:配置JS接口安全域名,可以放置路径或者域名,确保txt文件可以访问到
第四步:编写Java代码
package com.weixin.wifi;import net.sf.json.JSONObject;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.UUID;/*** @author sf* @version 1.0* @date 2019/12/4 11:23*/
@RestController
@RequestMapping("wifi")
public class Airkiss {static String appId="XXX";//第三方用户唯一凭证 public static String getAccessToken() {String access_token = "";String grant_type = "client_credential";//获取access_token填写client_credential String secret="XXXX";//第三方用户唯一凭证密钥,即appsecret//这个url链接地址和参数皆不能变 String url = "https://api.weixin.qq.com/cgi-bin/token?grant_type="+grant_type+"&appid="+appId+"&secret="+secret;try {URL urlGet = new URL(url);HttpURLConnection http = (HttpURLConnection) urlGet.openConnection();http.setRequestMethod("GET"); // 必须是get方式请求 http.setRequestProperty("Content-Type","application/x-www-form-urlencoded");http.setDoOutput(true);http.setDoInput(true);System.setProperty("sun.net.client.defaultConnectTimeout", "30000");// 连接超时30秒 System.setProperty("sun.net.client.defaultReadTimeout", "30000"); // 读取超时30秒 http.connect();InputStream is = http.getInputStream();int size = is.available();byte[] jsonBytes = new byte[size];is.read(jsonBytes);String message = new String(jsonBytes, "UTF-8");JSONObject demoJson = JSONObject.fromObject(message);System.out.println("JSON字符串:"+demoJson);access_token = demoJson.getString("access_token");is.close();} catch (Exception e) {e.printStackTrace();}return access_token;}public static String getTicket(String access_token) {String ticket = null;String url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token="+ access_token +"&type=jsapi";//这个url链接和参数不能变 try {URL urlGet = new URL(url);HttpURLConnection http = (HttpURLConnection) urlGet.openConnection();http.setRequestMethod("GET"); // 必须是get方式请求 http.setRequestProperty("Content-Type","application/x-www-form-urlencoded");http.setDoOutput(true);http.setDoInput(true);System.setProperty("sun.net.client.defaultConnectTimeout", "30000");// 连接超时30秒 System.setProperty("sun.net.client.defaultReadTimeout", "30000"); // 读取超时30秒 http.connect();InputStream is = http.getInputStream();int size = is.available();byte[] jsonBytes = new byte[size];is.read(jsonBytes);String message = new String(jsonBytes, "UTF-8");JSONObject demoJson = JSONObject.fromObject(message);System.out.println("jsapi字符串:"+demoJson);ticket = demoJson.getString("ticket");is.close();} catch (Exception e) {e.printStackTrace();}return ticket;}public static String SHA1(String decript) {try {MessageDigest digest = java.security.MessageDigest.getInstance("SHA-1");digest.update(decript.getBytes());byte messageDigest[] = digest.digest();// Create Hex String StringBuffer hexString = new StringBuffer();// 字节数组转换为 十六进制 数 for (int i = 0; i < messageDigest.length; i++) {String shaHex = Integer.toHexString(messageDigest[i] & 0xFF);if (shaHex.length() < 2) {hexString.append(0);}hexString.append(shaHex);}return hexString.toString();} catch (NoSuchAlgorithmException e) {e.printStackTrace();}return "";}
//********************************************************************************************// public static String getnoncestr() {String noncestr = UUID.randomUUID().toString().replace("-", "").substring(0, 16);//随机字符串 return noncestr;}public static String gettimestamp() {String timestamp = String.valueOf(System.currentTimeMillis() / 1000);//时间戳 当前时间 return timestamp;}
//********************************************************************************************//public static String times[] = {"0","0"};public static int a = 0;public static int b = 0;public static int n = 0;static String accessToken = null;static String jsapi_ticket = null;
//********************************************************************************************// @RequestMapping(value = "/getSign")public static String[] getSignatur() {a = Integer.parseInt(times[1]);b = Integer.parseInt(times[0]);System.out.println("获取access时间:"+times[0]);System.out.println("当前获取access:"+times[1]);if(n == 0){//初始化获取参数//1、获取AccessToken accessToken = getAccessToken();//2、获取Ticket jsapi_ticket = getTicket(accessToken);n = 1;}if(a - b > 7000){//定时获取参数//1、获取AccessToken String accessT = getAccessToken();String jsapi_t = getTicket(accessT);accessToken = accessT;jsapi_ticket = jsapi_t;times[0] = times[1];}//3、时间戳和随机字符串 String noncestr = getnoncestr();String timestamp = gettimestamp();times[1] = timestamp;System.out.println("accessToken:"+accessToken+"\njsapi_ticket:"+jsapi_ticket+"\n时间戳:"+timestamp+"\n随机字符串:"+noncestr);String url = "http://XXXX"; //重点:需要获取签名的页面url具体地址,例如:www.XXXX.com/wifi.html
//5、将参数排序并拼接字符串 String str = "jsapi_ticket="+jsapi_ticket+"&noncestr="+noncestr+"×tamp="+timestamp+"&url="+url;//6、将字符串进行sha1加密 String signature = SHA1(str);System.out.println("参数:"+str+"\n签名:"+signature);String[] sendstr = new String[4];sendstr[0] = appId;sendstr[1] = timestamp;sendstr[2] = noncestr;sendstr[3] = signature;return sendstr;}
}
这里的URL我要着重说明一下,踩坑就踩在这里了
url就是步骤五的页面地址
url为访问的页面
第五步:前端页面
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta http-equiv="X-UA-Compatible" content="ie=edge"><title></title>
</head><body>
</body>
<script src="https://res.wx.qq.com/open/js/jweixin-1.0.0.js"></script>
<script src="./wifiJs/jquery-3.3.1.min.js"></script>
<script>var x = []$.ajax({url:"/wifi/getSign",type:"GET",dataType:"JSON",async:false,success:function(res){x = res}})console.log(location.href)wx.config({beta : true, // 开启内测接口调用,注入wx.invoke方法debug : false, // 开启调试模式appId : x[0], // 第三方app唯一标识timestamp : x[1], // 生成签名的时间戳nonceStr : x[2], // 生成签名的随机串signature :x[3],// 签名jsApiList : ['configWXDeviceWiFi'] // 需要使用的jsapi列表});var second = 5;wx.ready(function () {wx.checkJsApi({jsApiList: ['configWXDeviceWiFi'],success: function(res) {wx.invoke('configWXDeviceWiFi', {}, function(res){err_msg = res.err_msgif(err_msg == 'configWXDeviceWiFi:ok') {console.log('yes');$('#tips').html("配置 wifi 成功,正在跳转...");return;} else {console.log('no');$('#tips').html("配置 wifi 失败,是否再次扫描");}console.log('configWXDeviceWiFi', res);});}});}); wx.error(function(res){// config信息验证失败会执行error函数,如签名过期导致验证失败,具体错误信息可以打开config的debug模式查看,也可以在返回的res参数中查看,对于SPA可以在这里更新签名。console.log(res)});function count(){second--;$('#second').html(second);if(second == 0){//跳转到首页//window.location.href='/consumer/main'}}
</script>
</html>
第六步:在微信公众号——自定义菜单,找到自己的小程序,配置页面地址,页面地址为点击后要跳转的页面
以上配置完成:
在微信开发者工具中测试:测试地址为网页url地址,最后返回结果是没有此SDK或暂不支持此SDK模拟,所以在手机上测试,显示成功,可以拿个硬件连接起来测试了!!!
以上是微信配网中的踩坑经验
切记:url值得是页面访问网址
踩坑之 java微信wifi 配网airkiss相关推荐
- WIFI配网方式(AP模式、Smartconfig等模式)
参考:智能设备WIFI配网方式汇总 地址:https://blog.csdn.net/beauytlife_1985/article/details/87539350?spm=1001.2014.30 ...
- 【微信小程序控制硬件④】 深度剖析微信公众号配网 Airkiss 原理与过程,esp8266如何自定义回调参数给微信,实现绑定设备第一步!(附带源码)
[微信小程序控制硬件第1篇 ] 全网首发,借助 emq 消息服务器带你如何搭建微信小程序的mqtt服务器,轻松控制智能硬件! [微信小程序控制硬件第2篇 ] 开始微信小程序之旅,导入小程序Mqtt客户 ...
- wifi 配网方式总结
本文汇总介绍了目前市面上各种WIFI模块的常见的配网方式的原理和实现,对比了各种配网方式的优势和局限,得出结论,WEB配网是最直接.最简单.最灵活.约束条件最少的配网方式,应该成为WIFI模块配网的标 ...
- IoT时代:Wi-Fi“配网”技术剖析总结
点击上方蓝字,关注高德技术! 1. 导读 近年来,物联网市场竞争激烈,从物联网平台厂商,设备生产商,到服务提供商,都在涌入这片红海.预计到2020年,全球联网设备数量将达到260亿个,年复合增长率达到 ...
- ESP8266微信一键配网smartconfig,esp32可用
ESP8266微信一键配网 第一步 下载程序 微信配网 恢复出厂设置 ESP32 接入 第一步 下载程序 简单配网例程:点击下载 配网并控制LED例程:点击下载 例程下载后,需要使用arduino i ...
- ESP8266固件SDK开发之微信配网(AIRKISS)原理(一)
一.ESP8266开发可以有两种方式: 1.AT指令编程开发 2.基于SDK编程开发 二.ESP8266配网方式有三种: 1.网页配网 2.APP配网 3.微信配网 AIRKISS 这里,微信配网是最 ...
- WiFi配网~智能家居配网解决方案
1. 什么是配网? 先解释一下什么是配网:当智能设备交付用户时,用户如何根据说明手册或者指引,简单成功的将联网设备连接到路由器下面.这里主要是wifi产品,蓝牙.Zigbee.NB-Iot配网是不 ...
- WIFI配网方案:1、蓝牙配网 2、WIFI自身配网 3、SmartConfig一键配网
蓝牙配网: 顾名思义,通过蓝牙给WIFI配网,过程相对较为简单,首先设备上具有WIFI和蓝牙两种功能.然后通过手机的小程序或者APP连接产品蓝牙,连接之后发送WIFI连接所需要的SSID和PASSID ...
- ESP32-C3入门教程 WiFi篇⑨——WiFi配网失败常见问题与解决办法(找不到WiFi AP | WiFi密码错误 | 距离AP过远 RSSI判断)
文章目录 一.前言 二.WiFi配网的常见问题 三.5GHz WiFi 四.找不到WiFi AP 4.1 App限制WiFi名称的输入 4.2 设备回传 配网失败错误码 五.WiFi密码错误 5.1 ...
最新文章
- GAN Zoo:千奇百怪的生成对抗网络,都在这里了
- 我酸了~腾讯员工平均月薪 7.6 万 | 每日趣闻
- 设置横坐标刻度_是不是快被Excel的时间刻度逼疯了,教你两招轻松解决
- php 缩略图增加水印,PHP生成缩略图加图片水印代码
- java调用FFmpeg及mencoder转换视频为FLV并截图
- 苹果为 macOS 重大漏洞道歉;迅雷内讧股价暴跌;小米百度在一起 | 一周业界事
- 软开关设计漫谈_软件篇
- Baxter实战 (一)ubuntu14.04安装ROS-Indigo
- 如何在Mac上的Safari浏览器中输入画中画视频?
- 【人脸识别】arcface-pytorch代码解析
- 复旦计算机对口,2019年长宁区公办初中划片电脑派位对口入学方式
- dango mysql 的问题
- linux ubuntu bionic,如何升级Ubuntu到18.04 LTS Bionic Beaver
- bte上了b网_酷站推荐 - tukkk.com - 小语种口语网
- 【HTML】HTML特殊符号全集
- html5 video 手机端视频播放全屏显示
- MySQL实现定时任务
- PostgreSQL 10.0 preview 功能增强 - 更强可靠性, 过去式事务状态可查(杜绝unknown事务)...
- mysql学生班级老师_MySQL全方位练习(学生表 教师表 课程表 分数表)
- 手机拨号按键歌曲谱子
热门文章
- echarts name 坐标轴_echarts字体大小调整,坐标轴name设置等一些问题
- pandas修改表格数据(整合两张表格)
- Linux技术资料锦集及命令大全,让你从新手变高手
- 嵌入式开发:使用ITM提高调试效率
- 鼠标左键会阻止定时器_如何在iPad上使用鼠标,终于让我找到最详细的教程了...
- 90%汽车业创新来自电子业,九大IC原厂畅谈产业趋势
- PortSwigger Academy | HTTP Host header attacks : HTTP Host头攻击
- cs231n Assignment 1# two layer net详细答案及总结
- GB28181各大平台对接之各种填坑
- 好用的数据校验修复工具gt-checksum开源啦