源码

GitHub地址:https://github.com/erlieStar/wechat
效果图

流程图


如果不需要定制化的服务,只是推送一些文章的时候,没必要开发自己的服务器,步骤1和步骤4就足够了

本地测试

下载ngrok,解决外网访问内网问题

LZ用的是Sunny-Ngrok
下载地址:https://www.ngrok.cc/
LZ下载的是Win 64Bit版本,看了作者写的使用博客搭建好了
http://www.sunnyos.com/article-show-71.html

这样我就把本地的地址映射为http://erlie.free.ngrok.cc
不过国人的真心卡啊,果断用了另一个https://ngrok.com/
教程地址:https://jingyan.baidu.com/article/f006222826c2bcfbd3f0c885.html

ngrok http 80

进入软件所在路径,在命令行中运行上面的命令,这样就能把一个外网地址映射为内网,只不过每次重新启动域名会变

创建测试账号

地址:https://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login

appID和appsecret以后都会用到

url填写的内容是http://erlie.free.ngrok.cc/server/system,其中/server/system是接口名字,因为是Spring Boot项目,所以不用写项目名字,token随便写,主要用于验证作用。此时点提交会显示配置失败,因为你得把本地的服务启动起来,并且让微信完成校验
这个是官方写的验证说明:
https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421135319

@Controller
@RequestMapping("server")
public class WeChatController {/** 微信公众号服务器*/private final String token = "erlie";@GetMapping(value = "system")public void doGet(HttpServletRequest request, HttpServletResponse response) {//获取参数值String signature = request.getParameter("signature");String timeStamp = request.getParameter("timestamp");String nonce = request.getParameter("nonce");String echostr = request.getParameter("echostr");PrintWriter out = null;try {out = response.getWriter();//开发者获得加密后的字符串可与signature对比,标识该请求来源于微信if (CheckUtil.checkSignature(token, timeStamp, nonce).equals(signature)) {//作出响应,即原样返回随机字符串out.println(echostr);}} catch (IOException e) {e.printStackTrace();}finally {out.close();}}}
public class CheckUtil {/** 微信校验的帮助类*/public static String checkSignature(String token, String timeStamp, String nonce) {String[] arr = new String[]{token, timeStamp, nonce};//将token、timestamp、nonce三个参数进行字典序排序Arrays.sort(arr);//生成字符串StringBuffer sb = new StringBuffer();for (int i=0;i<arr.length;i++){sb.append(arr[i]);}//将三个参数字符串拼接成一个字符串进行sha1加密String temp = getSha1(sb.toString());return temp;}public static String getSha1(String str) {if (str == null || str.length() == 0) {return null;}char hexDigite[] = {'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++] = hexDigite[byte0 >>> 4 & 0xf];buf[k++] = hexDigite[byte0 & 0xf];}return new String(buf);}catch (Exception e){return null;}}
}

把本地的服务开启,点击提交就成功了

框架结构

  1. api中有3个类,AccessTokenApi(获取token),IdAndSecretApi(保存appId和appSecret),MenuApi(菜单管理,LZ只写了创建菜单的函数。查询,删除可按照自己需求写)
  2. bean中有1个类保存token
  3. controller中有1个类是和微信进行交互的接口
  4. handler中有4个类,EventTypes(事件类型),MsgTypes(消息类型),MsgHandler(消息处理器),DefaultHandler(默认的消息处理器)
  5. msg中有3中类型的类,event包中是事件类型,in是接受消息的类型,out是发送消息的类型
  6. ui封装了菜单类和各种按钮类
  7. util中3个类,CheckUtil(微信校验的类),ResponseUtil(发送get和post的类),XMLUtil(将xml转为map的帮助类)
  8. MenuManager是用ui包中的各种图形控件,组成的界面

整体思路

  • 消息类的继承关系如图,收到的消息和发送的消息都继承一个基类,方便对消息进行统一的处理
  • 收到xml文件统一转为map,在MsgHandler中根据type类型判断数据属于哪个类型,用map构造这个消息类型,即工厂模式。并且将各种消息的处理过程交给各种抽象函数,而DefaultHandler实现了对各种消息的处理
  • 消息构造完毕往微信公众平台发送xml文件,我知道的有2种处理方式,一种是利用XStream库,将java对象转为xml类型,这种每次都得new对象,比较麻烦,我没有采用这种方法,而是重写了toString()函数,这样每次发送消息,由父类调用一下toString()函数即可,如下,但是对图文消息类型不怎么友好,LZ用图文消息比较少,所以还是用了toString()函数
    @Overridepublic String toString() {String template = "<xml>\n" +"<ToUserName><![CDATA[toUser]]></ToUserName>\n" +"<FromUserName><![CDATA[fromUser]]></FromUserName>\n" +"<CreateTime>createTime</CreateTime>\n" +"<MsgType><![CDATA[msgType]]></MsgType>\n" +"<Content><![CDATA[content]]></Content>\n" +"</xml>";String xmlStr = template.replace("toUser", toUserName).replace("fromUser", fromUserName).replace("createTime", createTime).replace("msgType", msgType).replace("content", content);return xmlStr;}

数据测试

地址如下:https://mp.weixin.qq.com/debug/,可以查看返回的各种数据是否正确

参考博客

微信公众平台开发书籍推荐
[1]http://www.cnblogs.com/txw1958/p/weixin-book-dev.html

欢迎关注

喜欢本文的朋友们,欢迎关注公众号Java识堂,收看更多精彩内容

Java开发微信公众号后台相关推荐

