From 8d9adc809cee12d16caf9854ada2e7d030a5f4b4 Mon Sep 17 00:00:00 2001
From: sunpengfei <i@angelzzz.com>
Date: 星期五, 21 十一月 2025 15:41:42 +0800
Subject: [PATCH] feat:开发

---
 ApiTools.Core/Services/ChannelPingAnPayWalletService.cs                        |    9 +
 ApiTools.Application/ApiTools.Application.csproj                               |    4 
 ApiTools.Core/ApiTools.Core.csproj                                             |    4 
 ApiTools.Core/Models/WxmpUtils/Commands/SendWxmpSubscribMessageCommand.cs      |    4 
 ApiTools.Web.Entry/appsettings.json                                            |   11 +
 ApiTools.Core/Enums/WxmpUtils/EnumWxmpSubscribMessageTemplate.cs               |    4 
 ApiTools.Core/Models/WxmpUtils/Queries/GetWxmpSubscribMessageTemplatesQuery.cs |   85 ++++++++++
 ApiTools.Core/Utils/WxmpUtils/GetWxmpSubscribMessageTemplatesRequest.cs        |  104 +++++++++++++
 ApiTools.Application/ChannelWallets/Commands/ChannelWalletCommandHandler.cs    |    1 
 ApiTools.Application/WxUtils/Commands/WxmpSubscribMessageCommandHandler.cs     |    4 
 ApiTools.Application/WxUtils/Queries/WxmpSubscribMessageQueryHandler.cs        |   34 ++++
 ApiTools.Application/ApiTools.Application.xml                                  |   10 +
 ApiTools.Core/Utils/WxmpUtils/WxmpUtils.cs                                     |   21 ++
 ApiTools.Core/ApiTools.Core.xml                                                |  169 ++++++++++++++++++++
 14 files changed, 444 insertions(+), 20 deletions(-)

diff --git a/ApiTools.Application/ApiTools.Application.csproj b/ApiTools.Application/ApiTools.Application.csproj
index 806b4d8..4c7484c 100644
--- a/ApiTools.Application/ApiTools.Application.csproj
+++ b/ApiTools.Application/ApiTools.Application.csproj
@@ -16,8 +16,4 @@
 		<ProjectReference Include="..\ApiTools.Core\ApiTools.Core.csproj" />
 	</ItemGroup>
 
-	<ItemGroup>
-	  <Folder Include="WxUtils\Queries\" />
-	</ItemGroup>
-
 </Project>
diff --git a/ApiTools.Application/ApiTools.Application.xml b/ApiTools.Application/ApiTools.Application.xml
index c54741f..1663257 100644
--- a/ApiTools.Application/ApiTools.Application.xml
+++ b/ApiTools.Application/ApiTools.Application.xml
@@ -215,7 +215,7 @@
             <param name="cancellationToken"></param>
             <returns></returns>
         </member>
-        <member name="M:ApiTools.Application.WxmpSubscribMessageCommandHandler.Handle(ApiTools.Core.WxmpSendSubscribMessageCommand,System.Threading.CancellationToken)">
+        <member name="M:ApiTools.Application.WxmpSubscribMessageCommandHandler.Handle(ApiTools.Core.SendWxmpSubscribMessageCommand,System.Threading.CancellationToken)">
             <summary>
             寰俊灏忕▼搴忓彂閫佽闃呮秷鎭�
             </summary>
@@ -231,6 +231,14 @@
             <param name="cancellationToken"></param>
             <returns></returns>
         </member>
+        <member name="M:ApiTools.Application.WxmpSubscribMessageQueryHandler.Handle(ApiTools.Core.GetWxmpSubscribMessageTemplatesQuery,System.Threading.CancellationToken)">
+            <summary>
+            鏌ヨ寰俊灏忕▼搴忚闃呮秷鎭ā鏉�
+            </summary>
+            <param name="request"></param>
+            <param name="cancellationToken"></param>
+            <returns></returns>
+        </member>
         <member name="T:ApiTools.CommonServer.Application.SaveSmsSettingCommandHandler">
             <summary>
             淇濆瓨鐭俊閰嶇疆
