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


Posted in Javascript onJanuary 06, 2020

最近系统中要使用微信扫码登录,根据微信官方文档和网络搜索相关文献实现了。分享给需要的人,也作为自己的一个笔记。后端系统是基于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; }
}

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

Javascript 相关文章推荐
JS数字抽奖游戏实现方法
May 04 Javascript
jQuery实现的背景动态变化导航菜单效果
Aug 24 Javascript
JS+CSS实现仿支付宝菜单选中效果代码
Sep 25 Javascript
Bootstrap实现下拉菜单效果
Apr 29 Javascript
js轮盘抽奖实例分析
Apr 17 Javascript
JavaScript设计模式之单例模式详解
Jun 09 Javascript
vue 项目中使用Loading组件的示例代码
Aug 31 Javascript
JQuery特殊效果和链式调用操作示例
May 13 jQuery
javascript实现5秒倒计时并跳转功能
Jun 20 Javascript
Vue.js中的extend绑定节点并显示的方法
Jun 20 Javascript
JQuery+Bootstrap 自定义全屏Loading插件的示例demo
Jul 03 jQuery
jQuery+Ajax+js实现请求json格式数据并渲染到html页面操作示例
Jun 02 jQuery
Vue学习之axios的使用方法实例分析
Jan 06 #Javascript
vue 微信扫码登录(自定义样式)
Jan 06 #Javascript
React学习之JSX与react事件实例分析
Jan 06 #Javascript
vue学习之Vue-Router用法实例分析
Jan 06 #Javascript
借助云开发实现小程序短信验证码的发送
Jan 06 #Javascript
React学习之受控组件与数据共享实例分析
Jan 06 #Javascript
Node.js创建一个Express服务的方法详解
Jan 06 #Javascript
You might like
打造计数器DIY三步曲(中)
2006/10/09 PHP
PHP error_log()将错误信息写入一个文件(定义和用法)
2013/10/25 PHP
PHP+ajaxfileupload+jcrop插件完美实现头像上传剪裁
2014/06/09 PHP
PHP实现事件机制的方法
2015/07/10 PHP
PHP PDO操作总结
2014/11/17 Javascript
JS简单去除数组中重复项的方法
2016/09/13 Javascript
js图片切换具体实现代码
2016/10/13 Javascript
jQuery 选择符详细介绍及整理
2016/12/02 Javascript
基于Marquee.js插件实现的跑马灯效果示例
2017/01/25 Javascript
详谈Angular 2+ 的表单(一)之模板驱动型表单
2017/04/25 Javascript
详解Vue2.X的路由管理记录之 钩子函数(切割流水线)
2017/05/02 Javascript
解决ztree搜索中多级菜单展示不全问题
2017/07/05 Javascript
React Native 图片查看组件的方法
2018/03/01 Javascript
使用Vue实现图片上传的三种方式
2018/07/17 Javascript
ztree加载完成后显示勾选节点的实现代码
2018/10/22 Javascript
VuePress 静态网站生成方法步骤
2019/02/14 Javascript
vue不操作dom实现图片轮播的示例代码
2019/12/18 Javascript
[37:35]DOTA2上海特级锦标赛A组资格赛#1 Secret VS MVP.Phx第二局
2016/02/25 DOTA
Python修改MP3文件的方法
2015/06/15 Python
Python基础中所出现的异常报错总结
2016/11/19 Python
python自动化之Ansible的安装教程
2019/06/13 Python
python爬虫开发之Beautiful Soup模块从安装到详细使用方法与实例
2020/03/09 Python
Python爬虫之Selenium下拉框处理的实现
2020/12/04 Python
python实现经纬度采样的示例代码
2020/12/10 Python
pandas针对excel处理的实现
2021/01/15 Python
pycharm 配置svn的图文教程(手把手教你)
2021/01/15 Python
纯CSS3代码实现switch滑动开关按钮效果
2016/08/30 HTML / CSS
h5调用摄像头的实现方法
2016/06/01 HTML / CSS
H5页面适配iPhoneX(就是那么简单)
2019/12/02 HTML / CSS
伦敦高达60%折扣的钻石珠宝商:Purely Diamonds
2018/06/24 全球购物
开办大学饮食联盟创业计划书
2014/01/29 职场文书
市场营销方案范文
2014/03/11 职场文书
公司会议策划方案
2014/05/17 职场文书
庆元旦主持词
2015/07/06 职场文书
2016领导干部廉洁自律心得体会
2016/01/13 职场文书
Go中使用gjson来操作JSON数据的实现
2022/08/14 Golang