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
相关文章推荐
- 【java开发系列】—— spring简单入门示例
- 【java开发系列】—— struts2简单入门示例
- 【java开发系列】—— spring简单入门示例
- java微信公众号开发入门(2)--微信官方到本地校验
- 【java开发系列】—— struts2简单入门示例
- 【java开发系列】—— spring简单入门示例
- 微信公众号开发系列之发送红包-java版本
- 【java开发系列】—— spring简单入门示例
- Java版SLG游戏开发入门[1]--关于本系列
- 【java开发系列】—— spring简单入门示例
- 【java开发系列】—— struts2简单入门示例
- 【java开发系列】—— struts2简单入门示例
- 【JAVA零基础入门系列】Day1 开发环境搭建
- 【java开发系列】—— spring简单入门示例
- 【java开发系列】—— struts2简单入门示例
- 【java开发系列】—— struts2简单入门示例
- 【java开发系列】—— struts2简单入门示例
- 【java开发系列】—— struts2简单入门示例
- 【java开发系列】—— struts2简单入门示例