前言

在进行微信公众号业务开发的时候,微信公众号的消息回复是非常重要的一环,而微信公众号消息回复分为:普通消息自动回复和模板消息回复。该篇文章会先使用微信测试工具过一遍流程,再使用代码进行实现,并且每一步都有记录,力争理解的同时各位小伙伴也能够实现功能

文章目录

  • 前言
  • 1、通过微信测试工具实现模板消息发送
  • 2、接受微信公众号的消息
  • 3、代码实现普通消息的发送
  • 4、公众号模板消息
  • 总结

说明:因为开通微信服务号是需要营业执照和300元的,而个人号有些功能又没有,所以是比较不方便的,但是微信官方很贴心的为我们准备了测试公众号,所以我们在测试开发阶段均可以使用测试公众号来调试。

1、通过微信测试工具实现模板消息发送

详情可以看这篇文献:https://blog.csdn.net/weixin_47316183/article/details/125245315

2、接受微信公众号的消息

1、首先要在测试公众号中配置服务器配置

说明:这里必须绑定的是域名,内网肯定是不行的,我这里使用的是内网穿透直接映射到本地端口的,后面有时间会专门写一篇关于如何内网穿透的文章。

2、编写控制器
注意:这个接口是用来验证服务器的,接口路径必须和上面绑定的接口路径一致。

@RestController
@RequestMapping("/api/wechat/message")
public class MessageController {private static final String tokenEric = "Eric";/*** 服务器有效性验证* @param request* @return*/@GetMappingpublic String verifyToken(HttpServletRequest request) {String signature = request.getParameter("signature");String timestamp = request.getParameter("timestamp");String nonce = request.getParameter("nonce");String echostr = request.getParameter("echostr");log.info("signature: {} nonce: {} echostr: {} timestamp: {}", signature, nonce, echostr, timestamp);if (this.checkSignature(signature, timestamp, nonce)) {log.info("token ok");return echostr;}return echostr;}private boolean checkSignature(String signature, String timestamp, String nonce) {String[] str = new String[]{tokenEric, timestamp, nonce};//排序Arrays.sort(str);//拼接字符串StringBuffer buffer = new StringBuffer();for (int i = 0; i < str.length; i++) {buffer.append(str[i]);}//进行sha1加密String temp = SHA1.encode(buffer.toString());//与微信提供的signature进行匹对return signature.equals(temp);}
}

OK,完成之后,我们的校验接口就算是开发完成了。接下来就可以开发消息接收接口了。

3、编写,接收微信服务器发送来的消息