  1. Java开发微信公众号(二)---开启开发者模式,接入微信公众平台开发

    接入微信公众平台开发,开发者需要按照如下步骤完成: 1.填写服务器配置 2.验证服务器地址的有效性 3.依据接口文档实现业务逻辑 资料准备: 1.一个可以访问的外网,即80的访问端口,因为微信公众号接 ...

  2. Java开发微信公众号(四)---微信服务器post消息体的接收及消息的处理

    在前几节文章中我们讲述了微信公众号环境的搭建.如何接入微信公众平台.以及微信服务器请求消息,响应消息,事件消息以及工具处理类的封装:接下来我们重点说一下-微信服务器post消息体的接收及消息的处理,这 ...

  3. Java开发微信公众号之被动回复用户消息-回复图片消息

    一.前言 hello小伙伴们,大家好,做微信开发两年了,最近看到微信方面的文章阅读量和关注量上升的比较快速,激发了我满满的动力啊,所以就滋生了一个想法,从头开始整理一下微信公众号开发,写一个简易的教程 ...

  4. python开发微信公众号开发教程百度云_Python开发微信公众号后台(系列一)

    Python 开发微信公众号后台(系列一) 專 欄段晓晨,写过一点爬虫,写过几篇文章.能力虽 有限,会尽量把想说的东西讲清楚. 知乎 ID :段小草 知乎专栏:小段同学的杂记, https://zhu ...

  5. Java开发微信公众号之整合weixin-java-tools框架开发微信公众号

    微信开发者接入文档 : https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421135319 微信公众平台测试账号申请: http ...

  6. java开发微信公众号接受并回复消息[工程代码+图片全解]

    写这篇博客时犹豫了好久,因为步骤太多了,上班了也没时间,但是我依然记得当时实现公众号自动回复时的场景,找个案例好 难,也没有一个完整的案例,想了想还是写出来吧,希望能让实现这功能的人少走弯路. 微信公 ...

  7. java开发微信公众号支付

    这篇文章主要给大家结合微信支付接口开发的实践,从获取用户授权到各主要接口的使用方法等方面介绍微信支付的关键点技术,有需要的小伙伴可以参考下 最近做了微信公众号支付的开发,由于是第一次做也摸索了几天的时 ...

  8. Python开发微信公众号后台(系列三)

    原文链接:点击打开链接 摘要: 之前有主流的小黄鸡机器人,但是没找到官方的网页版.(小黄鸡提供付费 API )尝试使用http://www.niurenqushi.com/app/simsimi/(虽 ...

  9. java开发微信公众号:微信公众号对接

    一.填写服务器配置信息的介绍 登录微信公众平台官网后,进入到公众平台后台管理页面. 选择 公众号基本设置->基本配置 ,点击"修改配置"按钮,填写服务器地址(URL).Tok ...

  10. java开发微信公众号(SpringMVC)2-消息管理功能

    微信移动端软件,可以向公众号发送消息,如文字,语音,图片等等,在这个过程中,微信端服务器首先要接受到你发送的消息,然后根据你发送的消息会产生不同的回应. 这个回应要想自己设定内容(微信公众号管理界面可 ...

最新文章

  1. Php使用selenium爬虫,selenium,python爬虫_使用selenium爬取网站时输出结果不正确,selenium,python爬虫 - phpStudy...
  2. HTTP Continuation or non-HTTP traffic
  3. 【Python】青少年蓝桥杯_每日一题_12.27_输出回文数
  4. 2020年“1024”,程序员日
  5. 纯CSS实现React Logo图形,内含详细解析
  6. linux的xampp单独启动mysql,linux的xampp重要的文件和目录
  7. FCC新主席发推特称赞亚马逊,但被质疑违反了联邦道德准则
  8. 6折入股蚂蚁金服?巨人网络如此回应
  9. cmake and cmake-gui读的环境变量不一致
  10. Ubuntu学习日记--Lesson10:gcc、make、makefile、cmake、cmakelists区别
  11. python下载快手视频教程_[小玩意] 用Python写了个下载快手视频的小脚本
  12. 凤凰os 停在android,电脑的安卓系统,凤凰OS:有亮点但还很粗糙的系统
  13. 彻底弄懂typedef struct和struct定义结构体的区别
  14. 服务器pbs傻瓜操作
  15. mysql5.6.39免安装,win7 64位配置mysql 5.6免安装版,初始化配置和Mysql创建新用户方
  16. Cannot forward after response has been committe
  17. 中国巡游帆船行业市场供需与战略研究报告
  18. 数组传参(一维数组、二维数组)
  19. call(zoom)_如何解决您的Zoom Call问题
  20. 关于知乎搜索页面x-zes-96解密思路方法

热门文章

  1. 随机过程通过线性系统matlab,随机信号分析实验:随机过程通过线性系统的分析.doc...
  2. 未来教育软件计算机二级不能评分怎么办,为什么计算机二级软件打不开
  3. OneNET协议之LWM2M+CoAP
  4. 百战程序员 全栈软件测试课程 2022 笔记
  5. 中兴笔试c语言,中兴c语言笔试题
  6. c语言笔试题 选择题,C语言笔试选择题
  7. 训练猫咪,一本书就够了
  8. 制作一个简单HTML个人网页网页(HTML+CSS)大话西游之大圣娶亲电影网页设计
  9. ad软件画pcb方法总结_PCB各层介绍及AD软件画PCB时的规则
  10. 全开源-微信小程序(附开源地址)