微信被动回复消息失败所有的坑!Java篇【避坑指南】

时间:2024-03-21 19:58:09

版权声明:本文为博主原创文章,转载请注明出处!有时候也不是原创,手快就选了(我的文章随意转载复制,不在乎的哈!) https://blog.csdn.net/qq_31384551/article/details/81776265

背景:

随便一个微信订阅号都可以,用户在订阅号发送消息,然后我们自己的服务器做出消息回复,之间的过程处理好多坑。

我这里是从接入成功后开始踩到的坑,关于接入的没什么,微信公众号文档很清楚。

开始了:

我的服务器使用的ssm框架

1.坑列表:

  1. 获取微信请求我方服务器参数的坑
  2. 响应消息xml的坑
  3. 响应消息参数的坑

一个个解决:

我的控制器代码,没有验证是否来自微信,接入的时候自己加(注意我接收到的参数和返回时的参数,尤其是接收人和发送人

 
  1. @RequestMapping(value = "toMsg",method = RequestMethod.POST,produces = {"application/xml; charset=UTF-8"})

  2. public void toMsg(HttpServletRequest request, HttpServletResponse response) throws IOException {

  3. log.info("微信返回了--------Weichart_Return");

  4. String resXml="";

  5. InputStream inputStream ;

  6. StringBuffer sb = new StringBuffer();

  7. inputStream = request.getInputStream();

  8. String reqXmlStr;

  9. BufferedReader in = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"));

  10. while ((reqXmlStr = in.readLine()) != null){

  11. sb.append(reqXmlStr);

  12. }

  13. in.close();

  14. inputStream.close();

  15. System.out.println(sb.toString());

  16. try {

  17. Map<String, Object> map = XMLUtil.xmlStrToMap(sb.toString());

  18. String toUserName = map.get("ToUserName").toString();//开发者微信号

  19. String fromUserName = map.get("FromUserName").toString();//发送方帐号(一个OpenID)

  20. String createTime = map.get("CreateTime").toString();//消息创建时间 (整型)

  21. String msgType = map.get("MsgType").toString();//消息类型

  22. String content = map.get("Content").toString();//消息内容

  23. String msgId = map.get("MsgId").toString();//消息id,64位整型

  24. log.info("接收到的消息:\r\n"+"ToUserName="+toUserName+"\r\nFromUserName="+fromUserName+"\r\nCreateTime="+

  25. createTime+"\r\nMsgType="+msgType+"\r\nContent="+content+"\r\nMsgId="+msgId);

  26. String resXmlStr="<xml><ToUserName><![CDATA["+fromUserName+"]]></ToUserName>" +//此处要填写 发送方帐号(一个OpenID)

  27. "<FromUserName><![CDATA["+toUserName+"]]></FromUserName>" +//此处填写开发者微信号

  28. "<CreateTime>"+createTime+"</CreateTime>" +

  29. "<MsgType><![CDATA["+msgType+"]]></MsgType>"+

  30. "<Content><![CDATA["+content+"]]></Content></xml>";

  31. log.info(resXmlStr);

  32. response.getWriter().print(resXmlStr);

  33. } catch (DocumentException e) {

  34. e.printStackTrace();

  35. }

  36. }

1.接收微信参数,要从request的请求流InputStream中取出,然后再转换为你自己需要的数据类型,此处我转换为Map类型了,使用的dom4j把字符串转为dom对象然后存入Map的

2.返回XML的时候有几点要注意:

(1)使用流返回,response的getWriter().print(xmlStr);返回,不要使用return String;的方式返回,容易携带些不知名信息。

(2)返回的XML数据格式一定要正确,尤其是<![CDATA  和 ]]>  这不是多个符号,而是两个符号,所以中间不要有空格,不然你是无法把字符串转XML的,返回的时候也会报错

(3)参数问题,仔细看文档,接收消息和被动回复消息的时候,其实ToUserName和FromUserName两个参数其实是反的,也就是说发送人和接收人是反的,这个要注意,其实仔细看官网文档参数说明就能避免。

(4)spring mvc的数据返回类型,一般在mvc配置文件中配置返回的是json格式,此处要单独设置为返回类型是xml格式,也就是在@RequestMapping注解的produces属性中设置返回类型和编码格式,如果不配置返回xml格式的话返回的所有都正确,但是在xml的前后各加了个引号(这就是json的格式,String类型要加引号),微信就不认了

@RequestMapping(value = "toMsg",method = RequestMethod.POST,produces = {"application/xml; charset=UTF-8"})

 

只要注意这些坑注意了,那么被动回复就会成功,没有问题的。

如果还没有成功的话,那就去看看微信公众号的运维中心看看日志吧,然后根据日志再做处理(注:日志有延时,时间还比较长)

微信被动回复消息失败所有的坑!Java篇【避坑指南】

微信被动回复消息失败所有的坑!Java篇【避坑指南】

自动回复成功图:

微信被动回复消息失败所有的坑!Java篇【避坑指南】

我的已经解决了,如果还有没提到的坑,请留言,我会回复的

--------------------- 本文来自 大BUG 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/qq_31384551/article/details/81776265?utm_source=copy