目录

  • 获取AccessToken
    • 1. 新建一个AccessToken对象
    • 2. 新建一个TokenUtil工具类
  • 自定义菜单
    • 自定义菜单功能介绍
    • 代码实现如下
    • 效果如下
  • 发送模板消息
    • 1. 设置⾏业
    • 2. 创建模版
    • 3. 发送模版消息
    • 4. 后台示例代码
    • 5. 三个方法测试效果
  • 微信素材的上传与获取
  • 源码下载

获取AccessToken

access_token是公众号的全局唯一接口调用凭据,公众号调用各接口时都需使用access_token。

官方文档:https://developers.weixin.qq.com/doc/offiaccount/Basic_Information/Get_access_token.html

1. 新建一个AccessToken对象

package cn.kt.mywxdemo.token;/*** Created by tao.* Date: 2023/3/7 16:26* 描述:*/
public class AccessToken {private String token;private long expireTime;public String getToken() {return token;}public void setToken(String token) {this.token = token;}public long getExpireTime() {return expireTime;}public void setExpireTime(long expireIn) {this.expireTime = System.currentTimeMillis() + expireIn * 1000;}/*** 判断是否超时** @return*/public boolean isExpired() {return System.currentTimeMillis() > this.expireTime;}
}

2. 新建一个TokenUtil工具类

package cn.kt.mywxdemo.token;import cn.kt.mywxdemo.utils.HttpUtil;
import net.sf.json.JSONObject;/*** Created by tao.* Date: 2023/3/7 16:26* 描述:*/
public class TokenUtil {private static final String APP_ID = "wx90a9158b6acc5584";private static final String APP_SECRET = "ec23a5d78f12afa569c64794570d753c";private static AccessToken accessToken = new AccessToken();public static void main(String[] args) {//{"access_token":"63_8R2EcPuM3dz_D81Q2FBiSfgrlwokafQloAU33iFhHIbjabRFtC_thRqk7VOkMbarQ8lA9yyq2pgwh4pc6P-5qQutc6WWMLwFafIR6ZaLkB299OJU78npFt--I0ACXCiACAHCH","expires_in":7200}System.out.println(getAccessToken());}private static void getToken() {String url = String.format("https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=%s&secret=%s",APP_ID,APP_SECRET);String result = HttpUtil.doGet(url);JSONObject jsonObject = JSONObject.fromObject(result);String token = jsonObject.getString("access_token");long expiresIn = jsonObject.getLong("expires_in");accessToken.setToken(token);accessToken.setExpireTime(expiresIn);}/*** 获取AccessToken** @return*/public static String getAccessToken() {if (accessToken == null || accessToken.isExpired()) {getToken();}return accessToken.getToken();}
}

之后AccessToken存了静态,过期可以自动更新可以直接使用TokenUtil.getAccessToken()获取

自定义菜单

自定义菜单功能介绍

自定义菜单能够帮助公众号丰富界面,让用户更好更快地理解公众号的功能。开启自定义菜单后,公众号界面如图所示:

自定义菜单接口可实现多种类型按钮,如下:

具体的参数详情和请求示例可以查看官方文档:https://developers.weixin.qq.com/doc/offiaccount/Custom_Menus/Creating_Custom-Defined_Menu.html

下面使用代码多态的方式实现:

  1. 一级菜单,二级菜单
  2. 点击类型按钮
  3. 跳转类型按钮
  4. 拍照或者相册选择事件按钮

代码实现如下

