自定义菜单url不能带_微服务架构【SpringBoot+SpringCloud+VUE】五 || 实战项目微信公众号自定义开发...

本章主要讲解微信公众号自定义菜单、微信网页开发、模板消息推送等功能的实现;

发福利了,下方关注公众号,就能免费获取项目源码

1、自定义菜单

开发前需要了解以下几点:

1、微信公众号的自定义菜单最多包括3个一级菜单,每个一级菜单最多包含5个二级菜单。

2、一级菜单最多4个汉字,二级菜单最多7个汉字,多出来的部分将会以“...”代替。

3、自定义菜单接口可实现多种类型按钮,本教程主要实现以下两个按钮,更多按钮参照官方文档:

  • click:点击推事件按钮

  • view:跳转URL按钮

创建自定义菜单接口调用请求说明

http请求方式:POST(请使用https协议) https://api.weixin.qq.com/cgi-bin/menu/create?access_token=ACCESS_TOKEN

click和view的请求示例如下所示:

{
"button":[
{
"type":"click",
"name":"今日歌曲",
"key":"V1001_TODAY_MUSIC"
},
{
"name":"菜单",
"sub_button":[
{
"type":"view",
"name":"搜索",
"url":"http://www.soso.com/"
},
{
"type":"miniprogram",
"name":"wxa",
"url":"http://mp.weixin.qq.com",
"appid":"wx286b93c14bbf93aa",
"pagepath":"pages/lunar/index"
},
{
"type":"click",
"name":"赞一下我们",
"key":"V1001_GOOD"
}]
}]
}

下面我们基于mp框架创建公众号菜单:需要项目源码的请下方关注公众号获取

现在我们要实现如图所示的菜单,我们应该如何去实现?

d38bc0c7c774293a40a1a19d54d7def7.png

我们只用调用WxMpService的getMenuService()方法,获取WxMpMenuService,该类下封装了菜单的查询、删除、创建等方法,调用menuCreate方法可以创建自定义菜单,方法如下:

WxMenu menu = new WxMenu();
WxMenuButton button1 = new WxMenuButton();
button1.setType(WxConsts.MenuButtonType.CLICK);
button1.setName("今日热点");
button1.setKey("V1001_TODAY_MUSIC");

WxMenuButton button2 = new WxMenuButton();
button2.setType(WxConsts.MenuButtonType.CLICK);
button2.setName("发布信息");
button2.setKey("V1001_TODAY_MUSIC");

WxMenuButton button3 = new WxMenuButton();
button3.setName("用户中心");

menu.getButtons().add(button1);
menu.getButtons().add(button2);
menu.getButtons().add(button3);

WxMenuButton button31 = new WxMenuButton();
button31.setType(WxConsts.MenuButtonType.VIEW);
button31.setName("搜索");
button31.setUrl("http://www.soso.com/");

WxMenuButton button32 = new WxMenuButton();
button32.setType(WxConsts.MenuButtonType.VIEW);
button32.setName("视频");
button32.setUrl("http://v.qq.com/");

WxMenuButton button33 = new WxMenuButton();
button33.setType(WxConsts.MenuButtonType.CLICK);
button33.setName("个人信息");
button33.setKey("V1001_GOOD");

WxMenuButton button34 = new WxMenuButton();
button34.setType(WxConsts.MenuButtonType.VIEW);
button34.setName("获取用户信息");

