From 1deb3d68f4caf2f54107e67c991ec9e50b360fa0 Mon Sep 17 00:00:00 2001
From: sunpengfei <i@angelzzz.com>
Date: 星期四, 20 十一月 2025 09:26:19 +0800
Subject: [PATCH] Merge branch 'dev-818-3.4.2.12' of http://120.26.58.240:8888/r/ApiTools into dev-818-3.4.2.12

---
 ApiTools.Core/Models/WxmpUtils/Commands/SaveWxSettingCommand.cs      |   36 ++++
 ApiTools.Application/ApiTools.Application.csproj                     |    5 
 ApiTools.Application/ApiTools.Application.xml                        |    8 +
 ApiTools.Core/ApiTools.Core.csproj                                   |    4 
 ApiTools.Core/Enums/Resources/EnumResourceController.cs              |    6 
 ApiTools.Core/Utils/WxmpUtils/WxmpGetQrCodeRequest.cs                |   69 ++++++++
 ApiTools.Core/Utils/WxmpUtils/WxmpUtils.cs                           |   40 ++++
 ApiTools.Application/WxUtils/Commands/SaveWxSettingCommandHandler.cs |   53 ++++++
 ApiTools.Core/ApiTools.Core.xml                                      |  102 ++++++++++++
 ApiTools.Application/WxUtils/Queries/GetWxSettingQueryHandler.cs     |   34 ++++
 ApiTools.Application/WxUtils/Commands/SaveWxCommandHandler.cs        |   29 +++
 ApiTools.Core/Entities/WxmpUtils/WxSetting.cs                        |   36 ++++
 12 files changed, 421 insertions(+), 1 deletions(-)

diff --git a/ApiTools.Application/ApiTools.Application.csproj b/ApiTools.Application/ApiTools.Application.csproj
index 4c7484c..f08bd68 100644
--- a/ApiTools.Application/ApiTools.Application.csproj
+++ b/ApiTools.Application/ApiTools.Application.csproj
@@ -8,6 +8,11 @@
 		<ImplicitUsings>enable</ImplicitUsings>
 	</PropertyGroup>
 
+
+	<ItemGroup>
+	  <Compile Remove="WxUtils\Commands\SaveWxCommandHandler.cs" />
+	</ItemGroup>
+
 	<ItemGroup>
 		<None Remove="ApiTools.Application.xml" />
 	</ItemGroup>
diff --git a/ApiTools.Application/ApiTools.Application.xml b/ApiTools.Application/ApiTools.Application.xml
index 7fdf5ec..8a0e71c 100644
--- a/ApiTools.Application/ApiTools.Application.xml
+++ b/ApiTools.Application/ApiTools.Application.xml
@@ -287,5 +287,13 @@
             <param name="cancellationToken"></param>
             <returns></returns>
         </member>
+        <member name="M:ApiTools.CommonServer.Application.SaveWxSettingCommandHandler.Handle(ApiTools.Core.SaveWxSettingCommand,System.Threading.CancellationToken)">
+            <summary>
+            淇濆瓨寰俊閰嶇疆
+            </summary>
+            <param name="request"></param>
+            <param name="cancellationToken"></param>
+            <returns></returns>
+        </member>
     </members>
 </doc>
