微信开发之消息接收与回复--weixin-java-tools

一、前言

  在上一篇文章《微信开发之如何使用开发工具--weixin-java-tools》中我给各位介绍了weixin-java-tools,并且介绍了如何使用weixin-java-tools接入我们微信开发者模式,本次就针对这个工具给大家介绍消息的接收与回复

二、消息接收与回复

  先来说说接收消息, 当普通微信用户向公众账号发消息时,微信服务器会先接收到用户发送的消息,然后将用户消息按照指定的XML格式组装好数据,最后POST消息的XML数据包到开发者填写的URL上。

  接收到的普通消息的消息类型目前有以下几种:

  1 文本消息
  2 图片消息
  3 语音消息
  4 视频消息
  5 小视频消息
  6 地理位置消息
  7 链接消息

  每一种消息类型都有其指定的XML数据格式,这7种消息的xml格式请到官方文档查看,有具体的格式定义和属性说明。格式很简单,基本共有属性包括ToUserName、FromUserName、CreateTime、MsgType、MsgId,并且每种类型有自己特殊的属性。

  接收消息的过程其实就是获取post请求的这个xml,然后对这个xml进行分析的过程。post请求的入口还是之前提到的微信公众号接入的那个地址,整个公众号的所有请求都会走这个入口,只是接入时是get请求,其它情况下是post请求。 

  weixin-java-tools提供了消息的处理类  WxMpXmlMessage  如下是该类的使用

//获取消息流
	WxMpXmlMessage message=WxMpXmlMessage.fromXml(request.getInputStream());

     //我们可以根据WxMpXmlMessage类中的属性 获取xml中的信息  

     //例如:
      //消息类型
    String messageType=message.getMsgType();   //消息类型
      //发送者帐号
    String fromUser=message.getFromUserName();
      //开发者微信号
    String touser=message.getToUserName();
      //文本消息  文本内容
    String content=message.getContent();

  

  下面我基于这样一个业务场景来演示构造回复的消息,接收到文本消息"文本",回复文本消息;接收到“图片”,回复图片消息;接收到“音乐”,回复音乐消息;下面具体说明各几种消息的构造,注意weixin-java-tools的使用

  

public void doService(WxMpXmlMessage message,HttpServletResponse response){

		//配置微信参数  获取wxService
		WxMpService wxService=new WxMpServiceImpl();
		//微信配置参数
		WxMpInMemoryConfigStorage wxConfigProvider=new WxMpInMemoryConfigStorage();
		wxConfigProvider.setAppId("wx60a8f1c3a95b0b9c");
		wxConfigProvider.setSecret("5b0e8613b538da5ac4bbc610998f10ba");
		wxService.setWxMpConfigStorage(wxConfigProvider);

		//消息处理
		String messageType=message.getMsgType();   //消息类型
		String fromUser=message.getFromUserName();
		String touser=message.getToUserName();
		String content=message.getContent();
		//文本消息
		if(content.equals("文本")){
			System.out.println("文本消息========");
			//创建消息文本
			WxMpXmlOutTextMessage text=WxMpXmlOutTextMessage.TEXT().toUser(fromUser).fromUser(touser).content("我是文本消息").build();

			String xml=text.toXml();
			System.out.println("xml:"+xml);

			PrintWriter out=null;
			try {
				out = response.getWriter();
				out.print(xml);
			} catch (IOException e) {
				out.close();
				out=null;
				e.printStackTrace();
			}
			out.close();
			out=null;
		}

		//图片消息
		if(content.equals("图片")){

			System.out.println("图片消息==============");

			//创建file对象
			File file=new File("C:\\Users\\Zhangsy\\Desktop\\二维码.jpg");

			WxMediaUploadResult result=null;
			try {
				result=wxService.mediaUpload(WxConsts.MEDIA_IMAGE, file);
			} catch (WxErrorException e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
			}

			if(result!=null){
				String mediaId=result.getMediaId();

				WxMpXmlOutImageMessage image=WxMpXmlOutImageMessage.IMAGE().toUser(fromUser).fromUser(touser).mediaId(mediaId).build();

				String xml=image.toXml();
				System.out.println("xml:"+xml);

				PrintWriter out=null;
				try {
					out = response.getWriter();
					out.print(xml);
				} catch (IOException e) {
					out.close();
					out=null;
					e.printStackTrace();
				}
				out.close();
				out=null;

			}

		}

		if(content.equals("音乐")){

			System.out.println("音乐消息==============");
			//上传素材  获取mediaid

			//创建file对象
			File file=new File("F:\\Music\\music.mp3");

			WxMediaUploadResult result=null;
			try {
				result=wxService.mediaUpload(WxConsts.MEDIA_VOICE, file);
			} catch (WxErrorException e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
			}

			if(result!=null){
				String mediaId=result.getMediaId();
				WxMpXmlOutMusicMessage music=WxMpXmlOutMusicMessage.MUSIC().toUser(fromUser).fromUser(touser).title("Hello小姐.mp3").description("Hello小姐").musicUrl("http://weixindemo123.ngrok.cc/weixin/media/music.mp3").hqMusicUrl("http://weixindemo123.ngrok.cc/weixin/media/music.mp3").thumbMediaId(mediaId).build();

				String xml=music.toXml();
				System.out.println("xml:"+xml);

				PrintWriter out=null;
				try {
					out = response.getWriter();
					out.print(xml);
				} catch (IOException e) {
					out.close();
					out=null;
					e.printStackTrace();
				}
				out.close();
				out=null;

			}

		}

	}

  

构造文本消息方法:

WxMpXmlOutTextMessage text=WxMpXmlOutTextMessage.TEXT().toUser(fromUser).fromUser(touser).content("我是文本消息").build();
String xml=text.toXml();

  构造图片消息:

WxMpXmlOutImageMessage image=WxMpXmlOutImageMessage.IMAGE().toUser(fromUser).fromUser(touser).mediaId(mediaId).build();
String xml=image.toXml();

  构造音乐消息:
WxMpXmlOutMusicMessage music=WxMpXmlOutMusicMessage.MUSIC().toUser(fromUser).fromUser(touser).title("Hello小姐.mp3").description("Hello小姐").musicUrl("http://weixindemo123.ngrok.cc/weixin/media/music.mp3").hqMusicUrl("http://weixindemo123.ngrok.cc/weixin/media/music.mp3").thumbMediaId(mediaId).build();
String xml=music.toXml();

需要注意的是:  

回复消息中,除了文本消息外,其他的消息类型都属于多媒体消息,需要我们上传多媒体文件来获取mediaId,(拿音乐消息举例),我事先准备好音乐文件,如下图所示:

   

  音乐消息需要我们通过 WxMpService.mediaUpload 方法上传音乐文件(具体的上传方法,请参照上面的核心代码),并获取mediaId。另外,音乐消息构造中用到musicUrl,因此我们需要保证音乐可以正常外网访问,如下图所示:

    

三、测试

  如下是测试截图:

  以上就是关于微信公众号的普通消息的接收和回复的全部内容了,各位有没有觉得使用weixin-java-tools开发起来更轻松呢??希望本博文对大家的学习有所帮助,写得不好的地方也欢迎园友们指正,千里之行,始于足下,我们对微信开发又有了进一步的了解了。还有其他的几种消息回复,就留给各位自行实践,如有问题,欢迎各位再评论区进行评论,互相学习,谢谢大家。

时间: 2024-10-07 03:45:02

微信开发之消息接收与回复--weixin-java-tools的相关文章

微信开发之消息接收--视频消息(八)

一.消息格式 <xml> <ToUserName><![CDATA[toUser]]></ToUserName> <FromUserName><![CDATA[fromUser]]></FromUserName> <CreateTime>1357290913</CreateTime> <MsgType><![CDATA[video]]></MsgType> <

微信开发之消息接收--语音消息(七)

一.消息格式 <xml> <ToUserName><![CDATA[toUser]]></ToUserName> <FromUserName><![CDATA[fromUser]]></FromUserName> <CreateTime>1357290913</CreateTime> <MsgType><![CDATA[voice]]></MsgType> <

微信开发之消息的接收与相应--文本消息(五)

一.消息格式 <xml> <ToUserName><![CDATA[toUser]]></ToUserName> <FromUserName><![CDATA[fromUser]]></FromUserName> <CreateTime>1348831860</CreateTime> <MsgType><![CDATA[text]]></MsgType> <

微信开发(三)消息的自动回复和关注后自动回复

1.前置与微信接口对接成功后. 3.创建一个实体类消息类.里面设置的变量和属性参照微信开发者文档,https://mp.weixin.qq.com/wiki. 2.修改Servlet中dopost方法. 3.在消息操作类中增加方法,添加主菜单的方法,拼接字符串的方法,回复弹出信息的方法(1-5). 参考代码:消息操作类中的代码 1 package com.util; 2 import java.io.IOException; 3 import java.io.InputStream; 4 imp

微信开发-素材/消息管理接口

开始 本文是 微信公众号开发者模式介绍及接入 的后续,如没看过前文的话,可能看本文会有些懵逼.本文主要介绍微信公众平台的素材.消息管理接口的开发.由于个人的订阅号是没有大多数接口的权限的,所以我们需要使用微信官方提供的测试号来进行开发.测试号的申请可参考下文: 使用微信测试账号对网页进行授权 图文消息 本小节我们来开发回复图文消息的功能,官方文档地址如下: https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140543 回复图文

夺命雷公狗---微信开发06----接收并被动回复语音消息

这一章,主要实现的功能是发送一段语言给微信公众号,公众号并且回复该语音 index.php的代码如下: <?php /** * wechat php test */ //define your token require_once "common.php"; define("TOKEN", "twgdh"); $wechatObj = new wechatCallbackapiTest(); //当接入成功后,请注销这句话,否则,会反复验证

微信开发之消息的接收与相应--消息交互基础(四)

一.消息交互流程 1.用户通过微信客户端向公众号发送消息,消息首先会被微信服务器接收到 2.微信服务器接收到消息后,会根据开发者在接口配置信息中填写的URL,将消息通过HTTP POST发送到公众号服务器 3.公众号服务器接收到消息后,会根据相应的逻辑进行处理 4.处理完成后,公众号服务器会将处理结果发送到微信服务器, 5.微信服务器将公众号服务器返回的消息通过公众账号发送给用户 二.消息的分类 1.请求消息  请求消息是指用户发送给公众号的消息,包括文本消息,图片消息,语音消息,视频消息,地理

夺命雷公狗---微信开发04----接收信息并回复

index.php的代码如下 <?php /** * wechat php test */ //define your token require_once "common.php"; define("TOKEN", "twgdh"); $wechatObj = new wechatCallbackapiTest(); //当接入成功后,请注销这句话,否则,会反复验证. //$wechatObj->valid(); //添加响应请求的

微信开发之消息推送

//以文本的形式把编辑的消息发送给微信企业号中的某一个应用组 //定义数据模型 public class Access_token { public Access_token() { // // TODO: 在此处添加构造函数逻辑 // } string _access_token; string _expires_in; /// <summary> /// 获取到的凭证 /// </summary> public string access_token { get { retur