ServletRequestAttributes servletRequestAttributes =
(ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
if (servletRequestAttributes != null) {
HttpServletRequest request = servletRequestAttributes.getRequest();
URL requestURL = new URL(request.getRequestURL().toString());
String url = this.wxService.switchoverTo(appid).getOAuth2Service().buildAuthorizationUrl(
String.format("%s://%s/wx/redirect/%s/greet", requestURL.getProtocol(), requestURL.getHost(), appid),
WxConsts.OAuth2Scope.SNSAPI_USERINFO, null);
button34.setUrl(url);
}

button3.getSubButtons().add(button31);
button3.getSubButtons().add(button32);
button3.getSubButtons().add(button33);
button3.getSubButtons().add(button34);

this.wxService.switchover(appid);
return this.wxService.getMenuService().menuCreate(menu);

2、微信网页开发

我们现在要实现这么一个功能,用户点击菜单,进入到我们自己开发的H5页面,同时要获取用户的信息,应该如何去实现?

下面我看一个官方文档:如果用户在微信客户端中访问第三方网页,公众号可以通过微信网页授权机制,来获取用户基本信息,进而实现业务逻辑。步骤如下:

1 第一步:用户同意授权,获取code

2 第二步:通过code换取网页授权access_token

3 第三步:刷新access_token(如果需要)

4 第四步:拉取用户信息(需scope为 snsapi_userinfo)

5 附:检验授权凭证(access_token)是否有效

2.1、获取code

应用授权作用域有两种方式:snsapi_base (不弹出授权页面,直接跳转,只能获取用户openid),snsapi_userinfo (弹出授权页面,可通过openid拿到昵称、性别、所在地。并且, 即使在未关注的情况下,只要用户授权,也能获取其信息 )

我们只需要按照字段顺序组装如下url地址,

redirect_uri为你自己服务端的回调地址;

scope可以选择snsapi_base或者snsapi_userinfo;

response_type固定填写code;

state重定向后会带上state参数,开发者可以填写a-zA-Z0-9的参数值;

#wechat_redirect 无论直接打开还是做页面302重定向时候,必须带此参数

https://open.weixin.qq.com/connect/oauth2/authorize?appid=wx520c15f417810387&redirect_uri=https%3A%2F%2Fchong.qq.com%2Fphp%2Findex.php%3Fd%3D%26c%3DwxAdapter%26m%3DmobileDeal%26showwxpaytitle%3D1%26vb2ctag%3D4_2030_5_1194_60&response_type=code&scope=snsapi_base&state=123#wechat_redirect

我们在微信端访问该地址,会通过回调地址把code带过来

后端代码实现如下所示:

HttpServletRequest request = servletRequestAttributes.getRequest();
URL requestURL = new URL(request.getRequestURL().toString());
String url = this.wxService.switchoverTo(appid).getOAuth2Service().buildAuthorizationUrl(
String.format("%s://%s/wx/redirect/%s/greet", requestURL.getProtocol(), requestURL.getHost(), appid),
WxConsts.OAuth2Scope.SNSAPI_USERINFO, null);

2.2、通过code换取网页授权access_token

请求方法:

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

后端代码实现比较简单,通过以下方法就能获取到用户信息:

WxMpOAuth2AccessToken accessToken = wxService.getOAuth2Service().getAccessToken(code);
WxMpUser user = wxService.getOAuth2Service().getUserInfo(accessToken, null);

2.3、刷新access_token

由于access_token拥有较短的有效期,当access_token超时后,可以使用refresh_token进行刷新,refresh_token有效期为30天,当refresh_token失效之后,需要用户重新授权。

获取第二步的refresh_token后,请求以下链接获取access_token:https://api.weixin.qq.com/sns/oauth2/refresh_token?appid=APPID&grant_type=refresh_token&refresh_token=REFRESH_TOKEN

我们只用调用wxService.getOAuth2Service().refreshAccessToken(refresh_token)方法就可以实现刷新token,是不是非常的简单。

2.4、拉取用户信息

如果网页授权作用域为snsapi_userinfo,则可以通过access_token和openid获取用户信息。

http:GET(请使用https协议) https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN

同样,后端方法也非常简单,只用调用wxService.getOAuth2Service().getUserInfo();即可。

3、模板消息推送

我们需要实现一个功能,公众号平台需要给用户主动推送消息,例如:支付的通知、通知、公告等;如下图所示,我需要给用户推送如下信息,该如何实现?

b702e9958a3657f6aa8b3ac7af756064.png

首先,我们进入到公众平台创建模板消息,点击新增测试模板

038873e706c77e73871e08dbe1dcf3a0.png

进入模板添加页面后,需要填写模板标题和内容,标题就是上图所示的重要通知,而模板内容我们想写成动态,如何实现?我们只用按{{first.DATA}}这样的格式,就可以通过后端传入我们需要的内容:我们模板方法中有两个动态参数,分别是{{first.DATA}},和{{remark.DATA}},后端代码实现如下:

@GetMapping("/send")
public void testSendTemplateMsg() throws WxErrorException {
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
WxMpTemplateMessage templateMessage = WxMpTemplateMessage.builder()
.toUser("oiAsTwtKx4qzbwuRozjSO7NvXD_A")
.templateId("-sJvjdzIpKyH4MTi-c0A5HAfrxgWCyvmrHhcQB1fk-Q")
.url(" ")
.build();
templateMessage.addData(new WxMpTemplateData("first", dateFormat.format(new Date()), "#FF00FF"))
.addData(new WxMpTemplateData("remark", "公众号上线啦", "#FF00FF"));
String msgId = this.wxService.getTemplateMsgService().sendTemplateMsg(templateMessage);
}

其中.toUser为发送给哪个用户,参数为openId,如何获取openId,就需要通过上面的网页授权获取了

.templateId()为模板id,我们在传教了模板之后会有一个id,把该id填入到该参数里面

first模板中的{{first.DATA}}参数,同理remark为模板中的{{remark.DATA}}参数,可以把{{XX.DATA}}理解为占位符,调用以上方法,就会把内容通知到用户的公众号。

本章内容就讲解到这,微信公众号更多的个性化开发查看官方文档以及开源框架文档,下一期带大家学习如何通过mq实现消息的阶梯式通知。

4、学习交流QQ群【883210148】

73195771505dbeacdc5c8314d9bb8c5a.png

5、关注微信公众号,免费获取文档及资源

0da09d9f724957b2230fbd3e51c277cc.png

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

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

相关文章

C语言编程中关于负数的%运算的判定。

如果 % 两边的操作数都为正数,则结果为正数或零;如果 % 两边的操作数都是负数,则结果为负数或零。C99 以前,并没有规定如果操作数中有一方为负数,模除的结果会是什么。C99 规定,如果 % 左边的操作数是正数&…

mnesia mysql性能,Mnesia数据库的存储容量是多少?

Some places state 2GB period. Some places state it depends up the number of nodes.解决方案Quite large if your question is "whats the storage capacity of an mnesia database made up of a huge number of disc_only_copies tables" - youre largely limit…

无数种求逆元的方法总结

乘法逆元 对于缩系中的元素,每个数a均有唯一的与之对应的乘法逆元x,使得ax≡1(mod n) 一个数有逆元的充分必要条件是gcd(a,n)1,此时逆元唯一存在 逆元的含义:模n意义下,1个数a如果有逆元x,那么除以a相当于…

【CF#2A】Winner(模拟 STL-map)☆

题干: The winner of the card game popular in Berland "Berlogging" is determined according to the following rules. If at the end of the game there is only one player with the maximum number of points, he is the winner. The situation be…

python两个元组相加_《第5章 Python 列表与元组》5.1.3 序列相加(Adding)!

《高中信息技术 Python编程》 教学案《第5章 Python 列表与元组》 5.1.3 序列相加(Adding)!06:151 #使用加号可以进行序列的连接操作,输入如下:2 >>>[1,2,3][4,5,6]3 [1,2,3,4,5,6]4 >>>a[1,2]5 >>>b[5,6]6 >&…

STL之 set简略介绍。

set常用函数及其讲解 构造set集合的主要目的是为了快速检索&#xff0c;使用set前&#xff0c;需要在程序头文件中包含声明“#include<set>”。 set集合容器实现了红黑树&#xff08;Red-Black Tree&#xff09;的平衡二叉检索树的的数据结构&#xff0c;在插入元素时&a…

mysql 按时间查询优化_mysql如何按时间查询优化

mysql按时间查询优化的方法&#xff1a;1、【register_time】字段是datetime类型&#xff0c;转换为日期再匹配&#xff0c;需要查询出所有行进行过滤&#xff1b;2、可以利用在【register_time】字段上建立索引&#xff0c;查询极快。本教程操作环境&#xff1a;windows7系统、…

【HDU - 5688 】Problem D(STL+map)

题干&#xff1a; 度熊所居住的 D 国&#xff0c;是一个完全尊重人权的国度。以至于这个国家的所有人命名自己的名字都非常奇怪。一个人的名字由若干个字符组成&#xff0c;同样的&#xff0c;这些字符的全排列的结果中的每一个字符串&#xff0c;也都是这个人的名字。例如&am…

列举python中常用的数据类型_Python基础知识 变量和简单数据类型

在本章节中&#xff0c;将介绍Python程序中会使用到的各种数据类型&#xff0c;以及如何在程序中使用变量来表示这些数据。其中用到的一些例子均来自《Python编程从入门到实践 第2版》。一、变量1. 变量是标签变量是可以赋给值的标签&#xff0c;也可以说变量指向特定的值。mes…

【HDU - 1412】 {A} + {B} (STL + set)

题干&#xff1a; 给你两个集合&#xff0c;要求{A} {B}. 注:同一个集合中不会有两个相同的元素. Input 每组输入数据分为三行,第一行有两个数字n,m(0<n,m<10000),分别表示集合A和集合B的元素个数.后两行分别表示集合A和集合B.每个元素为不超出int范围的整数,每个元…

angularjs 开发流程_超级棒的30款web前端开发工具汇总,一定要收藏!

我们与企业内部的Web开发团队进行了很多次交流&#xff0c;研究了很长时间&#xff0c;最后将Debug工具与Web前端开发工具整理汇总在了一起&#xff0c;这些工具对每个Web开发人员都非常有用。这些工具将使您的工作更加轻松&#xff0c;特别是如果您是Web开发人员&#xff0c;W…

*【HDU - 4006】 The kth great number(优先队列 or 线段树)

题干&#xff1a; Xiao Ming and Xiao Bao are playing a simple Numbers game. In a round Xiao Ming can choose to write down a number, or ask Xiao Bao what the kth great number is. Because the number written by Xiao Ming is too much, Xiao Bao is feeling giddy…

linux mysql io压力大_MySQL 调优基础(四) Linux 磁盘IO_MySQL

1. IO处理过程磁盘IO经常会成为系统的一个瓶颈&#xff0c;特别是对于运行数据库的系统而言。数据从磁盘读取到内存&#xff0c;在到CPU缓存和寄存器&#xff0c;然后进行处理&#xff0c;最后写回磁盘&#xff0c;中间要经过很多的过程&#xff0c;下图是一个以write为例的 Li…

mysql可以存储标点么_MySQL查询(进阶)(每个标点都是重点)

MySQL 是工作中很普遍的需要用到的,所以必须掌握,而 之前我们一直说的都是怎么存.你只会存不会取有个屁用.所以希望大家在如何查询读取数据这方面多下点功夫.这篇和上一篇都是干货,我也是第一次学.反正我就是这样理解,这样一遍一遍写,一遍一遍看的才慢慢有点感觉的.目前还整理的…

【HDU - 1263】 水果(STL)

题干&#xff1a; 夏天来了~~好开心啊,呵呵,好多好多水果~~ Joe经营着一个不大的水果店.他认为生存之道就是经营最受顾客欢迎的水果.现在他想要一份水果销售情况的明细表,这样Joe就可以很容易掌握所有水果的销售情况了. Input 第一行正整数N(0<N<10)表示有N组测试数…

mysql死锁的排查方法_MySQL死锁系列-线上死锁问题排查思路

前言MySQL 死锁异常是我们经常会遇到的线上异常类别&#xff0c;一旦线上业务日间复杂&#xff0c;各种业务操作之间往往会产生锁冲突&#xff0c;有些会导致死锁异常。这种死锁异常一般要在特定时间特定数据和特定业务操作才会复现&#xff0c;并且分析解决时还需要了解 MySQL…

ACM - 欧拉函数(内容)

欧拉函数 &#xff1a; 欧拉函数是数论中很重要的一个函数&#xff0c;欧拉函数是指&#xff1a;对于一个正整数 n &#xff0c;小于 n 且和 n 互质的正整数&#xff08;包括 1&#xff09;的个数&#xff0c;记作 φ(n) 。 完全余数集合&#xff1a; 定义小于 n 且和 n 互质的…

分布式锁和mysql事物扣库存_浅谈库存扣减和锁

先说场景:物品W现在库存剩余1个, 用户P1,P2同时购买.则只有1人能购买成功.(前提是不允许超卖)秒杀也是类似的情况, 只有1件商品,N个用户同时抢购,只有1人能抢到..这里不谈秒杀设计,不谈使用队列等使请求串行化,就谈下怎么用锁来保证数据正确.常见的实现方案有以下几种:1.代码同…

【POJ - 2631 】Roads in the North(树的直径)

题干&#xff1a; Building and maintaining roads among communities in the far North is an expensive business. With this in mind, the roads are build such that there is only one route from a village to a village that does not pass through some other village…

齐博php百度编辑器上传图片_php版百度编辑器ueditor怎样给上传图片自动添加水印?...

百度ueditor是广泛使用的所见即所得图文排版编辑插件&#xff0c;功能比较完善&#xff0c;美中不足就是不支持自动加水印。万维景盛工程师搜集到php版ueditor自动加水印的教程&#xff0c;希望对大家有帮助。1.打开ueditor目录下的php目录下的config.json 文件在上传配置项添加…