Ver Fonte

😉增加微信公众号消息推送相关接口

zuohuaijun há 2 anos atrás
pai
commit
0e790790c7

+ 58 - 0
Admin.NET/Admin.NET.Core/Service/Wechat/Dto/WechatInput.cs

@@ -9,6 +9,9 @@
 
 namespace Admin.NET.Core.Service;
 
+/// <summary>
+/// 生成网页授权Url
+/// </summary>
 public class GenAuthUrlInput
 {
     /// <summary>
@@ -22,6 +25,9 @@ public class GenAuthUrlInput
     public string Scope { get; set; }
 }
 
+/// <summary>
+/// 获取微信用户OpenId
+/// </summary>
 public class WechatOAuth2Input
 {
     /// <summary>
@@ -31,6 +37,9 @@ public class WechatOAuth2Input
     public string Code { get; set; }
 }
 
+/// <summary>
+/// 微信用户登录
+/// </summary>
 public class WechatUserLogin
 {
     /// <summary>
@@ -40,10 +49,59 @@ public class WechatUserLogin
     public string OpenId { get; set; }
 }
 
+/// <summary>
+/// 获取配置签名
+/// </summary>
 public class SignatureInput
 {
     /// <summary>
     /// Url
     /// </summary>
     public string Url { get; set; }
+}
+
+/// <summary>
+/// 获取消息模板列表
+/// </summary>
+public class MessageTemplateSendInput
+{
+    /// <summary>
+    /// 订阅模板Id
+    /// </summary>
+    [Required(ErrorMessage = "订阅模板Id不能为空")]
+    public string TemplateId { get; set; }
+
+    /// <summary>
+    /// 接收者的OpenId
+    /// </summary>
+    [Required(ErrorMessage = "接收者的OpenId不能为空")]
+    public string ToUserOpenId { get; set; }
+
+    /// <summary>
+    /// 模板数据,格式形如 { "key1": { "value": any }, "key2": { "value": any } }的object
+    /// </summary>
+    [Required(ErrorMessage = "模板内容不能为空")]
+    public Dictionary<string, CgibinMessageTemplateSendRequest.Types.DataItem> Data { get; set; }
+
+    /// <summary>
+    /// 模板跳转链接
+    /// </summary>
+    public string Url { get; set; }
+
+    /// <summary>
+    /// 所需跳转到小程序的具体页面路径,支持带参数,(示例index?foo=bar)
+    /// </summary>
+    public string MiniProgramPagePath { get; set; }
+}
+
+/// <summary>
+/// 删除消息模板
+/// </summary>
+public class DeleteMessageTemplateInput
+{
+    /// <summary>
+    /// 订阅模板Id
+    /// </summary>
+    [Required(ErrorMessage = "订阅模板Id不能为空")]
+    public string TemplateId { get; set; }
 }

+ 18 - 0
Admin.NET/Admin.NET.Core/Service/Wechat/Dto/WxOpenInput.cs

@@ -9,6 +9,9 @@
 
 namespace Admin.NET.Core.Service;
 
+/// <summary>
+/// 获取微信用户OpenId
+/// </summary>
 public class JsCode2SessionInput
 {
     /// <summary>
@@ -18,6 +21,9 @@ public class JsCode2SessionInput
     public string JsCode { get; set; }
 }
 
+/// <summary>
+/// 获取微信用户电话号码
+/// </summary>
 public class WxPhoneInput : WxOpenIdLoginInput
 {
     /// <summary>
@@ -27,6 +33,9 @@ public class WxPhoneInput : WxOpenIdLoginInput
     public string Code { get; set; }
 }
 
+/// <summary>
+/// 微信小程序登录
+/// </summary>
 public class WxOpenIdLoginInput
 {
     /// <summary>
@@ -36,6 +45,9 @@ public class WxOpenIdLoginInput
     public string OpenId { get; set; }
 }
 
+/// <summary>
+/// 微信手机号登录
+/// </summary>
 public class WxPhoneLoginInput
 {
     /// <summary>
@@ -45,6 +57,9 @@ public class WxPhoneLoginInput
     public string PhoneNumber { get; set; }
 }
 
+/// <summary>
+/// 发送订阅消息
+/// </summary>
 public class SendSubscribeMessageInput
 {
     /// <summary>
@@ -81,6 +96,9 @@ public class SendSubscribeMessageInput
     public string MiniProgramPagePath { get; set; }
 }
 
