微信小程序获取用户手机号异常的问题解决

博客讲述了在微信登录过程中遇到的秘钥错误,特别是由于秘钥过于新导致的解密失败问题。开发者发现,当用户授权获取手机号时,如果在短时间内调用登录以防止秘钥过期,后台解密会报错。作者推测这可能是由于微信秘钥系统更新与接口调用之间的时间差导致。建议避免在获取手机号的按钮中直接调用登录,而是遵循正确的流程以防止此类错误发生。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 错误为:Given final block not properly padded. Such issues can arise if a bad key is used during decryption.

错误原因有两个:

1.key太新了(对的你没看错,就是太新了)

2.key太旧了

太旧的问题好解决,直接调用wx.login,拿到新的key就行了。

重点来了,Key太新的问题。出错的原因是这样的:用户在授权头像等信息的时候,我们继续获取用户手机号,开发防止key过期(5分钟过期),进行login,此时后台java通过解密获取手机号的时候会报错。本人认为,微信的秘钥系统已经生成新的秘钥,但是你login到调用接口,过程很短,微信平台尚未将key统一导致的问题(个人猜测千万不要在获取手机号的按钮里面调用登录!!!!!

基本的流程是这样子的:

### 实现微信小程序获取用户手机号和昵称 #### 获取用户手机号 为了在微信小程序中安全有效地获取用户手机号,需遵循特定的流程。当用户同意提供其电话号码时,前端会触发`bindgetphonenumber`事件并获得一个动态令牌`code`[^1]。此`code`随后被传递至开发者后台,在那里通过调用微信官方API——即`phonenumber.getPhoneNumber`接口来交换真实的手机号码信息。值得注意的是,每一个`code`的有效期限为5分钟,并且仅能使用一次。 然而,在实际应用过程中可能会遇到一些挑战,比如有时`getPhoneNumber`函数返回的`code`可能为空或无效的情况[^2]。针对这类问题,建议检查网络连接状态以及确保所使用的SDK版本是最新的;另外也要注意处理异常情况下的用户体验设计,例如提示用户重新尝试操作或是引导他们手动输入联系方式作为替代方案。 以下是用于发起请求以获取用户手机号的部分JavaScript代码片段: ```javascript // 前端部分:监听按钮点击事件并发送带有code的数据给后端 wx.login({ success(res) { if (res.code) { wx.request({ url: 'https://yourserver.com/getPhone', // 后端接收地址 method: "POST", data: { js_code: res.code }, header: {'content-type': 'application/json'}, success(result){ console.log('成功获取手机号:', result.data.phoneNumber); } }); } else { console.error('登录失败!' + res.errMsg); } } }); ``` 对于后端而言,则需要利用接收到的`js_code`去访问微信公众平台提供的开放接口完成最终的信息解析工作。 #### 获取用户昵称与头像 要取得用户的公开资料如昵称和头像图片链接,可以借助于`wx.getUserProfile()` API 函数[^3]。该方法会在执行前显示一个权限申请对话框让用户确认是否愿意分享个人信息。一旦得到许可响应,就能从中读取所需字段了。 下面是一段简单的示例代码展示怎样正确地调用这个功能: ```javascript try { const userProfile = await wx.getUserProfile({ desc: "用于完善会员资料" }); // 用户按下了允许按钮之后的操作逻辑 console.log(userProfile.userInfo.nickName); // 昵称 console.log(userProfile.userInfo.avatarUrl); // 头像URL } catch(error) { // 如果用户拒绝授权则进入这里 console.warn("用户取消了授权"); } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值