点击上方蓝色“方志朋”,选择“设为星标”

回复“666”获取独家整理的学习资料!

在讲微信公众号开发之前,先来大概了解一下微信公众号。微信公众号大体上可以分为服务号和订阅号,订阅号和服务号的区别如下:

  1. 服务号可以申请微信支付功能。

  2. 服务号只能由企业申请,订阅号可以由企业或个人申请。

  3. 订阅号和服务号每月推送消息次数不同,订阅号每天可以推送一次,服务号每月可以推送四次。

  4. 服务号推送的消息会出现在用户的聊天列表中,而订阅号推送的消息显示在订阅号文件夹中。

  5. 还有一些其他接口功能的区别和限制,总的来说服务号支持更高级的功能开发。

订阅号更加偏向于向用户传递咨询,一般各种技术类公众号都属于订阅号,订阅号的消息推送并不会有太显眼的提醒,如果你想让某个公众号的推送内容更加显眼,可以选择将公众号置为星标。置为星标后公众号会显示在所有订阅号的最顶部,同时收到消息后会有黄色五角星星标提醒。

一 公众号配置服务器

微信官方提供了非常完善的接入文档,如果想了解文档的具体内容,直接浏览器搜索微信开发文档就可以了。但是为了方便开发,一般不会直接去根据微信开发文档进行开发,github上有许多开源项目对微信开发文档进行了封装,这里我使用mica-weixin开发包进行演示,mica-weixinjfinal-weixin的boot版本。

配置服务器信息很简单,具体流程就是微信服务发送请求一个请求给业务服务器,业务服务器验证请求后给微信服务一个响应

1.1 搭建业务服务

本地搭建一个spring-boot-weixin的项目,使用内网穿透工具进行穿透,使其可以与外网进行通信。

1.1.1 引入mica-weixin依赖

<dependency><groupId>net.dreamlu</groupId><artifactId>mica-weixin</artifactId><version>2.0.1</version>
</dependency>

1.1.2 配置公众号信息

mica-weixin通过配置文件进行公众号信息的配置,如果你想通过数据库配置公众号信息,可以参考我以前写过的一篇文章jfinal-weixin自定义配置支持多公众号。

dream:weixin:wx-configs:- appId: xxxxxxappSecret: xxxxxxtoken: javatripencodingAesKey: xxxxxx

appIdappSecret可在公众号后台进行查看,具体位置在菜单开发—>基本配置中,其中appSecret要妥善保管,现在公众号已经不支持查看appSecret了,如果你忘了appSecret,只能进行重置。

1.1.3 开发消息校验接口

mica-weixin已经为我们提供好了消息校验接口,只需要继承DreamMsgControllerAdapter就可以了。

@WxMsgController("/weixin/wx")
public class WeiXinMsgController extends DreamMsgControllerAdapter {@Overrideprotected void processInFollowEvent(InFollowEvent inFollowEvent) {}@Overrideprotected void processInTextMsg(InTextMsg inTextMsg) {}@Overrideprotected void processInMenuEvent(InMenuEvent inMenuEvent) {}
}

同时,需要开启缓存,由于mica-weixin的将access_token等信息放在了缓存中。在启动类上加@EnableCaching就开启了。

@SpringBootApplication
@EnableCaching
public class WeixinApplication {public static void main(String[] args) {SpringApplication.run(WeixinApplication.class, args);}
}

1.1.4 公众号后台配置服务器信息

使用内网穿透工具穿透内网地址,然后在公众号后台菜单开发—>基本配置中填写服务器配置信息。

填写完成后点击启用,这样就完成了微信服务器和业务服务器的关系配置。开启开发者配置后,自动回复、自定义菜单等功能都不能正常使用了。这时候就需要去调用对应的接口实现这些功能。

二 实现各种消息接口

2.1 关注消息

在一步中,自定义类WeiXinMsgController中需要重写三个父类中的方法,其中processInFollowEvent()就是关注和取消关注的方法,取消关注后用户虽然不能收到消息,但是后台可以接收到用户取消关注的事件。

@Override
protected void processInFollowEvent(InFollowEvent inFollowEvent) {OutTextMsg defaultMsg = new OutTextMsg(inFollowEvent);// 关注if(InFollowEvent.EVENT_INFOLLOW_SUBSCRIBE.equals(inFollowEvent.getEvent())){// 可将关注用户录入db,此处可以获取到用户openidString openId = inFollowEvent.getFromUserName();// 查询db,根据响应消息类型封装消息体if("文本消息"){OutTextMsg otm = new OutTextMsg(inFollowEvent);otm.setContent("消息内容");render(otm);return;}else if("图片消息"){OutImageMsg oim = new OutImageMsg(inFollowEvent);// 这里需要调用微信提供的素材接口,将图片上传至素材库。oim.setMediaId("图片素材id");render(oim);return;}else if("图文消息"){OutNewsMsg onm = new OutNewsMsg(inFollowEvent);onm.addNews("标题","简介","图片地址","图文链接");render(onm);return;}else if("视频消息"){OutVideoMsg ovm = new OutVideoMsg(inFollowEvent);ovm.setTitle("标题");ovm.setDescription("简介");ovm.setMediaId("视频素材id");render(ovm);return;}else{defaultMsg.setContent("感谢关注");}}// 取消关注if(InFollowEvent.EVENT_INFOLLOW_UNSUBSCRIBE.equals(inFollowEvent.getEvent())){log.info("用户取消关注了");// 此处可以将取消关注的用户更新db}
}

