微信小程序自动回复用户消息

article/2025/10/11 17:28:04

最近用java做了一个实现在微信小程序内根据用户发送的消息内容回复用不通的消息功能,相当于一个自动回复的客服消息,效果图如下:

 

当用户在小程序输入框中输入内容或其他操作时,后台根据用户输入的内容动态给用户回复,微信的参考文档为:

微信小程序客服消息回复开发
customerServiceMessage.send 档
微信的垃圾文档我就懒得喷了啊,按它这个文档做简直是一团乱麻

整个流程是这样的我们可以在微信小程序的开发者后台设置消息的回调地址,当用户进入小程序的客服页面,或在客服页面的输入框中输入内容时,微信小程序就会根据我们配置的消息回调地址把这条消息或这个事件回调给我们的服务器,我们可以进行相关处理,并给用户回复消息如上图显示的那些我输入 22 ,给我回复一个链接地址或其他东西,可以在回调中配置;

然后遇到的几个问题说一下:

1、回调地址解析:在微信后台配置回调地址时它会先发一个get请求测试地址是否可用,然后用户在发消息的时候会发post请求把用户消息发过来:如下

@Override
public void autoResponse(HttpServletRequest req, HttpServletResponse resp) throws Exception {switch (req.getMethod().toUpperCase()){case GET:doGet(req, resp);break;case POST:doPost(req, resp);break;default:throw new IllegalStateException("Unexpected value: " + req.getMethod());}
}

//回复get请求,说明地址可用

private void doGet(HttpServletRequest req, HttpServletResponse resp) throws Exception {// 将请求、响应的编码均设置为UTF-8(防止中文乱码)req.setCharacterEncoding("UTF-8");resp.setCharacterEncoding("UTF-8");String signature = req.getParameter("signature");String timestamp = req.getParameter("timestamp");String nonce = req.getParameter("nonce");String echostr = req.getParameter("echostr");String sortString = SignUtil.sort(config.getRespToken(), timestamp, nonce);String mySignature = SignUtil.sha1(sortString);if (mySignature != null && mySignature != "" && mySignature.equals(signature)) {resp.getWriter().write(echostr);} else {log.error("签名校验失败.");}
}

//回复post请求