+/// <summary>
+/// 增加订阅消息模板
+/// </summary>
 public class AddSubscribeMessageTemplateInput
 {
     /// <summary>

+ 77 - 0
Admin.NET/Admin.NET.Core/Service/Wechat/SysWechatService.cs

@@ -17,12 +17,14 @@ public class SysWechatService : IDynamicApiController, ITransient
 {
     private readonly SqlSugarRepository<SysWechatUser> _sysWechatUserRep;
     private readonly WechatApiClient _wechatApiClient;
+    private readonly WechatApiHttpClient _wechatApiHttpClient;
 
     public SysWechatService(SqlSugarRepository<SysWechatUser> sysWechatUserRep,
         WechatApiHttpClient wechatApiHttpClient)
     {
         _sysWechatUserRep = sysWechatUserRep;
         _wechatApiClient = wechatApiHttpClient.CreateWechatClient();
+        _wechatApiHttpClient = wechatApiHttpClient;
     }
 
     /// <summary>
@@ -119,4 +121,79 @@ public class SysWechatService : IDynamicApiController, ITransient
             throw Oops.Oh(response.ErrorMessage);
         return _wechatApiClient.GenerateParametersForJSSDKConfig(response.Ticket, input.Url);
     }
+
+    /// <summary>
+    /// 获取模板列表
+    /// </summary>
+    [DisplayName("获取模板列表")]
+    public async Task<dynamic> GetMessageTemplateList()
+    {
+        var accessToken = await GetCgibinToken();
+        var reqTemplate = new CgibinTemplateGetAllPrivateTemplateRequest()
+        {
+            AccessToken = accessToken
+        };
+        var resTemplate = await _wechatApiClient.ExecuteCgibinTemplateGetAllPrivateTemplateAsync(reqTemplate);
+        if (resTemplate.ErrorCode != (int)WechatReturnCodeEnum.请求成功)
+            throw Oops.Oh(resTemplate.ErrorMessage + " " + resTemplate.ErrorCode);
+
+        return resTemplate.TemplateList;
+    }
+
+    /// <summary>
+    /// 发送模板消息
+    /// </summary>
+    /// <param name="input"></param>
+    /// <returns></returns>
+    [DisplayName("发送模板消息")]
+    public async Task<dynamic> SendTemplateMessage(MessageTemplateSendInput input)
+    {
+        var accessToken = await GetCgibinToken();
+        var reqMessage = new CgibinMessageTemplateSendRequest()
+        {
+            AccessToken = accessToken,
+            TemplateId = input.TemplateId,
+            ToUserOpenId = input.ToUserOpenId,
+            Url = input.Url,
+            MiniProgram = new CgibinMessageTemplateSendRequest.Types.MiniProgram
+            {
+                AppId = _wechatApiHttpClient._wechatOptions.WechatAppId,
+                PagePath = input.MiniProgramPagePath,
+            },
+            Data = input.Data
+        };
+        var resMessage = await _wechatApiClient.ExecuteCgibinMessageTemplateSendAsync(reqMessage);
+        return resMessage;
+    }
+
+    /// <summary>
+    /// 删除模板
+    /// </summary>
+    /// <param name="input"></param>
+    /// <returns></returns>
+    [ApiDescriptionSettings(Name = "DeleteMessageTemplate"), HttpPost]
+    [DisplayName("删除模板")]
+    public async Task<dynamic> DeleteMessageTemplate(DeleteMessageTemplateInput input)
+    {
+        var accessToken = await GetCgibinToken();
+        var reqMessage = new CgibinTemplateDeletePrivateTemplateRequest()
+        {
+            AccessToken = accessToken,
+            TemplateId = input.TemplateId
+        };
+        var resTemplate = await _wechatApiClient.ExecuteCgibinTemplateDeletePrivateTemplateAsync(reqMessage);
+        return resTemplate;
+    }
+
+    /// <summary>
+    /// 获取Access_token
+    /// </summary>
+    private async Task<string> GetCgibinToken()
+    {
+        var reqCgibinToken = new CgibinTokenRequest();
+        var resCgibinToken = await _wechatApiClient.ExecuteCgibinTokenAsync(reqCgibinToken);
+        if (resCgibinToken.ErrorCode != (int)WechatReturnCodeEnum.请求成功)
+            throw Oops.Oh(resCgibinToken.ErrorMessage + " " + resCgibinToken.ErrorCode);
+        return resCgibinToken.AccessToken;
+    }
 }

+ 1 - 1
Admin.NET/Admin.NET.Core/Service/Wechat/SysWxOpenService.cs

@@ -117,7 +117,7 @@ public class SysWxOpenService : IDynamicApiController, ITransient
     /// 获取订阅消息模板列表
     /// </summary>
     [DisplayName("获取订阅消息模板列表")]
-    public async Task<dynamic> GetSubscribeMessageTemplateList()
+    public async Task<dynamic> GetMessageTemplateList()
     {
         var accessToken = await GetCgibinToken();
         var reqTemplate = new WxaApiNewTemplateGetTemplateRequest()

+ 5 - 4
Admin.NET/Admin.NET.Web.Core/Startup.cs

@@ -67,7 +67,8 @@ public class Startup : AppStartup
             options.IgnorePropertyTypes = new[] { typeof(byte[]) };
         });
 
-        void SetJsonSetting(JsonSerializerSettings setting)
+        // Json序列化设置
+        static void SetNewtonsoftJsonSetting(JsonSerializerSettings setting)
         {
             setting.DateTimeZoneHandling = DateTimeZoneHandling.Local;
             setting.DateFormatString = "yyyy-MM-dd HH:mm:ss"; // 时间格式化
@@ -78,11 +79,11 @@ public class Startup : AppStartup
             // setting.MetadataPropertyHandling = MetadataPropertyHandling.Ignore; // 解决DateTimeOffset异常
             // setting.DateParseHandling = DateParseHandling.None; // 解决DateTimeOffset异常
             // setting.Converters.Add(new IsoDateTimeConverter { DateTimeStyles = DateTimeStyles.AssumeUniversal }); // 解决DateTimeOffset异常
-        }
+        };
 
         services.AddControllersWithViews()
             .AddAppLocalization()
-            .AddNewtonsoftJson(options => SetJsonSetting(options.SerializerSettings))
+            .AddNewtonsoftJson(options => SetNewtonsoftJsonSetting(options.SerializerSettings))
             //.AddXmlSerializerFormatters()
             //.AddXmlDataContractSerializerFormatters()
             .AddInjectWithUnifyResult<AdminResultProvider>();
@@ -161,7 +162,7 @@ public class Startup : AppStartup
             {
                 options.KeepAliveInterval = TimeSpan.FromSeconds(5);
             })
-            .AddNewtonsoftJsonProtocol(options => SetJsonSetting(options.PayloadSerializerSettings));
+            .AddNewtonsoftJsonProtocol(options => SetNewtonsoftJsonSetting(options.PayloadSerializerSettings));
 
         // logo显示
         services.AddLogoDisplay();