From 5650e3be25c3237bbcbfc92b38d3180691d1cc38 Mon Sep 17 00:00:00 2001 From: Fu Diwei Date: Fri, 21 Jan 2022 16:57:42 +0800 Subject: [PATCH] =?UTF-8?q?feat(wxapi):=20=E5=8D=87=E7=BA=A7=E5=85=AC?= =?UTF-8?q?=E5=85=B1=E7=BB=84=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...extualStringArrayWithPipeSplitConverter.cs | 47 ++++ ...StringArrayWithSemicolonSplitConverter.cs} | 14 +- ...TextualStringListWithPipeSplitConverter.cs | 39 ++++ ...alStringListWithSemicolonSplitConverter.cs | 39 ++++ ...xtualStringArrayWithPipeSplitConverter.cs} | 19 +- ...StringArrayWithSemicolonSplitConverter.cs} | 10 +- ...TextualStringListWithPipeSplitConverter.cs | 38 ++++ ...alStringListWithSemicolonSplitConverter.cs | 38 ++++ ...extualStringArrayWithSemicolonConverter.cs | 31 --- .../List[int]/TextualInt32IListConverter.cs | 42 ---- .../List[int]/TextualInt32ListConverter.cs | 52 ----- ...extualStringIListWithSemicolonConverter.cs | 42 ---- ...extualStringArrayWithSemicolonConverter.cs | 21 -- .../List[int]/TextualInt32IListConverter.cs | 32 --- ...extualStringIListWithSemicolonConverter.cs | 21 -- ...atApiClientExecuteCgibinMidasExtensions.cs | 2 +- ...ibinComponentModifyWxaJumpDomainRequest.cs | 4 +- ...binComponentModifyWxaJumpDomainResponse.cs | 12 +- ...inComponentModifyWxaServerDomainRequest.cs | 4 +- ...nComponentModifyWxaServerDomainResponse.cs | 12 +- ...binExpressBusinessPrinterGetAllResponse.cs | 2 +- ...ibinExpressBusinessPrinterUpdateRequest.cs | 6 +- ...inExpressDeliveryTemplatePreviewRequest.cs | 8 +- .../Models/Tcb/TcbGetOpenDataResponse.cs | 3 +- .../Order/UnionPromoterOrderInfoResponse.cs | 16 +- .../UnionPromoterTargetPlanInfoResponse.cs | 3 +- .../Wxa/NearybyPOI/WxaAddNearbyPOIRequest.cs | 204 ++---------------- .../ServiceMarket/WxaServiceMarketRequest.cs | 3 +- .../Models/Wxa/WxaStore/WxaAddStoreRequest.cs | 68 +----- .../Wxa/WxaStore/WxaUpdateStoreRequest.cs | 68 +----- .../WxaApiLogGetPerformanceResponse.cs | 68 +----- .../Code/WxaSubmitAuditRequest.cs | 75 +------ src/SKIT.FlurlHttpClient.Wechat.Api/README.md | 25 +++ .../SKIT.FlurlHttpClient.Wechat.Api.csproj | 21 +- .../Utilities/AESUtility.cs | 3 + .../{HMACSHA256Utility.cs => HMACUtility.cs} | 14 +- .../Utilities/SHA1Utility.cs | 4 +- ...lurlHttpClient.Wechat.Api.UnitTests.csproj | 5 +- .../TestCase_AESUtilityTests.cs | 21 ++ ...Tests.cs => TestCase_ApiExecuteCVTests.cs} | 18 +- ...TestCase_ApiExecuteCgibinMaterialTests.cs} | 10 +- ...=> TestCase_ApiExecuteCgibinMediaTests.cs} | 14 +- ...tCase_ApiExecuteCgibinMessageMassTests.cs} | 18 +- ...> TestCase_ApiExecuteCgibinQrcodeTests.cs} | 6 +- ... => TestCase_ApiExecuteCgibinTagsTests.cs} | 10 +- ...s.cs => TestCase_ApiExecuteCgibinTests.cs} | 22 +- ... => TestCase_ApiExecuteCgibinUserTests.cs} | 18 +- ...cs => TestCase_ApiExecuteSemanticTests.cs} | 6 +- ...Case_ApiExecuteSnsWithAccessTokenTests.cs} | 10 +- ...stCase_ApiExecuteSnsWithAppSecretTests.cs} | 14 +- ...s.cs => TestCase_ApiExecuteWxaApiTests.cs} | 14 +- ...ests.cs => TestCase_CodeReviewAnalyzer.cs} | 32 +-- ...TestCase_DeliveryRequestSignatureTests.cs} | 6 +- ... => TestCase_EventDeserializationTests.cs} | 10 +- ....cs => TestCase_EventVerificationTests.cs} | 6 +- .../TestCase_HashUtilityTests.cs | 31 +++ ...=> TestCase_MidasRequestSignatureTests.cs} | 6 +- ...> TestCase_WxBizMsgCryptorUtilityTests.cs} | 10 +- .../TestConfigs.cs | 17 +- .../WechatApiSecurityTests.cs | 44 ---- .../TestCase_AesUtilityTests.cs | 2 +- .../TestCase_RsaUtilityTests.cs | 2 +- 62 files changed, 523 insertions(+), 939 deletions(-) create mode 100644 src/SKIT.FlurlHttpClient.Wechat.Api/Converters/Internal/Newtonsoft.Json/Array[String]/TextualStringArrayWithPipeSplitConverter.cs rename src/SKIT.FlurlHttpClient.Wechat.Api/Converters/{Newtonsoft.Json/List[string]/TextualStringListWithSemicolonConverter.cs => Internal/Newtonsoft.Json/Array[String]/TextualStringArrayWithSemicolonSplitConverter.cs} (58%) create mode 100644 src/SKIT.FlurlHttpClient.Wechat.Api/Converters/Internal/Newtonsoft.Json/List[String]/TextualStringListWithPipeSplitConverter.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.Api/Converters/Internal/Newtonsoft.Json/List[String]/TextualStringListWithSemicolonSplitConverter.cs rename src/SKIT.FlurlHttpClient.Wechat.Api/Converters/{System.Text.Json/List[int]/TextualInt32ListConverter.cs => Internal/System.Text.Json/Array[String]/TextualStringArrayWithPipeSplitConverter.cs} (50%) rename src/SKIT.FlurlHttpClient.Wechat.Api/Converters/{System.Text.Json/List[string]/TextualStringListWithSemicolonConverter.cs => Internal/System.Text.Json/Array[String]/TextualStringArrayWithSemicolonSplitConverter.cs} (60%) create mode 100644 src/SKIT.FlurlHttpClient.Wechat.Api/Converters/Internal/System.Text.Json/List[String]/TextualStringListWithPipeSplitConverter.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.Api/Converters/Internal/System.Text.Json/List[String]/TextualStringListWithSemicolonSplitConverter.cs delete mode 100644 src/SKIT.FlurlHttpClient.Wechat.Api/Converters/Newtonsoft.Json/Array[string]/TextualStringArrayWithSemicolonConverter.cs delete mode 100644 src/SKIT.FlurlHttpClient.Wechat.Api/Converters/Newtonsoft.Json/List[int]/TextualInt32IListConverter.cs delete mode 100644 src/SKIT.FlurlHttpClient.Wechat.Api/Converters/Newtonsoft.Json/List[int]/TextualInt32ListConverter.cs delete mode 100644 src/SKIT.FlurlHttpClient.Wechat.Api/Converters/Newtonsoft.Json/List[string]/TextualStringIListWithSemicolonConverter.cs delete mode 100644 src/SKIT.FlurlHttpClient.Wechat.Api/Converters/System.Text.Json/Array[string]/TextualStringArrayWithSemicolonConverter.cs delete mode 100644 src/SKIT.FlurlHttpClient.Wechat.Api/Converters/System.Text.Json/List[int]/TextualInt32IListConverter.cs delete mode 100644 src/SKIT.FlurlHttpClient.Wechat.Api/Converters/System.Text.Json/List[string]/TextualStringIListWithSemicolonConverter.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.Api/README.md rename src/SKIT.FlurlHttpClient.Wechat.Api/Utilities/{HMACSHA256Utility.cs => HMACUtility.cs} (77%) create mode 100644 test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/TestCase_AESUtilityTests.cs rename test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/{WechatApiExecuteCVTests.cs => TestCase_ApiExecuteCVTests.cs} (93%) rename test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/{WechatApiExecuteCgibinMaterialTests.cs => TestCase_ApiExecuteCgibinMaterialTests.cs} (75%) rename test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/{WechatApiExecuteCgibinMediaTests.cs => TestCase_ApiExecuteCgibinMediaTests.cs} (90%) rename test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/{WechatApiExecuteCgibinMessageMassTests.cs => TestCase_ApiExecuteCgibinMessageMassTests.cs} (76%) rename test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/{WechatApiExecuteCgibinQrcodeTests.cs => TestCase_ApiExecuteCgibinQrcodeTests.cs} (82%) rename test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/{WechatApiExecuteCgibinTagsTests.cs => TestCase_ApiExecuteCgibinTagsTests.cs} (77%) rename test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/{WechatApiExecuteCgibinTests.cs => TestCase_ApiExecuteCgibinTests.cs} (68%) rename test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/{WechatApiExecuteCgibinUserTests.cs => TestCase_ApiExecuteCgibinUserTests.cs} (77%) rename test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/{WechatApiExecuteSemanticTests.cs => TestCase_ApiExecuteSemanticTests.cs} (82%) rename test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/{WechatApiExecuteSnsWithAccessTokenTests.cs => TestCase_ApiExecuteSnsWithAccessTokenTests.cs} (74%) rename test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/{WechatApiExecuteSnsWithAppSecretTests.cs => TestCase_ApiExecuteSnsWithAppSecretTests.cs} (72%) rename test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/{WechatApiExecuteWxaApiTests.cs => TestCase_ApiExecuteWxaApiTests.cs} (76%) rename test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/{WechatApiDeclarationTests.cs => TestCase_CodeReviewAnalyzer.cs} (51%) rename test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/{WechatApiExecuteCgibinExpressTests.cs => TestCase_DeliveryRequestSignatureTests.cs} (82%) rename test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/{WechatApiEventDeserializationTests.cs => TestCase_EventDeserializationTests.cs} (84%) rename test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/{WechatApiEventVerificationTests.cs => TestCase_EventVerificationTests.cs} (91%) create mode 100644 test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/TestCase_HashUtilityTests.cs rename test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/{WechatApiExecuteCgibinMidasTests.cs => TestCase_MidasRequestSignatureTests.cs} (84%) rename test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/{WechatApiWxBizMsgCryptorTests.cs => TestCase_WxBizMsgCryptorUtilityTests.cs} (90%) delete mode 100644 test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/WechatApiSecurityTests.cs diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Converters/Internal/Newtonsoft.Json/Array[String]/TextualStringArrayWithPipeSplitConverter.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Converters/Internal/Newtonsoft.Json/Array[String]/TextualStringArrayWithPipeSplitConverter.cs new file mode 100644 index 00000000..b188a8a0 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Converters/Internal/Newtonsoft.Json/Array[String]/TextualStringArrayWithPipeSplitConverter.cs @@ -0,0 +1,47 @@ +using System; +using System.Collections.Generic; +using System.Linq; + +namespace Newtonsoft.Json.Converters +{ + internal class TextualStringArrayWithPipeSplitConverter : JsonConverter + { + public override bool CanRead + { + get { return true; } + } + + public override bool CanWrite + { + get { return true; } + } + + public override string[]? ReadJson(JsonReader reader, Type objectType, string[]? existingValue, bool hasExistingValue, JsonSerializer serializer) + { + if (reader.TokenType == JsonToken.Null) + { + return null; + } + else if (reader.TokenType == JsonToken.String) + { + string? value = serializer.Deserialize(reader); + if (value == null) + return null; + if (string.IsNullOrEmpty(value)) + return Array.Empty(); + + return value.Split('|'); + } + + throw new JsonSerializationException(); + } + + public override void WriteJson(JsonWriter writer, string[]? value, JsonSerializer serializer) + { + if (value != null) + writer.WriteValue(string.Join("|", value)); + else + writer.WriteNull(); + } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Converters/Newtonsoft.Json/List[string]/TextualStringListWithSemicolonConverter.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Converters/Internal/Newtonsoft.Json/Array[String]/TextualStringArrayWithSemicolonSplitConverter.cs similarity index 58% rename from src/SKIT.FlurlHttpClient.Wechat.Api/Converters/Newtonsoft.Json/List[string]/TextualStringListWithSemicolonConverter.cs rename to src/SKIT.FlurlHttpClient.Wechat.Api/Converters/Internal/Newtonsoft.Json/Array[String]/TextualStringArrayWithSemicolonSplitConverter.cs index f804f89f..d1486db0 100644 --- a/src/SKIT.FlurlHttpClient.Wechat.Api/Converters/Newtonsoft.Json/List[string]/TextualStringListWithSemicolonConverter.cs +++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Converters/Internal/Newtonsoft.Json/Array[String]/TextualStringArrayWithSemicolonSplitConverter.cs @@ -4,7 +4,7 @@ using System.Linq; namespace Newtonsoft.Json.Converters { - internal class TextualStringListWithSemicolonConverter : JsonConverter?> + internal class TextualStringArrayWithSemicolonSplitConverter : JsonConverter { public override bool CanRead { @@ -16,7 +16,7 @@ namespace Newtonsoft.Json.Converters get { return true; } } - public override List? ReadJson(JsonReader reader, Type objectType, List? existingValue, bool hasExistingValue, JsonSerializer serializer) + public override string[]? ReadJson(JsonReader reader, Type objectType, string[]? existingValue, bool hasExistingValue, JsonSerializer serializer) { if (reader.TokenType == JsonToken.Null) { @@ -26,15 +26,17 @@ namespace Newtonsoft.Json.Converters { string? value = serializer.Deserialize(reader); if (value == null) - return existingValue; + return null; + if (string.IsNullOrEmpty(value)) + return Array.Empty(); - return value.Split(';').ToList(); + return value.Split(';'); } - throw new JsonReaderException(); + throw new JsonSerializationException(); } - public override void WriteJson(JsonWriter writer, List? value, JsonSerializer serializer) + public override void WriteJson(JsonWriter writer, string[]? value, JsonSerializer serializer) { if (value != null) writer.WriteValue(string.Join(";", value)); diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Converters/Internal/Newtonsoft.Json/List[String]/TextualStringListWithPipeSplitConverter.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Converters/Internal/Newtonsoft.Json/List[String]/TextualStringListWithPipeSplitConverter.cs new file mode 100644 index 00000000..8436e7ae --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Converters/Internal/Newtonsoft.Json/List[String]/TextualStringListWithPipeSplitConverter.cs @@ -0,0 +1,39 @@ +using System; +using System.Collections.Generic; +using System.Linq; + +namespace Newtonsoft.Json.Converters +{ + internal class TextualStringListWithPipeSplitConverter : JsonConverter + { + private readonly JsonConverter _converter = new TextualStringArrayWithPipeSplitConverter(); + + public override bool CanConvert(Type objectType) + { + return objectType.IsGenericType && + typeof(IList<>).IsAssignableFrom(objectType.GetGenericTypeDefinition()) && + typeof(string) == objectType.GetGenericArguments()[0]; + } + + public override bool CanRead + { + get { return true; } + } + + public override bool CanWrite + { + get { return true; } + } + + public override object? ReadJson(JsonReader reader, Type objectType, object? existingValue, JsonSerializer serializer) + { + string[]? array = _converter.ReadJson(reader, objectType, null, false, serializer); + return array?.ToList(); + } + + public override void WriteJson(JsonWriter writer, object? value, JsonSerializer serializer) + { + _converter.WriteJson(writer, ((IList?)value)?.ToArray(), serializer); + } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Converters/Internal/Newtonsoft.Json/List[String]/TextualStringListWithSemicolonSplitConverter.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Converters/Internal/Newtonsoft.Json/List[String]/TextualStringListWithSemicolonSplitConverter.cs new file mode 100644 index 00000000..3f00e662 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Converters/Internal/Newtonsoft.Json/List[String]/TextualStringListWithSemicolonSplitConverter.cs @@ -0,0 +1,39 @@ +using System; +using System.Collections.Generic; +using System.Linq; + +namespace Newtonsoft.Json.Converters +{ + internal class TextualStringListWithSemicolonSplitConverter : JsonConverter + { + private readonly JsonConverter _converter = new TextualStringArrayWithSemicolonSplitConverter(); + + public override bool CanConvert(Type objectType) + { + return objectType.IsGenericType && + typeof(IList<>).IsAssignableFrom(objectType.GetGenericTypeDefinition()) && + typeof(string) == objectType.GetGenericArguments()[0]; + } + + public override bool CanRead + { + get { return true; } + } + + public override bool CanWrite + { + get { return true; } + } + + public override object? ReadJson(JsonReader reader, Type objectType, object? existingValue, JsonSerializer serializer) + { + string[]? array = _converter.ReadJson(reader, objectType, null, false, serializer); + return array?.ToList(); + } + + public override void WriteJson(JsonWriter writer, object? value, JsonSerializer serializer) + { + _converter.WriteJson(writer, ((IList?)value)?.ToArray(), serializer); + } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Converters/System.Text.Json/List[int]/TextualInt32ListConverter.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Converters/Internal/System.Text.Json/Array[String]/TextualStringArrayWithPipeSplitConverter.cs similarity index 50% rename from src/SKIT.FlurlHttpClient.Wechat.Api/Converters/System.Text.Json/List[int]/TextualInt32ListConverter.cs rename to src/SKIT.FlurlHttpClient.Wechat.Api/Converters/Internal/System.Text.Json/Array[String]/TextualStringArrayWithPipeSplitConverter.cs index 8b49fe27..4e51fc92 100644 --- a/src/SKIT.FlurlHttpClient.Wechat.Api/Converters/System.Text.Json/List[int]/TextualInt32ListConverter.cs +++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Converters/Internal/System.Text.Json/Array[String]/TextualStringArrayWithPipeSplitConverter.cs @@ -4,9 +4,9 @@ using System.Text.Json.Serialization; namespace System.Text.Json.Converters { - internal class TextualInt32ListConverter : JsonConverter?> + internal class TextualStringArrayWithPipeSplitConverter : JsonConverter { - public override List? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) + public override string[]? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { if (reader.TokenType == JsonTokenType.Null) { @@ -17,24 +17,19 @@ namespace System.Text.Json.Converters string? value = reader.GetString(); if (value == null) return null; + if (string.IsNullOrEmpty(value)) + return Array.Empty(); - try - { - return value.Split(',').Select(e => int.Parse(e.Trim())).ToList(); - } - catch (Exception ex) - { - throw new JsonException(ex.Message, ex); - } + return value.Split('|'); } throw new JsonException(); } - public override void Write(Utf8JsonWriter writer, List? value, JsonSerializerOptions options) + public override void Write(Utf8JsonWriter writer, string[]? value, JsonSerializerOptions options) { if (value != null) - writer.WriteStringValue(string.Join(",", value)); + writer.WriteStringValue(string.Join("|", value)); else writer.WriteNullValue(); } diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Converters/System.Text.Json/List[string]/TextualStringListWithSemicolonConverter.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Converters/Internal/System.Text.Json/Array[String]/TextualStringArrayWithSemicolonSplitConverter.cs similarity index 60% rename from src/SKIT.FlurlHttpClient.Wechat.Api/Converters/System.Text.Json/List[string]/TextualStringListWithSemicolonConverter.cs rename to src/SKIT.FlurlHttpClient.Wechat.Api/Converters/Internal/System.Text.Json/Array[String]/TextualStringArrayWithSemicolonSplitConverter.cs index cf885d31..28e438d7 100644 --- a/src/SKIT.FlurlHttpClient.Wechat.Api/Converters/System.Text.Json/List[string]/TextualStringListWithSemicolonConverter.cs +++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Converters/Internal/System.Text.Json/Array[String]/TextualStringArrayWithSemicolonSplitConverter.cs @@ -4,9 +4,9 @@ using System.Text.Json.Serialization; namespace System.Text.Json.Converters { - internal class TextualStringListWithSemicolonConverter : JsonConverter?> + internal class TextualStringArrayWithSemicolonSplitConverter : JsonConverter { - public override List? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) + public override string[]? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { if (reader.TokenType == JsonTokenType.Null) { @@ -17,14 +17,16 @@ namespace System.Text.Json.Converters string? value = reader.GetString(); if (value == null) return null; + if (string.IsNullOrEmpty(value)) + return Array.Empty(); - return value.Split(';').ToList(); + return value.Split(';'); } throw new JsonException(); } - public override void Write(Utf8JsonWriter writer, List? value, JsonSerializerOptions options) + public override void Write(Utf8JsonWriter writer, string[]? value, JsonSerializerOptions options) { if (value != null) writer.WriteStringValue(string.Join(";", value)); diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Converters/Internal/System.Text.Json/List[String]/TextualStringListWithPipeSplitConverter.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Converters/Internal/System.Text.Json/List[String]/TextualStringListWithPipeSplitConverter.cs new file mode 100644 index 00000000..c22b908b --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Converters/Internal/System.Text.Json/List[String]/TextualStringListWithPipeSplitConverter.cs @@ -0,0 +1,38 @@ +using System.Collections.Generic; +using System.Linq; +using System.Text.Json.Serialization; + +namespace System.Text.Json.Converters +{ + internal class TextualStringListWithPipeSplitConverter : JsonConverterFactory + { + private sealed class InnerTextualStringListWithPipeSplitConverter : JsonConverter?> + { + private readonly JsonConverter _converter = new TextualStringArrayWithPipeSplitConverter(); + + public override IList? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) + { + string[]? array = _converter.Read(ref reader, typeToConvert, options); + IList? list = array?.ToList(); + return list; + } + + public override void Write(Utf8JsonWriter writer, IList? value, JsonSerializerOptions options) + { + _converter.Write(writer, value?.ToArray(), options); + } + } + + public override bool CanConvert(Type typeToConvert) + { + return typeToConvert.IsGenericType && + typeof(IList<>).IsAssignableFrom(typeToConvert.GetGenericTypeDefinition()) && + typeof(string) == typeToConvert.GetGenericArguments()[0]; + } + + public override JsonConverter? CreateConverter(Type typeToConvert, JsonSerializerOptions options) + { + return new InnerTextualStringListWithPipeSplitConverter(); + } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Converters/Internal/System.Text.Json/List[String]/TextualStringListWithSemicolonSplitConverter.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Converters/Internal/System.Text.Json/List[String]/TextualStringListWithSemicolonSplitConverter.cs new file mode 100644 index 00000000..bc58329b --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Converters/Internal/System.Text.Json/List[String]/TextualStringListWithSemicolonSplitConverter.cs @@ -0,0 +1,38 @@ +using System.Collections.Generic; +using System.Linq; +using System.Text.Json.Serialization; + +namespace System.Text.Json.Converters +{ + internal class TextualStringListWithSemicolonSplitConverter : JsonConverterFactory + { + private sealed class InnerTextualStringListWithSemicolonSplitConverter : JsonConverter?> + { + private readonly JsonConverter _converter = new TextualStringArrayWithSemicolonSplitConverter(); + + public override IList? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) + { + string[]? array = _converter.Read(ref reader, typeToConvert, options); + IList? list = array?.ToList(); + return list; + } + + public override void Write(Utf8JsonWriter writer, IList? value, JsonSerializerOptions options) + { + _converter.Write(writer, value?.ToArray(), options); + } + } + + public override bool CanConvert(Type typeToConvert) + { + return typeToConvert.IsGenericType && + typeof(IList<>).IsAssignableFrom(typeToConvert.GetGenericTypeDefinition()) && + typeof(string) == typeToConvert.GetGenericArguments()[0]; + } + + public override JsonConverter? CreateConverter(Type typeToConvert, JsonSerializerOptions options) + { + return new InnerTextualStringListWithSemicolonSplitConverter(); + } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Converters/Newtonsoft.Json/Array[string]/TextualStringArrayWithSemicolonConverter.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Converters/Newtonsoft.Json/Array[string]/TextualStringArrayWithSemicolonConverter.cs deleted file mode 100644 index 8624a652..00000000 --- a/src/SKIT.FlurlHttpClient.Wechat.Api/Converters/Newtonsoft.Json/Array[string]/TextualStringArrayWithSemicolonConverter.cs +++ /dev/null @@ -1,31 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; - -namespace Newtonsoft.Json.Converters -{ - internal class TextualStringArrayWithSemicolonConverter : JsonConverter - { - private readonly JsonConverter?> _converter = new TextualStringListWithSemicolonConverter(); - - public override bool CanRead - { - get { return true; } - } - - public override bool CanWrite - { - get { return true; } - } - - public override string[]? ReadJson(JsonReader reader, Type objectType, string[]? existingValue, bool hasExistingValue, JsonSerializer serializer) - { - return _converter.ReadJson(reader, objectType, existingValue?.ToList(), hasExistingValue, serializer)?.ToArray(); - } - - public override void WriteJson(JsonWriter writer, string[]? value, JsonSerializer serializer) - { - _converter.WriteJson(writer, value?.ToList(), serializer); - } - } -} diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Converters/Newtonsoft.Json/List[int]/TextualInt32IListConverter.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Converters/Newtonsoft.Json/List[int]/TextualInt32IListConverter.cs deleted file mode 100644 index 944c3cb1..00000000 --- a/src/SKIT.FlurlHttpClient.Wechat.Api/Converters/Newtonsoft.Json/List[int]/TextualInt32IListConverter.cs +++ /dev/null @@ -1,42 +0,0 @@ -using System; -using System.Collections.Generic; - -namespace Newtonsoft.Json.Converters -{ - internal class TextualInt32IListConverter : JsonConverter?> - { - private readonly JsonConverter?> _converter = new TextualInt32ListConverter(); - - public override bool CanRead - { - get { return true; } - } - - public override bool CanWrite - { - get { return true; } - } - - public override IList? ReadJson(JsonReader reader, Type objectType, IList? existingValue, bool hasExistingValue, JsonSerializer serializer) - { - return _converter.ReadJson(reader, objectType, ConvertIListToList(existingValue), hasExistingValue, serializer); - } - - public override void WriteJson(JsonWriter writer, IList? value, JsonSerializer serializer) - { - _converter.WriteJson(writer, ConvertIListToList(value), serializer); - } - - private List? ConvertIListToList(IList? src) - { - if (src == null) - return null; - - List? dest = src as List; - if (dest != null) - return dest; - - return new List(src); - } - } -} diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Converters/Newtonsoft.Json/List[int]/TextualInt32ListConverter.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Converters/Newtonsoft.Json/List[int]/TextualInt32ListConverter.cs deleted file mode 100644 index 09a9b9f7..00000000 --- a/src/SKIT.FlurlHttpClient.Wechat.Api/Converters/Newtonsoft.Json/List[int]/TextualInt32ListConverter.cs +++ /dev/null @@ -1,52 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; - -namespace Newtonsoft.Json.Converters -{ - internal class TextualInt32ListConverter : JsonConverter?> - { - public override bool CanRead - { - get { return true; } - } - - public override bool CanWrite - { - get { return true; } - } - - public override List? ReadJson(JsonReader reader, Type objectType, List? existingValue, bool hasExistingValue, JsonSerializer serializer) - { - if (reader.TokenType == JsonToken.Null) - { - return null; - } - else if (reader.TokenType == JsonToken.String) - { - string? value = serializer.Deserialize(reader); - if (value == null) - return existingValue; - - try - { - return value.Split(',').Select(e => int.Parse(e.Trim())).ToList(); - } - catch (Exception ex) - { - throw new JsonReaderException(ex.Message, ex); - } - } - - throw new JsonReaderException(); - } - - public override void WriteJson(JsonWriter writer, List? value, JsonSerializer serializer) - { - if (value != null) - writer.WriteValue(string.Join(",", value)); - else - writer.WriteNull(); - } - } -} diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Converters/Newtonsoft.Json/List[string]/TextualStringIListWithSemicolonConverter.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Converters/Newtonsoft.Json/List[string]/TextualStringIListWithSemicolonConverter.cs deleted file mode 100644 index 45b4dbac..00000000 --- a/src/SKIT.FlurlHttpClient.Wechat.Api/Converters/Newtonsoft.Json/List[string]/TextualStringIListWithSemicolonConverter.cs +++ /dev/null @@ -1,42 +0,0 @@ -using System; -using System.Collections.Generic; - -namespace Newtonsoft.Json.Converters -{ - internal class TextualStringIListWithSemicolonConverter : JsonConverter?> - { - private readonly JsonConverter?> _converter = new TextualStringListWithSemicolonConverter(); - - public override bool CanRead - { - get { return true; } - } - - public override bool CanWrite - { - get { return true; } - } - - public override IList? ReadJson(JsonReader reader, Type objectType, IList? existingValue, bool hasExistingValue, JsonSerializer serializer) - { - return _converter.ReadJson(reader, objectType, ConvertIListToList(existingValue), hasExistingValue, serializer); - } - - public override void WriteJson(JsonWriter writer, IList? value, JsonSerializer serializer) - { - _converter.WriteJson(writer, ConvertIListToList(value), serializer); - } - - private List? ConvertIListToList(IList? src) - { - if (src == null) - return null; - - List? dest = src as List; - if (dest != null) - return dest; - - return new List(src); - } - } -} diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Converters/System.Text.Json/Array[string]/TextualStringArrayWithSemicolonConverter.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Converters/System.Text.Json/Array[string]/TextualStringArrayWithSemicolonConverter.cs deleted file mode 100644 index 337f793a..00000000 --- a/src/SKIT.FlurlHttpClient.Wechat.Api/Converters/System.Text.Json/Array[string]/TextualStringArrayWithSemicolonConverter.cs +++ /dev/null @@ -1,21 +0,0 @@ -using System.Collections.Generic; -using System.Linq; -using System.Text.Json.Serialization; - -namespace System.Text.Json.Converters -{ - internal class TextualStringArrayWithSemicolonConverter : JsonConverter - { - private readonly JsonConverter?> _converter = new TextualStringListWithSemicolonConverter(); - - public override string[]? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) - { - return _converter.Read(ref reader, typeToConvert, options)?.ToArray(); - } - - public override void Write(Utf8JsonWriter writer, string[]? value, JsonSerializerOptions options) - { - _converter.Write(writer, value?.ToList(), options); - } - } -} diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Converters/System.Text.Json/List[int]/TextualInt32IListConverter.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Converters/System.Text.Json/List[int]/TextualInt32IListConverter.cs deleted file mode 100644 index 15f03242..00000000 --- a/src/SKIT.FlurlHttpClient.Wechat.Api/Converters/System.Text.Json/List[int]/TextualInt32IListConverter.cs +++ /dev/null @@ -1,32 +0,0 @@ -using System.Collections.Generic; -using System.Text.Json.Serialization; - -namespace System.Text.Json.Converters -{ - internal class TextualInt32IListConverter : JsonConverter?> - { - private readonly JsonConverter?> _converter = new TextualInt32ListConverter(); - - public override IList? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) - { - return _converter.Read(ref reader, typeToConvert, options); - } - - public override void Write(Utf8JsonWriter writer, IList? value, JsonSerializerOptions options) - { - _converter.Write(writer, ConvertIListToList(value), options); - } - - private List? ConvertIListToList(IList? src) - { - if (src == null) - return null; - - List? dest = src as List; - if (dest != null) - return dest; - - return new List(src); - } - } -} diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Converters/System.Text.Json/List[string]/TextualStringIListWithSemicolonConverter.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Converters/System.Text.Json/List[string]/TextualStringIListWithSemicolonConverter.cs deleted file mode 100644 index 5b5e2884..00000000 --- a/src/SKIT.FlurlHttpClient.Wechat.Api/Converters/System.Text.Json/List[string]/TextualStringIListWithSemicolonConverter.cs +++ /dev/null @@ -1,21 +0,0 @@ -using System.Collections.Generic; -using System.Linq; -using System.Text.Json.Serialization; - -namespace System.Text.Json.Converters -{ - internal class TextualStringIListWithSemicolonConverter : JsonConverter?> - { - private readonly JsonConverter?> _converter = new TextualStringListWithSemicolonConverter(); - - public override IList? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) - { - return _converter.Read(ref reader, typeToConvert, options)?.ToArray(); - } - - public override void Write(Utf8JsonWriter writer, IList? value, JsonSerializerOptions options) - { - _converter.Write(writer, value?.ToList(), options); - } - } -} diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Extensions/WechatApiClientExecuteCgibinMidasExtensions.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Extensions/WechatApiClientExecuteCgibinMidasExtensions.cs index 50c66f10..c37c0b57 100644 --- a/src/SKIT.FlurlHttpClient.Wechat.Api/Extensions/WechatApiClientExecuteCgibinMidasExtensions.cs +++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Extensions/WechatApiClientExecuteCgibinMidasExtensions.cs @@ -47,7 +47,7 @@ namespace SKIT.FlurlHttpClient.Wechat.Api + $"&org_loc={reqLoc}" + $"&method={method.ToUpper()}" + $"&secret={client.Credentials.MidasAppKey}"; - request.Signature = Utilities.HMACSHA256Utility.Hash(client.Credentials.MidasAppKey ?? string.Empty, plainText).ToLower(); + request.Signature = Utilities.HMACUtility.HashWithSHA256(client.Credentials.MidasAppKey ?? string.Empty, plainText).ToLower(); } return request; diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/CgibinComponent/CgibinComponentModifyWxaJumpDomainRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/CgibinComponent/CgibinComponentModifyWxaJumpDomainRequest.cs index f3e79045..6942edee 100644 --- a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/CgibinComponent/CgibinComponentModifyWxaJumpDomainRequest.cs +++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/CgibinComponent/CgibinComponentModifyWxaJumpDomainRequest.cs @@ -32,9 +32,9 @@ namespace SKIT.FlurlHttpClient.Wechat.Api.Models /// 获取或设置业务域名列表。 /// [Newtonsoft.Json.JsonProperty("wxa_jump_h5_domain")] - [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.TextualStringIListWithSemicolonConverter))] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.TextualStringListWithSemicolonSplitConverter))] [System.Text.Json.Serialization.JsonPropertyName("wxa_jump_h5_domain")] - [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.TextualStringIListWithSemicolonConverter))] + [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.TextualStringListWithSemicolonSplitConverter))] public IList? WxaJumpH5DomainList { get; set; } } } diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/CgibinComponent/CgibinComponentModifyWxaJumpDomainResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/CgibinComponent/CgibinComponentModifyWxaJumpDomainResponse.cs index acce4f09..c6c4df37 100644 --- a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/CgibinComponent/CgibinComponentModifyWxaJumpDomainResponse.cs +++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/CgibinComponent/CgibinComponentModifyWxaJumpDomainResponse.cs @@ -9,27 +9,27 @@ /// 获取或设置目前生效的全网发布版第三方平台小程序业务域名列表。 /// [Newtonsoft.Json.JsonProperty("published_wxa_jump_h5_domain")] - [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.TextualStringArrayWithSemicolonConverter))] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.TextualStringArrayWithSemicolonSplitConverter))] [System.Text.Json.Serialization.JsonPropertyName("published_wxa_jump_h5_domain")] - [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.TextualStringArrayWithSemicolonConverter))] + [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.TextualStringArrayWithSemicolonSplitConverter))] public string[]? PublishedWxaJumpH5DomainList { get; set; } /// /// 获取或设置目前生效的测试版第三方平台小程序业务域名列表。 /// [Newtonsoft.Json.JsonProperty("testing_wxa_jump_h5_domain")] - [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.TextualStringArrayWithSemicolonConverter))] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.TextualStringArrayWithSemicolonSplitConverter))] [System.Text.Json.Serialization.JsonPropertyName("testing_wxa_jump_h5_domain")] - [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.TextualStringArrayWithSemicolonConverter))] + [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.TextualStringArrayWithSemicolonSplitConverter))] public string[]? TestingWxaJumpH5DomainList { get; set; } /// /// 获取或设置未通过验证的第三方平台小程序业务域名列表。 /// [Newtonsoft.Json.JsonProperty("invalid_wxa_jump_h5_domain")] - [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.TextualStringArrayWithSemicolonConverter))] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.TextualStringArrayWithSemicolonSplitConverter))] [System.Text.Json.Serialization.JsonPropertyName("invalid_wxa_jump_h5_domain")] - [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.TextualStringArrayWithSemicolonConverter))] + [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.TextualStringArrayWithSemicolonSplitConverter))] public string[]? InvalidWxaJumpH5DomainList { get; set; } } } diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/CgibinComponent/CgibinComponentModifyWxaServerDomainRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/CgibinComponent/CgibinComponentModifyWxaServerDomainRequest.cs index 28a1adb1..58407351 100644 --- a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/CgibinComponent/CgibinComponentModifyWxaServerDomainRequest.cs +++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/CgibinComponent/CgibinComponentModifyWxaServerDomainRequest.cs @@ -32,9 +32,9 @@ namespace SKIT.FlurlHttpClient.Wechat.Api.Models /// 获取或设置服务器域名列表。 /// [Newtonsoft.Json.JsonProperty("wxa_server_domain")] - [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.TextualStringIListWithSemicolonConverter))] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.TextualStringListWithSemicolonSplitConverter))] [System.Text.Json.Serialization.JsonPropertyName("wxa_server_domain")] - [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.TextualStringIListWithSemicolonConverter))] + [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.TextualStringListWithSemicolonSplitConverter))] public IList? WxaServerDomainList { get; set; } } } diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/CgibinComponent/CgibinComponentModifyWxaServerDomainResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/CgibinComponent/CgibinComponentModifyWxaServerDomainResponse.cs index 6ce4763a..98c866c1 100644 --- a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/CgibinComponent/CgibinComponentModifyWxaServerDomainResponse.cs +++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/CgibinComponent/CgibinComponentModifyWxaServerDomainResponse.cs @@ -9,27 +9,27 @@ /// 获取或设置目前生效的全网发布版第三方平台小程序服务器域名列表。 /// [Newtonsoft.Json.JsonProperty("published_wxa_server_domain")] - [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.TextualStringArrayWithSemicolonConverter))] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.TextualStringArrayWithSemicolonSplitConverter))] [System.Text.Json.Serialization.JsonPropertyName("published_wxa_server_domain")] - [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.TextualStringArrayWithSemicolonConverter))] + [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.TextualStringArrayWithSemicolonSplitConverter))] public string[]? PublishedWxaServerDomainList { get; set; } /// /// 获取或设置目前生效的测试版第三方平台小程序服务器域名列表。 /// [Newtonsoft.Json.JsonProperty("testing_wxa_server_domain")] - [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.TextualStringArrayWithSemicolonConverter))] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.TextualStringArrayWithSemicolonSplitConverter))] [System.Text.Json.Serialization.JsonPropertyName("testing_wxa_server_domain")] - [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.TextualStringArrayWithSemicolonConverter))] + [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.TextualStringArrayWithSemicolonSplitConverter))] public string[]? TestingWxaServerDomainList { get; set; } /// /// 获取或设置未通过验证的第三方平台小程序服务器域名列表。 /// [Newtonsoft.Json.JsonProperty("invalid_wxa_server_domain")] - [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.TextualStringArrayWithSemicolonConverter))] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.TextualStringArrayWithSemicolonSplitConverter))] [System.Text.Json.Serialization.JsonPropertyName("invalid_wxa_server_domain")] - [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.TextualStringArrayWithSemicolonConverter))] + [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.TextualStringArrayWithSemicolonSplitConverter))] public string[]? InvalidWxaServerDomainList { get; set; } } } diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/CgibinExpress/Business/CgibinExpressBusinessPrinterGetAllResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/CgibinExpress/Business/CgibinExpressBusinessPrinterGetAllResponse.cs index f0c96349..ef2ea0dc 100644 --- a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/CgibinExpress/Business/CgibinExpressBusinessPrinterGetAllResponse.cs +++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/CgibinExpress/Business/CgibinExpressBusinessPrinterGetAllResponse.cs @@ -17,7 +17,7 @@ /// [Newtonsoft.Json.JsonProperty("tagid_list")] [System.Text.Json.Serialization.JsonPropertyName("tagid_list")] - public int[] TagIdList { get; set; } = default!; + public string[] TagIdList { get; set; } = default!; /// /// 获取或设置打印员数量。 diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/CgibinExpress/Business/CgibinExpressBusinessPrinterUpdateRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/CgibinExpress/Business/CgibinExpressBusinessPrinterUpdateRequest.cs index b01e4e6c..cc333ea2 100644 --- a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/CgibinExpress/Business/CgibinExpressBusinessPrinterUpdateRequest.cs +++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/CgibinExpress/Business/CgibinExpressBusinessPrinterUpdateRequest.cs @@ -25,9 +25,9 @@ namespace SKIT.FlurlHttpClient.Wechat.Api.Models /// 获取或设置打印员面单打印权限列表。 /// [Newtonsoft.Json.JsonProperty("tagid_list")] - [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.TextualInt32IListConverter))] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.TextualStringListWithCommaSplitConverter))] [System.Text.Json.Serialization.JsonPropertyName("tagid_list")] - [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.TextualInt32IListConverter))] - public IList? TagIdList { get; set; } + [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.TextualStringListWithCommaSplitConverter))] + public IList? TagIdList { get; set; } } } diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/CgibinExpress/Delivery/CgibinExpressDeliveryTemplatePreviewRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/CgibinExpress/Delivery/CgibinExpressDeliveryTemplatePreviewRequest.cs index 9eb9f81c..76670bae 100644 --- a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/CgibinExpress/Delivery/CgibinExpressDeliveryTemplatePreviewRequest.cs +++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/CgibinExpress/Delivery/CgibinExpressDeliveryTemplatePreviewRequest.cs @@ -145,7 +145,7 @@ namespace SKIT.FlurlHttpClient.Wechat.Api.Models internal static class Converters { - internal class NewtonsoftJsonWaybillDataListConverter : Newtonsoft.Json.JsonConverter?> + internal class RequestPropertyWaybillDataListNewtonsoftJsonConverter : Newtonsoft.Json.JsonConverter?> { public override bool CanRead { @@ -194,7 +194,7 @@ namespace SKIT.FlurlHttpClient.Wechat.Api.Models } } - internal class SystemTextJsonWaybillDataListConverter : System.Text.Json.Serialization.JsonConverter?> + internal class RequestPropertyWaybillDataListSystemTextJsonConverter : System.Text.Json.Serialization.JsonConverter?> { public override IList? Read(ref System.Text.Json.Utf8JsonReader reader, Type typeToConvert, System.Text.Json.JsonSerializerOptions options) { @@ -252,9 +252,9 @@ namespace SKIT.FlurlHttpClient.Wechat.Api.Models /// 获取或设置面单数据列表。 /// [Newtonsoft.Json.JsonProperty("waybill_data")] - [Newtonsoft.Json.JsonConverter(typeof(Converters.NewtonsoftJsonWaybillDataListConverter))] + [Newtonsoft.Json.JsonConverter(typeof(Converters.RequestPropertyWaybillDataListNewtonsoftJsonConverter))] [System.Text.Json.Serialization.JsonPropertyName("waybill_data")] - [System.Text.Json.Serialization.JsonConverter(typeof(Converters.SystemTextJsonWaybillDataListConverter))] + [System.Text.Json.Serialization.JsonConverter(typeof(Converters.RequestPropertyWaybillDataListSystemTextJsonConverter))] public IList WaybillDataList { get; set; } = new List(); /// diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Tcb/TcbGetOpenDataResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Tcb/TcbGetOpenDataResponse.cs index 878168db..97c7e4a1 100644 --- a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Tcb/TcbGetOpenDataResponse.cs +++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Tcb/TcbGetOpenDataResponse.cs @@ -21,7 +21,8 @@ /// [Newtonsoft.Json.JsonProperty("json")] [System.Text.Json.Serialization.JsonPropertyName("json")] - public object Data { get; set; } = default!; + [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.DynamicObjectReadOnlyConverter))] + public dynamic? Data { get; set; } } } diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/UnionPromoter/Order/UnionPromoterOrderInfoResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/UnionPromoter/Order/UnionPromoterOrderInfoResponse.cs index b730cc29..1222dc11 100644 --- a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/UnionPromoter/Order/UnionPromoterOrderInfoResponse.cs +++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/UnionPromoter/Order/UnionPromoterOrderInfoResponse.cs @@ -49,9 +49,9 @@ namespace SKIT.FlurlHttpClient.Wechat.Api.Models /// 获取或设置商品价格(单位:分)。 /// [Newtonsoft.Json.JsonProperty("price")] - [Newtonsoft.Json.JsonConverter(typeof(Converters.NewtonsoftJsonCurrencyConverter))] + [Newtonsoft.Json.JsonConverter(typeof(Converters.ResponsePropertyCurrencyNewtonsoftJsonConverter))] [System.Text.Json.Serialization.JsonPropertyName("price")] - [System.Text.Json.Serialization.JsonConverter(typeof(Converters.SystemTextJsonCurrencyConverter))] + [System.Text.Json.Serialization.JsonConverter(typeof(Converters.ResponsePropertyCurrencySystemTextJsonConverter))] public int Price { get; set; } /// @@ -72,18 +72,18 @@ namespace SKIT.FlurlHttpClient.Wechat.Api.Models /// 获取或设置佣金金额(单位:分)。 /// [Newtonsoft.Json.JsonProperty("commission")] - [Newtonsoft.Json.JsonConverter(typeof(Converters.NewtonsoftJsonCurrencyConverter))] + [Newtonsoft.Json.JsonConverter(typeof(Converters.ResponsePropertyCurrencyNewtonsoftJsonConverter))] [System.Text.Json.Serialization.JsonPropertyName("commission")] - [System.Text.Json.Serialization.JsonConverter(typeof(Converters.SystemTextJsonCurrencyConverter))] + [System.Text.Json.Serialization.JsonConverter(typeof(Converters.ResponsePropertyCurrencySystemTextJsonConverter))] public int CommissionValue { get; set; } /// /// 获取或设置预估佣金金额(单位:分)。 /// [Newtonsoft.Json.JsonProperty("estimatedCommission")] - [Newtonsoft.Json.JsonConverter(typeof(Converters.NewtonsoftJsonCurrencyConverter))] + [Newtonsoft.Json.JsonConverter(typeof(Converters.ResponsePropertyCurrencyNewtonsoftJsonConverter))] [System.Text.Json.Serialization.JsonPropertyName("estimatedCommission")] - [System.Text.Json.Serialization.JsonConverter(typeof(Converters.SystemTextJsonCurrencyConverter))] + [System.Text.Json.Serialization.JsonConverter(typeof(Converters.ResponsePropertyCurrencySystemTextJsonConverter))] public int EstimatedCommissionValue { get; set; } /// @@ -196,7 +196,7 @@ namespace SKIT.FlurlHttpClient.Wechat.Api.Models internal static class Converters { - internal class NewtonsoftJsonCurrencyConverter : Newtonsoft.Json.JsonConverter + internal class ResponsePropertyCurrencyNewtonsoftJsonConverter : Newtonsoft.Json.JsonConverter { public override bool CanRead { @@ -239,7 +239,7 @@ namespace SKIT.FlurlHttpClient.Wechat.Api.Models } } - internal class SystemTextJsonCurrencyConverter : System.Text.Json.Serialization.JsonConverter + internal class ResponsePropertyCurrencySystemTextJsonConverter : System.Text.Json.Serialization.JsonConverter { public override int Read(ref System.Text.Json.Utf8JsonReader reader, Type typeToConvert, System.Text.Json.JsonSerializerOptions options) { diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/UnionPromoter/Target/UnionPromoterTargetPlanInfoResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/UnionPromoter/Target/UnionPromoterTargetPlanInfoResponse.cs index f5ec0240..4baa9845 100644 --- a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/UnionPromoter/Target/UnionPromoterTargetPlanInfoResponse.cs +++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/UnionPromoter/Target/UnionPromoterTargetPlanInfoResponse.cs @@ -63,8 +63,9 @@ /// [Newtonsoft.Json.JsonProperty("extInfo")] [System.Text.Json.Serialization.JsonPropertyName("extInfo")] + [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.DynamicObjectReadOnlyConverter))] - public object Extra { get; set; } = default!; + public dynamic? Extra { get; set; } } public class Product diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Wxa/NearybyPOI/WxaAddNearbyPOIRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Wxa/NearybyPOI/WxaAddNearbyPOIRequest.cs index 4d4f93bf..da166564 100644 --- a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Wxa/NearybyPOI/WxaAddNearbyPOIRequest.cs +++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Wxa/NearybyPOI/WxaAddNearbyPOIRequest.cs @@ -105,208 +105,28 @@ namespace SKIT.FlurlHttpClient.Wechat.Api.Models internal static class Converters { - internal class NewtonsoftJsonPictureConverter : Newtonsoft.Json.JsonConverter + internal class RequestPropertyPictureNewtonsoftJsonConverter : Newtonsoft.Json.Converters.TextualObjectInJsonFormatConverterBase { - public override bool CanRead - { - get { return true; } - } - - public override bool CanWrite - { - get { return true; } - } - - public override Types.Picture? ReadJson(Newtonsoft.Json.JsonReader reader, Type objectType, Types.Picture? existingValue, bool hasExistingValue, Newtonsoft.Json.JsonSerializer serializer) - { - if (reader.TokenType == Newtonsoft.Json.JsonToken.Null) - { - return existingValue; - } - else if (reader.TokenType == Newtonsoft.Json.JsonToken.String) - { - string? value = serializer.Deserialize(reader); - if (value == null) - return existingValue; - - return Newtonsoft.Json.JsonConvert.DeserializeObject(value); - } - - throw new Newtonsoft.Json.JsonReaderException(); - } - - public override void WriteJson(Newtonsoft.Json.JsonWriter writer, Types.Picture? value, Newtonsoft.Json.JsonSerializer serializer) - { - if (value != null) - writer.WriteValue(Newtonsoft.Json.JsonConvert.SerializeObject(value, Newtonsoft.Json.Formatting.None)); - else - writer.WriteNull(); - } } - internal class SystemTextJsonPictureConverter : System.Text.Json.Serialization.JsonConverter + internal class RequestPropertyPictureSystemTextJsonConverter : System.Text.Json.Converters.TextualObjectInJsonFormatConverterBase { - public override Types.Picture? Read(ref System.Text.Json.Utf8JsonReader reader, Type typeToConvert, System.Text.Json.JsonSerializerOptions options) - { - if (reader.TokenType == System.Text.Json.JsonTokenType.Null) - { - return null; - } - else if (reader.TokenType == System.Text.Json.JsonTokenType.String) - { - string? value = reader.GetString(); - if (value == null) - return null; - - return System.Text.Json.JsonSerializer.Deserialize(value, options); - } - - throw new System.Text.Json.JsonException(); - } - - public override void Write(System.Text.Json.Utf8JsonWriter writer, Types.Picture? value, System.Text.Json.JsonSerializerOptions options) - { - if (value != null) - writer.WriteStringValue(System.Text.Json.JsonSerializer.Serialize(value, options)); - else - writer.WriteNullValue(); - } } - internal class NewtonsoftJsonServiceConverter : Newtonsoft.Json.JsonConverter + internal class RequestPropertyServiceNewtonsoftJsonConverter : Newtonsoft.Json.Converters.TextualObjectInJsonFormatConverterBase { - public override bool CanRead - { - get { return true; } - } - - public override bool CanWrite - { - get { return true; } - } - - public override Types.Service? ReadJson(Newtonsoft.Json.JsonReader reader, Type objectType, Types.Service? existingValue, bool hasExistingValue, Newtonsoft.Json.JsonSerializer serializer) - { - if (reader.TokenType == Newtonsoft.Json.JsonToken.Null) - { - return existingValue; - } - else if (reader.TokenType == Newtonsoft.Json.JsonToken.String) - { - string? value = serializer.Deserialize(reader); - if (value == null) - return existingValue; - - return Newtonsoft.Json.JsonConvert.DeserializeObject(value); - } - - throw new Newtonsoft.Json.JsonReaderException(); - } - - public override void WriteJson(Newtonsoft.Json.JsonWriter writer, Types.Service? value, Newtonsoft.Json.JsonSerializer serializer) - { - if (value != null) - writer.WriteValue(Newtonsoft.Json.JsonConvert.SerializeObject(value, Newtonsoft.Json.Formatting.None)); - else - writer.WriteNull(); - } } - internal class SystemTextJsonServiceConverter : System.Text.Json.Serialization.JsonConverter + internal class RequestPropertyServiceSystemTextJsonConverter : System.Text.Json.Converters.TextualObjectInJsonFormatConverterBase { - public override Types.Service? Read(ref System.Text.Json.Utf8JsonReader reader, Type typeToConvert, System.Text.Json.JsonSerializerOptions options) - { - if (reader.TokenType == System.Text.Json.JsonTokenType.Null) - { - return null; - } - else if (reader.TokenType == System.Text.Json.JsonTokenType.String) - { - string? value = reader.GetString(); - if (value == null) - return null; - - return System.Text.Json.JsonSerializer.Deserialize(value, options); - } - - throw new System.Text.Json.JsonException(); - } - - public override void Write(System.Text.Json.Utf8JsonWriter writer, Types.Service? value, System.Text.Json.JsonSerializerOptions options) - { - if (value != null) - writer.WriteStringValue(System.Text.Json.JsonSerializer.Serialize(value, options)); - else - writer.WriteNullValue(); - } } - internal class NewtonsoftJsonKfConverter : Newtonsoft.Json.JsonConverter + internal class RequsetPropertyKfNewtonsoftJsonConverter : Newtonsoft.Json.Converters.TextualObjectInJsonFormatConverterBase { - public override bool CanRead - { - get { return true; } - } - - public override bool CanWrite - { - get { return true; } - } - - public override Types.Kf? ReadJson(Newtonsoft.Json.JsonReader reader, Type objectType, Types.Kf? existingValue, bool hasExistingValue, Newtonsoft.Json.JsonSerializer serializer) - { - if (reader.TokenType == Newtonsoft.Json.JsonToken.Null) - { - return existingValue; - } - else if (reader.TokenType == Newtonsoft.Json.JsonToken.String) - { - string? value = serializer.Deserialize(reader); - if (value == null) - return existingValue; - - return Newtonsoft.Json.JsonConvert.DeserializeObject(value); - } - - throw new Newtonsoft.Json.JsonReaderException(); - } - - public override void WriteJson(Newtonsoft.Json.JsonWriter writer, Types.Kf? value, Newtonsoft.Json.JsonSerializer serializer) - { - if (value != null) - writer.WriteValue(Newtonsoft.Json.JsonConvert.SerializeObject(value, Newtonsoft.Json.Formatting.None)); - else - writer.WriteNull(); - } } - internal class SystemTextJsonKfConverter : System.Text.Json.Serialization.JsonConverter + internal class RequestPropertyKfSystemTextJsonConverter : System.Text.Json.Converters.TextualObjectInJsonFormatConverterBase { - public override Types.Kf? Read(ref System.Text.Json.Utf8JsonReader reader, Type typeToConvert, System.Text.Json.JsonSerializerOptions options) - { - if (reader.TokenType == System.Text.Json.JsonTokenType.Null) - { - return null; - } - else if (reader.TokenType == System.Text.Json.JsonTokenType.String) - { - string? value = reader.GetString(); - if (value == null) - return null; - - return System.Text.Json.JsonSerializer.Deserialize(value, options); - } - - throw new System.Text.Json.JsonException(); - } - - public override void Write(System.Text.Json.Utf8JsonWriter writer, Types.Kf? value, System.Text.Json.JsonSerializerOptions options) - { - if (value != null) - writer.WriteStringValue(System.Text.Json.JsonSerializer.Serialize(value, options)); - else - writer.WriteNullValue(); - } } } @@ -337,27 +157,27 @@ namespace SKIT.FlurlHttpClient.Wechat.Api.Models /// 获取或设置门店图片信息。 /// [Newtonsoft.Json.JsonProperty("pic_list")] - [Newtonsoft.Json.JsonConverter(typeof(Converters.NewtonsoftJsonPictureConverter))] + [Newtonsoft.Json.JsonConverter(typeof(Converters.RequestPropertyPictureNewtonsoftJsonConverter))] [System.Text.Json.Serialization.JsonPropertyName("pic_list")] - [System.Text.Json.Serialization.JsonConverter(typeof(Converters.SystemTextJsonPictureConverter))] + [System.Text.Json.Serialization.JsonConverter(typeof(Converters.RequestPropertyPictureSystemTextJsonConverter))] public Types.Picture Picture { get; set; } = new Types.Picture(); /// /// 获取或设置服务标签信息。 /// [Newtonsoft.Json.JsonProperty("service_infos")] - [Newtonsoft.Json.JsonConverter(typeof(Converters.NewtonsoftJsonServiceConverter))] + [Newtonsoft.Json.JsonConverter(typeof(Converters.RequestPropertyServiceNewtonsoftJsonConverter))] [System.Text.Json.Serialization.JsonPropertyName("service_infos")] - [System.Text.Json.Serialization.JsonConverter(typeof(Converters.SystemTextJsonServiceConverter))] + [System.Text.Json.Serialization.JsonConverter(typeof(Converters.RequestPropertyServiceSystemTextJsonConverter))] public Types.Service Service { get; set; } = new Types.Service(); /// /// 获取或设置客服信息。 /// [Newtonsoft.Json.JsonProperty("kf_info")] - [Newtonsoft.Json.JsonConverter(typeof(Converters.NewtonsoftJsonKfConverter))] + [Newtonsoft.Json.JsonConverter(typeof(Converters.RequsetPropertyKfNewtonsoftJsonConverter))] [System.Text.Json.Serialization.JsonPropertyName("kf_info")] - [System.Text.Json.Serialization.JsonConverter(typeof(Converters.SystemTextJsonKfConverter))] + [System.Text.Json.Serialization.JsonConverter(typeof(Converters.RequestPropertyKfSystemTextJsonConverter))] public Types.Kf? Kf { get; set; } /// diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Wxa/ServiceMarket/WxaServiceMarketRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Wxa/ServiceMarket/WxaServiceMarketRequest.cs index 6eed7e8a..b7eae99d 100644 --- a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Wxa/ServiceMarket/WxaServiceMarketRequest.cs +++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Wxa/ServiceMarket/WxaServiceMarketRequest.cs @@ -31,7 +31,8 @@ /// [Newtonsoft.Json.JsonProperty("data")] [System.Text.Json.Serialization.JsonPropertyName("data")] - public object? Data { get; set; } + [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.DynamicObjectReadOnlyConverter))] + public dynamic? Data { get; set; } /// /// 获取或设置调用方请求的唯一标识。 diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Wxa/WxaStore/WxaAddStoreRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Wxa/WxaStore/WxaAddStoreRequest.cs index 3ffc6ab7..ec89c391 100644 --- a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Wxa/WxaStore/WxaAddStoreRequest.cs +++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Wxa/WxaStore/WxaAddStoreRequest.cs @@ -23,72 +23,12 @@ namespace SKIT.FlurlHttpClient.Wechat.Api.Models internal static class Converters { - internal class NewtonsoftJsonPictureConverter : Newtonsoft.Json.JsonConverter + internal class RequestPropertyPictureNewtonsoftJsonConverter : Newtonsoft.Json.Converters.TextualObjectInJsonFormatConverterBase { - public override bool CanRead - { - get { return true; } - } - - public override bool CanWrite - { - get { return true; } - } - - public override Types.Picture? ReadJson(Newtonsoft.Json.JsonReader reader, Type objectType, Types.Picture? existingValue, bool hasExistingValue, Newtonsoft.Json.JsonSerializer serializer) - { - if (reader.TokenType == Newtonsoft.Json.JsonToken.Null) - { - return existingValue; - } - else if (reader.TokenType == Newtonsoft.Json.JsonToken.String) - { - string? value = serializer.Deserialize(reader); - if (value == null) - return existingValue; - - return Newtonsoft.Json.JsonConvert.DeserializeObject(value); - } - - throw new Newtonsoft.Json.JsonReaderException(); - } - - public override void WriteJson(Newtonsoft.Json.JsonWriter writer, Types.Picture? value, Newtonsoft.Json.JsonSerializer serializer) - { - if (value != null) - writer.WriteValue(Newtonsoft.Json.JsonConvert.SerializeObject(value, Newtonsoft.Json.Formatting.None)); - else - writer.WriteNull(); - } } - internal class SystemTextJsonPictureConverter : System.Text.Json.Serialization.JsonConverter + internal class RequestPropertyPictureSystemTextJsonConverter : System.Text.Json.Converters.TextualObjectInJsonFormatConverterBase { - public override Types.Picture? Read(ref System.Text.Json.Utf8JsonReader reader, Type typeToConvert, System.Text.Json.JsonSerializerOptions options) - { - if (reader.TokenType == System.Text.Json.JsonTokenType.Null) - { - return null; - } - else if (reader.TokenType == System.Text.Json.JsonTokenType.String) - { - string? value = reader.GetString(); - if (value == null) - return null; - - return System.Text.Json.JsonSerializer.Deserialize(value, options); - } - - throw new System.Text.Json.JsonException(); - } - - public override void Write(System.Text.Json.Utf8JsonWriter writer, Types.Picture? value, System.Text.Json.JsonSerializerOptions options) - { - if (value != null) - writer.WriteStringValue(System.Text.Json.JsonSerializer.Serialize(value, options)); - else - writer.WriteNullValue(); - } } } @@ -110,9 +50,9 @@ namespace SKIT.FlurlHttpClient.Wechat.Api.Models /// 获取或设置门店图片信息。 /// [Newtonsoft.Json.JsonProperty("pic_list")] - [Newtonsoft.Json.JsonConverter(typeof(Converters.NewtonsoftJsonPictureConverter))] + [Newtonsoft.Json.JsonConverter(typeof(Converters.RequestPropertyPictureNewtonsoftJsonConverter))] [System.Text.Json.Serialization.JsonPropertyName("pic_list")] - [System.Text.Json.Serialization.JsonConverter(typeof(Converters.SystemTextJsonPictureConverter))] + [System.Text.Json.Serialization.JsonConverter(typeof(Converters.RequestPropertyPictureSystemTextJsonConverter))] public Types.Picture Picture { get; set; } = new Types.Picture(); /// diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Wxa/WxaStore/WxaUpdateStoreRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Wxa/WxaStore/WxaUpdateStoreRequest.cs index 77fe825a..40a07a18 100644 --- a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Wxa/WxaStore/WxaUpdateStoreRequest.cs +++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Wxa/WxaStore/WxaUpdateStoreRequest.cs @@ -16,72 +16,12 @@ namespace SKIT.FlurlHttpClient.Wechat.Api.Models internal static class Converters { - internal class NewtonsoftJsonPictureConverter : Newtonsoft.Json.JsonConverter + internal class RequestPropertyPictureNewtonsoftJsonConverter : Newtonsoft.Json.Converters.TextualObjectInJsonFormatConverterBase { - public override bool CanRead - { - get { return true; } - } - - public override bool CanWrite - { - get { return true; } - } - - public override Types.Picture? ReadJson(Newtonsoft.Json.JsonReader reader, Type objectType, Types.Picture? existingValue, bool hasExistingValue, Newtonsoft.Json.JsonSerializer serializer) - { - if (reader.TokenType == Newtonsoft.Json.JsonToken.Null) - { - return existingValue; - } - else if (reader.TokenType == Newtonsoft.Json.JsonToken.String) - { - string? value = serializer.Deserialize(reader); - if (value == null) - return existingValue; - - return Newtonsoft.Json.JsonConvert.DeserializeObject(value); - } - - throw new Newtonsoft.Json.JsonReaderException(); - } - - public override void WriteJson(Newtonsoft.Json.JsonWriter writer, Types.Picture? value, Newtonsoft.Json.JsonSerializer serializer) - { - if (value != null) - writer.WriteValue(Newtonsoft.Json.JsonConvert.SerializeObject(value, Newtonsoft.Json.Formatting.None)); - else - writer.WriteNull(); - } } - internal class SystemTextJsonPictureConverter : System.Text.Json.Serialization.JsonConverter + internal class RequestPropertyPictureSystemTextJsonConverter : System.Text.Json.Converters.TextualObjectInJsonFormatConverterBase { - public override Types.Picture? Read(ref System.Text.Json.Utf8JsonReader reader, Type typeToConvert, System.Text.Json.JsonSerializerOptions options) - { - if (reader.TokenType == System.Text.Json.JsonTokenType.Null) - { - return null; - } - else if (reader.TokenType == System.Text.Json.JsonTokenType.String) - { - string? value = reader.GetString(); - if (value == null) - return null; - - return System.Text.Json.JsonSerializer.Deserialize(value, options); - } - - throw new System.Text.Json.JsonException(); - } - - public override void Write(System.Text.Json.Utf8JsonWriter writer, Types.Picture? value, System.Text.Json.JsonSerializerOptions options) - { - if (value != null) - writer.WriteStringValue(System.Text.Json.JsonSerializer.Serialize(value, options)); - else - writer.WriteNullValue(); - } } } @@ -103,9 +43,9 @@ namespace SKIT.FlurlHttpClient.Wechat.Api.Models /// 获取或设置门店图片信息。 /// [Newtonsoft.Json.JsonProperty("pic_list")] - [Newtonsoft.Json.JsonConverter(typeof(Converters.NewtonsoftJsonPictureConverter))] + [Newtonsoft.Json.JsonConverter(typeof(Converters.RequestPropertyPictureNewtonsoftJsonConverter))] [System.Text.Json.Serialization.JsonPropertyName("pic_list")] - [System.Text.Json.Serialization.JsonConverter(typeof(Converters.SystemTextJsonPictureConverter))] + [System.Text.Json.Serialization.JsonConverter(typeof(Converters.RequestPropertyPictureSystemTextJsonConverter))] public Types.Picture Picture { get; set; } = new Types.Picture(); /// diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/WxaApi/Operation/WxaApiLogGetPerformanceResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/WxaApi/Operation/WxaApiLogGetPerformanceResponse.cs index 9a343f01..8a11e890 100644 --- a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/WxaApi/Operation/WxaApiLogGetPerformanceResponse.cs +++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/WxaApi/Operation/WxaApiLogGetPerformanceResponse.cs @@ -49,72 +49,12 @@ namespace SKIT.FlurlHttpClient.Wechat.Api.Models internal static class Converters { - internal class NewtonsoftJsonDefaultTimeDataConverter : Newtonsoft.Json.JsonConverter + internal class ResponsePropertyDefaultTimeDataNewtonsoftJsonConverter : Newtonsoft.Json.Converters.TextualObjectInJsonFormatConverterBase { - public override bool CanRead - { - get { return true; } - } - - public override bool CanWrite - { - get { return true; } - } - - public override Types.DefaultTimeData? ReadJson(Newtonsoft.Json.JsonReader reader, Type objectType, Types.DefaultTimeData? existingValue, bool hasExistingValue, Newtonsoft.Json.JsonSerializer serializer) - { - if (reader.TokenType == Newtonsoft.Json.JsonToken.Null) - { - return existingValue; - } - else if (reader.TokenType == Newtonsoft.Json.JsonToken.String) - { - string? value = serializer.Deserialize(reader); - if (value == null) - return existingValue; - - return Newtonsoft.Json.JsonConvert.DeserializeObject(value); - } - - throw new Newtonsoft.Json.JsonReaderException(); - } - - public override void WriteJson(Newtonsoft.Json.JsonWriter writer, Types.DefaultTimeData? value, Newtonsoft.Json.JsonSerializer serializer) - { - if (value != null) - writer.WriteValue(Newtonsoft.Json.JsonConvert.SerializeObject(value, Newtonsoft.Json.Formatting.None)); - else - writer.WriteNull(); - } } - internal class SystemTextJsonDefaultTimeDataConverter : System.Text.Json.Serialization.JsonConverter + internal class ResponsePropertyDefaultTimeDataSystemTextJsonConverter : System.Text.Json.Converters.TextualObjectInJsonFormatConverterBase { - public override Types.DefaultTimeData? Read(ref System.Text.Json.Utf8JsonReader reader, Type typeToConvert, System.Text.Json.JsonSerializerOptions options) - { - if (reader.TokenType == System.Text.Json.JsonTokenType.Null) - { - return null; - } - else if (reader.TokenType == System.Text.Json.JsonTokenType.String) - { - string? value = reader.GetString(); - if (value == null) - return null; - - return System.Text.Json.JsonSerializer.Deserialize(value, options); - } - - throw new System.Text.Json.JsonException(); - } - - public override void Write(System.Text.Json.Utf8JsonWriter writer, Types.DefaultTimeData? value, System.Text.Json.JsonSerializerOptions options) - { - if (value != null) - writer.WriteStringValue(System.Text.Json.JsonSerializer.Serialize(value, options)); - else - writer.WriteNullValue(); - } } } @@ -122,9 +62,9 @@ namespace SKIT.FlurlHttpClient.Wechat.Api.Models /// 获取或设置查询数据。 /// [Newtonsoft.Json.JsonProperty("default_time_data")] - [Newtonsoft.Json.JsonConverter(typeof(Converters.NewtonsoftJsonDefaultTimeDataConverter))] + [Newtonsoft.Json.JsonConverter(typeof(Converters.ResponsePropertyDefaultTimeDataNewtonsoftJsonConverter))] [System.Text.Json.Serialization.JsonPropertyName("default_time_data")] - [System.Text.Json.Serialization.JsonConverter(typeof(Converters.SystemTextJsonDefaultTimeDataConverter))] + [System.Text.Json.Serialization.JsonConverter(typeof(Converters.ResponsePropertyDefaultTimeDataSystemTextJsonConverter))] public Types.DefaultTimeData? DefaultTimeData { get; set; } /// diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/WxaComponent/Code/WxaSubmitAuditRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/WxaComponent/Code/WxaSubmitAuditRequest.cs index 78ccabd7..aab5e183 100644 --- a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/WxaComponent/Code/WxaSubmitAuditRequest.cs +++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/WxaComponent/Code/WxaSubmitAuditRequest.cs @@ -136,77 +136,6 @@ namespace SKIT.FlurlHttpClient.Wechat.Api.Models } } - internal static class Converters - { - internal class NewtonsoftJsonMediaIdListConverter : Newtonsoft.Json.JsonConverter?> - { - public override bool CanRead - { - get { return true; } - } - - public override bool CanWrite - { - get { return true; } - } - - public override IList? ReadJson(Newtonsoft.Json.JsonReader reader, Type objectType, IList? existingValue, bool hasExistingValue, Newtonsoft.Json.JsonSerializer serializer) - { - if (reader.TokenType == Newtonsoft.Json.JsonToken.Null) - { - return existingValue; - } - else if (reader.TokenType == Newtonsoft.Json.JsonToken.String) - { - string? value = serializer.Deserialize(reader); - if (value == null) - return existingValue; - - return value.Split(new char[] { '|' }, StringSplitOptions.RemoveEmptyEntries).ToList(); - } - - throw new Newtonsoft.Json.JsonReaderException(); - } - - public override void WriteJson(Newtonsoft.Json.JsonWriter writer, IList? value, Newtonsoft.Json.JsonSerializer serializer) - { - if (value != null) - writer.WriteValue(string.Join("|", value)); - else - writer.WriteNull(); - } - } - - internal class SystemTextJsonMediaIdListConverter : System.Text.Json.Serialization.JsonConverter?> - { - public override IList? Read(ref System.Text.Json.Utf8JsonReader reader, Type typeToConvert, System.Text.Json.JsonSerializerOptions options) - { - if (reader.TokenType == System.Text.Json.JsonTokenType.Null) - { - return null; - } - else if (reader.TokenType == System.Text.Json.JsonTokenType.String) - { - string? value = reader.GetString(); - if (value == null) - return null; - - return value.Split(new char[] { '|' }, StringSplitOptions.RemoveEmptyEntries).ToList(); - } - - throw new System.Text.Json.JsonException(); - } - - public override void Write(System.Text.Json.Utf8JsonWriter writer, IList? value, System.Text.Json.JsonSerializerOptions options) - { - if (value != null) - writer.WriteStringValue(string.Join("|", value)); - else - writer.WriteNullValue(); - } - } - } - /// /// 获取或设置审核页面列表。 /// @@ -239,9 +168,9 @@ namespace SKIT.FlurlHttpClient.Wechat.Api.Models /// 获取或设置反馈附件 MediaId 列表。 /// [Newtonsoft.Json.JsonProperty("feedback_stuff")] - [Newtonsoft.Json.JsonConverter(typeof(Converters.NewtonsoftJsonMediaIdListConverter))] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.TextualStringListWithPipeSplitConverter))] [System.Text.Json.Serialization.JsonPropertyName("feedback_stuff")] - [System.Text.Json.Serialization.JsonConverter(typeof(Converters.SystemTextJsonMediaIdListConverter))] + [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.TextualStringListWithPipeSplitConverter))] public IList? FeedbackStuffMediaIdList { get; set; } /// diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/README.md b/src/SKIT.FlurlHttpClient.Wechat.Api/README.md new file mode 100644 index 00000000..a68cbe18 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.Api/README.md @@ -0,0 +1,25 @@ +## SKIT.FlurlHttpClient.Wechat.Api + +[![GitHub Stars](https://img.shields.io/github/stars/fudiwei/DotNetCore.SKIT.FlurlHttpClient.Wechat?logo=github&label=Stars)](https://github.com/fudiwei/DotNetCore.SKIT.FlurlHttpClient.Wechat) [![GitHub Forks](https://img.shields.io/github/forks/fudiwei/DotNetCore.SKIT.FlurlHttpClient.Wechat?logo=github&label=Forks)](https://github.com/fudiwei/DotNetCore.SKIT.FlurlHttpClient.Wechat) [![NuGet Download](https://img.shields.io/nuget/dt/SKIT.FlurlHttpClient.Wechat.Api.svg?sanitize=true&label=Downloads)](https://www.nuget.org/packages/SKIT.FlurlHttpClient.Wechat.Api) [![License](https://img.shields.io/github/license/fudiwei/DotNetCore.SKIT.FlurlHttpClient.Wechat?label=License)](https://mit-license.org/) + +基于 `Flurl.Http` 的微信公众平台 & 微信开放平台 API 客户端。 + +--- + +### 【功能特性】 + +- 基于微信公众平台 & 微信开放平台 API 封装。 +- 提供了微信公众平台 & 微信开放平台 API 所需的 SHA-1、HMAC-SHA-256、AES 等算法工具类。 +- 提供了 JS-SDK 签名、解析回调通知事件等扩展方法。 + +--- + +### 【开发文档】 + +[点此查看](https://github.com/fudiwei/DotNetCore.SKIT.FlurlHttpClient.Wechat)。 + +--- + +### 【更新日志】 + +[点此查看](https://github.com/fudiwei/DotNetCore.SKIT.FlurlHttpClient.Wechat/blob/main/CHANGELOG.md)。 \ No newline at end of file diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/SKIT.FlurlHttpClient.Wechat.Api.csproj b/src/SKIT.FlurlHttpClient.Wechat.Api/SKIT.FlurlHttpClient.Wechat.Api.csproj index ca3e00f6..7b458765 100644 --- a/src/SKIT.FlurlHttpClient.Wechat.Api/SKIT.FlurlHttpClient.Wechat.Api.csproj +++ b/src/SKIT.FlurlHttpClient.Wechat.Api/SKIT.FlurlHttpClient.Wechat.Api.csproj @@ -9,6 +9,8 @@ SKIT.FlurlHttpClient.Wechat.Api + LOGO.png + README.md MIT https://github.com/fudiwei/DotNetCore.SKIT.FlurlHttpClient.Wechat Flurl.Http Wechat Weixin MicroMessage MiniProgram MiniGame MiniStore 微信 公众号 服务号 订阅号 小程序 小游戏 小商店 公众平台 开放平台 微信公众号 微信服务号 微信订阅号 微信小程序 微信小游戏 微信小商店 微信公众平台 微信开放平台 @@ -17,17 +19,28 @@ Fu Diwei git https://github.com/fudiwei/DotNetCore.SKIT.FlurlHttpClient.Wechat.git - true - true - snupkg + + true + true + true + true + true + snupkg + + + + + + + - + diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Utilities/AESUtility.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Utilities/AESUtility.cs index 5310b954..c1ef2abd 100644 --- a/src/SKIT.FlurlHttpClient.Wechat.Api/Utilities/AESUtility.cs +++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Utilities/AESUtility.cs @@ -4,6 +4,9 @@ using System.Text; namespace SKIT.FlurlHttpClient.Wechat.Api.Utilities { + /// + /// AES 算法工具类。 + /// public static class AESUtility { /// diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Utilities/HMACSHA256Utility.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Utilities/HMACUtility.cs similarity index 77% rename from src/SKIT.FlurlHttpClient.Wechat.Api/Utilities/HMACSHA256Utility.cs rename to src/SKIT.FlurlHttpClient.Wechat.Api/Utilities/HMACUtility.cs index 9e947330..cde3e838 100644 --- a/src/SKIT.FlurlHttpClient.Wechat.Api/Utilities/HMACSHA256Utility.cs +++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Utilities/HMACUtility.cs @@ -5,17 +5,17 @@ using System.Text; namespace SKIT.FlurlHttpClient.Wechat.Api.Utilities { /// - /// HMAC-SHA-256 算法工具类。 + /// HMAC 算法工具类。 /// - public static class HMACSHA256Utility + public static class HMACUtility { /// - /// 获取信息摘要。 + /// 获取 HMAC-SHA-256 消息认证码。 /// /// 密钥字节数组。 /// 信息字节数组。 /// 信息摘要。 - public static string Hash(byte[] secretBytes, byte[] bytes) + public static string HashWithSHA256(byte[] secretBytes, byte[] bytes) { if (secretBytes == null) throw new ArgumentNullException(nameof(secretBytes)); if (bytes == null) throw new ArgumentNullException(nameof(bytes)); @@ -26,19 +26,19 @@ namespace SKIT.FlurlHttpClient.Wechat.Api.Utilities } /// - /// 获取信息摘要。 + /// 获取 HMAC-SHA-256 消息认证码。 /// /// 密钥。 /// 文本信息。 /// 信息摘要。 - public static string Hash(string secret, string message) + public static string HashWithSHA256(string secret, string message) { if (secret == null) throw new ArgumentNullException(nameof(secret)); if (message == null) throw new ArgumentNullException(nameof(message)); byte[] secretBytes = Encoding.UTF8.GetBytes(secret); byte[] bytes = Encoding.UTF8.GetBytes(message); - return Hash(secretBytes, bytes); + return HashWithSHA256(secretBytes, bytes); } } } diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Utilities/SHA1Utility.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Utilities/SHA1Utility.cs index 19f4a711..32204c84 100644 --- a/src/SKIT.FlurlHttpClient.Wechat.Api/Utilities/SHA1Utility.cs +++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Utilities/SHA1Utility.cs @@ -10,7 +10,7 @@ namespace SKIT.FlurlHttpClient.Wechat.Api.Utilities public static class SHA1Utility { /// - /// 获取信息摘要。 + /// 获取 SHA-1 信息摘要。 /// /// 信息字节数组。 /// 信息摘要。 @@ -24,7 +24,7 @@ namespace SKIT.FlurlHttpClient.Wechat.Api.Utilities } /// - /// 获取信息摘要。 + /// 获取 SHA-1 信息摘要。 /// /// 文本信息。 /// 信息摘要。 diff --git a/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/SKIT.FlurlHttpClient.Wechat.Api.UnitTests.csproj b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/SKIT.FlurlHttpClient.Wechat.Api.UnitTests.csproj index 53c1e4a9..de3e4aca 100644 --- a/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/SKIT.FlurlHttpClient.Wechat.Api.UnitTests.csproj +++ b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/SKIT.FlurlHttpClient.Wechat.Api.UnitTests.csproj @@ -2,7 +2,10 @@ netcoreapp3.1; net6.0 - 9.0 + latest + enable + true + false diff --git a/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/TestCase_AESUtilityTests.cs b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/TestCase_AESUtilityTests.cs new file mode 100644 index 00000000..773e1df8 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/TestCase_AESUtilityTests.cs @@ -0,0 +1,21 @@ +using System; +using Xunit; + +namespace SKIT.FlurlHttpClient.Wechat.Api.UnitTests +{ + public class TestCase_AESUtilityTests + { + [Fact(DisplayName = "测试用例:AES-CBC 解密")] + public void TestAESCBCDecryption() + { + string iv = "KEWv/gyiIwAfHvjrLeaX6w=="; + string key = "YZJqKnNFi0KAiKUc0ggC2g=="; + string cipherText = "Gu2PVnxVWl+jK4F8c0liGxfkB5Bj3m5HRvwgEIk1Yb+36RZ3Bg7YmUnud/ooiHz0PQroipsH7GCjlGwUeT04NwmrFaP1y3dRYPLpS43ed9QZWcFIFo+8vTs3Zco6S98DUvaNEAs8duhz/BzfBOZaIHMziRqEtPFI0ZDzCgJluBirJ6Wl3UkygZ5/QLo3KA53qGdip7K48Rq8XbCwuidTCw=="; + + string expectedPlainData = "{\"phoneNumber\":\"186****5613\",\"purePhoneNumber\":\"186****5613\",\"countryCode\":\"86\",\"watermark\":{\"timestamp\":1634545675,\"appid\":\"wxc****17e87e0e0a7\"}}"; + string actualPlainData = Utilities.AESUtility.DecryptWithCBC(encodingKey: key, encodingIV: iv, encodingCipherText: cipherText); + + Assert.Equal(expectedPlainData, actualPlainData, ignoreCase: true); + } + } +} diff --git a/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/WechatApiExecuteCVTests.cs b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/TestCase_ApiExecuteCVTests.cs similarity index 93% rename from test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/WechatApiExecuteCVTests.cs rename to test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/TestCase_ApiExecuteCVTests.cs index f95afce9..214a372b 100644 --- a/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/WechatApiExecuteCVTests.cs +++ b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/TestCase_ApiExecuteCVTests.cs @@ -7,10 +7,10 @@ using Xunit; namespace SKIT.FlurlHttpClient.Wechat.Api.UnitTests { - public class WechatApiExecuteCVTests + public class TestCase_ApiExecuteCVTests { - [Fact(DisplayName = "[POST] /cv/img/qrcode")] - public async Task CVImageQrcodeTest() + [Fact(DisplayName = "测试用例:调用 API [POST] /cv/img/qrcode")] + public async Task TestExecuteCVImageQrcode() { var request = new Models.CVImageQrcodeRequest() { @@ -24,8 +24,8 @@ namespace SKIT.FlurlHttpClient.Wechat.Api.UnitTests Assert.NotNull(response.ImageSize); } - [Fact(DisplayName = "[POST] /cv/img/aicrop")] - public async Task CVImageAICropTest() + [Fact(DisplayName = "测试用例:调用 API [POST] /cv/img/aicrop")] + public async Task TestExecuteCVImageAICrop() { var request = new Models.CVImageAICropRequest() { @@ -39,8 +39,8 @@ namespace SKIT.FlurlHttpClient.Wechat.Api.UnitTests Assert.NotNull(response.ImageSize); } - [Fact(DisplayName = "[POST] /cv/img/superresolution")] - public async Task CVImageSuperResolutionTest() + [Fact(DisplayName = "测试用例:调用 API [POST] /cv/img/superresolution")] + public async Task TestExecuteCVImageSuperResolution() { var request = new Models.CVImageSuperResolutionRequest() { @@ -53,8 +53,8 @@ namespace SKIT.FlurlHttpClient.Wechat.Api.UnitTests Assert.NotNull(response.MediaId); } - [Fact(DisplayName = "[POST] /cv/ocr/comm")] - public async Task CVOCRCommonTest() + [Fact(DisplayName = "测试用例:调用 API [POST] /cv/ocr/comm")] + public async Task TestExecuteCVOCRCommon() { var request = new Models.CVOCRCommonRequest() { diff --git a/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/WechatApiExecuteCgibinMaterialTests.cs b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/TestCase_ApiExecuteCgibinMaterialTests.cs similarity index 75% rename from test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/WechatApiExecuteCgibinMaterialTests.cs rename to test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/TestCase_ApiExecuteCgibinMaterialTests.cs index 8ddb3474..e3e82109 100644 --- a/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/WechatApiExecuteCgibinMaterialTests.cs +++ b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/TestCase_ApiExecuteCgibinMaterialTests.cs @@ -7,10 +7,10 @@ using Xunit; namespace SKIT.FlurlHttpClient.Wechat.Api.UnitTests { - public class WechatApiExecuteCgibinMaterialTests + public class TestCase_ApiExecuteCgibinMaterialTests { - [Fact(DisplayName = "[GET] /cgi-bin/material/get_materialcount")] - public async Task CgibinMaterialGetMaterialCountTest() + [Fact(DisplayName = "测试用例:调用 API [GET] /cgi-bin/material/get_materialcount")] + public async Task TestExecuteCgibinMaterialGetMaterialCount() { var request = new Models.CgibinMaterialGetMaterialCountRequest() { @@ -21,8 +21,8 @@ namespace SKIT.FlurlHttpClient.Wechat.Api.UnitTests Assert.True(response.IsSuccessful()); } - [Fact(DisplayName = "[POST] /cgi-bin/material/batchget_material")] - public async Task CgibinMaterialBatchGetMaterialTest() + [Fact(DisplayName = "测试用例:调用 API [POST] /cgi-bin/material/batchget_material")] + public async Task TestExecuteCgibinMaterialBatchGetMaterial() { var request = new Models.CgibinMaterialBatchGetMaterialRequest() { diff --git a/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/WechatApiExecuteCgibinMediaTests.cs b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/TestCase_ApiExecuteCgibinMediaTests.cs similarity index 90% rename from test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/WechatApiExecuteCgibinMediaTests.cs rename to test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/TestCase_ApiExecuteCgibinMediaTests.cs index d477a202..92f9bb39 100644 --- a/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/WechatApiExecuteCgibinMediaTests.cs +++ b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/TestCase_ApiExecuteCgibinMediaTests.cs @@ -7,10 +7,10 @@ using Xunit; namespace SKIT.FlurlHttpClient.Wechat.Api.UnitTests { - public class WechatApiExecuteCgibinMediaTests + public class TestCase_ApiExecuteCgibinMediaTests { - [Fact(DisplayName = "[POST] /cgi-bin/media/upload")] - public async Task CgibinMediaUploadTest() + [Fact(DisplayName = "测试用例:调用 API [POST] /cgi-bin/media/upload")] + public async Task TestExecuteCgibinMediaUpload() { var request = new Models.CgibinMediaUploadRequest() { @@ -26,8 +26,8 @@ namespace SKIT.FlurlHttpClient.Wechat.Api.UnitTests Assert.NotNull(response.MediaId); } - [Fact(DisplayName = "[GET] /cgi-bin/media/get")] - public async Task CgibinMediaGetTest() + [Fact(DisplayName = "测试用例:调用 API [GET] /cgi-bin/media/get")] + public async Task TestExecuteCgibinMediaGet() { var request = new Models.CgibinMediaGetRequest() { @@ -39,8 +39,8 @@ namespace SKIT.FlurlHttpClient.Wechat.Api.UnitTests Assert.True(response.IsSuccessful()); } - [Fact(DisplayName = "[POST] /cgi-bin/media/uploadimg")] - public async Task CgibinMediaUploadImageTest() + [Fact(DisplayName = "测试用例:调用 API [POST] /cgi-bin/media/uploadimg")] + public async Task TestExecuteCgibinMediaUploadImage() { var request = new Models.CgibinMediaUploadImageRequest() { diff --git a/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/WechatApiExecuteCgibinMessageMassTests.cs b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/TestCase_ApiExecuteCgibinMessageMassTests.cs similarity index 76% rename from test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/WechatApiExecuteCgibinMessageMassTests.cs rename to test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/TestCase_ApiExecuteCgibinMessageMassTests.cs index d5ad156b..abbbda70 100644 --- a/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/WechatApiExecuteCgibinMessageMassTests.cs +++ b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/TestCase_ApiExecuteCgibinMessageMassTests.cs @@ -7,10 +7,10 @@ using Xunit; namespace SKIT.FlurlHttpClient.Wechat.Api.UnitTests { - public class WechatApiExecuteCgibinMessageMassTests + public class TestCase_ApiExecuteCgibinMessageMassTests { - [Fact(DisplayName = "[POST] /cgi-bin/message/mass/send")] - public async Task CgibinMessageMassSendTest() + [Fact(DisplayName = "测试用例:调用 API [POST] /cgi-bin/message/mass/send")] + public async Task TestExecuteCgibinMessageMassSend() { var request = new Models.CgibinMessageMassSendRequest() { @@ -27,8 +27,8 @@ namespace SKIT.FlurlHttpClient.Wechat.Api.UnitTests Assert.True(response.MessageId > 0); } - [Fact(DisplayName = "[POST] /cgi-bin/message/mass/preview")] - public async Task CgibinMessageMassPreviewTest() + [Fact(DisplayName = "测试用例:调用 API [POST] /cgi-bin/message/mass/preview")] + public async Task TestExecuteCgibinMessageMassPreview() { var request = new Models.CgibinMessageMassPreviewRequest() { @@ -45,8 +45,8 @@ namespace SKIT.FlurlHttpClient.Wechat.Api.UnitTests Assert.True(response.IsSuccessful()); } - [Fact(DisplayName = "[GET] /cgi-bin/message/mass/speed/get")] - public async Task CgibinMessageMassSpeedGetTest() + [Fact(DisplayName = "测试用例:调用 API [GET] /cgi-bin/message/mass/speed/get")] + public async Task TestExecuteCgibinMessageMassSpeedGet() { var request = new Models.CgibinMessageMassSpeedGetRequest() { @@ -58,8 +58,8 @@ namespace SKIT.FlurlHttpClient.Wechat.Api.UnitTests Assert.True(response.SpeedValue > 0); } - [Fact(DisplayName = "[POST] /cgi-bin/message/mass/speed/set")] - public async Task CgibinMessageMassSpeedSetTest() + [Fact(DisplayName = "测试用例:调用 API [POST] /cgi-bin/message/mass/speed/set")] + public async Task TestExecuteCgibinMessageMassSpeedSet() { var request = new Models.CgibinMessageMassSpeedSetRequest() { diff --git a/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/WechatApiExecuteCgibinQrcodeTests.cs b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/TestCase_ApiExecuteCgibinQrcodeTests.cs similarity index 82% rename from test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/WechatApiExecuteCgibinQrcodeTests.cs rename to test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/TestCase_ApiExecuteCgibinQrcodeTests.cs index 63ec0b2c..e5ed42b5 100644 --- a/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/WechatApiExecuteCgibinQrcodeTests.cs +++ b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/TestCase_ApiExecuteCgibinQrcodeTests.cs @@ -7,10 +7,10 @@ using Xunit; namespace SKIT.FlurlHttpClient.Wechat.Api.UnitTests { - public class WechatApiExecuteCgibinQrcodeTests + public class TestCase_ApiExecuteCgibinQrcodeTests { - [Fact(DisplayName = "[POST] /cgi-bin/qrcode/create")] - public async Task CgibinQrcodeCreateTest() + [Fact(DisplayName = "测试用例:调用 API [POST] /cgi-bin/qrcode/create")] + public async Task TestExecuteCgibinQrcodeCreate() { var request = new Models.CgibinQrcodeCreateRequest() { diff --git a/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/WechatApiExecuteCgibinTagsTests.cs b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/TestCase_ApiExecuteCgibinTagsTests.cs similarity index 77% rename from test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/WechatApiExecuteCgibinTagsTests.cs rename to test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/TestCase_ApiExecuteCgibinTagsTests.cs index db8ebaf0..eb3138fc 100644 --- a/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/WechatApiExecuteCgibinTagsTests.cs +++ b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/TestCase_ApiExecuteCgibinTagsTests.cs @@ -7,10 +7,10 @@ using Xunit; namespace SKIT.FlurlHttpClient.Wechat.Api.UnitTests { - public class WechatApiExecuteCgibinTagsTests + public class TestCase_ApiExecuteCgibinTagsTests { - [Fact(DisplayName = "[POST] /cgi-bin/tags/create")] - public async Task CgibinTagsCreateTest() + [Fact(DisplayName = "测试用例:调用 API [POST] /cgi-bin/tags/create")] + public async Task TestExecuteCgibinTagsCreate() { var request = new Models.CgibinTagsCreateRequest() { @@ -26,8 +26,8 @@ namespace SKIT.FlurlHttpClient.Wechat.Api.UnitTests Assert.Equal(request.Tag.Name, response.Tag.Name); } - [Fact(DisplayName = "[POST] /cgi-bin/tags/get")] - public async Task CgibinTagsGetTest() + [Fact(DisplayName = "测试用例:调用 API [POST] /cgi-bin/tags/get")] + public async Task TestExecuteCgibinTagsGet() { var request = new Models.CgibinTagsGetRequest() { diff --git a/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/WechatApiExecuteCgibinTests.cs b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/TestCase_ApiExecuteCgibinTests.cs similarity index 68% rename from test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/WechatApiExecuteCgibinTests.cs rename to test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/TestCase_ApiExecuteCgibinTests.cs index 50bd4834..e293df2a 100644 --- a/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/WechatApiExecuteCgibinTests.cs +++ b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/TestCase_ApiExecuteCgibinTests.cs @@ -7,10 +7,10 @@ using Xunit; namespace SKIT.FlurlHttpClient.Wechat.Api.UnitTests { - public class WechatApiExecuteCgibinTests + public class TestCase_ApiExecuteCgibinTests { - [Fact(DisplayName = "[GET] /cgi-bin/token")] - public async Task CgibinTokenTest() + [Fact(DisplayName = "测试用例:调用 API [GET] /cgi-bin/token")] + public async Task TestExecuteCgibinToken() { var request = new Models.CgibinTokenRequest(); var response = await TestClients.Instance.ExecuteCgibinTokenAsync(request); @@ -18,8 +18,8 @@ namespace SKIT.FlurlHttpClient.Wechat.Api.UnitTests Assert.NotNull(response.AccessToken); } - [Fact(DisplayName = "[GET] /cgi-bin/ticket/getticket")] - public async Task CgibinTicketGetTicketTest() + [Fact(DisplayName = "测试用例:调用 API [GET] /cgi-bin/ticket/getticket")] + public async Task TestExecuteCgibinTicketGetTicket() { var request = new Models.CgibinTicketGetTicketRequest() { @@ -30,8 +30,8 @@ namespace SKIT.FlurlHttpClient.Wechat.Api.UnitTests Assert.NotNull(response.Ticket); } - [Fact(DisplayName = "[GET] /cgi-bin/getcallbackip")] - public async Task CgibinGetCallbackIpTest() + [Fact(DisplayName = "测试用例:调用 API [GET] /cgi-bin/getcallbackip")] + public async Task TestExecuteCgibinGetCallbackIp() { var request = new Models.CgibinGetCallbackIpRequest() { @@ -42,8 +42,8 @@ namespace SKIT.FlurlHttpClient.Wechat.Api.UnitTests Assert.NotEmpty(response.IPList); } - [Fact(DisplayName = "[GET] /cgi-bin/get_api_domain_ip")] - public async Task CgibinGetApiDomainIpTest() + [Fact(DisplayName = "测试用例:调用 API [GET] /cgi-bin/get_api_domain_ip")] + public async Task TestExecuteCgibinGetApiDomainIp() { var request = new Models.CgibinGetApiDomainIpRequest() { @@ -54,8 +54,8 @@ namespace SKIT.FlurlHttpClient.Wechat.Api.UnitTests Assert.NotEmpty(response.IPList); } - [Fact(DisplayName = "[POST] /cgi-bin/clear_quota")] - public async Task CgibinClearQuotaTest() + [Fact(DisplayName = "测试用例:调用 API [POST] /cgi-bin/clear_quota")] + public async Task TestExecuteCgibinClearQuota() { var request = new Models.CgibinClearQuotaRequest() { diff --git a/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/WechatApiExecuteCgibinUserTests.cs b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/TestCase_ApiExecuteCgibinUserTests.cs similarity index 77% rename from test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/WechatApiExecuteCgibinUserTests.cs rename to test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/TestCase_ApiExecuteCgibinUserTests.cs index 93028c86..591b1025 100644 --- a/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/WechatApiExecuteCgibinUserTests.cs +++ b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/TestCase_ApiExecuteCgibinUserTests.cs @@ -7,10 +7,10 @@ using Xunit; namespace SKIT.FlurlHttpClient.Wechat.Api.UnitTests { - public class WechatApiExecuteCgibinUserTests + public class TestCase_ApiExecuteCgibinUserTests { - [Fact(DisplayName = "[GET] /cgi-bin/user/info")] - public async Task CgibinUserInfoTest() + [Fact(DisplayName = "测试用例:调用 API [GET] /cgi-bin/user/info")] + public async Task TestExecuteCgibinUserInfo() { var request = new Models.CgibinUserInfoRequest() { @@ -24,8 +24,8 @@ namespace SKIT.FlurlHttpClient.Wechat.Api.UnitTests Assert.True(response.IsSubscribed); } - [Fact(DisplayName = "[POST] /cgi-bin/user/info/batchget")] - public async Task CgibinUserInfoBatchGetTest() + [Fact(DisplayName = "测试用例:调用 API [POST] /cgi-bin/user/info/batchget")] + public async Task TestExecuteCgibinUserInfoBatchGet() { var request = new Models.CgibinUserInfoBatchGetRequest() { @@ -43,8 +43,8 @@ namespace SKIT.FlurlHttpClient.Wechat.Api.UnitTests Assert.True(response.UserList.First().IsSubscribed); } - [Fact(DisplayName = "[POST] /cgi-bin/user/info/updateremark")] - public async Task CgibinUserInfoUpdateRemarkTest() + [Fact(DisplayName = "测试用例:调用 API [POST] /cgi-bin/user/info/updateremark")] + public async Task TestExecuteCgibinUserInfoUpdateRemark() { var request = new Models.CgibinUserInfoUpdateRemarkRequest() { @@ -57,8 +57,8 @@ namespace SKIT.FlurlHttpClient.Wechat.Api.UnitTests Assert.Equal(0, response.ErrorCode); } - [Fact(DisplayName = "[GET] /cgi-bin/user/get")] - public async Task CgibinUserGetTest() + [Fact(DisplayName = "测试用例:调用 API [GET] /cgi-bin/user/get")] + public async Task TestExecuteCgibinUserGet() { var request = new Models.CgibinUserGetRequest() { diff --git a/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/WechatApiExecuteSemanticTests.cs b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/TestCase_ApiExecuteSemanticTests.cs similarity index 82% rename from test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/WechatApiExecuteSemanticTests.cs rename to test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/TestCase_ApiExecuteSemanticTests.cs index 94eb35bf..f10253b7 100644 --- a/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/WechatApiExecuteSemanticTests.cs +++ b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/TestCase_ApiExecuteSemanticTests.cs @@ -7,10 +7,10 @@ using Xunit; namespace SKIT.FlurlHttpClient.Wechat.Api.UnitTests { - public class WechatApiExecuteSemanticTests + public class TestCase_ApiExecuteSemanticTests { - [Fact(DisplayName = "[POST] /semantic/semproxy/search")] - public async Task SemanticSemproxySearchRestaurantTest() + [Fact(DisplayName = "测试用例:调用 API [POST] /semantic/semproxy/search")] + public async Task TestExecuteSemanticSemproxySearchRestaurant() { var request = new Models.SemanticSemproxySearchRequest() { diff --git a/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/WechatApiExecuteSnsWithAccessTokenTests.cs b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/TestCase_ApiExecuteSnsWithAccessTokenTests.cs similarity index 74% rename from test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/WechatApiExecuteSnsWithAccessTokenTests.cs rename to test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/TestCase_ApiExecuteSnsWithAccessTokenTests.cs index f6903ea6..7d1e11f0 100644 --- a/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/WechatApiExecuteSnsWithAccessTokenTests.cs +++ b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/TestCase_ApiExecuteSnsWithAccessTokenTests.cs @@ -6,10 +6,10 @@ using Xunit; namespace SKIT.FlurlHttpClient.Wechat.Api.UnitTests { - public class WechatApiExecuteSnsWithAccessTokenTests + public class TestCase_ApiExecuteSnsWithAccessTokenTests { - [Fact(DisplayName = "[GET] /sns/userinfo")] - public async Task SnsUserInfoTest() + [Fact(DisplayName = "测试用例:调用 API [GET] /sns/userinfo")] + public async Task TestExecuteSnsUserInfo() { var request = new Models.SnsUserInfoRequest() { @@ -22,8 +22,8 @@ namespace SKIT.FlurlHttpClient.Wechat.Api.UnitTests Assert.NotNull(response.Nickname); } - [Fact(DisplayName = "[GET] /sns/auth")] - public async Task SnsAuthTest() + [Fact(DisplayName = "测试用例:调用 API [GET] /sns/auth")] + public async Task TestExecuteSnsAuth() { var request = new Models.SnsAuthRequest() { diff --git a/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/WechatApiExecuteSnsWithAppSecretTests.cs b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/TestCase_ApiExecuteSnsWithAppSecretTests.cs similarity index 72% rename from test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/WechatApiExecuteSnsWithAppSecretTests.cs rename to test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/TestCase_ApiExecuteSnsWithAppSecretTests.cs index 888ab58b..710f478f 100644 --- a/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/WechatApiExecuteSnsWithAppSecretTests.cs +++ b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/TestCase_ApiExecuteSnsWithAppSecretTests.cs @@ -6,10 +6,10 @@ using Xunit; namespace SKIT.FlurlHttpClient.Wechat.Api.UnitTests { - public class WechatApiExecuteSnsWithAppSecretTests + public class TestCase_ApiExecuteSnsWithAppSecretTests { - [Fact(DisplayName = "[GET] /sns/oauth2/access_token")] - public async Task SnsOAuth2AccessTokenTest() + [Fact(DisplayName = "测试用例:调用 API [GET] /sns/oauth2/access_token")] + public async Task TestExecuteSnsOAuth2AccessToken() { var request = new Models.SnsOAuth2AccessTokenRequest() { @@ -22,8 +22,8 @@ namespace SKIT.FlurlHttpClient.Wechat.Api.UnitTests Assert.NotNull(response.OpenId); } - [Fact(DisplayName = "[GET] /sns/oauth2/refresh_token")] - public async Task SnsOAuth2RefreshTokenTest() + [Fact(DisplayName = "测试用例:调用 API [GET] /sns/oauth2/refresh_token")] + public async Task TestExecuteSnsOAuth2RefreshToken() { var request = new Models.SnsOAuth2RefreshTokenRequest() { @@ -35,8 +35,8 @@ namespace SKIT.FlurlHttpClient.Wechat.Api.UnitTests Assert.NotNull(response.RefreshToken); } - [Fact(DisplayName = "[GET] /sns/jscode2session")] - public async Task SnsJsCode2SessionTest() + [Fact(DisplayName = "测试用例:调用 API [GET] /sns/jscode2session")] + public async Task TestExecuteSnsJsCode2Session() { var request = new Models.SnsJsCode2SessionRequest() { diff --git a/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/WechatApiExecuteWxaApiTests.cs b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/TestCase_ApiExecuteWxaApiTests.cs similarity index 76% rename from test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/WechatApiExecuteWxaApiTests.cs rename to test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/TestCase_ApiExecuteWxaApiTests.cs index 9e92b9da..4839b9c9 100644 --- a/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/WechatApiExecuteWxaApiTests.cs +++ b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/TestCase_ApiExecuteWxaApiTests.cs @@ -7,10 +7,10 @@ using Xunit; namespace SKIT.FlurlHttpClient.Wechat.Api.UnitTests { - public class WechatApiExecuteWxaApiTests + public class TestCase_ApiExecuteWxaApiTests { - [Fact(DisplayName = "[POST] /wxaapi/log/jserr_list")] - public async Task WxaApiLogGetPerformanceTest() + [Fact(DisplayName = "测试用例:调用 API [POST] /wxaapi/log/jserr_list")] + public async Task TestExecuteWxaApiLogGetPerformance() { var request = new Models.WxaApiLogGetPerformanceRequest() { @@ -26,8 +26,8 @@ namespace SKIT.FlurlHttpClient.Wechat.Api.UnitTests Assert.NotEmpty(response.DefaultTimeData.DataList); } - [Fact(DisplayName = "[GET] /wxaapi/log/get_scene")] - public async Task WxaApiLogGetSceneTest() + [Fact(DisplayName = "测试用例:调用 API [GET] /wxaapi/log/get_scene")] + public async Task TestExecuteWxaApiLogGetScene() { var request = new Models.WxaApiLogGetSceneRequest() { @@ -39,8 +39,8 @@ namespace SKIT.FlurlHttpClient.Wechat.Api.UnitTests Assert.NotEmpty(response.SceneDataList); } - [Fact(DisplayName = "[GET] /wxaapi/log/get_client_version")] - public async Task WxaApiLogGetClientVersionTest() + [Fact(DisplayName = "测试用例:调用 API [GET] /wxaapi/log/get_client_version")] + public async Task TestExecuteWxaApiLogGetClientVersion() { var request = new Models.WxaApiLogGetClientVersionRequest() { diff --git a/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/WechatApiDeclarationTests.cs b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/TestCase_CodeReviewAnalyzer.cs similarity index 51% rename from test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/WechatApiDeclarationTests.cs rename to test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/TestCase_CodeReviewAnalyzer.cs index e7d15f50..c3b9e4d6 100644 --- a/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/WechatApiDeclarationTests.cs +++ b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/TestCase_CodeReviewAnalyzer.cs @@ -9,14 +9,14 @@ using Xunit; namespace SKIT.FlurlHttpClient.Wechat.Api.UnitTests { - public class WechatApiDeclarationTests + public class TestCase_CodeReviewAnalyzer { - private static readonly Assembly _assembly = Assembly.Load("SKIT.FlurlHttpClient.Wechat.Api"); + private Assembly SourceAssembly { get; } = Assembly.Load("SKIT.FlurlHttpClient.Wechat.Api"); - [Fact(DisplayName = "验证 API 模型命名")] - public void ApiModelsNamingTest() + [Fact(DisplayName = "代码评审:分析 API 模型命名")] + public void TestApiModelsNaming() { - CodeStyleUtil.VerifyApiModelsNaming(_assembly, out var ex); + CodeStyleUtil.VerifyApiModelsNaming(SourceAssembly, out var ex); if (ex != null) throw ex; @@ -24,11 +24,11 @@ namespace SKIT.FlurlHttpClient.Wechat.Api.UnitTests Assert.Null(ex); } - [Fact(DisplayName = "验证 API 模型定义")] - public void ApiModelsDefinitionTest() + [Fact(DisplayName = "代码评审:分析 API 模型定义")] + public void TestApiModelsDefinition() { string workdir = Path.Combine(TestConfigs.ProjectTestDirectory, "ModelSamples"); - CodeStyleUtil.VerifyApiModelsDefinition(_assembly, workdir, out var ex); + CodeStyleUtil.VerifyApiModelsDefinition(SourceAssembly, workdir, out var ex); if (ex != null) throw ex; @@ -36,11 +36,11 @@ namespace SKIT.FlurlHttpClient.Wechat.Api.UnitTests Assert.Null(ex); } - [Fact(DisplayName = "验证 API 事件定义")] - public void ApiEventsDefinitionTest() + [Fact(DisplayName = "代码评审:分析 API 事件定义")] + public void TestApiEventsDefinition() { string workdir = Path.Combine(TestConfigs.ProjectTestDirectory, "EventSamples"); - CodeStyleUtil.VerifyApiEventsDefinition(_assembly, workdir, out var ex); + CodeStyleUtil.VerifyApiEventsDefinition(SourceAssembly, workdir, out var ex); if (ex != null) throw ex; @@ -48,10 +48,10 @@ namespace SKIT.FlurlHttpClient.Wechat.Api.UnitTests Assert.Null(ex); } - [Fact(DisplayName = "验证 API 接口命名")] - public void ApiExtensionsNamingTest() + [Fact(DisplayName = "代码评审:分析 API 接口命名")] + public void TestApiExtensionsNaming() { - CodeStyleUtil.VerifyApiExtensionsNaming(_assembly, out var ex); + CodeStyleUtil.VerifyApiExtensionsNaming(SourceAssembly, out var ex); if (ex != null) throw ex; @@ -59,8 +59,8 @@ namespace SKIT.FlurlHttpClient.Wechat.Api.UnitTests Assert.Null(ex); } - [Fact(DisplayName = "验证代码规范")] - public void CodeStyleTest() + [Fact(DisplayName = "代码评审:分析代码规范")] + public void TestCodeStyle() { string workdir = Path.Combine(TestConfigs.ProjectSourceDirectory); CodeStyleUtil.VerifySourceCodeStyle(workdir, out var ex); diff --git a/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/WechatApiExecuteCgibinExpressTests.cs b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/TestCase_DeliveryRequestSignatureTests.cs similarity index 82% rename from test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/WechatApiExecuteCgibinExpressTests.cs rename to test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/TestCase_DeliveryRequestSignatureTests.cs index 7686af24..b547ed5d 100644 --- a/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/WechatApiExecuteCgibinExpressTests.cs +++ b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/TestCase_DeliveryRequestSignatureTests.cs @@ -7,10 +7,10 @@ using Xunit; namespace SKIT.FlurlHttpClient.Wechat.Api.UnitTests { - public class WechatApiExecuteCgibinExpressTests + public class TestCase_DeliveryRequestSignatureTests { - [Fact(DisplayName = "即时配送请求签名")] - public async Task DeliverySignatureTest() + [Fact(DisplayName = "测试用例:即时配送请求签名")] + public async Task TestDeliveryRequestSignature() { var client = new WechatApiClient(new WechatApiClientOptions() { diff --git a/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/WechatApiEventDeserializationTests.cs b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/TestCase_EventDeserializationTests.cs similarity index 84% rename from test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/WechatApiEventDeserializationTests.cs rename to test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/TestCase_EventDeserializationTests.cs index 31d20646..d64dcf59 100644 --- a/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/WechatApiEventDeserializationTests.cs +++ b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/TestCase_EventDeserializationTests.cs @@ -8,10 +8,10 @@ using Xunit; namespace SKIT.FlurlHttpClient.Wechat.Api.UnitTests { - public class WechatApiEventDeserializationTests + public class TestCase_EventDeserializationTests { - [Fact(DisplayName = "获取事件消息类型")] - public void GetEventMessageTypeTest() + [Fact(DisplayName = "测试用例:获取事件消息类型")] + public void TestGetEventMessageType() { string xml = "13488318601234567890123456"; @@ -24,8 +24,8 @@ namespace SKIT.FlurlHttpClient.Wechat.Api.UnitTests Assert.Equal("TEXT", eventModel.MessageType, ignoreCase: true); } - [Fact(DisplayName = "反序列化 TEXT 事件")] - public void DeserializeTextMessageEventTest() + [Fact(DisplayName = "测试用例:反序列化 TEXT 事件")] + public void TestDeserializeTextMessageEvent() { string xml = "13488318601234567890123456"; diff --git a/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/WechatApiEventVerificationTests.cs b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/TestCase_EventVerificationTests.cs similarity index 91% rename from test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/WechatApiEventVerificationTests.cs rename to test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/TestCase_EventVerificationTests.cs index e91e867f..65c5fad8 100644 --- a/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/WechatApiEventVerificationTests.cs +++ b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/TestCase_EventVerificationTests.cs @@ -8,10 +8,10 @@ using Xunit; namespace SKIT.FlurlHttpClient.Wechat.Api.UnitTests { - public class WechatApiEventVerificationTests + public class TestCase_EventVerificationTests { - [Fact(DisplayName = "验签并解密回调数据")] - public void GetEventMessageTypeTest() + [Fact(DisplayName = "测试用例:验签并解密回调数据")] + public void TestVerifyEvent() { string callbacMsgSig = "477715d11cdb4164915debcba66cb864d751f3e6"; string callbacTimeStamp = "1409659813"; diff --git a/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/TestCase_HashUtilityTests.cs b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/TestCase_HashUtilityTests.cs new file mode 100644 index 00000000..975d5b20 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/TestCase_HashUtilityTests.cs @@ -0,0 +1,31 @@ +using System; +using Xunit; + +namespace SKIT.FlurlHttpClient.Wechat.Api.UnitTests +{ + public class TestCase_HashUtilityTests + { + [Fact(DisplayName = "测试用例:SHA-1 信息摘要")] + public void TestSHA1Hash() + { + string rawData = "jsapi_ticket=HoagFKDcsGMVCIY2vOjf9nGrZ3eaM0qXs5ROFN_3k_HrGc0VocemA6wMXkvrL-Ei4IitXxwKF62CJWR8mWXZ3Q&noncestr=e7b435f73835402da44f16640ddc8696×tamp=1621348162&url=https://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=jsapisign"; + + string actualHash = Utilities.SHA1Utility.Hash(rawData); + string expectedHash = "b214ea1f8ae019c207f8c6ffb843c8474cbab28c"; + + Assert.Equal(expectedHash, actualHash, ignoreCase: true); + } + + [Fact(DisplayName = "测试用例:HMAC-SHA-256 消息认证码")] + public void TestHMACHashWithSHA1() + { + string secret = "zNLgAGgqsEWJOg1nFVaO5r7fAlIQxr1u"; + string rawData = "appid=wx1234567&offer_id=12345678&openid=odkx20ENSNa2w5y3g_qOkOvBNM1g&pf=android&ts=1507530737&zone_id=1&org_loc=/cgi-bin/midas/getbalance&method=POST&secret=zNLgAGgqsEWJOg1nFVaO5r7fAlIQxr1u"; + + string actualHash = Utilities.HMACUtility.HashWithSHA256(secret, rawData); + string expectedHash = "1ad64e8dcb2ec1dc486b7fdf01f4a15159fc623dc3422470e51cf6870734726b"; + + Assert.Equal(expectedHash, actualHash, ignoreCase: true); + } + } +} diff --git a/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/WechatApiExecuteCgibinMidasTests.cs b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/TestCase_MidasRequestSignatureTests.cs similarity index 84% rename from test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/WechatApiExecuteCgibinMidasTests.cs rename to test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/TestCase_MidasRequestSignatureTests.cs index 74131994..ae33085d 100644 --- a/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/WechatApiExecuteCgibinMidasTests.cs +++ b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/TestCase_MidasRequestSignatureTests.cs @@ -7,10 +7,10 @@ using Xunit; namespace SKIT.FlurlHttpClient.Wechat.Api.UnitTests { - public class WechatApiExecuteCgibinMidasTests + public class TestCase_MidasRequestSignatureTests { - [Fact(DisplayName = "米大师请求签名")] - public async Task MidasSigTest() + [Fact(DisplayName = "测试用例:米大师请求签名")] + public async Task TestMidasRequestSignature() { var client = new WechatApiClient(new WechatApiClientOptions() { diff --git a/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/WechatApiWxBizMsgCryptorTests.cs b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/TestCase_WxBizMsgCryptorUtilityTests.cs similarity index 90% rename from test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/WechatApiWxBizMsgCryptorTests.cs rename to test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/TestCase_WxBizMsgCryptorUtilityTests.cs index 72db5b57..050a751f 100644 --- a/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/WechatApiWxBizMsgCryptorTests.cs +++ b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/TestCase_WxBizMsgCryptorUtilityTests.cs @@ -8,10 +8,10 @@ using Xunit; namespace SKIT.FlurlHttpClient.Wechat.Api.UnitTests { - public class WechatApiWxBizMsgCryptorTests + public class TestCase_WxBizMsgCryptorUtilityTests { - [Fact(DisplayName = "验签并解密回调数据")] - public void VerifyAndDecryptEventTest() + [Fact(DisplayName = "试用例:验签并解密回调数据")] + public void TestVerifyAndDecryptEvent() { string token = "QDG6eK"; string appId = "wx5823bf96d3bd56c7"; @@ -29,8 +29,8 @@ namespace SKIT.FlurlHttpClient.Wechat.Api.UnitTests Assert.True(Utilities.WxBizMsgCryptor.VerifySignature(token, reqTimeStamp, reqNonce, reqCipherText, reqMsgSig)); } - [Fact(DisplayName = "验签回调数据")] - public void VerifyEventTest() + [Fact(DisplayName = "试用例:验签回调数据")] + public void TestVerifyEvent() { string token = "ovAkP0Tb"; string reqMsgSig = "8128e41a38892d814e4aa67753425da9dc8ec2b3"; diff --git a/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/TestConfigs.cs b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/TestConfigs.cs index 05714b23..935345b5 100644 --- a/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/TestConfigs.cs +++ b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/TestConfigs.cs @@ -8,8 +8,9 @@ namespace SKIT.FlurlHttpClient.Wechat.Api.UnitTests { static TestConfigs() { - // NOTICE: 请在项目根目录下按照 appsettings.json 的格式新建 appsettings.local.json 填入测试参数。 - // WARN: 敏感信息请不要提交到 git! + // NOTICE: 请在项目根目录下按照 appsettings.json 的格式新建 appsettings.local.json 填入测试参数。 + // WARNING: 请在 DEBUG 模式下运行测试用例。 + // WARNING: 敏感信息请不要提交到 git! try { @@ -17,13 +18,13 @@ namespace SKIT.FlurlHttpClient.Wechat.Api.UnitTests using var jdoc = JsonDocument.Parse(stream); var config = jdoc.RootElement.GetProperty("TestConfig"); - WechatAppId = config.GetProperty("AppId").GetString(); - WechatAppSecret = config.GetProperty("AppSecret").GetString(); - WechatAccessToken = config.GetProperty("AccessToken").GetString(); - WechatOpenId = config.GetProperty("OpenId").GetString(); + WechatAppId = config.GetProperty("AppId").GetString()!; + WechatAppSecret = config.GetProperty("AppSecret").GetString()!; + WechatAccessToken = config.GetProperty("AccessToken").GetString()!; + WechatOpenId = config.GetProperty("OpenId").GetString()!; - ProjectSourceDirectory = jdoc.RootElement.GetProperty("ProjectSourceDirectory").GetString(); - ProjectTestDirectory = jdoc.RootElement.GetProperty("ProjectTestDirectory").GetString(); + ProjectSourceDirectory = jdoc.RootElement.GetProperty("ProjectSourceDirectory").GetString()!; + ProjectTestDirectory = jdoc.RootElement.GetProperty("ProjectTestDirectory").GetString()!; } catch (Exception ex) { diff --git a/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/WechatApiSecurityTests.cs b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/WechatApiSecurityTests.cs deleted file mode 100644 index b9cd4228..00000000 --- a/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/WechatApiSecurityTests.cs +++ /dev/null @@ -1,44 +0,0 @@ -using System; -using Xunit; - -namespace SKIT.FlurlHttpClient.Wechat.Api.UnitTests -{ - public class WechatApiSecurityTests - { - [Fact(DisplayName = "信息摘要(SHA-1)")] - public void Sha1HashTest() - { - string rawData = "jsapi_ticket=HoagFKDcsGMVCIY2vOjf9nGrZ3eaM0qXs5ROFN_3k_HrGc0VocemA6wMXkvrL-Ei4IitXxwKF62CJWR8mWXZ3Q&noncestr=e7b435f73835402da44f16640ddc8696×tamp=1621348162&url=https://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=jsapisign"; - - string actualHash = Utilities.SHA1Utility.Hash(rawData); - string expectedHash = "b214ea1f8ae019c207f8c6ffb843c8474cbab28c"; - - Assert.Equal(expectedHash, actualHash, ignoreCase: true); - } - - [Fact(DisplayName = "信息摘要(HMAC-SHA-256)")] - public void HmacSha1HashTest() - { - string secret = "zNLgAGgqsEWJOg1nFVaO5r7fAlIQxr1u"; - string rawData = "appid=wx1234567&offer_id=12345678&openid=odkx20ENSNa2w5y3g_qOkOvBNM1g&pf=android&ts=1507530737&zone_id=1&org_loc=/cgi-bin/midas/getbalance&method=POST&secret=zNLgAGgqsEWJOg1nFVaO5r7fAlIQxr1u"; - - string actualHash = Utilities.HMACSHA256Utility.Hash(secret, rawData); - string expectedHash = "1ad64e8dcb2ec1dc486b7fdf01f4a15159fc623dc3422470e51cf6870734726b"; - - Assert.Equal(expectedHash, actualHash, ignoreCase: true); - } - - [Fact(DisplayName = "AES-CBC 解密")] - public void AesCbcDecryptTest() - { - string iv = "KEWv/gyiIwAfHvjrLeaX6w=="; - string key = "YZJqKnNFi0KAiKUc0ggC2g=="; - string cipherText = "Gu2PVnxVWl+jK4F8c0liGxfkB5Bj3m5HRvwgEIk1Yb+36RZ3Bg7YmUnud/ooiHz0PQroipsH7GCjlGwUeT04NwmrFaP1y3dRYPLpS43ed9QZWcFIFo+8vTs3Zco6S98DUvaNEAs8duhz/BzfBOZaIHMziRqEtPFI0ZDzCgJluBirJ6Wl3UkygZ5/QLo3KA53qGdip7K48Rq8XbCwuidTCw=="; - - string expectedPlainData = "{\"phoneNumber\":\"186****5613\",\"purePhoneNumber\":\"186****5613\",\"countryCode\":\"86\",\"watermark\":{\"timestamp\":1634545675,\"appid\":\"wxc****17e87e0e0a7\"}}"; - string actualPlainData = Utilities.AESUtility.DecryptWithCBC(encodingKey: key, encodingIV: iv, encodingCipherText: cipherText); - - Assert.Equal(expectedPlainData, actualPlainData, ignoreCase: true); - } - } -} diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/TestCase_AesUtilityTests.cs b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/TestCase_AesUtilityTests.cs index 433834b9..e2519144 100644 --- a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/TestCase_AesUtilityTests.cs +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/TestCase_AesUtilityTests.cs @@ -2,7 +2,7 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests { - public class TestCase_AesUtilityTests + public class TestCase_AESUtilityTests { [Fact(DisplayName = "测试用例:AES-GCM 解密")] public void TestAESGCMDecrypt() diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/TestCase_RsaUtilityTests.cs b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/TestCase_RsaUtilityTests.cs index c81acd20..8f2d1b84 100644 --- a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/TestCase_RsaUtilityTests.cs +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/TestCase_RsaUtilityTests.cs @@ -3,7 +3,7 @@ using Xunit; namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests { - public class TestCase_RsaUtilityTests + public class TestCase_RSAUtilityTests { // 此处测试的 RSA 证书/公钥/私钥是自签名生成的,仅供执行 RSA 相关的单元测试,不能用于调用微信支付 API。 private const string RSA_CERT_SN = "3050f72e2dce03e7efe49557dd231d176649afbd";