相信很多小伙伴之前用的接口是uni.getUserInfo来获取微信用户信息,但自4月13日起这个接口的返回参数不变,但开发者获取的userInfo为匿名信息

(详情:小程序接口调整说明
在这里插入图片描述

本人觉得这个更改虽然让接口的功能更加专注,但官方没有实现向下兼容,导致很多开发者需要费点心重新修改。

新版接口自那时起就新增uni.getUserProfile来获取用户信息,这让用户多了一个手动授权的步骤。

在这里插入图片描述

弹窗授权截图↓
在这里插入图片描述

一、uni.getUserProfile的必要参数

使用前我们先来看看这个接口需要哪些参数

在这里插入图片描述
重点留意的就是 descsuccess 这两个重要参数,千万不要忘了加 desc!!!

success回调函数中就可以写我们的ajax请求向后端传送加密信息和code和用户信息等内容

示例代码如↓

uni.getUserProfile({
	desc:'获取微信用户的昵称与头像',
	success:function(resp){
		let nickName = resp.userInfo.nickName;
		let avatarUrl = resp.userInfo.avatarUrl;
		//console.log(nickName);
		//console.log(avatarUrl);
		let data={
			nickname:nickName,
			photo:avatarUrl
		};
		uni.request({
			"url": url, 
			"method": "POST", 
			"header": { 
				token: uni.getStorageSync('token') 
			},
			"data": data, 
			success: function(resp) {
				
			}
		});
	}								
})

二、uni.login和uni.getUserProfile的调用顺序

在实际开发的过程中,很多同学会选择在uni.login中包裹uni.getUserProfile,来保证获取code和获取的encryptedData顺序,从而避免解密失败

但实际上在调用uni.login获取code后,再调用uni.getUserProfile,可能会失败,触发fail函数,error msg: ''getUserProfile:fail can only be invoked by user TAP gesture"。所以正确的调用顺序是先调用uni.getUserProfile在其中包裹uni.login

示例代码如↓

uni.getUserProfile({
	desc:'获取微信用户的昵称与头像',
	success:function(resp){
		uni.login({
			success:function(res){
				let code = res.code;
				//console.log(res.code);
				let nickName = resp.userInfo.nickName;
				let avatarUrl = resp.userInfo.avatarUrl;
				//console.log(nickName);
				//console.log(avatarUrl);
				let data={
					code:code,
					nickname:nickName,
					photo:avatarUrl,
					registerCode:that.registerCode
				};					
				uni.request({
					"url": url, 
					"method": "POST", 
					"header": { 
					token: uni.getStorageSync('token') 
				},
				"data": data, 
				success: function(resp) {
				
				}
		});
			},
			fail:function(){
				console.log("fail use getUserProfile");
			}
		})						
	}
})

三、方法更新

上面的方法我看到有同学留言说用不了,我试过还是能用的,为了适配大多数同学,我这里再给出一个方法来获取,不再嵌套使用,还是正常先调用 uni.login 再调用 uni.getUserProfile 方法但这里需要注意!在微信开发者工具中测试时需要以真机调试才能获取用户资料!!

uni.login({
	provider: 'weixin',
	success: function(resp) {
		let code = resp.code;
			that.code=code
	}
});
uni.getUserProfile({
	desc: '获取用户信息',
	success: function(resp) {
		let nickName = resp.userInfo.nickName;
		let avatarUrl = resp.userInfo.avatarUrl;
		// console.log(nickName);
		// console.log(avatarUrl);
		let data = {
			code: that.code,
			nickname: nickName,
			photo: avatarUrl,
			registerCode: that.registerCode
		};
		uni.request({
			"url": url, 
			"method": "POST", 
			"header": { 
				token: uni.getStorageSync('token') 
			},
			"data": data, 
			success: function(resp) {
				
			}
		});
	}
});

本次分享到此结束,有问题的欢迎评论区留言!

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