微信小程序运动步数接口必须通过用户真实点击触发,且需后端用session_key解密encryptedData获取步数,其他平台需条件编译隐藏。

微信小程序运动步数接口在 uni-app 中不可用
uni-app 编译到微信小程序时,wx.getWeRunData 这个原生接口确实存在,但直接调用会失败——不是语法问题,而是微信平台对调用条件卡得极严:必须用户主动触发(如 button 点击),且不能在异步回调、定时器、生命周期钩子中隐式调用。uni-app 的 onLoad 或 mounted 里直接写 uni.getWeRunData(或通过 uni.$nextTick 延迟)基本都会报错 errCode: -1, errMsg: "getWeRunData:fail invalid operate"。
- 微信要求调用必须绑定在
<button open-type="getWeRunData"></button>上,且该 button 必须是用户真实点击(不能用click()模拟) - uni-app 的
<button></button>组件支持open-type="getWeRunData",但仅限微信小程序平台(H5/App 不生效) - 返回的加密数据必须用开发者服务器解密(微信不提供前端解密能力),密钥
session_key需从自己后端获取,不能硬编码或从前端传
正确调用流程:button + 后端解密闭环
不能跳过微信的 button 限制,也不能把解密逻辑放前端。标准链路是:用户点 button → 微信返回加密数据 → 传给自己的后端 → 后端用 session_key 解密 → 返回明文步数给前端。
- 模板中写:
<button open-type="getWeRunData">获取步数</button> - 方法中只做透传:
onGetWeRunData(e) { if (e.detail.errMsg === 'getWeRunData:ok') { uni.request({ url: 'https://your-api.com/decrypt-werun', method: 'POST', data: { encryptedData: e.detail.encryptedData, iv: e.detail.iv } }); } } - 后端需用对应用户的
session_key(来自登录态code2Session接口)调用微信官方解密方法(如 Node.js 的crypto.createDecipheriv) - 注意:
encryptedData是 base64 字符串,解密后是 JSON,字段stepInfoList是数组,最新一条的step即当日步数
常见报错与绕不过去的坑
很多开发者卡在“点了没反应”或“报 -1 错误”,本质是违反了微信的调用上下文约束,或者解密环节出错。
-
getWeRunData:fail scope unauthorized:小程序未在后台配置「微信运动」接口权限(登录 微信公众平台 → 开发管理 → 接口权限 → 添加「微信运动」) -
getWeRunData:fail invalid operate:button 不是用户真实点击(比如自动 click、在 onShow 里触发、用 view 模拟 button) - 解密后得到空对象或乱码:后端用了错误的
session_key(不同用户的 key 不能混用)、IV 长度不对(必须是 16 字节)、加密算法未用 AES-128-CBC - 步数始终为 0:微信运动数据有延迟(通常 T+1),且用户手机需开启「微信运动」并同步过健康数据(iOS 在「健康」App、Android 在「微信运动」设置里)
uni-app 条件编译与兼容处理
这个功能只存在于微信小程序,其他平台必须降级或隐藏。别用 process.env.UNI_PLATFORM === 'mp-weixin' 判断,uni-app 提供更稳妥的条件编译语法。
- 在 template 中用:
<button v-if="uni.getSystemInfoSync().platform === 'ios' || uni.getSystemInfoSync().platform === 'android'">…</button>❌ 错误,平台判断不准 - 正确写法(编译期剔除):
#ifdef MP-WEIXIN…#endif,这样 H5 和 App 构建时根本不会打包 button 节点 - JS 中判断运行环境:
if (uni.getProvider && uni.getProvider({service: 'oauth'})?.includes('weixin')) { ... }不可靠;应统一用uni.getSystemInfoSync().platform === 'devtools'(调试器)或直接依赖编译宏 - 务必加 loading 和错误提示:button 点击后禁用、显示“正在获取…”;解密失败时明确提示“请确认已开启微信运动并同步数据”
getWeRunData 是唯一公开的运动类接口,且仅限步数。别尝试找替代方案——没有合法的、无需用户授权的绕过方式。



















