微信公众号获取 openid: 从零到一快速实现一个微信公众号授权项目

news2024/9/22 17:21:11

一. 前言

上一篇文章说到,微信官方团队发了一则公告,美其名曰:“为了优化开发体验,避免多个同一功能接口对开发者造成困扰,微信团队将对下发统一消息接口进行如下调整。” 正是由于这个调整,而将部分开发者带入了深渊!对于这个调整,众多的开发者褒贬不一。官方既然已经确定修改了,那么我们应当尽快的完成适配,以便于我们能正常的开发公众号和小程序应用。

关于微信官方团队发出的公告事宜的具体事项,有还未了解的同学可以浏览我之前的文章:

突发!如何应对微信小程序与公众号下发统一消息接口调整

本文将会对上一篇文章中提到的解决方案之一进行详细的实现:彻底解决方案

  1. 重新写个微信公众号 h5 页面,授权获取 jscode,再来换取公众号 openid。

  2. 使用 openid 按照文档下发微信公众号模版消息,点击消息打开对应的小程序进行查看。

二. 开发前准备

由于“下发统一消息接口”影响的是微信小程序内推送到公众号的功能,因此要重新实现这一套,我将默认大家都已经申请了公众号小程序。如果你没有申请,确确实实是从零到一开发的,那么就简单看下面如何申请就可以了,很简单!

1. 申请公众号

  1. 申请公众号开发者账号:前往 微信公众平台 申请公众号开发者账号,并完成账号认证。

  2. 配置公众号开发设置:登录微信公众平台,在“开发-基本配置”中配置好公众号的相关信息,包括服务器配置、公众号名称、AppID、AppSecret等。

2. 申请小程序

  1. 申请小程序:前往 微信公众平台 | 小程序 申请小程序,具体可以按照页面引导操作

  2. 如果你已经认证了公众号,可以复用公众号的资质快速注册小程序,如下图所示:

image.png

三. 进入开发阶段

1. 创建网页授权链接

在公众号菜单设置或H5页面中,创建一个用于获取用户授权的链接。链接的格式如下:

https://open.weixin.qq.com/connect/oauth2/authorize
?appid=APPID
&redirect_uri=REDIRECT_URI
&response_type=code
&scope=SCOPE
&state=STATE
#wechat_redirect

我们分析下上面的链接,其中主要的传递参数有:

  • appid:公众号的AppID
    • 公众号的唯一标识,可以在公众号后台获取到AppID

  • redirect_uri:用户同意授权后的回调URL
    • 授权后重定向的回调链接地址,需使用 urlEncode 对链接进行处理

  • response_type:返回类型,固定填写code

  • scope:应用授权作用域
    • snsapi_base:不弹出授权页面,直接跳转,只能获取用户openid

    • snsapi_userinfo:弹出授权页面,可通过openid拿到昵称、性别、所在地。并且, 即使在未关注的情况下,只要用户授权,也能获取其信息

  • state:自定义参数
    • 重定向后会带上state参数,开发者可以填写a-zA-Z0-9的参数值,最多128字节

  • #wechat_redirect:固定传递
    • 必须带此参数

注意:因为我们仅仅需要获取到openid,所以我们不需要弹出授权页面拿到微信昵称、性别等资料。因此我们仅做静默授权获取code即可,这样实现起来比较简单

2. 用户授权并回调

用户在打开H5页面时,点击上一步生成的链接,会跳转到微信授权页面(我是用的静默授权),确认授权后,微信会跳转到上一步中指定的REDIRECT_URI,并携带一个code参数。

这时候我们需要解析一下URL,在回调的URL中,获取URL中的code参数。

3. 使用code换取openid

使用code换取用户的openid。可以使用服务器端的语言或框架来实现此步骤。可以通过以下API来换取openid:

https://api.weixin.qq.com/sns/oauth2/access_token
?appid=APPID
&secret=APPSECRET
&code=CODE
&grant_type=authorization_code

其中,APPID 和 APPSECRET 分别为公众号的 AppID 和 AppSecret,CODE 为上一步获取到的 code参数。