diff --git a/ApiTools.Application/WxUtils/Commands/SaveWxCommandHandler.cs b/ApiTools.Application/WxUtils/Commands/SaveWxCommandHandler.cs
new file mode 100644
index 0000000..f28e247
--- /dev/null
+++ b/ApiTools.Application/WxUtils/Commands/SaveWxCommandHandler.cs
@@ -0,0 +1,29 @@
+锘縰sing ApiTools.Core;
+using Baidu.Aip;
+using MediatR;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace ApiTools.CommonServer.Application
+{
+    public class SaveWxCommandHandler(WxmpUtils utils) : IRequestHandler<SaveWxSettingCommand, Guid>
+    {
+        public async Task<Guid> Handle(SaveWxSettingCommand request, CancellationToken cancellationToken)
+        {
+            return await utils.WxSend(new SendRequest
+            {
+                WxmpCode = request.Code,
+                EnvVersion = request.EnvVersion,
+                template_id = request.t,
+                page = request.ChannelCreatedUserId,
+                touser = request.ChannelCreatedUserId,
+                data =
+                miniprogram_state=
+                lang=
+            }, request.TemplateParam, cancellationToken);
+        }
+    }
+}
diff --git a/ApiTools.Application/WxUtils/Commands/SaveWxSettingCommandHandler.cs b/ApiTools.Application/WxUtils/Commands/SaveWxSettingCommandHandler.cs
new file mode 100644
index 0000000..7267a12
--- /dev/null
+++ b/ApiTools.Application/WxUtils/Commands/SaveWxSettingCommandHandler.cs
@@ -0,0 +1,53 @@
+锘縰sing ApiTools.Core;
+using Furion.DatabaseAccessor;
+using Mapster;
+using MediatR;
+using Microsoft.EntityFrameworkCore;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace ApiTools.CommonServer.Application
+{
+    public class SaveWxSettingCommandHandler(IRepository<WxSetting> rep) :IRequestHandler<SaveWxSettingCommand, Guid>
+    {
+        private readonly IRepository<WxSetting> rep = rep;
+
+        /// <summary>
+        /// 淇濆瓨寰俊閰嶇疆
+        /// </summary>
+        /// <param name="request"></param>
+        /// <param name="cancellationToken"></param>
+        /// <returns></returns>
+        public async Task<Guid> Handle(SaveWxSettingCommand request, CancellationToken cancellationToken)
+        {
+            var logier = JwtUtils.GetCurrentLogier();
+            var entity = await rep.AsQueryable()
+                .Where(it => it.Code == request.Code)
+                .FirstOrDefaultAsync();
+            var add = false;
+            if (entity == null)
+            {
+                entity = new WxSetting();
+                entity.Code = request.Code;
+                entity.AppId = request.AppId;
+                entity.AppSecret = request.AppSecret;
+                entity.EnvVersion = request.EnvVersion;
+                add = true;
+            }
+            request.Adapt(entity);
+            if (add)
+            {
+                await rep.InsertAsync(entity);
+            }
+            else
+            {
+                await rep.UpdateAsync(entity);
+            }
+            return entity.Id;
+            //return Guid.NewGuid();
+        }
+    }
+}
diff --git a/ApiTools.Application/WxUtils/Queries/GetWxSettingQueryHandler.cs b/ApiTools.Application/WxUtils/Queries/GetWxSettingQueryHandler.cs
new file mode 100644
index 0000000..29b6550
--- /dev/null
+++ b/ApiTools.Application/WxUtils/Queries/GetWxSettingQueryHandler.cs
@@ -0,0 +1,34 @@
+锘縰sing ApiTools.Core;
+using Furion.DatabaseAccessor;
+using MediatR;
+using Microsoft.EntityFrameworkCore;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace ApiTools.CommonServer.Application
+{
+    //public class GetWxSettingQueryHandler(IRepository<SmsSetting> rep, IRepository<SmsLog> repSmsLog) : IRequestHandler<GetSmsSettingQuery, GetSmsSettingQueryResult>
+    //{
+    //    private readonly IRepository<SmsSetting> rep = rep;
+    //    private readonly IRepository<SmsLog> repSmsLog = repSmsLog;
+
+    //    /// <summary>
+    //    /// 鏌ヨ鐭俊閰嶇疆
+    //    /// </summary>
+    //    /// <param name="request"></param>
+    //    /// <param name="cancellationToken"></param>
+    //    /// <returns></returns>
+    //    public async Task<GetSmsSettingQueryResult> Handle(GetSmsSettingQuery request, CancellationToken cancellationToken)
+    //    {
+    //        var logier = JwtUtils.GetCurrentLogier();
+    //        var detail = await rep.AsQueryable().AsNoTracking()
+    //            .Where(it => it.ChannelId == logier.ChannelId)
+    //            .GetDetail<SmsSetting, GetSmsSettingQueryResult>();
+    //        detail.Accesses = detail.Accesses.OrderBy(it => it.Sort).ToList();
+    //        return detail;
+    //    }
+    //}
+}
diff --git a/ApiTools.Core/ApiTools.Core.csproj b/ApiTools.Core/ApiTools.Core.csproj
index bea4bf4..7575885 100644
--- a/ApiTools.Core/ApiTools.Core.csproj
+++ b/ApiTools.Core/ApiTools.Core.csproj
@@ -39,4 +39,8 @@
 	  </None>
 	</ItemGroup>
 
