//这是在struts项目写的链接和接收消息的处理方法。HttpServletRequest request = ServletActionContext.getRequest();HttpServletResponse response = ServletActionContext.getResponse();String method = request.getMethod();//链接时访问get方法进行处理。if(method != null && method.equals("GET")){//微信加密签名,signature结合了开发者填写的token参数和请求中的timestamp参数、nonce参数。 String signature = request.getParameter("signature");  // 时间戳  String timestamp = request.getParameter("timestamp");// 随机数  String nonce = request.getParameter("nonce");  // 随机字符串  String echostr = request.getParameter("echostr");  //获取response的writer方法,将得到的结果写回。PrintWriter out = response.getWriter();  // 通过检验signature对请求进行校验,若校验成功则原样返回echostr,表示接入成功,否则接入失败  //WXfInit.TOKEN链接时设置的tokenif (SignUtil.checkSignature(WXfInit.TOKEN,signature, timestamp, nonce)) {  out.print(echostr);  }  out.close();  out = null;  }//此处为处理用户发送消息POST方法。if(method != null && method.equals("POST")){//设置编码request.setCharacterEncoding("UTF-8");  response.setCharacterEncoding("UTF-8");  // 调用核心业务类接收消息、处理消息  String respMessage = connectService.processRequest();  // 响应消息  PrintWriter out = response.getWriter();  out.print(respMessage);  out.close();  }
**请求验证工具类(查找资料得到)**
package com.cntinker.util.wx.connect;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Arrays;/** * 请求校验工具类 *  */
public class SignUtil {  /** * 验证签名 *  * @param signature * @param timestamp * @param nonce * @return */  public static boolean checkSignature(String weixintoken,String signature, String timestamp, String nonce) {  String[] arr = new String[] { weixintoken, timestamp, nonce };  // 将token、timestamp、nonce三个参数进行字典序排序  Arrays.sort(arr);  StringBuilder content = new StringBuilder();  for (int i = 0; i < arr.length; i++) {  content.append(arr[i]);  }  MessageDigest md = null;  String tmpStr = null;  try {  md = MessageDigest.getInstance("SHA-1");  // 将三个参数字符串拼接成一个字符串进行sha1加密  byte[] digest = md.digest(content.toString().getBytes());  tmpStr = byteToStr(digest);  } catch (NoSuchAlgorithmException e) {  e.printStackTrace();  }  content = null;  // 将sha1加密后的字符串可与signature对比,标识该请求来源于微信  return tmpStr != null ? tmpStr.equals(signature.toUpperCase()) : false;  }  /** * 将字节数组转换为十六进制字符串 *  * @param byteArray * @return */  private static String byteToStr(byte[] byteArray) {  String strDigest = "";  for (int i = 0; i < byteArray.length; i++) {  strDigest += byteToHexStr(byteArray[i]);  }  return strDigest;  }  /** * 将字节转换为十六进制字符串 *  * @param mByte * @return */  private static String byteToHexStr(byte mByte) {  char[] Digit = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };  char[] tempArr = new char[2];  tempArr[0] = Digit[(mByte >>> 4) & 0X0F];  tempArr[1] = Digit[mByte & 0X0F];  String s = new String(tempArr);  return s;  }
}  
**解析用户消息XML**
public String processRequest() {HttpServletRequest request = ServletActionContext.getRequest();String respMessage = null;try {Map<String, String> requestMap = MessageUtil.parseXml(request); // xml请求解析String FromUserName = requestMap.get("FromUserName"); // 发送方帐号(open_id)String ToUserName = requestMap.get("ToUserName"); // 公众帐号String MsgType = requestMap.get("MsgType"); // 消息类型if (WXMsgType.REQ_MESSAGE_TYPE_TEXT.equals(MsgType))//判断用户发来的是否是文本消息{String Content = requestMap.get("Content"); // 接收用户发送的文本消息内容String message = null;//进行处理(此处写的是业务代码是:判断用户回复的文本是不是以t开头,进行照片处理。)if(Content.startsWith("t")){String type=Content.substring(1, Content.length());Map<String, Integer> index_count = wXFarmerImageService.findImageByUserId(FromUserName, type);Iterator iter =index_count.entrySet().iterator(); while (iter.hasNext()) { Map.Entry entry = (Map.Entry) iter.next(); String key = (String)entry.getKey(); int val = (int)entry.getValue(); if(key.equals("0")){if(val!=0){message = "照片分类成功,剩余"+val+"张图片未分类";}else{message = "照片分类成功";}}else if(key.equals("1")){message = "照片分类失败,请按照提示回复";}else if(key.equals("2")){message = "您上传的照片已经全部分类,无需重复提交!";}}//respfText 返回的是文本型的xmlrespMessage = respfText(FromUserName, ToUserName, message, "1234567890123456");}else{message = "温馨提示:\n上传图片可直接回复图片或选择菜单上传"+ "\n上传生产计划请选择菜单进行上传"+ "\n查看个人信息请选择菜单进行查看";}respMessage = respfText(FromUserName, ToUserName, message, "1234567890123456");}//判断用户时候发送的是事件,包括菜单点击,关注。取等事件if (WXMsgType.REQ_MESSAGE_TYPE_EVENT.equals(MsgType)) {String event = requestMap.get("Event");//获取事件名称if ("subscribe".equals(event)){String message = null;Farmer farmer = new Farmer();farmer.setUserId(FromUserName);String access_Token = WXFGetTokenService.accessTokenIsOvertime();JSONObject userInformation = WeixinUtil.httpRequest(WXurl.WXF_USERNAME_URL.replace("ACCESS_TOKEN",access_Token).replace("OPENID",FromUserName), "GET", null);farmer.setUserName(userInformation.getString("nickname"));farmer.setHeadPortrait(userInformation.getString("headimgurl").substring(0, userInformation.getString("headimgurl").length()-1)+"64");farmer.setStatus("0");farmerService.saveFarmer(farmer);message = "欢迎关注康源公社服务号\n"+ "温馨提示:\n上传图片可直接回复图片或选择菜单上传"+ "\n上传生产计划请选择菜单进行上传"+ "\n查看个人信息请选择菜单进行查看";respMessage = respfText(FromUserName, ToUserName, message, "1234567890123456");}}if (WXMsgType.REQ_MESSAGE_TYPE_IMAGE.equals(MsgType)) {String picUrl = requestMap.get(WXMessage.PICURL);String status = farmerService.getStatus(FromUserName);String message = null;if(status.equals("0")){message ="点击上方文字进行填写信息";String access_tokenF = WXFGetTokenService.accessTokenIsOvertime();String messages = "<a href=\""+WXfInit.SERVICEURLW+"/xnr/page/wx/farmer/farmerExamine.action?farmerId="+FromUserName+"\">请前往页面填写审核信息。</a>";Text text = new Text();text.setContent(messages);TextMessageF textMessageF =new TextMessageF();textMessageF.setTouser(FromUserName);textMessageF.setMsgtype("text");textMessageF.setText(text);String outputStr = JSONObject.fromObject(textMessageF).toString();JSONObject jsons =  WeixinUtil.httpRequest(WXurl.WXF_MESSARW_TO_USER.replace("ACCESS_TOKEN", access_tokenF), "POST", outputStr);}else if(status.equals("3")){message = "审核资料已提交,请等待审核!";}else{wXFarmerImageService.save(FromUserName, picUrl);String types = farmerService.getFenleiByUserId(FromUserName);List<BusinessGoods> list = businessGoodsService.getTypeNameById(types);StringBuffer me = new StringBuffer();for (BusinessGoods businessGoods : list) {me.append("t"+businessGoods.getId()+businessGoods.getGoodsName()+"\n");}message = "请按顺序回复上传图片分类:"+me.toString();}respMessage = respfText(FromUserName, ToUserName, message, "1234567890123456");}}catch (Exception e) {e.printStackTrace();}return respMessage;}
**对用户的xml解析和返回和转义成xml形式工具类(查找资料获取)**
package com.xnradmin.client.service.wx;import java.io.InputStream;
import java.io.Writer;
import java.util.HashMap;
import java.util.List;
import java.util.Map;import javax.servlet.http.HttpServletRequest;import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.core.util.QuickWriter;
import com.thoughtworks.xstream.io.HierarchicalStreamWriter;
import com.thoughtworks.xstream.io.xml.PrettyPrintWriter;
import com.thoughtworks.xstream.io.xml.XppDriver;
import com.xnradmin.client.messag.resp.Article;
import com.xnradmin.client.messag.resp.MusicMessage;
import com.xnradmin.client.messag.resp.NewsMessage;
import com.xnradmin.client.messag.resp.TextMessage;
import com.xnradmin.client.messag.resp.Voice;
import com.xnradmin.client.messag.resp.VoiceMessage;public class MessageUtil
{public static final String RESP_MESSAGE_TYPE_TEXT = "text";public static final String RESP_MESSAGE_TYPE_MUSIC = "music";public static final String RESP_MESSAGE_TYPE_NEWS = "news";public static final String REQ_MESSAGE_TYPE_TEXT = "text";public static final String REQ_MESSAGE_TYPE_IMAGE = "image";public static final String REQ_MESSAGE_TYPE_LINK = "link";public static final String REQ_MESSAGE_TYPE_LOCATION = "location";public static final String REQ_MESSAGE_TYPE_VOICE = "voice";public static final String REQ_MESSAGE_TYPE_EVENT = "event";public static final String EVENT_TYPE_SUBSCRIBE = "subscribe";public static final String EVENT_TYPE_UNSUBSCRIBE = "unsubscribe";public static final String EVENT_TYPE_CLICK = "click";private static XStream xstream = new XStream(new XppDriver() {public HierarchicalStreamWriter createWriter(Writer out) {return new PrettyPrintWriter(out){boolean cdata;public void startNode(String name, Class clazz){super.startNode(name, clazz);}protected void writeText(QuickWriter writer, String text) {if (this.cdata) {writer.write("<![CDATA[");writer.write(text);writer.write("]]>");} else {writer.write(text);}}};}});
//将xml转存到map数组中public static Map<String, String> parseXml(HttpServletRequest request)throws Exception{Map map = new HashMap();InputStream inputStream = request.getInputStream();SAXReader reader = new SAXReader();Document document = reader.read(inputStream);Element root = document.getRootElement();List<Element> elementList = root.elements();for (Element e : elementList){map.put(e.getName(), e.getText());}inputStream.close();return map;}
//将文本实体转换成xml格式public static String textMessageToXml(TextMessage textMessage){xstream.alias("xml", textMessage.getClass());return xstream.toXML(textMessage);}
//将音乐实体转换成xml格式public static String musicMessageToXml(MusicMessage musicMessage){xstream.alias("xml", musicMessage.getClass());return xstream.toXML(musicMessage);}
//将图文实体转换成xml格式public static String newsMessageToXml(NewsMessage newsMessage){xstream.alias("xml", newsMessage.getClass());xstream.alias("item", new Article().getClass());return xstream.toXML(newsMessage); }
//将音频实体转换成xml格式public static String voiceMessageToXml(VoiceMessage voiceMessage) {xstream.alias("xml", voiceMessage.getClass());xstream.alias("mediaId", new Voice().getClass());return xstream.toXML(voiceMessage);}
}
**返回文本型XML**
/**
*接收者openid
*发送者openid
*文本消息
*随机串
*/
private String respfText(String FromUserName, String ToUserName, String text, String MsgId) {TextMessage textMessage = new TextMessage();textMessage.setToUserName(FromUserName);textMessage.setFromUserName(ToUserName);textMessage.setCreateTime(new Date().getTime());textMessage.setMsgType("text");textMessage.setMsgId(MsgId);textMessage.setContent(text);return MessageUtil.textMessageToXml(textMessage);}

服务号和订阅号链接验证方式(自己根据查看资料整理)相关推荐

  1. 微信服务号、订阅号和企业号的差别(运营和开发两个角度)

    一.运营的角度 1.1.概括 订阅号: 微信最初的形态是一个纯粹的社交工具,也就是人与人之间的联系工具,当中又分熟人之间的联系和陌生人之间的联系.于是就诞生了朋友圈和订阅号. 而订阅号的作用就是媒体社 ...

  2. 微信服务号和订阅号的五大区别,如何选择申请微信公众号

    微信公众号分个人和企业两种,目前个人只能申请订阅号,而且不能认证. 企业微信分为服务号和订阅号,服务号每个月只能推送4篇文章,订阅号每天都可以推送文章. 但是服务号的权限要比订阅号的权限要大. 微信服 ...

  3. 公众平台服务号、订阅号、企业号的相关说明

    服务号.订阅号.企业号的介绍(区别) 1.订阅号:主要偏于为用户传达资讯(类似报纸杂志),认证前后都是每天只可以群发一条消息: 2.服务号:主要偏于服务交互(类似银行,114,提供服务查询),认证前后 ...

  4. 微信公众平台的服务号和订阅号

    微信公众平台 服务号 订阅号  作者:方倍工作室  地址:http://www.cnblogs.com/txw1958/p/ServiceNumber-subscriptionNumber.html ...

  5. 微信公众平台二次开发 API开发 服务账号开发 订阅号开发

    移动互联网时代已经到来,微信已经有6亿多的用户,是移动端最大的入口.微网站,微商城建设,提供定制化服务,根据客户需求开发.客户很方便就能了解到公司的所有信息和最新动态,随时随地都可以跟公司进行互动,增 ...

  6. 微信公众平台与微信开放平台的区别、服务号、订阅号、企业微信的区别

    微信公众平台 vs 微信开放平台 微信公众平台是介绍公众号相关的内容,比如服务号.订阅号.企业微信,所以叫微信公众平台:公众平台也是公众号的管理端,可以编辑推送文章,通常是公众号的运营.开发登录: 微 ...

  7. 一分钟看懂微信服务号和订阅号到底哪个好?

    https://baijiahao.baidu.com/s?id=1564252452917327&wfr=spider&for=pc 一分钟看懂微信服务号和订阅号到底哪个好? 首席评 ...

  8. 做服务号还是订阅号?

    服务号用不好,还不如订阅号 每个人都有这样的活经历:日常在就餐.逛商场或者预约某项服务的时候,都主动或被动地关注过一些品牌的服务号,一些做的不错的品牌服务号,我们也会利用碎片时间瞅两眼,比如:星巴克中 ...

  9. 微信公众平台认证步骤详解及服务号和订阅号区别---之微信开发一

    微信公众号对象: 企业.媒体.以及公益.社区等组织.机构. 微信公众号作用: 通过微信公众渠道将品牌推广给上亿或者更多的微信用户. 1.极快的传播速度.极少的宣传成本: 2.提高品牌知名度,打造更具影 ...

最新文章

  1. 上汽集团金忠孝: 人工智能时代的汽车将发生颠覆的变革
  2. Linux下环境变量设置
  3. oracle取消dataguard,【DataGuard】Oracle DataGuard 数据保护模式切换
  4. 微信小程序01【目录结构详解、视图与渲染、事件、input、scroll-view】
  5. OpenCASCADE:使用 扩展数据交换XDE之形状和组件
  6. ironpython最新版本_Microsoft IronPython2.7.5 最新版
  7. 使用c#调用XMLHTTP(XMLHTTPClass) ,发送和返回 json
  8. mysql+update+@value_记一次MySQL更新语句update的踩坑
  9. 评价法(四):yaahp软件——层次分析法模块使用
  10. 【FPGA】精品FPGA书籍推荐
  11. 【高手分享】熟知Win7系统(英文版)分区14个小步骤
  12. Android Jni OpenCV-绘制朱利亚(Julia)集合图形
  13. 朋友买的115资源系统源码
  14. 程序开发者的10大开源网站
  15. P3P求解相机姿态原理介绍
  16. 体系结构笔记------动态调度中的Tomasulo算法
  17. 南宁计算机职称考试网,南宁人事考试职称网
  18. UrlRewrite.xml
  19. 随性而为_2015/08/21 周五 晴
  20. python导入本地模块报错之终极解决方案

热门文章

  1. 零基础如何备考初级会计?
  2. 算法竞赛入门竞赛 入门经典 第六章 个人记录
  3. 铝合金6060与6061与6063的区别
  4. 轻薄 matlab,【求推荐】女生用/轻薄/性能好/好看的笔记本/超级本 - 笔记本电脑(Notebook)版 - 北大未名BBS...
  5. java 浮点类型声明_java 浮点数据类型
  6. 设计模式之行为型模式(7种)
  7. 使用Docker镜像
  8. 大道至简:软件工程实践者的思想(点评版)(双色印刷)
  9. 【史上最全】Ambari 大数据集群运维与管理操作指南
  10. Java Maven Tomcat使用Tesseract-OCR文字识别(Tess4j)