微信企业号开发2--消息回复

1.说明:

普通消息是指成员向企业号应用发送的消息,包括文本、图片、语音、视频、地理位置等类型。普通消息会推送到每个应用在管理端设置的URL(以下假设该URL为http://api.3dept.com)。

  • 请求说明

Http请求方式: POST

http://api.3dept.com/?msg_signature=ASDFQWEXZCVAQFASDFASDFSS&timestamp=13500001234&nonce=123412323

文本类消息的参数列表,其他的见官方文档

参数说明
ToUserName企业号CorpID
FromUserName成员UserID
CreateTime消息创建时间(整型)
MsgType消息类型,此时固定为:text
Content文本消息内容
MsgId消息id,64位整型
AgentID企业应用的id,整型。可在应用的设置页面查看

2.步骤:

1)使用输入流获得正文,对消息进行处理和解密获得明文,得到如下xml的字符串

text消息

<xml>
   <ToUserName><![CDATA[toUser]]></ToUserName>
   <FromUserName><![CDATA[fromUser]]></FromUserName> 
   <CreateTime>1348831860</CreateTime>
   <MsgType><![CDATA[text]]></MsgType>
   <Content><![CDATA[this is a test]]></Content>
   <MsgId>1234567890123456</MsgId>
   <AgentID>1</AgentID>

</xml>


2)解析得到的xmlStr,得到一个hashmap,判断消息类型,返回相应的文本信息

3)将想要反馈的文本信息转成xmlStr,将该字符串写入response

3.相应代码

1)接受请求的servlet

/**
     * 解析post提交的数据,并转交给处理程序
     */
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
    	request.setCharacterEncoding("UTF-8");
    	response.setCharacterEncoding("UTF-8");
    	String respStr=CoreService.processRequest(request);
    				response.getWriter().print(respStr);
    }
2)处理类CoreService

package com.baosight.wechat.service;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Date;
import java.util.Map;

import javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServletRequest;

import com.baosight.wechat.message.resp.TextMessage;
import com.baosight.wechat.message.util.MessageUtil;
import com.qq.weixin.mp.aes.WXBizMsgCrypt;

public class CoreService {

	public static String processRequest(HttpServletRequest request) {
		String sEncryptMsg = null;
		try {
			String respContent = "请求处理异常,请稍后尝试!";

			// 解密postDate
			// 微信加密签名
			
			// 使用输入流获得正文
			ServletInputStream in = request.getInputStream();
			BufferedReader reader = new BufferedReader(
					new InputStreamReader(in));
			String sReqData = "";
			String itemStr = "";// 作为输出字符串的临时串,用于判断是否读取完毕
			while (null != (itemStr = reader.readLine())) {
				sReqData += itemStr;
			}
			// 对消息进行处理获得明文
			WXBizMsgCrypt wxcpt;
			String sMsg = null;
			String sReqMsgSig = request.getParameter("msg_signature");
			// 时间戳
			String sReqTimeStamp = request.getParameter("timestamp");
			// 随机数
			String sReqNonce = request.getParameter("nonce");
			String sToken = MessageUtil.RESP_MESSAGE_TOKEN;// 回调配置的TOKEN
			String sCorpID = MessageUtil.RESP_MESSAGE_CORPID;// 回调提供的sCorpID
			String sEncodingAESKey = MessageUtil.RESP_MESSAGE_ENCODINGAESKEY;// 回调配置的AESKey
			wxcpt = new WXBizMsgCrypt(sToken, sEncodingAESKey, sCorpID);
			sMsg = wxcpt.DecryptMsg(sReqMsgSig, sReqTimeStamp, sReqNonce,
					sReqData);
			// 输出解密后的文件
			System.out.println("******************after decrypt msg: " + sMsg);

			// 回复消息

			Map<String, String> requestMap = MessageUtil.parseXml(sMsg);
			String fromUserName = requestMap.get("FromUserName");
			String toUserName = requestMap.get("ToUserName");
			String msgType = requestMap.get("MsgType");
			System.out.println("fromUserName:" + fromUserName + "--toUserName:"
					+ toUserName + "--msgType" + msgType);
			// 回复文本消息
			TextMessage textMessage = new TextMessage();

			textMessage.setToUserName(fromUserName);
			textMessage.setFromUserName(toUserName);
			textMessage.setCreateTime(new Date().getTime());
			textMessage.setMsgType(MessageUtil.RESP_MESSAGE_TYPE_TEXT);
			textMessage.setFuncFlag(0);

			if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_TEXT)) {
				respContent = "您发送的是文本消息";
			} else if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_IMAGE)) {
				respContent = "您发送的是图片消息";
			} else if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_LOCATION)) {
				respContent = "您发送的是地理位置消息";
			} else if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_LINK)) {
				respContent = "您发送的是链接消息";
			} else if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_VOICE)) {
				respContent = "您发送的是音频消息";
			} else if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_EVENT)) {
				// 触发事件
				String eventType = requestMap.get("Event");
				if (eventType.equals(MessageUtil.EVENT_TYPE_SUBSCRIBE)) {
					respContent = "谢谢您的关注!";
				} else if (eventType.equals(MessageUtil.EVENT_TYPE_UNSUBSCRIBE)) {
					// 取消关注
				} else if (eventType.equals(MessageUtil.EVENT_TYPE_CLICK)) {
					// 自定义菜单
				}
			}
			textMessage.setContent(respContent);
			String sRespData = MessageUtil.textMessageToXml(textMessage);
			System.out.println(sRespData);
			sEncryptMsg = wxcpt.EncryptMsg(sRespData,
					Long.toString(new Date().getTime()), sReqNonce);
			return sEncryptMsg;
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return sEncryptMsg;
	}
}
3)将xml转成相应的hashmap

 public static Map<String, String> parseXml(String xmlStr) throws Exception {
    	// 将解析结果存储在HashMap中
    	Map<String, String> map = new HashMap<String, String>();

    	// 从request中取得输入流
    	InputStream inputStream=new ByteArrayInputStream(xmlStr.getBytes());
//    	InputStream inputStream = xmlStr.getInputStream();
    	// 读取输入流
    	SAXReader reader = new SAXReader();
    	Document document = reader.read(inputStream);
    	// 得到xml根元素
    	Element root = document.getRootElement();
    	// 得到根元素的所有子节点
    	List<Element> elementList = root.elements();

    	// 遍历所有子节点
    	for (Element e : elementList)
    		map.put(e.getName(), e.getText());

    	// 释放资源
    	inputStream.close();
    	inputStream = null;

    	return map;
    }
4)加密解密相应方法查看微信官方提供的源码





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值