详见LAO BI慕课网视频

使用servlet + tomcat 开发

准备外网映射

使用ngrok软件,作用:
让本地java web项目能够通过外网访问,方便调试

由于该软件是国外的,所以服务器不一定能访问,有一个基于国内服务器的ngrok->地址

下载解压后,通过cmd进到ngrok.exe的所在文件夹,输入

ngrok -config=ngrok.cfg -subdomain xxx 80

xxx是你自己起的名字,然后你就可以通过

xxx.tunnel.qydev.com

访问你的本地80端口

注意
1. 你的tomcat的端口不一定是80端口,比如我的是8080,那么上面的80就要改成8080
2. cmd窗口打开设置好后,如果关了映射失效

Servlet编写

服务器验证

微信服务器的验证要求(详见微信平台的开发者文档):
微信通过通过get请求传进四个参数

signature   微信加密签名,signature结合了开发者填写的token参数和请求中的timestamp参数、nonce参数。
timestamp   时间戳
nonce   随机数
echostr 随机字符串

开发者通过检验signature对请求进行校验(下面有校验方式)。若确认此次GET请求来自微信服务器,请原样返回echostr参数内容,则接入生效,成为开发者成功,否则接入失败。加密/校验流程如下:
1)将token、timestamp、nonce三个参数进行字典序排序
2)将三个参数字符串拼接成一个字符串进行sha1加密
3)开发者获得加密后的字符串可与signature对比,标识该请求来源于微信

其中 token是自定的,完成代码

Servlet里面:

public void doGet(HttpServletRequest req, HttpServletResponse response)throws ServletException, IOException {String signature = req.getParameter("signature");String timestamp = req.getParameter("timestamp");String nonce = req.getParameter("nonce");String echostr = req.getParameter("echostr");PrintWriter out = response.getWriter();if(CheckUtil.checkSignature(signature, timestamp, nonce)){out.print(echostr);}
}

CheckUtil的代码:

