小程序授权
部分接口需要经过用户授权统一才能调用,此类接口调用时:
- 如果用户未接受或拒绝过此权限,会弹窗询问用户,用户点击同意后方可调用接口
- 如果用户已授权,可以直接调用接口
- 如果用户已拒绝授权,则不会出现弹窗,而是直接进入接口 fail 回调(如果用户禁止授权,提示用户必须授权,并提示如何开启授权)
获取用户授权设置
使用wx.getSetting(Object object)获取用户的当前设置。返回值中只会出现小程序已经向用户请求过的权限
提前发起授权请求
使用wx.authorize(Object object)提前向用户发起授权请求。调用后会立刻弹窗询问用户是否同意授权小程序使用某项功能或获取用户的某些数据,但不会实际调用对应接口。如果用户之前已经同意授权,则不会出现弹窗,直接返回成功。
示例代码:
// 可以通过 wx.getSetting 先查询一下用户是否授权了 "scope.record" 这个 scope
wx.getSetting({
success(res) {
if (!res.authSetting['scope.record']) {
wx.authorize({
scope: 'scope.werun',
success () {
// 用户已经同意小程序授权微信步数功能,后续就不再弹窗提醒
console.log('获取用户微信步数')
},
fail(){
// 如果用户取消授权,提示用户需要授权才可使用,并提示如何开启授权
wx.showModal({
title: '读取微信运动失败',
content: '请在小程序右上角[设置]中开启授权'
)}
})
}
}
})
接口如果涉及敏感数据,接口的明文内容将不包含这些敏感数据。开发者如需要获取敏感数据,需要对接口返回的加密数据(encryptedData) 进行对其解密。
云调用直接获取开放数据
- 获取cloudID
- 调用云函数
wx.cloud.callFunction({
name: '创建的云函数',
data: {
weRunData: wx.cloud.CloudID('CloudID'),// 这个 CloudID 值到云函数端会被替换
}
})
在创建的云函数中收到的event中将获取到的开放数据返回
exports.main = async (event, context) => {
let weRunData = event.weRunData
return weRunData.data.stepInfoList
}
const cloudID = res.cloudID
wx.cloud.callFunction({
name: '创建的云函数',
data: {
weRunData: wx.cloud.CloudID(cloudID) // 这个 CloudID 值到云函数端会被替换
}
}).then(res =>{
//在这里就可以获取到被解密的数据了
console.log(res)
})
在云函数中同步微信运动数据(防止他人恶意修改数据)
在云函数中操作数据库要使用await配合async
- 根据(微信运动日期)字段查询用户的成长记录
- 如果不存在,则添加新记录
- 如果存在,判断(步数)字段是否增加
- 增加则更新数据记录
通过cloud.getWXContext() 可以获取到OPENID和APPID
db.serverDate(), // 获取这条记录插入到数据库的时间
// 同步微信运动数据
function GrowthValue(weRunData){
const context = cloud.getWXContext() // 这里获取到的 OPENID和APPID
weRunData.forEach(async item=>{
// 根据微信运动时间和当前用户id字段为条件查询用户的成长值
let queryResult = await db.collection('user_growth_value').where({
timestamp: item.timestamp,
openid: context.OPENID
}).get()
// 如果集合中不存在此日期的运动数据,则添加
if(!queryResult.data.length<=0){
await db.collection('user_growth_value').add({
data:{
_openid:context.OPENID,
date:db.serverDate(), // db.serverDate() 获取记录插入到数据库的时间
changeGrowthValue: item.step,
operation:'微信运动',
timestamp: item.timestamp,
orderId:'',
noteId:''
}
})
}else{
// 如果集合中存在此日期的运动数据,就更新记录
// 如果当前的步数大于数据库中存储的步数就更新
if(item.step>queryResult.data[0].changeGrowthValue){
await db.collection('user_growth_value').doc(queryResult.data[0]._id).update({
data:{
changeGrowthValue:item.step, //更新的步数字段
date:db.serverDate() // 更新日期
}
})
}
}
});
}