private void doPost(HttpServletRequest req, HttpServletResponse resp)throws Exception {try{resp.setCharacterEncoding("UTF-8");resp.setCharacterEncoding("UTF-8");String line = null;StringBuffer xmlStr = new StringBuffer();BufferedReader reader = req.getReader();while ((line = reader.readLine()) != null) {log.info(line);xmlStr.append(line);}Map<String,String> map = XmlUtil.xmlToMap(xmlStr.toString());CustomerMsgReq customerMsgReq = WXAutoRespReqUtil.buildResponseMessage(map, config.getAppletsAppId(), config.getRespHref(), config.getRespText());log.info("send custom message param :{}", customerMsgReq);if(customerMsgReq == null){return;}String accessToken = getCacheAccessToken();JSONObject sendResult = wxAppletsRemoting.messageCustomSend(accessToken, customerMsgReq);log.info("send custom message result :{}", sendResult);if(sendResult.containsKey(("errcode")) && sendResult.getString("errcode").equals("0.0")){return;}log.error("access token may expire", sendResult);accessToken = getRealAccessToken();sendResult = wxAppletsRemoting.messageCustomSend(accessToken, customerMsgReq);log.info("resend custom message result :{}", sendResult);}finally {resp.getWriter().println("success");}

这里有一个问题,根据文档描述应该可以直接在回调接口中回复用户消息,如下这样操作,但是实际开发中,我测试这样回复用户没有收到消息,也不报错,不知道是我理解有问题还是哪里配置有问题,欢迎各位小伙伴指正

private void doPost(HttpServletRequest req, HttpServletResponse resp)throws Exception {try{resp.setCharacterEncoding("UTF-8");resp.setCharacterEncoding("UTF-8");String line = null;StringBuffer xmlStr = new StringBuffer();BufferedReader reader = req.getReader();while ((line = reader.readLine()) != null) {log.info(line);xmlStr.append(line);}Map<String,String> map = XmlUtil.xmlToMap(xmlStr.toString());//链接内容String msgText ="<a href=\""+href+"\">"+text+"</a>";ZZ//发送方帐号String fromUserName = map.get("FromUserName");// 开发者微信号String toUserName = map.get("ToUserName");String respXml = String.format( "<xml>" +"<ToUserName><![CDATA[%s]]></ToUserName>" +"<FromUserName><![CDATA[%s]]></FromUserName>" +"<CreateTime>%s</CreateTime>" +"<MsgType><![CDATA[text]]></MsgType>" +"<Content><![CDATA[%s]]></Content>" +"</xml>", fromUserName, toUserName, getMessageCreateTime(), msgText);resp.setContentType("application/xml; charset=utf-8");resp.getWriter().println(respXml);}finally {}

因为不能直接回复,需要调微信 

POST https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token=ACCESS_TOKEN

这个接口给用户回复,参考微信文档

customerServiceMessage.send 档

因此又牵扯到获取微信小程序appid,secret 然后根据appid,secret获取access_token 还有access_token的缓存等一大堆问题,我就不细说了,涉及到的代码已提交到码云

最近又有小伙伴请教微信小程序自动回复的问题,在交流的时候,发现了一个新的东西,微信云回复,逻辑就是在微信小程序的后台上传一个云服务的回复接口js,后面要自动回复用户消息的时候就直接调 云服务的回复接口,这样可以省去提供自动回复服务端的实现,可以不用自己再维护后台服务了


http://chatgpt.dhexx.cn/article/PWINPurQ.shtml

相关文章

微信群怎么自动回复消息?微信群有关键字自动回复功能吗?

在社群运营中&#xff0c;需要经历创建群、拉新&#xff0c;引流&#xff0c;活跃&#xff0c;留存&#xff0c;转化等一系列的过程&#xff0c;而且社群数量和规模会逐渐增加与扩大&#xff0c;这是社群变现必经之路。对于运营者来说&#xff0c;却是一件费时费力的事情。 在…

微信自动回复小程序(有手就行)

昨天刷B站看见了个微信自动回复小程序视频作者是不高兴就喝水视频在这看着感觉挺有意思的我也搞个敷衍我女朋友。 安装python3.4以上版本&#xff0c;并配置环境变量&#xff01;&#xff01;&#xff01; 1.安装依赖包 方法&#xff1a;在cmd中&#xff08;winR 输入cmd …

企业微信可以自动回复吗?

为节省群内成员时间&#xff0c;提升工作效率&#xff0c;快速响应客户问题&#xff0c;企业微信支持配置自动回复&#xff0c;本文介绍如何设置企业微信自动回复和群聊机器人。 企业微信如何设置自动回复&#xff1f; 自动回复&#xff1a;是针对客户的常见问题而设置的标准回…

微信自动回复怎么设置呢?

友友们 你们是否有以下这些烦恼 1、每天要手动点击“添加”按钮多次以通过大量好友? 2、你是否经常需要在多个微信帐号之间来回切换&#xff1f; 3、你的回复速度慢&#xff0c;导致客户流失率高&#xff1f; 4、为了及时回复&#xff0c;你总是需要带着多部手机出门&…

java 输入学习

java输入学习 ①输入需要用到的类Scanner②声明对象③用户输入值给变量④char类型的输入⑤拓展 ①输入需要用到的类Scanner 在开头打出import java.util.Scanner; 以便调用输入 ②声明对象 Scanner input new Scanner(System.in); 声明 输入对象 input 也可以用去它的名字 …

java 输入函数_java新手问题——输入函数

展开全部 可以利用32313133353236313431303231363533e59b9ee7ad9431333366306532Scanner类实现从键盘读入数据&#xff0c;然后利用println打印。 输入以下代码&#xff1a; import java.util.*; public class woo { public static void main(String args[]) { Scanner innew S…

java 输入一个数,判断是奇数还是偶数

java 输入一个数&#xff0c;判断是奇数还是偶数 package shixun1;import java.util.Scanner;public class Shixun1 {public static void main(String[] args) {// 输入一个数&#xff0c;判断是奇数还是偶数Scanner input new Scanner(System.in);System.out.println("…

在java中如何输入_java如何输入

❶ java 如何从键盘上接受输入 public class import { public static void main(String[] args) { System.out.println("请输入一个整数:"); //文字提示 Scanner scan new Scanner(System.in); //用Scanner类定义一个输入对版象 int mscan.nextInt(); //输入对象赋值…

Java 输入年份、月份,输出当月日历表

总体的逻辑思路&#xff1a; 1、以1900年1月1号&#xff08;星期一&#xff09;为初始日期用来计算截止到输入年份的上一年最后一天的总天数&#xff1b; 2、计算截止到输入月份的上一个月最后一天的总天数进行 3、将获得的总天数%7得到剩余i天&#xff0c;则i1天则为当月1号…

Java 输入三个整数 从小到大排列

今天突然一想控制台输入三个数&#xff0c;如何将这三个数从小到大排序 经过短暂的思考&#xff0c;直接上代码&#xff1a; public class Test04 {public static void main(String[] args) {demo01();} /*7.题目&#xff1a;输入三个整数x,y,z&#xff0c;请把这三个数由小到…

java 输入正整数_JAVA输入一个正整数n, 再输入n个整数,输出最大值。

展开全部 import java.util.Scanner; public class Test { public static void main(String[] args){ int repeat 0,n; int max 0; Scanner innew Scanner(System.in); maxin.nextInt(); System.out.println("请输入您要比较的整数的个62616964757a686964616fe4b893e5b1…

数字倒序Java_java输入数字,输出倒序的实例

java输入数字,输出倒序的实例,逆序,整数,给大家,请输入,三种 java输入数字,输出倒序的实例 易采站长站&#xff0c;站长之家为您整理了java输入数字,输出倒序的实例的相关内容。 我就废话不多说了&#xff0c;大家还是直接看代码吧~ package c10; import java.util.Scanner; pu…

java输入非整数异常处理

在java程序中&#xff0c;我们经常会遇到从键盘输入接收数据问题&#xff0c;但是有时会碰到输入数据类型与所需数据类型不一致的问题&#xff0c;这时就很可能导致程序报错直接退出&#xff0c;因此&#xff0c;这时用异常处理就显得格外重要&#xff0c;下面来介绍一个简单的…

Java中输入的用法

Java中输入 1、 读取输入 1&#xff09;构建一个Scanner&#xff0c;附属到System.in Scanner in new Scanner(System.in); 此时可以使用Scanner类的各种方法来读取输入。例如&#xff1a;nextLine方法来读取一行输入 System.out.print("What is your name?"); Str…

大事件,Java被超越了,2021年5月TIOBE编程语言排行榜出炉

TIOBE 头条 TIOBE 5月编程语言排行榜新鲜出炉。前十榜单中&#xff0c;C、Python、Java三大鳌头仍占据前三榜单。去年11月&#xff0c;Python短时间的挤掉Java跃居至榜单第二名&#xff1b;今年5月&#xff0c;Python再次挤掉Java&#xff0c;再度夺下榜二。 TIOBE排行榜是世…

TIOBE 7 月编程语言排行榜:C、Java 和 Python 争夺第一

整理 | 郑丽媛 出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09; TIOBE 官方最新发布了 7 月的编程语言榜单&#xff0c;而本月也是 TIOBE 榜单成立 20 周年&#xff0c;一起来看这个月榜单中有哪些最新变化吧&#xff1f; C、Java 和 Python 争夺第一 回想 2001 年…

编程语言排行榜迎来历史性时刻!C语言和Java均败了!

持续更新 20 多年的Tiobe编程语言排行榜&#xff0c;迎来了一个历史性时刻&#xff01;第一次拥有一个新的领导者&#xff1a;Python 编程语言。 这就意味着 Java 和 C 的长期霸权已经结束。Python 作为一种简单的脚本语言开始作为 Perl 的替代品&#xff0c;现在已经成熟。它…

2022年12月编程语言排行榜,数据来了!

2022年迎来了最后一个月&#xff0c;我们可以看到&#xff0c;在这一年中编程语言起起伏伏&#xff0c;有的语言始终炙手可热&#xff0c;而有的语言却逐渐“没落”...... 日前&#xff0c;全球知名TIOBE编程语言社区发布了12月编程语言排行榜&#xff0c;有哪些新变化&#xf…

2021年2月中国编程语言排行榜来了!

编程语言比例(市场份额) 工资 rankpl_平均工资工资中位数最低工资(2.5%)最高工资(97.5%)招聘人数百分比1haskell2516722500200003300030.0%2rust20732185005000450005150.1%3julia19194200001150027500420.0%4scala191091750052505715432840.7%5matlab18606175005134450007007…

2019年10月中国编程语言排行榜

2019年10月2日&#xff0c;我统计了某招聘网站&#xff0c;获得有效程序员招聘数据9万条。针对招聘信息&#xff0c;提取编程语言关键字&#xff0c;并统计如下&#xff1a; 编程语言比例 rankpl_percentage1java33.54%2cpp16.38%3c_sharp12.79%4javascript12.59%5python7.68%…