专栏首页小神仙Vue+abp微信扫码登录

Vue+abp微信扫码登录

最近系统中要使用微信扫码登录,根据微信官方文档和网络搜索相关文献实现了。分享给需要的人,也作为自己的一个笔记。后端系统是基于ABP的,所以部分代码直接使用了abp的接口,直接拷贝代码编译不通过。 ##注册微信开放平台账号 在微信开放平台注册,注意是开放平台不是公众平台,这里需要300元,然后申请网站应用。审核通过后获取到AppID和AppSecret以及登记的网站url。只有此url下的地址微信扫码后才能回调。

具体申请条件见官方文档。 ##生成登录二维码 在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

[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; }
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 网站搜索框使用微信扫码

    客户要求可以直接识别标签二维码对某些仪器设备进行管理,类似于淘宝搜索框可以直接拍照搜索商品一样。前面已经做了一个网页调用摄像头识别二维码的功能,此功能有两个缺陷...

    用户6362579
  • RSA签名和验证数据

    用户6362579
  • asp.net core导入excel

    对比昨天导出的内容增加了一行实体属性名称作为标题行,这样到转换为实体的时候才能找到对应的属性。

    用户6362579
  • 热点|微信更新7.0版本啦,你后悔更新吗?

    微信已经成为海量用户日常生活中必不可少的一部分,通信、社交、娱乐、支付等等场景都离不开它。对于其突如其来的重大更新,你是措不及防还是迫不及待呢?

    云蚁cloudant
  • Asp.Net微信登录-电脑版扫描二维码登录

    像京东,一号店等网站都实现了用微信来登录的功能,就是用手机上的微信扫一扫网站上的二维码,微信上确认后,即可自动用微信的帐号登录网站。 一、创建网站应用 在微信开...

    逸鹏
  • 微信社交,我们是否被强关系绑架?

    用户1756920
  • 【微信第三方登录】 解决PC和移动端浏览器同为扫码登录

    RT 微信第三方登录不能和QQ互联一样自动适配手机端和PC(在手机端不能自动调用APP还是需要扫码,非常不方便) ? 如图:在移动端还是中间的效果,实际需求需要...

    冷冷
  • vue + 微信获取用户信息

    本次项目做到一个点赞功能,即分享出去一个页面给微信好友,微信好友点开并点赞,需要将点赞用户的微信昵称,微信头像以及微信openid,微信unionid(这个需要...

    super.x
  • 跨平台开发之~ VSCode开发第一个C程序

    VSCode的安装就不讲了,可以参考这个(http://www.cnblogs.com/dunitian/p/6661644.html) 写一个简单的C,然后F...

    逸鹏
  • 2015年度公安微信平台建设白皮书

    ? ?  5月10日下午,由公安部、中央网信办主办的“首届公安网络正能量精品征集评选揭晓仪式暨颁奖典礼”在京举行。会上,腾讯研究院、微信开放平台、微信城市服...

    腾讯研究院

扫码关注云+社区

领取腾讯云代金券