尤其注意:由于公众号的secret安全级别都非常高,必须只保存在服务器,不允许传给客户端。因此不建议使用前端直接获取openid,建议使用后端语言实现此步骤。

4. 获取到openid

通过上一步的 API 调用,会返回一个包含 openid 的 JSON 数据。解析 JSON 数据,即可获取到用户的openid。

至此,我们就完成了openid的获取,可以正常的使用它进行推送开发了!

四. 遇到的几个问题

1. 如何调试

其实调试问题,微信官方也已经考虑到了这个问题,在微信公众号的后台,他们提供了一下开发者工具,可以让我们在开发阶段进行便捷的测试,如下图所示:

image.png

在这里,我们主要使用的是 “公众平台测试账号” 这个工具,下面我们看一下这个工具是如何使用的。

  • 第一步

点击 “公众平台测试账号” ,用自己微信扫码进行登录,然后就进入到了主页,在主页中我们可以看到给我们生成了测试的 appID 和 appsecret,这两个重要的参数以供我们测试授权使用

image.png

  • 第二步

在当前页面中我们找到 “测试号二维码” 一栏,使用需要调试的微信扫码关注测试公众号,如下图所示:

image.png

  • 第三步

在当前页面继续向下滚动页面,找到 “网页授权获取用户基本信息”,点击修改,添加授权回调域名,如下图所示:

image.png

完成上面的两步后,我们就可以进行愉快的测试了,可以使用手机微信,或者是微信开发者工具进行调试!

注意:调试阶段,可以使用域名或IP都可以,在正式上线环境下,必须使用备案的域名才可以!

2. redirect_uri

  • redirect_uri 必须提前在微信公众号后台中维护好授权回调域名,否则会报 “10003:redirect_uri域名与后台配置不一致”

  • redirect_uri 必须使用 urlEncode 进行编码处理

  • 使用 Vue 框架开发的,建议使用 history 路由模式,可以避免微信回调链接的各种参数拼接问题

  • 使用 Vue 开发时,如果你非要使用 hash 路由模式,也不是不可以解决,只能在路由拦截器中处理一下 # 拼接的问题,重新整理成正确的路由链接就可以了

3. 重定向循环问题

在开发调试的过程中遇到了这样一个问题,授权完成后,返回重定向页面,进入了死循环?结果就是关闭不了了,这是为什么呢?我猜测这是微信浏览器自己的bug,不过时隔多年,微信并没有解决它。

image.png

以上面的页面跳转流程图为例,授权完成后,路由栈应该为只有页面C,但结果却不是这样的。

结果是存在两个路由:页面A、页面C,在页面C中点返回,则返回到了页面A,页面A会自动授权,则又进行了上述流程图的步骤,如此循环往复,结果就是退不出去!

如何做呢?总不能让用户手动关闭浏览器吧?

解决方案:我只能在页面C 中添加一个按钮 - “返回”,点击返回可自动退出,解决了重定向问题。如果你有更好的实现方案,欢迎说来听听。

image.png

接下来我们实现这个返回功能就行了,WeixinJSBridge 提供了关闭浏览器的 API,下面是我自己的实现代码。

<template>
  <div class="back-view">
    <div v-if="isWeixin" class="back-text" @click="close"> <icon name="arrow-left"></icon> 返回 </div>
  </div>
</template>

<script>
export default {
  methods: {
    // 关闭微信浏览器
    close() {
      if (WeixinJSBridge) {
        try {
          WeixinJSBridge.call('closeWindow')
        } catch (error) {}
      }
    },
    // 判断是否为微信浏览器环境
    isWeixin() {
      return typeof WeixinJSBridge === 'object' && typeof WeixinJSBridge.invoke === 'function'
    }
  }
}
</script>

<style lang="scss" scoped>
.back-view {
  position: fixed;
  left: 0;
  right: 0;
  bottom: 0;
  padding: 15px 20px;
  background-color: $color-primary;
}
.back-text {
  color: white;
  font-weight: bold;
  font-size: 16px;
}
</style>

五. 总结

