From 6396dac27ca99e84a2e3c772fb079bceddf67ff8 Mon Sep 17 00:00:00 2001
From: sunpengfei <i@angelzzz.com>
Date: 星期一, 01 十二月 2025 18:17:45 +0800
Subject: [PATCH] feat:开发

---
 ApiTools.Web.Entry/Controllers/WxmpController.cs |   72 ++++++++++++++++++++++++++++++++++++
 1 files changed, 72 insertions(+), 0 deletions(-)

diff --git a/ApiTools.Web.Entry/Controllers/WxmpController.cs b/ApiTools.Web.Entry/Controllers/WxmpController.cs
new file mode 100644
index 0000000..a3711b4
--- /dev/null
+++ b/ApiTools.Web.Entry/Controllers/WxmpController.cs
@@ -0,0 +1,72 @@
+锘縰sing Aop.Api.Domain;
+using ApiTools.Core;
+using Furion.DataEncryption;
+using Furion.DynamicApiController;
+using Furion.FriendlyException;
+using MediatR;
+using Microsoft.AspNetCore.Authorization;
+using Microsoft.AspNetCore.Mvc;
+using Microsoft.Extensions.Options;
+using Newtonsoft.Json;
+using Org.BouncyCastle.Ocsp;
+using System.Buffers.Binary;
+using System.Security.Cryptography;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace ApiTools.Web.Entry.Controllers
+{
+    [Route("api/common/wxmp")]
+    public class WxmpController(
+            WxmpUtils utils,
+            IOptions<WxmpOptions> options,
+            IMediator mediator
+        ) : ControllerBase
+    {
+        private readonly WxmpUtils utils = utils;
+        private readonly IOptions<WxmpOptions> options = options;
+        private readonly IMediator mediator = mediator;
+
+        [HttpGet("subscribMessageNotify/{code}")]
+        [AllowAnonymous]
+        [NonUnify]
+        public IActionResult SubscribMessageNotify([FromRoute] string code, [FromQuery] WxmpSubscribMessageNotifyRequestQuery query)
+        {
+            var @params = new[]
+            {
+                options.Value.SubscribMessage.Token,
+                query.timestamp,
+                query.nonce
+            }
+            .OrderBy(p => p)
+            .ToArray();
+            var text = string.Concat(@params);
+            if (SHA1Encryption.Compare(text, query.signature, true))
+            {
+                return Content(query.echostr);
+            }
+            else
+            {
+                return Unauthorized("楠岀澶辫触");
+            }
+        }
+
+        [HttpPost("subscribMessageNotify/{code}")]
+        [AllowAnonymous]
+        [NonUnify]
+        public async Task<IActionResult> SubscribMessageNotify([FromRoute] string code, [FromQuery] WxmpSubscribMessageNotifyRequestQuery query, [FromBody] WxmpSubscribMessageNotifyRequestBody body)
+        {
+            var appId = options.Value.Items.FirstOrDefault(it => it.Code == code).AppId;
+            Tencent.WXBizMsgCrypt wxcpt = new Tencent.WXBizMsgCrypt(options.Value.SubscribMessage.Token, options.Value.SubscribMessage.EncodingAESKey, appId);
+            var data = $"<xml><ToUserName><![CDATA[{body.ToUserName}]]></ToUserName><Encrypt><![CDATA[{body.Encrypt}]]></Encrypt></xml>";
+            var content = "";
+            var error = wxcpt.DecryptMsg(query.msg_signature, query.timestamp, query.nonce, data, ref content);
+            if (error != 0) return Unauthorized("楠岀澶辫触");
+            var command = content.JsonTo<WxmpSubscribMessageNotifyCommand>();
+            command.Code = code;
+            command.OpenId = query.openid;
+            await mediator.Send(command);
+            return Content("success");
+        }
+    }
+}

--
Gitblit v1.9.1