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" } } },