至此,我们快速的完成了从零到壹实现一个微信公众号授权项目,成功的获取到了微信公众号的 openid,我们可以愉快的使用 openid 绑定到自己的系统进行项目开发了,可以按照标准化的流程进行下发微信公众号模版消息了。

官方文档:微信网页开发 - 网页授权

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

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

相关文章

力扣: 快乐数

文章目录 需求分析代码结尾 需求 编写一个算法来判断一个数 n 是不是快乐数。 「快乐数」 定义为&#xff1a; 对于一个正整数&#xff0c;每一次将该数替换为它每个位置上的数字的平方和。 然后重复这个过程直到这个数变为 1&#xff0c;也可能是 无限循环 但始终变不到 1。 …

社群空间站9.9付费入群系统二开源码 易支付版全套搭建教程

1.创建站点 2.搭建环境 php7.2 3.上传源码包 数据库批量修改sq9.dongge1.icu s10.dongge1.icu 改为你的域名 4.上传数据库 修改数据库文件/data/config/ 5.访问域名 6.账户密码 admin 123456 7.易支付修改地址是在/data/tpl/app/default/yy_shequn2/lib/epay.config.php…

【动捕_VRPN_ROS2】安装vrpn_client_ros2库将动捕数据转换ROS2话题

安装vrpn_client_ros2库将动捕数据转换ROS2话题 环境&#xff1a; Ubuntu &#xff1a;20.04 LTS ROS &#xff1a;ROS2 Foxy 安装VRPN库 执行以下命令安装VRPN库。 git clone https://github.com/vrpn/vrpn.git mkdir -p vrpn/build cd vrpn/build cmake .. make sudo …

【技术】叉车防撞报警系统的原理及应用场景

叉车作为一种大型货物的运输机械&#xff0c;自出现之后大大提高了人们在日常工作的运输效率&#xff0c;但是同样存在着一部分弊端&#xff0c;例如存在着较多的视觉盲区&#xff0c;随着人们对于叉车的日常使用&#xff0c;叉车的安全事故愈发严重&#xff0c;很容易发生碰撞…

C#高级:递归2-根据ID反向递归求其所有的祖先节点信息

