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

微信企业号开发六:回调模式之消息回复

2015-12-16 14:03 721 查看
回调模式的消息回复,可以在Post中使用输出流直接输出,输出的内容为加密的XML格式



也就是说只要会了消息加密就可以完成消息回复,微信工具类还是去http://qydev.weixin.qq.com/wiki/index.php?title=加解密库下载与返回码 官网下载,使用WXBizMsgCrypt类中的EncryptMsg进行加密

---------------------------------------------------------------------------------------------------------------

---------------------------------------------------------------------------------------------------------------
解密正文,得到的正文为XML形式

// 微信加密签名
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
//使用输入流获得正文
ServletInputStream in = request.getInputStream();
BufferedReader reader =new BufferedReader(new InputStreamReader(in));
String sReqData="";
String itemStr="";//作为输出字符串的临时串,用于判断是否读取完毕
while(null!=(itemStr=reader.readLine())){
<span style="white-space:pre">	</span>sReqData+=itemStr;
}
String sEncodingAESKey = MessageUtil.RESP_MESSAGE_ENCODINGAESKEY;//回调配置的AESKey
//对消息进行处理获得明文
WXBizMsgCrypt wxcpt = new WXBizMsgCrypt(sToken, sEncodingAESKey, sCorpID);
String sMsg = wxcpt.DecryptMsg(sReqMsgSig, sReqTimeStamp, sReqNonce, sReqData);
//输出解密后的文件
//System.out.println("after decrypt msg: " + sMsg);


---------------------------------------------------------------------------------------------------------------

---------------------------------------------------------------------------------------------------------------
加密正文,对XML形式的正文进行加密

String sRespData=MessageUtil.messageToXml(txtMsg);

String sEncryptMsg = wxcpt.EncryptMsg(sRespData, time, sReqNonce);

/**
* 扩展xstream使其支持CDATA
*/
private static XStream xstream = new XStream(new XppDriver() {
public HierarchicalStreamWriter createWriter(Writer out) {
return new PrettyPrintWriter(out) {
// 对所有xml节点的转换都增加CDATA标记
boolean cdata = true;

@SuppressWarnings("unchecked")
public void startNode(String name, Class clazz) {
super.startNode(name, clazz);
}

protected void writeText(QuickWriter writer, String text) {
if (cdata) {
writer.write("<![CDATA[");
writer.write(text);
writer.write("]]>");
} else {
writer.write(text);
}
}
};
}
});

/**
* 文本消息对象转换成xml
*
* @param textMessage 文本消息对象
* @return xml
*/
public static String messageToXml(TextMessage textMessage) {
xstream.alias("xml", textMessage.getClass());
return xstream.toXML(textMessage);
}


-------------------------------------------------实体类--------------------------------------------------------

package com.haiyisoft.entity.wx.resp;

/**
* 文本消息
*/
public class TextMessage extends RespBaseMessage {
// 回复的消息内容,长度不超过2048字节,否则微信服务器会放弃响应
private String Content;

public String getContent() {
return Content;
}

public void setContent(String content) {
Content = content;
}
}


package com.haiyisoft.entity.wx.resp;

/**
* 消息基类
*/
public class RespBaseMessage {
// 接收方帐号(收到的OpenID)
private String ToUserName;
// 开发者微信号
private String FromUserName;
// 消息创建时间 (整型)
private long CreateTime;
// 消息类型
private String MsgType;

public String getToUserName() {
return ToUserName;
}

public void setToUserName(String toUserName) {
ToUserName = toUserName;
}

public String getFromUserName() {
return FromUserName;
}

public void setFromUserName(String fromUserName) {
FromUserName = fromUserName;
}

public long getCreateTime() {
return CreateTime;
}

public void setCreateTime(long createTime) {
CreateTime = createTime;
}

public String getMsgType() {
return MsgType;
}

public void setMsgType(String msgType) {
MsgType = msgType;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: