1. 程式人生 > >Java微信開發之AirKiss

Java微信開發之AirKiss

1、AirKiss介紹

2、JSAPI

微信硬體JSAPI介面屬於微信JS-SDK的一部分

微信JS-SDK是微信公眾平臺面向網頁開發者提供的基於微信內的網頁開發工具包。

使用微信JS-SDK,公眾號開發者可藉助微信高效地使用拍照、選圖、語音、位置、藍芽、WiFi等手機系統的能力,同時可以直接使用微信分享、掃一掃、卡券、支付等微信特有的能力,為微信使用者提供更優質的網頁體驗。

使用微信硬體JSAPI,裝置廠商可以在網頁通過內javascript,對裝置操作的介面。例如掃描裝置,連線裝置,收發資料,繫結裝置,Airkiss配網等。

這裡寫圖片描述

HTML通過JSAPI可以和裝置本地收發資料(即HTML傳送給微信客戶端,微信客戶端發給裝置),無需通過伺服器中轉,所以速度較快。所以實時性要求高的藍芽裝置(如遙控汽車)可採用JSAPI收發資料。

3、業務程式碼

3.1 頁面引用

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> 
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+"/"
+path+"/"; %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <base href="<%=basePath%>"> <title>LETUS</title> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no"
>
<meta name="format-detection" content="telephone=no"> <meta name="renderer" content="webkit"> <meta http-equiv="Cache-Control" content="no-siteapp" /> <link rel="stylesheet" href="amazeui/assets/css/amazeui.min.css"/> <style> * { margin: 0; padding: 0; } html, body { height: 100%; width: 100%; } </style> <script></script> </head> <body> <h1>設定裝置Wifi</h1> <br><br> <div id="message"></div> </body> <!--[if (gte IE 9)|!(IE)]><!--> <script src="/js/jquery.min.js"></script> <!--<![endif]--> <script src="http://res.wx.qq.com/open/js/jweixin-1.0.0.js"></script> <script type="text/javascript"> wx.config({ beta : true, // 開啟內測介面呼叫,注入wx.invoke方法 debug : false, // 開啟除錯模式 appId : '${config.appId}', // 第三方app唯一標識 timestamp : '${config.timestamp}', // 生成簽名的時間戳 nonceStr : '${config.nonce}', // 生成簽名的隨機串 signature : '${config.signature}',// 簽名 jsApiList : ['configWXDeviceWiFi'] // 需要使用的jsapi列表 }); var second = 5; wx.ready(function () { wx.checkJsApi({ jsApiList: ['configWXDeviceWiFi'], success: function(res) { wx.invoke('configWXDeviceWiFi', {}, function(res){ var err_msg = res.err_msg; if(err_msg == 'configWXDeviceWiFi:ok') { $('#message').html("配置 WIFI成功,<span id='second'>5</span>秒後跳轉到首頁。"); setInterval(count,1000); return; } else { $('#message').html("配置 WIFI失敗,是否<a href=\"/wechat/scan/airkiss" + window.location.search + "\">再次掃描</a>。<br>不配置WIFI,<a href=\"https://open.weixin.qq.com/connect/oauth2/authorize?appid=wxf1867e87a4eeeb16&redirect_uri=http://letux.xyz/wechat/page/main&response_type=code&scope=snsapi_base&state=1#wechat_redirect\">直接進入首頁</a>。"); } }); } }); }); function count(){ second--; $('#second').html(second); if(second == 0){ //跳轉到首頁 window.location.href='/consumer/main' } } </script> </html>
<script src="http://res.wx.qq.com/open/js/jweixin-1.0.0.js"></script>

wx.config的方法的引數大部分由後臺生成,本文中是JsAPIConfig物件。jsApiList陣列中,傳入需要額外使用的jsapi名稱,我們用到的AirKiss功能是configWXDeviceWiFi介面。
這裡寫圖片描述

    wx.config({
        beta : true, // 開啟內測介面呼叫,注入wx.invoke方法
        debug : false, // 開啟除錯模式
        appId : '${config.appId}', // 第三方app唯一標識
        timestamp : '${config.timestamp}', // 生成簽名的時間戳
        nonceStr : '${config.nonce}', // 生成簽名的隨機串
        signature : '${config.signature}',// 簽名
        jsApiList : ['configWXDeviceWiFi'] // 需要使用的jsapi列表
    });

檢查瀏覽器是否支援configWXDeviceWiFi介面,並使用此介面。

    wx.ready(function () {
        wx.checkJsApi({
            jsApiList: ['configWXDeviceWiFi'],
            success: function(res) {
                wx.invoke('configWXDeviceWiFi', {}, function(res){
                    var err_msg = res.err_msg;
                    if(err_msg == 'configWXDeviceWiFi:ok') {
                        //配置成功
                    } else {
                        //配置失敗
                    }
                });
            }
        });
    });

3.2 JsAPIConfig實體類

package com.benben.timetable.wechat.entity;

/**
 * JS-SDK使用的配置資訊
 * @ClassName: JsAPIConfig 
 * @Description: TODO
 * @author 潘廣偉(笨笨) 
 * @date 2015年8月17日 下午3:12:35 
 *
 */
public class JsAPIConfig {
    private boolean debug;
    private String appId;
    private String timestamp;
    private String nonce;
    private String signature;
    private String title;
    private String link;
    private String signType;
    private String packageName;

    public JsAPIConfig(){
        signType = "MD5";
    }

    public boolean isDebug() {
        return debug;
    }

    public void setDebug(boolean debug) {
        this.debug = debug;
    }

    public String getAppId() {
        return appId;
    }

    public void setAppId(String appId) {
        this.appId = appId;
    }

    public String getTimestamp() {
        return timestamp;
    }

    public void setTimestamp(String timestamp) {
        this.timestamp = timestamp;
    }

    public String getNonce() {
        return nonce;
    }

    public void setNonce(String nonce) {
        this.nonce = nonce;
    }

    public String getSignature() {
        return signature;
    }

    public void setSignature(String signature) {
        this.signature = signature;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getLink() {
        return link;
    }

    public void setLink(String link) {
        this.link = link;
    }

    public String getSignType() {
        return signType;
    }

    public void setSignType(String signType) {
        this.signType = signType;
    }

    public String getPackageName() {
        return packageName;
    }

    public void setPackageName(String packageName) {
        this.packageName = packageName;
    }   
}

這裡預設使用MD5加密方式。

3.3 獲取api_ticket

api_ticket會在生成JsAPIConfig物件signature(簽名)屬性時用到。

通過http get請求方式獲取:

    /**
     * 獲取jsTicket
     * @Title: getJsTicketFromWechat 
     * @Description: TODO
     * @param @return
     * @param @throws Exception   
     * @return String   
     * @throws
     */
    public  String getJsTicketFromWechat() throws Exception{  
        String token = getTokenFromCache();
        String responeText = httpConnection.get(ticketUrl+token);
        JSONObject obj = JSONObject.fromObject(responeText);
        String jsTicket = obj.getString("ticket");
        SystemCache.getWechatJsTicketCache().addJsTicket(jsTicket);

        return jsTicket;  
    }

返回JSON格式資料:

 {
    "errcode":0,
    "errmsg":"ok",
    "ticket":"bxLdikRXVbTPdHSM05e5u5sUoXNKdvsdshFKA",
    "expires_in":7200
}

注意事項(很重要):

2.由於獲取api_ticket 的api 呼叫次數非常有限,頻繁重新整理api_ticket 會導致api呼叫受限,影響自身業務,開發者需在自己的服務儲存與更新api_ticket。api_ticket 的有效期為7200 秒。

3.4 生成 JsAPIConfig

    /**
     * 生成JsAPIConfig
     * @Title: createConfig
     * @Description: TODO
     * @param @param link 使用AirKiss的連結地址
     * @param @return
     * @param @throws Exception    
     * @return JsAPIConfig    
     * @throws
     */
    public JsAPIConfig createConfig(String link) throws Exception {
        JsAPIConfig config = new JsAPIConfig();
        config.setLink(link);
        String nonce = UUID.randomUUID().toString();
        String timestamp = Long.toString(System.currentTimeMillis() / 1000);
        String src = "jsapi_ticket=" + getJsTicketFromCache() + "&noncestr="
                + nonce + "&timestamp=" + timestamp + "&url="
                + config.getLink();
        String signature = SHAEncryptor.sha1(src);

        config.setAppId(appId);
        config.setDebug(true);
        config.setNonce(nonce);
        config.setTimestamp(timestamp);
        config.setSignature(signature);

        return config;
    }

這裡的getJsTicketFromCache()是從快取中獲取ticket了。有關快取相關的技術,請自個度娘。

    /**
     * 從快取中獲取JsTicket
     * @Title: getJsTicketFromCache
     * @Description: TODO
     * @param @return
     * @param @throws Exception    
     * @return String    
     * @throws
     */
    public String getJsTicketFromCache() throws Exception{  
        String ticket =  SystemCache.getWechatJsTicketCache().getJsTicket();

        if(ticket == null){
            ticket = getJsTicketFromWechat();
        }

        return ticket;
    }
JsAPIConfig config = createConfig("http://letus.xyz/wechat/scan/airkiss");

4、AirKiss頁面

這裡寫圖片描述

當配置屬性呼叫成功後,會來到AirKiss頁面。輸入移動裝置所在網路的WiFi密碼並確定,微信會通過AirKiss技術,把周圍的硬體裝置配置到同一網路中。

配置成功會返回configWXDeviceWiFi:ok資訊。在配置成功後,我們再做相應的頁面跳轉邏輯即可。

相關推薦

Java開發AirKiss

1、AirKiss介紹 2、JSAPI 微信硬體JSAPI介面屬於微信JS-SDK的一部分 微信JS-SDK是微信公眾平臺面向網頁開發者提供的基於微信內的網頁開發工具包。 使用微信JS-SDK,公眾號開發者可藉助微信高效地使用拍照、選圖、語音、位置、

開發JSSDK介面開發Java

    前不久做了一個微信公眾號專案,有用到JSSDK介面,今晚正好有空,就開始動手整理。如何獲得accesstoken和jsapitiket以及生成簽名就不細說了,大家看介面文件,有不明白的地方可以給我留言。本文主要介紹了如何去使用JSSDK的部分介面,包括選擇圖片、上傳

開發分享 node.js直接使用、C#、 java 通用

/** * 微信分享 */ $(function(){ if (browser.versions.mobile) {//判斷是否是移動裝置開啟。browser程式碼在下面 var ua = navigator.userAgent.to

Java開發_01_開發包策略文件

target jdk1.6 extern .html 版本 無限 export oracle pan 微信java jar的加密key的大小支持 異常java.security.InvalidKeyException:illegal Key Size的解決方案

Java開發-崔用誌-開發-java版本

分享 bsp 基本 配置 版本 (九) get java微信 公眾 今天看到一些關於微信開發的知識蠻好的博客,分享給大家,希望對大家有幫助。 微信開發準備(一)--Maven倉庫管理新建WEB項目 微信開發準備(二)--springmvc+mybati

php開發帶參數二維碼的使用

cor odin ews json 保存 explode 想要 int gty 最近做微信PC端網頁微信相關功能的開發,從一個新手的角度來說,微信公眾號的文檔還是不好理解的,網上找的帖子大都也都基本上是復制微信公眾平臺上給的文檔,開發微信帶參數二維碼過程中還是遇到不少坑的,

Java開發_02_本地服務器映射外網

ini spa web服務 tun 版本 nat for config online 一、工具列表 內網穿透的相關工具有: (1)natapp 官網 :https://natapp.cn/ (2)花生殼 官網:https://console.oray.com/

開發網頁授權

個人信息 ati 關註 技術分享 lin base 定義 技術 參數 第一步:成為開發者   在自己的公眾號點擊基本配置,點擊基本配置,填寫服務器配置 Url服務器地址是微信回調地址,必須以 http://或https://開頭,端口號必須為80或443。 Token令

武漢開發小程序開發,應該從哪些方面做起?

如果 不同 你是 實踐 可能 了解 上帝 內容 簡單的 很多武漢微信開發的從業者不知道微信小程序開發應該從哪些方面做起,究其原因,大概是大多數武漢微信開發從業者都是技術出身,而不知道微信小程序開發也是應該從運營角度去考慮的。技術不懂運營,這個是所有開發類行業中的硬傷。所以,

開發消息接收--文本消息(三)

事件 圖片 over ret ken .text tin equals char 一、消息格式 1 <xml> 2 <ToUserName>< ![CDATA[toUser] ]> 3 </ToUserNam

開發消息回復--圖文消息(四)

轉換 turn ews exce 默認 nal ini equal 介紹 一、消息格式 1 <xml> 2 <ToUserName> 3 < ![CDATA[toUser] ]> 4 </T

ThinkPHP5.0開發獲取使用者地理位置

新建一個類Location.php 我直接貼程式碼,要用大夥自己複製下就OK! <?php class Locatin{ private $appId; private $appSecret; public function __constru

php 開發 支付 v3 配置

      公司需要微信支付現不到鎮的是非常的麻煩。然後呢那個要怎麼申請我就不寫了。因為不是我負責的所以我就記錄微信支付開發就好了。自己也記錄一下以後要開發好下手 。 1. 到這裡下載sdk        版本本V3 : http

開發網頁授權取客戶資訊(測試號)

搞個賬號後 到開發者工具->公眾平臺測試賬號 第一步 設定一個域名 這個域名要外網能訪問 如果是自己測試的話 不用伺服器 就用內網對映(這裡推薦netapp) 這裡注意不用加什麼http:// 第二步 後臺寫一個介面 返回一個echostr給微

開發網站授權登入-C#

一、前言 網站微信授權登入的準備工作:官方介面文件  ,微信服務號(怎麼註冊我就不提了),準備工作做好了過後,梳理流程,切勿愣頭青,先把流程梳理好,才好帶入業務 注意:如果沒有認證的服務號,可以用測試賬號,測試賬號預設支援100個關注的微訊號。 官方文案:  網

開發客服訊息的使用

之前的訊息傳送與接收都是使用者給微信發一條,之後微信回覆給使用者,也就是API上面所說的被動回覆訊息,那麼微信是否支援主動給關注使用者發訊息嗎,答案是肯定的,但是卻有一些限制。看下微信開發文件上怎麼說就明白了: 當用戶主動發訊息給公眾號的時候(包括髮送資訊、點選自定義選單、

開發獲取openid及推送模板訊息

有很多的朋友再問我怎麼獲取code,openid之類的問題,在這裡我就給大家分享一下。 在做微信支付是需要獲取openid的,推送模板訊息也是需要openid包括其他一些功能分享等也都是需要的,openid是什麼呢,這裡給大家解釋一下,是使用者在公眾號中的一個標識,就相當於你資料表中的I

開發傳送訊息介面

傳送訊息,是指使用者公眾號向用戶傳送相應形式的訊息。根據微信開發文件,由以下四種形式:被動回覆,群發介面,客服訊息介面以及模板訊息介面。本文將基於Java語言以及個人微信測試號,說明被動回覆、客服訊息介

開發小程式獲取手機號授權登入

小程式中有很多地方都會用到註冊使用者資訊的地方,使用者需要填寫手機號等,有了這個元件可以快速獲取微信繫結手機號碼,無須使用者填寫。1.getPhoneNumber這個元件通過button來實現(別的標籤無效)。將button中的open-type=“getPhoneNumbe

Java開發-java開發接入平臺例項

package com.levi.service; import java.io.IOException; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.u