vue3+vite(4.3.9) 实现web网站微信扫码授权登录--内嵌

首先具体流程如下:

1. 需要在自己的页面上生成微信的二维码(如何生成?)

2. 微信扫码授权后,会在页面地址上返回一个code(如何拿到,并一直在当前的页面?)

3. 拿到以后 就可以去调用后端的接口,并把code 传过去,后端就会根据code 去调用微信官方的接口去换取 微信用户信息。

前提条件:需要去 微信开放平台-网站应用(创建网站应用并通过), 资质认证也需要通过哦~

微信开放平台地址:微信开放平台

废话不多说,流程解析开始:

1.需要在自己的页面上生成微信的二维码(如何生成?)

首先我这边的话,为了方便后续的操作,我这里是把生成微信二维码封装成了组件

appid:开放平台中申请的网站应用的appid

redirect_uri:授权后返回的地址(使用的域名必须要和授权回调域里面 填写的 域名一致才可以

href: 必须使用base64格式(当前代码样式为:宽200px;高200px)

<template>
  <!-- 微信登录二维码 -->
  <div class="header">
    <div id="weiXin"></div>
  </div>
</template>
<script setup lang="ts">
  import { onMounted } from 'vue';
  import Config from '@/settings';

  const props = defineProps({
    permission: {
      type: String, //类型字符串
      default: () => {
        return '';
      },
    },
  });

  onMounted(() => {
    shows();
  });

  const WxLogin = function (e: any) {
    let r = 'default';
    !0 === e.self_redirect ? (r = 'true') : !1 === e.self_redirect && (r = 'false');
    let n = document.createElement('iframe') as any;
    let i =
      'https://open.weixin.qq.com/connect/qrconnect?appid=' +
      e.appid +
      '&scope=' +
      e.scope +
      '&redirect_uri=' +
      e.redirect_uri +
      '&state=' +
      e.state +
      '&login_type=jssdk&self_redirect=' +
      r +
      '&styletype=' +
      (e.styletype || '') +
      '&sizetype=' +
      (e.sizetype || '') +
      '&bgcolor=' +
      (e.bgcolor || '') +
      '&rst=' +
      (e.rst || '');
    (i += e.style ? '&style=' + e.style : ''),
      (i += e.href ? '&href=' + e.href : ''),
      (i += 'en' === e.lang ? '&lang=en' : ''),
      (n.src = i),
      (n.frameBorder = '0'),
      (n.allowTransparency = 'true'),
      (n.sandbox = 'allow-scripts allow-top-navigation allow-same-origin'),
      (n.scrolling = 'no'),
      (n.width = '300px'),
      (n.height = '400px');
    let s = document.getElementById(e.id) as any;
    (s.innerHTML = ''), s.appendChild(n);
  };

  const shows = () => {
    // 'http://xingchi-trade.liangpiao.net.cn/#/weixinLogin'

    // 父页面传过来的参数
    const DDNSResolution = encodeURIComponent(props.permission);

    var obj = new WxLogin({
      self_redirect: false,
      id: 'weiXin',
      appid: Config.data.appIdWei,
      scope: 'snsapi_login',
      redirect_uri: DDNSResolution,
      state: Math.random(), //建议使用时间戳+随机数,具体看你
      style: 'black', // 提供"black"、"white"可选。二维码的样式
      href: 'data:text/css;base64,LmltcG93ZXJCb3ggLnRpdGxlIHsNCiAgICBkaXNwbGF5OiBub25lOw0KfQ0KLmltcG93ZXJCb3ggLnFyY29kZS5saWdodEJvcmRlciB7DQogICAgd2lkdGg6IDIwMHB4Ow0KfQ==',
    });

    // console.log(obj);
  };
</script>
<style lang="scss" scoped>
  .header {
    width: 100%;
    display: flex;
    justify-content: center;
  }
</style>

把封装好的组件直接引入到 自己想展示的地方,再把需要的数据赋值 就会正常显示 如下图:

2. 微信扫码授权后,会在页面地址上返回一个code(如何拿到,并一直在当前的页面?)

首先,我的思路是这样的

(1)微信开放平台的微信回调域,填写必须是域名,不能是ip地址。所以会引发一个问题:测试的时候需要发布到 服务器上 才可以测试这个功能。(除非 会把本地ip 转为代理域名,这样就可以在本地进行测试)

(2)可以自己在项目中随便创建一个vue文件,写到自己的router里面(如果是登录之前,进行操作,则需要将该文件的路由,放到自己的路由白名单中。如果是账号 密码登录后,则可放可不放),并在路由全局前置守卫中,加一下判断,如果要跳入到该文件页面时,则将code 取下,并存入store中,然后让其再next() 到 显示二维码的页面。

如下图:

至于白名单就需要看各位小伙伴自己的逻辑是怎么写的了

NProgress.start();   不需要管

成功拿到,会返回当前页面后如下图:

3. 接下来就可以,让后端写个接收 code 的接口,去换取微信用户信息的接口啦,换取成功后,接口返回用户信息后 就代表 就成功啦~,这的具体逻辑各位小伙伴,可根据自己项目的逻辑去按照自己的想法去调整~

web网站 绑定微信也是同样的逻辑~

文章到这里就结束啦~   如果觉得不错的话,麻烦点点赞,点点收藏~

小编在这里提前谢谢大家啦~

这段代码实现了一个并查集数据结构。并查集是一种树型的数据结构,用于处理一些不相交集合(Disjoint Sets)的合并及查询问题。它支持两种操作: - 查找(Find):确定元素属于哪一个子集。它可以被用来确定两个元素是否属于同一子集。 - 合并(Union):将两个子集合并成同一个集合。 并查集可以用于解决很多实际问题,例如: - 判断无向图中是否有环 - 在图像处理中,判断连通区域 - 在游戏开发中,判断游戏中角色的关系 在这段代码中,类 UnionFindSet 的初始化函数 __init__ 接收两个参数:起始点 start 和结束点 n。接着定义了两个列表 pre 和 rank,用于存储每个节点的父节点和树的深度。其中,pre[i] 表示节点 i 的父节点,如果 pre[i] = i,则 i 为该集合的代表元素。 接下来的函数 init 用于初始化并查集,将每个节点的父节点设置为自身,深度为 1。 函数 find_pre 用于查找节点 x 的代表元素,同时实现了路径压缩的优化,即将查找路径上的所有节点都直接连接到代表元素上,减少查找时间。 函数 is_same 用于判断节点 x 和节点 y 是否在同一个集合中,即是否具有相同的代表元素。 函数 unite 用于合并两个集合,即将 x 所在的集合和 y 所在的集合合并为一个集合。首先查找 x 和 y 的代表元素,如果它们已经在同一个集合中,则直接返回 False。否则,将深度较小的集合连接到深度较大的集合上,并更新代表元素和深度。 最后,函数 is_one 用于判断整个并查集是否只有一个集合。它首先找到起始点的代表元素 temp,然后遍历起始点到结束点之间的所有节点,如果存在任意一个节点的代表元素不等于 temp,则说明存在多个集合,返回 False;否则,所有节点都在同一个集合中,返回 True。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值