diff --git a/Yi.Abp.Net8/module/ai-hub/Yi.Framework.AiHub.Application/Services/FuwuhaoService.cs b/Yi.Abp.Net8/module/ai-hub/Yi.Framework.AiHub.Application/Services/FuwuhaoService.cs
new file mode 100644
index 00000000..40054d7e
--- /dev/null
+++ b/Yi.Abp.Net8/module/ai-hub/Yi.Framework.AiHub.Application/Services/FuwuhaoService.cs
@@ -0,0 +1,67 @@
+using System.Text;
+using System.Text.Json;
+using System.Xml.Serialization;
+using Microsoft.AspNetCore.Http;
+using Microsoft.AspNetCore.Mvc;
+using Microsoft.Extensions.Logging;
+using Volo.Abp.Application.Services;
+
+namespace Yi.Framework.AiHub.Application.Services;
+
+///
+/// 服务号服务
+///
+public class FuwuhaoService : ApplicationService
+{
+ private readonly ILogger _logger;
+ private readonly IHttpContextAccessor _accessor;
+
+ public FuwuhaoService(ILogger logger, IHttpContextAccessor accessor)
+ {
+ _logger = logger;
+ _accessor = accessor;
+ }
+
+ ///
+ /// 查询已登录的账户信息
+ ///
+ ///
+ [HttpGet("fuwuhao/callback")]
+ public async Task GetCallbackAsync([FromQuery] string signature, [FromQuery] string timestamp,
+ [FromQuery] string nonce, [FromQuery] string echostr)
+ {
+
+ return echostr;
+ }
+
+ [HttpPost("fuwuhao/callback")]
+ public async Task PostCallbackAsync([FromQuery] string signature, [FromQuery] string timestamp,
+ [FromQuery] string nonce)
+ {
+ var request = _accessor.HttpContext.Request;
+ // 1. 读取原始 XML 内容
+ using var reader = new StreamReader(request.Body, Encoding.UTF8);
+ var xmlString = await reader.ReadToEndAsync();
+
+ var serializer = new XmlSerializer(typeof(FuwuhaoCallModel));
+ using var stringReader = new StringReader(xmlString);
+ var body = (FuwuhaoCallModel)serializer.Deserialize(stringReader);
+ _logger.LogError("服务号Post回调通知:" + JsonSerializer.Serialize(body, new JsonSerializerOptions()
+ {
+ WriteIndented = true
+ }));
+ return "success";
+ }
+}
+
+[XmlRoot("xml")]
+public class FuwuhaoCallModel
+{
+ [XmlElement("ToUserName")] public string ToUserName { get; set; }
+ [XmlElement("FromUserName")] public string FromUserName { get; set; }
+ [XmlElement("CreateTime")] public string CreateTime { get; set; }
+ [XmlElement("MsgType")] public string MsgType { get; set; }
+ [XmlElement("Event")] public string Event { get; set; }
+ [XmlElement("EventKey")] public string EventKey { get; set; }
+ [XmlElement("Ticket")] public string Ticket { get; set; }
+}
\ No newline at end of file