微信开发——网页授权

article/2025/9/19 10:48:37

微信开发——网页授权

  • 前期准备
  • 前端
  • 后端

前期准备

①微信客户端中访问第三方页面,公众号可以通过网页登陆授权,获取微信用户的基本信息(头像、昵称等),实现业务逻辑。一切按照官方文档说明开发。
②安装微信开发者工具。
③一个官方认证的公众号,或者使用微信公众平台的测试公众号。
在这里插入图片描述
④如果使用微信公众平台测试号,需要配置JS接口安全域名网页授权获取用户基本信息,填写正确的域名和端口号。
在这里插入图片描述
在这里插入图片描述
⑤本文使用测试号来演示网页授权。前端页面使用VSCode的Live Server本地开启服务器,端口号是5500。后端使用Node的express本地开启服务器,端口号是3000

前端

页面介绍
回调页面: 你自己写的网页,即http://127.0.0.1:5500/,与之前配置的JS接口安全域名网页授权获取用户基本信息一致,可以打开在微信平台与非微信平台。
静默授权链接: 将你的回调页用微信规定的静默授权格式包裹起来。在微信中打开时,会返回展示你的回调页,并且在URL上附加额外的codestate参数。静默授权只能获取到微信用户的openid
主动授权链接: 将你的回调页用微信规定的主动授权格式包裹起来。在微信中打开时,弹出主动授权框。用户点击确定授权后,会返回展示你的回调页,并且在URL上附加额外的codestate参数。若用户近期主动授权过,则不会弹出主动授权框,自动刷新跳转到回调页。主动授权能进一步获取到微信用户的头像、昵称等信息。
④在主动授权链接中带上state=auth参数,能够在用户主动授权后的回调页的URL上,知道用户已经主动授权了。

// 回调页
const cbURL = encodeURIComponent(`http://127.0.0.1:5500/`);
// 静默授权链接
const shareURL = `https://open.weixin.qq.com/connect/oauth2/authorize?appid=${appId}&redirect_uri=${cbURL}&response_type=code&scope=snsapi_base#wechat_redirect`;
// 主动授权链接
const authURL = `https://open.weixin.qq.com/connect/oauth2/authorize?appid=${appId}&redirect_uri=${cbURL}&response_type=code&scope=snsapi_userinfo&state=auth#wechat_redirect`;

二次分享与code参数
code参数是微信平台附加在回调页URL上的随机码,用于获取当前微信用户的access_token。随机码只能用一次,5分钟未使用自动过期。原地刷新页面也会导致code失效,需要重定向静默授权链接,重新获取随机码。
②非微信端打开的回调页分享到微信为首次分享,首次分享的分享链接即为静默授权链接。
③微信端打开的回调页,通过微信浏览器右上角的···继续进行分享为二次分享,需要调用微信的SDK,参见我的另一篇博客《微信开发——开放标签》。
④二次分享的链接应该设置为回调页链接http://127.0.0.1:5500/。若其他用户在微信平台打开二次分享的链接,那么就无法进行主动授权。所以需要在回调页判断微信平台,并在无code参数时,重定向至静默授权链接。
记录并判断用户的主动授权
①从URL的state参数或localStorage中判断用户曾经是否主动授权过。
②若用户完成主动授权,则在localStorage中持久化存入标志信息,建议设置一个过期时间,可以借助storejs第三方库。

// 判断微信平台
const ua = navigator.userAgent.toLowerCase();
const isWechat = /micromessenger/.test(ua);
// 解析URL的query参数
function query() {const map = {};const params = window.location.search.substring(1).split("&");params.forEach((item) => {const temp = item.split("=");map[temp[0]] = temp[1];});return map;
}
// 判断用户是否曾经主动授权过
const auth = localStorage.getItem("Auth") || query().state || "";
const code = query().code || "";
const lastCode = sessionStorage.getItem("vercode");
// 在微信平台中
if (isWechat) {// 储存本次codesessionStorage.setItem("vercode", code);// 二次分享无code,保证每次页面刷新,均存在有效的code,if (code === lastCode || !code) {window.location.replace(shareURL);} else {// 发起请求(下一节)}
}

