feat(wxapi): 升级公共组件

This commit is contained in:
Fu Diwei
2022-01-21 16:57:42 +08:00
parent 782504def6
commit 5650e3be25
62 changed files with 523 additions and 939 deletions

View File

@@ -0,0 +1,47 @@
using System;
using System.Collections.Generic;
using System.Linq;
namespace Newtonsoft.Json.Converters
{
internal class TextualStringArrayWithPipeSplitConverter : JsonConverter<string[]?>
{
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<string>(reader);
if (value == null)
return null;
if (string.IsNullOrEmpty(value))
return Array.Empty<string>();
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();
}
}
}

View File

@@ -4,7 +4,7 @@ using System.Linq;
namespace Newtonsoft.Json.Converters
{
internal class TextualStringListWithSemicolonConverter : JsonConverter<List<string>?>
internal class TextualStringArrayWithSemicolonSplitConverter : JsonConverter<string[]?>
{
public override bool CanRead
{
@@ -16,7 +16,7 @@ namespace Newtonsoft.Json.Converters
get { return true; }
}
public override List<string>? ReadJson(JsonReader reader, Type objectType, List<string>? 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<string>(reader);
if (value == null)
return existingValue;
return null;
if (string.IsNullOrEmpty(value))
return Array.Empty<string>();
return value.Split(';').ToList();
return value.Split(';');
}
throw new JsonReaderException();
throw new JsonSerializationException();
}
public override void WriteJson(JsonWriter writer, List<string>? value, JsonSerializer serializer)
public override void WriteJson(JsonWriter writer, string[]? value, JsonSerializer serializer)
{
if (value != null)
writer.WriteValue(string.Join(";", value));

View File

@@ -0,0 +1,39 @@
using System;
using System.Collections.Generic;
using System.Linq;
namespace Newtonsoft.Json.Converters
{
internal class TextualStringListWithPipeSplitConverter : JsonConverter
{
private readonly JsonConverter<string[]?> _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<string>?)value)?.ToArray(), serializer);
}
}
}

View File

@@ -0,0 +1,39 @@
using System;
using System.Collections.Generic;
using System.Linq;
namespace Newtonsoft.Json.Converters
{
internal class TextualStringListWithSemicolonSplitConverter : JsonConverter
{
private readonly JsonConverter<string[]?> _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<string>?)value)?.ToArray(), serializer);
}
}
}

View File

@@ -4,9 +4,9 @@ using System.Text.Json.Serialization;
namespace System.Text.Json.Converters
{
internal class TextualInt32ListConverter : JsonConverter<List<int>?>
internal class TextualStringArrayWithPipeSplitConverter : JsonConverter<string[]?>
{
public override List<int>? 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<string>();
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<int>? 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();
}

View File

@@ -4,9 +4,9 @@ using System.Text.Json.Serialization;
namespace System.Text.Json.Converters
{
internal class TextualStringListWithSemicolonConverter : JsonConverter<List<string>?>
internal class TextualStringArrayWithSemicolonSplitConverter : JsonConverter<string[]?>
{
public override List<string>? 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<string>();
return value.Split(';').ToList();
return value.Split(';');
}
throw new JsonException();
}
public override void Write(Utf8JsonWriter writer, List<string>? value, JsonSerializerOptions options)
public override void Write(Utf8JsonWriter writer, string[]? value, JsonSerializerOptions options)
{
if (value != null)
writer.WriteStringValue(string.Join(";", value));

View File

@@ -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<IList<string>?>
{
private readonly JsonConverter<string[]?> _converter = new TextualStringArrayWithPipeSplitConverter();
public override IList<string>? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
{
string[]? array = _converter.Read(ref reader, typeToConvert, options);
IList<string>? list = array?.ToList();
return list;
}
public override void Write(Utf8JsonWriter writer, IList<string>? 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();
}
}
}

View File

@@ -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<IList<string>?>
{
private readonly JsonConverter<string[]?> _converter = new TextualStringArrayWithSemicolonSplitConverter();
public override IList<string>? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
{
string[]? array = _converter.Read(ref reader, typeToConvert, options);
IList<string>? list = array?.ToList();
return list;
}
public override void Write(Utf8JsonWriter writer, IList<string>? 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();
}
}
}

