最近在负责微信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+"&timestamp="+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相关推荐

  1. WIFI配网方式(AP模式、Smartconfig等模式)

    参考:智能设备WIFI配网方式汇总 地址:https://blog.csdn.net/beauytlife_1985/article/details/87539350?spm=1001.2014.30 ...

  2. 【微信小程序控制硬件④】 深度剖析微信公众号配网 Airkiss 原理与过程,esp8266如何自定义回调参数给微信,实现绑定设备第一步!(附带源码)

    [微信小程序控制硬件第1篇 ] 全网首发,借助 emq 消息服务器带你如何搭建微信小程序的mqtt服务器,轻松控制智能硬件! [微信小程序控制硬件第2篇 ] 开始微信小程序之旅,导入小程序Mqtt客户 ...

  3. wifi 配网方式总结

    本文汇总介绍了目前市面上各种WIFI模块的常见的配网方式的原理和实现,对比了各种配网方式的优势和局限,得出结论,WEB配网是最直接.最简单.最灵活.约束条件最少的配网方式,应该成为WIFI模块配网的标 ...

  4. IoT时代:Wi-Fi“配网”技术剖析总结

    点击上方蓝字,关注高德技术! 1. 导读 近年来,物联网市场竞争激烈,从物联网平台厂商,设备生产商,到服务提供商,都在涌入这片红海.预计到2020年,全球联网设备数量将达到260亿个,年复合增长率达到 ...

  5. ESP8266微信一键配网smartconfig,esp32可用

    ESP8266微信一键配网 第一步 下载程序 微信配网 恢复出厂设置 ESP32 接入 第一步 下载程序 简单配网例程:点击下载 配网并控制LED例程:点击下载 例程下载后,需要使用arduino i ...

  6. ESP8266固件SDK开发之微信配网(AIRKISS)原理(一)

    一.ESP8266开发可以有两种方式: 1.AT指令编程开发 2.基于SDK编程开发 二.ESP8266配网方式有三种: 1.网页配网 2.APP配网 3.微信配网 AIRKISS 这里,微信配网是最 ...

  7. WiFi配网~智能家居配网解决方案

    1. 什么是配网?   先解释一下什么是配网:当智能设备交付用户时,用户如何根据说明手册或者指引,简单成功的将联网设备连接到路由器下面.这里主要是wifi产品,蓝牙.Zigbee.NB-Iot配网是不 ...

  8. WIFI配网方案:1、蓝牙配网 2、WIFI自身配网 3、SmartConfig一键配网

    蓝牙配网: 顾名思义,通过蓝牙给WIFI配网,过程相对较为简单,首先设备上具有WIFI和蓝牙两种功能.然后通过手机的小程序或者APP连接产品蓝牙,连接之后发送WIFI连接所需要的SSID和PASSID ...

  9. ESP32-C3入门教程 WiFi篇⑨——WiFi配网失败常见问题与解决办法(找不到WiFi AP | WiFi密码错误 | 距离AP过远 RSSI判断)

    文章目录 一.前言 二.WiFi配网的常见问题 三.5GHz WiFi 四.找不到WiFi AP 4.1 App限制WiFi名称的输入 4.2 设备回传 配网失败错误码 五.WiFi密码错误 5.1 ...

最新文章

  1. GAN Zoo:千奇百怪的生成对抗网络,都在这里了
  2. 我酸了~腾讯员工平均月薪 7.6 万 | 每日趣闻
  3. 设置横坐标刻度_是不是快被Excel的时间刻度逼疯了,教你两招轻松解决
  4. php 缩略图增加水印,PHP生成缩略图加图片水印代码
  5. java调用FFmpeg及mencoder转换视频为FLV并截图
  6. 苹果为 macOS 重大漏洞道歉;迅雷内讧股价暴跌;小米百度在一起 | 一周业界事
  7. 软开关设计漫谈_软件篇
  8. Baxter实战 (一)ubuntu14.04安装ROS-Indigo
  9. 如何在Mac上的Safari浏览器中输入画中画视频?
  10. 【人脸识别】arcface-pytorch代码解析
  11. 复旦计算机对口,2019年长宁区公办初中划片电脑派位对口入学方式
  12. dango mysql 的问题
  13. linux ubuntu bionic,如何升级Ubuntu到18.04 LTS Bionic Beaver
  14. bte上了b网_酷站推荐 - tukkk.com - 小语种口语网
  15. 【HTML】HTML特殊符号全集
  16. html5 video 手机端视频播放全屏显示
  17. MySQL实现定时任务
  18. PostgreSQL 10.0 preview 功能增强 - 更强可靠性, 过去式事务状态可查(杜绝unknown事务)...
  19. mysql学生班级老师_MySQL全方位练习(学生表 教师表 课程表 分数表)
  20. 手机拨号按键歌曲谱子

热门文章

  1. echarts name 坐标轴_echarts字体大小调整,坐标轴name设置等一些问题
  2. pandas修改表格数据(整合两张表格)
  3. Linux技术资料锦集及命令大全,让你从新手变高手
  4. 嵌入式开发:使用ITM提高调试效率
  5. 鼠标左键会阻止定时器_如何在iPad上使用鼠标,终于让我找到最详细的教程了...
  6. 90%汽车业创新来自电子业,九大IC原厂畅谈产业趋势
  7. PortSwigger Academy | HTTP Host header attacks : HTTP Host头攻击
  8. cs231n Assignment 1# two layer net详细答案及总结
  9. GB28181各大平台对接之各种填坑
  10. 好用的数据校验修复工具gt-checksum开源啦