diff --git a/ApiTools.Application/ChannelWallets/Commands/ChannelWalletCommandHandler.cs b/ApiTools.Application/ChannelWallets/Commands/ChannelWalletCommandHandler.cs
index 50032f2..137684a 100644
--- a/ApiTools.Application/ChannelWallets/Commands/ChannelWalletCommandHandler.cs
+++ b/ApiTools.Application/ChannelWallets/Commands/ChannelWalletCommandHandler.cs
@@ -91,6 +91,7 @@
             if (request.Amount > wallet.Balance) throw Oops.Oh(EnumErrorCodeType.s404, "浣欓涓嶈冻");
 
             var transaction = await channelWalletTransactionRepository.GetQueryable()
+                .Include(it => it.PingAnPay)
                 .Where(it => it.WalletId == wallet.Id && it.OutCode == request.OutCode)
                 .FirstOrDefaultAsync();
             if (transaction == null)
diff --git a/ApiTools.Application/WxUtils/Commands/WxmpSubscribMessageCommandHandler.cs b/ApiTools.Application/WxUtils/Commands/WxmpSubscribMessageCommandHandler.cs
index 25a8315..45ea2c6 100644
--- a/ApiTools.Application/WxUtils/Commands/WxmpSubscribMessageCommandHandler.cs
+++ b/ApiTools.Application/WxUtils/Commands/WxmpSubscribMessageCommandHandler.cs
@@ -17,7 +17,7 @@
             WxmpUtils utils,
             IHttpContextAccessor httpContextAccessor
         ) :