View File

@@ -1,31 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
namespace Newtonsoft.Json.Converters
{
internal class TextualStringArrayWithSemicolonConverter : JsonConverter<string[]?>
{
private readonly JsonConverter<List<string>?> _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);
}
}
}

View File

@@ -1,42 +0,0 @@
using System;
using System.Collections.Generic;
namespace Newtonsoft.Json.Converters
{
internal class TextualInt32IListConverter : JsonConverter<IList<int>?>
{
private readonly JsonConverter<List<int>?> _converter = new TextualInt32ListConverter();
public override bool CanRead
{
get { return true; }
}
public override bool CanWrite
{
get { return true; }
}
public override IList<int>? ReadJson(JsonReader reader, Type objectType, IList<int>? existingValue, bool hasExistingValue, JsonSerializer serializer)
{
return _converter.ReadJson(reader, objectType, ConvertIListToList(existingValue), hasExistingValue, serializer);
}
public override void WriteJson(JsonWriter writer, IList<int>? value, JsonSerializer serializer)
{
_converter.WriteJson(writer, ConvertIListToList(value), serializer);
}
private List<int>? ConvertIListToList(IList<int>? src)
{
if (src == null)
return null;
List<int>? dest = src as List<int>;
if (dest != null)
return dest;
return new List<int>(src);
}
}
}

View File

@@ -1,52 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
namespace Newtonsoft.Json.Converters
{
internal class TextualInt32ListConverter : JsonConverter<List<int>?>
{
public override bool CanRead
{
get { return true; }
}
public override bool CanWrite
{
get { return true; }
}
public override List<int>? ReadJson(JsonReader reader, Type objectType, List<int>? existingValue, bool hasExistingValue, JsonSerializer serializer)
{
if (reader.TokenType == JsonToken.Null)
{
return null;
}
else if (reader.TokenType == JsonToken.String)
{
string? value = serializer.Deserialize<string>(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<int>? value, JsonSerializer serializer)
{
if (value != null)
writer.WriteValue(string.Join(",", value));
else
writer.WriteNull();
}
}
}

View File

@@ -1,42 +0,0 @@
using System;
using System.Collections.Generic;
namespace Newtonsoft.Json.Converters
{
internal class TextualStringIListWithSemicolonConverter : JsonConverter<IList<string>?>
{
private readonly JsonConverter<List<string>?> _converter = new TextualStringListWithSemicolonConverter();
public override bool CanRead
{
get { return true; }
}
public override bool CanWrite
{
get { return true; }
}
public override IList<string>? ReadJson(JsonReader reader, Type objectType, IList<string>? existingValue, bool hasExistingValue, JsonSerializer serializer)
{
return _converter.ReadJson(reader, objectType, ConvertIListToList(existingValue), hasExistingValue, serializer);
}
public override void WriteJson(JsonWriter writer, IList<string>? value, JsonSerializer serializer)
{
_converter.WriteJson(writer, ConvertIListToList(value), serializer);
}
private List<string>? ConvertIListToList(IList<string>? src)
{
if (src == null)
return null;
List<string>? dest = src as List<string>;
if (dest != null)
return dest;
return new List<string>(src);
}
}
}

View File

@@ -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<string[]?>
{
private readonly JsonConverter<List<string>?> _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);
}
}
}

View File

@@ -1,32 +0,0 @@
using System.Collections.Generic;
using System.Text.Json.Serialization;
namespace System.Text.Json.Converters
{
internal class TextualInt32IListConverter : JsonConverter<IList<int>?>
{
private readonly JsonConverter<List<int>?> _converter = new TextualInt32ListConverter();
public override IList<int>? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
{
return _converter.Read(ref reader, typeToConvert, options);
}
public override void Write(Utf8JsonWriter writer, IList<int>? value, JsonSerializerOptions options)
{
_converter.Write(writer, ConvertIListToList(value), options);
}
private List<int>? ConvertIListToList(IList<int>? src)
{
if (src == null)
return null;
List<int>? dest = src as List<int>;
if (dest != null)
return dest;
return new List<int>(src);
}
}
}

View File

@@ -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<IList<string>?>
{
private readonly JsonConverter<List<string>?> _converter = new TextualStringListWithSemicolonConverter();
public override IList<string>? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
{
return _converter.Read(ref reader, typeToConvert, options)?.ToArray();
}
public override void Write(Utf8JsonWriter writer, IList<string>? value, JsonSerializerOptions options)
{
_converter.Write(writer, value?.ToList(), options);
}
}
}

View File

@@ -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;

View File

@@ -32,9 +32,9 @@ namespace SKIT.FlurlHttpClient.Wechat.Api.Models
/// 获取或设置业务域名列表。
/// </summary>
[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<string>? WxaJumpH5DomainList { get; set; }
}
}

View File

@@ -9,27 +9,27 @@
/// 获取或设置目前生效的全网发布版第三方平台小程序业务域名列表。
/// </summary>
[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; }
/// <summary>
/// 获取或设置目前生效的测试版第三方平台小程序业务域名列表。
/// </summary>
[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; }
/// <summary>
/// 获取或设置未通过验证的第三方平台小程序业务域名列表。
/// </summary>
[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; }
}
}

View File

@@ -32,9 +32,9 @@ namespace SKIT.FlurlHttpClient.Wechat.Api.Models
/// 获取或设置服务器域名列表。
/// </summary>
[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<string>? WxaServerDomainList { get; set; }
}
}

View File

@@ -9,27 +9,27 @@
/// 获取或设置目前生效的全网发布版第三方平台小程序服务器域名列表。
/// </summary>
[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; }
/// <summary>
/// 获取或设置目前生效的测试版第三方平台小程序服务器域名列表。
/// </summary>
[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; }
/// <summary>
/// 获取或设置未通过验证的第三方平台小程序服务器域名列表。
/// </summary>
[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; }
}
}

View File

@@ -17,7 +17,7 @@
/// </summary>
[Newtonsoft.Json.JsonProperty("tagid_list")]
[System.Text.Json.Serialization.JsonPropertyName("tagid_list")]
public int[] TagIdList { get; set; } = default!;
public string[] TagIdList { get; set; } = default!;
/// <summary>
/// 获取或设置打印员数量。

View File

@@ -25,9 +25,9 @@ namespace SKIT.FlurlHttpClient.Wechat.Api.Models
/// 获取或设置打印员面单打印权限列表。
/// </summary>
[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<int>? TagIdList { get; set; }
[System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.TextualStringListWithCommaSplitConverter))]
public IList<string>? TagIdList { get; set; }
}
}

View File

@@ -145,7 +145,7 @@ namespace SKIT.FlurlHttpClient.Wechat.Api.Models
internal static class Converters
{
internal class NewtonsoftJsonWaybillDataListConverter : Newtonsoft.Json.JsonConverter<IList<Types.WaybillData>?>
internal class RequestPropertyWaybillDataListNewtonsoftJsonConverter : Newtonsoft.Json.JsonConverter<IList<Types.WaybillData>?>
{
public override bool CanRead
{
@@ -194,7 +194,7 @@ namespace SKIT.FlurlHttpClient.Wechat.Api.Models
}
}
internal class SystemTextJsonWaybillDataListConverter : System.Text.Json.Serialization.JsonConverter<IList<Types.WaybillData>?>
internal class RequestPropertyWaybillDataListSystemTextJsonConverter : System.Text.Json.Serialization.JsonConverter<IList<Types.WaybillData>?>
{
public override IList<Types.WaybillData>? Read(ref System.Text.Json.Utf8JsonReader reader, Type typeToConvert, System.Text.Json.JsonSerializerOptions options)
{
@@ -252,9 +252,9 @@ namespace SKIT.FlurlHttpClient.Wechat.Api.Models
/// 获取或设置面单数据列表。
/// </summary>
[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<Types.WaybillData> WaybillDataList { get; set; } = new List<Types.WaybillData>();
/// <summary>

View File

@@ -21,7 +21,8 @@
/// </summary>
[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; }
}
}

View File

@@ -49,9 +49,9 @@ namespace SKIT.FlurlHttpClient.Wechat.Api.Models
/// 获取或设置商品价格(单位:分)。
/// </summary>
[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; }
/// <summary>
@@ -72,18 +72,18 @@ namespace SKIT.FlurlHttpClient.Wechat.Api.Models
/// 获取或设置佣金金额(单位:分)。
/// </summary>
[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; }
/// <summary>
/// 获取或设置预估佣金金额(单位:分)。
/// </summary>
[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; }
/// <summary>
@@ -196,7 +196,7 @@ namespace SKIT.FlurlHttpClient.Wechat.Api.Models
internal static class Converters
{
internal class NewtonsoftJsonCurrencyConverter : Newtonsoft.Json.JsonConverter<int>
internal class ResponsePropertyCurrencyNewtonsoftJsonConverter : Newtonsoft.Json.JsonConverter<int>
{
public override bool CanRead
{
@@ -239,7 +239,7 @@ namespace SKIT.FlurlHttpClient.Wechat.Api.Models
}
}
internal class SystemTextJsonCurrencyConverter : System.Text.Json.Serialization.JsonConverter<int>
internal class ResponsePropertyCurrencySystemTextJsonConverter : System.Text.Json.Serialization.JsonConverter<int>
{
public override int Read(ref System.Text.Json.Utf8JsonReader reader, Type typeToConvert, System.Text.Json.JsonSerializerOptions options)
{

View File

@@ -63,8 +63,9 @@
/// </summary>
[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

View File

@@ -105,208 +105,28 @@ namespace SKIT.FlurlHttpClient.Wechat.Api.Models
internal static class Converters
{
internal class NewtonsoftJsonPictureConverter : Newtonsoft.Json.JsonConverter<Types.Picture?>
internal class RequestPropertyPictureNewtonsoftJsonConverter : Newtonsoft.Json.Converters.TextualObjectInJsonFormatConverterBase<Types.Picture?>
{
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<string>(reader);
if (value == null)
return existingValue;
return Newtonsoft.Json.JsonConvert.DeserializeObject<Types.Picture>(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<Types.Picture?>
internal class RequestPropertyPictureSystemTextJsonConverter : System.Text.Json.Converters.TextualObjectInJsonFormatConverterBase<Types.Picture?>
{
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<Types.Picture>(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<Types.Service?>
internal class RequestPropertyServiceNewtonsoftJsonConverter : Newtonsoft.Json.Converters.TextualObjectInJsonFormatConverterBase<Types.Service?>
{
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<string>(reader);
if (value == null)
return existingValue;
return Newtonsoft.Json.JsonConvert.DeserializeObject<Types.Service>(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<Types.Service?>
internal class RequestPropertyServiceSystemTextJsonConverter : System.Text.Json.Converters.TextualObjectInJsonFormatConverterBase<Types.Service?>
{
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<Types.Service>(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<Types.Kf?>
internal class RequsetPropertyKfNewtonsoftJsonConverter : Newtonsoft.Json.Converters.TextualObjectInJsonFormatConverterBase<Types.Kf?>
{
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<string>(reader);
if (value == null)
return existingValue;
return Newtonsoft.Json.JsonConvert.DeserializeObject<Types.Kf>(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<Types.Kf?>
internal class RequestPropertyKfSystemTextJsonConverter : System.Text.Json.Converters.TextualObjectInJsonFormatConverterBase<Types.Kf?>
{
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<Types.Kf>(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
/// 获取或设置门店图片信息。
/// </summary>
[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();
/// <summary>
/// 获取或设置服务标签信息。
/// </summary>
[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();
/// <summary>
/// 获取或设置客服信息。
/// </summary>
[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; }
/// <summary>

View File

@@ -31,7 +31,8 @@
/// </summary>
[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; }
/// <summary>
/// 获取或设置调用方请求的唯一标识。

View File

@@ -23,72 +23,12 @@ namespace SKIT.FlurlHttpClient.Wechat.Api.Models
internal static class Converters
{
internal class NewtonsoftJsonPictureConverter : Newtonsoft.Json.JsonConverter<Types.Picture?>
internal class RequestPropertyPictureNewtonsoftJsonConverter : Newtonsoft.Json.Converters.TextualObjectInJsonFormatConverterBase<Types.Picture?>
{
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<string>(reader);
if (value == null)
return existingValue;
return Newtonsoft.Json.JsonConvert.DeserializeObject<Types.Picture>(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<Types.Picture?>
internal class RequestPropertyPictureSystemTextJsonConverter : System.Text.Json.Converters.TextualObjectInJsonFormatConverterBase<Types.Picture?>
{
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<Types.Picture>(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
/// 获取或设置门店图片信息。
/// </summary>
[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();
/// <summary>

View File

@@ -16,72 +16,12 @@ namespace SKIT.FlurlHttpClient.Wechat.Api.Models
internal static class Converters
{
internal class NewtonsoftJsonPictureConverter : Newtonsoft.Json.JsonConverter<Types.Picture?>
internal class RequestPropertyPictureNewtonsoftJsonConverter : Newtonsoft.Json.Converters.TextualObjectInJsonFormatConverterBase<Types.Picture?>
{
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<string>(reader);
if (value == null)
return existingValue;
return Newtonsoft.Json.JsonConvert.DeserializeObject<Types.Picture>(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<Types.Picture?>
internal class RequestPropertyPictureSystemTextJsonConverter : System.Text.Json.Converters.TextualObjectInJsonFormatConverterBase<Types.Picture?>
{
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<Types.Picture>(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
/// 获取或设置门店图片信息。
/// </summary>
[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();
/// <summary>

View File

@@ -49,72 +49,12 @@ namespace SKIT.FlurlHttpClient.Wechat.Api.Models
internal static class Converters
{
internal class NewtonsoftJsonDefaultTimeDataConverter : Newtonsoft.Json.JsonConverter<Types.DefaultTimeData?>
internal class ResponsePropertyDefaultTimeDataNewtonsoftJsonConverter : Newtonsoft.Json.Converters.TextualObjectInJsonFormatConverterBase<Types.DefaultTimeData?>
{
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<string>(reader);
if (value == null)
return existingValue;
return Newtonsoft.Json.JsonConvert.DeserializeObject<Types.DefaultTimeData>(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<Types.DefaultTimeData?>
internal class ResponsePropertyDefaultTimeDataSystemTextJsonConverter : System.Text.Json.Converters.TextualObjectInJsonFormatConverterBase<Types.DefaultTimeData?>
{
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<Types.DefaultTimeData>(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
/// 获取或设置查询数据。
/// </summary>
[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; }
/// <summary>

View File

@@ -136,77 +136,6 @@ namespace SKIT.FlurlHttpClient.Wechat.Api.Models
}
}
internal static class Converters
{
internal class NewtonsoftJsonMediaIdListConverter : Newtonsoft.Json.JsonConverter<IList<string>?>
{
public override bool CanRead
{
get { return true; }
}
public override bool CanWrite
{
get { return true; }
}
public override IList<string>? ReadJson(Newtonsoft.Json.JsonReader reader, Type objectType, IList<string>? 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<string>(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<string>? value, Newtonsoft.Json.JsonSerializer serializer)
{
if (value != null)
writer.WriteValue(string.Join("|", value));
else
writer.WriteNull();
}
}
internal class SystemTextJsonMediaIdListConverter : System.Text.Json.Serialization.JsonConverter<IList<string>?>
{
public override IList<string>? 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<string>? value, System.Text.Json.JsonSerializerOptions options)
{
if (value != null)
writer.WriteStringValue(string.Join("|", value));
else
writer.WriteNullValue();
}
}
}
/// <summary>
/// 获取或设置审核页面列表。
/// </summary>
@@ -239,9 +168,9 @@ namespace SKIT.FlurlHttpClient.Wechat.Api.Models
/// 获取或设置反馈附件 MediaId 列表。
/// </summary>
[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<string>? FeedbackStuffMediaIdList { get; set; }
/// <summary>

View File

@@ -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)。

View File

@@ -9,6 +9,8 @@
<PropertyGroup>
<PackageId>SKIT.FlurlHttpClient.Wechat.Api</PackageId>
<PackageIcon>LOGO.png</PackageIcon>
<PackageReadmeFile>README.md</PackageReadmeFile>
<PackageLicenseExpression>MIT</PackageLicenseExpression>
<PackageProjectUrl>https://github.com/fudiwei/DotNetCore.SKIT.FlurlHttpClient.Wechat</PackageProjectUrl>
<PackageTags>Flurl.Http Wechat Weixin MicroMessage MiniProgram MiniGame MiniStore 微信 公众号 服务号 订阅号 小程序 小游戏 小商店 公众平台 开放平台 微信公众号 微信服务号 微信订阅号 微信小程序 微信小游戏 微信小商店 微信公众平台 微信开放平台</PackageTags>
@@ -17,17 +19,28 @@
<Authors>Fu Diwei</Authors>
<RepositoryType>git</RepositoryType>
<RepositoryUrl>https://github.com/fudiwei/DotNetCore.SKIT.FlurlHttpClient.Wechat.git</RepositoryUrl>
<GenerateDocumentationFile>true</GenerateDocumentationFile>
<IncludeSymbols>true</IncludeSymbols>
<SymbolPackageFormat>snupkg</SymbolPackageFormat>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)' == 'Release'">
<ContinuousIntegrationBuild>true</ContinuousIntegrationBuild>
<Deterministic>true</Deterministic>
<EmbedUntrackedSources>true</EmbedUntrackedSources>
<GenerateDocumentationFile>true</GenerateDocumentationFile>
<IncludeSymbols>true</IncludeSymbols>
<SymbolPackageFormat>snupkg</SymbolPackageFormat>
</PropertyGroup>
<ItemGroup>
<None Include="../../LOGO.png" Pack="true" PackagePath="/" />
<None Include="README.md" Pack="true" PackagePath="/" />
</ItemGroup>
<ItemGroup>
<Reference Include="System.Web" Condition="'$(TargetFramework)' == 'net461'" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="SKIT.FlurlHttpClient.Common" Version="2.1.1" />
<PackageReference Include="SKIT.FlurlHttpClient.Common" Version="2.2.0" />
</ItemGroup>
</Project>

View File

@@ -4,6 +4,9 @@ using System.Text;
namespace SKIT.FlurlHttpClient.Wechat.Api.Utilities
{
/// <summary>
/// AES 算法工具类。
/// </summary>
public static class AESUtility
{
/// <summary>

View File

@@ -5,17 +5,17 @@ using System.Text;
namespace SKIT.FlurlHttpClient.Wechat.Api.Utilities
{
/// <summary>
/// HMAC-SHA-256 算法工具类。
/// HMAC 算法工具类。
/// </summary>
public static class HMACSHA256Utility
public static class HMACUtility
{
/// <summary>
/// 获取信息摘要
/// 获取 HMAC-SHA-256 消息认证码
/// </summary>
/// <param name="secretBytes">密钥字节数组。</param>
/// <param name="bytes">信息字节数组。</param>
/// <returns>信息摘要。</returns>
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
}
/// <summary>
/// 获取信息摘要
/// 获取 HMAC-SHA-256 消息认证码
/// </summary>
/// <param name="secret">密钥。</param>
/// <param name="message">文本信息。</param>
/// <returns>信息摘要。</returns>
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);
}
}
}

View File

@@ -10,7 +10,7 @@ namespace SKIT.FlurlHttpClient.Wechat.Api.Utilities
public static class SHA1Utility
{
/// <summary>
/// 获取信息摘要。
/// 获取 SHA-1 信息摘要。
/// </summary>
/// <param name="bytes">信息字节数组。</param>
/// <returns>信息摘要。</returns>
@@ -24,7 +24,7 @@ namespace SKIT.FlurlHttpClient.Wechat.Api.Utilities
}
/// <summary>
/// 获取信息摘要。
/// 获取 SHA-1 信息摘要。
/// </summary>
/// <param name="message">文本信息。</param>
/// <returns>信息摘要。</returns>