1. 程式人生 > >微信網頁JSSDK開發流程

微信網頁JSSDK開發流程

1、繫結域名

這裡寫圖片描述

這裡寫圖片描述

  • 登入微信公眾後臺之進入公眾號設定的功能設定,填寫JS介面安全域名。

2、引入JS檔案

<link rel="stylesheet" type="text/css" href="front/css/weui.css"/>
<script type="text/javascript" src="front/js/jweixin-1.0.0.js"></script>

3、通過config介面注入許可權驗證配置

wx.config({
    debug: true, // 開啟除錯模式,呼叫的所有api的返回值會在客戶端alert出來,若要檢視傳入的引數,可以在pc端開啟,引數資訊會通過log打出,僅在pc端時才會列印。
appId: '', // 必填,公眾號的唯一標識 timestamp: , // 必填,生成簽名的時間戳 nonceStr: '', // 必填,生成簽名的隨機串 signature: '',// 必填,簽名,見附錄1 jsApiList: [] // 必填,需要使用的JS介面列表,所有JS介面列表見附錄2 });

4、通過ready介面處理成功驗證

wx.ready(function(){
// config資訊驗證後會執行ready方法,所有介面呼叫都必須在config介面獲得結果之後,config是一個客戶端的非同步操作,所以如果需要在頁面載入時就呼叫相關介面,則須把相關介面放在ready函式中呼叫來確保正確 執行。對於使用者觸發時才呼叫的介面,則可以直接呼叫,不需要放在ready函式中。
});

5、通過error介面處理失敗驗證

wx.error(function(res){
// config資訊驗證失敗會執行error函式,如簽名過期導致驗證失敗,具體錯誤資訊可以開啟config的debug模式檢視,也可以在返回的res引數中檢視,對於SPA可以在這裡更新簽名。
});
  • 這其中,最主要的部分就是config介面注入許可權驗證配置,後臺需要進行相關操作來生成這些許可權驗證配置,下面就講一下這些許可權驗證配置引數的生成過程:

6、獲取jsapi_ticket

jsapi_ticket介紹

jsapi_ticket是公眾號用於呼叫微信JS介面的臨時票據,正常情況下,jsapi_ticket的有效期為7200秒,通過access_token獲取。jsapi_ticket的api呼叫次數非常有限(100000次/日),因此為了不影響自身業務,開發者必須在自己服務全域性快取jsapi_ticket。通過下面這個連結可以獲取到jsapi_ticket資訊。

簽名演算法

簽名生成規則如下:參與簽名的欄位包括noncestr(隨機字串), 有效的jsapi_ticket, timestamp(時間戳), url(當前網頁的URL,不包含#及其後面部分) 。對所有待簽名引數按照欄位名的ASCII 碼從小到大排序(字典序)後,使用URL鍵值對的格式(即key1=value1&key2=value2…)拼接成字串string1。這裡需要注意的是所有引數名均為小寫字元。對string1作sha1加密,欄位名和欄位值都採用原始值,不進行URL 轉義。
  • 即:signature=sha1(string1)
    例:
  • noncestr=Wm3WZYTPz0wzccnW
  • jsapi_ticket=sM4AOVdWfPE4DxkXGEs8VMCPGGVi4C3VM0P37wVUCFvkVAy_90u5h9nbSlYy3-Sl-HhTdfl2fzFy1AOcHKP7qg
  • imestamp=1414587457

步驟1、 對所有待簽名引數按照欄位名的ASCII 碼從小到大排序(字典序)後,使用URL鍵值對的格式(即key1=value1&key2=value2…)拼接成字串string1:

jsapi_ticket=sM4AOVdWfPE4DxkXGEs8VMCPGGVi4C3VM0P37wVUCFvkVAy_90u5h9nbSlYy3-Sl-HhTdfl2fzFy1AOcHKP7qg&noncestr=Wm3WZYTPz0wzccnW&timestamp=1414587457&url=http://mp.weixin.qq.com ?params=value

步驟2、對string1進行sha1簽名,得到signature:

0f9de62fce790f9a083d5c99e95740ceb90c27ed
  • 注意事項:
    1、簽名用的noncestr和timestamp必須與wx.config中的nonceStr和timestamp相同。
    2、簽名用的url必須是呼叫JS介面頁面的完整URL。

下面給出Java版的許可權資訊獲取程式碼:

主操作類:

//公眾號用於呼叫微信JS介面的臨時票據
String jsApiTicket = JsapiTicketService.getInstance().queryJsapiTicket();
//呼叫微信JSApi的當前網頁URL(當前連結)   
String url = "www.baidu.com 此處是當前訪問的URL全連結";
//隨機字串
String nonceStr = UUID.randomUUID().toString();
//當前時間
String timestamp = Long.toString(System.currentTimeMillis() / 1000);    

StringBuilder str = new StringBuilder();
str.append("jsapi_ticket=").append(jsApiTicket)
   .append("&noncestr=").append(nonceStr)
   .append("&timestamp=").append(timestamp)
   .append("&url=").append(url);

String signature = SignUtil.sha1(str.toString());       //獲取到的數字簽名  

request.setAttribute("appId", WechatConstant.app_id);
request.setAttribute("timestamp", timestamp);
request.setAttribute("nonceStr", nonceStr);
request.setAttribute("signature", signature);

SignUtil校驗工具類

 /**
  * 對給定字串內容進行sha1數字簽名
  */
public static String sha1(String content) {
    MessageDigest md = null;  
    String tmpStr = null;  
    try {  
         md = MessageDigest.getInstance("SHA-1");  
         // 將三個引數字串拼接成一個字串進行sha1加密  
         byte[] digest = md.digest(content.getBytes());  
         tmpStr = byteToStr(digest);  
    } catch (NoSuchAlgorithmException e) {  
         e.printStackTrace();  
    }

    return tmpStr.toLowerCase();
} 

/** 
  * 將位元組陣列轉換為十六進位制字串 
  */  
 private static String byteToStr(byte[] byteArray) {  
     String strDigest = "";  
     for (int i = 0; i < byteArray.length; i++) {  
         strDigest += byteToHexStr(byteArray[i]);  
     }  
     return strDigest;  
 }

 /** 
  * 將位元組轉換為十六進位制字串 
  */  
 private static String byteToHexStr(byte mByte) {  
     char[] Digit = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };  
     char[] tempArr = new char[2];  
     tempArr[0] = Digit[(mByte >>> 4) & 0X0F];  
     tempArr[1] = Digit[mByte & 0X0F];  

     String s = new String(tempArr);  
     return s;  
 }