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

article/2025/9/19 11:47:02

第一部分、为公众号菜单嵌入网页 


一、关键参考文档

 微信JS-SDK说明文档 。


二、编辑模式嵌入网页

在公众号平台下,自定义菜单,添加菜单,并选择菜单内容跳转到指定页面地址即可(需认证后方可添加页面地址,个人账号暂不支持认证)。

三、开发者模式嵌入网页(通过微信公众平台接口调试工具动态生成菜单)

1、基础支持中,通过appid和secret获取access_token,该值有效期为7200秒。(Get请求)

2、自定义创建菜单,填写access_token,发送body作为菜单项Post请求生成菜单,跳转网页的菜单格式如下。

       {"type": "view", "name": "我的网页", "url": "http://www.baidu.com"}, 


第二部分、在网页中调用微信接口

微信提供了众多接口,可以在网页中调用。如调用扫码接口、支付接口、选择图片等接口。要使用这些接口,需要遵从微信开发规则生成签名,并在网页中注入签名。具体可参考微信JS-SDK说明文档,本文使用测试号调用JS-SDK接口过程如下:


一、绑定域名

1、通过ngrok内网穿透工具,将80端口映射到公网(命令:ngrok http 80),获取域名。以下图示域名通过nat123工具获取

2、在公众测试号上配置“JS接口安全域名



二、生成签名,获取正确权限(具体请查看微信JS-SDK说明文档附录1)

1、获取access_token(有效期2小时,每日最多生成2000次)。

通过微信公众平台接口调试工具,填写appid和secret生成。

2、获取jsap_ticket值(有效期2小时,频繁刷新会导致api调用受限)

在浏览器中,输入https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=ACCESS_TOKEN&type=jsapi,同时替换access_token值,通过Get请求方式,浏览器会将jsapi_ticket值通过json格式显示出来,ticket字段即所需。错误请检查access_token是否过期,appid和secret是否正确。

3、获取签名,

3.1 微信JS-SDK接口文档附录6,提供了java、node、php、python不同版本的签名算法,在本文中,直接获取java版本的Sign类,添加到项目中,用户生成签名。

3.2 生成签名需要未过期的jsapi_ticket值和页面跳转的url值作为参数,该url应当与菜单跳转中的url一致,url中应该用域名而不是ip地址,否则不能获取权限。

3.3 通过签名算法,将jsapi_ticket,noncestr, timestamp,url等值存储在map中,我们需要将其动态添加到jsp页面的权限注入代码中。


三、为test.jsp网页引入js文件,注入权限

1、引入js文件,<script src="http://res.wx.qq.com/open/js/jweixin-1.0.0.js"></script>

2、在java服务器获取Sign并将必要数据传入jsp页面

	@RequestMapping("/test")private ModelAndView regist(HttpServletRequest request) throws Exception{ModelAndView mv = new ModelAndView();Map<String, String> sign = sign("regist");mv.addObject("sign", sign);mv.addObject("appid", WxConst.APP_ID);mv.setViewName("test");return mv;}
	protected Map<String, String> sign(String action) throws Exception {Map<String, String> map = WxConst.mMap;String ticket = "jsapi_ticket";String url = "http://12083054.nat123.cc/Test/wx/test";if (null != ticket && !"".equals(url) && null != url && !"".equals(url)) {Map<String, String> sign = Sign.sign(ticket, url);return sign;}return null;}
3、test.jsp页面获取数据,并动态为jsp注入权限,并是测试号,添加了beta字段,建议开启debug调试模式,jsApiList即是微信所提供的JS-SDK接口。

