微信公众平台接口调试(微信订阅号自动回复接口)
来源:互联网 发布:淘宝男士羽绒服好看吗 编辑:程序博客网 时间:2024/05/21 10:14
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 node Element 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/
0 0
- 微信公众平台接口调试(微信订阅号自动回复接口)
- PHP微信公众平台开:获取接口调用凭据access_token、订阅事件推、消息回复
- 二、配置微信公众平台回复接口
- 微信公众平台新增“一次性订阅消息”接口
- 微信公众平台自动回复详解
- 微信 公众平台接口
- C#微信公众号/订阅号开发 接口源码
- 微信“公众平台测试账号”接口调试指南
- 微信公众平台 多媒体文件上传接口调试工具
- 微信开发实战(2)—微信公众平台接口调试工具
- 微信公众号笔记---本地调试微信接口
- 微信接口 图灵自动回复
- 微信公众平台开发订阅号
- 开启微信公众号自动回复
- 微信公众号开发自动回复
- ASP微信公众平台接口开发
- 微信公众平台消息接口开发
- 微信公众平台消息接口使用指南
- Java类设计技巧
- robotframework笔记(一)
- App 接口
- 使用Python实现子区域数据分类统计
- Java 日期时间 Date类型,long类型,String类型表现形式的转换
- 微信公众平台接口调试(微信订阅号自动回复接口)
- Ubuntu/kali上安装MySQL,设置远程访问详细教程
- c# new关键字的三种用法
- Android动画之旅(四)----小球拟合动画
- getSystemService
- linux 常用命令学习
- C# 特性(Attributes)
- redis系列(四)数据库
- 如何优化营销邮件的CTA按钮