Vue+abp微信扫码登录的实现代码示例
最近系统中要使用微信扫码登录,根据微信官方文档和网络搜索相关文献实现了。分享给需要的人,也作为自己的一个笔记。后端系统是基于ABP的,所以部分代码直接使用了abp的接口,直接拷贝代码编译不通过。
注册微信开放平台账号#
在微信开放平台注册,注意是开放平台不是公众平台,这里需要300元,然后申请网站应用。审核通过后获取到AppID和AppSecret以及登记的网站url。只有此url下的地址微信扫码后才能回调。
具体申请条件见官方文档。
生成登录二维码#
在vue登录页面嵌入登录二维码,根据官方文档,在页面中放入一个div元素,二维码就放在此元素中,注意varobj=newWxLogin必须放在mounted方法中执行,此时vue才会把dom元素初始化挂载到dom树,可以参见vue官方文档生命周期介绍。
注册回调事件#
用户扫码后微信会回调访问前一步提供的redirect_uri,这里要监控微信回调,并用微信返回的code请求后端,在后端再去访问微信服务器获取token及用户openID
在回调页面中监控路由改变事件以监控微信回调(因为我的二维码和回调在同一个路由页面),如果有其他更好的方法请告诉我。
@Watch("$route") asyncRouteChange(newVal,oldVal){ awaitthis.weixinRedirect(); } //请求微信后台 asyncweixinRedirect(){ letcode=this.$route.query.code; letstate=this.$route.query.state; if(code){ letwxTo={ code, state }; //请求后台 this.$http("*/WeixinRedirect",data:wxTo).then((token)=>{ //登录成功,把token写入cookie //跳转到主页 this.$router.replace({path:"/",replace:true}); }).catch(error=>{ //保持当前页面 this.$router.replace({path:"/login",replace:true}); }); } } }
后端接收code请求token#
在appsettings.json中配置AppId和AppSecret
[HttpPost] publicasyncTaskWeixinRedirect(stringcode,stringstate) { if(code.IsNullOrEmpty()) { thrownewUserFriendlyException("微信授权失败,请重新授权"); } varappid=configuration["Authentication:Wechat:AppId"]; varsecret=configuration["Authentication:Wechat:AppSecret"]; varurl=$"https://api.weixin.qq.com/sns/oauth2/access_token?appid={appid}&secret={secret}&code=[code]&grant_type=authorization_code"; varhttpClient=httpClientFactory.CreateClient(); httpClient.DefaultRequestHeaders.Add("User-Agent","Mozilla/4.0(compatible;MSIE6.0;WindowsNT5.1)"); httpClient.Timeout=TimeSpan.FromMinutes(3); varresstr=awaithttpClient.GetStringAsync(url); try{ //如果微信授权返回失败这里序列化不成功 varres=JsonSerializationHelper.DeserializeWithType (resstr); }catch(Exceptione) { thrownewUserFriendlyException("获取微信access_token失败"); } if(res==null||res.openid.IsNullOrEmpty()) { thrownewUserFriendlyException("获取微信access_token失败"); } varuserId=//根据openID获取用户id,我们系统要求用户提前把微信和用户关联绑定,所以这里可以根据微信用户的openID获取到户农户id; //使用用户直接登录 if(!userId.IsNullOrEmpty()&&long.TryParse(userId,outlongid)) { varuser=await_userManager.GetUserByIdAsync(id); varloginResult=await_logInManager.LoginByUser(user); stringaccessToken=CreateAccessToken(CreateJwtClaims(loginResult.Identity)); returnnewAuthenticateResultModel { AccessToken=accessToken, EncryptedAccessToken=GetEncrpyedAccessToken(accessToken), ExpireInSeconds=(int)_tokenConfiguration.Expiration.TotalSeconds, UserId=loginResult.User.Id }; } thrownewUserFriendlyException("微信尚未绑定账号,请使用账号登录后绑定微信。"); }
WeiXinAccess_tokenResponse类型
publicclassWeiXinAccess_tokenResponse { publicstringaccess_token{get;set;} publicintexpires_in{get;set;} publicstringrefresh_token{get;set;} publicstringopenid{get;set;} publicstringscope{get;set;} publicstringunionid{get;set;} }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。