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微信公众号开发系列——入门的主要内容,如果未能解决你的问题,请参考以下文章

.net微信公众号开发——快速入门

微信公众号开发入门教程第一篇

微信公众号开发java框架:wx4j(入门篇)

《C#微信开发系列-自定义菜单管理》

带领技术小白入门——基于java的微信公众号开发(包括服务器配置java web项目搭建tomcat手动发布web项目微信开发所需的url和token验证)

公众号开发 vue项目 微信授权一直不通过