   /*** 接收微信服务器发送来的消息* @param request* @return* @throws Exception*/@PostMappingpublic String receiveMessage(HttpServletRequest request) throws Exception {WxMpXmlMessage wxMpXmlMessage = WxMpXmlMessage.fromXml(request.getInputStream());System.out.println(JSONObject.toJSONString(wxMpXmlMessage));return "success";}private Map<String, String> parseXml(HttpServletRequest request) throws Exception {Map<String, String> map = new HashMap<String, String>();InputStream inputStream = request.getInputStream();SAXReader reader = new SAXReader();Document document = reader.read(inputStream);Element root = document.getRootElement();List<Element> elementList = root.elements();for (Element e : elementList) {map.put(e.getName(), e.getText());}inputStream.close();inputStream = null;return map;}

到这里,基本完成一半了,因为已经能够接受到微信服务器发来的消息的,先给大家测试一波。

给测试公众号发送消息:

查看控制台,发现成功接受到了消息

3、代码实现普通消息的发送

那么既然能够接受到微信服务器发来的消息,同样的,也能够返回消息,这里根据自己的需求来写就好了,我这里的需求是根据关键字查询对应课程信息,大家可以根据我的代码模板来进行修改,这样更方便。

我这里为了大家看的方便直接将修改后的代码放在Controller中了

public String receiveMessage(Map<String, String> param) {String content = "";try {//消息类型String msgType = param.get("MsgType");switch(msgType){case "text" :        //普通文本类型,例如用户发送:Javacontent = this.search(param);break;case "event" :      //多类型:关注、取消关注、点击菜单导航String event = param.get("Event");String eventKey = param.get("EventKey");if("subscribe".equals(event)) {//关注公众号content = this.subscribe(param);} else if("unsubscribe".equals(event)) {//取消关注公众号content = this.unsubscribe(param);} else if("CLICK".equals(event) && "aboutUs".equals(eventKey)){content = this.aboutUs(param);} else {content = "success";}break;default:content = "success";}} catch (Exception e) {e.printStackTrace();content = this.text(param, "请重新输入关键字,没有匹配到相关视频课程").toString();}return content;
}}/*** 处理关键字搜索事件* 图文消息个数;当用户发送文本、图片、语音、视频、图文、地理位置这六种消息时,开发者只能回复1条图文消息;其余场景最多可回复8条图文消息* @param param* @return*/
private String search(Map<String, String> param) {String fromusername = param.get("FromUserName");String tousername = param.get("ToUserName");String content = param.get("Content");//这个判断是为靓仔专属设定的if("Eric".equals(content)){StringBuffer text = this.text(param, "这是一位神奇的靓仔!");return text.toString();}//单位为秒,不是毫秒Long createTime = new Date().getTime() / 1000;StringBuffer text = new StringBuffer();//远程调用接口:根据课程名称查询课程信息List<Course> courseList = courseFeignClient.findByKeyword(content);if(CollectionUtils.isEmpty(courseList)) {//如果集合等于null,说明该关键字不存在对应课程,提升用户没有匹配到相关视频课程text = this.text(param, "同学你好,你回复的关键词不是有效关键词!");} else {//一次只能返回一个Random random = new Random();int num = random.nextInt(courseList.size());Course course = courseList.get(num);StringBuffer articles = new StringBuffer();articles.append("<item>");articles.append("<Title><![CDATA["+course.getTitle()+"]]></Title>");articles.append("<Description><![CDATA["+course.getTitle()+"]]></Description>");articles.append("<PicUrl><![CDATA["+course.getCover()+"]]></PicUrl>");articles.append("<Url><![CDATA[http://glkt.atguigu.cn/#/liveInfo/"+course.getId()+"]]></Url>");articles.append("</item>");text.append("<xml>");text.append("<ToUserName><![CDATA["+fromusername+"]]></ToUserName>");text.append("<FromUserName><![CDATA["+tousername+"]]></FromUserName>");text.append("<CreateTime><![CDATA["+createTime+"]]></CreateTime>");text.append("<MsgType><![CDATA[news]]></MsgType>");text.append("<ArticleCount><![CDATA[1]]></ArticleCount>");text.append("<Articles>");text.append(articles);text.append("</Articles>");text.append("</xml>");}return text.toString();
}

这是按照微信官方要求格式来封装的,感兴趣的朋友可以查看官方文档:https://developers.weixin.qq.com/doc/offiaccount/Basic_Information/Access_Overview.html

测试

1、重启项目
2、给微信测试服务号发送消息

可以看到成功实现啦~
当然,在实际开发中,可能这个自动回复直接使用微信管理后台设置了,而我们代码实现回复更多的是模板回复,请大家耐心往下看

4、公众号模板消息

先说下实现目标:购买课程支付成功后微信自动推送支付成功消息

官方文档参考链接:https://developers.weixin.qq.com/doc/offiaccount/Message_Management/Template_Message_Interface.html

1、先在测试公众号添加消息模板

这里怕有些小伙伴不熟悉,我把我的模板贴上~

{{first.DATA}}
订单编号:{{keyword1.DATA}}
商品名称:{{keyword2.DATA}}
支付时间:{{keyword3.DATA}}
支付金额:{{keyword4.DATA}}
{{remark.DATA}}

2、编写Service接口
需要说明的是,发送消息是需要指定用户的,而在微信公众号中openId就是用户的唯一标识

void pushPayMessage(Long orderId);

3、实现ServiceImpl实现类

//TODO 暂时写成固定值测试,后续完善
@SneakyThrows
@Override
public void pushPayMessage(long orderId) {String openid = "o1RCX6uM7uSm8-SS-eTRf13EEQ";WxMpTemplateMessage templateMessage = WxMpTemplateMessage.builder().toUser(openid)//要推送的用户openid.templateId("BoSU1mzQBkC-jiwCm0SHRGZX37wRaVjcK9SlcqZL1l4")//模板id.url("https://zhult.com/#/pay/"+orderId).build();//3,如果是正式版发送消息,,这里需要配置你的信息templateMessage.addData(new WxMpTemplateData("first", "亲爱的用户:您有一笔订单支付成功。", "#272727"));templateMessage.addData(new WxMpTemplateData("keyword1", "ZP235678692123", "#272727"));templateMessage.addData(new WxMpTemplateData("keyword2", "Java基础课程", "#272727"));templateMessage.addData(new WxMpTemplateData("keyword3", "2022-11-11", "#272727"));templateMessage.addData(new WxMpTemplateData("keyword4", "199", "#272727"));templateMessage.addData(new WxMpTemplateData("remark", "感谢您购买课程,如有疑问,随时咨询!", "#272727"));String msg = wxMpService.getTemplateMsgService().sendTemplateMsg(templateMessage);System.out.println("模板信息发送成功:" + msg);
}

4、编写Controller

/*** 发送模板消息* @return* @throws WxErrorException*/@GetMapping("/pushPayMessage")public Result pushPayMessage() throws WxErrorException {messageService.pushPayMessage(1L);return Result.ok().message("获取模板消息成功");}

5、测试:因为使用的是get请求,所以我们可以直接使用浏览器测试

结果如下:

测试成功~


总结

怎么样,是不是特别简单呢,完结撒花~

【微信开发第一章】SpringBoot实现微信公众号创建菜单,同步菜单功能:https://blog.csdn.net/weixin_47316183/article/details/127821095?spm=1001.2014.3001.5502

【微信开发第二章】SpringBoot实现微信公众号普通消息和模板消息回复:https://blog.csdn.net/weixin_47316183/article/details/127821653?spm=1001.2014.3001.5502

【微信开发第三章】SpringBoot实现微信授权登录
https://blog.csdn.net/weixin_47316183/article/details/127833802?spm=1001.2014.3001.5502

【微信开发第四章】SpringBoot实现微信H5支付
https://blog.csdn.net/weixin_47316183/article/details/127949620?spm=1001.2014.3001.5502

【微信开发第五章】SpringBoot实现微信分享
https://blog.csdn.net/weixin_47316183/article/details/127950090?spm=1001.2014.3001.5502

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

