微信步数获取的背景
微信步数是指用户在微信运动中记录的步数数据。微信提供了开放能力,允许第三方应用获取用户授权后的微信步数数据,以便进行进一步的数据分析和展示。使用时报错: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;// 解密步数数据并进行进一步处理}
});
数据解密和处理
由于微信步数数据是加密的,需要使用解密算法对数据进行解密。解密后的数据包括步数、时间戳等信息,可以根据需求进行进一步的数据处理和展示。有两种揭秘方式。
后端解密
将得到的数据传递给后台,由后台调用微信服务端接口解密
前端解密
云函数获取微信步数
通过cryptojs解密encryptedData,获取微信步数
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 = appIdthis.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} })
注意
用户的微信步数数据可能因为用户关闭微信运动或隐私设置而无法获取。
用户的微信步数数据不会实时更新。
这里有一篇持续更新的文章