2.2 关键词消息

响应内容跟关注消息一样,查询db去匹配关键词,然会根据消息内容封装对应的消息体进行返回,如果没匹配到关键词则回复统一的消息内容。processInTextMsg()方法就是用来回复关键词消息的。

@Override
protected void processInTextMsg(InTextMsg inTextMsg) {String content = inTextMsg.getContent();// 根据用户发送的content去查询db中的响应内容if("文本消息"){OutTextMsg otm = new OutTextMsg(inTextMsg);otm.setContent("消息内容");render(otm);return;}else if("图片消息"){OutImageMsg oim = new OutImageMsg(inTextMsg);// 这里需要调用微信提供的素材接口,将图片上传至素材库。oim.setMediaId("图片素材id");render(oim);return;}else if("图文消息"){OutNewsMsg onm = new OutNewsMsg(inTextMsg);onm.addNews("标题","简介","图片地址","图文链接");render(onm);return;}else if("视频消息"){OutVideoMsg ovm = new OutVideoMsg(inTextMsg);ovm.setTitle("标题");ovm.setDescription("简介");ovm.setMediaId("视频素材id");render(ovm);return;}else{OutTextMsg otm = new OutTextMsg(inTextMsg);otm.setContent("暂未查到关键词...");}
}

2.3 菜单消息

点击菜单后也是一样,通过processInMenuEvent()方法进行响应内容的回复。

@Override
protected void processInMenuEvent(InMenuEvent inMenuEvent) {String eventKey = inMenuEvent.getEventKey();// 根据用户发送的content去查询db中的响应内容if("文本消息"){OutTextMsg otm = new OutTextMsg(inMenuEvent);otm.setContent("消息内容");render(otm);return;}else if("图片消息"){OutImageMsg oim = new OutImageMsg(inMenuEvent);// 这里需要调用微信提供的素材接口,将图片上传至素材库。oim.setMediaId("图片素材id");render(oim);return;}else if("图文消息"){OutNewsMsg onm = new OutNewsMsg(inMenuEvent);onm.addNews("标题","简介","图片地址","图文链接");render(onm);return;}else if("视频消息"){OutVideoMsg ovm = new OutVideoMsg(inMenuEvent);ovm.setTitle("标题");ovm.setDescription("简介");ovm.setMediaId("视频素材id");render(ovm);return;}else{OutTextMsg otm = new OutTextMsg(inMenuEvent);otm.setContent("无效链接,请重试...");}
}

三 接口API调用

目前,微信提供的接口对订阅号的限制比较大,未认证的订阅号基本上只有接收消息的几个功能接口。

调用接口的时候需要传递token,获取token需要在微信后台中配置业务服务器的白名单。如下:

如果需要配置多个白名单ip,使用回车键将多个ip分隔开。

mica-weixin提供了所有的接口封装,具体可参考它的官方文档,如果要获取微信菜单,可以这样写:

@WxApi("weixin/api")
public class WeiXinApiController {@GetMapping("menu")@ResponseBodypublic String getMenu(){ApiResult menu = MenuApi.getMenu();return menu.getJson();}
}

@WxApi这个是它的自定义注解,其实就是包含了@RequestMapping@Controller

四 其他事项

4.1 多公众号配置

mica-weixin提供了多公众号配置的功能,使用ThreadLocalappid进行绑定。只需要简单配置即可实现多公众号配置。

dream:weixin:wx-configs:- appId: xxxxxxappSecret: xxxxxxtoken: javatripencodingAesKey: xxxxxx- appId: xxxxxxappSecret: xxxxxxtoken: javatripencodingAesKey: xxxxxx

4.2 redis配置

access_token的有效期是2小时,并且该接口有调用次数限制,mica-weixinaccess_token存储在redis中,避免每次调用接口都去获取access-token,因此项目需要配置redis。

spring:redis:host: localhostport: 6379

4.3 手动选择ThreadLocal

如果想要开发微信公众号的后台管理功能,多公众号的时候就需要手动去指定当前线程使用哪个公众号信息。如下:

ApiConfigKit.setThreadLocalAppId(appid);

至此,SpringBoot开发微信公众号就算完成了,由于订阅号开放的接口太少了,好多功能不能正常演示。还有mica-weixin也许不是最好的选择,如果想试着开发微信公众号,可以在github上找一下开发包。至于我为什么会使用mica-weixin,是因为我曾用过一段时间的jfinal框架,与之配套的微信开发包就是jfinal-weixin,也就是jfinal版的mica-weixin

热门内容:
  • 拒绝接口裸奔!开放API接口签名验证!

  • 笑了,面试官问我知不知道异步编程的Future。

  • 面试官:String长度有限制吗?是多少?

  • 再见!深圳!再见!腾讯!

