Java微信公众号开发
现在人工智能非常火爆,很多朋友都想学,但是一般的教程都是为博硕生准备的,太难看懂了。最近发现了一个非常适合小白入门的教程,不仅通俗易懂而且还很风趣幽默。所以忍不住分享一下给大家
微信公众平台是腾讯为了让用户申请和管理微信公众账号而推出的一个web平台。微信公众账号的种类可以分为3种,并且一旦选定不可更改。按照功能的限制从小到大依次为:订阅号、服务号、企业号。个人只能注册订阅号。注册地址:https://mp.weixin.qq.com/。
开发环境的准备
- 微信公众号
- 外网映射工具(开发调试)
与微信的对接的URL应该满足以下的条件:
- 在公网上能够访问
- 只支持80端口
映射工具有很多,例如花生壳,ngrok可以将内网映射到公网上面,这样就可以使用公网访问本机的网络服务。下载链接: http://pan.baidu.com/s/1i3u26St 密码: v4e8(里面有简明的教程)。
微信公众号的数据交互原理


开发模式的接入
进入微信公众号平台之后进入开发者中心,在开发者中心中找到开发者文档,在新手指南中有接入的相关步骤。依据接入文档有以下的实现:
package org.gpf.servlet; import java.io.IOException;
import java.io.PrintWriter; import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import org.gpf.util.CheckUtil;
/**
* 接收微信服务器发送的4个参数并返回echostr
*/
public class WeixinServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException { // 接收微信服务器以Get请求发送的4个参数
String signature = request.getParameter("signature");
String timestamp = request.getParameter("timestamp");
String nonce = request.getParameter("nonce");
String echostr = request.getParameter("echostr"); PrintWriter out = response.getWriter();
if (CheckUtil.checkSignature(signature, timestamp, nonce)) {
out.print(echostr); // 校验通过,原样返回echostr参数内容
}
} public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException { doGet(request, response);
} }
校验工具类:
package org.gpf.util; import java.util.Arrays; import org.apache.commons.codec.digest.DigestUtils; /**
* 校验的工具类
*/
public class CheckUtil { private static final String token = "weixin";
public static boolean checkSignature(String signature,String timestamp,String nonce){ String[] arr = new String[] { token, timestamp, nonce }; // 排序
Arrays.sort(arr);
// 生成字符串
StringBuilder content = new StringBuilder();
for (int i = ; i < arr.length; i++) {
content.append(arr[i]);
} // sha1加密
String temp = getSHA1String(content.toString()); return temp.equals(signature); // 与微信传递过来的签名进行比较
} private static String getSHA1String(String data){
return DigestUtils.sha1Hex(data); // 使用commons codec生成sha1字符串
}
}
Servlet配置:
servlet>
<servlet-name>WeixinServlet</servlet-name>
<servlet-class>org.gpf.servlet.WeixinServlet</servlet-class>
</servlet> <servlet-mapping>
<servlet-name>WeixinServlet</servlet-name>
<url-pattern>/wx.do</url-pattern>
</servlet-mapping>
接下来通过映射工具将本地的服务器映射到公网,从公网访问Servlet。

