网站应用微信登录-内嵌二维码-开发问题记录

1. 问题背景

系统之前只有密码登录和短信验证码登录。前2天,接入了微信扫码登录,这是微信的官方文档:网站应用微信登录开发指南

一开始我们使用了第一种获取code的方式,即在pc端打开以下链接:https://open.weixin.qq.com/connect/qrconnect?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect。
这种方式没什么好说的,配置好redirect_uri,然后在当前页面跳转或跳转新页面都可以,我们使用了刷新当前页面。很多网站的微信登录也使用了这种方式

但是后面产品要求我们使用第二种获取code的方式,即将“微信登录二维码内嵌到自己页面”,理由是“第一种方式,用户点击以后发现点错了,还要点击浏览器左上角的返回才能回去”

在使用内嵌微信二维码的时候,遇到了几个问题,记录一下。这些问题“恰好”在文档里面都没有明确说明

2. style=“white” 无效

生成的二维码默认是黑色描述文字。
如果我们的背景色是深色,就需要配置成白色描述文字。
在这里插入图片描述
我们本来是从第一种方式 换到了 第二种方式,所以直接把第一种方式的链接接参数对比填入到了第二种方式:

        var obj = new WxLogin({
            self_redirect: false,
            id: "login_container",
            appid: "你的用户id",
            scope: "snsapi_login",
            redirect_uri: "你的跳转地址",
            state: "STATE#wechat_redirect",
            style: "white",
            href: ""
        });

我们是打算配置白色文字描述,但是使用上面的代码运行以后,即使配置了style: "white"出来的二维码仍然是黑色文字描述。

微信网页授权文档 这里,可以知道#wechat_redirect 是一个独立的参数。所以修改上述配置后,可以出现正常的白色文字描述。

        var obj = new WxLogin({
            self_redirect: false,
            id: "login_container",
            appid: "你的用户id",
            scope: "snsapi_login",
            redirect_uri: "你的跳转地址",
            state: "STATE",
            style: "white",
            href: ""
        });

3. self_redirect=false 重定向被禁止

使用self_redirect:false 配置,手机微信扫码确认以后,发现没有谷歌浏览器没有反应,再看右上角显示重定向被禁止。

在网上搜了一下,很多人说修改wxLogin.js的源码,但是感觉应该没有这么low。

最后在微信扫码登录 本地测试时地址栏 弹出已禁止重定向 这篇里面看到,提到说是跨域问题导致的,就试了一下,完美解决。我是本地测试的,测试地址是192.168.x.xxx,而且配置的扫码域名是www.xxx.com。

4. href使用base64

href字段文档里面说是要使用css文件地址,来覆盖样式:
在这里插入图片描述
在这里插入图片描述
但是我看见很多人说可以使用base64,不知道他们都是从哪儿知道的。使用base64的过程如下:

① 有一组样式:

.impowerBox #wx_default_tip p:nth-last-child(1)  { display: none; }

② 转base64:
base64.us
在这里插入图片描述
Base64 编码或解码的结果:LmltcG93ZXJCb3ggI3d4X2RlZmF1bHRfdGlwIHA6bnRoLWxhc3QtY2hpbGQoMSkgIHsgZGlzcGxheTogbm9uZTsgfQ==

③ 写入到herf字段:

格式如下:

href: "data:text/css;base64,后面是base串"

所以上述的覆盖样式最终配置是:

 href: "data:text/css;base64,LmltcG93ZXJCb3ggI3d4X2RlZmF1bHRfdGlwIHA6bnRoLWxhc3QtY2hpbGQoMSkgIHsgZGlzcGxheTogbm9uZTsgfQ=="

5. 二维码过期时间

通过new WxLogin 这种内嵌方式生产的二维码是会自动更新的,不需要开发者做定时刷新。

网站应用的微信登录二维码有效期是多久,会自动刷新么? 这里有提到是5分钟更新一下
在这里插入图片描述
具体是不是5分钟,我没有试。但是 过一段时间的确是会更新,比如我们一开始通关f12把二维码图片的复制下来:
在这里插入图片描述

https://open.weixin.qq.com/connect/qrcode/0718bOKc3Aabml2S

等过几分钟,就会发现,通过f12看到的二维码图片地址变成了

https://open.weixin.qq.com/connect/qrcode/031wng7X0tyNFa1Z

如果你闲的没事,一直盯着二维码,就会发现它过一会儿会自己闪一下。

### Vue3 应用中集成微信扫描二维码登录内嵌二维码 为了在 Vue3 中实现微信扫码登录功能,并将二维码内嵌到网页,可以按照以下方式构建: #### 1. 引入必要的 JavaScript 文件 首先,在 `index.html` 文件中引入微信提供的用于生成二维码的 JS SDK。 ```html <script src="https://res.wx.qq.com/connect/zh_CN/htmledition/js/wxLogin.js"></script> ``` 此脚本提供了创建和管理微信登录二维码所需的功能[^3]。 #### 2. 创建 TypeScript 类型声明文件 如果项目使用了 TypeScript,则需为 `WxLogin` 添加类型定义以避免编译错误。为此可以在项目的根目录下新建一个名为 `shims-wxlogin.d.ts` 的文件,并添加如下内容: ```typescript declare module 'wxLogin' { interface Options { id?: string; appid?: string; scope?: string; redirect_uri?: string; state?: string; style?: string; href?: string; } class WxLogin { constructor(options: Options); } export default WxLogin; } ``` 这一步骤确保了 IDE 和编译器能够识别来自 wxLogin 的对象及其属性[^2]。 #### 3. 初始化微信登录组件 接下来,在适当的位置初始化微信登录控件。通常是在页面加载完成后执行该逻辑。下面是一个简单的例子展示如何配置以及启动这个插件: ```javascript import { onMounted } from "vue"; onMounted(() => { new WxLogin({ id: "loginContainer", // 容器ID appid: "YOUR_APP_ID", // 微信开放平台申请的应用程序 ID scope: "snsapi_login", redirect_uri: encodeURIComponent("REDIRECT_URI"), // 登录成功后的回调地址 state: "", style: "", href: "" }); }); ``` 这段代码会在指定容器 (`loginContainer`) 内显示由微信服务器动态生成的二维码图像。 #### 4. 获取授权码 (code) 当用户通过手机扫描上述二维码完成身份验证之后,浏览器会被重定向至预先设定好的 URL 参数后面附加了一个叫做 `code` 的查询参数。可以通过路由来捕获它: ```javascript import { useRoute, useRouter } from 'vue-router'; const route = useRoute(); const router = useRouter(); // 假设这是从URL获得的code值 let code = route.query.code; if (code) { // 将code发送给后端交换token或其他凭证... fetch('/exchange-token', { method: 'POST', body: JSON.stringify({ code }), headers: {'Content-Type': 'application/json'} }).then(response => response.json()) .then(data => /* 处理返回的数据 */ ); } else { console.error('No authorization code found.'); } router.push('/'); ``` 这里展示了如何读取 URL 查询字符串中的 `code` 并将其传递给后端服务来进行进一步的身份验证过程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值