微信公共平台(二)自动回复消息
package com.chaowen; import java.io.IOException; import java.io.InputStream; import java.io.PrintWriter; import java.io.StringReader; import java.io.Writer; import java.net.MalformedURLException; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.util.Arrays; import java.util.Date; import java.util.Scanner; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.xml.bind.JAXBContext; import javax.xml.bind.JAXBException; import javax.xml.bind.Marshaller; import javax.xml.bind.Unmarshaller; import com.chaowen.bean.WeChatReqBean; import com.chaowen.bean.WeChatRespBean; import com.chaowen.common.Constants; import com.sun.xml.bind.marshaller.CharacterEscapeHandler; /** * Servlet implementation class WeiXinServlet */ public class WeiXinServlet extends HttpServlet { private static final long serialVersionUID = 1L; public static final String Token = "token" ; protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setCharacterEncoding( "UTF-8" ); PrintWriter out = response.getWriter(); String signature = request.getParameter( "signature" ); String timestamp = request.getParameter( "timestamp" ); String nonce = request.getParameter( "nonce" ); String[] ArrTmp = { Token, timestamp, nonce }; Arrays.sort(ArrTmp); StringBuffer sb = new StringBuffer(); for ( int i = 0 ; i < ArrTmp.length; i++) { sb.append(ArrTmp[i]); } String pwd = Encrypt(sb.toString()); String echostr = request.getParameter( "echostr" ); System.out.println( "pwd==" +pwd); System.out.println( "echostr==" +echostr); if (pwd.equals(signature)){ if (! "" .equals(echostr) && echostr != null ){ response.getWriter().print(echostr); } } out.flush(); out.close(); //this.doPost(request, response); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { Scanner scanner = new Scanner(request.getInputStream()); response.setContentType( "application/xml" ); response.setCharacterEncoding( "UTF-8" ); PrintWriter out = response.getWriter(); try { // 1、获取用户发送的信息 InputStream is = request.getInputStream(); // 取HTTP请求流长度 int size = request.getContentLength(); // 用于缓存每次读取的数据 byte [] buffer = new byte [size]; // 用于存放结果的数组 byte [] xmldataByte = new byte [size]; int count = 0 ; int rbyte = 0 ; // 循环读取 while (count < size) { // 每次实际读取长度存于rbyte中 rbyte = is.read(buffer); for ( int i= 0 ;i<rbyte;i++) { xmldataByte[count + i] = buffer[i]; } count += rbyte; } is.close(); String requestStr = new String(xmldataByte, "UTF-8" ); // 2、解析用户的信息 JAXBContext jc = JAXBContext.newInstance(WeChatReqBean. class ); Unmarshaller u = jc.createUnmarshaller(); WeChatReqBean reqBean = (WeChatReqBean) u.unmarshal( new StringReader(requestStr)); // 3、判定用户了解动作 String content = getContent(reqBean); // 4、创建一个回复消息 jc = JAXBContext.newInstance(WeChatRespBean. class ); Marshaller m = jc.createMarshaller(); m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE); m.setProperty(CharacterEscapeHandler. class .getName(), new CharacterEscapeHandler() { @Override public void escape( char [] arg0, int arg1, int arg2, boolean arg3, Writer arg4) throws IOException { arg4.write(arg0, arg1, arg2); } }); m.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.TRUE); WeChatRespBean respBean = createRespBean(reqBean, content); m.marshal(respBean, out); out.flush(); } catch (JAXBException e) { e.printStackTrace(); } finally { if (scanner != null ) { scanner.close(); scanner = null ; } if (out != null ) { out.close(); out = null ; } } } /** * @param reqBean * @param content * @return */ private WeChatRespBean createRespBean(WeChatReqBean reqBean, String content) { WeChatRespBean respBean = new WeChatRespBean(); respBean.setFromUserName(reqBean.getToUserName()); respBean.setToUserName(reqBean.getFromUserName()); respBean.setMsgType( "text" ); respBean.setCreateTime( new Date().getTime()); respBean.setContent(content); return respBean; } public String Encrypt(String strSrc) { MessageDigest md = null ; String strDes = null ; byte [] bt = strSrc.getBytes(); try { md = MessageDigest.getInstance( "SHA-1" ); md.update(bt); strDes = bytes2Hex(md.digest()); //to HexString } catch (NoSuchAlgorithmException e) { System.out.println( "Invalid algorithm." ); return null ; } return strDes; } public String bytes2Hex( byte [] bts) { String des = "" ; String tmp = null ; for ( int i = 0 ; i < bts.length; i++) { tmp = (Integer.toHexString(bts[i] & 0xFF )); if (tmp.length() == 1 ) { des += "0" ; } des += tmp; } return des; } /** * @param reqBean * @throws JAXBException * @throws MalformedURLException */ private String getContent(WeChatReqBean reqBean) throws JAXBException, MalformedURLException { StringBuffer content = new StringBuffer( "" ); switch (Constants.getType(reqBean.getMsgType())){ case text: if (reqBean.getContent().contains( "成长档案" )) { // 这是新用户关注时默认发的一条信息。可以做一个欢迎处理。 content.append( "这是成长档案的介绍!" + "\r\n" ); content.append( "" + "\r\n" ); content.append( "" + "\r\n" ); content.append( "回复h获取更多内容!" + "\r\n" ); } else if (reqBean.getContent().contains( "h" )){ content.append( "这是帮助信息!" + "\r\n" ); content.append( "如果你还有疑问或建议:请以#开头发送文字内容,我们的客服收到留言后会尽快跟你联系。" + "\r\n" ); } else if (reqBean.getContent().contains( "cp" )){ content.append( "产品介绍:" + "\r\n" ); content.append( "001.家园共育平台" + "\r\n" ); content.append( "002.运营分析系统" + "\r\n" ); content.append( "003.互动学堂" + "\r\n" ); content.append( "" + "\r\n" ); content.append( "" + "\r\n" ); content.append( "回复数字获取更多内容!" + "\r\n" ); } else { content.append( "你的信息已收到,我们会第一时间处理." ); } break ; case event: if ( "subscribe" .equals(reqBean.getEvent())){ // 这是新用户关注时默认发的一条信息。可以做一个欢迎处理。 content.append( "非常感谢你的添加,我们定时为你提供最新的儿童内容服务哟!" + "\r\n" ); content.append( "1.想了解我们的产品请直接将产品名称回复给我(如\"成长档案\")" + "\r\n" ); content.append( "2.想知道已经上线了哪些产品请回复\"cp\"或直接点击链接www.yey.com进行查看" + "\r\n" ); content.append( "3.如需帮助或了解请回复\"h\"。" + "\r\n" ); } break ; case image: break ; default : content.append( "这是一个测试!!!" ); break ; } return content.toString(); } } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· [AI/GPT/综述] AI Agent的设计模式综述