<script type="text/javascript">wx.config({beta:true,debug : true,appId : '${appid}',timestamp : ${sign.timestamp},nonceStr : '${sign.nonceStr}',signature : '${sign.signature}',jsApiList : [ 'checkJsApi', 'onMenuShareTimeline','onMenuShareAppMessage', 'onMenuShareQQ','onMenuShareWeibo', 'onMenuShareQZone', 'hideMenuItems','showMenuItems', 'hideAllNonBaseMenuItem','showAllNonBaseMenuItem', 'translateVoice', 'startRecord','stopRecord', 'onVoiceRecordEnd', 'playVoice','onVoicePlayEnd', 'pauseVoice', 'stopVoice', 'uploadVoice','downloadVoice', 'chooseImage', 'previewImage','uploadImage', 'downloadImage', 'getNetworkType','openLocation', 'getLocation', 'hideOptionMenu','showOptionMenu', 'closeWindow', 'scanQRCode','chooseWXPay', 'openProductSpecificView', 'addCard','chooseCard', 'openCard' ]})
</script/>
4、在jsp页面中,使用js语法调用微信提供的接口。
function onScan(){wx.ready(function(){wx.scanQRCode({needResult : 0,scanType : [ "qrCode", "barCode" ],success : function(res) {var result = res.resultStr;}});})
}
5、在微信web开发工具中调试,测试签名是否通过、权限是否获取。

输入测试网址:http://12083054.nat123.cc/Test/wx/test   (此处模拟跳转菜单的url,生成签名的url应当相同),查看”权限列表“


当可以获取的权限获取成功时,说明网页也可开始调用JS-SDK接口访问了。

6、未能成功获取权限、可能存在的问题

6.1、生成签名时,url参数与菜单跳转的url(本文中为微信web开发工具中输入的网址)不一致

6.2、未引入js文件:<script src="http://res.wx.qq.com/open/js/jweixin-1.0.0.js"></script>

6.3、appid或appsecret错误。

6.4、access_token已过期,需要重新生成。

6.5、jsapi_ticket已过期,需要重新生成。

6.6、内网穿透工具连接失败,需要重新生成域名。配置所有参数

常规解决思路:1、检查生成签名的url与菜单url是否一致。2、检查接口配置信息域名是否是最新并且正确。 3、重新通过appid和secret获取access_token和jsapi_ticket值并签名(即重新配置所有参数)。


第三部分:在网页中获取用户信息(关键字段:openid,加密后的微信号,每个用户对每个公众号的openid是唯一的

一、获取openid

方案一:通过微信服务器转发消息,获取用户openid

对于开发者模式,用户操作包括关注公众号、发送消息、点击菜单、绑定设备等操作,都将由微信服务器转发给开发者服务器,通过解析这些消息,可以获取到微信号对应的openid.

用户发送消息时,读取输入流解析的数据格式如下。

<xml><ToUserName><![CDATA[gh_3ec4154bc1424]]></ToUserName>
<FromUserName><![CDATA[oNAmB1M115AqndH0wluCMQQtQsJog]]></FromUserName>
<CreateTime>1504950429</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[滚滚长江东逝水]]></Content>
<MsgId>6463712875121877522</MsgId>
</xml>
其中,FromUserName字段,即为所需要的openid.
然而,由于用户数据由微信服务器转发给开发者服务器,该openid只能在接收微信服务的方法(开发都接口信息配置中的方法)中可获取此值。值得注意的是,该方法与开发者的网页并非处于同一会话中,是无法从会话中传递数据给开发者网页的。因此在网页开发过程上,不建议使用此方法获取openid提供给网页使用。

方案二:微信网页授权获取openid,即Oauth技术.

1、给微信测试号添加网页授权域名

在测试号平台的体验接口权限下,选择”网页账号“修改域名。


2、用户同意授权,获取code。(具体参考微信技术文档->微信网页授权部分)

在用户跳转页面中,将菜单跳转url修改为:

https://open.weixin.qq.com/connect/oauth2/authorize?appid=wx3efbcdb7f6c647b7&redirect_uri=http://13bbb09b.ngrok.io/Test/wx/test&response_type=code&scope=snsapi_userinfo&state=1&connect_redirect=1#wechat_redirect

