getPhoneNumber按钮无响应,需确认企业主体、真实AppID及微信公众平台已开通权限;解密失败主因是session_key获取或使用错误;uni.getPhoneNumber已废弃,须用open-type按钮触发。

getPhoneNumber 按钮点不动?先确认 open-type 权限是否生效
按钮没反应、点击无授权弹窗,大概率不是代码写错了,而是权限卡在了微信侧。uni-app 的 open-type="getPhoneNumber" 是微信原生能力透出,必须满足三个硬性条件才能触发:
• 小程序账号是企业/政府/媒体类主体(个人号直接无权限)
• manifest.json 中配置的 AppID 是该企业账号下的真实 AppID(不能用测试号或他人 AppID)
• 微信公众平台「开发管理 → 接口权限」里已开通「获取手机号」权限(需管理员手动勾选并提交审核,非自动开通)
常见错误现象:getPhoneNumber:fail no permission,此时 console 里连 detail 都不会输出——说明根本没走到授权流程,别急着改前端逻辑。
detail.encryptedData 和 iv 拿到了,但后端解密失败?问题几乎全出在 session_key
前端拿到 encryptedData 和 iv 只是第一步,真正解密依赖服务端持有的 session_key。而这个 key 的来源和生命周期极易出错:
• session_key 必须由前端传来的 code 换取,调用的是微信接口 https://api.weixin.qq.com/sns/jscode2session,不是用 access_token
• code 必须是 uni.login({ provider: 'weixin' }) 成功回调里的,且每次最多用一次、5分钟过期
• 前端不能把 code 和 encryptedData 分两次请求发给后端;必须打包一起传,否则后端拿 code 换 session_key 时,code 可能已被其他请求消耗或过期
• 后端解密必须用 AES-128-CBC,且填充方式为 PKCS#7,任何语言库若默认用 PKCS#5 或不填 IV,都会解密失败
为什么不能直接用 uni.getPhoneNumber?它已被微信废弃
很多老教程还在用 uni.getPhoneNumber,但自微信基础库 2.21.2 起,该 API 已被移除,调用会直接报错 getPhoneNumber is not a function。当前唯一合规路径是:
• 用 触发授权
• 监听 @getphonenumber 事件获取加密数据
• 服务端完成解密并返回明文手机号
注意:用户拒绝授权时,detail.errMsg 是 getPhoneNumber:fail user deny,不是 fail:deny 或其他变体,判断要写准,否则逻辑分支错乱。
手机号快速验证组件要不要上?看你的预算和场景
微信 2023 年起将「手机号快速验证」转为付费组件(0.03 元/次),虽体验更好(免弹窗、支持无感),但对中小项目成本敏感:
• 开发调试阶段有 1000 次免费额度,够跑通流程
• 正式上线后若日活 1 万,每月仅此一项就超 900 元,且无法规避用户拒权场景
• 如果你已有稳定登录态(如 unionid + openid 绑定),建议优先走传统 getPhoneNumber 流程;只有强依赖“首次打开即绑定”且愿意付费的业务才值得接入
• 切记:快速验证组件仍需企业资质+权限开通,不是引入 SDK 就能用
最常被忽略的一点:session_key 不是长期有效的,也不是全局共享的。每个 code 换来的 session_key 只能解一次密,且有效期约 2 小时。别把它存进缓存当长期凭证用,也别试图复用别人家的 session_key——微信服务器会校验 encryptedData 中的 session_key 是否匹配生成时的原始值。











