欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Vue+abp微信扫码登录的实现代码示例

程序员文章站 2022-04-09 16:25:50
最近系统中要使用微信扫码登录,根据微信官方文档和网络搜索相关文献实现了。分享给需要的人,也作为自己的一个笔记。后端系统是基于abp的,所以部分代码直接使用了abp的接口,直接拷贝代码编...

最近系统中要使用微信扫码登录,根据微信官方文档和网络搜索相关文献实现了。分享给需要的人,也作为自己的一个笔记。后端系统是基于abp的,所以部分代码直接使用了abp的接口,直接拷贝代码编译不通过。

注册微信开放平台账号#

在微信开放平台注册,注意是开放平台不是公众平台,这里需要300元,然后申请网站应用。审核通过后获取到appid和appsecret以及登记的网站url。只有此url下的地址微信扫码后才能回调。

Vue+abp微信扫码登录的实现代码示例

具体申请条件见官方文档。

生成登录二维码#

在vue登录页面嵌入登录二维码,根据官方文档,在页面中放入一个div元素,二维码就放在此元素中,注意var obj = new wxlogin必须放在mounted方法中执行,此时vue才会把dom元素初始化挂载到dom树,可以参见vue官方文档生命周期介绍。

<template>
 <div id="login" class="login"></div>
</template>

<script>
export default {
 name: "wxlogin",
 data: function() {
  return {};
 },
 mounted() {
  this.wechathandleclick();
  document.getelementsbytagname("iframe")[0].height="320";
  document.getelementsbytagname("iframe")[0].style.marginleft="30px";
 },
 methods: {
  wechathandleclick() {
   let ba64css =
    "css代码base64编码";// 微信需要https的样式路径,这里将样式内容加密base64,可以避免使用https,如果你的网站是https的可以直接使用安官方文档使用css文件路径
   const appid = "你第一步申请的appid";
   const redirect_uri = encodeuricomponent("http://*/#/login");
   var obj = new wxlogin({
    id: "login", //div的id
    appid: appid,
    scope: "snsapi_login",//固定内容
    redirect_uri: redirect_uri, //回调地址
    // href: "http://*/static/usercss/wechart.css" //自定义样式链接,第三方可根据实际需求覆盖默认样式。    
    href: "data:text/css;base64," + ba64css
    // state: "", //参数,可带可不带
    // style: "", //样式 提供"black"、"white"可选,默认为黑色文字描述
   });
  }
 }
};
</script>

注册回调事件#

用户扫码后微信会回调访问前一步提供的redirect_uri,这里要监控微信回调,并用微信返回的code请求后端,在后端再去访问微信服务器获取token及用户openid

在回调页面中监控路由改变事件以监控微信回调(因为我的二维码和回调在同一个路由页面),如果有其他更好的方法请告诉我。

 @watch("$route")
 async routechange(newval, oldval) {
  await this.weixinredirect();
 }
 // 请求微信后台
 async weixinredirect() {
  let code = this.$route.query.code;
  let state = this.$route.query.state;
  if (code) {
   let wxto = {
    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

Vue+abp微信扫码登录的实现代码示例

[httppost]
public async task<authenticateresultmodel> weixinredirect(string code, string state)
{
  if (code.isnullorempty())
  {
    throw new userfriendlyexception("微信授权失败,请重新授权");
  }
  var appid = configuration["authentication:wechat:appid"];
  var secret = configuration["authentication:wechat:appsecret"];
  var url = $"https://api.weixin.qq.com/sns/oauth2/access_token?appid={appid}&secret={secret}&code=[code]&grant_type=authorization_code";
  var httpclient = httpclientfactory.createclient();
  httpclient.defaultrequestheaders.add("user-agent", "mozilla/4.0 (compatible; msie 6.0; windows nt 5.1)");
  httpclient.timeout = timespan.fromminutes(3);

  var resstr = await httpclient.getstringasync(url);
  try{
    //如果微信授权返回失败这里序列化不成功
   var res = jsonserializationhelper.deserializewithtype<weixinaccess_tokenresponse>(resstr);
  }catch (exception e)
  {
    throw new userfriendlyexception("获取微信access_token失败");
  }
  if (res == null || res.openid.isnullorempty())
  {
    throw new userfriendlyexception("获取微信access_token失败");
  }
  var userid = //根据openid获取用户id,我们系统要求用户提前把微信和用户关联绑定,所以这里可以根据微信用户的openid获取到户农户id;
  //使用用户直接登录
  if (!userid.isnullorempty()&&long.tryparse(userid, out long id))
  {
    var user = await _usermanager.getuserbyidasync(id);
    var loginresult = await _loginmanager.loginbyuser(user);
    string accesstoken = createaccesstoken(createjwtclaims(loginresult.identity));

    return new authenticateresultmodel
    {
      accesstoken = accesstoken,
      encryptedaccesstoken = getencrpyedaccesstoken(accesstoken),
      expireinseconds = (int)_tokenconfiguration.expiration.totalseconds,
      userid = loginresult.user.id
    };
  }
  throw new userfriendlyexception("微信尚未绑定账号,请使用账号登录后绑定微信。");

}

weixinaccess_tokenresponse类型

public class weixinaccess_tokenresponse
{
  public string access_token { get; set; }
  public int expires_in { get; set; }
  public string refresh_token { get; set; }
  public string openid { get; set; }
  public string scope { get; set; }
  public string unionid { get; set; }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。