  1. 抽象类AbstractButton
package cn.kt.mywxdemo.button;/*** Created by tao.* Date: 2023/3/7 17:11* 描述:*/
public abstract class AbstractButton {private String name;public AbstractButton(String name) {this.name = name;}public String getName() {return name;}public void setName(String name) {this.name = name;}
}
  1. 菜单父类Button
package cn.kt.mywxdemo.button;import java.util.List;/*** Created by tao.* Date: 2023/3/7 17:11* 描述:*/
public class Button {private List<AbstractButton> button;public List<AbstractButton> getButton() {return button;}public void setButton(List<AbstractButton> button) {this.button = button;}
}
  1. 二级菜单类SubButton
package cn.kt.mywxdemo.button;import java.util.List;/*** Created by tao.* Date: 2023/3/7 17:18* 描述:*/
public class SubButton extends AbstractButton {public SubButton(String name) {super(name);}private List<AbstractButton> sub_button;public List<AbstractButton> getSub_button() {return sub_button;}public void setSub_button(List<AbstractButton> sub_button) {this.sub_button = sub_button;}
}
  1. 点击类型按钮类ClickButton
package cn.kt.mywxdemo.button;/*** Created by tao.* Date: 2023/3/7 17:13* 描述:*/
public class ClickButton extends AbstractButton{public ClickButton(String name) {super(name);this.type = "click";}private String type;private String key;public String getType() {return type;}public String getKey() {return key;}public void setKey(String key) {this.key = key;}
}
  1. 跳转类型按钮类ViewButton
package cn.kt.mywxdemo.button;/*** Created by tao.* Date: 2023/3/7 17:22* 描述:*/
public class ViewButton extends AbstractButton {public ViewButton(String name, String url) {super(name);this.type = "view";this.url = url;}private String type;private String url;public String getType() {return type;}public String getUrl() {return url;}public void setUrl(String url) {this.url = url;}
}
  1. 拍照或者相册选择事件按钮类PhotoOrAlbumButton
package cn.kt.mywxdemo.button;/*** Created by tao.* Date: 2023/3/7 17:15* 描述:*/
public class PhotoOrAlbumButton extends AbstractButton {public PhotoOrAlbumButton(String name, String key) {super(name);this.type = "pic_photo_or_album";this.key = key;}private String type;private String key;public String getType() {return type;}public String getKey() {return key;}public void setKey(String key) {this.key = key;}
}
  1. 主方法测试类TestButton
package cn.kt.mywxdemo.button;import cn.kt.mywxdemo.token.TokenUtil;
import cn.kt.mywxdemo.utils.HttpUtil;
import net.sf.json.JSONObject;import java.util.ArrayList;
import java.util.List;/*** Created by tao.* Date: 2023/3/7 17:18* 描述:*/
public class TestButton {public static void main(String[] args) {//创建一级菜单Button button = new Button();List<AbstractButton> buttons = new ArrayList<>();//一级菜单中的第一个按钮ClickButton clickButton = new ClickButton("博客");clickButton.setKey("1");//一级菜单中的第二个按钮ViewButton viewButton = new ViewButton("Nickの主页", "https://mytab.qkongtao.cn/");//一级菜单中的第三个按钮(二级菜单)SubButton subButton = new SubButton("更多");List<AbstractButton> subButtons = new ArrayList<>();//二级菜单的第一个按钮subButtons.add(new ViewButton("KT游戏厅", "http://fcgame.qkongtao.cn/"));//二级菜单的第二个按钮subButtons.add(new PhotoOrAlbumButton("上传图片", "2"));subButton.setSub_button(subButtons);//把一级菜单中的三个按钮添加进集合buttons.add(clickButton);buttons.add(viewButton);buttons.add(subButton);//把集合添加到一级菜单中button.setButton(buttons);//转换成json字符串JSONObject jsonObject = JSONObject.fromObject(button);String json = jsonObject.toString();String url = String.format("https://api.weixin.qq.com/cgi-bin/menu/create?access_token=%s", TokenUtil.getAccessToken());//发送请求String result = HttpUtil.doPostByButton(url, json);System.out.println(result);}
}

效果如下

运行后就会根据我们代码中的设置生成公众号的菜单,结果如图

发送模板消息

模板消息仅⽤于公众号向⽤户发送重要的服务通知,只能⽤于符合其要求的服务场景中,如信⽤卡刷卡通知,商品购买成功通知等。不⽀持⼴告等营销类消息以及其它所有可能对⽤户造成骚扰的消息。
关于使⽤规则,请注意:

  • 所有服务号都可以在功能->添加功能插件处看到申请模板消息功能的⼊⼝,但只有认证后的服务号才可以申请模板消息的使⽤权限并获得该权限;
  • 需要选择公众账号服务所处的2个⾏业,每⽉可更改1次所选⾏业;
  • 在所选择⾏业的模板库中选⽤已有的模板进⾏调⽤;
  • 每个账号可以同时使⽤25个模板。
  • 当前每个账号的模板消息的⽇调⽤上限为10万次,单个模板没有特殊限制。【2014年11⽉18⽇将接⼝调⽤频率从默认的⽇1万次提升为⽇10万次,可在 MP 登录后的开发者中⼼查看】。当账号粉丝数超过10W/100W/1000W时,模板消息的⽇调⽤上限会相应提升,以公众号 MP 后台开发者中⼼⻚⾯中标明的数字为准。

关于接⼝⽂档,请注意:

  • 模板消息调⽤时主要需要模板 ID 和模板中各参数的赋值内容;
  • 模板中参数内容必须以".DATA"结尾,否则视为保留字;
  • 模板保留符号""。

微信模板消息详情具体参考:https://developers.weixin.qq.com/doc/offiaccount/Message_Management/Template_Message_Interface.html

1. 设置⾏业

设置⾏业可在微信公众平台后台完成,每⽉可修改⾏业1次,帐号仅可使⽤所属⾏业中相关的模板,为⽅便第三⽅开发者,提供通过接⼝调⽤的⽅式来修改账号所属⾏业,具体如下:

接⼝调⽤请求说明

http请求⽅式: POST https://api.weixin.qq.com/cgi-bin/template/api_set_industry?access_token=ACCESS_TOKEN

POST数据说明
POST数据示例如下

{"industry_id1":"1","industry_id2":"4"
}

参数说明

2. 创建模版

在微信公众平台根据⾏业模版案例创建消息模版。

附目前允许发的模板示例下载:点击下载

可自行根据允许的模板进行设置自己行业的消息模板。

3. 发送模版消息

接⼝调⽤请求说明

http请求⽅式: POST https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=ACCESS_TOKEN

POST数据说明
POST数据示例如下:

{"touser": "OPENID","template_id": "ngqIpbwh8bUfcSsECmogfXcV14J0tQlEpBO27izEYtY","url": "http://weixin.qq.com/download","miniprogram": {"appid": "xiaochengxuappid12345","pagepath": "index?foo=bar"},"client_msg_id": "MSG_000001","data": {"first": {"value": "恭喜你报名成功!","color": "#173177"},"keyword1": {"value": "张三","color": "#173177"},"keyword2": {"value": "18899887766","color": "#173177"},"keyword3": {"value": "2023年9⽉22⽇","color": "#173177"},"keyword4": {"value": "Java核心基础课程","color": "#173177"},"remark": {"value": "欢迎来到新世界!","color": "#173177"}}
}

参数说明:

注:url和 miniprogram 都是⾮必填字段,若都不传则模板⽆跳转;若都传,会优先跳转⾄⼩程序。开发者可根据实际需要选择其中⼀种跳转⽅式即可。当⽤户的微信客户端版本不⽀持跳⼩程序时,将会跳转⾄url。

返回码说明
在调⽤模板消息接⼝后,会返回 JSON 数据包。正常时的返回 JSON 数据包示例:

{"errcode": 0,"errmsg": "ok","msgid": 200228332
}

4. 后台示例代码

package cn.kt.mywxdemo.message;import cn.kt.mywxdemo.token.TokenUtil;
import cn.kt.mywxdemo.utils.HttpUtil;
import org.junit.Test;/*** Created by tao.* Date: 2023/3/7 19:26* 描述:*/
public class TestModelMessage {//  设置模板行业信息//  参考文档:https://developers.weixin.qq.com/doc/offiaccount/Message_Management/Template_Message_Interface.html@Testpublic void testTrade() {String url = String.format("https://api.weixin.qq.com/cgi-bin/template/api_set_industry?access_token=%s",TokenUtil.getAccessToken());String data = "{\n" +"    \"industry_id1\":\"1\",\n" +"    \"industry_id2\":\"4\"\n" +"}";//使用postSystem.out.println(HttpUtil.doPost(url, data));}// 获取设置的模板行业信息@Testpublic void testGetTrade() {String url = String.format("https://api.weixin.qq.com/cgi-bin/template/get_industry?access_token=%s",TokenUtil.getAccessToken());System.out.println(HttpUtil.doGet(url));}// 发送模板消息@Testpublic void testModelmessage() {String url = String.format("https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=%s",TokenUtil.getAccessToken());String data = "{\n" +"           \"touser\":\"oJ4VY61KtF_VJL2Zwm_S-4cJnYCw\",\n" +"           \"template_id\":\"1_BTU1dlGB9rPWv5JL-Kkivn6OhjAt7wZMGqE9SHaG4\",\n" +"           \"data\":{\n" +"                   \"first\": {\n" +"                       \"value\":\"恭喜你报名成功!\",\n" +"                       \"color\":\"#173177\"\n" +"                   },\n" +"                   \"keyword1\":{\n" +"                       \"value\":\"张三\",\n" +"                       \"color\":\"#173177\"\n" +"                   },\n" +"                   \"keyword2\": {\n" +"                       \"value\":\"18899887766\",\n" +"                       \"color\":\"#173177\"\n" +"                   },\n" +"                   \"keyword3\": {\n" +"                       \"value\":\"2023年9月22日\",\n" +"                       \"color\":\"#173177\"\n" +"                   },\n" +"                   \"keyword4\": {\n" +"                       \"value\":\"Java核心基础课程\",\n" +"                       \"color\":\"#173177\"\n" +"                   },\n" +"                   \"remark\":{\n" +"                       \"value\":\"欢迎来到新世界!\",\n" +"                       \"color\":\"#173177\"\n" +"                   }\n" +"           }\n" +"       }";System.out.println(HttpUtil.doPost(url, data));}
}

5. 三个方法测试效果

微信素材的上传与获取

公众号经常有需要⽤到⼀些临时性的多媒体素材的场景,例如在使⽤接⼝特别是发送消息时,对多媒体⽂件、多媒体消息的获取和调⽤等操作,是通过media_id来进⾏的。素材管理接⼝对所有认证的订阅号和服务号开放。通过本接⼝,公众号可以新增临时素材(即上传临时多媒体⽂件)。
注意点:
1)临时素材media_id是可复⽤的。
2)媒体⽂件在微信后台保存时间为3天,即3天后media_id失效。
3)上传临时素材的格式、⼤⼩限制与公众平台官⽹⼀致。
图⽚(image): 10M,⽀持PNG\JPEG\JPG\GIF格式
语⾳(voice):2M,播放⻓度不超过60s,⽀持AMR\MP3格式
视频(video):10MB,⽀持MP4格式
缩略图(thumb):64KB,⽀持 JPG 格式
4)需使用https调用本接口。

