java微信公众号开发系列——入门
Posted wj沧浪之水
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java微信公众号开发系列——入门相关的知识,希望对你有一定的参考价值。
一、公众介绍
1.1、公众号介绍、申请及后台设置详解
1.1.1、微信与公众号区别
微信:个人娱乐,大多数是认识的人的社交圈,主要在手机端使用,可以互相关注 公众号:商业用途,陌生的社交圈,需要在PC端的微信管理后台操作,只能被用户关注
1.1.2、公众号类型
三种类型的大致区别:订阅号:面向个人,每天群发1条,扫码即可关注,不支持高级接口(微信支付)
服务号:面向企业和政府,每个月4条,扫码即可关注,支持高级接口
企业号:面向企业政府,每分钟200条,通讯录成员才可关注,支持高级接口
1.1.3、公众号申请
微信公众平台:https://mp.weixin.qq.com/
申请流程:
1. 注册邮箱(未注册过)
2.邮件激活
3.类型选择(个人选择订阅号)
4. 验证身份证信息(绑定一个已绑定自己的银行卡的微信号)
5.信息填写(账号名称,功能介绍)
微信公众平台介绍:
1、功能模块:
群发功能:
5种消息类型:文字,图片,图文,语音,视频。除文字消息外,其他消息需要在素材管理中编辑
自动回复:
被添加自动回复:用户第一次关注时回复给用户
关键词自动回复:如用户回复1或2自动回复
自定义菜单:
投票管理:
2、管理模块:
消息管理:查看所有用户发送的消息,可进行快捷回复
用户管理:
素材管理:
3、推广模块:需要认证
4、统计模块:
5、设置:
6、开发者中心:
1.2、编辑模式下的消息回复、菜单建立、素材管理等
1.2.1、编辑模式实现自动回复:
被添加自动回复:
关键词自动回复:
1.2.2、编辑模式素材管理:
对图片,图文,视频,语音消息的编辑保存。
以图文消息为例:图文消息包括单图文消息和多图文消息:
最多只能8条消息
可以预览
1.2.3、编辑模式自定义菜单:
两种类型菜单:
click类型:发送一条消息
view类型:类似超链接,跳转到网页
找到自定义菜单选项:
创建菜单
预览,发布后24小时之内对所有用户有效
1.2.4、编辑模式推送消息
群发消息:一般都是群发给所有用户,如果想按组来发送,可在用户管理处对用户进行分组。
1.3、开发前的环境搭建及工具准备
1、微信公众号 2、外网映射工具(开发调试)与微信对接的URL要具备以下条件 1. 公网能访问的IP 2. 对口只支持80端口 工具介绍:花生壳、ngrok ngrok可以将内网映射到公网上,这样在公网上可以访问本地的服务。
使用ngrok:
1. 下载ngrok: http://pan.baidu.com/s/1pLTLRrt(有的地方下的版本不对,执行下面的命令不成功)
2. 进入ngrok安装文件所在的目录执行:ngrok -config ngrok.cfg -subdomain lyl 8080,之后出现如下图说明配置成功。
3. 实际使用过程中需要dos窗口持续打开
1.4、开发者模式的切换、设置及消息的接收与响应
1.4.1. 开发模式与编辑模式的关系
1.4.2. 数据交互原理
1.4.3、开发模式接入
1、java新建一个项目用作微信的后台服务 1.1 写一个servlet用作接收微信的参数,并且条用验证参数工具类 @Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
String signature = req.getParameter("signature");
String timestamp = req.getParameter("timestamp");
String nonce = req.getParameter("nonce");
String echostr = req.getParameter("echostr");
// 1、如果校验成功,返回随机数
PrintWriter pw = resp.getWriter();
if (ValidateUtil.checkSignature(signature, timestamp, nonce))
pw.print(echostr);
1.2 检验参数方法
public static boolean checkSignature(String signature, String timestamp, String nonce)
String[] arr = new String[] Constants.Constant.TOKEN.getDesc(), timestamp, nonce ;
// 1、排序
Arrays.sort(arr);
// 2、生成字符串
StringBuffer content = new StringBuffer();
for (int i = 0; i < arr.length; i++)
content.append(arr[i]);
// 3、sha1加密
String tempStr = EncryUtil.encrySha1(content.toString());
// 4、与传过来的签名signature比对,并返回比对结果
return tempStr.equals(signature);
1.3 web.xml文件中配置项目访问路径
<servlet>
<servlet-name>WeChatServlet</servlet-name>
<servlet-class>com.lyl.wechat.servlet.WeChatServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>WeChatServlet</servlet-name>
<url-pattern>/wx.do</url-pattern>
</servlet-mapping>
使用ngrok映射后的访问地址为:http://lyl.tunnel.qydev.com/WeChatDemo/wx.do
2、在微信公众号后台进行基本配置
2.1 配置URL和token
3、开发模式下消息的响应和接收
3.1 微信发送和接收消息的格式都数xml格式,所以首先需要一个工具类,进行数据之间的转换
/**
*
* @description xml格式数据转为map格式
* @param req
* @return
* @author liuyunlong
* @time 2016年11月8日下午9:07:03
* @return Map<String,String>
* @throws Exception
*/
public static Map<String, String> xml2Map(HttpServletRequest req) throws Exception
Map<String, String> map = new HashMap<String, String>();
SAXReader reader = new SAXReader();
InputStream inputStream = req.getInputStream();
// 获取文档
Document document = reader.read(inputStream);
// 获取根目录,并保存在list中
Element root = document.getRootElement();
@SuppressWarnings("unchecked")
List<Element> elements = root.elements();
// 遍历所有目录并保持在集合中
for (Element element : elements)
map.put(element.getName(), element.getText());
inputStream.close();
return map;
/**
* 将文本消息对象转为xml
* @description
* @param textMessage
* @author liuyunlong
* @time 2016年11月9日上午9:15:54
* @return void
*/
public static String object2xml(TextMessage textMessage)
XStream stream = new XStream();
// XStream对象将bean对象转成xml格式,默认根节为包名,需要 将xml的根节点替换成xml,否则微信后台无法解析
stream.alias("xml", textMessage.getClass());
return stream.toXML(textMessage);
3.2 然后在post方法中接收消息和响应消息
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
req.setCharacterEncoding("UTF-8");
resp.setCharacterEncoding("UTF-8");
PrintWriter pw = resp.getWriter();
try
// 文本消息的接收到map对象中
Map<String, String> map = DataTransUtil.xml2Map(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 ("text".equals(msgType))
TextMessage text = new TextMessage();
text.setFromUserName(toUserName);
text.setToUserName(fromUserName);
text.setMsgType("text");
text.setCreateTime(new Date().getTime());
text.setContent("您发送的消息是:" + content);
// 将对象转为xml格式的数据
message = DataTransUtil.object2xml(text);
System.out.println(message);
pw.print(message);
catch (Exception e)
e.printStackTrace();
finally
if (null != pw)
pw.close();
3.3 其他消息类型
文本消息-text
图片消息-image
语音消息-voice
视频消息-video
链接消息-link
地理位置消息-location
事件推送-event
关注公众号-subscribe 取消关注公众号-unsubscribe 菜单点击-click,view
以上是关于java微信公众号开发系列——入门的主要内容,如果未能解决你的问题,请参考以下文章
带领技术小白入门——基于java的微信公众号开发(包括服务器配置java web项目搭建tomcat手动发布web项目微信开发所需的url和token验证)