access_token是須要2小時更新一次,在這裏,又引入了一個2小時獲取一次的字段,這個字段是: jsapi_ticket,這個字段是接入sdk的前提。與access_token相似,它也是須要2小時內從新獲取,因此也須要一個相似於獲取access_token的定時器來實時更新並保存sdk。前端
微信提供一個獲取接口,'https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=[access_token]&type=jsapi'ajax
這是一個get請求的接口,該請求url須要查詢參數access_token,該請求返回jsapi_ticket, 而後咱們須要保存到咱們的數據庫,與access_token同理,在咱們接入sdk時,查詢出這個jsapi_ticket供咱們使用。算法
就像接入微信服務器那樣,若是想要接入sdk,就必需要進行微信服務器與本地服務器的一次通訊驗證。簽名的算法如文檔所示:數據庫
在這裏,注意一下幾點:json
四個字段的字段排序是按照 鍵 的asc碼,並非值的。api
url必須是發起該請求的完整url,不包括hash部分。數組
接入sdk須要在微信後臺管理界面配置好接口安全域名,同受權域名同樣安全
後臺接口咱們定義爲post接口,接收一個參數url爲發起請求的完整url。服務器
1. 時間戳10位字符串(最多10位,被坑過,Date.now()出的字串是13位,取最後10位)微信
2. 自定義字符串:隨便定義
3. 獲取到 jsapi_ticket
4. 取到url
5. 進行鍵的排序
6. 根據鍵的排序順序按文檔所示格式拼接以上4個字符串
7. sha1簽名進行簽名
8. 將微信appid、隨機字符串、時間戳、簽名一塊兒返回給前端,進行配置。
joinSdk: function (req, res) { // 獲取jsapi_ticket weixinUtil.getJsApiTicket(function (jsapiTicket) { var jsapi_ticket = jsapiTicket var timestamp = Date.now().toString().slice(-10) var noncestr = 'WlddIECldl48D3' var url = req.body.url // 數據存儲對象 var data = { jsapi_ticket: jsapi_ticket, timestamp: timestamp, noncestr: noncestr, url: url } // 鍵數組排序 var baseArr = ['jsapi_ticket', 'timestamp', 'noncestr', 'url'].sort() var str = '' for (var i= 0; i < 4; i ++) { str += baseArr[i] + '=' + data[baseArr[i]] + '&' } str = str.slice(0, -1) var signature = sha1(str) res.json({code: 100, data: { sdk_appId: config.weixinConfig.appId, sdk_timestamp: timestamp, sdk_noncestr: noncestr, sdk_signature: signature }}) }) }
<script src="http://res.wx.qq.com/open/js/jweixin-1.2.0.js"></script> <script> $.ajax({ url: '/weixin/joinSdk', type: 'post', body: {url: location.href} }).then(function (res) { if (res.code == 100 ) { var config = res.data wx.config({ debug: false, appId: config.sdk_appId, timestamp: config.sdk_timestamp, nonceStr: config.sdk_noncestr, signature: config.sdk_signature, jsApiList: ['onMenuShareTimeline', 'onMenuShareAppMessage'] }) wx.ready(function () { //... }) } } ) </script>
注:在測試號中,微信接入sdk分享,二次分享會接入失敗,報錯 須要關注公衆號,形成接入sdk失敗,分享的配置也失效。這個在線上公衆號是不會有問題的,這個問題以前困擾了很久。太坑了。
sdk接入失敗,大部分是簽名的問題,能夠對照文檔檢查。