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接入失败,大部分是签名的问题,能够对照文档检查。