您的位置:首页 > 移动开发 > 微信开发

java微信公众号开发系列——入门

2016-11-08 11:16 716 查看

一、公众介绍

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


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: