写过了两个微信的页面,遇到了挺多不会的问题,当时也是自己边查资料,边实践完成了简单的需求,刚好现在有空,把之前的东西整理一遍。
与普通的手机页面不同的是,微信页面提供给你了调用微信APP内置功能的接口,可以实现更复杂的功能。
jssdk的前端使用
- 前端页面调用jssdk首先要通绑定“公众号设置”的“功能设置”里填写“JS接口安全域名”
- 然后在页面中引入http://res.wx.qq.com/open/js/...
- 调用 wx.config({...}) 来验证权限配置
- 然后可根据需要 调用微信所提供的接口
后端返回接口
在前端调用时wx.config({...})中需要的参数需要我们自己进行返回
wx.config({ debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。 appId: '', // 必填,公众号的唯一标识 timestamp: , // 必填,生成签名的时间戳 nonceStr: '', // 必填,生成签名的随机串 signature: '',// 必填,签名 jsApiList: [] // 必填,需要使用的JS接口列表 });
其中 timestamp
, nonceStr
, signature
,是需要后端计算返回的。
签名获取方法
签名生成规则如下:参与签名的字段包括noncestr(随机字符串), 有效的jsapi_ticket, timestamp(时间戳), url(当前网页的URL,不包含#及其后面部分) 。对所有待签名参数按照字段名的ASCII 码从小到大排序(字典序)后,使用URL键值对的格式(即key1=value1&key2=value2…)拼接成字符串string1。这里需要注意的是所有参数名均为小写字符。对string1作sha1加密,字段名和字段值都采用原始值,不进行URL 转义。
而其中的 jsapi_ticket 是通过 access_token 来获取的,且两者都有过期时间(7200秒)其中 jsapi_ticket 更是限制了获取次数。所以为了保存两者,使用redis数据库保存在内存中是个很好的选择(可快速读取,并设置过期时间)。
token获取方法:
/** * 获取token * @return {promise} res 值为token */ function getToken () { return redis.getVal('token') // 首先读取 redis 是否存在token .then(function (res) { if (res === null) { // 若不存在,则返回savetoken() 获取 // console.log('不存在token 调用saveToken') return saveToken () } else { // 若存在 则直接返回 // console.log('存在token 直接返回') return res } }) .catch(function (err) { // 捕获 错误 console.log(err) }) } /** * 从服务端获取token 并保存在redis中 * @return {promise} 值 为 token */ function saveToken () { return new Promise((resolve, reject) => { let reqUrl = config.gettoken_url // https://api.weixin.qq.com/cgi-bin/token"htmlcode">/** * 获取ticket * @return {promise} res 值为ticket */ function getJsTicket() { // 获取token return redis.getVal('ticket') // 首先读取 redis 是否存在ticket .then(function (res) { if (res === null) { // 若不存在,则返回saveJsTicket() 获取 // console.log('不存在ticket 调用saveJsTicket') return saveJsTicket () } else { // 若存在 则直接返回 // console.log('存在ticket 直接返回') return res } }) .catch(function (err) { // 捕获 错误 console.log(err) }) } /** * 从服务端获取ticket 并保存在redis中 * @return {promise} 值 为 ticket */ function saveJsTicket () { return new Promise((resolve, reject) => { getToken().then(function (token) { let reqUrl = config.ticket_start + token + config.ticket_end let options = { method: 'get', url: reqUrl } request(options, function (err, res, body) { if (res) { let bodys = JSON.parse(body) // 解析微信服务器返回的 let ticket = bodys.ticket // 获取 ticket let expires = bodys.expires_in // 获取过期时间 redis.setKey('ticket', ticket, expires) // 将ticket 保存到 redis .catch(function (err) { console.log(err) }) resolve(ticket) } else { reject(err) } }) }).catch(function (err) { console.log(err) }) }) }签名算法
在获取jsapi_ticket后就可以生成JS-SDK权限验证的签名了
/** * 1. appId 必填,公众号的唯一标识 * 2. timestamp 必填,生成签名的时间戳 * 3. nonceStr 必填,生成签名的随机串 * 4. signature 必填,签名 */ const crypto = require('crypto') const getJsTicket = require('./getJsTicket') const config = require('../../config') // 微信设置 // sha1加密 function sha1(str) { let shasum = crypto.createHash("sha1") shasum.update(str) str = shasum.digest("hex") return str } /** * 生成签名的时间戳 * @return {字符串} */ function createTimestamp () { return parseInt(new Date().getTime() / 1000) + '' } /** * 生成签名的随机串 * @return {字符串} */ function createNonceStr () { return Math.random().toString(36).substr(2, 15) } /** * 对参数对象进行字典排序 * @param {对象} args 签名所需参数对象 * @return {字符串} 排序后生成字符串 */ function raw (args) { var keys = Object.keys(args) keys = keys.sort() var newArgs = {} keys.forEach(function (key) { newArgs[key.toLowerCase()] = args[key] }) var string = '' for (var k in newArgs) { string += '&' + k + '=' + newArgs[k] } string = string.substr(1) return string } /** * @synopsis 签名算法 * * @param jsapi_ticket 用于签名的 jsapi_ticket * @param url 用于签名的 url ,注意必须动态获取,不能 hardcode * * @returns {对象} 返回微信jssdk所需参数对象 */ function sign (jsapi_ticket, url) { var ret = { jsapi_ticket: jsapi_ticket, nonceStr: createNonceStr(), timestamp: createTimestamp(), url: url } var string = raw(ret) ret.signature = sha1(string) ret.appId = config.appid return ret } /** * 返回微信jssdk 所需参数对象 * @param {字符串} url 当前访问URL * @return {promise} 返回promise类 val为对象 */ function jsSdk (url) { return getJsTicket() .then(function (ticket) { return sign(ticket, url) }) .catch(function (err) { console.log(err) }) } function routerSdk (req, res, next) { let clientUrl = req.body.url if (clientUrl) { jsSdk(clientUrl) .then(function (obj) { res.json(obj) }) } else { res.end('no url') } } module.exports = routerSdk以上基本就完成了后端返回签名的过程(省略了redis部分)。具体细节可参考我当时的练手项目中的代码。
至此,前端就可以使用jssdk来完成功能的调用了。
ps:某次使用录音接口做了一个功能,但是发现,微信服务器只会保存3天数据,需要自己下载到自己的服务器才行,不知道诸位有没做过类似的需求,给我提供下指导啥的,感激不尽~
后记
后来又写过一个获取用户信息的页面,感觉也是挺常用的就写个demo出来看看吧(没有做access_token的保存,好像是没有获取次数限制)。
router.get('/', function(req, res, next){ console.log("oauth - login") // 第一步:用户同意授权,获取code let router = 'get_wx_access_token' // 这是编码后的地址 let return_uri = encodeURIComponent(base_url + router) console.log('回调地址:' + return_uri) let scope = 'snsapi_userinfo' res.redirect('https://open.weixin.qq.com/connect/oauth2/authorize"get_wx_access_token") console.log("code_return: "+req.query.code) let code = req.query.code request.get( { url:'https://api.weixin.qq.com/sns/oauth2/access_token" <h1>"+userinfo.nickname+" 的个人信息</h1> <p><img src='"+userinfo.headimgurl+"' /></p> <p>"+userinfo.city+","+userinfo.province+","+userinfo.country+"</p> ") }else{ console.log(response.statusCode) } } ) }else{ console.log(response.statusCode) } } ) })以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线
暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。
艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。
《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。
更新日志
- 【雨果唱片】中国管弦乐《鹿回头》WAV
- APM亚流新世代《一起冒险》[FLAC/分轨][106.77MB]
- 崔健《飞狗》律冻文化[WAV+CUE][1.1G]
- 罗志祥《舞状元 (Explicit)》[320K/MP3][66.77MB]
- 尤雅.1997-幽雅精粹2CD【南方】【WAV+CUE】
- 张惠妹.2007-STAR(引进版)【EMI百代】【WAV+CUE】
- 群星.2008-LOVE情歌集VOL.8【正东】【WAV+CUE】
- 罗志祥《舞状元 (Explicit)》[FLAC/分轨][360.76MB]
- Tank《我不伟大,至少我能改变我。》[320K/MP3][160.41MB]
- Tank《我不伟大,至少我能改变我。》[FLAC/分轨][236.89MB]
- CD圣经推荐-夏韶声《谙2》SACD-ISO
- 钟镇涛-《百分百钟镇涛》首批限量版SACD-ISO
- 群星《继续微笑致敬许冠杰》[低速原抓WAV+CUE]
- 潘秀琼.2003-国语难忘金曲珍藏集【皇星全音】【WAV+CUE】
- 林东松.1997-2039玫瑰事件【宝丽金】【WAV+CUE】