微信新的用户信息接口wx.getUserProfile,返回信息解密失败

**关于微信小程序新登录接口wx.getUserProfile的使用方法
和手机号码有几率解密失败的解决办法**
自从2021年4月15号微信发布了小程序登录、用户信息相关接口调整说明之后,4.15之后上线的产品需更改用户登录逻辑,这是比较操*的,尤其是产品逻辑完善的项目更是想骂人

但奈何无法改变,那就只能尽快适应,所以我在这里分享一下新接口的写法

有不懂的可以留言评论或者私信,会第一时间回复

wx.getUserProfile({
	//新接口获取用户的开放信息(头像,昵称等,旧接口wx.getUserInfo获取
	//的信息皆为匿名)
	success:res=>{
		//用户头像
		//res.userInfo.avatarUrl
		//用户昵称
		//res.userInfo.nickName
		//调用完新接口后使用wx.login获取加密code
		wx.login({
			success:res=>{
				//这里是加密code
				//res.code

				//注意!!!!调用完wx.login之后还需调用旧接口
				//wx.getUserInfo并且必须按照这样的顺序,
				//不然会出现手机号码有几率解密失败的情况
				wx.getUserInfo({
					success:res=>{
						//res.encryptedData
						//res.iv

			//现在我们已经拿到了解密openid和手机号码的三个参数
			//然后请求服务端接口解密拿到值就可以编写我们的逻辑代码
					}
				})
			}
		})
	}
})


 

总结:手机号码有几率解密失败的解决办法:
        先调用wx.getUserProfile 
        再调用 wx.login 
        再调用 wx.getUserInfo
        顺序一定不能错,否则就会出现手机号码有几率解密失败的问题

总结:新接口替代旧接口获取用户信息:
        注意:只是用新接口替代旧接口获取用户信息,其他逻辑没变
        不要弄混了!!!不要弄混了!!!旧接口还是得使用
        原因看上面代码和上一个总结
 

有什么问题可以留言评论或者私信,博主会第一时间回复解决问题,觉得解决了各位的疑惑或者是解决了各位的Bug不妨点个赞收藏
————————————————
版权声明:本文为优快云博主「Mar_Kami」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.youkuaiyun.com/Mar_yuan/article/details/119994744

 另可参考微信开放社区的讨论:前端调用wx.getUserProfile将返回信息传给后端解密有时成功有时失败,怎么解决? 看了社区讨论本来想优化一下项目的接口,但是测试同事怕再出问题,所以就暂且没有直接优化成直接使用返回的明文信息的方式。

### 小程序 `wx.getUserProfile` 接口未弹出用户信息的原因分析 当调用 `wx.getUserProfile()` 后未弹出用户授权窗口,可能是由于以下几个常见原因引起: #### 1. **基础库版本过低** 如果当前运行的小程序所依赖的基础库版本低于 `2.10.4`,则可能无法正常支持 `wx.getUserProfile()` 接口的功能[^4]。 建议检查并升级至最新版基础库以确保兼容性。 #### 2. **用户已授权或拒绝权限** 如果用户此前已经在其他地方完成了对该小程序的授权,则再次调用 `wx.getUserProfile()` 可能不会重复弹窗提示。这种情况下,接口会直接返回缓存中的用户信息而不是重新请求授权[^3]。 可以通过以下方法确认用户的授权状态: ```javascript wx.getSetting({ success(res) { if (!res.authSetting['scope.userInfo']) { console.log('用户尚未授权'); } else { console.log('用户已授权'); } }, }); ``` #### 3. **接口参数配置错误** 在调用 `wx.getUserProfile()` 时,需传递正确的选项对象作为参数。缺少必要的字段可能导致接口行为异常。以下是标准调用示例: ```javascript wx.getUserProfile({ desc: '用于完善会员资料', // 声明获取用户信息的用途 success(res) { console.log('成功获取用户信息:', res); }, fail(err) { console.error('获取用户信息失败:', err); }, }); ``` 注意:`desc` 参数是必需的,描述应清晰说明为何需要收集这些数据[^1]。 #### 4. **后端解密逻辑问题** 即使前端能够正确调用 `wx.getUserProfile()` 并获得加密的数据 (`encryptedData`, `iv`),但如果后端未能正确解析这些数据,也可能表现为 “无响应” 或者看似未弹窗的情况。具体可参见某些特定版本下存在的 bug 报告[^4]。因此,在排查过程中也需要注意前后端联调的一致性。 #### 5. **微信官方策略调整** 自某次更新以来 (如提到的日期),部分旧有项目可能会遇到因政策变化而导致的新注册用户仅收到匿名化处理过的头像与名称 (“微信用户”, 默认灰图)[^5]。针对这种情况,开发者应当依据最新的文档指引补充额外的操作来显式触发更详细的个人资料读取动作。 --- ### 实现改进方案代码片段 为了应对上述各种潜在状况,可以采用如下综合性的实现方式: ```javascript // 判断是否有权访问userInfo function checkAuthAndFetchUserProfile(callback) { wx.getSetting({ success(res) { if (!res.authSetting['scope.userInfo']) { // 如果没有授权 wx.authorize({ // 主动发起授权申请 scope: 'scope.userInfo', success() { fetchUserProfile(callback); // 成功后再尝试拉取profile }, fail() { callback(new Error('用户拒绝授权')); }, }); } else { // 已经拥有授权 fetchUserProfile(callback); } }, }); } // 执行实际的getUserProfile调用 function fetchUserProfile(callback) { wx.getUserProfile({ desc: '优化您的体验/个性化推荐等目的', success(res) { callback(null, res); // 返回结果给回调函数 }, fail(err) { callback(err); // 失败情况反馈错误消息 }, }); } ``` --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值