其中appid表示公众号的appid;redicrect_uri为菜单项需要跳转的网页;scope可选择snsapi_base或snsapi_userinfo,state可填写a-zA-Z0-9的参数值。

3、检测该链接的正确合法性。

在微信web开发者工具中,输入上述url修改后的值。如果参数正确,调试界面显示如下:


出现错误时,需针对错误提示进行修改。容易出错点:OAuth授权域名和跳转的url不一致或未配置。

4、在redirect_uri中获取授权获得的信息,关键参数code参数

String code = request.getParameter("code")

5、通过code参数换取网页授权access_token,该值与基础支持中的access_token有差别。同时获取到当前用户的openid值。接口方法如下

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

返回json数据如下:

{ "access_token":"ACCESS_TOKEN",    "expires_in":7200,    "refresh_token":"REFRESH_TOKEN",    "openid":"OPENID",    "scope":"SCOPE" } 
通过以上方法便获取到了用户的openid值,避免了接口配置信息服务器,与网页开发服务器之间数据传递的麻烦。


二、根据openid获取用户信息

接口:https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN

其中:access_token为授权过程中,通过code获取的值,不能是基础支持中的值。以下代码未处理空指针异常。用户信息以键值对的形式保存在userinfo_jsonObj中。

	@RequestMapping("/test")private ModelAndView test() throws Exception{ModelAndView mv = new ModelAndView();//1、调用微信授权界面,拿到codeHttpServletRequest request = getRequest();String code = request.getParameter("code");//2、使用code获取access_token,此token与基础支持的token不同。有效期2小时String access_token_url_str = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=" + WxConst.APP_ID + "&secret=" + WxConst.APP_SECRET + "&code=" + code + "&grant_type=authorization_code";String access_token_json = WxRequest.doGet(new URL(access_token_url_str));JSONObject access_token_jsonObj = JSONObject.fromObject(access_token_json);String access_token = access_token_jsonObj.getString("access_token");String openid = access_token_jsonObj.getString("openid");//3、根据openid获取用户信息String userinfo_url_str = "https://api.weixin.qq.com/sns/userinfo?access_token=" + access_token + "&openid=" + openid;String userinfo_json = WxRequest.doGet(new URL(userinfo_url_str));JSONObject userinfo_jsonObj = JSONObject.fromObject(userinfo_json);mv.setViewName("test");return mv;}
	public static String doGet(URL url) throws Exception{HttpURLConnection connection = (HttpURLConnection) url.openConnection();StringBuffer sb = new StringBuffer();String line = "";BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));if (connection.getResponseCode() == HttpURLConnection.HTTP_OK) {while((line = reader.readLine()) != null){sb.append(line);}}System.out.println(sb.toString());reader.close();connection.disconnect();return sb.toString();}
最终获取到的用户信息json数据格式如下:

{    "openid":" OPENID",  " nickname": NICKNAME,   "sex":"1",   "province":"PROVINCE"   "city":"CITY",   "country":"COUNTRY",    "headimgurl":    "",  
"privilege":[ "PRIVILEGE1" "PRIVILEGE2"     ],    "unionid": "o6_bmasdasdsad6_2sgVt7hMZOPfL" 
} 

http://chatgpt.dhexx.cn/article/ywmsdt6r.shtml

相关文章

微信网页开发配置整理

真是人越大记忆越差&#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; 简单思路前提条件编写程序总结 简单思路&…

二分答案

二分答案 总所周知&#xff0c;二分法查找一个数的时间复杂度为O(log n)&#xff0c;所以在int范围内找一个数最多只需要30余次&#xff0c;在longlong范围内最多也只需要60余次。因此&#xff0c;我们可以利用二分这一优势查找答案。即&#xff0c;每次二分后判断该数是不是满…

初探二分算法

又来算法了~~~~ &#x1f603;&#x1f603;&#x1f606;&#x1f606;&#x1f603;&#x1f603;&#x1f603;&#x1f606;&#x1f606;&#x1f606;&#x1f440;&#x1f440;&#x1f606;&#x1f914; 什么是二分算法&#xff1f; 在计算机科学中&#xff0c;二分…

