前端H5实现微信授权

news2024/9/23 5:32:53

背景:

前段时间做了一个H5项目,H5项目需要放在微信公众号里面,并且需要通过微信授权拿到openId,所以就需要实现h5授权微信这个功能了。

原理:

其实原理就是前端在本项目首页去请求微信端提供的一个地址,并且在地址上配置微信所需要的参数,比如最重要的就是你要配置微信最后获取到参数之后跳转你自己项目的地址,所以这就是h5授权微信的方式,通过用户项目跳转微信提供的地址,微信会把你所需要的参数拼接在你所填写的地址上面,最后跳转回来,你就可以直接从路径上获取了。        

参考地址:微信公众号官方文档 网页授权 | 微信开放文档

实现方式:

由于实现起来原理都是一个,所以大概有三种实现方式,分为前端获取和后端获取

方法一:(前端获取授权)

我们自己去请求微信的地址, 并且带上需要的参数

https://open.weixin.qq.com/connect/oauth2/authorize?appid=$%7Bappid%7D&redirect_uri=$%7BencodeURIComponent%28local%29%7D&response_type=code&scope=snsapi_userinfo&state=123&connect_redirect=1#wechat_redirect

    getCode() {
      // 非静默授权,第一次有弹框
      var local = window.location.href; // 获取页面url
      var appid = '你们公众号项目的appid'
      window.location.href=`https://open.weixin.qq.com/connect/oauth2/authorize?appid=${appid}&redirect_uri=${encodeURIComponent(local)}&response_type=code&scope=snsapi_userinfo&state=123#wechat_redirect`
      const unionId = this.getQueryString('unionId')
      const openId = this.getQueryString('openId')
    if(unionId&&openId) {
      // 授权成功之后直接存储在vuex中
      this.$store.commit('setwxRowData',this.RowData)
    }
    },
    getQueryString(name) {
      const queryString = window.location.search;
      const params = new URLSearchParams(queryString);
      const value = params.get(name);
      return value ? decodeURIComponent(value) : null;
    }

我的代码逻辑是先判断地址栏上和vuex中有没有openId,unionId,如果都没有说明需要进行授权,于是我们在mounted里面去调用授权的方法进行授权,授权成功拿到数据之后我们可以把数据存储在vuex中,之后的话在进入项目我们直接从vuex里面去取就行了,如果请求接口提示openId,unionId失效的话,我们则清空vuex里面存储的数据重新授权获取新的参数即可。

 mounted() {
    var unionId = this.getQueryString('unionId')
    var unionId = this.getQueryString('openId')
    if(!unionId&&unionId){
      // 不存在则去授权
      this.getCode();
    }else {
      // 存在直接获取进行业务编写即可
    }
  },

存在的问题:

微信跳转的地址需要备案好的地址,所以我们在本地就是无法调试的,跳转回来会报一个redirect_url参数错误的问题

解决方式:需要进行内网穿透

要在本地进行H5微信授权的联调,可以按照以下步骤进行操作:

1. 在微信公众平台上创建一个测试号,并获取测试号的AppID。

2. 在本地开发环境中创建一个H5页面,用于进行微信授权。

3. 在H5页面中引入微信JS-SDK,并使用测试号的AppID初始化。

4. 在H5页面中编写授权逻辑,包括调用微信JS-SDK的接口进行授权验证、获取用户信息等。

5. 在本地启动一个Web服务器,将H5页面部署到该服务器上。

6. 在微信公众平台的测试号设置中,配置授权回调域名为本地Web服务器的域名。

7. 在本地浏览器中访问H5页面,进行微信授权的测试。

需要注意的是,由于微信授权需要在公网环境下进行,所以在本地进行联调时,需要将本地Web服务器暴露到公网,可以使用工具如ngrok来实现内网穿透,将本地服务器映射到一个公网地址上。

另外,为了方便调试和排查问题,可以在H5页面中添加日志输出,查看授权过程中的返回结果和错误信息。

总结来说,H5微信授权的本地联调需要创建测试号、配置授权回调域名、启动本地Web服务器,并使用微信JS-SDK进行授权验证和获取用户信息。通过内网穿透工具将本地服务器暴露到公网,可以在本地浏览器中进行授权的测试。

可以对如下文章进行参考

微信h5开发网页授权-本地如何开发调试?_微信开发者如何测试本地h5登录_沐雪架构师的博客-CSDN博客

配置好之后就可以正常进行授权了

