sunpengfei
2025-11-21 8d9adc809cee12d16caf9854ada2e7d030a5f4b4
feat:开发
10个文件已修改
1 文件已重命名
3个文件已添加
464 ■■■■■ 已修改文件
ApiTools.Application/ApiTools.Application.csproj 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ApiTools.Application/ApiTools.Application.xml 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ApiTools.Application/ChannelWallets/Commands/ChannelWalletCommandHandler.cs 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ApiTools.Application/WxUtils/Commands/WxmpSubscribMessageCommandHandler.cs 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ApiTools.Application/WxUtils/Queries/WxmpSubscribMessageQueryHandler.cs 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ApiTools.Core/ApiTools.Core.csproj 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ApiTools.Core/ApiTools.Core.xml 169 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ApiTools.Core/Enums/WxmpUtils/EnumWxmpSubscribMessageTemplate.cs 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ApiTools.Core/Models/WxmpUtils/Commands/SendWxmpSubscribMessageCommand.cs 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ApiTools.Core/Models/WxmpUtils/Queries/GetWxmpSubscribMessageTemplatesQuery.cs 85 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ApiTools.Core/Services/ChannelPingAnPayWalletService.cs 9 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ApiTools.Core/Utils/WxmpUtils/GetWxmpSubscribMessageTemplatesRequest.cs 104 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ApiTools.Core/Utils/WxmpUtils/WxmpUtils.cs 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ApiTools.Web.Entry/appsettings.json 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ApiTools.Application/ApiTools.Application.csproj
@@ -16,8 +16,4 @@
        <ProjectReference Include="..\ApiTools.Core\ApiTools.Core.csproj" />
    </ItemGroup>
    <ItemGroup>
      <Folder Include="WxUtils\Queries\" />
    </ItemGroup>
</Project>
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>
            保存短信配置
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)
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
            {
ApiTools.Application/WxUtils/Queries/WxmpSubscribMessageQueryHandler.cs
New file
@@ -0,0 +1,34 @@
using 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>();
        }
    }
}
ApiTools.Core/ApiTools.Core.csproj
@@ -39,8 +39,4 @@
      </None>
    </ItemGroup>
    <ItemGroup>
      <Folder Include="Models\WxmpUtils\Queries\" />
    </ItemGroup>
</Project>
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>
            所需下发的订阅模板id
            </summary>
        </member>
        <member name="P:ApiTools.Core.WxmpSendSubscribMessageCommand.Page">
        <member name="P:ApiTools.Core.SendWxmpSubscribMessageCommand.Page">
            <summary>
            点击模板卡片后的跳转页面,仅限本小程序内的页面。支持带参数,(示例index?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>
            发送订阅消息
ApiTools.Core/Enums/WxmpUtils/EnumWxmpSubscribMessageTemplate.cs
@@ -31,5 +31,9 @@
        /// 排班成功通知  排班后向C端人员通知
        /// </summary>
        ArrangeCompletedToUser,
        /// <summary>
        /// 测试
        /// </summary>
        Test,
    }
}
ApiTools.Core/Models/WxmpUtils/Commands/SendWxmpSubscribMessageCommand.cs
File was renamed from ApiTools.Core/Models/WxmpUtils/Commands/WxmpSendSubscribMessageCommand.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>
        /// 小程序编号
ApiTools.Core/Models/WxmpUtils/Queries/GetWxmpSubscribMessageTemplatesQuery.cs
New file
@@ -0,0 +1,85 @@
using 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; } = [];
    }
}
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,
ApiTools.Core/Utils/WxmpUtils/GetWxmpSubscribMessageTemplatesRequest.cs
New file
@@ -0,0 +1,104 @@
using 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; } = [];
    }
}
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, "发送订阅消息失败,缺失配置:WxmpOptions");
            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>
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"
      }
    }
  },