package org.ruoyi.controller;
|
|
import lombok.extern.slf4j.Slf4j;
|
import me.chanjar.weixin.cp.api.WxCpService;
|
import me.chanjar.weixin.cp.bean.message.WxCpXmlMessage;
|
import me.chanjar.weixin.cp.bean.message.WxCpXmlOutMessage;
|
import me.chanjar.weixin.cp.util.crypto.WxCpCryptUtil;
|
import org.apache.commons.lang3.StringUtils;
|
import org.ruoyi.common.core.utils.JsonUtils;
|
|
import org.ruoyi.config.WxCpConfiguration;
|
import org.springframework.beans.factory.annotation.Value;
|
import org.springframework.web.bind.annotation.*;
|
|
/**
|
* 微信公众号登录校验
|
*
|
* @author ageerle
|
* @date 2025-05-03
|
*/
|
@RestController
|
@RequestMapping("/wx/cp")
|
@Slf4j
|
public class WxPortalController {
|
|
@Value("${wechat.cp.appConfigs[0].agentId}")
|
private Integer agentId;
|
|
|
@GetMapping(produces = "text/plain;charset=utf-8")
|
public String authGet(
|
@RequestParam(name = "msg_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) {
|
log.info("\n接收到来自微信服务器的认证消息:signature = [{}], timestamp = [{}], nonce = [{}], echostr = [{}]",
|
signature, timestamp, nonce, echostr);
|
|
if (StringUtils.isAnyBlank(signature, timestamp, nonce, echostr)) {
|
throw new IllegalArgumentException("请求参数非法,请核实!");
|
}
|
|
final WxCpService wxCpService = WxCpConfiguration.getCpService(agentId);
|
if (wxCpService == null) {
|
throw new IllegalArgumentException(String.format("未找到对应agentId=[%d]的配置,请核实!", agentId));
|
}
|
|
if (wxCpService.checkSignature(signature, timestamp, nonce, echostr)) {
|
return new WxCpCryptUtil(wxCpService.getWxCpConfigStorage()).decrypt(echostr);
|
}
|
|
return "非法请求";
|
}
|
|
@PostMapping(produces = "application/xml; charset=UTF-8")
|
public String post(
|
@RequestBody String requestBody,
|
@RequestParam("msg_signature") String signature,
|
@RequestParam("timestamp") String timestamp,
|
@RequestParam("nonce") String nonce) {
|
log.info("\n接收微信请求:[signature=[{}], timestamp=[{}], nonce=[{}], requestBody=[\n{}\n] ",
|
signature, timestamp, nonce, requestBody);
|
|
final WxCpService wxCpService = WxCpConfiguration.getCpService(1000002);
|
WxCpXmlMessage inMessage = WxCpXmlMessage.fromEncryptedXml(requestBody, wxCpService.getWxCpConfigStorage(),
|
timestamp, nonce, signature);
|
log.debug("\n消息解密后内容为:\n{} ", JsonUtils.toJson(inMessage));
|
WxCpXmlOutMessage outMessage = this.route(1000002, inMessage);
|
if (outMessage == null) {
|
return "";
|
}
|
|
String out = outMessage.toEncryptedXml(wxCpService.getWxCpConfigStorage());
|
log.debug("\n组装回复信息:{}", out);
|
return out;
|
}
|
|
private WxCpXmlOutMessage route(Integer agentId, WxCpXmlMessage message) {
|
try {
|
return WxCpConfiguration.getRouters().get(agentId).route(message);
|
} catch (Exception e) {
|
log.error(e.getMessage(), e);
|
}
|
|
return null;
|
}
|
|
|
}
|