开发模式和编辑模式是互斥的,如果启动了开发模式,则自定义菜单和自动回复将失效!
消息的接收和响应
参照文档,当普通微信用户向公众账号发消息时,微信服务器将POST消息的XML数据包到开发者填写的URL上。所以我们需要更改我们的Servlet中的doPost方法,因为微信服务器与我们的服务器之间是通过XML传递数据的,因此我们需要实现消息实体与XML之间的互相转换。可以采用第三方jar包XStream完成。
处理微信服务器与本机服务器进行交互的Servlet:
package org.gpf.servlet; import java.io.IOException;
import java.io.PrintWriter;
import java.util.Date;
import java.util.Map; import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import org.dom4j.DocumentException;
import org.gpf.po.TextMeaasge;
import org.gpf.util.CheckUtil;
import org.gpf.util.MessageUtil;
/**
* 微信消息的接收和响应
*/
public class WeixinServlet extends HttpServlet { /**
* 接收微信服务器发送的4个参数并返回echostr
*/
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException { // 接收微信服务器以Get请求发送的4个参数
String signature = request.getParameter("signature");
String timestamp = request.getParameter("timestamp");
String nonce = request.getParameter("nonce");
String echostr = request.getParameter("echostr"); PrintWriter out = response.getWriter();
if (CheckUtil.checkSignature(signature, timestamp, nonce)) {
out.print(echostr); // 校验通过,原样返回echostr参数内容
}
} /**
* 接收并处理微信客户端发送的请求
*/
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException { request.setCharacterEncoding("utf-8");
response.setContentType("text/xml;charset=utf-8");
PrintWriter out = response.getWriter();
try {
Map<String, String> map = MessageUtil.xmlToMap(request);
String toUserName = map.get("ToUserName");
String fromUserName = map.get("FromUserName");
String msgType = map.get("MsgType");
String content = map.get("Content"); String message = null;
if ("text".equals(msgType)) { // 对文本消息进行处理
TextMeaasge text = new TextMeaasge();
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);
}
out.print(message); // 将回应发送给微信服务器
} catch (DocumentException e) {
e.printStackTrace();
}finally{
out.close();
}
} }
按照微信的接口文档编写的文本消息实体类:
package org.gpf.util; import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.List;
import java.util.Map; import javax.servlet.http.HttpServletRequest; import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import org.gpf.po.TextMeaasge; import com.thoughtworks.xstream.XStream; /**
* 实现消息的格式转换(Map类型和XML的互转)
*/
public class MessageUtil { /**
* 将XML转换成Map集合
*/
public static Map<String, String>xmlToMap(HttpServletRequest request) throws IOException, DocumentException{ Map<String, String> map = new HashMap<String, String>();
SAXReader reader = new SAXReader(); // 使用dom4j解析xml
InputStream ins = request.getInputStream(); // 从request中获取输入流
Document doc = reader.read(ins); Element root = doc.getRootElement(); // 获取根元素
List<Element> list = root.elements(); // 获取所有节点 for (Element e : list) {
map.put(e.getName(), e.getText());
System.out.println(e.getName() + "--->" + e.getText());
}
ins.close();
return map;
} /**
* 将文本消息对象转换成XML
*/
public static String textMessageToXML(TextMeaasge textMessage){ XStream xstream = new XStream(); // 使用XStream将实体类的实例转换成xml格式
xstream.alias("xml", textMessage.getClass()); // 将xml的默认根节点替换成“xml”
return xstream.toXML(textMessage); } }
Java微信公众号开发的更多相关文章
- Java微信公众号开发梳理
Java微信公众号开发梳理 现在微信公众平台的开发已经越来越普遍,这次开发需要用到微信公众平台.因此做一个简单的记录,也算是给那些没踩过坑的童鞋一些启示吧.我将分几块来简单的描述一下,之后会做详细的说 ...
- Java微信公众号开发----关键字自动回复消息
在配置好开发者配置后,本人第一个想要实现的是自动回复消息的功能,说明以下几点: 1. url 仍然不变,还是开发配置里的url 2. 微信采用 xml 格式传输数据 3.微信服务器传给我们的参数主要有 ...
- Java 微信公众号开发--- 接入微信
开发微信公众号在没有正式的公众平台账号时,我们可以使用测试平台账号--- 测试平台申请地址:https://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandb ...
- Java微信公众号开发-外网映射工具配置
一.开发环境准备 1.一个微信公众号 2.外网映射工具(开发调试)如花生壳.ngrok工具 注:与微信对接的URL要具备以下条件a:在公网上能够访问 b:端口只支持80端口 这里使用ngrok.cc: ...
- 初识Java微信公众号开发
选定类型后不可更改 企业号与服务号,订阅号的区别 公众号微信注册流程: 个人就选择订阅号 外网映射 必须要使用映射工具将本地的地址映射到公网上去 介绍一个ngrok 首先下载ngork,例如保存在D盘 ...
- Java微信公众号开发----定时获取access_token并保存到redis中
本人原本是想做微信公众号菜单的创建修改删除等操作的,但是发现需要access_token,通过阅读文档,发现文档要求有以下几点: 1.access_token 获取后有效期是2小时 2.access_ ...
- java微信公众号开发token验证失败的问题及解决办法
本文引自http://m.blog.csdn.net/qq_32331997/article/details/72885424 微信公众平台服务器配置时,需要引入token,但是提交的时候总是提示to ...
- java微信公众号开发----搭建ngrok环境
下载ngrok,一个能够在公网安全访问内网Web主机的工具 下载地址:http://download.csdn.net/download/u014252425/9389847,亲测可用 下载完成后,进 ...
- 微信公众号开发(一)--验证服务器地址的Java实现
现在主流上都用php写微信公众号后台,其实作为后端语言之一的java也可以实现. 这篇文章将对验证服务器地址这一步做出实现. 参考资料:1.慕课网-<初识java微信公众号开发>,2.微信 ...
随机推荐
- Codeforces 627A XOR Equation(思路)
题目大概说两个正整数a.b,已知s=a+b以及x=a xor b的值,问有几种a.b这样的数对. 我知道异或相当于无进位的加法,s-x就是其各个位置的进位,比如s-x=1010,那就表示a和b的第1位 ...
- 【Oracle】在WIN NT 64位环境下安装win64_11gR2_database。并用PL/SQL连接
因为现在大多数服务器环境均为64位环境,而且有一部分使用的windows server的环境,在此做了一番小研究,如何在64位环境下安装oracle11g_64bit服务端 (1)首先www.orac ...
- 期待中冷静前行,专家预测2017年VR产业5大发展趋势
VR在90年代火过一阵后,在2016年迎来了爆发.今年的VR领域,除了Oculus.HTC.索尼等发布的各家硬件,还有许多VR内容争奇斗艳的迸发,但是VR会一直保存热度吗? 事实上,对于科技圈巨头而言 ...
- ios cocos2d 画线出现闪烁问题
根据http://www.merowing.info/2012/04/drawing-smooth-lines-with-cocos2d-ios-inspired-by-paper/ 用cocos2d ...
- SRM 594 DIV1 250
可能开始宿舍比较乱,思绪静不下来...想了大半个小时,终于确定了应该暴力+DP,然后写了枚举除数,和被除的版本..这样,还敲错了个字母,第一次提交还100多,修改提交还有75.多,最后想到,貌似不打对 ...
- 【BZOJ1968】【AHoi2005】COMMON约数研究
Description Input 只有一行一个整数 N(0 < N < 1000000). Output 只有一行输出,为整数M,即f(1)到f(N)的累加和. Sample Input ...
- 【noiOJ】p8211 (PS:二分浮点数的精度问题)
05:派 查看 提交 统计 提问 总时间限制: 1000ms 内存限制: 65536kB 描述 我的生日要到了!根据习俗,我需要将一些派分给大家.我有N个不同口味.不同大小的派.有F个朋友会来参加 ...
- SpringMVC视图机制详解[附带源码分析]
目录 前言 重要接口和类介绍 源码分析 编码自定义的ViewResolver 总结 参考资料 前言 SpringMVC是目前主流的Web MVC框架之一. 如果有同学对它不熟悉,那么请参考它的入门bl ...
- 深入浅出 - Android系统移植与平台开发(七)- 初识HAL
作者:唐老师,华清远见嵌入式学院讲师. 1. HAL的module与stub HAL(Hardware AbstractLayer)硬件抽象层是Google开发的Android系统里上层应用对底层硬件 ...
- PHP slim restfull框架nginx 配置
http://docs.slimframework.com/ 下载地址这个东西很不错,照到官方的例子做 <?php require 'vendor/autoload.php'; $app = n ...