微信步数是指用户在微信运动中记录的步数数据。微信提供了开放能力,允许第三方应用获取用户授权后的微信步数数据,以便进行进一步的数据分析和展示。使用时报错:fail api scope is not declared in the privacy agreement。出现这些问题是因为 隐私政策 需要更新!!!
去小程序后台设置-服务内容声明里补充用户隐私协议,用到的api都需要加上,然后审核通过后再试试,如果还不行,重新提交发版小程序试试。
要获取用户的微信步数数据,首先需要用户的授权。在UniApp中,可以使用uni.login()
函数获取用户的登录凭证,然后将该凭证发送到后台服务器,再由后台服务器向微信服务器请求用户的授权。
uni.login({
success: res => {
if (res.code) {
// 将res.code发送到后台服务器
}
}
});
后台服务器收到用户的res.code
后,可以使用微信提供的登录凭证校验接口,获取用户的openid
。然后,通过获取的openid
,再向微信服务器请求步数授权。
wx.getWeRunData({
success: res => {
const encryptedData = res.encryptedData;
const iv = res.iv;
// 解密步数数据并进行进一步处理
}
});
开发者可以通过 wx.openSetting
接口来打开小程序设置界面引导用户授权并返回用户的设置结果。
wx.openSetting({
success (res) {
console.log(res.authSetting)
// res.authSetting = {
// "scope.userInfo": true,
// "scope.userLocation": true
// }
}
})
注意:
2.3.0 版本开始,用户发生点击行为后,才可以跳转打开设置页,管理授权信息。
// 方法1:使用 button 组件来使用此功能,示例代码如下:
// 方法2:由点击行为触发wx.openSetting接口的调用,示例代码如下:
openSetting() { wx.openSetting() }
// js
const getWXSteps = async (e) => {
if (props.complateStatus.we_run_status) return
wx.getWeRunData({
async success(res) {
let data = await updateDdWeRunData(res)
if (!data || !data.we_run_status) return
showSet.value = false;
emits('updateTaskSchedule', true);
},
fail(res) {
if (res.errno === 104 || (Object.keys(res).length == 1)) Toast('授权失败!', { duration: 1000 });
let err = "getWeRunData:fail auth deny";
let err_code = -12006;
if (res.errMsg === err) {
showSet.value = true
}
}
});
};
const settingBack = async (res) => {
if (res.detail.authSetting['scope.werun']) {
getWXSteps()
} else {
Toast('授权失败!', { duration: 1000 });
}
}
// html
{{ props.complateStatus.we_run_status ? ' 已授权' : '去授权' }}
由于微信步数数据是加密的,需要使用解密算法对数据进行解密。解密后的数据包括步数、时间戳等信息,可以根据需求进行进一步的数据处理和展示。有两种揭秘方式。
将得到的数据传递给后台,由后台调用微信服务端接口解密
1.安装 npm install crypto-js
2.在utils下创建WXDataCrypt.js文件
// 引入CryptoJS var Crypto = require('cryptojs/cryptojs.js').Crypto; var app = getApp(); function WXDataCrypt(appId, sessionKey) { this.appId = appId this.sessionKey = sessionKey } WXDataCrypt.prototype.decryptData = function (encryptedData, iv) { // base64 decode :使用 CryptoJS 中 Crypto.util.base64ToBytes()进行 base64解码 var encryptedData = Crypto.util.base64ToBytes(encryptedData) var key = Crypto.util.base64ToBytes(this.sessionKey); var iv = Crypto.util.base64ToBytes(iv); // 对称解密使用的算法为 AES-128-CBC,数据采用PKCS#7填充 var mode = new Crypto.mode.CBC(Crypto.pad.pkcs7); try { // 解密 var bytes = Crypto.AES.decrypt(encryptedData, key, { asBpytes:true, iv: iv, mode: mode }); var decryptResult = JSON.parse(bytes); } catch (err) { console.log(err) } if (decryptResult.watermark.appid !== this.appId) { console.log(err) } return decryptResult } module.exports = WXDataCrypt
3.解密信息的js页面
const app = getApp() let WXDataCrypt= require('../../utils/WXDataCrypt.js'); let AppId = '你的appid' let AppSecret = '你的appsecrect' let session_key = '微信session_key' let stepInfoList = [] //获取步数 const getRunData = () => { var pc = new WXDataCrypt(AppId, session_key) wx.getWeRunData({ success: function (res) { var data = pc.decryptData(res.encryptedData , res.iv) console.log('解密后 data: ', data) stepInfoList = data.stepInfoList } })
用户的微信步数数据可能因为用户关闭微信运动或隐私设置而无法获取。
用户的微信步数数据不会实时更新。
这里有一篇持续更新的文章