-        IRequestHandler<WxmpSendSubscribMessageCommand, Guid>,
+        IRequestHandler<SendWxmpSubscribMessageCommand, Guid>,
         IRequestHandler<WxmpSubscribMessageNotifyCommand, bool>
     {
         private readonly ILogger<WxmpSubscribMessageCommandHandler> logger = logger;
@@ -30,7 +30,7 @@
         /// <param name="request"></param>
         /// <param name="cancellationToken"></param>
         /// <returns></returns>
-        public async Task<Guid> Handle(WxmpSendSubscribMessageCommand request, CancellationToken cancellationToken)
+        public async Task<Guid> Handle(SendWxmpSubscribMessageCommand request, CancellationToken cancellationToken)
         {
             await utils.WxmpSendSubscribMessage(new WxmpSendSubscribMessageRequest
             {
diff --git a/ApiTools.Application/WxUtils/Queries/WxmpSubscribMessageQueryHandler.cs b/ApiTools.Application/WxUtils/Queries/WxmpSubscribMessageQueryHandler.cs
new file mode 100644
index 0000000..3b3753a
--- /dev/null
+++ b/ApiTools.Application/WxUtils/Queries/WxmpSubscribMessageQueryHandler.cs
@@ -0,0 +1,34 @@
+锘縰sing ApiTools.Core;
+using Mapster;
+using MediatR;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace ApiTools.Application
+{
+    public class WxmpSubscribMessageQueryHandler(
+            WxmpUtils utils
+        ) :
+        IRequestHandler<GetWxmpSubscribMessageTemplatesQuery, GetWxmpSubscribMessageTemplatesQueryResult>
+    {
+        private readonly WxmpUtils utils = utils;
+
+        /// <summary>
+        /// 鏌ヨ寰俊灏忕▼搴忚闃呮秷鎭ā鏉�
+        /// </summary>
+        /// <param name="request"></param>
+        /// <param name="cancellationToken"></param>
+        /// <returns></returns>
+        public async Task<GetWxmpSubscribMessageTemplatesQueryResult> Handle(GetWxmpSubscribMessageTemplatesQuery request, CancellationToken cancellationToken)
+        {
+            var res = await utils.GetWxmpSubscribMessageTemplate(new GetWxmpSubscribMessageTemplatesRequest
+            {
+                WxmpCode = request.WxmpCode
+            });
+            return res.Adapt<GetWxmpSubscribMessageTemplatesQueryResult>();
+        }
+    }
+}
diff --git a/ApiTools.Core/ApiTools.Core.csproj b/ApiTools.Core/ApiTools.Core.csproj
index 7575885..bea4bf4 100644
--- a/ApiTools.Core/ApiTools.Core.csproj
+++ b/ApiTools.Core/ApiTools.Core.csproj
@@ -39,8 +39,4 @@
 	  </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 53af37e..f1928fe 100644
--- a/ApiTools.Core/ApiTools.Core.xml
+++ b/ApiTools.Core/ApiTools.Core.xml
@@ -3283,32 +3283,32 @@
             绛惧悕鍚嶇О
             </summary>
         </member>
-        <member name="T:ApiTools.Core.WxmpSendSubscribMessageCommand">
+        <member name="T:ApiTools.Core.SendWxmpSubscribMessageCommand">
             <summary>
             寰俊灏忕▼搴忓彂閫佽闃呮秷鎭�
             </summary>
         </member>
-        <member name="P:ApiTools.Core.WxmpSendSubscribMessageCommand.WxmpCode">
+        <member name="P:ApiTools.Core.SendWxmpSubscribMessageCommand.WxmpCode">
             <summary>
             灏忕▼搴忕紪鍙�
             </summary>
         </member>
-        <member name="P:ApiTools.Core.WxmpSendSubscribMessageCommand.Template">
+        <member name="P:ApiTools.Core.SendWxmpSubscribMessageCommand.Template">
             <summary>
             鎵�闇�涓嬪彂鐨勮闃呮ā鏉縤d
             </summary>
         </member>
-        <member name="P:ApiTools.Core.WxmpSendSubscribMessageCommand.Page">
+        <member name="P:ApiTools.Core.SendWxmpSubscribMessageCommand.Page">
             <summary>
             鐐瑰嚮妯℃澘鍗$墖鍚庣殑璺宠浆椤甸潰锛屼粎闄愭湰灏忕▼搴忓唴鐨勯〉闈€�傛敮鎸佸甫鍙傛暟,锛堢ず渚媔ndex?foo=bar锛夈�傝瀛楁涓嶅~鍒欐ā鏉挎棤璺宠浆
             </summary>
         </member>
-        <member name="P:ApiTools.Core.WxmpSendSubscribMessageCommand.Touser">
+        <member name="P:ApiTools.Core.SendWxmpSubscribMessageCommand.Touser">
             <summary>
             鎺ユ敹鑰咃紙鐢ㄦ埛锛夌殑 openid
             </summary>
         </member>
-        <member name="P:ApiTools.Core.WxmpSendSubscribMessageCommand.Data">
+        <member name="P:ApiTools.Core.SendWxmpSubscribMessageCommand.Data">
             <summary>
             妯℃澘鍐呭锛屾牸寮忓舰濡倇 "phrase3": { "value": "瀹℃牳閫氳繃" }, "name1": { "value": "璁㈤槄" }, "date2": { "value": "2019-12-25 09:42" } }
             </summary>
@@ -3316,6 +3316,76 @@
         <member name="T:ApiTools.Core.WxmpSubscribMessageNotifyCommand">
             <summary>
             寰俊灏忕▼搴忚闃呮秷鎭�氱煡
+            </summary>
+        </member>
+        <member name="T:ApiTools.Core.GetWxmpSubscribMessageTemplatesQuery">
+            <summary>
+            鏌ヨ寰俊灏忕▼搴忚闃呮秷鎭ā鏉�
+            </summary>
+        </member>
+        <member name="P:ApiTools.Core.GetWxmpSubscribMessageTemplatesQuery.WxmpCode">
+            <summary>
+            灏忕▼搴忕紪鍙�
+            </summary>
+        </member>
+        <member name="T:ApiTools.Core.GetWxmpSubscribMessageTemplatesQueryResult">
+            <summary>
+            鏌ヨ寰俊灏忕▼搴忚闃呮秷鎭ā鏉�
+            </summary>
+        </member>
+        <member name="P:ApiTools.Core.GetWxmpSubscribMessageTemplatesQueryResult.Items">
+            <summary>
+            椤�
+            </summary>
+        </member>
+        <member name="T:ApiTools.Core.GetWxmpSubscribMessageTemplatesQueryResultData">
+            <summary>
+            寰俊灏忕▼搴忚幏鍙栬闃呮秷鎭ā鏉�
+            </summary>
+        </member>
+        <member name="P:ApiTools.Core.GetWxmpSubscribMessageTemplatesQueryResultData.TemplateId">
+            <summary>
+            娣诲姞鑷宠处鍙蜂笅鐨勬ā鏉� id锛屽彂閫佸皬绋嬪簭璁㈤槄娑堟伅鏃舵墍闇�
+            </summary>
+        </member>
+        <member name="P:ApiTools.Core.GetWxmpSubscribMessageTemplatesQueryResultData.Title">
+            <summary>
+            妯$増鏍囬
+            </summary>
+        </member>
+        <member name="P:ApiTools.Core.GetWxmpSubscribMessageTemplatesQueryResultData.Content">
+            <summary>
+            妯$増鍐呭
+            </summary>
+        </member>
+        <member name="P:ApiTools.Core.GetWxmpSubscribMessageTemplatesQueryResultData.Example">
+            <summary>
+            妯℃澘鍐呭绀轰緥
+            </summary>
+        </member>
+        <member name="P:ApiTools.Core.GetWxmpSubscribMessageTemplatesQueryResultData.Type">
+            <summary>
+            妯$増绫诲瀷锛�2 涓轰竴娆℃�ц闃咃紝3 涓洪暱鏈熻闃�
+            </summary>
+        </member>
+        <member name="P:ApiTools.Core.GetWxmpSubscribMessageTemplatesQueryResultData.Values">
+            <summary>
+            鏋氫妇鍙傛暟鍊艰寖鍥�
+            </summary>
+        </member>
+        <member name="T:ApiTools.Core.GetWxmpSubscribMessageTemplatesQueryResultDataValue">
+            <summary>
+            寰俊灏忕▼搴忚幏鍙栬闃呮秷鎭ā鏉�
+            </summary>
+        </member>
+        <member name="P:ApiTools.Core.GetWxmpSubscribMessageTemplatesQueryResultDataValue.Code">
+            <summary>
+            鏋氫妇鍙傛暟鐨� key
+            </summary>
+        </member>
+        <member name="P:ApiTools.Core.GetWxmpSubscribMessageTemplatesQueryResultDataValue.Values">
+            <summary>
+            鏋氫妇鍙傛暟鍊艰寖鍥村垪琛�
             </summary>
         </member>
         <member name="M:ApiTools.Core.BaseRepository`2.GetQueryable(System.Boolean)">
@@ -6899,6 +6969,86 @@
             </summary>
             <returns></returns>
         </member>
+        <member name="T:ApiTools.Core.GetWxmpSubscribMessageTemplatesRequest">
+            <summary>
+            寰俊灏忕▼搴忚幏鍙栬闃呮秷鎭ā鏉�
+            </summary>
+        </member>
+        <member name="P:ApiTools.Core.GetWxmpSubscribMessageTemplatesRequest.WxmpCode">
+            <summary>
+            灏忕▼搴忕紪鍙�
+            </summary>
+        </member>
+        <member name="T:ApiTools.Core.GetWxmpSubscribMessageTemplatesResponse">
+            <summary>
+            寰俊灏忕▼搴忚幏鍙栬闃呮秷鎭ā鏉�
+            </summary>
+        </member>
+        <member name="P:ApiTools.Core.GetWxmpSubscribMessageTemplatesResponse.ErrorCode">
+            <summary>
+            閿欒鐮�
+            </summary>
+        </member>
+        <member name="P:ApiTools.Core.GetWxmpSubscribMessageTemplatesResponse.ErrorMessage">
+            <summary>
+            閿欒淇℃伅
+            </summary>
+        </member>
+        <member name="P:ApiTools.Core.GetWxmpSubscribMessageTemplatesResponse.Items">
+            <summary>
+            妯℃澘鍒楄〃
+            </summary>
+        </member>
+        <member name="T:ApiTools.Core.GetWxmpSubscribMessageTemplatesResponseData">
+            <summary>
+            寰俊灏忕▼搴忚幏鍙栬闃呮秷鎭ā鏉�
+            </summary>
+        </member>
+        <member name="P:ApiTools.Core.GetWxmpSubscribMessageTemplatesResponseData.TemplateId">
+            <summary>
+            娣诲姞鑷宠处鍙蜂笅鐨勬ā鏉� id锛屽彂閫佸皬绋嬪簭璁㈤槄娑堟伅鏃舵墍闇�
+            </summary>
+        </member>
+        <member name="P:ApiTools.Core.GetWxmpSubscribMessageTemplatesResponseData.Title">
+            <summary>
+            妯$増鏍囬
+            </summary>
+        </member>
+        <member name="P:ApiTools.Core.GetWxmpSubscribMessageTemplatesResponseData.Content">
+            <summary>
+            妯$増鍐呭
+            </summary>
+        </member>
+        <member name="P:ApiTools.Core.GetWxmpSubscribMessageTemplatesResponseData.Example">
+            <summary>
+            妯℃澘鍐呭绀轰緥
+            </summary>
+        </member>
+        <member name="P:ApiTools.Core.GetWxmpSubscribMessageTemplatesResponseData.Type">
+            <summary>
+            妯$増绫诲瀷锛�2 涓轰竴娆℃�ц闃咃紝3 涓洪暱鏈熻闃�
+            </summary>
+        </member>
+        <member name="P:ApiTools.Core.GetWxmpSubscribMessageTemplatesResponseData.Values">
+            <summary>
+            鏋氫妇鍙傛暟鍊艰寖鍥�
+            </summary>
+        </member>
+        <member name="T:ApiTools.Core.GetWxmpSubscribMessageTemplatesResponseDataValue">
+            <summary>
+            寰俊灏忕▼搴忚幏鍙栬闃呮秷鎭ā鏉�
+            </summary>
+        </member>
+        <member name="P:ApiTools.Core.GetWxmpSubscribMessageTemplatesResponseDataValue.Code">
+            <summary>
+            鏋氫妇鍙傛暟鐨� key
+            </summary>
+        </member>
+        <member name="P:ApiTools.Core.GetWxmpSubscribMessageTemplatesResponseDataValue.Values">
+            <summary>
+            鏋氫妇鍙傛暟鍊艰寖鍥村垪琛�
+            </summary>
+        </member>
         <member name="T:ApiTools.Core.WxmpGetQrCodeCommand">
             <summary>
             灏忕▼搴忚幏鍙栦簩缁寸爜
@@ -7094,6 +7244,13 @@
             <param name="command"></param>
             <returns></returns>
         </member>
+        <member name="M:ApiTools.Core.WxmpUtils.GetWxmpSubscribMessageTemplate(ApiTools.Core.GetWxmpSubscribMessageTemplatesRequest)">
+            <summary>
+            鏌ヨ璁㈤槄娑堟伅妯℃澘
+            </summary>
+            <param name="command"></param>
+            <returns></returns>
+        </member>
         <member name="M:ApiTools.Core.WxmpUtils.WxmpSendSubscribMessage(ApiTools.Core.WxmpSendSubscribMessageRequest)">
             <summary>
             鍙戦�佽闃呮秷鎭�
diff --git a/ApiTools.Core/Enums/WxmpUtils/EnumWxmpSubscribMessageTemplate.cs b/ApiTools.Core/Enums/WxmpUtils/EnumWxmpSubscribMessageTemplate.cs
index 0fce40e..26d734e 100644
--- a/ApiTools.Core/Enums/WxmpUtils/EnumWxmpSubscribMessageTemplate.cs
+++ b/ApiTools.Core/Enums/WxmpUtils/EnumWxmpSubscribMessageTemplate.cs
@@ -31,5 +31,9 @@
         /// 鎺掔彮鎴愬姛閫氱煡  鎺掔彮鍚庡悜C绔汉鍛橀�氱煡
         /// </summary>
         ArrangeCompletedToUser,
+        /// <summary>
+        /// 娴嬭瘯
+        /// </summary>
+        Test,
     }
 }
diff --git a/ApiTools.Core/Models/WxmpUtils/Commands/WxmpSendSubscribMessageCommand.cs b/ApiTools.Core/Models/WxmpUtils/Commands/SendWxmpSubscribMessageCommand.cs
similarity index 88%
rename from ApiTools.Core/Models/WxmpUtils/Commands/WxmpSendSubscribMessageCommand.cs
rename to ApiTools.Core/Models/WxmpUtils/Commands/SendWxmpSubscribMessageCommand.cs
index b73c4bf..cbc2ac9 100644
--- a/ApiTools.Core/Models/WxmpUtils/Commands/WxmpSendSubscribMessageCommand.cs
+++ b/ApiTools.Core/Models/WxmpUtils/Commands/SendWxmpSubscribMessageCommand.cs
@@ -12,8 +12,8 @@
     /// <summary>
     /// 寰俊灏忕▼搴忓彂閫佽闃呮秷鎭�
     /// </summary>
-    [Resource([EnumResourceController.CommonServerWxmpUtils], Method = EnumResourceMethod.Post)]
-    public class WxmpSendSubscribMessageCommand : IRequest<Guid>
+    [Resource([EnumResourceController.CommonServerWxmpUtils])]
+    public class SendWxmpSubscribMessageCommand : IRequest<Guid>
     {
         /// <summary>
         /// 灏忕▼搴忕紪鍙�
diff --git a/ApiTools.Core/Models/WxmpUtils/Queries/GetWxmpSubscribMessageTemplatesQuery.cs b/ApiTools.Core/Models/WxmpUtils/Queries/GetWxmpSubscribMessageTemplatesQuery.cs
new file mode 100644
index 0000000..b2d48d5
--- /dev/null
+++ b/ApiTools.Core/Models/WxmpUtils/Queries/GetWxmpSubscribMessageTemplatesQuery.cs
@@ -0,0 +1,85 @@
+锘縰sing MediatR;
+using Newtonsoft.Json;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace ApiTools.Core
+{
+    /// <summary>
+    /// 鏌ヨ寰俊灏忕▼搴忚闃呮秷鎭ā鏉�
+    /// </summary>
+    [Resource([EnumResourceController.CommonServerWxmpUtils])]
+    public class GetWxmpSubscribMessageTemplatesQuery : IRequest<GetWxmpSubscribMessageTemplatesQueryResult>
+    {
+        /// <summary>
+        /// 灏忕▼搴忕紪鍙�
+        /// </summary>
+        public string WxmpCode { get; set; }
+    }
+
+    /// <summary>
+    /// 鏌ヨ寰俊灏忕▼搴忚闃呮秷鎭ā鏉�
+    /// </summary>
+    public class GetWxmpSubscribMessageTemplatesQueryResult
+    {
+        /// <summary>
+        /// 椤�
+        /// </summary>
+        public List<GetWxmpSubscribMessageTemplatesQueryResultData> Items { get; set; } = [];
+    }
+
+    /// <summary>
+    /// 寰俊灏忕▼搴忚幏鍙栬闃呮秷鎭ā鏉�
+    /// </summary>
+    public class GetWxmpSubscribMessageTemplatesQueryResultData
+    {
+        /// <summary>
+        /// 娣诲姞鑷宠处鍙蜂笅鐨勬ā鏉� id锛屽彂閫佸皬绋嬪簭璁㈤槄娑堟伅鏃舵墍闇�
+        /// </summary>
+        public string TemplateId { get; set; }
+
+        /// <summary>
+        /// 妯$増鏍囬
+        /// </summary>
+        public string Title { get; set; }
+
+        /// <summary>
+        /// 妯$増鍐呭
+        /// </summary>
+        public string Content { get; set; }
+
+        /// <summary>
+        /// 妯℃澘鍐呭绀轰緥
+        /// </summary>
+        public string Example { get; set; }
+
+        /// <summary>
+        /// 妯$増绫诲瀷锛�2 涓轰竴娆℃�ц闃咃紝3 涓洪暱鏈熻闃�
+        /// </summary>
+        public int Type { get; set; }
+
+        /// <summary>
+        /// 鏋氫妇鍙傛暟鍊艰寖鍥�
+        /// </summary>
+        public List<GetWxmpSubscribMessageTemplatesQueryResultDataValue> Values { get; set; } = [];
+    }
+
+    /// <summary>
+    /// 寰俊灏忕▼搴忚幏鍙栬闃呮秷鎭ā鏉�
+    /// </summary>
+    public class GetWxmpSubscribMessageTemplatesQueryResultDataValue
+    {
+        /// <summary>
+        /// 鏋氫妇鍙傛暟鐨� key
+        /// </summary>
+        public string Code { get; set; }
+
+        /// <summary>
+        /// 鏋氫妇鍙傛暟鍊艰寖鍥村垪琛�
+        /// </summary>
+        public List<string> Values { get; set; } = [];
+    }
+}
diff --git a/ApiTools.Core/Services/ChannelPingAnPayWalletService.cs b/ApiTools.Core/Services/ChannelPingAnPayWalletService.cs
index 628ecc6..a8909c3 100644
--- a/ApiTools.Core/Services/ChannelPingAnPayWalletService.cs
+++ b/ApiTools.Core/Services/ChannelPingAnPayWalletService.cs
@@ -69,7 +69,14 @@
         /// <returns></returns>
         public async Task Transfer(ChannelWallet wallet, ChannelWalletTransaction transaction)
         {
-            transaction.PingAnPay = new ChannelWalletTransactionPingAnPay();
+            transaction.PingAnPay = transaction.PingAnPay ?? new ChannelWalletTransactionPingAnPay();
+            if (transaction.ReceiveAccount == "123")
+            {
+                transaction.ErrorCode = "500";
+                transaction.FailReason = "鍗″彿閿欒";
+                transaction.TransactionStatus = EnumWalletTransactionStatus.Fail;
+                await channelWalletTransactionRepository.UpdateNowAsync(transaction);
+            }
             var responseStop = await utils.StopPaymentAndSettlementAccounts(new StopPaymentAndSettlementAccountsRequest
             {
                 CnsmrSeqNo = transaction.Code,
diff --git a/ApiTools.Core/Utils/WxmpUtils/GetWxmpSubscribMessageTemplatesRequest.cs b/ApiTools.Core/Utils/WxmpUtils/GetWxmpSubscribMessageTemplatesRequest.cs
new file mode 100644
index 0000000..1608ef5
--- /dev/null
+++ b/ApiTools.Core/Utils/WxmpUtils/GetWxmpSubscribMessageTemplatesRequest.cs
@@ -0,0 +1,104 @@
+锘縰sing Newtonsoft.Json;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace ApiTools.Core
+{
+    /// <summary>
+    /// 寰俊灏忕▼搴忚幏鍙栬闃呮秷鎭ā鏉�
+    /// </summary>
+    public class GetWxmpSubscribMessageTemplatesRequest
+    {
+        /// <summary>
+        /// 灏忕▼搴忕紪鍙�
+        /// </summary>
+        public string WxmpCode { get; set; }
+    }
+
+    /// <summary>
+    /// 寰俊灏忕▼搴忚幏鍙栬闃呮秷鎭ā鏉�
+    /// </summary>
+    public class GetWxmpSubscribMessageTemplatesResponse
+    {
+        /// <summary>
+        /// 閿欒鐮�
+        /// </summary>
+        [JsonProperty("errcode")]
+        public int ErrorCode { get; set; }
+
+        /// <summary>
+        /// 閿欒淇℃伅
+        /// </summary>
+        [JsonProperty("errmsg")]
+        public string ErrorMessage { get; set; }
+
+        /// <summary>
+        /// 妯℃澘鍒楄〃
+        /// </summary>
+        [JsonProperty("data")]
+        public List<GetWxmpSubscribMessageTemplatesResponseData> Items { get; set; } = [];
+    }
+
+    /// <summary>
+    /// 寰俊灏忕▼搴忚幏鍙栬闃呮秷鎭ā鏉�
+    /// </summary>
+    public class GetWxmpSubscribMessageTemplatesResponseData
+    {
+        /// <summary>
+        /// 娣诲姞鑷宠处鍙蜂笅鐨勬ā鏉� id锛屽彂閫佸皬绋嬪簭璁㈤槄娑堟伅鏃舵墍闇�
+        /// </summary>
+        [JsonProperty("priTmplId")]
+        public string TemplateId { get; set; }
+
+        /// <summary>
+        /// 妯$増鏍囬
+        /// </summary>
+        [JsonProperty("title")]
+        public string Title { get; set; }
+
+        /// <summary>
+        /// 妯$増鍐呭
+        /// </summary>
+        [JsonProperty("content")]
+        public string Content { get; set; }
+
+        /// <summary>
+        /// 妯℃澘鍐呭绀轰緥
+        /// </summary>
+        [JsonProperty("example")]
+        public string Example { get; set; }
+
+        /// <summary>
+        /// 妯$増绫诲瀷锛�2 涓轰竴娆℃�ц闃咃紝3 涓洪暱鏈熻闃�
+        /// </summary>
+        [JsonProperty("type")]
+        public int Type { get; set; }
+
+        /// <summary>
+        /// 鏋氫妇鍙傛暟鍊艰寖鍥�
+        /// </summary>
+        [JsonProperty("keywordEnumValueList")]
+        public List<GetWxmpSubscribMessageTemplatesResponseDataValue> Values { get; set; } = [];
+    }
+
+    /// <summary>
+    /// 寰俊灏忕▼搴忚幏鍙栬闃呮秷鎭ā鏉�
+    /// </summary>
+    public class GetWxmpSubscribMessageTemplatesResponseDataValue
+    {
+        /// <summary>
+        /// 鏋氫妇鍙傛暟鐨� key
+        /// </summary>
+        [JsonProperty("keywordCode")]
+        public string Code { get; set; }
+
+        /// <summary>
+        /// 鏋氫妇鍙傛暟鍊艰寖鍥村垪琛�
+        /// </summary>
+        [JsonProperty("enumValueList")]
+        public List<string> Values { get; set; } = [];
+    }
+}
diff --git a/ApiTools.Core/Utils/WxmpUtils/WxmpUtils.cs b/ApiTools.Core/Utils/WxmpUtils/WxmpUtils.cs
index ee4d5cc..33c360c 100644
--- a/ApiTools.Core/Utils/WxmpUtils/WxmpUtils.cs
+++ b/ApiTools.Core/Utils/WxmpUtils/WxmpUtils.cs
@@ -130,6 +130,27 @@
         }
 
         /// <summary>
+        /// 鏌ヨ璁㈤槄娑堟伅妯℃澘
+        /// </summary>
+        /// <param name="command"></param>
+        /// <returns></returns>
+        public async Task<GetWxmpSubscribMessageTemplatesResponse> GetWxmpSubscribMessageTemplate(GetWxmpSubscribMessageTemplatesRequest 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, "鍙戦�佽闃呮秷鎭け璐ワ紝缂哄け閰嶇疆锛歐xmpOptions");
+            var accessToken = await GetAccessToken(command.WxmpCode);
+            var jsonContent = JsonConvert.SerializeObject(command, new JsonSerializerSettings
+            {
+                NullValueHandling = NullValueHandling.Ignore
+            });
+            var response = await httpRemoteService.GetAsAsync<GetWxmpSubscribMessageTemplatesResponse>(
+                "https://api.weixin.qq.com/wxaapi/newtmpl/gettemplate",
+                builder => builder.WithQueryParameter("access_token", accessToken));
+            return response;
+        }
+
+        /// <summary>
         /// 鍙戦�佽闃呮秷鎭�
         /// </summary>
         /// <param name="command"></param>
diff --git a/ApiTools.Web.Entry/appsettings.json b/ApiTools.Web.Entry/appsettings.json
index a7b024e..54bb8df 100644
--- a/ApiTools.Web.Entry/appsettings.json
+++ b/ApiTools.Web.Entry/appsettings.json
@@ -51,6 +51,12 @@
         "AppId": "wx3669dd12a0915f7d",
         "AppSecret": "c03a62ad6822f1c925532c34183e7f7f",
         "EnvVersion": "trial"
+      },
+      {
+        "Code": "Public",
+        "AppId": "wxf940ff1d35a98493",
+        "AppSecret": "9a132eda735bc925200b0e215cffe20a",
+        "EnvVersion": "trial"
       }
     ],
     "SubscribMessageTemplates": {
@@ -78,6 +84,11 @@
       "ArrangeCompletedToUser": {
         "TemplateId": "dz2HCc-EnR4WEfsuj2GuduF8SLu40J83xez1bLLbaC0",
         "Page": "pages/home/index"
+      },
+      // 娴嬭瘯
+      "Test": {
+        "TemplateId": "T7Gta6H6TROZjcqeSWVTG2wWGGInWh0fGTOgCCgVBuk",
+        "Page": "pages/home/index"
       }
     }
   },

--
Gitblit v1.9.1