909422229_微信公众号接收消息进行回复

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/a909422229/article/details/82865538

一、基于上一篇文章已经说了如何配置服务器,配置完成后给公众号发送消息会返回接收的消息内容,一个json串。

二、打开上一篇提供的项目地址,打开WechatController

代码如下:这个代码是我经过接收的消息处理过的,使用的是加密后的消息,经过解密后得到一个XML消息串。

从这里看的出来,在验证tokent的时候的链接与接收消息的链接是一致的,

验证token是GET请求,会自动在GET方法中处理token,进行验证。@GetMapping

处理消息的时候是POST,会在POST方法中处理消息。@PostMapping

package com.qh.wechat.controller;

import me.chanjar.weixin.mp.api.WxMpMessageRouter;
import me.chanjar.weixin.mp.api.WxMpService;
import me.chanjar.weixin.mp.bean.message.WxMpXmlMessage;
import me.chanjar.weixin.mp.bean.message.WxMpXmlOutMessage;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import com.alibaba.fastjson.JSONObject;
import com.qh.wechat.builder.TextBuilder;
import com.qh.wechat.service.QhChatService;
import com.qh.wechat.utils.JsonUtils;
import com.qh.wechat.utils.StringHelpers;

/**
 * @author Binary Wang(https://github.com/binarywang)
 */
@RestController
@RequestMapping("/wechat/portal")
public class WechatController {
	private final Logger logger = LoggerFactory.getLogger(this.getClass());

	@Autowired
	private WxMpService wxService;

	@Autowired
	private WxMpMessageRouter router;

	@Autowired
	private QhChatService qhChatService;

	@GetMapping(produces = "text/plain;charset=utf-8")
	public String authGet(@RequestParam(name = "signature", required = false) String signature,
			@RequestParam(name = "timestamp", required = false) String timestamp,
			@RequestParam(name = "nonce", required = false) String nonce,
			@RequestParam(name = "echostr", required = false) String echostr) {

		this.logger.info("\n接收到来自微信服务器的认证消息:[{}, {}, {}, {}]", signature, timestamp, nonce, echostr);

		if (StringUtils.isAnyBlank(signature, timestamp, nonce, echostr)) {
			throw new IllegalArgumentException("请求参数非法,请核实!");
		}

		if (this.wxService.checkSignature(timestamp, nonce, signature)) {
			return echostr;
		}

		return "非法请求";
	}

	@PostMapping(produces = "application/xml; charset=UTF-8")
	public String post(@RequestBody String requestBody, @RequestParam("signature") String signature,
			@RequestParam("timestamp") String timestamp, @RequestParam("nonce") String nonce,
			@RequestParam(name = "encrypt_type", required = false) String encType,
			@RequestParam(name = "msg_signature", required = false) String msgSignature) {
//		this.logger.info(
//				"\n接收微信请求:[signature=[{}], encType=[{}], msgSignature=[{}],"
//						+ " timestamp=[{}], nonce=[{}], requestBody=[\n{}\n] ",
//				signature, encType, msgSignature, timestamp, nonce, requestBody);

		if (!this.wxService.checkSignature(timestamp, nonce, signature)) {
			throw new IllegalArgumentException("非法请求,可能属于伪造的请求!");
		}
		String out = null;
		if (encType == null) {
			// 明文传输的消息
			WxMpXmlMessage inMessage = WxMpXmlMessage.fromXml(requestBody);
			WxMpXmlOutMessage outMessage = this.route(inMessage);
			if (outMessage == null) {
				return "";
			}

			out = outMessage.toXml();
		} else if ("aes".equals(encType)) {
			this.logger.info("--------------------aes加密的消息");
			// aes加密的消息
			WxMpXmlMessage inMessage = WxMpXmlMessage.fromEncryptedXml(requestBody,
					this.wxService.getWxMpConfigStorage(), timestamp, nonce, msgSignature);

//			this.logger.debug("\n消息解密后内容为:\n{} ", inMessage.toString());
//			WxMpXmlOutMessage outMessage = this.route(inMessage);
//			if (outMessage == null) {
//				return "";
//			}
			JSONObject jsStr = JSONObject.parseObject(JsonUtils.toJson(inMessage));
			try {
				out = qhChatService.qhChat(jsStr);
			} catch (Exception e) {
				e.printStackTrace();
			}
			
//			this.logger.info(out+"-----------调用接口返回数据");
			WxMpXmlOutMessage build = new TextBuilder().build(out, inMessage, this.wxService);
			out = build.toEncryptedXml(this.wxService.getWxMpConfigStorage());

			// 组装XML返回给微信
//      out = outMessage
//          .toEncryptedXml(this.wxService.getWxMpConfigStorage());
		}

		this.logger.debug("\n组装回复信息:{}", out);
		return out;
	}

	private WxMpXmlOutMessage route(WxMpXmlMessage message) {
		try {
			return this.router.route(message);
		} catch (Exception e) {
			this.logger.error(e.getMessage(), e);
		}

		return null;
	}

}

返回的消息也是一个XML,需要微信的API转成XML。调用该方法:

WxMpXmlOutMessage build = new TextBuilder().build(out, inMessage, this.wxService);
            out = build.toEncryptedXml(this.wxService.getWxMpConfigStorage());

将需要回复的消息拼成一个微信可以识别的一个串,返回给微信。消息内容就是out。可以在上面处理out,然后将out重新转成XML。

最后效果:展示出来的是一个正常的消息,而不是一个json串。下面是我调用图灵接口进行消息的回复。

不懂可以留言联系。再会。

猜你喜欢

转载自blog.csdn.net/a909422229/article/details/82865538