上一节讲了开发的接口接入这一部分,这是非常重要的.

实现业务的逻辑应该写在POST方法这一块.

GET是消息验证用的,验证接口那一块的.

XML数据包:腾讯服务器传过来的数据是XML格式的传到你的业务服务器上的.

开发者填写的URL:你自己的这台业务服务器了.

腾讯服务器和你的业务服务器之间有一个五秒的连接限制.也就是说你的业务服务器必须在五秒之内给腾讯服务器一个响应,这个问题必须要注意啊.以后你的程序越写越大,你还要连接业务服务器上的数据库.你要连接业务服务器上的数据库一定要保证你所有的业务自它请求过来开始,也就是说腾讯服务器的一个request过来开始到你的业务服务器response响应回去,一定要在五秒之内完成.如果五秒之内不完成当前这次请求就断掉了.断掉了之后它会说它重新再发起一次请求.这样的动作会有三次,如果三次你都是在五秒之内没有响应的话,它就会在手机端提示当前服务号无法工作或者是无法提供服务之类的信息.也就说这次请求你就失败了.你超过五秒钟之后比如说你在第10秒钟你的业务服务器查询完数据库组装完报文之后你再返回回去没有用.这个就几个解决方案,首先你就保证它五秒钟之内能执行完呗.你通过优化你的数据库,你采用其他的一种方式,比如说数据缓存啊或者是什么分布式部署啊或者是静态化啊等等,如果说这块五秒钟你的确是完成不了,你可以调用它其他的接口.其实业务服务器还可以主动向腾讯服务器发起调用,手机->腾讯服务器->业务服务器.反过来是业务服务器->腾讯服务器->手机有一个推送消息.

Source->Format.

ToUserName是开发者的微信号.

腾讯服务器有N多个账号,你的业务服务器也可以为N多个腾讯账号服务.你一个接口接收过来的消息你知道是哪个腾讯账号发送过来的吗?就是根据ToUserName来判断的.

FromUserName发送方账号:OpenID是哪个手机的号.是我的微信号:

这样第一个功能就实现了,业务服务器已经可以实现接收文本消息了.

