uni.getWeRunData仅支持微信小程序环境,iOS/Android的H5、App端及支付宝小程序均不支持;必须真机调试、用户开启微信运动权限、授权后由后端解密encryptedData获取步数。

uni-app 调用微信运动步数必须用 uni.getWeRunData,且仅支持微信小程序环境
直接说结论:iOS 和 Android 的微信 App 内打开的 H5 页面、App 端(如 uni-app 打包的 iOS/Android App)、甚至支付宝小程序,都完全无法调用微信运动数据。只有在微信原生小程序环境(即 uni-app 编译为微信小程序后)才能走通 uni.getWeRunData。
常见错误现象:uni.getWeRunData is not a function(H5 或 App 端运行时)、errCode: -1(微信未授权或非小程序上下文)、静默失败无提示(未在真机微信中调试)。
- 必须使用真机微信扫码预览或体验版,开发者工具模拟器不返回有效加密数据
- 用户需已开启微信“运动健康”权限(路径:微信 > 我 > 设置 > 隐私 > 运动数据)
- 调用前必须已获取用户授权(
uni.authorize({scope: 'scope.werun'})),否则直接 fail - 该 API 返回的是加密数据,需后端用
session_key解密,前端无法直接解析步数
uni.getWeRunData 返回的 encryptedData 怎么解密
前端拿到的 encryptedData 是 AES-128-CBC 加密的 JSON 字符串,含 stepInfoList 数组(最近 7 天步数),但uni-app 前端不能也不应自行解密——因为需要 session_key,而它只应在服务端安全持有。
典型流程是:前端调用 uni.getWeRunData → 拿到 encryptedData + iv → 发给自己的后端 → 后端用从微信接口(https://api.weixin.qq.com/sns/jscode2session)换来的 session_key 解密。
公众号运营:文章发布至草稿、样式封面、评论与用户管理、数据统计等。用户要求将 Markdown 发送到公众号草稿、查看阅读量统计或类似后台操作时,使用本技能。
- 微信官方 Node.js 解密示例代码中,关键函数是
decryptData(encryptedData, iv, sessionKey) - 注意
iv是 base64 字符串,解密前需Buffer.from(iv, 'base64') - 解密后 JSON 结构里
stepInfoList[0].step是当天步数,单位为“步”,不是万步 - 若解密失败返回空对象或报错,大概率是
session_key过期(2 小时)或与当前登录态不匹配
为什么 uni.authorize({scope: 'scope.werun'}) 有时不弹窗
微信对 scope.werun 授权做了严格限制:它不能单独主动申请,必须和用户微信登录(uni.login)绑定使用,且需在登录成功后立即调用(建议在 uni.login 的 success 回调内触发)。
- 如果先调
uni.authorize再调uni.login,授权弹窗大概率被拦截或静默忽略 - 若用户之前点过“拒绝”,再次调用
uni.authorize不会再弹窗,需引导用户手动开启:微信 > 我 > 设置 > 隐私 > 运动数据 > 开启 - 注意
uni.authorize在 H5 端会直接 fail,不要做兜底逻辑(比如 fallback 到 mock 数据),避免误导用户 - 可配合
uni.getSetting提前检查是否已授权:res.authSetting['scope.werun'] === true
uni-app 微信小程序中调用完整链路示例(精简版)
以下是在 onLoad 中触发的最小可行逻辑,不含 UI 和错误重试:
uni.login({
success: loginRes => {
// 1. 登录成功后立即申请 werun 权限
uni.authorize({
scope: 'scope.werun',
success: () => {
// 2. 获取加密步数数据
uni.getWeRunData({
success: res => {
const { encryptedData, iv } = res;
// 3. 发送给后端解密(例如)
uni.request({
url: '/api/decrypt-werun',
method: 'POST',
data: { encryptedData, iv },
success: console.log
});
},
fail: err => console.error('getWeRunData fail:', err)
});
},
fail: () => console.log('未授权微信运动')
});
}
});
真正容易被忽略的是:这个流程依赖微信小程序基础库版本 ≥ 1.7.0,且 app.json 中需配置 "requiredPrivateInfos": ["werun"](2023 年起强制要求),否则真机上报 errCode: -2。


















