作者不是大牛,有问题请指出

一、创建SpringBoot项目,配置内网穿透

1. 创建一个SpringBoot项目,此步骤省略

2. 在pom中引用班纳睿工具包

班纳睿

<!-- 公众号 -->
<dependency><groupId>com.github.binarywang</groupId><artifactId>wx-java-mp-spring-boot-starter</artifactId><version>4.1.0</version>
</dependency>

3. 内网穿透配置

我这边用到的是 ngrok

在ngrok中选择免费的项目,然后配置相对应的域名映射到本地的相应端口

配置完后,在隧道管理菜单可以看到隧道 id

下载ngrok的客户端,我这里下载的是 windows版本,下载解压后,打开 windows_amd64文件夹,点击Sunny-Ngrok启动工具,然后输入隧道id敲回车。界面出现oline表示穿透成功。

二、 在微信公众平台申请测试公众号,对接SpringBoot项目

1. 在微信公众平台申请开发测试公众号

申请测试号后,可以得到appID,appsecret

2. 配置SpringBoot中对应的公众号信息

在SpringBoot项目的application.yml中配置公众号相应的信息,将appId和secret 配置成公众号界面分配的信息,token自己在公众号界面填写一个,然后对应的配置在yml文件中。

在SpringBoot项目中创建config文件夹

在 config文件夹下创建 WechatMpProperties类,获取yml文件中的配置信息

@Configuration
@ConfigurationProperties(prefix = "wechat.mp")
@Data
public class WechatMpProperties {/*** 设置微信公众号的appid*/private String appId;/*** 设置微信公众号的app secret*/private String secret;/*** 设置微信公众号的token*/private String token;/*** 设置微信公众号的EncodingAESKey*/private String aesKey;
}

在 config文件下创建 WxMpConfiguration类,将 WechatMpProperties的配置信息配置进去

@AllArgsConstructor
@Configuration
public class WxMpConfiguration {@Autowiredprivate WechatMpProperties properties;@Beanpublic WxMpService wxMpService() {WxMpService service = new WxMpServiceImpl();WxMpDefaultConfigImpl configStorage = new WxMpDefaultConfigImpl();configStorage.setAppId(properties.getAppId());configStorage.setSecret(properties.getSecret());configStorage.setToken(properties.getToken());configStorage.setAesKey(properties.getAesKey());Map<String, WxMpConfigStorage> storageMap = new HashMap<>();storageMap.put(properties.getAppId(), configStorage);service.setMultiConfigStorages(storageMap);return service;}}

在 SpringBoot项目中创建 controller文件夹,在 controller文件夹下创建 WxPortalController类

@Slf4j
@AllArgsConstructor
@RestController
@RequestMapping("/wx/portal/{appid}")
public class WxPortalController {private final WxMpService wxService;private final WxMpMessageRouter messageRouter;@GetMapping(produces = "text/plain;charset=utf-8")public String authGet(@PathVariable String appid,@RequestParam(name = "signature", required = false) String signature,@RequestParam(name = "timestamp", required = false) String timestamp,@RequestParam(name = "nonce", required = false) String nonce,@RequestParam(name = "echostr", required = false) String echostr) {log.info("\n接收到来自微信服务器的认证消息:[{}, {}, {}, {}]", signature,timestamp, nonce, echostr);if (StringUtils.isAnyBlank(signature, timestamp, nonce, echostr)) {throw new IllegalArgumentException("请求参数非法,请核实!");}if (!this.wxService.switchover(appid)) {throw new IllegalArgumentException(String.format("未找到对应appid=[%s]的配置,请核实!", appid));}if (wxService.checkSignature(timestamp, nonce, signature)) {return echostr;}return "非法请求";}@PostMapping(produces = "application/xml; charset=UTF-8")public String post(@PathVariable String appid,@RequestBody String requestBody,@RequestParam("signature") String signature,@RequestParam("timestamp") String timestamp,@RequestParam("nonce") String nonce,@RequestParam("openid") String openid,@RequestParam(name = "encrypt_type", required = false) String encType,@RequestParam(name = "msg_signature", required = false) String msgSignature) {log.info("\n接收微信请求:[openid=[{}], [signature=[{}], encType=[{}], msgSignature=[{}],"+ " timestamp=[{}], nonce=[{}], requestBody=[\n{}\n] ",openid, signature, encType, msgSignature, timestamp, nonce, requestBody);if (!this.wxService.switchover(appid)) {throw new IllegalArgumentException(String.format("未找到对应appid=[%s]的配置,请核实!", appid));}if (!wxService.checkSignature(timestamp, nonce, signature)) {throw new IllegalArgumentException("非法请求,可能属于伪造的请求!");}String out = null;if (encType == null) {// 明文传输的消息WxMpXmlMessage inMessage = WxMpXmlMessage.fromXml(requestBody);WxMpXmlOutMessage outMessage = this.route(inMessage);if (outMessage == null) {return "";}out = outMessage.toXml();} else if ("aes".equalsIgnoreCase(encType)) {// aes加密的消息WxMpXmlMessage inMessage = WxMpXmlMessage.fromEncryptedXml(requestBody, wxService.getWxMpConfigStorage(),timestamp, nonce, msgSignature);log.debug("\n消息解密后内容为:\n{} ", inMessage.toString());WxMpXmlOutMessage outMessage = this.route(inMessage);if (outMessage == null) {return "";}out = outMessage.toEncryptedXml(wxService.getWxMpConfigStorage());}log.debug("\n组装回复信息:{}", out);return out;}private WxMpXmlOutMessage route(WxMpXmlMessage message) {try {return this.messageRouter.route(message);} catch (Exception e) {log.error("路由消息时出现异常!", e);}return null;}}

3. 在微信公众平台调试

在接口配置信息,url 填写 域名+ /wx/portal/{appid}

配置完后,在下发点击发送按钮。配置成功,会弹出配置成功窗口。

三、 开发关注公众号和取关公众号时相应的业务

SpringBoot对接微信公众号,持续更新相关推荐

