获取步数授权
获取用户微信运动步数的前提是用户授权小程序访问他的微信运动数据。
微信对用户隐私有严格的控制,任何涉及用户隐私的敏感数据都需要用户同意后小程序才能获取。只有当用户点击“允许”后,小程序才能获取用户的微信运动数据。
小程序的用户授权在微信官方的“小程序开发文档”中有详细的介绍,
入口网址:https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/authorize.html
通过阅读“授权”小节内容,及该小节包含的各类 API 说明,如 wx.getSetting 等,我们可以整理出用户授权的逻辑如下:
调用 wx.getSetting 获取用户当前的授权状态;
如果用户还未授权过小程序读取微信运动数据,需要调用 wx.authorize 让用户授权读取微信运动数据;
如果用户拒绝小程序读取微信运动数据,需要提示用户在小程序设置界面(「右上角」 - 「关于」 - 「右上角」 - 「设置」)中允许我们访问微信运动数据;
如果用户已经授权小程序读取微信运动数据,则调用获取微信运动步数的 API ,获取用户的微信运动步数。
按上述思路实现用户授权的代码如下:
/**
* 用户授权读取微信运动数据
*/
authorizeWeRun(){
var that = this
//首先获取用户的授权状态
wx.getSetting({
success(res){
// console.log(res)
if(!res.authSetting['scope.werun']){
// 如果用户还未授权过,需要用户授权读取微信运动数据
wx.authorize({
scope: 'scope.werun',
success() {
//读取微信步数数据
that.getWeRunData()
},
fail() {
//如果用户拒绝授权,提示用户需要同意授权才能获取他的微信运动数据
wx.showModal({
title: '读取微信运动数据失败',
content: '请在小程序设置界面(「右上角」 - 「关于」 - 「右上角」 - 「设置」)中允许我们访问微信运动数据',
})
}
})
}else{
//如果用户已授权过,直接开始同步微信运动数据
//读取微信步数数据
that.getWeRunData()
}
}
})
},
调用微信运动步数 API
在用户授权同意小程序获取微信运动数据,我们就可以调用微信运动步数 API,来获取用户最近30天的微信运动步数。
微信运动步数 API wx.getWeRunData 的详细介绍请点击 图 14 中蓝框标出部分查看。
微信运动步数 API 的调用代码如下:
/**
* 获取微信运动数据
*/
getWeRunData(){
var that = this
wx.getWeRunData({
success(res){
console.log(res)
wx.cloud.callFunction({
name:'desrundata',
data:{
weRunData: wx.cloud.CloudID(res.cloudID) //直到云函数被替换
}
}).then(res=>{
console.log(res)
that.setData({
stepInfoList: res.result
})
})
}
})
},
调用微信运动步数 API 后,我们在微信开发者工具的调试器中可以看到 API 返回结果 weRunEncryptedData 的内容,
为了确保用户隐私数据的安全性,微信小程序的各类开放数据 API 返回到小程序手机端的数据都进行了加密,需要小程序手机端将这些数据发送到小程序服务端,在服务端解密。
这样的处理机制可以防止有人用技术手段在小程序手机端篡改数据,请阅读微信官方文档关于“开放数据校验与解密”小节的内容来更进一步的理解为什么可以防止数据篡改。
云调用直接获取开放数据
在微信官方文档“开放数据校验与解密”小节中,介绍了两种解密微信运动数据的方式开发者后台校验与解密开放数据” 的实现方式在本专栏源代码中也有完整实现,具体位置见小节开头的介绍。
在云开发中实现云调用直接获取开放数据,首先需要建立一个云函数。云函数 index.js 的具体代码如下:
// 云函数入口文件
const cloud = require('wx-server-sdk')
cloud.init()
const db = cloud.database()
// 云函数入口函数
exports.main = async (event, context) => {
// 根据用户提交的cloudid 获取对应的运动数据
let weRunData = event.weRunData
//同步运动数据
let res = await GrowthValue(weRunData.data.stepInfoList)
return weRunData.data.stepInfoList
}