当前位置: 首页 > news >正文

android微信小程序自动填表_微信小程序自动回复用户消息

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

​​

40971e1cc5305ed6a06424c10d22b0eb.png

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

https://developers.weixin.qq.com/community/develop/article/doc/00066a67324e70bdf0981381b5c813 https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/customer-message/customerServiceMessage.send.html 微信的垃圾文档我就懒得喷了啊,按它这个文档做简直是一团乱麻

整个流程是这样的我们可以在微信小程序的开发者后台设置消息的回调地址,当用户进入小程序的客服页面,或在客服页面的输入框中输入内容时,微信小程序就会根据我们配置的消息回调地址把这条消息或这个事件回调给我们的服务器,我们可以进行相关处理,并给用户回复消息如上图显示的那些我输入 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) { http://log.info(line); xmlStr.append(line); } Map map = XmlUtil.xmlToMap(xmlStr.toString()); CustomerMsgReq customerMsgReq = WXAutoRespReqUtil.buildResponseMessage(map, config.getAppletsAppId(), config.getRespHref(), config.getRespText()); http://log.info("send custom message param :{}", customerMsgReq); if(customerMsgReq == null){ return; } String accessToken = getCacheAccessToken(); JSONObject sendResult = wxAppletsRemoting.messageCustomSend(accessToken, customerMsgReq); http://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); http://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) { http://log.info(line); xmlStr.append(line); } Map map = XmlUtil.xmlToMap(xmlStr.toString()); //链接内容 String msgText =""+text+"";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 这个接口给用户回复,参考微信文档

https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/customer-message/customerServiceMessage.send.html

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

https://gitee.com/tianji_luhaichuan/pay/tree/master/wxshare-sdk-java

有问题欢迎加微信交流

5c80c672e115d27bf51bb5e71b941a29.png

2ea9785e599eaf2e48ac13107a1aa5cc.png

​​

补充一句,加微信别老是您您您的,都是打工人,不必这么客气,我也才18啊哈哈


http://www.taodudu.cc/news/show-647665.html

相关文章:

  • 【physx/wasm】在physx中添加自定义接口并重新编译wasm
  • excel---常用操作
  • Lora训练Windows[笔记]
  • linux基础指令讲解(ls、pwd、cd、touch、mkdir)
  • InnoDB 事务处理机制
  • 启明云端ESP32 C3 模组WT32C3通过 MQTT 连接 AWS
  • db2分页查询语句优化_数据量很大,分页查询很慢,该怎么优化?
  • arcgis 统一投影下范围不同_关于Arcgis这62个常用技巧,你造吗
  • 漏洞挖掘 符号执行_简述符号执行
  • 小度智能音箱维修点_会投屏电视的智能音箱——小度智能音箱PLAY青春版轻体验...
  • pq 中m函数判断嵌套_Python中numpy的布尔判断、切片、维度变化、合并、通用函数...
  • 对象 普通po转_谈谈C++对象的构造
  • 内存条ar开头的如何看大小_软网推荐:明明白白看内存
  • if else 简写_15+ JS简写骚操作,让你的代码“秀”起来??
  • iextensionunit类_Java ICompilationUnit.reconcile方法代码示例
  • 报错 插入更新_自增主键,三类插入测验答案,在这里。
  • 事务连接中断_HTTP长连接和短连接
  • 亚马逊评价抓取插件_亚马逊运营必备插件
  • controller需要捕获异常吗_Spring之Controller异常处理
  • mysql8中文排序_mysql中utf8编码的中文字段按拼音排序
  • html 分级切换菜单_FL studio系列教程(十六):FL Studio查看菜单讲解
  • mysql还原数据库后日期显示3000_mysql 直接从date 文件夹备份表,还原数据库之后提示 table doesn`t exist的原因和解决方法...
  • java 函数名调用_粉丝提问|c语言:如何定义一个和库函数名一样的函数,并在函数中调用该库函数...
  • docker mysql sock_docker mysql安装
  • mysql最大述_mysql最大字段数量及 varchar类型总结
  • php协程实现mysql异步_swoole与php协程实现异步非阻塞IO开发
  • mysql中xml类型_使用 SQLXML 数据类型
  • mysql语法6_全面接触SQL语法(6)_mysql
  • sqlerver mysql_转 MYSQL学习(一)
  • tcpdump 识别成dns_dns tcpdump
  • java linkedhashmap_java学习-hashMap和linkedHashMap
  • 简单java题_java
  • java actionsupport_struts2中的Action接口和Actionsupport接口各有什么作用
  • java jar log4j_使用Log4j
  • java课程设计进程管理_GitHub - Shadow-Java/OS: 操作系统课程设计,关键词:进程同步与互斥、进程死锁、LRU页面替换算法、时间片轮转算法、时钟等...
  • mysql中建立索引的原则_在SQL数据库中设定索引的原则是什么?(注意是设定不是创建)...