uni-app如何获取微信运动步数

云涛吖_8200

云涛吖_8200

2026-06-05

923人浏览

原创

不能在 uni-app 中直接用 uni.getwerundata 获取明文步数,必须通过用户点击 button 触发微信原生回调,再由后端解密 encrypteddata;该 api 仅限微信小程序,且调用必须处于用户点击的同步上下文。

直接说结论:不能在 uni-app 里用 uni.getwerundata 直接拿到明文步数,必须走「用户点击 button → 微信原生回调 → 后端解密」闭环,否则必报 errcode: -1 或静默失败。


为什么 uni.getWeRunData 在 onLoad / mounted 里调用一定失败

微信平台强制要求:调用 wx.getWeRunData(uni.getWeRunData 底层就是它)必须发生在用户真实点击的同步上下文中,不能是生命周期钩子、setTimeout、Promise.then、甚至 uni.$nextTick。

  • 常见错误现象:

    • 点击无反应,控制台没日志
    • 报错 getWeRunData:fail invalid operate
    • H5 或 App 端直接提示 not supported(因为该 API 仅限微信小程序)
  • 正确姿势只有一种:

    • 模板中写:<button open-type="getWeRunData">获取步数</button>
    • 方法里只做透传,不加任何异步包装
    • onGetWeRunData 必须是 click 事件的直接响应函数(不能被 debounce/throttle 包裹)

button open-type="getWeRunData" 的硬性限制和配置项

这个 button 不是普通按钮,是微信小程序的“特权组件”,有明确平台和行为约束:

  • 仅在 #ifdef MP-WEIXIN 下生效,H5/App 编译时自动剔除(不报错但不渲染)
  • 必须配置 scope.werun 权限:
    • manifest.json → 微信小程序 → 权限列表 → ✅ 勾选「微信运动」
    • 小程序后台「用户隐私保护指引」中必须声明“收集微信运动步数”,否则审核拒过
  • 用户首次点击会弹授权弹窗;拒绝后,再次点击需主动跳设置页,但注意:
    • uni.openSetting 只能在用户点击的同步回调里调用(不能放在 uni.getSetting 的 success 回调里)
    • 错误写法:uni.getSetting().then(() => uni.openSetting())
    • 正确写法:检测到未授权后,立即在点击 handler 内调用 uni.openSetting

encryptedData 解密失败的三个实际原因

前端拿到 e.detail.encryptedData 和 e.detail.iv 后,必须交由后端解密——微信不提供前端解密能力,也禁止 session_key 泄露。

  • 高频失败点:
    • session_key 过期或复用:每个 code 只能换一次 session_key,有效期约 2 小时;登录态要绑定用户并及时刷新
    • appid 不匹配:解密时用的 appid 必须和调用方小程序完全一致(测试号/正式号不能混用)
    • 服务器时间偏差 > 5 分钟:微信校验时间戳,Linux 服务器需定期执行 ntpdate ntp1.aliyun.com
  • 解密后数据结构:
    • 是 JSON 字符串,JSON.parse 后得对象
    • stepInfoList 是数组,按时间倒序:索引 0 是今天,30 是 30 天前
    • 当日步数取 stepInfoList[0].step(注意是 number,不是 string)

排行榜怎么做?别幻想前端聚合

uni.getWeRunData 只能读自己账号的 31 天数据,无法跨用户读取。所谓“排行榜”,本质是后端行为:

微信创作
微信创作

自动将 Markdown 文章转为适配微信公众号格式的 HTML,并批量发布至公众号草稿箱,支持封面图生成与专题管理。

下载
  • 用户每次成功解密后,前端上报:{ openid, step: stepInfoList[0].step, timestamp }

  • 后端存入数据库,按日期/周/月聚合统计

  • 前端请求排行榜接口(如 /api/rank?date=2026-05-28),返回已计算好的 topN 列表

  • 容易忽略的细节:

    • openid 必须和 session_key 来自同一 code,否则解密失败
    • 上报步数时,要校验时间戳是否在当日(避免篡改)
    • 若用户某天没走动,stepInfoList[0] 可能不存在,需 fallback 为 0

微信的限制不是 bug,是设计——所有环节都卡在“用户可控”和“服务端可信”两个锚点上。跳过 button、绕过后端解密、或想在 H5/App 里复用这套逻辑,都会卡死。

相关文章

微信app下载
微信app下载

微信是一款手机通信软件,支持通过手机网络发送语音短信、视频、图片和文字。微信可以单聊及群聊,还能根据地理位置找到附近的人,带给大家全新的移动沟通体验,有需要的小伙伴快来保存下载体验吧!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
python是前端还是后端
python是前端还是后端

Python属于前端也属于后端,其灵活性和丰富的生态系统使得开发人员能够在不同的领域中灵活运用。本专题为大家提供python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

2623

5

前端如何实现即时通讯
前端如何实现即时通讯

实现即时通讯的方法有WebSocket、Long Polling、Server-Sent Events、WebRTC等等。详细介绍:1、WebSocket,它可以在客户端和服务器之间建立持久连接,实现实时的双向通信,前端可以使用 WebSocket API来创建WebSocket连接,并通过发送和接收消息来实现即时通讯;2、Long Polling,是一种模拟实时通信的技术等等。

2023.10.09

5703

6

前端和后端的区别
前端和后端的区别

前端关注的是用户界面的设计和交互,而后端则注重数据处理和逻辑控制。想了解更多前端后端的相关内容,可以阅读本专题下面的文章。

2024.03.19

6690

13

php和前端的关联介绍
php和前端的关联介绍

php既可以作为前端语言,也可以作为后端语言。想了解更多php和前端的相关内容,可以阅读本专题下面的文章。

2024.03.22

6378

10

前端外包工作内容有哪些
前端外包工作内容有哪些

前端外包工作内容包括:1. 网站和应用程序开发;2. 用户界面和交互设计;3. 用户体验优化;4. 设计和视觉开发;5. 跨浏览器兼容性;6. 性能优化;7. 维护和更新;8. 项目管理和沟通。想了解更多前端的相关内容,可以阅读本专题下面的文章。

2024.05.22

903

5

微信是谁开发的
微信是谁开发的

微信是由张小龙所带领的腾讯广州研发中心产品团队打造开发的,并不是马化腾开发的,而腾讯公司总裁马化腾是在产品策划的邮件中确定这款产品的名称叫做“微信”的。想了解更多微信相关的内容,可阅读本专题下面的相关文章。

2024.11.05

5635

8

http与https有哪些区别
http与https有哪些区别

http与https的区别:1、协议安全性;2、连接方式;3、证书管理;4、连接状态;5、端口号;6、资源消耗;7、兼容性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.08.16

5450

6

Gradle插件开发入门教程
Gradle插件开发入门教程

本专题介绍Gradle插件开发的基本流程,涵盖插件类编写、自定义任务注册、扩展参数设计和插件应用方法,帮助你理解插件如何组织构建逻辑,减少多个项目之间的重复配置。

2026.10.22

20

11

Gradle Wrapper配置教程
Gradle Wrapper配置教程

本专题介绍Gradle Wrapper的基本作用,涵盖文件组成、生成方法、版本配置和任务调用,帮助你理解项目如何使用指定的Gradle版本,减少不同开发环境带来的构建差异。

2026.10.22

0

10

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
uni-app从入门到实战教程
uni-app从入门到实战教程

共0课时 | 0人学习

uni-app x harmony开发指南
uni-app x harmony开发指南

共0课时 | 0人学习

uni-app鸿蒙运行和发行
uni-app鸿蒙运行和发行

共0课时 | 0人学习