uni.getWeRunData需配置scope.werun权限并声明隐私用途,uni.openSetting须在用户主动操作同步回调中调用,encryptedData须由后端用有效session_key、匹配appid及时钟同步解密,排行榜数据须后端聚合计算。

uni-app 调用 uni.getWeRunData 前必须配置 scope.werun 权限
不配这个,uni.getWeRunData 会直接失败,连弹窗都不出现。配置位置在 HBuilderX 的 manifest.json → 微信小程序 → 权限列表 → 勾选「微信运动(scope.werun)」。注意:仅勾选还不够,还需在小程序后台的「用户隐私保护指引」中明确声明“收集微信运动步数”,否则审核大概率被拒。
用户拒绝授权后,uni.openSetting 打开设置页但没反应?
这是常见坑:微信限制了 uni.openSetting 的触发条件——它**只能在用户主动操作(如 button 点击)的同步回调里调用**,不能放在异步回调(如 uni.getSetting 的 success 里)或定时器中。正确写法是:
getWeRunData() {
if (!this.hasAuth) {
// 用户已拒绝 → 直接打开设置(在点击事件内)
uni.openSetting({
success: (res) => {
if (res.authSetting['scope.werun']) {
this.fetchSteps();
}
}
});
return;
}
this.fetchSteps();
}
- 别在
uni.getSetting回调里嵌套uni.openSetting - 别用
setTimeout或 Promise 包裹后再调用 - 安卓真机上若仍无响应,检查是否已开启「微信 > 设置 > 隐私 > 运动数据」系统级开关
解密 encryptedData 失败的三个高频原因
前端拿到 encryptedData 和 iv 后,必须交由后端用 session_key 解密。失败通常不是代码问题,而是环境或参数错位:
-
session_key过期:wx.login返回的 code 只能换取一次session_key,且有效期约 2 小时;不要缓存或复用旧的session_key - appid 不匹配:解密时用的
appid必须和调用uni.getWeRunData的小程序完全一致(包括测试号、正式号区分) - 时间戳偏差:微信要求解密时服务器时间与微信服务器时间误差不超过 5 分钟;Linux 服务器需定期
ntpdate ntp1.aliyun.com
解密成功后,stepInfoList 是倒序的:索引 0 是今天,30 是 30 天前。别用错下标。
排行榜数据聚合不能只靠前端拉取
每个用户调用 uni.getWeRunData 只能拿到自己的 31 天步数,无法跨账号读取他人数据。所谓“排行榜”,本质是后端行为:
- 用户每次获取步数后,前端把解密后的
stepInfoList[0].step(当日步数)+ 用户 openid 上报给服务端 - 服务端按日期 + openid 统计,再按当日/7 日/30 日聚合排序,返回 top N 列表
- 前端只负责渲染,不参与计算逻辑;否则会出现数据不一致、刷榜漏洞、性能卡顿
特别注意:微信运动数据本身不包含用户昵称/头像,这些字段需后端关联用户信息表补充,且要处理好隐私合规(如用户注销后及时脱敏)。