public class CheckUtil {private static final String token = "ggggg";public static boolean checkSignature(String signature,String timestamp,String nonce){String[] arr = new String[]{token,timestamp,nonce};Arrays.sort(arr);StringBuffer content = new StringBuffer();for (int i = 0; i < arr.length; i++) {content.append(arr[i]);}String temp = getSha1(content.toString());  return temp.equals(signature);}public static String getSha1(String str){if(str==null||str.length()==0){return null;}char hexDigits[] = {'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'};try {MessageDigest mdTemp = MessageDigest.getInstance("SHA1");mdTemp.update(str.getBytes("UTF-8"));byte[] md = mdTemp.digest();int j = md.length;char buf[] = new char[j*2];int k = 0;for (int i = 0; i < j; i++) {byte byte0 = md[i];buf[k++] = hexDigits[byte0 >>> 4 & 0xf];buf[k++] = hexDigits[byte0 & 0xf];      }return new String(buf);} catch (Exception e) {// TODO: handle exceptionreturn null;}}
}

消息回复

微信通信用的是XML,所以我们要新建一个javabean:

public class TextMessage {private String ToUserName;  private String FromUserName;    private long CreateTime;    private String MsgType;private String Content;private long MsgId;public String getToUserName() {return ToUserName;}public void setToUserName(String toUserName) {ToUserName = toUserName;}public String getFromUserName() {return FromUserName;}public void setFromUserName(String fromUserName) {FromUserName = fromUserName;}public long getCreateTime() {return CreateTime;}public void setCreateTime(long l) {CreateTime = l;}public String getMsgType() {return MsgType;}public void setMsgType(String msgType) {MsgType = msgType;}public String getContent() {return Content;}public void setContent(String content) {Content = content;}public long getMsgId() {return MsgId;}public void setMsgId(long msgId) {MsgId = msgId;}
}

xml和javabean的互相转换
MessageUtil:

public class MessageUtil {public static final String MESSAGE_TEXT = "text";public static final String MESSAGE_IMAGE = "image";public static final String MESSAGE_VOICE = "voice";public static final String MESSAGE_VIDEO = "video";public static final String MESSAGE_LINK = "link";public static final String MESSAGE_LOCATION = "location";public static final String MESSAGE_EVENT = "event";public static final String EVENT_SUB = "subscribe";public static final String EVENT_UNSUB = "unsubscribe";public static final String EVENT_CLICK = "CLICK";public static final String EVENT_VIEW = "VIEW";/*** xml转为map* @param request* @return* @throws DocumentException* @throws IOException*/public static Map<String, String> xmlToMap(HttpServletRequest request ) throws DocumentException, IOException{Map<String,String> map = new HashMap<String, String>();SAXReader reader = new SAXReader();InputStream ins = request.getInputStream();Document doc = reader.read(ins);Element root = doc.getRootElement();List<Element> list = root.elements();for (Element e : list) {map.put(e.getName(), e.getText());}ins.close();return map;}public static String textMessageToXml(TextMessage textMessage){XStream xstream = new XStream();xstream.alias("xml", textMessage.getClass());return xstream.toXML(textMessage);}public static String initText(String toUserName, String fromUserName, String content){TextMessage text = new TextMessage();text.setFromUserName(toUserName);text.setToUserName(fromUserName);text.setMsgType(MESSAGE_TEXT);text.setCreateTime(new Date().getTime());text.setContent(content);return textMessageToXml(text);}public static String menuText(){StringBuffer sb = new StringBuffer();sb.append("谢谢关注");return sb.toString();       }

注意导包

dom4j包 用来解析xml
xstream包 用来封装类
xmlpull包(如果xstream出现无法找到xmlpull类就就要导入该包)

写dopost方法:

req.setCharacterEncoding("UTF-8");response.setCharacterEncoding("UTF-8");PrintWriter out = response.getWriter();try {Map<String,String> map = MessageUtil.xmlToMap(req);String toUserName = map.get("ToUserName");String fromUserName = map.get("FromUserName");String msgType = map.get("MsgType");String content = map.get("Content");    String message = null;if(MessageUtil.MESSAGE_TEXT.equals(msgType)){String mycontent = "你回复的消息是: " + content;message = MessageUtil.initText(toUserName, fromUserName, mycontent);}else if(MessageUtil.MESSAGE_EVENT.equals(msgType)){String eventType = map.get("Event");if(MessageUtil.EVENT_SUB.equals(eventType)){String mycontent = MessageUtil.menuText();message = MessageUtil.initText(toUserName, fromUserName, mycontent);}}   out.print(message);} catch (Exception e) {// TODO: handle exceptionout.close();}   }

微信公众号java开发教程相关推荐

  1. 微信公众号Java开发-笔记02【开发接入准备、开发接入】

    学习视频网址:哔哩哔哩网站 微信公众号开发-Java版 [P01-P02]微信公众号Java开发-笔记01[微信公众号介绍.开发环境搭建] [P03-P04]微信公众号Java开发-笔记02[开发接入 ...

  2. 微信公众号Java开发-笔记01【微信公众号介绍、开发环境搭建】

    学习网址:哔哩哔哩网站 微信公众号开发-Java版 微信公众号Java开发-笔记01[微信公众号介绍.开发环境搭建] 微信公众号Java开发-笔记02[] 微信公众号Java开发-笔记03[] 微信公 ...

  3. 微信公众号java开发

    1:公众号.订阅号.服务号.企业号.应用号(小程序)是什么,区别在哪里? 简单说明下: 订阅号:缺点是不能直接显示在好友对话列表里,而是被隐藏在"订阅号"文件夹中,这样订阅号一多就 ...

  4. 微信公众号Java开发记录(二)接收、回复消息

    文章目录 一.接受消息 将xml数据包解析成Map BaseMessage TextMessage 二.回复消息 将Map转化成xml数据包 一.接受消息 用户向公众号发送的消息是通过我们的那个路径的 ...

  5. 微信公众号java开发:验证消息的确来自微信服务器

    微信公众号开发,微信服务需要认证服务,官方文档如下: 引入jar包如下: <dependency><groupId>com.github.binarywang</grou ...

  6. python公众号教学_Python微信公众号后台开发教程

    本篇文章开启Python开发微信公众号后台 准备: 云服务平台:(我用的是京东云的) 公众号:自己注册一个就行 Git:代码管理平台 了解平台 进入公众号后台,查看开发相关项 基本配置(服务器配置等) ...

  7. 微信公众号java开发沉淀(五)推送群发消息

    权限 只有认证的的订阅号 和 服务号,可以群发消息.自己申请的测试号,或者没认证的订阅号.服务号,没有权限. 样子 发出去的文字消息.图片消息等于普通消息无差,我就不多说了.发送出去的图文消息是这样子 ...

  8. 微信公众号前端开发教程,8个优秀的CSS实践

    1.ant-design的使用总结及常用组件和他们的基本用法? ant-design为React,Angular和Vue都提供了组件,同时为PC和移动端提供了常用的基础组件.ant-design提供的 ...

  9. 前端开发攻略,微信公众号前端开发教程

    毕业工作一年之后,有了转行的想法,偶然接触到程序员这方面,产生了浓厚且强烈的兴趣,开始学习前端,成功收割了大厂offer,开始了我的程序员生涯. 在自学过程中有过一些小厂的面试经历,也在一些小型的互联 ...

最新文章

  1. pythonlower函数_python中lower函数实现方法及用法讲解
  2. 安卓百度地图附近poi搜索以及到指定poi的换乘方案
  3. HSRP的初步解析及典型应用2
  4. 7的整除特征 三位一截_「每周一课」数字和除号握手言和,来攻克整除问题
  5. 在微信小程序中绘制图表(part1)
  6. ZendStudio
  7. 怎么禁止使用计算机的软件,电脑如何禁止程序运行 一键彻底禁止电脑软件运行方法...
  8. Retrofit基本使用
  9. centos 7 JDK 环境部署
  10. 京东前端:三级列表页持续架构优化
  11. sFlow的安装和使用
  12. 苹果电容笔和apple pencil区别是什么?值得入手的电容笔品牌排行榜
  13. 学习游戏服务器开发必看,C++游戏服务器开发常用工具介绍
  14. 贪心题目——圣诞老人的礼物
  15. 中移动全球通新套餐话费时长缩水
  16. Android 一些Api说明
  17. 三极管之开关电路(一)
  18. 程序员绘图工具-Plantuml
  19. C/C++ 开发 boost 库参考手册整理(2) 【学习笔记】
  20. 小狐狸横版游戏开发学习笔记(上)

热门文章

  1. 手动安装Eclipse插件
  2. 南加大计算机科学硕士费用,南加州大学计算机科学硕士排名第15(2020年TFE Times排名)...
  3. 手术导航系统重新开发2:设计IDD_CGITS_DIALOG (Dialog),.h.cpp的写入
  4. 关于 爬虫使用 urllib.urlopen 提交默认 User-Agent值
  5. 计算机学部毕业设计答疑记录,毕业论文答疑记录
  6. jenkins的404问题
  7. python画小猪_利用python画小猪佩奇
  8. 阿里云服务器在哪?阿里云服务器最新可选地域分享
  9. excel的使用技巧大全
  10. java202303java学习笔记第四十四天函数-使用规则-groud by 优化