微信发送的消息如果是服务器配置则可以直接接收消息,如果是第三方授权则需要先进行解密。
本文用的是spring boot开发。
注意:回复的消息要5s中以内返回给微信,否则会返回错误给公众号。
微信上消息与事件接收的url要求配置/
A
P
P
I
D
APPID
APPID/所以映射的时候也需要加上/{appid}/
@ApiOperation(value = "接收行为消息")
@RequestMapping(value = "/{appid}/updCustmEvent")
public String updCustmEventWeiChat(HttpServletRequest request) throws IOException {
String nonce = request.getParameter("nonce");
String timestamp = request.getParameter("timestamp");
String msgSignature = request.getParameter("msg_signature");
String encryptType = request.getParameter("encrypt_type");
String signature = request.getParameter("signature");
String postData;
postData = StreamUtils.getInputStreamJson(request.getInputStream());
EventDTO custmEventDTO = new EventDTO();
//消息解密
String json = eventService.decryptWeChat(nonce, timestamp, msgSignature, encryptType, signature, postData);
if(!StringUtils.isEmpty(json)) {
Document doc;
try {
doc = DocumentHelper.parseText(json);
// 解析xml
Element rootElt = doc.getRootElement();
custmEventDTO.setToUserName(rootElt.elementTextTrim("ToUserName"));
custmEventDTO.setFromUserName(rootElt.elementTextTrim("FromUserName"));
custmEventDTO.setContent(rootElt.elementTextTrim("Content"));
custmEventDTO.setCreateTime(Long.parseLong(rootElt.elementTextTrim("CreateTime")));
custmEventDTO.setEvent(rootElt.elementTextTrim("Event"));
custmEventDTO.setMsgId(rootElt.elementTextTrim("MsgId"));
custmEventDTO.setMsgType(rootElt.elementTextTrim("MsgType"));
custmEventDTO.setEventKey(rootElt.elementText("EventKey"));
String result = replyService.replyWeChat(custmEventDTO, nonce, timestamp);
return result;
} catch (DocumentException e) {
ExceptionUtils.logError(e);
}
}
String echostr = "";
return echostr;
}
@Override
public String replyWeChat(CustmEventDTO custmEventDTO, String nonce, String timestamp) {
String content = custmEventDTO.getContent();
String fromUserName = custmEventDTO.getFromUserName();
String toUserName = custmEventDTO.getToUserName();
WechatAppInfo wechatAppInfo = wechatAppInfoRepository.findByUserName(toUserName);
String accessToken = wechatService.GetWechatAccessToken(wechatAppInfo.getAppId());
String replyType = "text";
if(StringUtils.isEmpty(content) || StringUtils.isEmpty(replyType)){
return ResultUtils.build(CodeEnums.SUCCESS_CODE_NO_DATA);
}
ReplyTextMessageDTO we = new ReplyTextMessageDTO();
String xml = "";
we.setMessageType(replyType);
we.setFuncFlag("0");
we.setToUserName(fromUserName);
we.setFromUserName(toUserName);
XStream xstream = new XStream(new DomDriver());
xstream.alias("xml", ReplyTextMessageDTO.class);
we.setCreateTime(new Long(new Date().getTime()).toString());
xstream.aliasField("ToUserName", ReplyTextMessageDTO.class, "toUserName");
xstream.aliasField("FromUserName", ReplyTextMessageDTO.class, "fromUserName");
xstream.aliasField("CreateTime", ReplyTextMessageDTO.class, "createTime");
xstream.aliasField("MsgType", ReplyTextMessageDTO.class, "messageType");
xstream.aliasField("FuncFlag", ReplyTextMessageDTO.class, "funcFlag");
if(("text").equals(replyType)) { //回复文本消息
if("hhh".equals(content)) {
WechatTemplateDTO wechatTemplateDTO = new WechatTemplateDTO();
wechatTemplateDTO.setTouser(custmEventDTO.getFromUserName());
wechatTemplateDTO.setTemplateid("1Ql7pjk-khnA2tFlAsuZ2Q0U1u8OawhgM6-ir9PcAWQ");
wechatTemplateDTO.setAppId("wx1b208f0bbd201865");
List<WechatTemplateDataDTO> wechatTemplateDatas = new ArrayList<WechatTemplateDataDTO>();
WechatTemplateDataDTO wechatTemplateDataDTO = new WechatTemplateDataDTO();
wechatTemplateDataDTO.setName("first");
wechatTemplateDataDTO.setValue("1");
wechatTemplateDatas.add(wechatTemplateDataDTO);
WechatTemplateDataDTO wechatTemplateDataDTO1 = new WechatTemplateDataDTO();
wechatTemplateDataDTO1.setValue("1");
wechatTemplateDataDTO1.setName("grade1");
wechatTemplateDatas.add(wechatTemplateDataDTO1);
WechatTemplateDataDTO wechatTemplateDataDTO2 = new WechatTemplateDataDTO();
wechatTemplateDataDTO2.setValue("1");
wechatTemplateDataDTO2.setName("grade2");
wechatTemplateDatas.add(wechatTemplateDataDTO2);
WechatTemplateDataDTO wechatTemplateDataDTO3 = new WechatTemplateDataDTO();
wechatTemplateDataDTO3.setValue("1");
wechatTemplateDataDTO3.setName("time");
wechatTemplateDatas.add(wechatTemplateDataDTO3);
WechatTemplateDataDTO wechatTemplateDataDTO4 = new WechatTemplateDataDTO();
wechatTemplateDataDTO4.setValue("1");
wechatTemplateDataDTO4.setName("remark");
wechatTemplateDatas.add(wechatTemplateDataDTO4);
wechatTemplateDTO.setWechatTemplateDatas(wechatTemplateDatas);
weChatAppService.sendWechatTemplateList(wechatTemplateDTO);
}
} else if ("image".equals(replyType)) {
we.setContent(content);
we.setPicUrl("");
we.setMediaId("");
we.setMsgId(0);
xstream.aliasField("PicUrl", ReplyTextMessageDTO.class, "picUrl");
xstream.aliasField("MediaId", ReplyTextMessageDTO.class, "mediaId");
xstream.aliasField("MsgId", ReplyTextMessageDTO.class, "msgId");
} else if ("voice".equals(replyType)) {
we.setMediaId("");
we.setFormat("");
we.setMsgId(0);
xstream.aliasField("MediaId", ReplyTextMessageDTO.class, "mediaId");
xstream.aliasField("Format", ReplyTextMessageDTO.class, "format");
xstream.aliasField("MsgId", ReplyTextMessageDTO.class, "msgId");
} else if ("video".equals(replyType)) {
we.setMediaId("");
we.setThumbMediaId("");
we.setMsgId(0);
xstream.aliasField("MediaId", ReplyTextMessageDTO.class, "mediaId");
xstream.aliasField("ThumbMediaId", ReplyTextMessageDTO.class, "thumbMediaId");
xstream.aliasField("MsgId", ReplyTextMessageDTO.class, "msgId");
} else if ("shortvideo".equals(replyType)) {
we.setMediaId("");
we.setThumbMediaId("");
we.setMsgId(0);
xstream.aliasField("MediaId", ReplyTextMessageDTO.class, "mediaId");
xstream.aliasField("ThumbMediaId", ReplyTextMessageDTO.class, "thumbMediaId");
xstream.aliasField("MsgId", ReplyTextMessageDTO.class, "msgId");
} else if ("location".equals(replyType)) {
we.setLocationX("");
we.setLocationY("");
we.setScale("");
we.setLabel("");
we.setMsgId(0);
xstream.aliasField("Location_X", ReplyTextMessageDTO.class, "locationX");
xstream.aliasField("Location_Y", ReplyTextMessageDTO.class, "locationY");
xstream.aliasField("Scale", ReplyTextMessageDTO.class, "scale");
xstream.aliasField("Label", ReplyTextMessageDTO.class, "label");
xstream.aliasField("MsgId", ReplyTextMessageDTO.class, "msgId");
}else if("link".equals(replyType)) { //回复音乐消息
we.setTitle("");
we.setDescription("");
we.setUrl("");
we.setMsgId(0);
xstream.aliasField("Title", ReplyTextMessageDTO.class, "title");
xstream.aliasField("Description", ReplyTextMessageDTO.class, "description");
xstream.aliasField("Url", ReplyTextMessageDTO.class, "url");
xstream.aliasField("MsgId", ReplyTextMessageDTO.class, "msgId");
}
xml =xstream.toXML(we);
// 返回xml类型,第三方授权返回需要明文加密,不是则不需要
String ecrypt = ecryptWeChat(xml, nonce, timestamp);
return ecrypt;
}
加密:
@Override
public String ecryptWeChat(String replyMsg, String nonce, String timestamp) {
//从配置文件获取appid、token
String encodingAesKey = weChatComponentProperties.getEncodingAesKey();
String appId = weChatComponentProperties.getAppId();
String token = weChatComponentProperties.getToken();
WXBizMsgCrypt pc;
String mingwen = "";
try {
pc = new WXBizMsgCrypt(token, encodingAesKey, appId);
mingwen = pc.encryptMsg(replyMsg, timestamp, nonce);
} catch (AesException e) {
e.printStackTrace();
}
return mingwen;
}