http请求方式:POST/FORM,使用https https://api.weixin.qq.com/cgi-bin/media/upload?access_token=ACCESS_TOKEN&type=TYPE 调用示例(使用curl命令,用FORM表单方式上传一个多媒体文件)

具体参数详情参考官方文档:https://developers.weixin.qq.com/doc/offiaccount/Asset_Management/New_temporary_materials.html

测试代码如下:
发送请求工具还是使用之前封装的HttpUtil

package cn.kt.mywxdemo.message;import cn.kt.mywxdemo.token.TokenUtil;
import cn.kt.mywxdemo.utils.HttpUtil;
import org.junit.Test;/*** 测试 素材管理* <p>* Created by tao.* Date: 2023/3/7 19:56* 描述:*/
public class TestMedia {//上传临时素材@Testpublic void testImage() {String url = String.format("https://api.weixin.qq.com/cgi-bin/media/upload?access_token=%s&type=%s",TokenUtil.getAccessToken(),"image");String result = HttpUtil.doPostByFile(url, null, "D:/images/bg.png", "");System.out.println(result);//{"type":"image","media_id":"h7mvkpNYOsmyPtPxnvwh7hopFlQ2LLBalyiCXcfGG2p943IqKHrrSTYdIDMbeRID","created_at":1670224505,"item":[]}}/*https://api.weixin.qq.com/cgi-bin/media/get?access_token=66_3Tp-hBPrXQOwoMOwoIygqf_U9YBcqk5tae28kEQtW89kaqaHKcOsXi4vudWi9CiBeBBk7nyxsHirQvQdrsOkyKrBbw8p2MDQZ2BU6pCsm7viUjdS_Ya4VzJuNN4OXFaAIAAJR&media_id=1AHMhn2WLJngIZ31Fiar-SCClNE34BPvmozpfXkvwUKlAt4b4oRQ9iFwk_x1S7n8*///获得临时素材@Testpublic void testGetImage() {String mediaId = "h7mvkpNYOsmyPtPxnvwh7hopFlQ2LLBalyiCXcfGG2p943IqKHrrSTYdIDMbeRID";String url = String.format("https://api.weixin.qq.com/cgi-bin/media/get?access_token=%s&media_id=%s",TokenUtil.getAccessToken(),mediaId);String result = HttpUtil.doGet(url);System.out.println(result);}
}