允许之后就会跳转到自己项目并且带上我们所需要的参数 

 方法二:(前后端结合获取授权)

优点:前后端结合获取其实原理还是一样的原理,实现方式与前端自己获取主要变化是,我们不在需要去请求微信端的地址,后台会在微信公众平台上做一个地址映射,我们直接去请求后台提供的地址,原理是一样的,当我们请求后台地址的时候,他会去帮我们请求微信地址,最后跳转回来并且把参数带给我们,这样我们就解决了方法一前端获取参数调试需要做地址映射的步骤

 getCode() {
      // 非静默授权,第一次有弹框
      var local = window.location.href; // 获取页面url
      // 后台提供的地址 (https://cgw.cunwedu.com.cn/wx/whitelist/user/render/wechat_mp/A11)
      // 配置参数:由于后台进行配置了,我们这就不需要传递appid了,只需要带上跳转回来的地址即可
      window.location.href=`https://cgw.cunwedu.com.cn/wx/whitelist/user/render/wechat_mp/A11?part=${encodeURIComponent(local)}`
    },
    getQueryString(name) {
      const queryString = window.location.search;
      const params = new URLSearchParams(queryString);
      const value = params.get(name);
      return value ? decodeURIComponent(value) : null;
    }
  }

mounted里面进行执行,这里逻辑与方法一一样

 mounted() {
    var unionId = this.getQueryString('unionId')
    var unionId = this.getQueryString('openId')
    if(!unionId&&unionId){
      // 不存在则去授权
      this.getCode();
    }else {
      // 存在直接获取进行业务编写即可
    }
  },

方法三:(后端获取授权)

原理也是一样,也是跳转获取参数, 这个时候后端会给你提供一个地址,你直接访问他的地址就行了,他的地址会直接在微信授权成功之后拿到参数,这个时候后端会跳转我们项目的地址,并且把参数,带给我们,这对于前端来说,就轻松了很多,我们只需要直接从地址栏上获取就行了

例如http://hy-dev.xiaofugui.com.cn/sd/oauth/render/123456789/2 是后台提供的地址,https://xd-h5-dev.xiaofugui.com.cn是我们h5的项目地址,我们访问后台提供的地址之后,他就会跳转我们h5地址并且带上参数,例如https://xd-h5-dev.xiaofugui.com.cn?openId=1234&unionId=12345

对于前端来说,项目里面直接获取使用即可

  mounted() {
    var unionId = this.getQueryString('unionId')
    var openId = this.getQueryString('openId')
    if(unionId&&openId&) {
      this.$store.commit('setwxRowData',this.RowData)
    }
  },

h5授权微信分享到这里就结束了,谢谢大家的观看。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1335587.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

每日一题——LeetCode160.相交链表

个人主页:白日依山璟 专栏:Java|数据结构与算法|每日一题 文章目录 1. 题目描述示例1:示例2:提示: 2. 思路3. 代码 1. 题目描述 给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的…

3.docker 安装失败

1、错误描述 2、报错前操作 ① 安装yum工具 yum install -y yum-utils \device-mapper-persistent-data \lvm2 --skip-broken ② 更新本地镜像源 # 设置docker镜像源 yum-config-manager \--add-repo \https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo…

改善OEE的关键:从反应性维护向预测性维护转变

科技的进步正在对企业的日常运营模式产生影响。许多制造企业已经采用了自动化生产流程,这不仅提高了产品质量,还简化了设备维护流程,并使得制造企业的设备维护方式从反应性维护转变为预测性维护。人们发现,设备维护方式的转变显著…

8.16 PowerBI系列之DAX函数专题-客户购买商品关联度的分析

需求 实现 1 客户数 countrows(values(sales[customerkey]))2 同时购买A和B的客户数 var A_cust values(sales[customerkey]) // var b_cust calculatetable(values(sales[customerkey]),usereletionship(product b[productkey],sales[productkey]),//激活虚拟关系all(p…

Java 基础学习(十七)多线程高级

1 多线程并发安全(续) 1.1 synchronized方法 1.1.1 synchronized方法 与同步代码块不同,同步方法将子线程要访问的代码放到一个方法中,在该方法的名称前面加上关键字synchronized即可,这里默认的锁为this&#xff0…

国外加固Appdome环境检测与绕过