+	<ItemGroup>
+	  <Folder Include="Models\WxmpUtils\Queries\" />
+	</ItemGroup>
+
 </Project>
diff --git a/ApiTools.Core/ApiTools.Core.xml b/ApiTools.Core/ApiTools.Core.xml
index 28fa741..da4c73e 100644
--- a/ApiTools.Core/ApiTools.Core.xml
+++ b/ApiTools.Core/ApiTools.Core.xml
@@ -1280,6 +1280,31 @@
             鐘舵��
             </summary>
         </member>
+        <member name="T:ApiTools.Core.WxSetting">
+            <summary>
+            寰俊閰嶇疆
+            </summary>
+        </member>
+        <member name="P:ApiTools.Core.WxSetting.Code">
+            <summary>
+            缂栧彿
+            </summary>
+        </member>
+        <member name="P:ApiTools.Core.WxSetting.AppId">
+            <summary>
+            灏忕▼搴廔D
+            </summary>
+        </member>
+        <member name="P:ApiTools.Core.WxSetting.AppSecret">
+            <summary>
+            灏忕▼搴忓瘑閽�
+            </summary>
+        </member>
+        <member name="P:ApiTools.Core.WxSetting.EnvVersion">
+            <summary>
+            鐗堟湰
+            </summary>
+        </member>
         <member name="F:ApiTools.Core.EnumErrorCodeType.s400">
             <summary>
             鍙傛暟閿欒
@@ -1498,6 +1523,11 @@
         <member name="F:ApiTools.Core.EnumResourceController.CommonServerSmsUtils">
             <summary>
             鐭俊宸ュ叿
+            </summary>
+        </member>
+        <member name="F:ApiTools.Core.EnumResourceController.CommonServerWxUtils">
+            <summary>
+            寰俊宸ュ叿
             </summary>
         </member>
         <member name="F:ApiTools.Core.EnumResourceController.UserServerAuth">
@@ -3236,6 +3266,31 @@
         <member name="P:ApiTools.Core.GetSmsSettingQueryResultAccess.SignName">
             <summary>
             绛惧悕鍚嶇О
+            </summary>
+        </member>
+        <member name="T:ApiTools.Core.SaveWxSettingCommand">
+            <summary>
+            淇濆瓨寰俊閰嶇疆
+            </summary>
+        </member>
+        <member name="P:ApiTools.Core.SaveWxSettingCommand.Code">
+            <summary>
+            缂栧彿
+            </summary>
+        </member>
+        <member name="P:ApiTools.Core.SaveWxSettingCommand.AppId">
+            <summary>
+            灏忕▼搴廔D
+            </summary>
+        </member>
+        <member name="P:ApiTools.Core.SaveWxSettingCommand.AppSecret">
+            <summary>
+            灏忕▼搴忓瘑閽�
+            </summary>
+        </member>
+        <member name="P:ApiTools.Core.SaveWxSettingCommand.EnvVersion">
+            <summary>
+            鐗堟湰
             </summary>
         </member>
         <member name="M:ApiTools.Core.BaseRepository`2.GetQueryable(System.Boolean)">
@@ -6900,6 +6955,46 @@
             閿欒淇℃伅
             </summary>
         </member>
