H5與企業微信jssdk整合
一、公眾號設定
註冊企業微信,在應用與小程式欄目中,設定可信域名,配置公眾號選單。可信域名不得不說下,在最初開發時,認為設定並驗證後,微信認證介面會實現跨域請求,其實並沒有。所以全在H5端還得配合服務端完成票據獲取等操作。
二、開發步驟
-
資源引入
-
在html引入SHA1 庫為初始SDK提供簽名演算法 https://www.npmjs.com/package/sha1
-
初始流程基本流程(https://work.weixin.qq.com/api/doc#90001/90144/90547)
-
獲取accesstoken
介面地址 https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=ID&corpsecret=SECRET , 獲取到的token的有效時間為2小時
H5不能直接訪問,需要服務端通過代理訪問//author herbert QQ:464884492 getAccessToken() { // 判斷是否快取有 return new Promise((resolve, reject) => { var access_token = localStorage.getItem("accessToken"); var expires = localStorage.getItem("expires_accessToken"); if (expires > new Date().getTime() - 2000) { resolve(access_token); return; } let accessTokenUrl = `https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=` + this.groupId + "&corpsecret=" + this.secretId; // fetch(accessTokenUrl, { method: "GET" }) fetch(this.porxyUrl, { method: "POST", body: JSON.stringify({ method: "GET", url: accessTokenUrl }) }).then(resp => { return resp.json() }).then(data => { if (data.errcode == 0) { //儲存本次獲取的accessToken localStorage.setItem("accessToken", data.access_token); localStorage.setItem("expires_accessToken", new Date().getTime() + data.expires_in * 1000); resolve(data.access_token); } }).catch(data => { reject(); }) }); },
View Code
-
獲取ticket
使用上一步驟獲取到的access_token獲取ticket,介面地址https://qyapi.weixin.qq.com/cgi-bin/get_jsapi_ticket?access_token=ACCESS_TOKEN
H5不能直接訪問,需要服務端通過代理訪問//author herbert QQ:464884492 getTicket() { return new Promise((resolve, reject) => { var ticket = localStorage.getItem("ticket"); var expires = localStorage.getItem("expires_ticket"); if (expires > new Date().getTime() - 2000) { resolve(ticket); return; } let ticketUrl = "https://qyapi.weixin.qq.com/cgi-bin/get_jsapi_ticket?access_token=" + localStorage.getItem("accessToken"); //fetch(ticketUrl, { method: "GET" }) fetch(this.porxyUrl, { method: "POST", body: JSON.stringify({ method: "GET", url: ticketUrl }) }).then(resp => { return resp.json() }).then(data => { if (data.errcode == 0) { //儲存本次獲取的accessToken localStorage.setItem("ticket", data.ticket); localStorage.setItem("expires_ticket", new Date().getTime() + data.expires_in * 1000); resolve(data.ticket); } }).catch(data => { reject(); }) }); },
View Code
-
生成簽名
文件地址 https://work.weixin.qq.com/api/doc#90000/90136/90506
需要將引數構造如下格式JSAPITICKET&noncestr=NONCESTR×tamp=TIMESTAMP&url=URL,然後做SHA1演算法獲取字串雜湊值。其中NONCESTR是一個隨機字串,URL不能包含#以及後邊的部分//author herbert QQ:464884492 getSignature(timestamp, ticket) { let url = window.location.href.split("#")[0]; let jsapi_ticket = "jsapi_ticket=" + ticket + "&noncestr=" + timestamp + "×tamp=" + timestamp.substr(0, 10) + "&url=" + url; this.printStatuInfo("簽名原始資訊:" + jsapi_ticket); let sha1Str = new jsSHA(decodeURIComponent(jsapi_ticket), "TEXT"); return sha1Str.getHash("SHA-1", "HEX"); }
View Code
-
初始微信配置資訊
根據前邊幾個步驟獲取的引數,初始微信配置資訊//author herbert QQ:464884492 wx.config({ beta: true,// 必須這麼寫,否則wx.invoke呼叫形式的jsapi會有問題 debug: false, // 開啟除錯模式,呼叫的所有api的返回值會在客戶端alert出來,若要檢視傳入的引數,可以在pc端開啟,引數資訊會通過log打出,僅在pc端時才會列印。 appId: wxUtils.groupId, // 必填,企業微信的corpID timestamp: timestamp.substr(0, 10), // 必填,生成簽名的時間戳 nonceStr: timestamp, // 必填,生成簽名的隨機串 signature: sig,// 必填,簽名,見附錄1 jsApiList: ["scanQRCode"] // 必填,需要使用的JS介面列表,所有JS介面列表見附錄2 });
View Code
-
呼叫api
初始完成後,需要立即呼叫api需要在 wx.ready函式中註冊回撥函式,如果是不立即呼叫可以忽略。以下為呼叫微信掃一掃功能//author herbert QQ:464884492 wx.scanQRCode({ desc: `scanQRCode desc`, needResult: 1, // 預設為0,掃描結果由企業微信處理,1則直接返回掃描結果, scanType: ["qrCode", "barCode"], // 可以指定掃二維碼還是一維碼,預設二者都有 success: function (res) { // 回撥 wxUtils.printStatuInfo("掃描資訊:" + JSON.stringify(res)); lblCostTime.innerText = "單次掃碼總共花費:【" + (new Date().getTime() - timeStar) + "】ms"; }, error: function (res) { if (res.errMsg.indexOf(`function_not_exist`) > 0) { alert(`版本過低請升級`) } } });
View Code
三、總結
H5整合微信JSSDK功能雖然簡單,但是該有的步驟一個都不能少。在最初開發中遇到了以下幾個問題:
-
獲取token與ticket存在跨域問題,需要配置一個代理完成
-
有時生成的簽名與官方有差別,官方提供了一個測試地址https://work.weixin.qq.com/api/jsapisign