二分(数学背景,边界问题,二分查找,二分答案)

二分法的数学背景 目的 关于二分法的目的&#xff0c;这里引用同济大学数学系出版的《高等数学》第七版上册中关于二分法的相关内容。&#xff08;文段内容多&#xff0c;要有一点耐心~&#xff09; 在科学技术问题中&#xff0c;经常会遇到 求解高次代数方程或其他类型的方程的…

二分模板介绍

以一个典型例题来介绍二分法的两个通用模板&#xff0c;熟练掌握这两个模板可以解决绝大部分二分的问题。 例题&#xff1a;ACWing 789.数的范围 给定一个按照升序排列的长度为n的整数数组&#xff0c;以及q个查询。 对于每个查询&#xff0c;返回一个元素k的起始位置和终止…

二分算法详细解析

二分 有单调性一定可以二分&#xff0c;可以二分不一定有单调性二分的本质是边界不是单调性(单调一定可以二分&#xff0c;不单调的有的也可以二分) 本质&#xff1a;在一个区间上&#xff0c;找到某种性质&#xff0c;每次可以将区间一分为二&#xff08;存在边界&#xff09;…

一篇文章带你搞懂二分

一篇文章教你搞懂二分 二分整数二分实数域上二分二分查找二分答案 二分 到底什么是二分呢&#xff1f;二分二分就是一分为二。简单来说二分就是在有序序列中&#xff0c;通过不断的二分&#xff0c;进而不断地缩小范围去寻找满足我们条件的解。这只是对二分一个狭义上的理解&a…

深入字节版atop: 线上系统的性能监控实践

背景 atop 是一款开源的单机性能监测工具&#xff0c;支持实时观测的同时、也支持读取历史文件排查问题。另外一个优点是除提供 CPU、MEM、DISK 等全局指标外&#xff0c;还提供进程、线程级别的各项指标监控数据。鉴于 atop 的这些优点&#xff0c;字节跳动基于社区的 atop 进…

atop备忘

atop 安装 sudo apt install atop atop 参数说明 监控界面字段说明 ATOP列&#xff1a;该列显示了主机名、信息采样日期和时间点 PRC列&#xff1a;该列显示进程整体运行情况 sys、usr字段分别指示进程在内核态和用户态的运行时间 #proc字段指示进程总数 #zombie字段指示僵…

atop linux,每天学一个 Linux 命令(117):atop

命令简介 atop 命令是一款监控 Linux 系统资源与进程的工具&#xff0c;非内部命令&#xff0c;需要安装。[rootcentos7 ~]# atop -bash: atop: command not found [rootcentos7 ~]# yum install atop -y #Debian && Ubuntu apt-get install atop #Fedora dnf install …

linux 系统性能 检测 命令 atop

atop 主要可以 监测 cpu,内存&#xff0c;硬盘&#xff0c;网络性能&#xff0c;以及 实时读写 日志。 基本用法 1.查看 atop , 实时刷新 按 a ,退出 按q 2.保存日志 atop -w log.txt 3.查看 输出日志 atop -r log.txt &#xff0c; 按 t 查看 下一个样本的性能数据 &a…

Atop使用场景

问题&#xff1a; 1、线上容器环境pod报错无法创建本地线程&#xff0c;如下图所示&#xff1a; 2、日志中出现报错信息 “fork&#xff1a;Cannot allocate memory”。如下图所示&#xff1a; 可能原因 1、内存不够 2、可能是进程数超限导致。系统内部的总进程数达到了 p…

atop工具使用

atop是linux系统下一款监控系统资源与进程的工具。atop以一定的频率记录系统的运行状态,通过它可以了解系统今生前世。atop采集系统资源「cpu、mem、disk、net」的使用情况及所有进程使用系统资源的情况,定期采集相关数据保存日志文件。可以通过atop.daily文件调整数据采集的…