package wx.in;import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;import javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServletRequest;public class In_Util {/*** 通过request得到请求流中的微信报文str* @param request* @return*/public static String getStringFromRequest(HttpServletRequest request){StringBuffer strb = new StringBuffer();//strb要存储一下request获取过来的东西ServletInputStream in;try {in = request.getInputStream();BufferedReader breader =  new BufferedReader( new InputStreamReader(in,"UTF-8"));//接收是对的,已经进行转码了.String str = null;//+-*/是运算符,赋值运算符=也是运算符while(null!=(str = breader.readLine())){strb.append(str);}}catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}return strb.toString();}
}
package net.wxinterface;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.security.MessageDigest;
import java.util.Arrays;
import java.util.Date;
import java.util.Map;import javax.servlet.ServletException;
import javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;import org.dom4j.DocumentException;import wx.in.In_Util;import com.imooc.po.TextMessage;
import com.imooc.util.MessageUtil;
public class WX_Interface extends HttpServlet {/*** Constructor of the object.*/public WX_Interface() {super();}/*** Destruction of the servlet. <br>*/public void destroy() {super.destroy(); // Just puts "destroy" string in log// Put your code here}/*** The doGet method of the servlet. <br>** This method is called when a form has its tag value method equals to get.* * @param request the request send by the client to the server* @param response the response send by the server to the client* @throws ServletException if an error occurred* @throws IOException if an error occurred*/public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {//΢�ż���ǩ��,signature����˿�������д��tocken����������е�timestamp����nonce����String signature = request.getParameter("signature");//ʱ���String timestamp = request.getParameter("timestamp");//����� String nonce = request.getParameter("nonce");String echostr = request.getParameter("echostr");String tocken = "test";try{if(null != signature){String[] ArrTmp = {tocken,timestamp,nonce};    Arrays.sort(ArrTmp);StringBuffer sb = new StringBuffer();for(int i=0;i<ArrTmp.length;i++){sb.append(ArrTmp[i]);}MessageDigest md = MessageDigest.getInstance("SHA-1");byte[] bytes = md.digest(new String(sb).getBytes());StringBuffer buf = new StringBuffer();for(int i=0;i<bytes.length;i++){if(((int)bytes[i] & 0xff)<0x10){buf.append("0");}buf.append(Long.toString((int) bytes[i] & 0xff,16));}if(signature.equals(buf.toString())){response.getOutputStream().println(echostr);}}}catch(Exception e){e.printStackTrace();}System.out.println("test0");System.out.println("doGet");System.out.println("signature     "+signature);System.out.println("timstamp      "+timestamp);System.out.println("nonce         "+nonce);System.out.println("echostr         "+echostr);System.out.println("doGet");}/*** The doPost method of the servlet. <br>** This method is called when a form has its tag value method equals to post.* * @param request the request send by the client to the server* @param response the response send by the server to the client* @throws ServletException if an error occurred* @throws IOException if an error occurred*/public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {/*request.setCharacterEncoding("UTF-8");response.setCharacterEncoding("UTF-8");
PrintWriter out = response.getWriter();
try {Map<String,String> map = MessageUtil.xmlToMap(request);String fromUserName = map.get("FromUserName");String toUserName = map.get("ToUserName");String msgType = map.get("MsgType");String content = map.get("Content");//String message = null;//if("text".equals(msgType)){if(MessageUtil.MESSAGE_TEXT.equals(msgType)){if("1".equals(content)){message = MessageUtil.initText(toUserName,fromUserName,MessageUtil.firstMenu());             }else if("3".equals(content)){//message = MessageUtil.initText(toUserName,fromUserName,content);             //�Ϳ��������ﰴ3����ͼƬ��Ϣ,���ͼƬ��Ϣ�Ĵ����Լ��ظ��Ѿ�д����message = MessageUtil.initImageMessage(toUserName,fromUserName);}else if("4".equals(content)){//��servlet����һ���ж�,������4��ʱ��ظ�һ�����ָ���  message = MessageUtil.initMusicMessage(toUserName,fromUserName);}else if("2".equals(content)){//message = MessageUtil.initText(toUserName,fromUserName,MessageUtil.secondMenu());          //�����ͼ����Ϣ�Ĵ����Լ��ظ��Ѿ�д���� message= MessageUtil.initNewsMessage(toUserName,fromUserName);}else if("?".equals(content)||" ? ".equals(content)){message = MessageUtil.initText(toUserName,fromUserName,MessageUtil.menuText());}TextMessage text = new TextMessage();text.setFromUserName(toUserName);//˭������,��ͷ���˭text.setToUserName(fromUserName);text.setMsgType("text");text.setCreateTime(new Date().getTime());text.setContent("���͵���Ϣ��:"+content);message = MessageUtil.textMessageToXml(text);System.out.println(message);}else if(MessageUtil.MESSAGE_EVENT.equals(msgType)){//�����Ϣ���͵��߼�String eventType = map.get("Event");if(MessageUtil.MESSAGE_SUBSCRIBE.equals(eventType)){//��Ϣ�����¼�������message = MessageUtil.initText(toUserName, fromUserName, content);//��ע΢�Ź��ں�֮��΢�ź�̨����}//�������Servlet�������һ���߼����ж�else if(MessageUtil.MESSAGE_CLICK.equals(eventType)){//�����������Click�˵���һ���¼�����//Click���͵���Ϣ����,���Event��Click���͵Ļ�,��ô����ظ�һ�����˵�message = MessageUtil.initText(toUserName, fromUserName, MessageUtil.menuText());}else if(MessageUtil.MESSAGE_VIEW.equals(eventType)){//�����View���Ͳ˵�,�ͻظ�һ�������õ�UrlString url  = map.get("EventKey");//�����View���Ͳ˵��Ļ�,���EventKey�������Url��ֵif("11".equals(url)){//���Keyֵ��11message = MessageUtil.initText(toUserName, fromUserName, url);}}else if(MessageUtil.MESSAGE_SCANCODE.equals(eventType)){//�ظ�һ�����ɨ���¼�String key  = map.get("EventKey");//�����Click���Ͳ˵��Ļ�,EventKey���������õ�Keyֵmessage = MessageUtil.initText(toUserName, fromUserName, key);}}out .print(message);
} catch (DocumentException e) {// TODO Auto-generated catch blocke.printStackTrace();
}finally{out.close();
}System.out.println("doPost");*///response.setContentType("text/html");//PrintWriter out = response.getWriter();/*     StringBuffer strb = new StringBuffer();ServletInputStream in = request.getInputStream();BufferedReader     breader=       new BufferedReader( new InputStreamReader(in,"UTF-8"));String str = null;while(null!=(str=breader.readLine())){strb.append(str);}//out.println(str);System.out.println(strb);*///out.flush();//out.close();
/*response.setContentType("text/html");
PrintWriter out = response.getWriter();StringBuffer strb = new StringBuffer();
//strb要存储一下request获取过来的东西
ServletInputStream in =  request.getInputStream();BufferedReader breader =  new BufferedReader( new InputStreamReader(in,"UTF-8"));//接收是对的,已经进行转码了.
String str = null;
//+-*\/\是运算符,赋值运算符=也是运算符/*
while(null!=(str = breader.readLine())){strb.append(str);
}
out.println(strb);
System.out.println(strb);
out.flush();
out.close();*/String requestStr = In_Util.getStringFromRequest(request);System.out.println(requestStr);System.out.println("北风网");}/*** Initialization of the servlet. <br>** @throws ServletException if an error occurs*/public void init() throws ServletException {// Put your code here}}

转载于:https://my.oschina.net/u/3206447/blog/901990

微信公众平台深度开发JAVA版第一季 08.接收普通消息1相关推荐

  1. 微信公众平台深度开发JAVA版第一季 10.接收普通消息3

    获取到从腾讯服务器过来的字符串,业务服务器可以拼接出来可以打印出来.后续的工作是把这个字符串封装成一个Bean对象. <xml><ToUserName><![CDATA[ ...

  2. 微信公众平台深度开发JAVA版第一季 15.响应被动消息3

    微信开发难度不大,但是逻辑关系很强. 这节课主要讲微信接口,至于在J2EE平台怎么把程序构造的更好不在这节课里面讨论. package net.wxinterface; import java.io. ...

  3. 微信公众平台深度开发JAVA版第一季 14.响应被动消息2

    好的程序是重构出来的.要recode7次. package net.wxinterface; import java.io.BufferedReader; import java.io.Buffere ...

  4. 微信公众平台深度开发JAVA版第一季 16.响应被动消息4

    回复视频消息不成功,不知道为什么.是因为视频上传不成功吗? package wx.out;import java.util.Date; import java.util.List;import wx. ...

  5. 微信公众平台深度开发JAVA版第一季 22.微信猜数字活动4

    select count(*) from huo t where t.shuzi='0' 这个SQL语句查不查询得到记录取决于两个条件:第一个是数据库里面有没有这个数字,第二个是getCountByS ...

  6. 微信公众平台深度开发JAVA版第一季 30.菜单6

    {"button":[{ "type": "click", "name": "说明001", &qu ...

  7. 微信公众平台深度开发JAVA版第一季 27.菜单3

    把字符串转化成对象. {"access_token":"zTZFxLrhM1vHAjXmq1ymk1JT8nlOKja4urFIr9PWqLYvFH9ZbWo8R6BmQ ...

  8. 视频教程-微信公众平台深度开发v2.0第3季——二维码、模板消息-微信开发

    微信公众平台深度开发v2.0第3季--二维码.模板消息 微信企业号星级会员.10多年软件从业经历,国家级软件项目负责人,主要从事软件研发.软件企业员工技能培训.已经取得计算机技术与软件资格考试(软考) ...

  9. 视频教程-微信公众平台深度开发v2.0第6季——微信WEB开发、手机WEB技术-微信开发

    微信公众平台深度开发v2.0第6季--微信WEB开发.手机WEB技术 微信企业号星级会员.10多年软件从业经历,国家级软件项目负责人,主要从事软件研发.软件企业员工技能培训.已经取得计算机技术与软件资 ...

最新文章

  1. spring boot读取yml配置集合,反射实战!
  2. python语言变量命名规则有什-以下选项中,符合Python语言变量命名规则的是_学小易找答案...
  3. 【C++】44.使用xx.so动态链接库
  4. 回溯算法 | 追忆那些年曾难倒我们的八皇后问题
  5. post提交调用的却是doget方法_Python基础教程 | Requests库的使用方法和细节
  6. 超不清视频播放器-用Python将视频转成字符
  7. Boost:求容器的最小元素和最大元素
  8. count 数字计数(bzoj 1833)
  9. C语言排序(桶排序,冒泡排序,选择排序,插入排序,快速排序)
  10. 钱准备好了吗?中国移动将在10月公布5G套餐资费
  11. java poi jar包下载_poi.jar包下载
  12. 【Windows】win10电脑Miracast投屏到电视
  13. 机器学习系列2---经验风险最小化原则和结构风险最小化原则与VC维问题
  14. 计算机论文指导记录怎么写,毕业论文指导记录怎么写
  15. 数学与计算机的微妙关系
  16. frp:开源内网穿透工具
  17. jks文件转换keystore
  18. 计算机tpm1.2怎么启动,tpm2.0开启的方法
  19. html 5 时代来了 视频播放还用falsh 还要找播放器 你out 了
  20. 推动“海纳众创”,打造“漫天繁星”:中国联通视频彩铃全国创意创新大赛开赛仪式顺利举行!

热门文章

  1. 三菱Q系列plc,11轴标准程序,包含轴回零,相对定位,绝对定位,程序有两轴直线插补
  2. 单片机编程思想指导【绝对值得仔细看】
  3. 高速缓存cache详解
  4. android 9.0 10.0拦截所有陌生来电防骚扰功能
  5. 小东吖 之 java 运算符
  6. # 【深基3.例7】肥胖问题
  7. eclipse快捷键大全,让敲代码更快一点
  8. MathType6.9最新版本嵌入关联Word表格教程
  9. 通用定时器输入捕获实验
  10. 前台界面显示图片问题