结果如下:

使用返回的media_id,拼接获取素材的接口即可获取素材:
示例如下:
https://api.weixin.qq.com/cgi-bin/media/get?access_token=66_0qO7imNJGvzK1_oSoEK461VzV9406hIL8nv0GEJLH4okCZoYGR1c4uaQDrWdVsbB2fccXTEOac4kOg4eVdyZhp4Umjsl3RMqeoRv8BwTdj-x53ro9Dkf01L4pXMOVKeABAFMB&media_id=WLZtwg8LEjKZstdxRKVGfK8cX0ctJp4rIt4wVgkx2HvTHRfF1vdG8Tlqg3ilJN6P

源码下载

源码链接:https://gitee.com/qkongtao/my-wx-demo

微信公众平台开发(二)——自定义菜单、模板消息微信素材相关推荐

  1. php 自定义菜单 openid,微信公众平台开发(99) 自定义菜单获取OpenID

    关键字 微信公众平台 自定义菜单 OpenID 作者:方倍工作室 原文:http://www.cnblogs.com/txw1958/p/weixin-menu-get-openid.html 在这篇 ...

  2. 微信公众平台开发(104) 自定义菜单扫一扫、发图片、发地理位置

    关键字:微信公众平台 自定义菜单 扫一扫 发图片 发地理位置 作者:方倍工作室 原文:http://www.cnblogs.com/txw1958/p/weixin-menu-new-type.htm ...

  3. 微信公众平台开发教程--自定义菜单

    微信公众平台开发教程(五)自定义菜单 请尊重作者版权,如需转载,请标明出处. 应大家强烈要求,将自定义菜单功能课程提前. 一.概述: 如果只有输入框,可能太简单,感觉像命令行.自定义菜单,给我们提供了 ...

  4. 微信公众平台开发,自定义菜单,群发消息,网页授权(3)

    前两节说的都是微信开发的初级篇,这一节说高级篇.微信公众号关注以后,下面都是有菜单的,底部有三个一级菜单,每个一级菜单可以添加5个二级菜单.一级菜单最多四个汉字,二级菜单最多7个汉字,多出来的汉字用& ...

  5. 第一篇:微信公众平台开发实战Java版之了解微信公众平台基础知识以及资料准备...

    相信很多人或多或少听说了微信公众平台的火热.但是开发还是有一点门槛,鉴于挺多朋友问我怎么开发,问多了,自己平时也进行以下总结. 所以下面给大家分享一下我的经验: 第一部分   介绍微信公众号的一些简单 ...

  6. 转载收藏之用 - 微信公众平台开发教程(三):微信公众平台开发验证

    要对接微信公众平台的"开发模式",即对接到自己的网站程序,必须在注册成功之后(见Senparc.Weixin.MP SDK 微信公众平台开发教程(一):微信公众平台注册),等待官方 ...

  7. 微信公众号开发:自定义菜单

    前言: 回顾之前的微信公众号配置和消息处理的内容,我们已经掌握了如何配置服务器与微信公众号建立连接,也掌握了通过消息管理的方式,对用户的信息进行处理,完成公众号消息回复功能,实现公众号与用户之间的完整 ...

  8. 微信公众平台开发教程Java版(三) 消息接收和发送

    前面两章已经介绍了如何接入微信公众平台,这一章说说消息的接收和发送 可以先了解公众平台的消息api接口(接收消息,发送消息) http://mp.weixin.qq.com/wiki/index.ph ...

  9. java 微信 接收消息_微信公众平台开发教程Java版(三) 消息接收和发送

    https://www.iteye.com/blog/tuposky-2017429 前面两章已经介绍了如何接入微信公众平台,这一章说说消息的接收和发送 可以先了解公众平台的消息api接口(接收消息, ...

  10. 微信公众平台上修改自定义菜单

    微信公众号的自定义菜单需要修改,查看了server端的代码,并没有实现修改菜单的接口,因为菜单修改的频率不是很高,所以就直接在测试网页上进行修改: 1. 首先打开微信公众平台的网站: https:// ...

