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