  1. 全网最全java Springboot对接微信公众号开发平台(可能是最全)!

    微信服务接入教程文档 文章目录 微信服务接入教程文档 微信开发技术文档官网 注册成为微信开发者 配置接受推送消息服务器 natapp下载,使用 后台构建 后台配置微信推送消息服务器 接受消息推送 操作 ...

  2. SpringBoot开发微信公众号

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

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

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

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

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

  5. 【2022-9-21最新】青龙面板搭建+sillyGirl+对接微信公众号+onebot

    目录 前言 一.准备工作 二.安装docker+安装青龙+青龙端口更改(可选)+CK提交版Ninja(可选) 1.连接ssh 2.一键命令代码如下 3.依赖安装一键命令代码如下 三.sillyGirl ...

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

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

  7. 基于IdentityServer的系统对接微信公众号

    业务需求 公司有两个业务系统,A和B,AB用户之间属于多对一的关系,数据库里面也就是两张表,A表有个外键指向B.现在需要实现以下几个功能. A用户扫描B的二维码,填写相关的注册信息,注册完成之后自动属 ...

  8. weixintong ent.php,多商户版微信商城对接微信公众号的方法及设置

    第一步首先自己申请一个认证的微信服务公众号,拥有了自己的公众号的用户请再来看我的帖子.还有绑定的域名要备案了[1]1.打开微信公众号https://mp.weixin.qq.com选择 [开发]→[开 ...

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

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

  10. Vue项目对接微信公众号踩坑日记

    之前做项目都是pc端的,还是第一次做移动端项目,而且上来就要接入app 和微信公众号两个平台,最终查阅多方文档,耗费几周时间还是完成了项目,这篇文章也算是记录一下自己的完成思路以及一些想法,希望能帮到 ...

最新文章

  1. Android性能系列-渲染篇
  2. Java关键字介绍之final
  3. 三:CAP与Base理论
  4. macbook下载苹果版Photoshop cc2019 for mac
  5. Java枚举:小小enum,优雅而干净
  6. 计算机检索规则,搜索引擎的语法规则
  7. jQuery常用的选择器
  8. 信号量与令牌桶_限流的4种方式令牌桶实战
  9. Drupal 自己定义主题实体 Theming Custom Entities
  10. dcdc芯片效率不高的原因_电动汽车DCDC变换器应用详解
  11. 文件服务器 选型,文件服务器选型
  12. networkComms 通信框架之 消息处理器
  13. GB 4208-93 外壳防护等级(IP代码)
  14. markdown下载以及安装详情
  15. STM32触摸屏校准数据的存取
  16. 水星路由器设置显示服务器,新款水星无线路由器设置_新版水星(MERCURY)路由器设置教程-192路由网...
  17. matlab箭头大小固定,科学网—Matlab 粗箭头绘制 - 肖鑫的博文
  18. 通过ICursor对Table进行操作(添加、修改、删除)
  19. 笔记本电脑无法搜索到wifi
  20. 招商银行信用卡中心笔试编程题 - 序列找数

热门文章

  1. 天行健,君子以自强不息;地势坤,君子以厚德载物 释意
  2. WorldPress出现Briefly unavailable for scheduled maintenance. Check back in a minute.的解决方法
  3. echarts水球图-动态波纹百分比数据显示
  4. CH340G设计pcb注意事项
  5. 安利——程序猿必备笔记软件typora+坚果云
  6. android studio 模拟器文件管理器
  7. oracle+clod+和bolb,Azure存储Blob类型(CloudBlobContainer,CloudBlobClient等)和线程安全
  8. 模板文件云存储管理 Sisyphus
  9. 【欧拉计划第 3 题】最大质因数 Largest prime factor
  10. 高并发与高可用知识总结