微信的授权规则总是在变,所以需要经常关注新消息!
之前的getUserInfo API和通过button的open-type获取都已经不支持了。
所以就要用到另一个新的api来获取用户信息,getUserProfile。
下面是我得示例:
var parames = {}
let types = 'weixin';
let that = this
uni.getUserProfile({ //获取用户信息
desc:'登录', //声明获取用户个人信息后的用途
lang : 'zh_CN', //指定返回用户信息的语言
success:(res)=>{
var infos = res;
if(!infos.userInfo.openId){ //判断参数中是否带有openid
uni.login({ //没有就获取code
provider: types,
success: (loginRes) => {
console.log("App获取用户信息成功",loginRes);
wxLogin(loginRes.code).then(res=>{ //然后调取后台接口获取
if(res.code==200){
infos.userInfo.openId = res.data;
parames = this.dealParams(types,infos);//生成参数调用接口注册用户
that.loginWeixinData(parames);
}else{
setTimeout(()=>{
uni.showToast({ title: res.desc?res.desc:'请求错误', icon: 'none' })
},400)
}
})
},
fail:(err) => {
uni.showToast({ title: '失败', icon:'none'})
}
})
}else{ //有的话就直接生成参数调用接口注册用户
parames = this.dealParams(types,infos)
that.loginWeixinData(parames);
}
},
fail:(err)=>{
console.log(err);
}
})
//小程序一键登录
loginWeixinData(data){
loginByOpenId(data).then(res => {
if(res.code==200){
this.$util.setStorage('userinfo',JSON.stringify(res.data))
if(res.data.token){
this.$util.setStorage('token',res.data.token)
}
uni.navigateBack({ delta: 1 })
}else{
uni.showToast({ icon: 'none', title: res.desc?res.desc:'登录失败' })
}
})
},
// 处理登录参数
dealParams(type,data) {
let params = {
errMsg: '',
code: 0,
userInfo: {
openId: '',
nickName: '', // 昵称
gender: '', // 性别
city: '', // 城市
province: '', // 省份
country: '', // 国家
avatarUrl: '', // 头像
unionId: '', // 微信参数
source: '', // 11 微信 12 微博 13 苹果登录
}
}
if(type=="apple"){
params.userInfo.openId = data.user
params.userInfo.nickName = data.email
// params.userInfo.acessToken = data.identityToken
params.userInfo.source = 13
}else if(type=="weixin"){
params.userInfo = data.userInfo
params.userInfo.source = 11
}
console.log(params,'登录入参')
return params
}