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 相关文章推荐
利用javascript打开模态对话框(示例代码)
Jan 11 Javascript
MVVM模式中ViewModel和View、Model有什么区别?
Jun 19 Javascript
Jquery中巧用Ajax的beforeSend方法
Jan 20 Javascript
使用JS中的exec()方法构造正则表达式验证
Aug 01 Javascript
bootstrapfileinput实现文件自动上传
Nov 08 Javascript
JavaScript字符串对象(string)基本用法示例
Jan 18 Javascript
vue如何通过id从列表页跳转到对应的详情页
May 01 Javascript
初探Vue3.0 中的一大亮点Proxy的使用
Dec 06 Javascript
angular4中引入echarts的方法示例
Jan 29 Javascript
vue2.0+vue-router构建一个简单的列表页的示例代码
Feb 13 Javascript
vue实现条件叠加搜索的解决方法
May 28 Javascript
原生JS实现京东查看商品点击放大
Dec 21 Javascript
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
基于mysql的bbs设计(三)
2006/10/09 PHP
WordPress中的shortcode短代码功能使用详解
2016/05/17 PHP
基于ThinkPHP实现的日历功能实例详解
2017/04/15 PHP
php-fpm.conf配置文件中文说明详解及重要参数说明
2018/10/10 PHP
php设计模式之工厂模式用法经典实例分析
2019/09/20 PHP
Javascript字符串对象的常用方法简明版
2014/06/26 Javascript
require.js深入了解 require.js特性介绍
2014/09/04 Javascript
angular内置provider之$compileProvider详解
2017/09/27 Javascript
Vue cli 引入第三方JS和CSS的常用方法分享
2018/01/20 Javascript
Vue项目中添加锁屏功能实现思路
2018/06/29 Javascript
Vue props用法详解(小结)
2018/07/03 Javascript
使用javascript做时间倒数读秒功能的实例
2019/01/23 Javascript
利用原生JS实现data方法示例代码
2019/05/28 Javascript
了解JavaScript中let语句
2019/05/30 Javascript
JS中this的4种绑定规则详解
2020/02/04 Javascript
使用Vue-scroller页面input框不能触发滑动的问题及解决方法
2020/08/08 Javascript
JS数据类型分类及常用判断方法
2020/11/19 Javascript
vue3.0 项目搭建和使用流程
2021/03/04 Vue.js
python函数返回多个值的示例方法
2013/12/04 Python
Python中matplotlib中文乱码解决办法
2017/05/12 Python
django基础之数据库操作方法(详解)
2017/05/24 Python
python查看文件大小和文件夹内容的方法
2019/07/08 Python
python+selenium 鼠标事件操作方法
2019/08/24 Python
tensorflow指定GPU与动态分配GPU memory设置
2020/02/03 Python
Python模块常用四种安装方式
2020/10/20 Python
python logging模块的使用详解
2020/10/23 Python
详解CSS3中@media的实际使用
2015/08/04 HTML / CSS
Html5 APP中监听返回事件处理的方法示例
2018/03/15 HTML / CSS
加拿大女包品牌:Matt & Nat
2017/05/12 全球购物
关于Assembly命名空间的三个面试题
2015/07/23 面试题
八年级数学教学反思
2014/01/31 职场文书
班级口号大全
2014/06/09 职场文书
教师遵守党的政治纪律情况对照检查材料
2014/09/26 职场文书
瘦西湖导游词
2015/02/03 职场文书
会议主持词结束语
2015/07/03 职场文书
教师纪律作风整顿心得体会
2016/01/23 职场文书