目录 一、实现demo 二、封装方法 【ID>祖先ID】 【ID>祖先实体】 三、递归讲解 一、实现demo class MainClass {static List<Person> PersonList new List<Person>(){new Person(){ Id1,ParentIDnull,Name"小明曾祖父",},new Person(){ Id2…

《论面向方面的编程技术及其应用》写作框架,软考高级系统架构设计师

论文真题 随着社会信息化进程的加快&#xff0c;计算机及网络已经被各行各业广泛应用&#xff0c;信息安全问题也变得愈来愈重要。它具有机密性、完整性、可用性、可控性和不可抵赖性等特征。信息系统的安全保障是以风险和策略为基础&#xff0c;在信息系统的整个生命周期中提…

基于Java+SpringBoot+Vue+MySQL的西安旅游管理系统网站

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 基于SpringBootVue的西安旅游管理系统网站【附源码文档】、…

美团OC感想

OC感想 晚上十点拿到美团意向了 到家事业部。&#xff0c;日常实习没过&#xff0c;暑期实习没过&#xff0c;秋招终于意向了&#xff0c;晚上十点发的&#xff0c;整整激动到一点才睡着&#xff0c;不仅因为这是秋招的第一个意向&#xff0c;更因为这是我一直心心念念想去的地…

pip-tools:打造可重复、可控的 Python 开发环境,解决依赖关系,让代码更稳定

在 Python 开发中&#xff0c;管理依赖关系是一项繁琐且容易出错的任务。手动更新依赖版本、处理冲突、确保一致性等等&#xff0c;都可能让开发者感到头疼。而 pip-tools 为开发者提供了一套稳定可靠的解决方案。 什么是 pip-tools&#xff1f; pip-tools 是一组命令行工具&…

2024-09-08 小红书机试 解题报告 | 珂学家

前言 题解 这是2024年9月8号的小红书机试题。 看到群里有人在讨论&#xff0c;小红书的机试题&#xff0c;顺手做了下&#xff0c;感觉挺有意思的。 现在的机试题&#xff0c;是真的难&#xff0c;好卷。 A. 机器人 题目描述: m * n的格子&#xff0c;都有一个方向指令LRUD…

挑战当前最难、规模最大多模态评测基准MME-RealWorld,QwenVL-2位列第一但并未及格

32 个标注者&#xff0c;29,429 条标注数据&#xff0c;图像平均分辨率 20001500&#xff0c;当前最难最大的纯手工标注图像感知 benchmark 来了&#xff01;现有模型没有一个在总分上取得 60% 以上的准确率。 论文链接&#xff1a; https://arxiv.org/abs/2408.13257 项目主…

MLLM(三)| BigModel平台正式上线Plus系列全家桶

2024年8月28日&#xff0c;在ACM SIGKDD&#xff08;国际数据挖掘与知识发现大会&#xff0c;KDD&#xff09;会议现场&#xff0c;智谱AI重磅推出新一代全自研基座大模型GLM-4-Plus、图像/视频理解模型GLM-4V-Plus和文生图模型CogView-3-Plus。 1、模型介绍页&#xff1a;htt…

Maven项目父模块POM中是否应该包含SpringBoot打包插件(spring-boot-maven-plugin)

父模块POM是否包含SpringBoot打包插件 一、场景 一个基于SpringBoot的Maven父子模块的项目&#xff08;一个父项目中包含多个子项目&#xff09;&#xff0c;父模块 POM文件中&#xff0c;是否应该包含打包需要的插件&#xff08;spring-boot-maven-plugin&#xff09;&#…

strcat函数的使用和模拟实现

目录 1.头文件 2.函数功能​编辑 3.注意事项&#xff1a; 4.strcat函数模拟实现&#xff1a; 方源一把抓住VS2022&#xff0c;催动春秋产的气息&#xff0c;顷刻炼化&#xff01; 1.头文件 strcat函数的使用&#xff0c;需要头文件 #include<string.h>2.函数功能 s…

✨机器学习笔记(二)—— 线性回归、代价函数、梯度下降

Course1-Week1: https://github.com/kaieye/2022-Machine-Learning-Specialization/tree/main/Supervised%20Machine%20Learning%20Regression%20and%20Classification/week11️⃣线性回归&#xff08;linear regression&#xff09; f w , b ( x ) w x b f_{w,b}(x) wx b …

【深度学习讲解笔记】前言

小编为AI专业的本科学生&#xff0c;最近入手了一本《深度学习讲解》的书&#xff0c;由于封面画了苹果&#x1f34e;&#xff0c;所以也叫苹果书&#xff0c;这本书目前在全网的热度很高。 本书是根据李宏毅老师讲授的《机器学习》课程编写的&#xff0c;作者是来自DataWhale…

SCI顶刊中“introduction”经典模板,建议收藏!

Introduction Introduction 的行文框架是一个从较宽泛的学术领域逐渐缩小到你的研究目标的过程。 1.研究背景和重要性 (Background AndImportance) • Mention of previous work on the subject • A statement of the importance of the subject 引言部分的第一段需要给出…

(Charles)如何抓取手机http的报文

抓包的目的&#xff1a; 发现bug需要定位要抓包 检查数据传输的安全性 接口测试遇到需求文档不全要抓包 抓包主要抓取的是http协议&#xff08;https协议&#xff09;的报文 http协议规范客户端和服务端的数据传输格式&#xff0c;是一个标准和规范 每个http连接包括请求消息和…

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya&#xff08;不是本人&#xff0c;claude AI&#xff09;在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容&#xff1a; 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用&…

CSP-J基础之数学基础 杨辉三角 一篇搞懂

文章目录 前言杨辉三角介绍杨辉三角的结构数学中的形式杨辉三角的性质 杨辉三角进行左对齐杨辉三角的递推公式编程实现杨辉三角总结 前言 杨辉三角是数学中一个非常有趣且重要的概念。它不仅在组合数学中扮演着重要角色&#xff0c;还在许多数学问题的解决中提供了有力的工具。…