首页 > 热点 > 微信 > 正文

基于nodejs的微信JS-SDK简单应用实现

2024-07-22 01:18:21
字体:
来源:转载
供稿:网友

2015 是 Hybrid App 崛起之年 ,Web App 和 Native App 各有其强大之处,也有着致命的缺点,人们一边追求native流畅的用户体验,一边同时期望产品能够快速的迭代更新,Hybrid 成为必然的趋势。

鹅厂一马当先,发布了业内震惊一时的 JS-SDK , 这对于基于微信的h5开发者来说简直是如降甘露,从此开发者们告别了用箭头来提示右上角可以分享,并且随时可以使用微信的原生能力,微信变成了一个超级浏览器。

一、准备工作

1.在微信公众平台申请测试账号,并设置好好 JS 接口安全域名 (注:域名必须可以外网访问)

2.查看微信开发者文档

二、开始编码

使用微信 sdk 必须自己实现微信的签名算法。

大概需要4个步骤:

1.获取access_token;

2.根据access_token 获取jsapi_ticket

3. 根据 appId(公众号唯一id)、noncestr(随机字符串)、timestamp(时间戳)、url(当前页面完整url,不包括#aaa=bbb) 通过sha1算法签名

4.将信息返回给前端 , 设置wx.config。

由于获取access_token 和jsapi_ticket 的接口都有访问限制,所以明确指出需要第三方做缓存处理。此处我们缓存jsapi_ticket 就可以了。

/config/wechat.cfg.js

module.exports = {  grant_type: 'client_credential',  appid: 'xxxxxxxxxxxxxxx',  secret: 'xxxxxxxxxxxxxxxxxxxxxxxxxx',  noncestr:'Wm3WZYTPz0wzccnW',  accessTokenUrl:'https://api.weixin.qq.com/cgi-bin/token',  ticketUrl:'https://api.weixin.qq.com/cgi-bin/ticket/getticket',  cache_duration:1000*60*60*24 //缓存时长为24小时}

最主要部分是签名:

signature.js

var request = require('request'),  cache = require('memory-cache'),  sha1 = require('sha1'),  config = require('../config/wechat.cfg');exports.sign = function (url,callback) {  var noncestr = config.noncestr,    timestamp = Math.floor(Date.now()/1000), //精确到秒    jsapi_ticket;  if(cache.get('ticket')){    jsapi_ticket = cache.get('ticket');    console.log('1' + 'jsapi_ticket=' + jsapi_ticket + '&noncestr=' + noncestr + '×tamp=' + timestamp + '&url=' + url);    callback({      noncestr:noncestr,      timestamp:timestamp,      url:url,      jsapi_ticket:jsapi_ticket,      signature:sha1('jsapi_ticket=' + jsapi_ticket + '&noncestr=' + noncestr + '×tamp=' + timestamp + '&url=' + url)    });  }else{    request(config.accessTokenUrl + '?grant_type=' + config.grant_type + '&appid=' + config.appid + '&secret=' + config.secret ,function(error, response, body){      if (!error && response.statusCode == 200) {        var tokenMap = JSON.parse(body);        request(config.ticketUrl + '?access_token=' + tokenMap.access_token + '&type=jsapi', function(error, resp, json){          if (!error && response.statusCode == 200) {            var ticketMap = JSON.parse(json);            cache.put('ticket',ticketMap.ticket,config.cache_duration); //加入缓存            console.log('jsapi_ticket=' + ticketMap.ticket + '&noncestr=' + noncestr + '×tamp=' + timestamp + '&url=' + url);            callback({              noncestr:noncestr,              timestamp:timestamp,              url:url,              jsapi_ticket:ticketMap.ticket,              signature:sha1('jsapi_ticket=' + ticketMap.ticket + '&noncestr=' + noncestr + '×tamp=' + timestamp + '&url=' + url)            });          }        })      }    })  }}            
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表