+        <member name="T:ApiTools.Core.SendRequest">
+            <summary>
+            鍙戦�佽闃呮秷鎭�
+            </summary>
+        </member>
+        <member name="P:ApiTools.Core.SendRequest.WxmpCode">
+            <summary>
+            灏忕▼搴忕紪鍙�
+            </summary>
+        </member>
+        <member name="P:ApiTools.Core.SendRequest.EnvVersion">
+            <summary>
+            瑕佹墦寮�鐨勫皬绋嬪簭鐗堟湰銆傛寮忕増涓� "release"锛屼綋楠岀増涓� "trial"锛屽紑鍙戠増涓� "develop"銆傞粯璁ゆ槸姝e紡鐗堛��
+            </summary>
+        </member>
+        <member name="P:ApiTools.Core.SendRequest.template_id">
+            <summary>
+            鎵�闇�涓嬪彂鐨勮闃呮ā鏉縤d
+            </summary>
+        </member>
+        <member name="P:ApiTools.Core.SendRequest.page">
+            <summary>
+            鐐瑰嚮妯℃澘鍗$墖鍚庣殑璺宠浆椤甸潰锛屼粎闄愭湰灏忕▼搴忓唴鐨勯〉闈€�傛敮鎸佸甫鍙傛暟,锛堢ず渚媔ndex?foo=bar锛夈�傝瀛楁涓嶅~鍒欐ā鏉挎棤璺宠浆
+            </summary>
+        </member>
+        <member name="P:ApiTools.Core.SendRequest.touser">
+            <summary>
+            鎺ユ敹鑰咃紙鐢ㄦ埛锛夌殑 openid
+            </summary>
+        </member>
+        <member name="P:ApiTools.Core.SendRequest.data">
+            <summary>
+            妯℃澘鍐呭锛屾牸寮忓舰濡倇 "phrase3": { "value": "瀹℃牳閫氳繃" }, "name1": { "value": "璁㈤槄" }, "date2": { "value": "2019-12-25 09:42" } }
+            </summary>
+        </member>
+        <member name="T:ApiTools.Core.SendResponse">
+            <summary>
+            鍙戦�佽闃呮秷鎭�-缁撴灉
+            </summary>
+        </member>
         <member name="T:ApiTools.Core.WxmpOptions">
             <summary>
             寰俊灏忕▼搴忛厤缃�
@@ -6944,6 +7039,13 @@
             <param name="command"></param>
             <returns></returns>
         </member>
+        <member name="M:ApiTools.Core.WxmpUtils.WxSend(ApiTools.Core.SendRequest)">
+            <summary>
+            璇ユ帴鍙g敤浜庡彂閫佽闃呮秷鎭�
+            </summary>
+            <param name="command"></param>
+            <returns></returns>
+        </member>
         <member name="T:ApiTools.Core.XmlDoc">
             <summary>
             娉ㄩ噴鏂囨。
diff --git a/ApiTools.Core/Entities/WxmpUtils/WxSetting.cs b/ApiTools.Core/Entities/WxmpUtils/WxSetting.cs
new file mode 100644
index 0000000..714f4e9
--- /dev/null
+++ b/ApiTools.Core/Entities/WxmpUtils/WxSetting.cs
@@ -0,0 +1,36 @@
+锘縰sing Furion.DatabaseAccessor;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace ApiTools.Core
+{
+
+    /// <summary>
+    /// 寰俊閰嶇疆
+    /// </summary>
+    public class WxSetting : CommonEntity<MasterDbContextLocator>
+    {
+        /// <summary>
+        /// 缂栧彿
+        /// </summary>
+        public string Code { get; set; }
+
+        /// <summary>
+        /// 灏忕▼搴廔D
+        /// </summary>
+        public string AppId { get; set; }
+
+        /// <summary>
+        /// 灏忕▼搴忓瘑閽�
+        /// </summary>
+        public string AppSecret { get; set; }
+
+        /// <summary>
+        /// 鐗堟湰
+        /// </summary>
+        public string EnvVersion { get; set; }
+    }
+}
diff --git a/ApiTools.Core/Enums/Resources/EnumResourceController.cs b/ApiTools.Core/Enums/Resources/EnumResourceController.cs
index 3827cb7..7a347c4 100644
--- a/ApiTools.Core/Enums/Resources/EnumResourceController.cs
+++ b/ApiTools.Core/Enums/Resources/EnumResourceController.cs
@@ -33,6 +33,12 @@
         CommonServerSmsUtils,
 
         /// <summary>
+        /// 寰俊宸ュ叿
+        /// </summary>
+        [ResourceController(EnumResourceService.CommonServer, "Wx")]
+        CommonServerWxUtils,
+
+        /// <summary>
         /// 鐢ㄦ埛璁よ瘉
         /// </summary>
         [ResourceController(EnumResourceService.UserServer, "Auth")]
