From 7881a30da4caf74b8fee54ce901b241c9ee03af5 Mon Sep 17 00:00:00 2001 From: colin Date: Sat, 6 Dec 2025 15:34:10 +0800 Subject: [PATCH] feat(wechat): Optimize the integration of wecom - Fix some errors --- .../ExternalProfileNewtonsoftJsonConverter.cs | 9 ++-- .../ExternalProfileSystemTextJsonConverter.cs | 8 ++- .../LINGYUN.Abp.WeChat.Work.Contacts.csproj | 2 + .../Response/WeChatWorkGetMemberResponse.cs | 2 + .../WeChatWorkTagChangeMemberRequest.cs | 8 +-- .../Json/MemberExternalAttributeConverter.cs | 49 +++++++++++++++++++ .../MemberExternalAttributeConverter.cs | 47 ++++++++++++++++++ ...hatWorkGetCustomerStrategyRangeResponse.cs | 1 - .../Approvals/Models/ControlConfigFactory.cs | 4 +- .../Work/OA/Approvals/Models/ControlData.cs | 6 +-- .../Approvals/Models/SelectorControlConfig.cs | 22 ++++----- .../Approvals/Models/SelectorControlValue.cs | 2 +- .../Request/WeChatWorkApplyEventRequest.cs | 4 +- .../WeChatWorkGetApprovalInfoRequest.cs | 6 +-- .../Json/ControlNewtonsoftJsonConverter.cs | 4 +- .../ControlSystemTextJsonConverter.cs | 2 +- .../IWeChatWorkAuthorizeGenerator.cs | 2 +- .../WeChat/Work/JsSdk/JsApiTicketHelper.cs | 8 +-- .../Work/Media/IWeChatWorkMediaProvider.cs | 8 +-- .../Models/WeChatWorkWebhookNewsMessage.cs | 2 +- .../Models/WeChatWorkWebhookTextMessage.cs | 2 +- .../Models/WebhookTemplateCardMessage.cs | 1 + 22 files changed, 154 insertions(+), 45 deletions(-) create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/Newtonsoft/Json/MemberExternalAttributeConverter.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/System/Text/Json/Serialization/MemberExternalAttributeConverter.cs diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Common/Newtonsoft/Json/ExternalProfileNewtonsoftJsonConverter.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Common/Newtonsoft/Json/ExternalProfileNewtonsoftJsonConverter.cs index 9e6f35e68..5da19c778 100644 --- a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Common/Newtonsoft/Json/ExternalProfileNewtonsoftJsonConverter.cs +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Common/Newtonsoft/Json/ExternalProfileNewtonsoftJsonConverter.cs @@ -59,9 +59,12 @@ internal class ExternalProfileNewtonsoftJsonConverter : JsonConverter(); - externalProfile.ExternalAttributes.Add( - ExternalAttributeDeserializeFactory.CreateExternalAttribute(type, externalAttrToken)); + var attributeType = typeToken.Value(); + if (Enum.IsDefined(typeof(ExternalAttributeType), attributeType)) + { + externalProfile.ExternalAttributes.Add( + ExternalAttributeDeserializeFactory.CreateExternalAttribute((ExternalAttributeType)attributeType, externalAttrToken)); + } } } } diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Common/System/Text/Json/Serialization/ExternalProfileSystemTextJsonConverter.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Common/System/Text/Json/Serialization/ExternalProfileSystemTextJsonConverter.cs index 16a1aa2c1..7df8dd7c0 100644 --- a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Common/System/Text/Json/Serialization/ExternalProfileSystemTextJsonConverter.cs +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Common/System/Text/Json/Serialization/ExternalProfileSystemTextJsonConverter.cs @@ -31,8 +31,12 @@ internal class ExternalProfileSystemTextJsonConverter : JsonConverter(); - externalProfile.ExternalAttributes.Add( - ExternalAttributeDeserializeFactory.CreateExternalAttribute(type, externalAttrElement)); + var attributeType = typeElement.GetInt32(); + if (Enum.IsDefined(typeof(ExternalAttributeType), attributeType)) + { + externalProfile.ExternalAttributes.Add( + ExternalAttributeDeserializeFactory.CreateExternalAttribute((ExternalAttributeType)attributeType, externalAttrElement)); + } } } } diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN.Abp.WeChat.Work.Contacts.csproj b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN.Abp.WeChat.Work.Contacts.csproj index 9c6642216..89d580b30 100644 --- a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN.Abp.WeChat.Work.Contacts.csproj +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN.Abp.WeChat.Work.Contacts.csproj @@ -12,6 +12,8 @@ false True enable + 9.3.6.3 + 9.3.6.3 diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Members/Response/WeChatWorkGetMemberResponse.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Members/Response/WeChatWorkGetMemberResponse.cs index 8590f0b29..e7edf1ac0 100644 --- a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Members/Response/WeChatWorkGetMemberResponse.cs +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Members/Response/WeChatWorkGetMemberResponse.cs @@ -159,6 +159,8 @@ public class WeChatWorkGetMemberResponse : WeChatWorkResponse [CanBeNull] [JsonProperty("extattr")] [JsonPropertyName("extattr")] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.MemberExternalAttributeConverter))] + [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Serialization.MemberExternalAttributeConverter))] public MemberExternalAttribute? ExternalAttribute { get; set; } /// /// 对外职务,如果设置了该值,则以此作为对外展示的职务,否则以position来展示。 diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Tags/Request/WeChatWorkTagChangeMemberRequest.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Tags/Request/WeChatWorkTagChangeMemberRequest.cs index 24c8cc67d..ffffe6fa9 100644 --- a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Tags/Request/WeChatWorkTagChangeMemberRequest.cs +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Tags/Request/WeChatWorkTagChangeMemberRequest.cs @@ -24,18 +24,18 @@ public class WeChatWorkTagChangeMemberRequest : WeChatWorkRequest [CanBeNull] [JsonProperty("userlist")] [JsonPropertyName("userlist")] - public List Users { get; set; } + public List? Users { get; set; } /// /// 企业部门ID列表,注意:userlist、partylist不能同时为空,单次请求个数不超过100 /// [CanBeNull] [JsonProperty("partylist")] [JsonPropertyName("partylist")] - public List Parts { get; set; } + public List? Parts { get; set; } public WeChatWorkTagChangeMemberRequest( int tagId, - List users = null, - List parts = null) + List? users = null, + List? parts = null) { TagId = Check.Positive(tagId, nameof(tagId)); Users = users; diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/Newtonsoft/Json/MemberExternalAttributeConverter.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/Newtonsoft/Json/MemberExternalAttributeConverter.cs new file mode 100644 index 000000000..585af4b8d --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/Newtonsoft/Json/MemberExternalAttributeConverter.cs @@ -0,0 +1,49 @@ +using LINGYUN.Abp.WeChat.Work.Contacts.Members.Models; +using Newtonsoft.Json.Linq; +using System; +using System.Collections.Generic; + +namespace Newtonsoft.Json; + +internal class MemberExternalAttributeConverter : JsonConverter +{ + public override MemberExternalAttribute? ReadJson(JsonReader reader, Type objectType, MemberExternalAttribute? existingValue, bool hasExistingValue, JsonSerializer serializer) + { + var jObject = JObject.Load(reader); + + var memberExternalAttribute = new MemberExternalAttribute(); + + if (jObject.TryGetValue("attrs", out var externalAttrsToken) && externalAttrsToken.Type == JTokenType.Array) + { + var attrs = new List(); + foreach (var externalAttrToken in externalAttrsToken) + { + var typeToken = externalAttrToken.SelectToken("type"); + if (typeToken != null) + { + var attributeType = typeToken.Value(); + if (Enum.IsDefined(typeof(AttributeType), attributeType)) + { + attrs.Add(MemberAttributeDeserializeFactory.CreateExternalAttribute((AttributeType)attributeType, externalAttrToken)); + } + } + } + memberExternalAttribute.Attributes = attrs.ToArray(); + } + + return memberExternalAttribute; + } + + public override void WriteJson(JsonWriter writer, MemberExternalAttribute? value, JsonSerializer serializer) + { + writer.WriteStartObject(); + + if (value != null) + { + writer.WritePropertyName("external_corp_name"); + serializer.Serialize(writer, value.Attributes); + } + + writer.WriteEndObject(); + } +} diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/System/Text/Json/Serialization/MemberExternalAttributeConverter.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/System/Text/Json/Serialization/MemberExternalAttributeConverter.cs new file mode 100644 index 000000000..6d49bd085 --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/System/Text/Json/Serialization/MemberExternalAttributeConverter.cs @@ -0,0 +1,47 @@ +using LINGYUN.Abp.WeChat.Work.Contacts.Members.Models; +using System.Collections.Generic; + +namespace System.Text.Json.Serialization; + +internal class MemberExternalAttributeConverter : JsonConverter +{ + public override MemberExternalAttribute? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) + { + using var doc = JsonDocument.ParseValue(ref reader); + var root = doc.RootElement; + + var memberExternalAttribute = new MemberExternalAttribute(); + + if (root.TryGetProperty("attrs", out var externalAttrsElement) && externalAttrsElement.ValueKind == JsonValueKind.Array) + { + var attrs = new List(); + foreach (var externalAttrElement in externalAttrsElement.EnumerateArray()) + { + if (externalAttrElement.TryGetProperty("type", out var typeElement) && typeElement.ValueKind != JsonValueKind.Null) + { + var attributeType = typeElement.GetInt32(); + if (Enum.IsDefined(typeof(AttributeType), attributeType)) + { + attrs.Add(MemberAttributeDeserializeFactory.CreateExternalAttribute((AttributeType)attributeType, externalAttrElement)); + } + } + } + memberExternalAttribute.Attributes = attrs.ToArray(); + } + + return memberExternalAttribute; + } + + public override void Write(Utf8JsonWriter writer, MemberExternalAttribute value, JsonSerializerOptions options) + { + writer.WriteStartObject(); + + if (value.Attributes != null) + { + writer.WritePropertyName("attrs"); + JsonSerializer.Serialize(writer, value.Attributes, value.Attributes.GetType(), options); + } + + writer.WriteEndObject(); + } +} diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.ExternalContact/LINGYUN/Abp/WeChat/Work/ExternalContact/Customers/Response/WeChatWorkGetCustomerStrategyRangeResponse.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.ExternalContact/LINGYUN/Abp/WeChat/Work/ExternalContact/Customers/Response/WeChatWorkGetCustomerStrategyRangeResponse.cs index 0c7c715cd..39ee4de11 100644 --- a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.ExternalContact/LINGYUN/Abp/WeChat/Work/ExternalContact/Customers/Response/WeChatWorkGetCustomerStrategyRangeResponse.cs +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.ExternalContact/LINGYUN/Abp/WeChat/Work/ExternalContact/Customers/Response/WeChatWorkGetCustomerStrategyRangeResponse.cs @@ -8,7 +8,6 @@ namespace LINGYUN.Abp.WeChat.Work.ExternalContact.Customers.Response; /// 获取规则组管理范围响应参数 /// /// -/// /// 详情见: /// public class WeChatWorkGetCustomerStrategyRangeResponse : WeChatWorkResponse diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Models/ControlConfigFactory.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Models/ControlConfigFactory.cs index e4c89f680..a5795ca1d 100644 --- a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Models/ControlConfigFactory.cs +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Models/ControlConfigFactory.cs @@ -7,7 +7,7 @@ internal static class ControlConfigFactory /// /// 根据控件类型创建配置(System.Text.Json) /// - public static ControlConfig CreateConfig(string controlType, JsonElement configElement) + public static ControlConfig? CreateConfig(string controlType, JsonElement configElement) { return controlType switch { @@ -29,7 +29,7 @@ internal static class ControlConfigFactory /// /// 根据控件类型创建配置(Newtonsoft.Json) /// - public static ControlConfig CreateConfig(string controlType, JToken configToken) + public static ControlConfig? CreateConfig(string controlType, JToken configToken) { return controlType switch { diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Models/ControlData.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Models/ControlData.cs index 008d0c527..629d75439 100644 --- a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Models/ControlData.cs +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Models/ControlData.cs @@ -44,16 +44,16 @@ public class ControlData /// /// 模板配置的控件属性为必填时,对应value值需要有值。 /// - [NotNull] + [CanBeNull] [JsonProperty("value")] [JsonPropertyName("value")] - public ControlValue Value { get; set; } + public ControlValue? Value { get; set; } public ControlData() { } - private ControlData(string id, string control, ControlValue value) + private ControlData(string id, string control, ControlValue? value = null) { Id = id; Control = control; diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Models/SelectorControlConfig.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Models/SelectorControlConfig.cs index b0cee99c2..993a258ad 100644 --- a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Models/SelectorControlConfig.cs +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Models/SelectorControlConfig.cs @@ -39,24 +39,24 @@ public class SelectorConfig /// /// 多选选项,多选属性的选择控件允许输入多个 /// - [NotNull] + [CanBeNull] [JsonProperty("options")] [JsonPropertyName("options")] public List Options { get; set; } /// /// 关联控件 /// - [NotNull] + [CanBeNull] [JsonProperty("op_relations")] [JsonPropertyName("op_relations")] - public List OptionRelations { get; set; } + public List? OptionRelations { get; set; } /// /// 关联外部选项 /// - [NotNull] + [CanBeNull] [JsonProperty("external_option")] [JsonPropertyName("external_option")] - public SelectorOptionExternal ExternalOption { get; set; } + public SelectorOptionExternal? ExternalOption { get; set; } public SelectorConfig() { @@ -65,8 +65,8 @@ public class SelectorConfig private SelectorConfig( string type, List options, - List optionRelations = null, - SelectorOptionExternal optionExternal = null) + List? optionRelations = null, + SelectorOptionExternal? optionExternal = null) { Type = type; Options = options; @@ -76,16 +76,16 @@ public class SelectorConfig public static SelectorConfig Single( List options, - List optionRelations = null, - SelectorOptionExternal optionExternal = null) + List? optionRelations = null, + SelectorOptionExternal? optionExternal = null) { return new SelectorConfig("single", options, optionRelations, optionExternal); } public static SelectorConfig Multiple( List options, - List optionRelations = null, - SelectorOptionExternal optionExternal = null) + List? optionRelations = null, + SelectorOptionExternal? optionExternal = null) { return new SelectorConfig("multi", options, optionRelations, optionExternal); } diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Models/SelectorControlValue.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Models/SelectorControlValue.cs index 44c37ad30..458c3e7cb 100644 --- a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Models/SelectorControlValue.cs +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Models/SelectorControlValue.cs @@ -67,7 +67,7 @@ public class SelectorValue /// /// 创建一个多选选项 /// - /// + /// /// public static SelectorValue Multiple(List options) { diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Request/WeChatWorkApplyEventRequest.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Request/WeChatWorkApplyEventRequest.cs index 3fcdcbdf8..47206978c 100644 --- a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Request/WeChatWorkApplyEventRequest.cs +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Request/WeChatWorkApplyEventRequest.cs @@ -22,7 +22,7 @@ public class WeChatWorkApplyEventRequest : WeChatWorkRequest [CanBeNull] [JsonProperty("process")] [JsonPropertyName("process")] - public ApprovalApplyProcess Process { get; set; } + public ApprovalApplyProcess? Process { get; set; } /// /// 摘要信息,用于显示在审批通知卡片、审批列表的摘要信息,最多3行 /// @@ -82,7 +82,7 @@ public class WeChatWorkApplyEventRequest : WeChatWorkRequest string templateId, string creatorUserid, ApprovalApplyData applyData, - ApprovalApplyProcess process = null, + ApprovalApplyProcess? process = null, byte? chooseDepartment = null) { TemplateId = templateId; diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Request/WeChatWorkGetApprovalInfoRequest.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Request/WeChatWorkGetApprovalInfoRequest.cs index cd4770dc0..59da60fbf 100644 --- a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Request/WeChatWorkGetApprovalInfoRequest.cs +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Request/WeChatWorkGetApprovalInfoRequest.cs @@ -34,7 +34,7 @@ public class WeChatWorkGetApprovalInfoRequest : WeChatWorkRequest [CanBeNull] [JsonProperty("new_cursor")] [JsonPropertyName("new_cursor")] - public string NewCursor { get; set; } = ""; + public string? NewCursor { get; set; } = ""; /// /// 一次请求拉取审批单数量,默认值为100,上限值为100。 /// 若accesstoken为自建应用,仅允许获取在应用可见范围内申请人提交的表单,返回的sp_no_list个数可能和size不一致,开发者需用next_cursor判断表单记录是否拉取完 @@ -49,12 +49,12 @@ public class WeChatWorkGetApprovalInfoRequest : WeChatWorkRequest [CanBeNull] [JsonProperty("filters")] [JsonPropertyName("filters")] - public List Filters { get; set; } + public List? Filters { get; set; } public WeChatWorkGetApprovalInfoRequest( long sartTime, long endTime, int size = 100, - List filters = null) + List? filters = null) { StartTime = sartTime; EndTime = endTime; diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/Newtonsoft/Json/ControlNewtonsoftJsonConverter.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/Newtonsoft/Json/ControlNewtonsoftJsonConverter.cs index 07f6412a8..9135a3e0f 100644 --- a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/Newtonsoft/Json/ControlNewtonsoftJsonConverter.cs +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/Newtonsoft/Json/ControlNewtonsoftJsonConverter.cs @@ -26,7 +26,7 @@ internal class ControlNewtonsoftJsonConverter : JsonConverter writer.WriteEndObject(); } - public override Control? ReadJson(JsonReader reader, Type objectType, Control existingValue, bool hasExistingValue, JsonSerializer serializer) + public override Control? ReadJson(JsonReader reader, Type objectType, Control? existingValue, bool hasExistingValue, JsonSerializer serializer) { var jObject = JObject.Load(reader); @@ -39,7 +39,7 @@ internal class ControlNewtonsoftJsonConverter : JsonConverter // 根据 Control 类型动态反序列化 Config if (jObject.TryGetValue("config", out var configToken) && configToken.Type != JTokenType.Null) { - control.Config = ControlConfigFactory.CreateConfig(control.Property.Control, configToken); + control.Config = ControlConfigFactory.CreateConfig(control.Property.Control, configToken)!; } return control; diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/System/Text/Json/Serialization/ControlSystemTextJsonConverter.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/System/Text/Json/Serialization/ControlSystemTextJsonConverter.cs index d65db5da0..989a9ca1e 100644 --- a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/System/Text/Json/Serialization/ControlSystemTextJsonConverter.cs +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/System/Text/Json/Serialization/ControlSystemTextJsonConverter.cs @@ -18,7 +18,7 @@ internal class ControlSystemTextJsonConverter : JsonConverter // 根据 Control 类型动态反序列化 Config if (root.TryGetProperty("config", out var configElement) && configElement.ValueKind != JsonValueKind.Null) { - control.Config = ControlConfigFactory.CreateConfig(control.Property.Control, configElement); + control.Config = ControlConfigFactory.CreateConfig(control.Property.Control, configElement)!; } return control; diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Authorize/IWeChatWorkAuthorizeGenerator.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Authorize/IWeChatWorkAuthorizeGenerator.cs index 121915242..4e999786b 100644 --- a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Authorize/IWeChatWorkAuthorizeGenerator.cs +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Authorize/IWeChatWorkAuthorizeGenerator.cs @@ -7,7 +7,7 @@ public interface IWeChatWorkAuthorizeGenerator /// 构造网页授权链接 /// /// - /// 参考:https://developer.work.weixin.qq.com/document/path/91022 + /// 参考: /// /// /// diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/JsSdk/JsApiTicketHelper.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/JsSdk/JsApiTicketHelper.cs index f600da4fc..50af73f28 100644 --- a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/JsSdk/JsApiTicketHelper.cs +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/JsSdk/JsApiTicketHelper.cs @@ -44,10 +44,12 @@ public static class JsApiTicketHelper } /// /// 生成JS-SDK签名 - /// See: https://developer.work.weixin.qq.com/document/path/90506 + /// See: /// - /// - /// + /// 企业 jsapi_ticket + /// 随机字符串 + /// 当前时间戳,单位为秒 + /// 当前页面的 URL,不包含“#”及后面部分 /// public static string GenerateSignature( string jsapiTicket, diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Media/IWeChatWorkMediaProvider.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Media/IWeChatWorkMediaProvider.cs index bd14b3779..a4b0ddc70 100644 --- a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Media/IWeChatWorkMediaProvider.cs +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Media/IWeChatWorkMediaProvider.cs @@ -8,7 +8,7 @@ namespace LINGYUN.Abp.WeChat.Work.Media; /// 素材管理接口 /// /// -/// API: +/// API: /// public interface IWeChatWorkMediaProvider { @@ -16,7 +16,7 @@ public interface IWeChatWorkMediaProvider /// 上传临时素材 /// /// - /// API: + /// API: /// /// 媒体文件类型 /// 待上传文件 @@ -30,7 +30,7 @@ public interface IWeChatWorkMediaProvider /// 获取临时素材 /// /// - /// API: + /// API: /// /// 媒体文件id /// @@ -43,7 +43,7 @@ public interface IWeChatWorkMediaProvider /// 上传图片 /// /// - /// API: + /// API: /// /// 待上传图片 /// diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Messages/Models/WeChatWorkWebhookNewsMessage.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Messages/Models/WeChatWorkWebhookNewsMessage.cs index c0b7a6c83..56e065431 100644 --- a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Messages/Models/WeChatWorkWebhookNewsMessage.cs +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Messages/Models/WeChatWorkWebhookNewsMessage.cs @@ -18,7 +18,7 @@ internal class WeChatWorkWebhookNewsMessage : WeChatWorkWebhookMessage /// /// 创建一个企业微信Webhook图文消息 /// - /// 图文消息体 + /// 图文消息体 public WeChatWorkWebhookNewsMessage(WebhookNewsMessage news) : base("news") { diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Messages/Models/WeChatWorkWebhookTextMessage.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Messages/Models/WeChatWorkWebhookTextMessage.cs index 48676d4a1..81c4be101 100644 --- a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Messages/Models/WeChatWorkWebhookTextMessage.cs +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Messages/Models/WeChatWorkWebhookTextMessage.cs @@ -18,7 +18,7 @@ public class WeChatWorkWebhookTextMessage : WeChatWorkWebhookMessage /// /// 创建一个企业微信Webhook文本消息 /// - /// 文本消息体 + /// 文本消息体 public WeChatWorkWebhookTextMessage(WebhookTextMessage text) : base("text") { diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Messages/Models/WebhookTemplateCardMessage.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Messages/Models/WebhookTemplateCardMessage.cs index ef801dde8..83c279e37 100644 --- a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Messages/Models/WebhookTemplateCardMessage.cs +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Messages/Models/WebhookTemplateCardMessage.cs @@ -63,6 +63,7 @@ public abstract class WebhookTemplateCardMessage /// /// 创建一个Webhook模板卡片消息体 /// + /// 模版卡片的模版类型 /// 整体卡片的点击跳转事件 /// 模版卡片的主要内容 /// 卡片来源样式信息