前言
获取微信运动数据这个API很早就在微信小程序里支持了,相信大家在很多小程序里都见过用这个步数数据来开发的一些玩法。比如:步数换积分,步数排行榜,步数捐助等等。这一小节,我们就来实战一下在uniCloud云函数中读取并解码微信运动步数数据。
获取微信运动步数
此API可以获取用户过去三十天微信运动步数。使用前需要先调用 wx.login 接口。
调用方法:
wx.login({
success:()=>{
wx.getWerunData({
success:(res)=>{
console.log(res);
}
})
}
})
success回调中res的数据结构
属性 | 类型 | 说明 |
---|
encryptedData | string | 包括敏感数据在内的完整用户信息的加密数据,详细见加密数据解密算法。解密后得到的数据结构见后文 | iv | string | 加密算法的初始向量,详细见加密数据解密算法 |
通过这个API拿到的数据并不能直接使用,需要我们在云端解密。如果使用uniCloud腾讯云服务,那么解密非常简单。不过由于本课程中使用的都是uniCloud阿里云,所以我们接下来就学习如何解密这些数据。
uniCloud云函数解密微信步数
在云函数目录下新建一个云函数decryptwerun
根据微信官方文档中对解密的描述
我们可以得知,除了刚才getWerunData 中获得的iv 和encryptedData 外,还需要用code2session 接口先换到session_key ,在实战1:以小程序用户id建立会员系统中我们也已经学到过了,所以这个解密云函数要接受三个参数。
const { encryptedData,iv,code } = event;
首先用code 换取session_key
const res = await uniCloud.httpclient.request('https://api.weixin.qq.com/sns/jscode2session?appid=你的小程序appid&secret=你的小程序secret&js_code='+code+'&grant_type=authorization_code',{ dataType:'json'});
const session_key = res.data.session_key;
const buf_session_key = new Buffer(session_key, 'base64');
const buf_encryptedData = new Buffer(encryptedData, 'base64');
const buf_iv = new Buffer(iv, 'base64')
然后我们使用crypto.js 来帮我们解密数据
var crypto = require('crypto');
try {
var decipher = crypto.createDecipheriv('aes-128-cbc', buf_session_key, buf_iv);
decipher.setAutoPadding(true);
var decoded = decipher.update(buf_encryptedData, 'binary', 'utf8');
decoded += decipher.final('utf8');
decoded = JSON.parse(decoded);
console.log(decoded);
}catch(err){ }
前端调用此云函数
btnGetWerun(){
wx.login({
success: (res) => {
const code = res.code;
wx.getWeRunData({
success: (res) => {
uniCloud.callFunction({
name:"decryptwerun",
data:{
code:code,
iv:res.iv,
encryptedData:res.encryptedData
},
success:(res)=>{
console.log(res);
}
})
}
})
}
})
}
现在,我们已经成功获得了过去31天的微信运动步数数据,最新一天的数据在stepInfoList 数组中最后一条
timestamp 为步数最后更新的时间戳,step 为当日步数。
小结
解码看上去很复杂,其实官方文档还是写得很清楚的。拿到步数之后,要怎么用,就看大家的创意了。我在2017年开发的社区小程序里设计过一个小区运动达人排行榜,每天需要用户来签到上传步数,然后统计一个月的总步数来做排名。
|