diff --git a/ApiTools.Core/Models/WxmpUtils/Commands/SaveWxSettingCommand.cs b/ApiTools.Core/Models/WxmpUtils/Commands/SaveWxSettingCommand.cs
new file mode 100644
index 0000000..b316f80
--- /dev/null
+++ b/ApiTools.Core/Models/WxmpUtils/Commands/SaveWxSettingCommand.cs
@@ -0,0 +1,36 @@
+锘縰sing MediatR;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace ApiTools.Core
+{
+    /// <summary>
+    /// 淇濆瓨寰俊閰嶇疆
+    /// </summary>
+    [Resource([EnumResourceController.CommonServerWxUtils], Method = EnumResourceMethod.Post)]
+    public class SaveWxSettingCommand : IRequest<Guid>
+    {
+        /// <summary>
+        /// 缂栧彿
+        /// </summary>
+        public string Code { get; set; }
+
+        /// <summary>
+        /// 灏忕▼搴廔D
+        /// </summary>
+        public string AppId { get; set; }
+
+        /// <summary>
+        /// 灏忕▼搴忓瘑閽�
+        /// </summary>
+        public string AppSecret { get; set; }
+
+        /// <summary>
+        /// 鐗堟湰
+        /// </summary>
+        public string EnvVersion { get; set; }
+    }
+}
diff --git a/ApiTools.Core/Utils/WxmpUtils/WxmpGetQrCodeRequest.cs b/ApiTools.Core/Utils/WxmpUtils/WxmpGetQrCodeRequest.cs
index 2cf4fdd..86515bc 100644
--- a/ApiTools.Core/Utils/WxmpUtils/WxmpGetQrCodeRequest.cs
+++ b/ApiTools.Core/Utils/WxmpUtils/WxmpGetQrCodeRequest.cs
@@ -106,4 +106,73 @@
         public string ErrorMessage { get; set; }
 
     }
+
+    /// <summary>
+    /// 鍙戦�佽闃呮秷鎭�
+    /// </summary>
+    public class SendRequest
+    {
+
+        /// <summary>
+        /// 灏忕▼搴忕紪鍙�
+        /// </summary>
+        [JsonProperty("WxmpCode")]
+        [Required]
+        public string WxmpCode { get; set; }
+
+        /// <summary>
+        /// 瑕佹墦寮�鐨勫皬绋嬪簭鐗堟湰銆傛寮忕増涓� "release"锛屼綋楠岀増涓� "trial"锛屽紑鍙戠増涓� "develop"銆傞粯璁ゆ槸姝e紡鐗堛��
+        /// </summary>
+        [JsonProperty("env_version")]
+        public string EnvVersion { get; set; }
+
+        /// <summary>
+        /// 鎵�闇�涓嬪彂鐨勮闃呮ā鏉縤d
+        /// </summary>
+        [JsonProperty("template_id")]
+        [Required]
+        public string template_id { get; set; }
+
+        /// <summary>
+        /// 鐐瑰嚮妯℃澘鍗$墖鍚庣殑璺宠浆椤甸潰锛屼粎闄愭湰灏忕▼搴忓唴鐨勯〉闈€�傛敮鎸佸甫鍙傛暟,锛堢ず渚媔ndex?foo=bar锛夈�傝瀛楁涓嶅~鍒欐ā鏉挎棤璺宠浆
+        /// </summary>
+        [JsonProperty("page")]
+        [Required]
+        public string page { get; set; }
+
+        /// <summary>
+        /// 鎺ユ敹鑰咃紙鐢ㄦ埛锛夌殑 openid
+        /// </summary>
+        [JsonProperty("touser")]
+        [Required]
+        public string touser { get; set; }
+
+        /// <summary>
+        /// 妯℃澘鍐呭锛屾牸寮忓舰濡倇 "phrase3": { "value": "瀹℃牳閫氳繃" }, "name1": { "value": "璁㈤槄" }, "date2": { "value": "2019-12-25 09:42" } }
+        /// </summary>
+        [JsonProperty("data")]
+        [Required]
+        public object data { get; set; }
+
+        [JsonProperty("璺宠浆灏忕▼搴忕被鍨嬶細developer涓哄紑鍙戠増锛泃rial涓轰綋楠岀増锛沠ormal涓烘寮忕増锛涢粯璁や负姝e紡鐗�")]
+        [Required]
+        public string miniprogram_state { get; set; }
+
+        [JsonProperty("杩涘叆灏忕▼搴忔煡鐪嬧�濈殑璇█绫诲瀷锛屾敮鎸亃h_CN(绠�浣撲腑鏂�)銆乪n_US(鑻辨枃)銆亃h_HK(绻佷綋涓枃)銆亃h_TW(绻佷綋涓枃)锛岄粯璁や负zh_CN")]
+        [Required]
+        public string lang { get; set; }
+
+    }
+
+    /// <summary>
+    /// 鍙戦�佽闃呮秷鎭�-缁撴灉
+    /// </summary>
+    public class SendResponse
+    {
+        [JsonProperty("ErrorCode")]
+        public int ErrorCode { get; set; }
+
+        [JsonProperty("errmsg")]
+        public int errmsg { get; set; }
+    }
 }