文章目录 前言第一部分:定位检测逻辑的通用思路1. 通过linux“一切皆文件”思路定位2. 分析现有检测软件猜测可能检测点3. 通过正向开发思路定位4. 通过activity及弹窗定位 第二部分:检测结果展示整体流程1. Jni反射调用doDispath完成广播发送2. NativeB…

Redis案例实战之Bitmap、Hyperloglog、GEO

👏作者简介:大家好,我是爱吃芝士的土豆倪,24届校招生Java选手,很高兴认识大家📕系列专栏:Spring源码、JUC源码、Kafka原理、分布式技术原理、数据库技术🔥如果感觉博主的文章还不错的…

数据安全技术措施

目录 数据安全技术的控制点 数据完整性 数据保密性 数据备份与恢复 数据安全技术的控制点 数据完整性 数据保密性 数据备份与恢复 ~over~

开发利器——C语言必备实用第三方库

​ 对于广大C语言开发者来说,缺乏类似C STL和Boost的库会让开发受制于基础库的匮乏,也因此导致了开发效率的骤降。这也使得例如libevent这类事件库(基础组件库)一时间大红大紫。 今天,码哥给大家带来一款基础库&#…

Mybatis如何兼容各类日志?

文章目录 适配器模式日志模块代理模式1、静态代理模式2、JDK动态代理 JDBC Logger总结 Apache Commons Logging、Log4j、Log4j2、java.util.logging 等是 Java 开发中常用的几款日志框架,这些日志框架来源于不同的开源组织,给用户暴露的接口也有很多不同…

Ascon加解密算法分析

参数定义 加密架构图 整个过程是在处理320bits的数据,所以在最开始需要对原始的数据进行一个初始化,获得320bits的数据块, 图里看到的pa和pb都是在做置换(对320bits的数据进行一个置换) 置换(Permutation&…

04|提示工程(上):用少样本FewShotTemplate和ExampleSelector创建应景文案

04|提示工程(上):用少样本FewShotTemplate和ExampleSelector创建应景文案 当你用 print 语句打印出最终传递给大模型的提示时,一切就变得非常明了。 您是一位专业的鲜花店文案撰写员。 对于售价为 50 元的 玫瑰 &…

c++使用强制转换类型

对于c中的强制转换,这里主要是讲解的是父类与子类之间的类型强制转换。对于以下的代码中,主要是父类Monkey和子类Man之间的成员函数的调用。 // 这是父类 class Monkey { public: // 定义一个纯虚函数 virtual void printFunc() { qDeb…

udp多播/组播那些事

多播与组播 多播(multicast)和组播(groupcast)是相同的概念,用于描述在网络中一对多的通信方式。在网络通信中,单播(unicast)是一对一的通信方式,广播(broad…

智能优化算法应用:基于食肉植物算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用:基于食肉植物算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用:基于食肉植物算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.食肉植物算法4.实验参数设定5.算法结果6.…

算法学习系列(十一):KMP算法

目录 引言一、算法概念二、题目描述三、思路讲解三、代码实现四、测试 引言 这个KMP算法就是怎么说呢,就是不管算法竞赛还是找工作笔试面试,都是非常爱问爱考的,其实也是因为这个算法比较难懂,其实就是很难,所以非常个…

不同参数规模大语言模型在不同微调方法下所需要的显存总结

原文来自DataLearnerAI官方网站: 不同参数规模大语言模型在不同微调方法下所需要的显存总结 | 数据学习者官方网站(Datalearner)https://www.datalearner.com/blog/1051703254378255 大模型的微调是当前很多人都在做的事情。微调可以让大语言模型适应特定领域的任…

Vue在页面上添加水印

第一步:在自己的项目里创建一个js文件;如图所示我在在watermark文件中创建了一个名为waterMark.js文件。 waterMark.js /** 水印添加方法 */ let setWatermark (str1, str2) > {let id 1.23452384164.123412415if (document.getElementById(id) …

数据库01_增删改查

1、什么是数据?什么是数据库? 数据:描述事物的符号记录称为数据。数据是数据库中存储的基本对象。数据库:存放数据的仓库,数据库中可以保存文本型数据、二进制数据、多媒体数据等数据 2、数据库的发展 第一阶段&…

H266/VVC帧内预测编码技术概述

预测编码技术 预测编码(Prediction Coding)是指利用已编码的一个或多个样本值,根据某种模型或方法,对当前的样本值进行预测,并对样本真实值和预测值之间的差值进行编码。 视频中的每个像素看成一个信源符号&#xff…