微信第三方平台--接收普通消息

	微信发送的消息如果是服务器配置则可以直接接收消息,如果是第三方授权则需要先进行解密。
	本文用的是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;
	}
	
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值