From c0b24b223fd3969853b1a58dc0599ff7ed5b931c Mon Sep 17 00:00:00 2001 From: Fu Diwei Date: Fri, 20 Aug 2021 22:10:16 +0800 Subject: [PATCH] =?UTF-8?q?feat(tenpayv3):=20=E5=8D=87=E7=BA=A7=E6=A0=B8?= =?UTF-8?q?=E5=BF=83=E5=BA=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../JsonTypedStringArrayConverter.cs | 52 ++++++++ .../Boolean/YesOrNoBooleanConverter.cs | 32 +++++ .../YesOrNoNullableBooleanConverter.cs | 53 ++++++++ ...PureDigitalTextDateTimeOffsetConverter.cs} | 4 +- ...talTextNullableDateTimeOffsetConverter.cs} | 2 +- .../JsonTypedStringIListConverter.cs | 44 +++++++ .../JsonTypedStringListConverter.cs | 46 +++++++ .../StringTypedStringIListConverter.cs | 44 +++++++ .../StringTypedStringListConverter.cs | 47 +++++++ .../JsonTypedStringArrayConverter.cs | 42 +++++++ .../Boolean/StringTypedBooleanConverter.cs | 22 ++++ .../StringTypedNullableBooleanConverter.cs | 47 +++++++ .../Boolean/YesOrNoBooleanConverter.cs | 22 ++++ .../YesOrNoNullableBooleanConverter.cs | 47 +++++++ ...PureDigitalTextDateTimeOffsetConverter.cs} | 4 +- ...talTextNullableDateTimeOffsetConverter.cs} | 4 +- .../JsonTypedStringIListConverter.cs | 34 +++++ .../JsonTypedStringListConverter.cs | 36 ++++++ .../StringTypedStringIListConverter.cs | 34 +++++ .../StringTypedStringListConverter.cs | 37 ++++++ .../PayScorePartnerPermissionsResource.cs | 4 +- .../PayScorePermissionsResource.cs | 4 +- .../PayScoreServiceOrderResource.cs | 8 +- .../VehicleTransactionResource.cs | 15 +-- .../WechatTenpaySignInterceptor.cs | 2 +- ...erceApplymentByOutRequestNumberResponse.cs | 4 +- ...yScoreServiceOrderDirectCompleteRequest.cs | 8 +- ...oreServiceOrderByOutOrderNumberResponse.cs | 4 +- .../SetPayScoreServiceOrderSyncRequest.cs | 4 +- .../CreateVehicleTransactionParkingRequest.cs | 93 +------------- ...icleTransactionByOutTradeNumberResponse.cs | 15 +-- .../WechatTenpayClient.cs | 2 +- .../WechatTenpayException.cs | 2 +- .../WechatConverterTests.cs | 116 ------------------ 34 files changed, 673 insertions(+), 261 deletions(-) create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Converters/Newtonsoft.Json/Array[string]/JsonTypedStringArrayConverter.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Converters/Newtonsoft.Json/Boolean/YesOrNoBooleanConverter.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Converters/Newtonsoft.Json/Boolean/YesOrNoNullableBooleanConverter.cs rename src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Converters/Newtonsoft.Json/{CommonWithoutSeparatorsDateTimeOffsetConverter.cs => DateTimeOffset/PureDigitalTextDateTimeOffsetConverter.cs} (84%) rename src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Converters/Newtonsoft.Json/{CommonWithoutSeparatorsNullableDateTimeOffsetConverter.cs => DateTimeOffset/PureDigitalTextNullableDateTimeOffsetConverter.cs} (94%) create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Converters/Newtonsoft.Json/List[string]/JsonTypedStringIListConverter.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Converters/Newtonsoft.Json/List[string]/JsonTypedStringListConverter.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Converters/Newtonsoft.Json/List[string]/StringTypedStringIListConverter.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Converters/Newtonsoft.Json/List[string]/StringTypedStringListConverter.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Converters/System.Text.Json/Array[string]/JsonTypedStringArrayConverter.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Converters/System.Text.Json/Boolean/StringTypedBooleanConverter.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Converters/System.Text.Json/Boolean/StringTypedNullableBooleanConverter.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Converters/System.Text.Json/Boolean/YesOrNoBooleanConverter.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Converters/System.Text.Json/Boolean/YesOrNoNullableBooleanConverter.cs rename src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Converters/System.Text.Json/{CommonWithoutSeparatorsDateTimeOffsetConverter.cs => DateTimeOffset/PureDigitalTextDateTimeOffsetConverter.cs} (79%) rename src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Converters/System.Text.Json/{CommonWithoutSeparatorsNullableDateTimeOffsetConverter.cs => DateTimeOffset/PureDigitalTextNullableDateTimeOffsetConverter.cs} (87%) create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Converters/System.Text.Json/List[string]/JsonTypedStringIListConverter.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Converters/System.Text.Json/List[string]/JsonTypedStringListConverter.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Converters/System.Text.Json/List[string]/StringTypedStringIListConverter.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Converters/System.Text.Json/List[string]/StringTypedStringListConverter.cs delete mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/WechatConverterTests.cs diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Converters/Newtonsoft.Json/Array[string]/JsonTypedStringArrayConverter.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Converters/Newtonsoft.Json/Array[string]/JsonTypedStringArrayConverter.cs new file mode 100644 index 00000000..7658e293 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Converters/Newtonsoft.Json/Array[string]/JsonTypedStringArrayConverter.cs @@ -0,0 +1,52 @@ +using System; +using System.Collections.Generic; +using Newtonsoft.Json; +using Newtonsoft.Json.Converters; + +namespace Newtonsoft.Json.Converters +{ + internal class JsonTypedStringArrayConverter : 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 existingValue; + + if (value.StartsWith("[") && value.EndsWith("[")) + return JsonConvert.DeserializeObject(value); + + if (string.IsNullOrEmpty(value)) + return new string[0]; + else + return new string[1] { value }; + } + + throw new JsonReaderException(); + } + + public override void WriteJson(JsonWriter writer, string[]? value, JsonSerializer serializer) + { + if (value != null) + writer.WriteValue(JsonConvert.SerializeObject(value, Formatting.None)); + else + writer.WriteNull(); + } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Converters/Newtonsoft.Json/Boolean/YesOrNoBooleanConverter.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Converters/Newtonsoft.Json/Boolean/YesOrNoBooleanConverter.cs new file mode 100644 index 00000000..79418290 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Converters/Newtonsoft.Json/Boolean/YesOrNoBooleanConverter.cs @@ -0,0 +1,32 @@ +using System; +using System.Collections.Generic; +using Newtonsoft.Json; +using Newtonsoft.Json.Converters; + +namespace Newtonsoft.Json.Converters +{ + internal class YesOrNoBooleanConverter : JsonConverter + { + private readonly JsonConverter _converter = new YesOrNoNullableBooleanConverter(); + + public override bool CanRead + { + get { return true; } + } + + public override bool CanWrite + { + get { return true; } + } + + public override bool ReadJson(JsonReader reader, Type objectType, bool existingValue, bool hasExistingValue, JsonSerializer serializer) + { + return _converter.ReadJson(reader, objectType, existingValue, hasExistingValue, serializer) ?? default; + } + + public override void WriteJson(JsonWriter writer, bool value, JsonSerializer serializer) + { + _converter.WriteJson(writer, value, serializer); + } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Converters/Newtonsoft.Json/Boolean/YesOrNoNullableBooleanConverter.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Converters/Newtonsoft.Json/Boolean/YesOrNoNullableBooleanConverter.cs new file mode 100644 index 00000000..6e654aac --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Converters/Newtonsoft.Json/Boolean/YesOrNoNullableBooleanConverter.cs @@ -0,0 +1,53 @@ +using System; +using System.Collections.Generic; +using Newtonsoft.Json; +using Newtonsoft.Json.Converters; + +namespace Newtonsoft.Json.Converters +{ + internal class YesOrNoNullableBooleanConverter : JsonConverter + { + public override bool CanRead + { + get { return true; } + } + + public override bool CanWrite + { + get { return true; } + } + + public override bool? ReadJson(Newtonsoft.Json.JsonReader reader, Type objectType, bool? existingValue, bool hasExistingValue, Newtonsoft.Json.JsonSerializer serializer) + { + if (reader.TokenType == Newtonsoft.Json.JsonToken.Null) + { + return existingValue; + } + else if (reader.TokenType == Newtonsoft.Json.JsonToken.Boolean) + { + return serializer.Deserialize(reader); + } + else if (reader.TokenType == Newtonsoft.Json.JsonToken.String) + { + string? value = serializer.Deserialize(reader); + if (value == null) + return existingValue; + + if ("Y".Equals(value)) + return true; + else if ("N".Equals(value)) + return false; + } + + throw new Newtonsoft.Json.JsonReaderException(); + } + + public override void WriteJson(Newtonsoft.Json.JsonWriter writer, bool? value, Newtonsoft.Json.JsonSerializer serializer) + { + if (value.HasValue) + writer.WriteValue(value.Value ? "Y" : "N"); + else + writer.WriteNull(); + } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Converters/Newtonsoft.Json/CommonWithoutSeparatorsDateTimeOffsetConverter.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Converters/Newtonsoft.Json/DateTimeOffset/PureDigitalTextDateTimeOffsetConverter.cs similarity index 84% rename from src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Converters/Newtonsoft.Json/CommonWithoutSeparatorsDateTimeOffsetConverter.cs rename to src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Converters/Newtonsoft.Json/DateTimeOffset/PureDigitalTextDateTimeOffsetConverter.cs index 1066b1b5..c3d683f3 100644 --- a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Converters/Newtonsoft.Json/CommonWithoutSeparatorsDateTimeOffsetConverter.cs +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Converters/Newtonsoft.Json/DateTimeOffset/PureDigitalTextDateTimeOffsetConverter.cs @@ -5,9 +5,9 @@ using Newtonsoft.Json.Converters; namespace Newtonsoft.Json.Converters { - internal class CommonWithoutSeparatorsDateTimeOffsetConverter : JsonConverter + internal class PureDigitalTextDateTimeOffsetConverter : JsonConverter { - private readonly JsonConverter _converter = new CommonWithoutSeparatorsNullableDateTimeOffsetConverter(); + private readonly JsonConverter _converter = new PureDigitalTextNullableDateTimeOffsetConverter(); public override bool CanRead { diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Converters/Newtonsoft.Json/CommonWithoutSeparatorsNullableDateTimeOffsetConverter.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Converters/Newtonsoft.Json/DateTimeOffset/PureDigitalTextNullableDateTimeOffsetConverter.cs similarity index 94% rename from src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Converters/Newtonsoft.Json/CommonWithoutSeparatorsNullableDateTimeOffsetConverter.cs rename to src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Converters/Newtonsoft.Json/DateTimeOffset/PureDigitalTextNullableDateTimeOffsetConverter.cs index 6beec584..917ae15a 100644 --- a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Converters/Newtonsoft.Json/CommonWithoutSeparatorsNullableDateTimeOffsetConverter.cs +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Converters/Newtonsoft.Json/DateTimeOffset/PureDigitalTextNullableDateTimeOffsetConverter.cs @@ -5,7 +5,7 @@ using Newtonsoft.Json.Converters; namespace Newtonsoft.Json.Converters { - internal class CommonWithoutSeparatorsNullableDateTimeOffsetConverter : JsonConverter + internal class PureDigitalTextNullableDateTimeOffsetConverter : JsonConverter { internal const string DATETIME_FORMAT = "yyyyMMddHHmmss"; diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Converters/Newtonsoft.Json/List[string]/JsonTypedStringIListConverter.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Converters/Newtonsoft.Json/List[string]/JsonTypedStringIListConverter.cs new file mode 100644 index 00000000..86f78dc9 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Converters/Newtonsoft.Json/List[string]/JsonTypedStringIListConverter.cs @@ -0,0 +1,44 @@ +using System; +using System.Collections.Generic; +using Newtonsoft.Json; +using Newtonsoft.Json.Converters; + +namespace Newtonsoft.Json.Converters +{ + internal class JsonTypedStringIListConverter : JsonConverter?> + { + private readonly JsonConverter?> _converter = new JsonTypedStringListConverter(); + + 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.TenpayV3/Converters/Newtonsoft.Json/List[string]/JsonTypedStringListConverter.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Converters/Newtonsoft.Json/List[string]/JsonTypedStringListConverter.cs new file mode 100644 index 00000000..704cd313 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Converters/Newtonsoft.Json/List[string]/JsonTypedStringListConverter.cs @@ -0,0 +1,46 @@ +using System; +using System.Collections.Generic; +using Newtonsoft.Json; +using Newtonsoft.Json.Converters; + +namespace Newtonsoft.Json.Converters +{ + internal class JsonTypedStringListConverter : 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; + + return JsonConvert.DeserializeObject>(value); + } + + throw new JsonReaderException(); + } + + public override void WriteJson(JsonWriter writer, List? value, JsonSerializer serializer) + { + if (value != null) + writer.WriteValue(JsonConvert.SerializeObject(value, Formatting.None)); + else + writer.WriteNull(); + } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Converters/Newtonsoft.Json/List[string]/StringTypedStringIListConverter.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Converters/Newtonsoft.Json/List[string]/StringTypedStringIListConverter.cs new file mode 100644 index 00000000..760601f1 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Converters/Newtonsoft.Json/List[string]/StringTypedStringIListConverter.cs @@ -0,0 +1,44 @@ +using System; +using System.Collections.Generic; +using Newtonsoft.Json; +using Newtonsoft.Json.Converters; + +namespace Newtonsoft.Json.Converters +{ + internal class StringTypedStringIListConverter : JsonConverter?> + { + private readonly JsonConverter?> _converter = new StringTypedStringListConverter(); + + 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.TenpayV3/Converters/Newtonsoft.Json/List[string]/StringTypedStringListConverter.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Converters/Newtonsoft.Json/List[string]/StringTypedStringListConverter.cs new file mode 100644 index 00000000..dcc15735 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Converters/Newtonsoft.Json/List[string]/StringTypedStringListConverter.cs @@ -0,0 +1,47 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using Newtonsoft.Json; +using Newtonsoft.Json.Converters; + +namespace Newtonsoft.Json.Converters +{ + internal class StringTypedStringListConverter : 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; + + return value.Split(',').ToList(); + } + + 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.TenpayV3/Converters/System.Text.Json/Array[string]/JsonTypedStringArrayConverter.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Converters/System.Text.Json/Array[string]/JsonTypedStringArrayConverter.cs new file mode 100644 index 00000000..c15ea983 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Converters/System.Text.Json/Array[string]/JsonTypedStringArrayConverter.cs @@ -0,0 +1,42 @@ +using System; +using System.Collections.Generic; +using System.Text.Json; +using System.Text.Json.Serialization; + +namespace System.Text.Json.Converters +{ + internal class JsonTypedStringArrayConverter : JsonConverter + { + public override string[]? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) + { + if (reader.TokenType == JsonTokenType.Null) + { + return null; + } + else if (reader.TokenType == JsonTokenType.String) + { + string? value = reader.GetString(); + if (value == null) + return null; + + if (value.StartsWith("[") && value.EndsWith("[")) + return JsonSerializer.Deserialize(value, options); + + if (string.IsNullOrEmpty(value)) + return new string[0]; + else + return new string[1] { value }; + } + + throw new JsonException(); + } + + public override void Write(Utf8JsonWriter writer, string[]? value, JsonSerializerOptions options) + { + if (value != null) + writer.WriteStringValue(JsonSerializer.Serialize(value, options)); + else + writer.WriteNullValue(); + } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Converters/System.Text.Json/Boolean/StringTypedBooleanConverter.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Converters/System.Text.Json/Boolean/StringTypedBooleanConverter.cs new file mode 100644 index 00000000..10600d94 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Converters/System.Text.Json/Boolean/StringTypedBooleanConverter.cs @@ -0,0 +1,22 @@ +using System; +using System.Collections.Generic; +using System.Text.Json; +using System.Text.Json.Serialization; + +namespace System.Text.Json.Converters +{ + internal class StringTypedBooleanConverter : JsonConverter + { + private readonly JsonConverter _converter = new StringTypedNullableBooleanConverter(); + + public override bool Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) + { + return _converter.Read(ref reader, typeToConvert, options) ?? default; + } + + public override void Write(Utf8JsonWriter writer, bool value, JsonSerializerOptions options) + { + _converter.Write(writer, value, options); + } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Converters/System.Text.Json/Boolean/StringTypedNullableBooleanConverter.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Converters/System.Text.Json/Boolean/StringTypedNullableBooleanConverter.cs new file mode 100644 index 00000000..1449345b --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Converters/System.Text.Json/Boolean/StringTypedNullableBooleanConverter.cs @@ -0,0 +1,47 @@ +using System; +using System.Collections.Generic; +using System.Text.Json; +using System.Text.Json.Serialization; + +namespace System.Text.Json.Converters +{ + internal class StringTypedNullableBooleanConverter : JsonConverter + { + public override bool? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) + { + if (reader.TokenType == JsonTokenType.Null) + { + return null; + } + else if (reader.TokenType == JsonTokenType.True) + { + return true; + } + else if (reader.TokenType == JsonTokenType.False) + { + return false; + } + else if (reader.TokenType == JsonTokenType.String) + { + string? value = reader.GetString(); + if (value == null) + return null; + + if ("true".Equals(value, StringComparison.InvariantCultureIgnoreCase)) + return true; + else if ("false".Equals(value, StringComparison.InvariantCultureIgnoreCase)) + return false; + } + + throw new JsonException(); + } + + public override void Write(Utf8JsonWriter writer, bool? value, JsonSerializerOptions options) + { + if (value.HasValue) + writer.WriteStringValue(value.Value ? "true" : "false"); + else + writer.WriteNullValue(); + } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Converters/System.Text.Json/Boolean/YesOrNoBooleanConverter.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Converters/System.Text.Json/Boolean/YesOrNoBooleanConverter.cs new file mode 100644 index 00000000..309eea76 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Converters/System.Text.Json/Boolean/YesOrNoBooleanConverter.cs @@ -0,0 +1,22 @@ +using System; +using System.Collections.Generic; +using System.Text.Json; +using System.Text.Json.Serialization; + +namespace System.Text.Json.Converters +{ + internal class YesOrNoBooleanConverter : JsonConverter + { + private readonly JsonConverter _converter = new YesOrNoNullableBooleanConverter(); + + public override bool Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) + { + return _converter.Read(ref reader, typeToConvert, options) ?? default; + } + + public override void Write(Utf8JsonWriter writer, bool value, JsonSerializerOptions options) + { + _converter.Write(writer, value, options); + } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Converters/System.Text.Json/Boolean/YesOrNoNullableBooleanConverter.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Converters/System.Text.Json/Boolean/YesOrNoNullableBooleanConverter.cs new file mode 100644 index 00000000..08d0bbb7 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Converters/System.Text.Json/Boolean/YesOrNoNullableBooleanConverter.cs @@ -0,0 +1,47 @@ +using System; +using System.Collections.Generic; +using System.Text.Json; +using System.Text.Json.Serialization; + +namespace System.Text.Json.Converters +{ + internal class YesOrNoNullableBooleanConverter : JsonConverter + { + public override bool? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) + { + if (reader.TokenType == JsonTokenType.Null) + { + return null; + } + else if (reader.TokenType == JsonTokenType.True) + { + return true; + } + else if (reader.TokenType == JsonTokenType.False) + { + return false; + } + else if (reader.TokenType == System.Text.Json.JsonTokenType.String) + { + string? value = reader.GetString(); + if (value == null) + return null; + + if ("Y".Equals(value)) + return true; + else if ("N".Equals(value)) + return false; + } + + throw new JsonException(); + } + + public override void Write(Utf8JsonWriter writer, bool? value, JsonSerializerOptions options) + { + if (value.HasValue) + writer.WriteStringValue(value.Value ? "Y" : "N"); + else + writer.WriteNullValue(); + } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Converters/System.Text.Json/CommonWithoutSeparatorsDateTimeOffsetConverter.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Converters/System.Text.Json/DateTimeOffset/PureDigitalTextDateTimeOffsetConverter.cs similarity index 79% rename from src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Converters/System.Text.Json/CommonWithoutSeparatorsDateTimeOffsetConverter.cs rename to src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Converters/System.Text.Json/DateTimeOffset/PureDigitalTextDateTimeOffsetConverter.cs index 3cb96205..42b38a92 100644 --- a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Converters/System.Text.Json/CommonWithoutSeparatorsDateTimeOffsetConverter.cs +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Converters/System.Text.Json/DateTimeOffset/PureDigitalTextDateTimeOffsetConverter.cs @@ -5,9 +5,9 @@ using System.Text.Json.Serialization; namespace System.Text.Json.Converters { - internal class CommonWithoutSeparatorsDateTimeOffsetConverter : JsonConverter + internal class PureDigitalTextDateTimeOffsetConverter : JsonConverter { - private readonly JsonConverter _converter = new CommonWithoutSeparatorsNullableDateTimeOffsetConverter(); + private readonly JsonConverter _converter = new PureDigitalTextNullableDateTimeOffsetConverter(); public override DateTimeOffset Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Converters/System.Text.Json/CommonWithoutSeparatorsNullableDateTimeOffsetConverter.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Converters/System.Text.Json/DateTimeOffset/PureDigitalTextNullableDateTimeOffsetConverter.cs similarity index 87% rename from src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Converters/System.Text.Json/CommonWithoutSeparatorsNullableDateTimeOffsetConverter.cs rename to src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Converters/System.Text.Json/DateTimeOffset/PureDigitalTextNullableDateTimeOffsetConverter.cs index e2aeb05a..903c484b 100644 --- a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Converters/System.Text.Json/CommonWithoutSeparatorsNullableDateTimeOffsetConverter.cs +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Converters/System.Text.Json/DateTimeOffset/PureDigitalTextNullableDateTimeOffsetConverter.cs @@ -5,9 +5,9 @@ using System.Text.Json.Serialization; namespace System.Text.Json.Converters { - internal class CommonWithoutSeparatorsNullableDateTimeOffsetConverter : JsonConverter + internal class PureDigitalTextNullableDateTimeOffsetConverter : JsonConverter { - private const string DATETIME_FORMAT = Newtonsoft.Json.Converters.CommonWithoutSeparatorsNullableDateTimeOffsetConverter.DATETIME_FORMAT; + private const string DATETIME_FORMAT = Newtonsoft.Json.Converters.PureDigitalTextNullableDateTimeOffsetConverter.DATETIME_FORMAT; public override DateTimeOffset? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Converters/System.Text.Json/List[string]/JsonTypedStringIListConverter.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Converters/System.Text.Json/List[string]/JsonTypedStringIListConverter.cs new file mode 100644 index 00000000..8e52725f --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Converters/System.Text.Json/List[string]/JsonTypedStringIListConverter.cs @@ -0,0 +1,34 @@ +using System; +using System.Collections.Generic; +using System.Text.Json; +using System.Text.Json.Serialization; + +namespace System.Text.Json.Converters +{ + internal class JsonTypedStringIListConverter : JsonConverter?> + { + private readonly JsonConverter?> _converter = new JsonTypedStringListConverter(); + + 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.TenpayV3/Converters/System.Text.Json/List[string]/JsonTypedStringListConverter.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Converters/System.Text.Json/List[string]/JsonTypedStringListConverter.cs new file mode 100644 index 00000000..540afea1 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Converters/System.Text.Json/List[string]/JsonTypedStringListConverter.cs @@ -0,0 +1,36 @@ +using System; +using System.Collections.Generic; +using System.Text.Json; +using System.Text.Json.Serialization; + +namespace System.Text.Json.Converters +{ + internal class JsonTypedStringListConverter : JsonConverter?> + { + public override List? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) + { + if (reader.TokenType == JsonTokenType.Null) + { + return null; + } + else if (reader.TokenType == JsonTokenType.String) + { + string? value = reader.GetString(); + if (value == null) + return null; + + return JsonSerializer.Deserialize>(value, options); + } + + throw new JsonException(); + } + + public override void Write(Utf8JsonWriter writer, List? value, JsonSerializerOptions options) + { + if (value != null) + writer.WriteStringValue(JsonSerializer.Serialize(value, options)); + else + writer.WriteNullValue(); + } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Converters/System.Text.Json/List[string]/StringTypedStringIListConverter.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Converters/System.Text.Json/List[string]/StringTypedStringIListConverter.cs new file mode 100644 index 00000000..cedfa38d --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Converters/System.Text.Json/List[string]/StringTypedStringIListConverter.cs @@ -0,0 +1,34 @@ +using System; +using System.Collections.Generic; +using System.Text.Json; +using System.Text.Json.Serialization; + +namespace System.Text.Json.Converters +{ + internal class StringTypedStringIListConverter : JsonConverter?> + { + private readonly JsonConverter?> _converter = new StringTypedStringListConverter(); + + 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.TenpayV3/Converters/System.Text.Json/List[string]/StringTypedStringListConverter.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Converters/System.Text.Json/List[string]/StringTypedStringListConverter.cs new file mode 100644 index 00000000..ae3850c2 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Converters/System.Text.Json/List[string]/StringTypedStringListConverter.cs @@ -0,0 +1,37 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text.Json; +using System.Text.Json.Serialization; + +namespace System.Text.Json.Converters +{ + internal class StringTypedStringListConverter : JsonConverter?> + { + public override List? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) + { + if (reader.TokenType == JsonTokenType.Null) + { + return null; + } + else if (reader.TokenType == JsonTokenType.String) + { + string? value = reader.GetString(); + if (value == null) + return null; + + return value.Split(',').ToList(); + } + + throw new JsonException(); + } + + public override void Write(Utf8JsonWriter writer, List? value, JsonSerializerOptions options) + { + if (value != null) + writer.WriteStringValue(string.Join(",", value)); + else + writer.WriteNullValue(); + } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Events/PayScorePartnerPermissions/PayScorePartnerPermissionsResource.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Events/PayScorePartnerPermissions/PayScorePartnerPermissionsResource.cs index a533b38c..58a0d42a 100644 --- a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Events/PayScorePartnerPermissions/PayScorePartnerPermissionsResource.cs +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Events/PayScorePartnerPermissions/PayScorePartnerPermissionsResource.cs @@ -76,9 +76,9 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Events /// 获取或设置服务开启或解除授权时间。 /// [Newtonsoft.Json.JsonProperty("openorclose_time")] - [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.CommonWithoutSeparatorsNullableDateTimeOffsetConverter))] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.PureDigitalTextNullableDateTimeOffsetConverter))] [System.Text.Json.Serialization.JsonPropertyName("openorclose_time")] - [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.CommonWithoutSeparatorsNullableDateTimeOffsetConverter))] + [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.PureDigitalTextNullableDateTimeOffsetConverter))] public DateTimeOffset? OpenOrCloseTime { get; set; } } } diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Events/PayScorePermissions/PayScorePermissionsResource.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Events/PayScorePermissions/PayScorePermissionsResource.cs index b46dda6d..5f8e22fb 100644 --- a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Events/PayScorePermissions/PayScorePermissionsResource.cs +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Events/PayScorePermissions/PayScorePermissionsResource.cs @@ -62,9 +62,9 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Events /// 获取或设置服务开启或解除授权时间。 /// [Newtonsoft.Json.JsonProperty("openorclose_time")] - [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.CommonWithoutSeparatorsNullableDateTimeOffsetConverter))] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.PureDigitalTextNullableDateTimeOffsetConverter))] [System.Text.Json.Serialization.JsonPropertyName("openorclose_time")] - [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.CommonWithoutSeparatorsNullableDateTimeOffsetConverter))] + [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.PureDigitalTextNullableDateTimeOffsetConverter))] public DateTimeOffset? OpenOrCloseTime { get; set; } } } diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Events/PayScoreServiceOrder/PayScoreServiceOrderResource.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Events/PayScoreServiceOrder/PayScoreServiceOrderResource.cs index 7a271259..27f0b7b4 100644 --- a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Events/PayScoreServiceOrder/PayScoreServiceOrderResource.cs +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Events/PayScoreServiceOrder/PayScoreServiceOrderResource.cs @@ -72,9 +72,9 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Events /// 获取或设置服务开始时间。 /// [Newtonsoft.Json.JsonProperty("start_time")] - [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.CommonWithoutSeparatorsDateTimeOffsetConverter))] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.PureDigitalTextDateTimeOffsetConverter))] [System.Text.Json.Serialization.JsonPropertyName("start_time")] - [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.CommonWithoutSeparatorsDateTimeOffsetConverter))] + [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.PureDigitalTextDateTimeOffsetConverter))] public DateTimeOffset StartTime { get; set; } /// @@ -88,9 +88,9 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Events /// 获取或设置服务结束时间。 /// [Newtonsoft.Json.JsonProperty("end_time")] - [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.CommonWithoutSeparatorsNullableDateTimeOffsetConverter))] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.PureDigitalTextNullableDateTimeOffsetConverter))] [System.Text.Json.Serialization.JsonPropertyName("end_time")] - [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.CommonWithoutSeparatorsNullableDateTimeOffsetConverter))] + [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.PureDigitalTextNullableDateTimeOffsetConverter))] public DateTimeOffset? EndTime { get; set; } /// diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Events/VehicleParking/VehicleTransactionResource.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Events/VehicleParking/VehicleTransactionResource.cs index 70f25580..5eb31775 100644 --- a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Events/VehicleParking/VehicleTransactionResource.cs +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Events/VehicleParking/VehicleTransactionResource.cs @@ -29,17 +29,6 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Events } } - internal static class Converters - { - internal class NewtonsoftJsonYesOrNoConverter : Models.CreateVehicleTransactionParkingRequest.Converters.NewtonsoftJsonYesOrNoConverter - { - } - - internal class SystemTextJsonYesOrNoConverter : Models.CreateVehicleTransactionParkingRequest.Converters.SystemTextJsonYesOrNoConverter - { - } - } - /// /// 获取或设置微信商户号。 /// @@ -121,9 +110,9 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Events /// 获取或设置用户是否还款。 /// [Newtonsoft.Json.JsonProperty("user_repaid")] - [Newtonsoft.Json.JsonConverter(typeof(Converters.NewtonsoftJsonYesOrNoConverter))] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.YesOrNoNullableBooleanConverter))] [System.Text.Json.Serialization.JsonPropertyName("user_repaid")] - [System.Text.Json.Serialization.JsonConverter(typeof(Converters.SystemTextJsonYesOrNoConverter))] + [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.YesOrNoNullableBooleanConverter))] public bool? IsUserRepaid { get; set; } /// diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Interceptors/WechatTenpaySignInterceptor.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Interceptors/WechatTenpaySignInterceptor.cs index 84886a74..db011f99 100644 --- a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Interceptors/WechatTenpaySignInterceptor.cs +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Interceptors/WechatTenpaySignInterceptor.cs @@ -7,7 +7,7 @@ using Flurl.Http; namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Interceptors { - internal class WechatTenpaySignInterceptor : WechatHttpCallInterceptor + internal class WechatTenpaySignInterceptor : FlurlHttpCallInterceptor { private readonly string _scheme; private readonly string _mchId; diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceApplyments/GetEcommerceApplymentByOutRequestNumberResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceApplyments/GetEcommerceApplymentByOutRequestNumberResponse.cs index 360c36b7..83bc4b6b 100644 --- a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceApplyments/GetEcommerceApplymentByOutRequestNumberResponse.cs +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/EcommerceApplyments/GetEcommerceApplymentByOutRequestNumberResponse.cs @@ -72,9 +72,9 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models /// 获取或设置汇款截止时间。 /// [Newtonsoft.Json.JsonProperty("deadline")] - [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.CommonDateTimeOffsetConverter))] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.RegularDateTimeOffsetConverter))] [System.Text.Json.Serialization.JsonPropertyName("deadline")] - [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.CommonDateTimeOffsetConverter))] + [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.RegularDateTimeOffsetConverter))] public DateTimeOffset Deadline { get; set; } } diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayScoreServiceOrder/CreatePayScoreServiceOrderDirectCompleteRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayScoreServiceOrder/CreatePayScoreServiceOrderDirectCompleteRequest.cs index ed929351..fd21f374 100644 --- a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayScoreServiceOrder/CreatePayScoreServiceOrderDirectCompleteRequest.cs +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayScoreServiceOrder/CreatePayScoreServiceOrderDirectCompleteRequest.cs @@ -24,9 +24,9 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models /// 获取或设置服务开始时间。 /// [Newtonsoft.Json.JsonProperty("start_time")] - [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.CommonWithoutSeparatorsDateTimeOffsetConverter))] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.PureDigitalTextDateTimeOffsetConverter))] [System.Text.Json.Serialization.JsonPropertyName("start_time")] - [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.CommonWithoutSeparatorsDateTimeOffsetConverter))] + [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.PureDigitalTextDateTimeOffsetConverter))] public DateTimeOffset StartTime { get; set; } /// @@ -40,9 +40,9 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models /// 获取或设置服务结束时间。 /// [Newtonsoft.Json.JsonProperty("end_time")] - [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.CommonWithoutSeparatorsDateTimeOffsetConverter))] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.PureDigitalTextDateTimeOffsetConverter))] [System.Text.Json.Serialization.JsonPropertyName("end_time")] - [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.CommonWithoutSeparatorsDateTimeOffsetConverter))] + [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.PureDigitalTextDateTimeOffsetConverter))] public DateTimeOffset EndTime { get; set; } /// diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayScoreServiceOrder/GetPayScoreServiceOrderByOutOrderNumberResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayScoreServiceOrder/GetPayScoreServiceOrderByOutOrderNumberResponse.cs index ea7380b2..125c8fa0 100644 --- a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayScoreServiceOrder/GetPayScoreServiceOrderByOutOrderNumberResponse.cs +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayScoreServiceOrder/GetPayScoreServiceOrderByOutOrderNumberResponse.cs @@ -175,9 +175,9 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models /// 获取或设置收款成功时间。 /// [Newtonsoft.Json.JsonProperty("paid_time")] - [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.CommonWithoutSeparatorsNullableDateTimeOffsetConverter))] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.PureDigitalTextNullableDateTimeOffsetConverter))] [System.Text.Json.Serialization.JsonPropertyName("paid_time")] - [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.CommonWithoutSeparatorsNullableDateTimeOffsetConverter))] + [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.PureDigitalTextNullableDateTimeOffsetConverter))] public DateTimeOffset? PaidTime { get; set; } /// diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayScoreServiceOrder/SetPayScoreServiceOrderSyncRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayScoreServiceOrder/SetPayScoreServiceOrderSyncRequest.cs index 54732ca6..208cae13 100644 --- a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayScoreServiceOrder/SetPayScoreServiceOrderSyncRequest.cs +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayScoreServiceOrder/SetPayScoreServiceOrderSyncRequest.cs @@ -23,9 +23,9 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models /// 获取或设置收款成功时间。 /// [Newtonsoft.Json.JsonProperty("paid_time")] - [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.CommonWithoutSeparatorsNullableDateTimeOffsetConverter))] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.PureDigitalTextNullableDateTimeOffsetConverter))] [System.Text.Json.Serialization.JsonPropertyName("paid_time")] - [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.CommonWithoutSeparatorsNullableDateTimeOffsetConverter))] + [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.PureDigitalTextNullableDateTimeOffsetConverter))] public DateTimeOffset? PaidTime { get; set; } /// diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/Vehicle/Transactions/CreateVehicleTransactionParkingRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/Vehicle/Transactions/CreateVehicleTransactionParkingRequest.cs index 2f28d222..4387021f 100644 --- a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/Vehicle/Transactions/CreateVehicleTransactionParkingRequest.cs +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/Vehicle/Transactions/CreateVehicleTransactionParkingRequest.cs @@ -92,95 +92,6 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models } } - internal static class Converters - { - internal class NewtonsoftJsonYesOrNoConverter : Newtonsoft.Json.JsonConverter - { - public override bool CanRead - { - get { return true; } - } - - public override bool CanWrite - { - get { return true; } - } - - public override bool? ReadJson(Newtonsoft.Json.JsonReader reader, Type objectType, bool? existingValue, bool hasExistingValue, Newtonsoft.Json.JsonSerializer serializer) - { - if (reader.TokenType == Newtonsoft.Json.JsonToken.Null) - { - return existingValue; - } - else if (reader.TokenType == Newtonsoft.Json.JsonToken.Boolean) - { - return serializer.Deserialize(reader); - } - else if (reader.TokenType == Newtonsoft.Json.JsonToken.String) - { - string? value = serializer.Deserialize(reader); - if (value == null) - return existingValue; - - if ("Y".Equals(value)) - return true; - else if ("N".Equals(value)) - return false; - } - - throw new Newtonsoft.Json.JsonReaderException(); - } - - public override void WriteJson(Newtonsoft.Json.JsonWriter writer, bool? value, Newtonsoft.Json.JsonSerializer serializer) - { - if (value.HasValue) - writer.WriteValue(value.Value ? "Y" : "N"); - else - writer.WriteNull(); - } - } - - internal class SystemTextJsonYesOrNoConverter : System.Text.Json.Serialization.JsonConverter - { - public override bool? 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.True) - { - return true; - } - else if (reader.TokenType == System.Text.Json.JsonTokenType.False) - { - return false; - } - else if (reader.TokenType == System.Text.Json.JsonTokenType.String) - { - string? value = reader.GetString(); - if (value == null) - return null; - - if ("Y".Equals(value)) - return true; - else if ("N".Equals(value)) - return false; - } - - throw new System.Text.Json.JsonException(); - } - - public override void Write(System.Text.Json.Utf8JsonWriter writer, bool? value, System.Text.Json.JsonSerializerOptions options) - { - if (value.HasValue) - writer.WriteStringValue(value.Value ? "Y" : "N"); - else - writer.WriteNullValue(); - } - } - } - /// /// 获取或设置微信 AppId。 /// @@ -248,9 +159,9 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models /// 获取或设置是否分账。 /// [Newtonsoft.Json.JsonProperty("profit_sharing")] - [Newtonsoft.Json.JsonConverter(typeof(Converters.NewtonsoftJsonYesOrNoConverter))] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.YesOrNoNullableBooleanConverter))] [System.Text.Json.Serialization.JsonPropertyName("profit_sharing")] - [System.Text.Json.Serialization.JsonConverter(typeof(Converters.SystemTextJsonYesOrNoConverter))] + [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.YesOrNoNullableBooleanConverter))] public bool? IsProfitSharing { get; set; } /// diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/Vehicle/Transactions/GetVehicleTransactionByOutTradeNumberResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/Vehicle/Transactions/GetVehicleTransactionByOutTradeNumberResponse.cs index b8096b6f..561d3633 100644 --- a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/Vehicle/Transactions/GetVehicleTransactionByOutTradeNumberResponse.cs +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/Vehicle/Transactions/GetVehicleTransactionByOutTradeNumberResponse.cs @@ -195,17 +195,6 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models } } - internal static class Converters - { - internal class NewtonsoftJsonYesOrNoConverter : CreateVehicleTransactionParkingRequest.Converters.NewtonsoftJsonYesOrNoConverter - { - } - - internal class SystemTextJsonYesOrNoConverter : CreateVehicleTransactionParkingRequest.Converters.SystemTextJsonYesOrNoConverter - { - } - } - /// /// 获取或设置微信商户号。 /// @@ -287,9 +276,9 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models /// 获取或设置用户是否还款。 /// [Newtonsoft.Json.JsonProperty("user_repaid")] - [Newtonsoft.Json.JsonConverter(typeof(Converters.NewtonsoftJsonYesOrNoConverter))] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.YesOrNoNullableBooleanConverter))] [System.Text.Json.Serialization.JsonPropertyName("user_repaid")] - [System.Text.Json.Serialization.JsonConverter(typeof(Converters.SystemTextJsonYesOrNoConverter))] + [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.YesOrNoNullableBooleanConverter))] public bool? IsUserRepaid { get; set; } /// diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/WechatTenpayClient.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/WechatTenpayClient.cs index 5d4ea92a..fec85eb5 100644 --- a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/WechatTenpayClient.cs +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/WechatTenpayClient.cs @@ -17,7 +17,7 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3 /// /// 一个微信支付 API HTTP 客户端。 /// - public partial class WechatTenpayClient : WechatClientBase + public class WechatTenpayClient : CommonClientBase, IWechatClient { /// /// 获取当前客户端使用的微信商户平台凭证。 diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/WechatTenpayException.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/WechatTenpayException.cs index 455233cf..9083b5eb 100644 --- a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/WechatTenpayException.cs +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/WechatTenpayException.cs @@ -5,7 +5,7 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3 /// /// 当调用微信支付 API 出错时引发的异常。 /// - public class WechatTenpayException : WechatExceptionBase + public class WechatTenpayException : CommonExceptionBase { /// public WechatTenpayException() diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/WechatConverterTests.cs b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/WechatConverterTests.cs deleted file mode 100644 index 4d85b78d..00000000 --- a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/WechatConverterTests.cs +++ /dev/null @@ -1,116 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading; -using System.Threading.Tasks; -using Xunit; - -namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests -{ - public class WechatConverterTests - { - class JsonDateTimeOffsetTestEntity - { - [Newtonsoft.Json.JsonProperty("datetime_rfc3339")] - [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.RFC3339DateTimeOffsetConverter))] - [System.Text.Json.Serialization.JsonPropertyName("datetime_rfc3339")] - [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.RFC3339DateTimeOffsetConverter))] - public DateTimeOffset DateTimeWithRFC3339 { get; set; } - - [Newtonsoft.Json.JsonProperty("nullable_datetime_rfc3339")] - [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.RFC3339NullableDateTimeOffsetConverter))] - [System.Text.Json.Serialization.JsonPropertyName("nullable_datetime_rfc3339")] - [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.RFC3339NullableDateTimeOffsetConverter))] - public DateTimeOffset? NullableDateTimeWithRFC3339 { get; set; } - } - - class JsonStringTypedStringListOrArrayTestEntity - { - [Newtonsoft.Json.JsonProperty("string_ilist")] - [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.JsonTypedStringIListConverter))] - [System.Text.Json.Serialization.JsonPropertyName("string_ilist")] - [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.JsonTypedStringIListConverter))] - public IList StringTypedIList { get; set; } - - [Newtonsoft.Json.JsonProperty("string_list")] - [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.JsonTypedStringListConverter))] - [System.Text.Json.Serialization.JsonPropertyName("string_list")] - [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.JsonTypedStringListConverter))] - public List StringTypedList { get; set; } - - [Newtonsoft.Json.JsonProperty("string_array")] - [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.JsonTypedStringArrayConverter))] - [System.Text.Json.Serialization.JsonPropertyName("string_array")] - [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.JsonTypedStringArrayConverter))] - public string[] StringTypedArray { get; set; } - } - - [Fact(DisplayName = "日期时间 JSON 序列化 / 反序列化")] - public void JsonDateTimeOffsetTest() - { - const string FORMAT_RFC3339 = "yyyy-MM-dd'T'HH:mm:sszzz"; - - string datestr = "2018-06-08T10:34:56+08:00"; - var date = DateTimeOffset.Parse(datestr); - var raw = new JsonDateTimeOffsetTestEntity(); - - Assert.Equal(datestr, date.ToString(FORMAT_RFC3339)); - - raw.DateTimeWithRFC3339 = date; - raw.NullableDateTimeWithRFC3339 = date; - var json = new FlurlNewtonsoftJsonSerializer().Serialize(raw); - var entity = new FlurlNewtonsoftJsonSerializer().Deserialize(json); - - Assert.Contains($"\"datetime_rfc3339\":\"{datestr}\"", json); - Assert.Contains($"\"nullable_datetime_rfc3339\":\"{datestr}\"", json); - Assert.Equal(raw.DateTimeWithRFC3339, entity.DateTimeWithRFC3339); - Assert.Equal(raw.NullableDateTimeWithRFC3339, entity.NullableDateTimeWithRFC3339); - - raw.NullableDateTimeWithRFC3339 = null; - json = new FlurlNewtonsoftJsonSerializer().Serialize(raw); - entity = new FlurlNewtonsoftJsonSerializer().Deserialize(json); - - Assert.Equal(datestr, date.ToString(FORMAT_RFC3339)); - Assert.DoesNotContain($"\"nullable_datetime_rfc3339\"", json); - Assert.Null(entity.NullableDateTimeWithRFC3339); - - json = new FlurlSystemTextJsonSerializer().Serialize(raw); - entity = new FlurlSystemTextJsonSerializer().Deserialize(json); - - Assert.Equal(datestr, date.ToString(FORMAT_RFC3339)); - Assert.DoesNotContain($"\"nullable_datetime_rfc3339\"", json); - Assert.Null(entity.NullableDateTimeWithRFC3339); - } - - [Fact(DisplayName = "字符串类型的字符串列表、数组 JSON 序列化 / 反序列化")] - public void JsonStringTypedStringListOrArrayTest() - { - const string STR = "test"; - - var raw = new JsonStringTypedStringListOrArrayTestEntity(); - raw.StringTypedIList = new List() { STR }; - raw.StringTypedList = new List() { STR }; - raw.StringTypedArray = new string[] { STR }; - - var json = new FlurlNewtonsoftJsonSerializer().Serialize(raw); - var entity = new FlurlNewtonsoftJsonSerializer().Deserialize(json); - - Assert.Contains($"\"string_ilist\":\"[\\\"{STR}\\\"]\"", json); - Assert.Contains($"\"string_list\":\"[\\\"{STR}\\\"]\"", json); - Assert.Contains($"\"string_array\":\"[\\\"{STR}\\\"]\"", json); - Assert.Contains(raw.StringTypedIList, e => STR.Equals(e)); - Assert.Contains(raw.StringTypedList, e => STR.Equals(e)); - Assert.Contains(raw.StringTypedArray, e => STR.Equals(e)); - - json = new FlurlSystemTextJsonSerializer().Serialize(raw); - entity = new FlurlSystemTextJsonSerializer().Deserialize(json); - - Assert.Contains($"\"string_ilist\":\"[\\\"{STR}\\\"]\"", json); - Assert.Contains($"\"string_list\":\"[\\\"{STR}\\\"]\"", json); - Assert.Contains($"\"string_array\":\"[\\\"{STR}\\\"]\"", json); - Assert.Contains(raw.StringTypedIList, e => STR.Equals(e)); - Assert.Contains(raw.StringTypedList, e => STR.Equals(e)); - Assert.Contains(raw.StringTypedArray, e => STR.Equals(e)); - } - } -}