微信網頁JSSDK開發流程
阿新 • • 發佈:2018-12-29
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×tamp=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("×tamp=").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;
}