  1. 公众平台模板消息所在行业_如何使用微信公众号第三方平台群发模板消息助手?...

    对于微信公众号群发模板消息助手的实现,公众号后台提供了接口编程实现,微号帮平台提供了模板消息群发功能实现,均可以让微信公众号群发模板消息,模板消息即按固定格式的文本模块消息,没有图文形式,纯固定格式的 ...

  2. 微信公众号找不到模板消息

    1. 登录公众号 https://mp.weixin.qq.com/ 2. 开通功能 然后按提示进行填写即可. 3. 位置 开通成功之后,在广告与服务下面,有对应的模板消息和订阅通知.

  3. axure小程序模板_公众号和小程序模板消息

    前言 今天和大家简单聊聊微信公众号和微信小程序的模板消息机制,大家在做微信小程序或者微信公众号消息通知的时候可以参考. 微信小程序 订阅消息 推送位置:服务通知 跳转能力:可以跳转到小程序页面 解释: ...

  4. easywechat微信开发系列(1):公众号网页授权

    准备工作: 1.已认证的服务号(apppid.appsecret.token.aes_key) 2.安全域名 3.已经用composer安装好easywechat 1.config/app.php 的 ...

  5. php微信40037,微信公众号发送小程序模板消息提示40037?。

    {"code":0,"message":"success","data":"{\"errcode\& ...

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

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

  7. 微信开发api “此图片来自微信公众平台未经允许不可引用”的解决方案

    在使用微信开发api接口接管后, 获取公众号的素材发现图片显示"此图片来自微信公众平台未经允许不可引用" 问题: 方案一(推荐): 在html中的<head>里面添加& ...

  8. 微信公众号开发 - 配置表设计以及接入公众号接口开发

    微信公众号开发文章目录 1.微信公众号开发 - 环境搭建 2.微信公众号开发 - 配置表设计以及接入公众号接口开发 3.微信公众号开发 - token获取(保证同一时间段内只请求一次) 4.微信公众号 ...

  9. 微信开发本地调试工具(模拟微信客户端)

    微信开发本地调试工具(模拟微信客户端) 开源免费微信管家系统(java)源码下载 微信部署需要依靠80端口,如何快速有效的调试本地微信开发程序, 捷微团队(jeewx-java微信开源系统),采用微信 ...

最新文章

  1. h3c 3600 acl 配置 滤源IP是网关的ARP报文的ACL规则
  2. 送你一份 Kubernetes 实用命令速查表
  3. jdbc链接数据库mysql
  4. Atom编写Markdown
  5. hdu 3367 Pseudoforest (最大生成树 最多存在一个环)
  6. [00004]-[2015-07-16]-[00]-[VC++ 开发Activity控件基础]
  7. 【玩转cocos2d-x之三十七】粒子系统的加载优化
  8. 一文详解 Prometheus 的高可用方案:Thanos
  9. ACDSee Photo Manager 12 中文绿色版
  10. mall-swarm是一套微服务商城系统
  11. php如何复制一个对象,PHP中的对象复制及__clone() 函数
  12. 带你快速入门AXI4总线--AXI4-Full篇(2)----XILINX AXI4-Full接口IP源码仿真分析(Slave接口)
  13. 电话交换机原理(企业运用方案)
  14. 2021年全国安全生产月 安全知识网络竞赛 链工宝“测测你的安全力”题库 三百多道真题含答案
  15. jquery弹出层插件jquery.ColorBox.js学习
  16. android 红外遥控程序,基于Dragonboard 410c android系统红外遥控功能的实现方法
  17. ie浏览器js不刷新和乱码问题
  18. 可视化丨用数据分析福尔摩斯探案集
  19. 打造一流软文营销推广平台,看看媒体批发网是如何做的
  20. n*n蛇形方阵的输出

热门文章

  1. 软件测试怎么样才能提高自己的效率?
  2. 4-2-6 二叉树及其遍历 / 二叉搜索树 / 完全二叉树 完全二叉搜索树 (30 分)
  3. 小米路由作二级路由,挂在上级路由之下,samba能被上级访问
  4. 独立站运营 | 聊天聚合部件,助你提升100%私域转化率
  5. Mysql更新百万历史数据
  6. 利用Python(pyserial、minimalmodbus、modbus_tk)进行单片机通信
  7. Android开发接入第三方SDK流程
  8. 关闭微信朋友圈和公众号的广告
  9. 我爱赚钱吧:建网站也是可以赚钱的③
  10. oracle 误删数据恢复