发起请求
①当回调页在微信浏览器中记载完毕时,需要做的第一件事就是发起一个请求,向后端发送code参数,并判断用户是否主动授权过,从后端获取用户的基本信息。
②若用户未曾主动授权则只能获取到openid,主动授权过才能获取到更多基本信息。

// AJAX请求
const ajax = {get(url) {return new Promise((resolve, reject) => {let xhr = new XMLHttpRequest();xhr.open("GET", url);xhr.send();xhr.onreadystatechange = function () {if (xhr.readyState === 4) {if (xhr.status >= 200 && xhr.status < 300) {const res = JSON.parse(xhr.response);if (!res.code) resolve(res.data);else reject(res);}}};});},
};
// 1是静默授权,0是主动授权
ajax.get(`${location.protocol}//${location.hostname}:3000/auth?code=${code}&type=${auth ? 0 : 1}`).then((res) => {UserInfo.openId = res.openId;if (res.UserName && res.UserPhoto) {UserInfo.UserName = res.UserName;UserInfo.UserPhoto = res.UserPhoto;// 主动授权后,储存记录localStorage.setItem("Auth", 1);}}).catch((e) => console.log(e.message));

引导用户主动主动授权
①在页面中放置一个按钮用于交互,绑定事件,出发主动授权,弹出主动授权框。已主动授权过的用户则点击无效。

const authBtn = document.getElementById("authBtn");
// 按钮点击事件,获取主动授权
const handleAuth = () => {if (!auth) {window.location.replace(authURL);}
};
authBtn.addEventListener("click", handleAuth);

后端

express搭建一个服务器
①由于前后端不在一个服务器上,所以需要解决跨域的问题。

const express = require("express");
const app = express();
// CORS跨域设置
app.all("*", function (req, res, next) {res.header("Access-Control-Allow-Origin", "*");res.header("Access-Control-Allow-Headers", "X-Requested-With");res.header("Access-Control-Allow-Methods", "PUT,POST,GET,DELETE,OPTIONS");res.header("X-Powered-By", " 3.2.1");res.header("Content-Type", "application/json;charset=utf-8");next();
});
app.listen(3000, () => console.log("服务器已开启"));

通过code换取access_token和openid
①前端会将code传给后端,后端需要用该code向微信获取access_tokenopenid等信息。
②每个用户对于同一公众号的openid都是唯一固定不变的。
③静默授权的流程到此结束。

const https = require("https");
const getAccessToken = (code) => {return new Promise((resolve, reject) => {const URL = `https://api.weixin.qq.com/sns/oauth2/access_token?appid=${appId}&secret=${appSecret}&code=${code}&grant_type=authorization_code`;https.get(URL, (res) => {let rawData = "";res.on("data", (data) => (rawData += data));res.on("end", () => resolve(JSON.parse(rawData)));}).on("error", (e) => console.log(e.message));});};

通过access_token和openid获取UserInfo
①用户主动授权后,通过上一步获取的access_tokenopenid可以进一步获取用户的基本信息。

const getUserInfo = (accessToken, openId) => {return new Promise((resolve, reject) => {const URL = `https://api.weixin.qq.com/sns/userinfo?access_token=${accessToken}&openid=${openId}&lang=zh_CN`;https.get(URL, (res) => {let rawData = "";res.on("data", (data) => (rawData += data));res.on("end", () => resolve(JSON.parse(rawData)));}).on("error", (e) => console.log(e.message));});
};

部署GET接口
①根据前端传的type参数确定本次获取的是静默授权信息还是主动授权信息,返回用户基本信息。

app.get("/auth", function (req, res) {const wxAuth = async () => {// 解析query参数,字符串类型const { code, type } = req.query;const token = await getAccessToken(code);// 请求报错if (!token.access_token) {return res.send({ code: token.errcode, message: token.errmsg });}// 静默授权if (Number(type)) {return res.send({code: 0,message: "success",data: { openId: token.openid },});// 主动授权} else {const UserInfo = await getUserInfo(token.access_token, token.openid);// 请求报错if (!UserInfo.openid) {return res.send({ code: UserInfo.errcode, message: UserInfo.errmsg });}return res.send({code: 0,message: "success",data: {openId: UserInfo.openid,UserName: UserInfo.nickname,UserPhoto: UserInfo.headimgurl,},});}};wxAuth();
});

http://chatgpt.dhexx.cn/article/0w7tF3a1.shtml

相关文章

微信公众号微信网页开发网页授权/回调自定义参数问题处理方法。

微信公众号页面授权回调自定义参数问题 我们知道微信页面回调接口&#xff0c;获得用户信息后&#xff0c;回调地址&#xff1a; redirect_uri&#xff1a;授权后重定向的回调链接地址&#xff0c; 请使用 urlEncode 对链接进行处理。 授权后跳转回页面&#xff1a; redirec…

微信网页开发--分享接口

流程 关于流程&#xff0c;在上一篇中已经有图介绍: 微信文档 微信JS-SDK说明文档 JSSDK使用步骤 首先确保已经获取了相关权限 步骤一&#xff1a;绑定域名 先登录微信公众平台进入“公众号设置”的“功能设置”里填写“JS接口安全域名”。 备注&#xff1a;登录后…

微信网页开发样式库的使用

一、WeUI 是什么 WeUI 是一套同微信原生视觉体验一致的基础样式库&#xff0c;由微信官方设计团队为微信内网页和微信小程序量身设计&#xff0c;令用户的使用感知更加统一。在微信网页或小程序中使用 WeUI&#xff0c;有如下优势&#xff1a; 1. 同微信客户端一致的视觉效果…

微信网页开发(10)--扫一扫功能接口

点此查看 微信公众号/微信网页/微信支付/企业微信/小程序开发合集及源代码下载 本文目录 1. 背景2. 代码3. 测试 1. 背景 我们可以在微信网页调起扫一扫功能&#xff0c;可以识别一维码、二维码的内容&#xff0c;然后根据扫码结果实现我们的业务逻辑。 2. 代码 代码如下&am…

微信公众号开发—通过网页授权实现业务系统登录及用户绑定(微信网页授权自动登录业务系统)

&#x1f60a; 作者&#xff1a; 一恍过去 &#x1f496; 主页&#xff1a; https://blog.csdn.net/zhuocailing3390 &#x1f38a; 社区&#xff1a; Java技术栈交流 &#x1f389; 主题&#xff1a; 微信公众号开发—通过网页授权实现业务系统登录及用户绑定(微信网页授权…

微信网页开发,禁止右上角微信复制分享链接JS

禁止微信右上角分享链接 开发网页时&#xff0c;为了提高网页链接的安全&#xff0c;不想让别人分享链接给别人 一般微信打开网页后&#xff0c;点击右上角是这样的 想要网页不能被复制&#xff0c;不能分享给其他人 效果图&#xff1a; 资源文件下载地址 下载地址 直接贴…

开发微信网页及调试方法

参考资料 Mac中怎么使用Nginx实现80端口转发8080端口 - 大数据 - 亿速云 使用代理映射解决微信页面调试难题 | 梦翼坊 微信开发工具里的域名必须是在微信公众号白名单里的域名,而npm run dev大多是localhost,所以为了方便调试,需要如下步骤 在Charles勾选Proxy-macOS Proxy…

微信网页开发之JS-SDK初使用

最近需要做一个页面&#xff0c;该页面使用微信浏览器打开&#xff0c;功能如下&#xff1a; 1、用户打开链接之后获取到用户的openId&#xff0c;用于支付、获取后台数据等场景 2、自定义分享链接、标题、图标、描述等 3、隐藏微信页面中的某些菜单项列表 阅读本文前需掌握…

微信网页开发--获取微信用户信息

流程 用户扫码或者直接点击链接进入我们的入口页面&#xff1b;进入授权登录页面&#xff0c;用户点击授权登录按钮&#xff1b;微信会自动将我么的网页授权域名后增加参数&#xff1b;根据微信给的code去获取当前登录的微信用户的用户信息。 具体操作过程 1.配置网页授权域名…

微信网页开发(4)--使用JSSDK基础接口

点此查看 微信公众号/微信网页/微信支付/企业微信/小程序开发合集及源代码下载 本文目录 1. JSSDK接口2. 基础接口3. 开发流程3.1 绑定域名3.2 引入JS文件3.3 通过config接口注入权限验证配置3.5 调用基础接口 4. 小结 1. JSSDK接口 微信提供了很多JSSDK接口&#xff0c;包括基…

微信网页开发(8)--地理位置接口

点此查看 微信公众号/微信网页/微信支付/企业微信/小程序开发合集及源代码下载 本文目录 1. 背景2. 代码3. 测试 1. 背景 微信网页提供了获取当前地理位置经纬度&#xff0c;以及通过内置地图查看当前位置的接口。 官方接口说明如下&#xff1a; // 获取位置 wx.getLocation…

微信公众号开发——2、微信网页开发

第一部分、为公众号菜单嵌入网页 一、关键参考文档 微信JS-SDK说明文档 。 二、编辑模式嵌入网页 在公众号平台下&#xff0c;自定义菜单&#xff0c;添加菜单&#xff0c;并选择菜单内容跳转到指定页面地址即可&#xff08;需认证后方可添加页面地址&#xff0c;个人账号暂不…

微信网页开发配置整理

真是人越大记忆越差&#xff0c;断断续续做了几个微信小程序和微信h5项目&#xff0c;然鹅小程序的开发流程有些都忘了&#xff0c;最近刚做完一个微信h5网页开发的项目&#xff0c;所以赶紧记录下开发中需要注意的点&#xff0c;给自己往后回顾&#xff0c;同时也给第一次接入…

微信网页开发调试的一些方法

1. 微信开发者工具调试 微信开发者工具下载 不过多介绍, 下载安装, 就能开始小程序开发和公众号网页开发. 2. 微信内自带调试 微信内打开网页 http://debugx5.qq.com (仅支持Android微信) 打开下面两项&#xff0c;就可以调试了 3. 使用vConsole插件 1. 下载vConsole插件…

前端对接微信公众号网页开发流程,前期配置

微信公众号网页开发&#xff0c;其实就是我们开发的h5网页需要放到微信浏览器环境中使用&#xff0c;但是需要对接公众号授权&#xff0c;授权之后可以获取到用户的个人信息&#xff0c;以及可以使用公众号提供的一些API,如&#xff1a;图片上传、图片预览、获取位置信息、微信…

微信网页开发(3)--微信网页授权

点此查看 微信公众号/微信网页/微信支付/企业微信/小程序开发合集及源代码下载 本文目录 1. 什么是授权2. 两种授权方式3. 网页授权access_token和普通access_token4. 网页授权流程5. 网页授权代码开发5.1 项目搭建5.2 修改配置文件5.3 开发启动类5.4 开发公众号配置类5.5 开发…

微信网页开发:微信内h5使用wx-open-launch-weapp打开小程序,微信内h5使用wx-open-launch-app打开App的方案

需求场景&#xff1a; 当我们需要使用在微信客户端打开的h5页面&#xff0c;在页面上打开微信小程序或者唤起App时&#xff0c;我们需要使用微信js-sdk提供的开放标签能力。这其中&#xff1a;使用wx-open-launch-weapp标签打开微信小程序&#xff1b;使用wx-open-launch-app跳…

算法分析与设计 二分查找

算法分析与设计 二分查找 二分查找的基本概念 ​ 二分查找是一种在有序数组中查找某一特定元素的查找算法。这种查找方法将查找的时间复杂度从原本的线性时间提升到了对数时间范围&#xff0c;大大缩短了搜索时间。 ​ 二分查找的基本思想是&#xff1a;在查找过程从数组的中…

C语言二分查找

我们常常需要对数据进行查找&#xff0c;修改&#xff0c;查找数据有许多方法&#xff0c;我们先看看最简单的顺序查找 int main() {int i, k 0;scanf("%d", &k);int arr[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };int sz sizeof(arr) / sizeof(arr[0]);for (i…

二分查找【详解】

本期介绍&#x1f356; 主要介绍&#xff1a;二分查找的简单思路&#xff0c;为什么必须在有序的前提下才能使用二分查找&#xff0c;该怎么用C程序来实现二分查找&#xff0c;二分查找的局限性&#x1f440;。 目录&#x1f356; 简单思路前提条件编写程序总结 简单思路&…