最新文章

  1. 践行RONG理念,2018年清华数据院科研成果一隅
  2. 这个五月,我拿到了腾讯暑期offer
  3. Tomcat 8.5——配置阿里云免费SSL证书(PFX格式证书)[启用HTTPS协议]
  4. php只显示一部分文章,typecho同一个页面下调用不同分类的文章但是却只显示一个分类文章...
  5. [COCI2017-2018#1] Plahte
  6. PID:我应该何时计算积分项?
  7. java数组表格输出_Java 如何将数组中的数据以表格形式输出
  8. java插件安装步骤_eclipse插件安装的四种方法
  9. Android:屏幕自适应
  10. 物理Standby数据库的文件路径转换(1)
  11. 一文让你初步了解壮族——一个奇葩但同样优秀的民族
  12. Python编程从入门到实践第五章部分习题
  13. 中国移动位置服务基地能力开放平台
  14. Agilent RF fundamentals (7) Oscillator characterization
  15. 神思通用100型读身份证
  16. 用Hyperledger cello的0.9.0-h3c分支创建一套区块链系统
  17. 最新android系统下载,安卓6.0抢先体验方法|安卓6.0下载 安卓6.0系统下载地址_PC6教学...
  18. 2019自结前端面试小册
  19. 接口测试小白的Testng学习之路--在eclips中安装Testng
  20. opencv支持向量机(python)

热门文章

  1. 1月29日服务器例行维护公告,《新梦幻之城》1月29日服务器例行维护公告
  2. 嵌入式开发之qt-4.8.6移植
  3. BZOJ 2718/1533 Violet 4 毕业旅行
  4. 逻辑填空——词语积累
  5. Python3中的enumerate用法详解
  6. 猎上网获IDG资本千万美元投资
  7. Ubuntu设置鼠标灵敏度
  8. 谷歌浏览器的$http_user_agent
  9. 尼葛洛庞帝:《数字化生存》
  10. 声网社区版 UWP SDK 发布,实时音视频助力 UWP 开发者