服务号和订阅号链接验证方式(自己根据查看资料整理)
//这是在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.概括 订阅号: 微信最初的形态是一个纯粹的社交工具,也就是人与人之间的联系工具,当中又分熟人之间的联系和陌生人之间的联系.于是就诞生了朋友圈和订阅号. 而订阅号的作用就是媒体社 ...
- 微信服务号和订阅号的五大区别,如何选择申请微信公众号
微信公众号分个人和企业两种,目前个人只能申请订阅号,而且不能认证. 企业微信分为服务号和订阅号,服务号每个月只能推送4篇文章,订阅号每天都可以推送文章. 但是服务号的权限要比订阅号的权限要大. 微信服 ...
- 公众平台服务号、订阅号、企业号的相关说明
服务号.订阅号.企业号的介绍(区别) 1.订阅号:主要偏于为用户传达资讯(类似报纸杂志),认证前后都是每天只可以群发一条消息: 2.服务号:主要偏于服务交互(类似银行,114,提供服务查询),认证前后 ...
- 微信公众平台的服务号和订阅号
微信公众平台 服务号 订阅号 作者:方倍工作室 地址:http://www.cnblogs.com/txw1958/p/ServiceNumber-subscriptionNumber.html ...
- 微信公众平台二次开发 API开发 服务账号开发 订阅号开发
移动互联网时代已经到来,微信已经有6亿多的用户,是移动端最大的入口.微网站,微商城建设,提供定制化服务,根据客户需求开发.客户很方便就能了解到公司的所有信息和最新动态,随时随地都可以跟公司进行互动,增 ...
- 微信公众平台与微信开放平台的区别、服务号、订阅号、企业微信的区别
微信公众平台 vs 微信开放平台 微信公众平台是介绍公众号相关的内容,比如服务号.订阅号.企业微信,所以叫微信公众平台:公众平台也是公众号的管理端,可以编辑推送文章,通常是公众号的运营.开发登录: 微 ...
- 一分钟看懂微信服务号和订阅号到底哪个好?
https://baijiahao.baidu.com/s?id=1564252452917327&wfr=spider&for=pc 一分钟看懂微信服务号和订阅号到底哪个好? 首席评 ...
- 做服务号还是订阅号?
服务号用不好,还不如订阅号 每个人都有这样的活经历:日常在就餐.逛商场或者预约某项服务的时候,都主动或被动地关注过一些品牌的服务号,一些做的不错的品牌服务号,我们也会利用碎片时间瞅两眼,比如:星巴克中 ...
- 微信公众平台认证步骤详解及服务号和订阅号区别---之微信开发一
微信公众号对象: 企业.媒体.以及公益.社区等组织.机构. 微信公众号作用: 通过微信公众渠道将品牌推广给上亿或者更多的微信用户. 1.极快的传播速度.极少的宣传成本: 2.提高品牌知名度,打造更具影 ...
最新文章
- 上汽集团金忠孝: 人工智能时代的汽车将发生颠覆的变革
- Linux下环境变量设置
- oracle取消dataguard,【DataGuard】Oracle DataGuard 数据保护模式切换
- 微信小程序01【目录结构详解、视图与渲染、事件、input、scroll-view】
- OpenCASCADE:使用 扩展数据交换XDE之形状和组件
- ironpython最新版本_Microsoft IronPython2.7.5 最新版
- 使用c#调用XMLHTTP(XMLHTTPClass) ,发送和返回 json
- mysql+update+@value_记一次MySQL更新语句update的踩坑
- 评价法(四):yaahp软件——层次分析法模块使用
- 【FPGA】精品FPGA书籍推荐
- 【高手分享】熟知Win7系统(英文版)分区14个小步骤
- Android Jni OpenCV-绘制朱利亚(Julia)集合图形
- 朋友买的115资源系统源码
- 程序开发者的10大开源网站
- P3P求解相机姿态原理介绍
- 体系结构笔记------动态调度中的Tomasulo算法
- 南宁计算机职称考试网,南宁人事考试职称网
- UrlRewrite.xml
- 随性而为_2015/08/21 周五 晴
- python导入本地模块报错之终极解决方案
热门文章
- 零基础如何备考初级会计?
- 算法竞赛入门竞赛 入门经典 第六章 个人记录
- 铝合金6060与6061与6063的区别
- 轻薄 matlab,【求推荐】女生用/轻薄/性能好/好看的笔记本/超级本 - 笔记本电脑(Notebook)版 - 北大未名BBS...
- java 浮点类型声明_java 浮点数据类型
- 设计模式之行为型模式(7种)
- 使用Docker镜像
- 大道至简:软件工程实践者的思想(点评版)(双色印刷)
- 【史上最全】Ambari 大数据集群运维与管理操作指南
- Java Maven Tomcat使用Tesseract-OCR文字识别(Tess4j)