微信,QQ等第三方登录在在App上很常见,便于用户快速登录。所以这篇文章说的是App如何调用微信登录实现功能;
以下的谈论项目框架不是原生开发,是以uni-app框架为背景的,但需要参考微信官方关于移动应用登录指南。而且涉及到的代码更多是前端代码,后端只是讲下流程。
uni-app框架本身通过h5Plus的封装是可以开发微信登录的,但这里参考的是微信官方的文档及h5Plus部分api所开发的。
大致流程:
1 客户端通过h5+的api获取到授权临时票据(code),传给服务端;
2 服务端通过code获取access_token,得到相应的参数,eg:openid,refresh_token等;
到这一步其实已经完成了登录过程。至于之后再获取用户个人信息时,由服务端去调用相关api获取;
流程看起来很简单,但前端还是存在一些坑,需要填下。
前端:
var aweixin=null;
var _this=this
plus.oauth.getServices(function(services){
console.log(services)
services.forEach((item)=>{
if(item.id=='weixin'){
aweixin = item;
}
})
if(!aweixin){//没有取得微信登陆的服务
uni.showToast({
title:'当前环境不支持微信登录',
icon:'none'
})
return;
}
if(!aweixin.authResult){//是否登录认证过
aweixin.authorize((e)=>{
console.log(e.code)
//将这个code 传给服务端,服务端调用相关api做操作,进而自定义业务逻辑
},(e)=>{
uni.showToast({
title:'用户取消授权',
icon:'none'
})
},{scope:'snsapi_userinfo',state:'authorize',appid:''})
}else{
console.log('已经登录过了')
uni.showToast({
title:'请使用其他登录方式',
icon:'none'
})
}
}, function(e){
console.log(e)
uni.showToast({
title:'获取登录授权服务列表失败',
icon:'none'
})
});
用户退出登录
用户退出登录,还是需要调用h5+的api退出;否则可能会出现用户退出登录再登录时,会执行authResult已经执行登录过了的情况。
plus.oauth.getServices(function(services){
console.log(services)
if(services.length!=0){
services.forEach(item=>{
if(item.id=='weixin'){
item.logout(function(e){
console.log(e)
}, function(e){
console.log(e)
});
}
})
}
})
以上的代码是前端的操作;
注:
authorize函数的第三个参数在Android端是可以不用填的,在ios端也是可以实现授权登录的,但是APP Store在审核时,出现了问题,并没有走的第一个函数回调,而是执行第二个函数,具体原因不明,因为本人在多台设备上测试并没有复现 出bug。所以解决方法是加上第三个参数即可;
服务端:
服务端通过调用微信的api获取到openid,refresh_token ,access_token等;服务端要将access_token保存起来,2h有效期,过期后需要通过refresh_token进行刷新获取;
客户端在每一次登录时,服务端都是要获取用户的信息,然后插入到数据库中便于更新用户信息;
注:
1 这块获取到的unionId不一定会有,如果开发者需要用unionId去做用户的判别,则需要再通过openid等参数调用api获取unionid;
2 服务端需要对access_token 进行过期的刷新,一般是提前5min重新刷新。
总结:
APP端的微信登录用h5+的api也是能开发的,但实际上并没有去直接跟微信服务器交互,调h5+的api能够直接获取到openid,unionID以及用户的信息,客户端载将这个数据提交给服务端,完成登录的操作;
但实际上,本人在开发时,问题很多,比如 authorize的方法,用户在每次授权弹窗时,会调用authorize两次,即用户需要授权两次才能执行接下来的进程;ios端是获取不到unionId,因为项目使用unionID做用户身份的识别。而且api所需要的appSecret是保存在客户端的,当然也可以保存在服务端,回传给客户端,但这样是比较麻烦或者保存在客户端不安全。
所以最好的方式是用微信文档的流程操作
要是有不对的地方,请大佬指教!!!