扫码登录

调用二维码

方法一:内嵌式 调用二维码

生成code

   const s = document.createElement('script')
        s.type = 'text/javascript'
        s.src = 'https://res.wx.qq.com/connect/zh_CN/htmledition/js/wxLogin.js'
        const wxElement = document.body.appendChild(s)
        wxElement.onload = function () {
          var obj = new WxLogin({
            id:"sharePicBox",
            appid: "****",
            scope: 'snsapi_login', // 网页默认即可
            redirect_uri: encodeURIComponent(''), // 授权成功后回调的url
            state: 'WX' ,// 可设置为简单的随机数加session用来校验
            style: 'black', // 提供"black"、"white"可选。二维码的样式
            href: '' // 外部css文件url,需要https
          })
        }

同页面监听

 const params = this.$route.query
      const state = params.state
      const code = params.code
      if (!validatenull(state)){
        const loading = this.$loading({
          lock: true,
          text: `${
            state === "WX" ? "微信" : "QQ"
            }登录中,请稍后。。。`,
          spinner: "el-icon-loading"
        });
        if (code) {
          axios({
            url:'/system/api/blade-auth/authredirect?code='+code,
            method: 'get'
          }).then(respanse=>{
            if (respanse.data.data){
              let user = respanse.data.data
              this.loginForm.username = user.account;
              this.loginForm.password = user.account;
              this.loginForm.code =  user.code;
              this.loginForm.key =  user.key;
              //验证码的索引
              this.$store.dispatch("LoginByUsername", this.loginForm).then(() => {
                this.$router.push({path: this.tagWel.value});
                loading.close();
              })
            }
          })
        }
        setTimeout(() => {
          loading.close();
        }, 2000);

方法二:弹出式  调用二维码

    let appid, client_id, redirect_uri, url;
      redirect_uri = encodeURIComponent(
        window.location.origin + "/system/#/authredirect"
      );
      // let javaUrl = 'mzh.free.idcfengye.com/blade-auth/oauth/wx/login'
      if (thirdpart === "wechat") {
        appid = "***";
        url =
          "https://open.weixin.qq.com/connect/qrconnect?appid=" +
          appid +
          "&redirect_uri=" +
          redirect_uri +
          "&state=WX&response_type=code&scope=snsapi_login#wechat_redirect";
      } else if (thirdpart === "tencent") {
        client_id = "xxxx";
        url =
          "https://graph.qq.com/oauth2.0/authorize?response_type=code&state=QQ&client_id=" +
          client_id +
          "&redirect_uri=" +
          redirect_uri;
      }
      openWindow(url, thirdpart, 540, 540);

扫码后跳转的页面

  window.close()
    const params = this.$route.query
    const state = params.state
    const code = params.code
    window.location.href = `${window.location.origin}/system/#/login?state=${state}&code=${code}`

回到登录的页面 拿到code

      const params = this.$route.query
      const state = params.state
      const code = params.code
      if (!validatenull(state)){
        const loading = this.$loading({
          lock: true,
          text: `${
            state === "WX" ? "微信" : "QQ"
            }登录中,请稍后。。。`,
          spinner: "el-icon-loading"
        });
        if (code) {
          axios({
            url:'/system/api/blade-auth/authredirect?code='+code,
            method: 'get'
          }).then(respanse=>{
            if (respanse.data.data){
              let user = respanse.data.data
              this.loginForm.username = user.account;
              this.loginForm.password = user.account;
              this.loginForm.code =  user.code;
              this.loginForm.key =  user.key;
              //验证码的索引
              this.$store.dispatch("LoginByUsername", this.loginForm).then(() => {
                this.$router.push({path: this.tagWel.value});
                loading.close();
              })
            }
          })
        }

后台解析code 创建或更新数据库 把账号信息返回前台 前台再调用登录

    JSONObject weixinUserOpenID = WxCodeOpenId.getWeixinUserOpenID(WX_TokenUtil.wxAppId, WX_TokenUtil.wXappSecret, code);
        R<UserInfo> openid = userClient.userInfo("000000", weixinUserOpenID.get("unionid").toString());
        User user = openid.getData().getUser();
        R<AppUserInfo> unionid = competitionClient.get(weixinUserOpenID.get("unionid").toString());
        if (Strings.isBlank(user.getWxUnionid())) {
            user = new User();
        }
        user.setAccount(weixinUserOpenID.get("unionid").toString());
        user.setPassword(weixinUserOpenID.get("unionid").toString());
        if (unionid.getData().getId()!=null){
            AppUserInfo data = unionid.getData();
            user.setName(data.getNickName());
            user.setRealName(data.getRealName());
            user.setAvatar(data.getAvatarUrl());
            user.setEmail(data.getEmail());
            user.setPhone(data.getTel());
            user.setSex(data.getSex()=="男"?0:1);
        }else {
            user.setName("昵称");
            user.setRealName("真名");
            user.setAvatar("头像");
            user.setEmail("邮箱");
            user.setPhone("手机");
            user.setBirthday(new Date());
            user.setSex(0);
        }
        user.setRoleId("1253370403732258818");
        user.setDeptId("1123598813738675201");
        user.setWxUnionid(weixinUserOpenID.get("unionid").toString());
        if (user.getId()==null) {
            userClient.saveUser(user);
        }else {
            user.setPassword(DigestUtil.encrypt(user.getPassword()));
            userClient.updateUser(user);
        }
        SpecCaptcha specCaptcha = new SpecCaptcha(130, 48, 5);
        String verCode = specCaptcha.text().toLowerCase();
        String key = StringUtil.randomUUID();
        redisCache.setEx(CacheNames.CAPTCHA_KEY + key, verCode, Duration.ofMinutes(30));
        user.setKey(key);
        user.setCode(verCode);
        return R.data(user);
const params = this.$route.query
const state = params.state
const code = params.code
if (!validatenull(state)){
const loading = this.$loading({
lock: true,
text: `${
state === "WX" ? "微信" : "QQ"
}登录中,请稍后。。。`,
spinner: "el-icon-loading"
});
if (code) {
axios({
url:'/system/api/blade-auth/authredirect?code='+code,
method: 'get'
}).then(respanse=>{
if (respanse.data.data){
let user = respanse.data.data
this.loginForm.username = user.account;
this.loginForm.password = user.account;
this.loginForm.code = user.code;
this.loginForm.key = user.key;
//验证码的索引
this.$store.dispatch("LoginByUsername", this.loginForm).then(() => {
this.$router.push({path: this.tagWel.value});
loading.close();
})
}
})
}
原文地址:https://www.cnblogs.com/-mzh/p/13084992.html