diff --git a/ApiTools.Core/Utils/WxmpUtils/WxmpUtils.cs b/ApiTools.Core/Utils/WxmpUtils/WxmpUtils.cs
index 44f09c0..3806ced 100644
--- a/ApiTools.Core/Utils/WxmpUtils/WxmpUtils.cs
+++ b/ApiTools.Core/Utils/WxmpUtils/WxmpUtils.cs
@@ -1,6 +1,7 @@
 锘縰sing Aliyun.OSS;
-using Azure.Core;
+using Aop.Api.Domain;
 using ApiTools.Core.Utils.WxmpUtils;
+using Azure.Core;
 using Furion.FriendlyException;
 using Furion.HttpRemote;
 using Mapster;
@@ -124,5 +125,42 @@
             var result = AliyunOSSUtils.Upload(command.OssScene, stream, command.OssFileName);
             return result.Url;
         }
+
+        /// <summary>
+        /// 璇ユ帴鍙g敤浜庡彂閫佽闃呮秷鎭�
+        /// </summary>
+        /// <param name="command"></param>
+        /// <returns></returns>
+        public async Task<string> WxSend(SendRequest command)
+        {
+            var option = options.Value.Items.FirstOrDefault(it => it.Code == command.WxmpCode);
+            if (option == null || option.AppId.IsNull() || option.AppSecret.IsNull())
+                throw Oops.Oh(EnumErrorCodeType.s400, "鑾峰彇灏忕▼搴忕爜澶辫触锛岀己澶遍厤缃細WxmpOptions");
+            command.EnvVersion = option.EnvVersion;
+            var accessToken = await GetAccessToken(command.WxmpCode);
+            var request = command.Adapt<SendRequest>();
+            var jsonContent = JsonConvert.SerializeObject(request, new JsonSerializerSettings
+            {
+                NullValueHandling = NullValueHandling.Ignore
+            });
+            var response = await httpRemoteService.PostAsync("https://api.weixin.qq.com/cgi-bin/message/subscribe/send",
+                builder => builder
+                .WithQueryParameter("access_token", accessToken)
+                .SetJsonContent(jsonContent));
+            response.EnsureSuccessStatusCode();
+            if (response.Content.Headers.ContentType.ToString() == "application/json; charset=UTF-8")
+            {
+                var jsonResult = await response.Content.ReadAsStringAsync();
+                var callback = jsonResult.JsonTo<SendResponse>();
+                if (callback == null || callback.ErrorCode != 0)
+                    //throw Oops.Oh(EnumErrorCodeType.s510, $"鑾峰彇灏忕▼搴忕爜澶辫触锛歿callback.errmsg}锛岃鑱旂郴绠$悊鍛�");
+                return jsonResult;
+            }
+            //var stream = await response.Content.ReadAsStreamAsync();
+            //var result = AliyunOSSUtils.Upload(command, stream, command.OssFileName);
+            return "";
+        }
+
+
     }
 }

--
Gitblit v1.9.1