refer : https://mp.weixin.qq.com/wiki

第一步:填写服务器配置

注意:填完了之后先不要点确定,先做第二步,做完第二步再点确定。

第二步:验证消息的确来自微信服务器 并返回数据

开发者通过检验signature对请求进行校验(下面有校验方式)。若确认此次GET请求来自微信服务器,请原样返回echostr参数内容,则接入生效,成为开发者成功,否则接入失败。加密/校验流程如下:
1)将token、timestamp、nonce三个参数进行字典序排序
2)将三个参数字符串拼接成一个字符串进行sha1加密
3)开发者获得加密后的字符串可与signature对比,标识该请求来源于微信

要想快速通过,不检验也可以,直接返回echostr的内容即可。
附上java的代码:

@RequestMapping("/wx/getMsg.htm")public ModelAndView mock(String echostr, HttpSession httpSession, HttpServletResponse response,HttpServletRequest request) throws Exception{if ( ! StringUtil.isNull(request.getParameter("echostr"))) {PrintWriter writer = response.getWriter();writer.print(request.getParameter("echostr"));writer.flush();writer.close();return null;}System.out.println(request.getRequestURL());System.out.println(request.getQueryString());// 取HTTP请求流  ServletInputStream sis = request.getInputStream();  // 取HTTP请求流长度  int size = request.getContentLength();  if (size<0) return null;// 用于缓存每次读取的数据  byte[] buffer = new byte[size];  // 用于存放结果的数组  byte[] xmldataByte = new byte[size];  int count = 0;  int rbyte = 0;  // 循环读取  while (count < size) {   // 每次实际读取长度存于rbyte中  rbyte = sis.read(buffer);   for(int i=0;i<rbyte;i++) {  xmldataByte[count + i] = buffer[i];  }  count += rbyte;  }  String xmlData = new String(xmldataByte, "UTF-8");System.out.println("recv from wx ->" + xmlData);WxTextMsgBean wx = new WxTextMsgBean();XMLUtil.parserWXRecvMsgxml(xmlData, wx );String rtnStr = XMLUtil.createWXSendMsgXml(wx, "我就是不告诉你,不服你来打我啊。");response.setContentType("text/html");response.setCharacterEncoding("UTF-8"); PrintWriter writer = response.getWriter();writer.print(rtnStr);writer.flush();writer.close();return null;}

XML解析相关:

package xm.web.utils;import java.io.IOException;
import java.io.StringReader;
import java.io.StringWriter;import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;import xm.web.bean.wx.msg.WxTextMsgBean;public class XMLUtil {public static String createWXSendMsgXml(WxTextMsgBean msg, String textMsgContent) {try {DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();DocumentBuilder builder = factory.newDocumentBuilder();Document document = builder.newDocument();Element root = document.createElement("xml");document.appendChild(root);// add a nodeElement toUserName = document.createElement("ToUserName");root.appendChild(toUserName);toUserName.appendChild(document.createCDATASection(msg.getFromUserName()));Element fromUserName = document.createElement("FromUserName");root.appendChild(fromUserName);fromUserName.appendChild(document.createCDATASection(msg.getToUserName()));Element createTime = document.createElement("CreateTime");root.appendChild(createTime);createTime.appendChild(document.createTextNode(String.valueOf(System.currentTimeMillis())));Element msgType = document.createElement("MsgType");root.appendChild(msgType);msgType.appendChild(document.createCDATASection("text"));Element content = document.createElement("Content");root.appendChild(content);content.appendChild(document.createCDATASection(textMsgContent));String rtn = toStringFromDoc(document);rtn = rtn.replace("<?xml version=\"1.0\" encoding=\"UTF-8\"?>", "");System.out.println(rtn);return rtn;} catch (Exception e) {System.out.println(e.getMessage());}return null;}/***  解析微信发来的【文本】消息* @param xmlStr 字符串xml* @param wx WxRecvMsgBean 用来存放解析结果*/public static void parserWXRecvMsgxml(String xmlStr, WxTextMsgBean wx) {DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();   DocumentBuilder builder;  try    {  builder  =  factory.newDocumentBuilder();StringReader sr = new StringReader(xmlStr);InputSource is = new InputSource(sr);Document doc  =  builder.parse(is);   NodeList nodeList=doc.getElementsByTagName("*");for(int i=0;i<nodeList.getLength();i++){switch (nodeList.item(i).getNodeName()) {case "ToUserName":wx.setToUserName(nodeList.item(i).getTextContent());break;case "FromUserName":wx.setFromUserName(nodeList.item(i).getTextContent());break;case "CreateTime":wx.setCreateTime(nodeList.item(i).getTextContent());break;case "MsgType":wx.setMsgType(nodeList.item(i).getTextContent());break;case "Content":wx.setContent(nodeList.item(i).getTextContent());break;case "MsgId":wx.setMsgId(nodeList.item(i).getTextContent());break;default:break;}}}catch(ParserConfigurationException e){     e.printStackTrace();  }catch (SAXException e){     e.printStackTrace();   }catch(IOException e){      e.printStackTrace();  }   }/*  * 把dom文件转换为xml字符串  */  public static String toStringFromDoc(Document document) {  String result = null;  document.setXmlStandalone(false);if (document != null) {  StringWriter strWtr = new StringWriter();  StreamResult strResult = new StreamResult(strWtr);  TransformerFactory tfac = TransformerFactory.newInstance();  try {  javax.xml.transform.Transformer t = tfac.newTransformer();
//                t.setOutputProperty(OutputKeys.ENCODING, "UTF-8");  t.setOutputProperty(OutputKeys.INDENT, "yes");
//                t.setOutputProperty(OutputKeys.METHOD, "xml");// text
//                t.setOutputProperty(
//                        "{http://xml.apache.org/xslt}indent-amount", "4");
//                t.clearParameters();t.transform(new DOMSource(document.getDocumentElement()),  strResult);  } catch (Exception e) {  System.err.println("XML.toString(Document): " + e);  }  result = strResult.getWriter().toString();  try {  strWtr.close();  } catch (IOException e) {  e.printStackTrace();  }  }  return result;  }  }
package xm.web.bean.wx.msg;public class WxTextMsgBean {private String toUserName;private String fromUserName;private String createTime;private String msgType;private String content;private String msgId;public String getToUserName() {return toUserName;}public void setToUserName(String toUserName) {this.toUserName = toUserName;}public String getFromUserName() {return fromUserName;}public void setFromUserName(String fromUserName) {this.fromUserName = fromUserName;}public String getCreateTime() {return createTime;}public void setCreateTime(String createTime) {this.createTime = createTime;}public String getMsgType() {return msgType;}public void setMsgType(String msgType) {this.msgType = msgType;}public String getContent() {return content;}public void setContent(String content) {this.content = content;}public String getMsgId() {return msgId;}public void setMsgId(String msgId) {this.msgId = msgId;}}

附上调试的链接:
https://mp.weixin.qq.com/debug/

微信公众平台接口调试(微信订阅号自动回复接口)相关推荐

  1. 微信公众号开发者自动回复php,微信公众平台开发者模式的启用并自动回复

    这篇文章介绍的内容是关于微信公众平台开发者模式的启用并自动回复,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下 首先,什么是开发者模式? 开发者模式,就是先验证你的服务器地址,验证完成之 ...

  2. 微信公众平台开发调试

    说到微信公众平台开发调试,还是先讲讲微信公众平台开发模式的信息传送过程,明白了其信息传送过程,对于调试方法就应该明白了.微信公众平台开发模式的信息传送过程很简单,如下所示: 请求过程:手机微信端发送内 ...

  3. 视频教程-微信公众平台开发入门-微信开发

    微信公众平台开发入门 订阅后,请点击此处观看大牛全套视频课程:课程播放页链接 价格可能因活动略有浮动 刘运强 ¥39.00 立即订阅视频课 订阅后:请点击此处观看视频课程 视频教程-微信公众平台开发入 ...

  4. 微信公众平台开发[2] —— 微信端分享功能

    背景 初次尝试微信公众号的开发,对于学习方法的探索都是来源于网上的博客.问答,对于参差不齐的信息,自己也是有苦说不出,抽出一点时间写点文章,既是对自己的学习总结,也希望给予同是菜鸟的小白一点帮助. 今 ...

  5. php 微信公众平台开发之微信群发信息

    这篇文章主要为大家详细介绍了php微信公众平台开发之微信群发信息,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 1.目的 完成在微信公众号中群发消息.这里只是完成简单的文字发送.也可以发送语音图片 ...

  6. php 拼团_详解在微信公众平台里实现微信拼团功能的步骤

    微信拼团是应用于微信公众号的微商城系统,商家只需要一个网站后台去接入自己的服务号,上传自己的产品或服务,就可以使用它的功能了,下面小编就为大家介绍在微信公众平台里实现微信拼团功能的方法,来看看吧 微信 ...

  7. golang 模拟登陆微信公众平台,突破微信群发每日一条限制

    思路:微信后台可以对指定用户进行回复,群发其实就是一个loop,so 模拟POST提交到微信 后台, 模拟登陆,即可突破群发每日一条限制. 直接上代码 /**@author 菠菜君*@Version ...

  8. 神卓互联内网穿透微信公众平台 API 实现微信登录

    神卓互联是一家专注于内网穿透和互联网软件开发的公司,其提供的内网穿透服务和微信开发能够满足众多企业和个人的需求.本文将介绍神卓互联的内网传统微信开发服务. 在内网中使用微信开发具有一定的困难,因为微信 ...

  9. 微信公众平台支持开通微信小店小程序了

    昨晚,微信小程序又放招了:微信公众平台支持开通微信小店小程序了!!!帮商家在微信内快速开店,方面商家和用户之间沟通.只要你有一个认证的公众号,就可在公众号后台申请小店小程序.原有微信小店功能的公众号, ...

  10. 微信公众平台编辑器教程-微信公众号使用教程32

    用微信公众号后台写文章, 进行排版时, 会发现一个尴尬的问题: 我们想要让文章的样式丰富些, 而微信编辑器提供给我们的样式功能却非常少. 但是你又发现有些公众号的文章排版却很漂亮, 有动态图片, 彩色 ...

最新文章

  1. 【RxSwift 实践系列 2/3】thinking in Rx- Create和Drive
  2. 信号完整性与电源完整性分析_「1月11日 免费视频直播」高速PCB信号完整性和电源完整性仿真实战分析、ADS创新解决方案分享-送给工程师的一份新年礼物...
  3. UIView加任意边框(Masonry)
  4. 深度学习论文资源(截至2016年)
  5. css margin和border,Margin、Border、Padding属性的区别和联系
  6. 如何才能学好单片机?​
  7. java http 302重定向_Java 纯HTTP请求 禁止302自动重定向
  8. mac自带python升级_mac升级Python失败?
  9. 阿里技术专家 分享 DDD(Domain-Driven Design 领域驱动设计)
  10. 渗透测试入门7之权限维持
  11. 使用Web API和React创建用户注册和登录
  12. 如何在XP SP2下面使用DTC
  13. Flask前后端分离跨域问题解决方案
  14. 无法获得锁 /var/lib/dpkg/lock - open (11: 资源暂时不可用) ...ubuntu 18.04 安装vim遇到的错误...
  15. 高德地图web精准定位
  16. 使用深度学习进行生存分析
  17. 【产品经理】产品经理进阶之路(六):互联网思维详解
  18. 域名重定向工具 —— SwitchHosts 实用教程
  19. (CVPR-2022)AdaViT:用于高效图像识别的自适应视觉变换器
  20. 洗护用品标准号,有害添加剂介绍和注意事项

热门文章

  1. 数据分析之大街网(二)
  2. Synchronized关键字详解
  3. 处女篇-写给自己看的
  4. 如何使用Python编写简易木马程序
  5. foc 电流环解耦_车用永磁同步电动机电流环偏差解耦控制系统
  6. 集团公司治理及运营管理图解
  7. 大专在读可以报考成人本科学历吗 需要什么条件
  8. TVS瞬态电压抑制二极管(钳位二极管)原理参数
  9. 计算机组成原理——控制器的功能和工作原理
  10. 是不是所有的癌症都会遗传?