最近面试BAT,整理一份面试资料《Java面试BAT通关手册》,覆盖了Java核心技术、JVM、Java并发、SSM、微服务、数据库、数据结构等等。获取方式:点“在看”,关注公众号并回复 666 领取,更多内容陆续奉上。
明天见(。・ω・。)ノ♡

SpringBoot开发微信公众号相关推荐

  1. SpringBoot开发微信公众号_回复文本信息功能

    公众号开发须知 很多人在刚刚开始接触公众号开发的时候,对公众号后台的服务器设置很迷茫,不知道怎么配置.我简单的给大家介绍一下. 1.如果你是想做信息回复功能的,就是你给公众号发相关的关键字,公众号直接 ...

  2. SpringBoot开发微信公众号(三)

    这篇文章创建一下菜单 public class MyX509TrustManager implements X509TrustManager {@Overridepublic void checkCl ...

  3. Spring Boot 开发微信公众号

    点击上方蓝色"方志朋",选择"设为星标"回复"666"获取独家整理的学习资料! 在讲微信公众号开发之前,先来大概了解一下微信公众号.微信公众 ...

  4. 【微信开发第二章】SpringBoot实现微信公众号普通消息和模板消息回复

    前言 在进行微信公众号业务开发的时候,微信公众号的消息回复是非常重要的一环,而微信公众号消息回复分为:普通消息自动回复和模板消息回复.该篇文章会先使用微信测试工具过一遍流程,再使用代码进行实现,并且每 ...

  5. 【微信开发第一章】SpringBoot实现微信公众号创建菜单,同步菜单功能

    前言 在进行微信公众号业务开发的时候,微信公众号的自定义菜单是非常重要的一环,该篇文章会先使用微信测试工具过一遍流程,再使用代码进行实现,争取看过的小伙伴都能够实现,创建公众号菜单和代码同步公众号菜单 ...

  6. SpringBoot 系列教程(六十五):Spring Boot整合WxJava开发微信公众号

    一.前言 做微信公众号开发项目以及近两年整了,积累了一点微薄的行业经验,既然开了微信开发专栏博客,那么今天就来回忆回忆,从零开始搭建一个微信公众号开发的框架,可以用于企业级项目开发的脚手架,同时搭配博 ...

  7. springboot实战-微信公众号开发

    sell 基于springboot的微信公众号系统,旨在学习springboot以及微信公众号开发相关知识 包含: springboot:表单验证.统一异常处理.事物管理.restful Api开发 ...

  8. springboot 微信太阳码_WxJava基于Spring Boot开发微信公众号手机注册码

    WxJava基于Spring Boot开发微信公众号手机注册码 Szx • 2019 年 05 月 18 日 第一步先下载官方Demo https://github.com/binarywang/we ...

  9. SpringBoot搭建微信公众号后台(零):服务搭建与接口验证

    关注作者,更多动态实时掌握,微信公众号:隔壁的程序员 前言:从这篇开始小王子将开始一个新的系列内容,从零开始搭建自己的微信公众号后台.内容大致规划为:环境篇,包括用到的工具安装,破解,配置:基础篇,主 ...

最新文章

  1. NHibernate多对多关联映射的实现
  2. 建立简单的服务器端程序
  3. Linux下9个有用的touch命令示例
  4. idea类前面有个j_idea中所有Java类标识变成一个J
  5. 重叠面积_20天津中考试卷及答案(24题重叠面积画板制作教程)
  6. CSS实现返回网页顶部
  7. 使用XPO过程中的代码优化
  8. 华为交换机 consolep密码和vty密码配置telnet,ssh
  9. 编程细节 —— 按值传递、按引用传递(final、const)
  10. dataframe转化为array_Pandas入门教程:如何将列表转化成数据框?
  11. oracle数据从一个表空间导入到另外一个表空间
  12. Java数据结构与算法(十) 图
  13. 国务院印发《促进大数据发展行动纲要》
  14. C++11的右值引用、移动语义(std::move)和完美转发(std::forward)详解
  15. matlab的基本函数,matlab基本函数
  16. 广东工业大学2020级年ACM第一次月赛
  17. 记实习听课笔记及心得
  18. 英语学习笔记(一)语法
  19. C语言中的EOF和feof()
  20. 「黑科技」无人机的新用法:替警察蜀黍追击偷盗者

热门文章

  1. 软件工程网络15结对编程作业
  2. 你真的以为了解java.io吗 呕心沥血 绝对干货 别把我移出首页了
  3. PHP-密码学算法及其应用-对称密码算法
  4. mysql连接hang住问题分析
  5. C#设置本地网络(DNS、网关、子网掩码、IP)
  6. 参考答案:02 矩阵及其运算
  7. 【HDU】3635 Dragon Balls (带权并查集 一)
  8. 【Codeforces】158B-Taxi(贪心,怎么贪咧)
  9. 从事了两年 AI 研究,我学到了什么?
  10. 14 款命令行常用工具的替代品!