From 2429b28306004aa0c59eb6e276be9eb428bded05 Mon Sep 17 00:00:00 2001 From: Fu Diwei Date: Tue, 4 Apr 2023 15:44:06 +0800 Subject: [PATCH] =?UTF-8?q?feat(tenpayv2):=20=E6=96=B0=E5=A2=9E=E8=BD=A6?= =?UTF-8?q?=E4=B8=BB=E5=B9=B3=E5=8F=B0=E7=9B=B8=E5=85=B3=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/WechatTenpayV2/Basic_ModelDefinition.md | 50 +++- .../FlattenNArrayObjectConverterBase.cs | 39 +-- .../FlattenNArrayObjectConverterBase.cs | 39 +-- .../Events/VehicleEvent.cs | 61 ++++ ...hatTenpayClientExecuteVehicleExtensions.cs | 87 ++++++ ...ayClientExecuteVehiclePartnerExtensions.cs | 21 +- .../Models/Vehicle/ApplyVehiclePayRequest.cs | 275 ++++++++++++++++++ .../Models/Vehicle/ApplyVehiclePayResponse.cs | 37 +++ .../Models/Vehicle/GetTransitOrderRequest.cs | 46 +++ .../Models/Vehicle/GetTransitOrderResponse.cs | 194 ++++++++++++ .../Vehicle/GetVehiclePayStateRequest.cs | 68 +++++ .../Vehicle/GetVehiclePayStateResponse.cs | 118 ++++++++ .../Models/Vehicle/NotifyVehiclePayRequest.cs | 153 ++++++++++ .../Vehicle/NotifyVehiclePayResponse.cs | 44 +++ .../ApplyVehiclePartnerPayRequest.cs | 243 +--------------- .../ApplyVehiclePartnerPayResponse.cs | 31 +- .../GetTransitPartnerOrderRequest.cs | 22 ++ .../GetTransitPartnerOrderResponse.cs | 49 ++++ .../GetVehiclePartnerPayStateRequest.cs | 64 +--- .../GetVehiclePartnerPayStateResponse.cs | 86 +----- .../NotifyVehiclePartnerPayRequest.cs | 121 +------- .../NotifyVehiclePartnerPayResponse.cs | 38 +-- .../EventSamples/VehicleEvent.json | 10 + .../Vehicle/ApplyVehiclePayRequest.json | 15 + .../Vehicle/ApplyVehiclePayResponse.json | 9 + .../Vehicle/GetTransitOrderRequest.json | 8 + .../Vehicle/GetTransitOrderResponse.json | 21 ++ .../Vehicle/GetVehiclePayStateRequest.json | 10 + .../Vehicle/GetVehiclePayStateResponse.json | 11 + .../Vehicle/NotifyVehiclePayRequest.json | 10 + .../Vehicle/NotifyVehiclePayResponse.json | 10 + .../GetTransitPartnerOrderRequest.json | 9 + .../GetTransitPartnerOrderResponse.json | 22 ++ 33 files changed, 1413 insertions(+), 608 deletions(-) create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV2/Events/VehicleEvent.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV2/Extensions/WechatTenpayClientExecuteVehicleExtensions.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV2/Models/Vehicle/ApplyVehiclePayRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV2/Models/Vehicle/ApplyVehiclePayResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV2/Models/Vehicle/GetTransitOrderRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV2/Models/Vehicle/GetTransitOrderResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV2/Models/Vehicle/GetVehiclePayStateRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV2/Models/Vehicle/GetVehiclePayStateResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV2/Models/Vehicle/NotifyVehiclePayRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV2/Models/Vehicle/NotifyVehiclePayResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV2/Models/VehiclePartner/GetTransitPartnerOrderRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV2/Models/VehiclePartner/GetTransitPartnerOrderResponse.cs create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV2.UnitTests/EventSamples/VehicleEvent.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV2.UnitTests/ModelSamples/Vehicle/ApplyVehiclePayRequest.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV2.UnitTests/ModelSamples/Vehicle/ApplyVehiclePayResponse.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV2.UnitTests/ModelSamples/Vehicle/GetTransitOrderRequest.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV2.UnitTests/ModelSamples/Vehicle/GetTransitOrderResponse.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV2.UnitTests/ModelSamples/Vehicle/GetVehiclePayStateRequest.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV2.UnitTests/ModelSamples/Vehicle/GetVehiclePayStateResponse.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV2.UnitTests/ModelSamples/Vehicle/NotifyVehiclePayRequest.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV2.UnitTests/ModelSamples/Vehicle/NotifyVehiclePayResponse.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV2.UnitTests/ModelSamples/VehiclePartner/GetTransitPartnerOrderRequest.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV2.UnitTests/ModelSamples/VehiclePartner/GetTransitPartnerOrderResponse.json diff --git a/docs/WechatTenpayV2/Basic_ModelDefinition.md b/docs/WechatTenpayV2/Basic_ModelDefinition.md index 1c0480ca..6affb37e 100644 --- a/docs/WechatTenpayV2/Basic_ModelDefinition.md +++ b/docs/WechatTenpayV2/Basic_ModelDefinition.md @@ -239,6 +239,22 @@ - 查询签约关系:`GetPAPPayContract` + - 车主平台: + + - 用户入场通知:`NotifyVehiclePay` + + - 申请扣款:`ApplyVehiclePay` + + - 下载交易账单:`DownloadPayBill` + + - 申请退款:`CreatePayRefund` + + - 查询退款:`GetPayRefund` + + - 查询订单:`GetTransitOrder` + + - 用户状态查询:`GetVehiclePayState` + - 清关报关: - 订单附加信息提交接口:`CreateMerchantCustomsCustomDeclaration` @@ -373,6 +389,22 @@ - 交易保障:`SubmitPayITILReport` +- 支付工具: + + - 现金红包: + + - 发放红包:`SendPayMarketingTransfersRedPack` + + - 发放裂变红包:`SendPayMarketingTransfersGroupRedPack` + + - 查询红包记录:`GetPayMarketingTransfersRedPackInfo` + + - 小程序红包: + + - 发放红包:`SendPayMarketingTransfersMiniProgramRedPack` + + - 查询红包记录:`GetPayMarketingTransfersRedPackInfo` + - 扣款服务: - APP 纯签约:`CreatePAPPayPartnerPreEntrustWeb` @@ -417,24 +449,10 @@ - 查询退款:`GetPayRefund` + - 查询订单:`GetTransitPartnerOrder` + - 用户状态查询:`GetVehiclePartnerPayState` -- 支付工具: - - - 现金红包: - - - 发放红包:`SendPayMarketingTransfersRedPack` - - - 发放裂变红包:`SendPayMarketingTransfersGroupRedPack` - - - 查询红包记录:`GetPayMarketingTransfersRedPackInfo` - - - 小程序红包: - - - 发放红包:`SendPayMarketingTransfersMiniProgramRedPack` - - - 查询红包记录:`GetPayMarketingTransfersRedPackInfo` - - 小微商户: - 查询提现状态:`GetFundAutoWithdrawByDate` diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV2/Converters/Internal/Newtonsoft.Json/Object/FlattenNArrayObjectConverterBase.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV2/Converters/Internal/Newtonsoft.Json/Object/FlattenNArrayObjectConverterBase.cs index 44e197f9..bb03c6fb 100644 --- a/src/SKIT.FlurlHttpClient.Wechat.TenpayV2/Converters/Internal/Newtonsoft.Json/Object/FlattenNArrayObjectConverterBase.cs +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV2/Converters/Internal/Newtonsoft.Json/Object/FlattenNArrayObjectConverterBase.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections; using System.Collections.Generic; using System.Linq; @@ -73,8 +73,8 @@ namespace Newtonsoft.Json.Converters else if (reader.TokenType == JsonToken.StartObject) { InnerTypedJsonPropertyInfo[] typedJsonProperties = GetTypedJsonProperties(objectType); - if (typedJsonProperties.Count(p => p.PropertyIsNArray) != 1) - throw new JsonSerializationException("The number of `$n` properties must be only one."); + //if (typedJsonProperties.Count(p => p.PropertyIsNArray) != 1) + // throw new JsonSerializationException("The count of `$n` properties must be only one."); JObject jObject = JObject.Load(reader); T tObject = new T(); @@ -90,25 +90,28 @@ namespace Newtonsoft.Json.Converters } else if (TryMatchNArrayIndex(jProperty.Name, out int index)) { - typedJsonPropertyInfo = typedJsonProperties.Single(e => e.PropertyIsNArray); - - Array? propertyValue = typedJsonPropertyInfo.PropertyInfo.GetValue(tObject) as Array; - ReflectionUtility.CreateOrExpandArray(ref propertyValue, typedJsonPropertyInfo.PropertyType.GetElementType()!, index + 1); - ReflectionUtility.CreateOrExpandArrayElement(propertyValue!, index, (object element) => + foreach (var _ in typedJsonProperties.Where(e => e.PropertyIsNArray)) { - InnerTypedJsonPropertyInfo? insider = GetTypedJsonProperties(element.GetType()) - .SingleOrDefault(p => string.Equals(p.PropertyName.Replace(PROPERTY_WILDCARD_NARRAY_ELEMENT, index.ToString()), jProperty.Name)); - if (insider != null) + typedJsonPropertyInfo = _; + + Array? propertyValue = typedJsonPropertyInfo.PropertyInfo.GetValue(tObject) as Array; + ReflectionUtility.CreateOrExpandArray(ref propertyValue, typedJsonPropertyInfo.PropertyType.GetElementType()!, index + 1); + ReflectionUtility.CreateOrExpandArrayElement(propertyValue!, index, (object element) => { - JsonSerializer tmpSerializer = GetClonedJsonSerializer(serializer, insider.JsonConverterOnRead); - object? elementPropertyValue = jProperty.Value?.ToObject(insider.PropertyType, tmpSerializer); - insider.PropertyInfo.SetValue(element, elementPropertyValue); - } + InnerTypedJsonPropertyInfo? insider = GetTypedJsonProperties(element.GetType()) + .SingleOrDefault(p => string.Equals(p.PropertyName.Replace(PROPERTY_WILDCARD_NARRAY_ELEMENT, index.ToString()), jProperty.Name)); + if (insider != null) + { + JsonSerializer tmpSerializer = GetClonedJsonSerializer(serializer, insider.JsonConverterOnRead); + object? elementPropertyValue = jProperty.Value?.ToObject(insider.PropertyType, tmpSerializer); + insider.PropertyInfo.SetValue(element, elementPropertyValue); + } - return element; - }); + return element; + }); - typedJsonPropertyInfo.PropertyInfo.SetValue(tObject, propertyValue); + typedJsonPropertyInfo.PropertyInfo.SetValue(tObject, propertyValue); + } } else if (serializer.MissingMemberHandling == MissingMemberHandling.Error) { diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV2/Converters/Internal/System.Text.Json/Object/FlattenNArrayObjectConverterBase.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV2/Converters/Internal/System.Text.Json/Object/FlattenNArrayObjectConverterBase.cs index 82f5bb60..0af131c6 100644 --- a/src/SKIT.FlurlHttpClient.Wechat.TenpayV2/Converters/Internal/System.Text.Json/Object/FlattenNArrayObjectConverterBase.cs +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV2/Converters/Internal/System.Text.Json/Object/FlattenNArrayObjectConverterBase.cs @@ -1,4 +1,4 @@ -using System.Collections; +using System.Collections; using System.Collections.Generic; using System.Linq; using System.Reflection; @@ -59,8 +59,8 @@ namespace System.Text.Json.Converters else if (reader.TokenType == JsonTokenType.StartObject) { InnerTypedJsonPropertyInfo[] typedJsonProperties = GetTypedJsonProperties(typeToConvert); - if (typedJsonProperties.Count(p => p.PropertyIsNArray) != 1) - throw new JsonException("The number of `$n` properties must be only one."); + //if (typedJsonProperties.Count(p => p.PropertyIsNArray) != 1) + // throw new JsonException("The count of `$n` properties must be only one."); JsonElement jElement = JsonDocument.ParseValue(ref reader).RootElement.Clone(); T tObject = new T(); @@ -76,25 +76,28 @@ namespace System.Text.Json.Converters } else if (TryMatchNArrayIndex(jProperty.Name, out int index)) { - typedJsonPropertyInfo = typedJsonProperties.Single(e => e.PropertyIsNArray); - - Array? propertyValue = typedJsonPropertyInfo.PropertyInfo.GetValue(tObject) as Array; - ReflectionUtility.CreateOrExpandArray(ref propertyValue, typedJsonPropertyInfo.PropertyType.GetElementType()!, index + 1); - ReflectionUtility.CreateOrExpandArrayElement(propertyValue!, index, (object element) => + foreach (var _ in typedJsonProperties.Where(e => e.PropertyIsNArray)) { - InnerTypedJsonPropertyInfo? insider = GetTypedJsonProperties(element.GetType()) - .SingleOrDefault(p => string.Equals(p.PropertyName.Replace(PROPERTY_WILDCARD_NARRAY_ELEMENT, index.ToString()), jProperty.Name)); - if (insider != null) + typedJsonPropertyInfo = _; + + Array? propertyValue = typedJsonPropertyInfo.PropertyInfo.GetValue(tObject) as Array; + ReflectionUtility.CreateOrExpandArray(ref propertyValue, typedJsonPropertyInfo.PropertyType.GetElementType()!, index + 1); + ReflectionUtility.CreateOrExpandArrayElement(propertyValue!, index, (object element) => { - JsonSerializerOptions tmpOptions = GetClonedJsonSerializerOptions(options, insider.JsonConverter); - object? elementPropertyValue = JsonSerializer.Deserialize(jProperty.Value, insider.PropertyType, tmpOptions)!; - insider.PropertyInfo.SetValue(element, elementPropertyValue); - } + InnerTypedJsonPropertyInfo? insider = GetTypedJsonProperties(element.GetType()) + .SingleOrDefault(p => string.Equals(p.PropertyName.Replace(PROPERTY_WILDCARD_NARRAY_ELEMENT, index.ToString()), jProperty.Name)); + if (insider != null) + { + JsonSerializerOptions tmpOptions = GetClonedJsonSerializerOptions(options, insider.JsonConverter); + object? elementPropertyValue = JsonSerializer.Deserialize(jProperty.Value, insider.PropertyType, tmpOptions)!; + insider.PropertyInfo.SetValue(element, elementPropertyValue); + } - return element; - }); + return element; + }); - typedJsonPropertyInfo.PropertyInfo.SetValue(tObject, propertyValue); + typedJsonPropertyInfo.PropertyInfo.SetValue(tObject, propertyValue); + } } } return tObject; diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV2/Events/VehicleEvent.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV2/Events/VehicleEvent.cs new file mode 100644 index 00000000..c84dbf15 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV2/Events/VehicleEvent.cs @@ -0,0 +1,61 @@ +using System; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV2.Events +{ + /// + /// 表示车主平台通知的模型。 + /// + public class VehicleEvent : WechatTenpayEvent + { + /// + /// 获取或设置子商户号。 + /// + [Newtonsoft.Json.JsonProperty("sub_mch_id")] + [System.Text.Json.Serialization.JsonPropertyName("sub_mch_id")] + public string? SubMerchantId { get; set; } + + /// + /// 获取或设置子商户 AppId。 + /// + [Newtonsoft.Json.JsonProperty("sub_appid")] + [System.Text.Json.Serialization.JsonPropertyName("sub_appid")] + public string? SubAppId { get; set; } + + /// + /// 获取或设置车牌号。 + /// + [Newtonsoft.Json.JsonProperty("plate_number")] + [System.Text.Json.Serialization.JsonPropertyName("plate_number")] + public string PlateNumber { get; set; } = default!; + + /// + /// 获取或设置发起扣费方式。 + /// + [Newtonsoft.Json.JsonProperty("deduct_mode")] + [System.Text.Json.Serialization.JsonPropertyName("deduct_mode")] + public string? DeductMode { get; set; } + + /// + /// 获取或设置变更事件类型。 + /// + [Newtonsoft.Json.JsonProperty("vehicle_event_type")] + [System.Text.Json.Serialization.JsonPropertyName("vehicle_event_type")] + public string EventType { get; set; } = default!; + + /// + /// 获取或设置变更事件信息。 + /// + [Newtonsoft.Json.JsonProperty("vehicle_event_des")] + [System.Text.Json.Serialization.JsonPropertyName("vehicle_event_des")] + public string? EventDescription { get; set; } + + /// + /// 获取或设置变更事件时间。 + /// + [Newtonsoft.Json.JsonProperty("vehicle_event_createtime")] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.PureDigitalTextDateTimeOffsetConverter))] + [System.Text.Json.Serialization.JsonPropertyName("vehicle_event_createtime")] + [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.PureDigitalTextDateTimeOffsetConverter))] + public DateTimeOffset EventTime { get; set; } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV2/Extensions/WechatTenpayClientExecuteVehicleExtensions.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV2/Extensions/WechatTenpayClientExecuteVehicleExtensions.cs new file mode 100644 index 00000000..6ddb1702 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV2/Extensions/WechatTenpayClientExecuteVehicleExtensions.cs @@ -0,0 +1,87 @@ +using System; +using System.Net.Http; +using System.Threading; +using System.Threading.Tasks; +using Flurl.Http; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV2 +{ + public static class WechatTenpayClientExecuteVehicleExtensions + { + /// + /// 异步调用 [POST] /vehicle/pay/notification 接口。 + /// REF: https://pay.weixin.qq.com/wiki/doc/api/vehicle_v2.php?chapter=20_992 + /// + /// + /// + /// + /// + public static async Task ExecuteNotifyVehiclePayAsync(this WechatTenpayClient client, Models.NotifyVehiclePayRequest request, CancellationToken cancellationToken = default) + { + if (client is null) throw new ArgumentNullException(nameof(client)); + if (request is null) throw new ArgumentNullException(nameof(request)); + + IFlurlRequest flurlReq = client + .CreateRequest(request, HttpMethod.Post, "vehicle", "pay", "notification"); + + return await client.SendRequestWithXmlAsync(flurlReq, data: request, cancellationToken: cancellationToken); + } + + /// + /// 异步调用 [POST] /vehicle/pay/payapply 接口。 + /// REF: https://pay.weixin.qq.com/wiki/doc/api/vehicle_v2.php?chapter=20_982 + /// + /// + /// + /// + /// + public static async Task ExecuteApplyVehiclePayAsync(this WechatTenpayClient client, Models.ApplyVehiclePayRequest request, CancellationToken cancellationToken = default) + { + if (client is null) throw new ArgumentNullException(nameof(client)); + if (request is null) throw new ArgumentNullException(nameof(request)); + + IFlurlRequest flurlReq = client + .CreateRequest(request, HttpMethod.Post, "vehicle", "pay", "payapply"); + + return await client.SendRequestWithXmlAsync(flurlReq, data: request, cancellationToken: cancellationToken); + } + + /// + /// 异步调用 [POST] /vehicle/pay/querystate 接口。 + /// REF: https://pay.weixin.qq.com/wiki/doc/api/vehicle_v2.php?chapter=20_93 + /// + /// + /// + /// + /// + public static async Task ExecuteGetVehiclePayStateAsync(this WechatTenpayClient client, Models.GetVehiclePayStateRequest request, CancellationToken cancellationToken = default) + { + if (client is null) throw new ArgumentNullException(nameof(client)); + if (request is null) throw new ArgumentNullException(nameof(request)); + + IFlurlRequest flurlReq = client + .CreateRequest(request, HttpMethod.Post, "vehicle", "pay", "querystate"); + + return await client.SendRequestWithXmlAsync(flurlReq, data: request, cancellationToken: cancellationToken); + } + + /// + /// 异步调用 [POST] /transit/queryorder 接口。 + /// REF: https://pay.weixin.qq.com/wiki/doc/api/vehicle_v2.php?chapter=20_96 + /// + /// + /// + /// + /// + public static async Task ExecuteGetTransitOrderAsync(this WechatTenpayClient client, Models.GetTransitOrderRequest request, CancellationToken cancellationToken = default) + { + if (client is null) throw new ArgumentNullException(nameof(client)); + if (request is null) throw new ArgumentNullException(nameof(request)); + + IFlurlRequest flurlReq = client + .CreateRequest(request, HttpMethod.Post, "transit", "queryorder"); + + return await client.SendRequestWithXmlAsync(flurlReq, data: request, cancellationToken: cancellationToken); + } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV2/Extensions/WechatTenpayClientExecuteVehiclePartnerExtensions.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV2/Extensions/WechatTenpayClientExecuteVehiclePartnerExtensions.cs index 35b6fc97..e4f79b78 100644 --- a/src/SKIT.FlurlHttpClient.Wechat.TenpayV2/Extensions/WechatTenpayClientExecuteVehiclePartnerExtensions.cs +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV2/Extensions/WechatTenpayClientExecuteVehiclePartnerExtensions.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Net.Http; using System.Threading; using System.Threading.Tasks; @@ -64,5 +64,24 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV2 return await client.SendRequestWithXmlAsync(flurlReq, data: request, cancellationToken: cancellationToken); } + + /// + /// 异步调用 [POST] /transit/partnerpay/queryorder 接口。 + /// REF: https://pay.weixin.qq.com/wiki/doc/api/vehicle_v2_sl.php?chapter=20_96 + /// + /// + /// + /// + /// + public static async Task ExecuteGetTransitPartnerOrderAsync(this WechatTenpayClient client, Models.GetTransitPartnerOrderRequest request, CancellationToken cancellationToken = default) + { + if (client is null) throw new ArgumentNullException(nameof(client)); + if (request is null) throw new ArgumentNullException(nameof(request)); + + IFlurlRequest flurlReq = client + .CreateRequest(request, HttpMethod.Post, "transit", "partnerpay", "queryorder"); + + return await client.SendRequestWithXmlAsync(flurlReq, data: request, cancellationToken: cancellationToken); + } } } diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV2/Models/Vehicle/ApplyVehiclePayRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV2/Models/Vehicle/ApplyVehiclePayRequest.cs new file mode 100644 index 00000000..b363030b --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV2/Models/Vehicle/ApplyVehiclePayRequest.cs @@ -0,0 +1,275 @@ +using System; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV2.Models +{ + /// + /// 表示 [POST] /vehicle/pay/payapply 接口的请求。 + /// + public class ApplyVehiclePayRequest : WechatTenpaySignableRequest + { + public static class Types + { + public class Scene + { + public static class Types + { + public class Data : NotifyVehiclePayRequest.Types.Scene.Types.Data + { + /// + /// 获取或设置出场时间。 + /// + [Newtonsoft.Json.JsonProperty("end_time")] + [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.PureDigitalTextNullableDateTimeOffsetConverter))] + public DateTimeOffset? EndTime { get; set; } + + /// + /// 获取或设置支持的扣费方式。 + /// + [Newtonsoft.Json.JsonProperty("support_deduct_mode")] + [System.Text.Json.Serialization.JsonPropertyName("support_deduct_mode")] + public string? SupportDeductMode { get; set; } + + /// + /// 获取或设置发起扣费方式。 + /// + [Newtonsoft.Json.JsonProperty("deduct_mode")] + [System.Text.Json.Serialization.JsonPropertyName("deduct_mode")] + public string? DeductMode { get; set; } + + /// + /// 获取或设置计费时长(单位:秒)。 + /// + [Newtonsoft.Json.JsonProperty("charging_time")] + [System.Text.Json.Serialization.JsonPropertyName("charging_time")] + public int? ChargingDuration { get; set; } + + /// + /// 获取或设置加油站名称。 + /// + [Newtonsoft.Json.JsonProperty("gas_station")] + [System.Text.Json.Serialization.JsonPropertyName("gas_station")] + public string? GasStation { get; set; } + + /// + /// 获取或设置油品标号名。 + /// + [Newtonsoft.Json.JsonProperty("gas_label_name")] + [System.Text.Json.Serialization.JsonPropertyName("gas_label_name")] + public string? GasLabelName { get; set; } + + /// + /// 获取或设置油品类型名称。 + /// + [Newtonsoft.Json.JsonProperty("gas_type")] + [System.Text.Json.Serialization.JsonPropertyName("gas_type")] + public string? GasType { get; set; } + + /// + /// 获取或设置油品标准。 + /// + [Newtonsoft.Json.JsonProperty("gas_standard")] + [System.Text.Json.Serialization.JsonPropertyName("gas_standard")] + public string? GasStandard { get; set; } + + /// + /// 获取或设置油量(单位:毫升)。 + /// + [Newtonsoft.Json.JsonProperty("gas_amount")] + [System.Text.Json.Serialization.JsonPropertyName("gas_amount")] + public int? GasAmount { get; set; } + + /// + /// 获取或设置油枪号。 + /// + [Newtonsoft.Json.JsonProperty("gas_gun_no")] + [System.Text.Json.Serialization.JsonPropertyName("gas_gun_no")] + public int? GasGunNumber { get; set; } + + /// + /// 获取或设置入口名称。 + /// + [Newtonsoft.Json.JsonProperty("entrance_name")] + [System.Text.Json.Serialization.JsonPropertyName("entrance_name")] + public string? EntranceName { get; set; } + + /// + /// 获取或设置出口名称。 + /// + [Newtonsoft.Json.JsonProperty("exit_name")] + [System.Text.Json.Serialization.JsonPropertyName("exit_name")] + public string? ExitName { get; set; } + + /// + /// 获取或设置核载人数。 + /// + [Newtonsoft.Json.JsonProperty("carrying_capacity")] + [System.Text.Json.Serialization.JsonPropertyName("carrying_capacity")] + public int? CarryingCapacity { get; set; } + + /// + /// 获取或设置核载区间字符串。 + /// + [Newtonsoft.Json.JsonProperty("carrying_range")] + [System.Text.Json.Serialization.JsonPropertyName("carrying_range")] + public string? CarryingRangeString { get; set; } + + /// + /// 获取或设置通道类型。 + /// + [Newtonsoft.Json.JsonProperty("channel_type")] + [System.Text.Json.Serialization.JsonPropertyName("channel_type")] + public string? ChannelType { get; set; } + } + } + + /// + /// 获取或设置场景信息。 + /// + [Newtonsoft.Json.JsonProperty("scene_info")] + [System.Text.Json.Serialization.JsonPropertyName("scene_info")] + public Types.Data Data { get; set; } = new Types.Data(); + } + } + + internal static class Converters + { + internal class RequestPropertySceneNewtonsoftJsonConverter : Newtonsoft.Json.Converters.TextualObjectInJsonFormatConverterBase + { + } + + internal class RequestPropertySceneSystemTextJsonConverter : System.Text.Json.Converters.TextualObjectInJsonFormatConverterBase + { + } + } + + /// + /// 获取或设置接口版本号。 + /// 默认值:3.0 + /// + [Newtonsoft.Json.JsonProperty("version")] + [System.Text.Json.Serialization.JsonPropertyName("version")] + public string Version { get; set; } = "3.0"; + + /// + /// + /// + [Newtonsoft.Json.JsonProperty("mch_id")] + [System.Text.Json.Serialization.JsonPropertyName("mch_id")] + public override string? MerchantId { get; set; } + + /// + /// + /// + [Newtonsoft.Json.JsonProperty("appid")] + [System.Text.Json.Serialization.JsonPropertyName("appid")] + public override string? AppId { get; set; } + + /// + /// + /// 默认值: + /// + [Newtonsoft.Json.JsonProperty("sign_type")] + [System.Text.Json.Serialization.JsonPropertyName("sign_type")] +#pragma warning disable CS8765 + public override string SignType { get; set; } = Constants.SignTypes.HMAC_SHA256; +#pragma warning restore CS8765 + + /// + /// 获取或设置商品描述。 + /// + [Newtonsoft.Json.JsonProperty("body")] + [System.Text.Json.Serialization.JsonPropertyName("body")] + public string Body { get; set; } = string.Empty; + + /// + /// 获取或设置商户订单号。 + /// + [Newtonsoft.Json.JsonProperty("out_trade_no")] + [System.Text.Json.Serialization.JsonPropertyName("out_trade_no")] + public string OutTradeNumber { get; set; } = string.Empty; + + /// + /// 获取或设置订单金额(单位:分)。 + /// + [Newtonsoft.Json.JsonProperty("total_fee")] + [System.Text.Json.Serialization.JsonPropertyName("total_fee")] + public int TotalFee { get; set; } + + /// + /// 获取或设置货币类型。 + /// + [Newtonsoft.Json.JsonProperty("fee_type")] + [System.Text.Json.Serialization.JsonPropertyName("fee_type")] + public string? FeeType { get; set; } + + /// + /// 获取或设置用户的 OpenId。 + /// + [Newtonsoft.Json.JsonProperty("openid")] + [System.Text.Json.Serialization.JsonPropertyName("openid")] + public string? OpenId { get; set; } + + /// + /// 获取或设置交易类型。 + /// 默认值:PAP + /// + [Newtonsoft.Json.JsonProperty("trade_type")] + [System.Text.Json.Serialization.JsonPropertyName("trade_type")] + public string TradeType { get; set; } = "PAP"; + + /// + /// 获取或设置交易场景值。 + /// + [Newtonsoft.Json.JsonProperty("trade_scene")] + [System.Text.Json.Serialization.JsonPropertyName("trade_scene")] + public string TradeScene { get; set; } = string.Empty; + + /// + /// 获取或设置附加数据。 + /// + [Newtonsoft.Json.JsonProperty("attach")] + [System.Text.Json.Serialization.JsonPropertyName("attach")] + public string? Attachment { get; set; } + + /// + /// 获取或设置用户终端 IP。 + /// + [Newtonsoft.Json.JsonProperty("spbill_create_ip")] + [System.Text.Json.Serialization.JsonPropertyName("spbill_create_ip")] + public string ClientIp { get; set; } = string.Empty; + + /// + /// 获取或设置订单优惠标记。 + /// + [Newtonsoft.Json.JsonProperty("goods_tag")] + [System.Text.Json.Serialization.JsonPropertyName("goods_tag")] + public string? GoodsTag { get; set; } + + /// + /// 获取或设置通知地址。 + /// + [Newtonsoft.Json.JsonProperty("notify_url")] + [System.Text.Json.Serialization.JsonPropertyName("notify_url")] + public string NotifyUrl { get; set; } = string.Empty; + + /// + /// 获取或设置场景信息。 + /// + [Newtonsoft.Json.JsonProperty("scene_info")] + [Newtonsoft.Json.JsonConverter(typeof(Converters.RequestPropertySceneNewtonsoftJsonConverter))] + [System.Text.Json.Serialization.JsonPropertyName("scene_info")] + [System.Text.Json.Serialization.JsonConverter(typeof(Converters.RequestPropertySceneSystemTextJsonConverter))] + public Types.Scene? Scene { get; set; } + + /// + /// 获取或设置是否分账。 + /// + [Newtonsoft.Json.JsonProperty("profit_sharing")] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.YesOrNoNullableBooleanConverter))] + [System.Text.Json.Serialization.JsonPropertyName("profit_sharing")] + [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.YesOrNoNullableBooleanConverter))] + public bool? IsProfitSharing { get; set; } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV2/Models/Vehicle/ApplyVehiclePayResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV2/Models/Vehicle/ApplyVehiclePayResponse.cs new file mode 100644 index 00000000..24ea63ca --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV2/Models/Vehicle/ApplyVehiclePayResponse.cs @@ -0,0 +1,37 @@ +namespace SKIT.FlurlHttpClient.Wechat.TenpayV2.Models +{ + /// + /// 表示 [POST] /vehicle/pay/payapply 接口的响应。 + /// + public class ApplyVehiclePayResponse : WechatTenpaySignableResponse + { + /// + /// + /// + [Newtonsoft.Json.JsonProperty("mch_id")] + [System.Text.Json.Serialization.JsonPropertyName("mch_id")] +#pragma warning disable CS8618 +#pragma warning disable CS8765 + public override string MerchantId { get; set; } +#pragma warning restore CS8765 +#pragma warning restore CS8618 + + /// + /// + /// + [Newtonsoft.Json.JsonProperty("appid")] + [System.Text.Json.Serialization.JsonPropertyName("appid")] +#pragma warning disable CS8618 +#pragma warning disable CS8765 + public override string AppId { get; set; } +#pragma warning restore CS8765 +#pragma warning restore CS8618 + + /// + /// 获取或设置终端设备号。 + /// + [Newtonsoft.Json.JsonProperty("device_info")] + [System.Text.Json.Serialization.JsonPropertyName("device_info")] + public string? DeviceInfo { get; set; } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV2/Models/Vehicle/GetTransitOrderRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV2/Models/Vehicle/GetTransitOrderRequest.cs new file mode 100644 index 00000000..6da300b5 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV2/Models/Vehicle/GetTransitOrderRequest.cs @@ -0,0 +1,46 @@ +namespace SKIT.FlurlHttpClient.Wechat.TenpayV2.Models +{ + /// + /// 表示 [POST] /transit/queryorder 接口的请求。 + /// + public class GetTransitOrderRequest : WechatTenpaySignableRequest + { + /// + /// + /// + [Newtonsoft.Json.JsonProperty("mch_id")] + [System.Text.Json.Serialization.JsonPropertyName("mch_id")] + public override string? MerchantId { get; set; } + + /// + /// + /// + [Newtonsoft.Json.JsonProperty("appid")] + [System.Text.Json.Serialization.JsonPropertyName("appid")] + public override string? AppId { get; set; } + + /// + /// + /// 默认值: + /// + [Newtonsoft.Json.JsonProperty("sign_type")] + [System.Text.Json.Serialization.JsonPropertyName("sign_type")] +#pragma warning disable CS8765 + public override string SignType { get; set; } = Constants.SignTypes.HMAC_SHA256; +#pragma warning restore CS8765 + + /// + /// 获取或设置商户订单号。与字段 二选一。 + /// + [Newtonsoft.Json.JsonProperty("out_trade_no")] + [System.Text.Json.Serialization.JsonPropertyName("out_trade_no")] + public string? OutTradeNumber { get; set; } + + /// + /// 获取或设置微信订单号。与字段 二选一。 + /// + [Newtonsoft.Json.JsonProperty("transaction_id")] + [System.Text.Json.Serialization.JsonPropertyName("transaction_id")] + public string? TransactionId { get; set; } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV2/Models/Vehicle/GetTransitOrderResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV2/Models/Vehicle/GetTransitOrderResponse.cs new file mode 100644 index 00000000..fd358a95 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV2/Models/Vehicle/GetTransitOrderResponse.cs @@ -0,0 +1,194 @@ +using System; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV2.Models +{ + /// + /// 表示 [POST] /transit/queryorder 接口的响应。 + /// + [Newtonsoft.Json.JsonConverter(typeof(Converters.ResponseClassNewtonsoftJsonConverter))] + [System.Text.Json.Serialization.JsonConverter(typeof(Converters.ResponseClassSystemTextJsonConverter))] + public class GetTransitOrderResponse : WechatTenpaySignableResponse + { + public static class Types + { + public class Coupon : GetPayOrderResponse.Types.Coupon + { + } + } + + internal static class Converters + { + internal class ResponseClassNewtonsoftJsonConverter : Newtonsoft.Json.Converters.FlattenNArrayObjectConverterBase + { + } + + internal class ResponseClassSystemTextJsonConverter : System.Text.Json.Converters.FlattenNArrayObjectConverterBase + { + } + } + + /// + /// + /// + [Newtonsoft.Json.JsonProperty("mch_id")] + [System.Text.Json.Serialization.JsonPropertyName("mch_id")] +#pragma warning disable CS8618 +#pragma warning disable CS8765 + public override string MerchantId { get; set; } +#pragma warning restore CS8765 +#pragma warning restore CS8618 + + /// + /// + /// + [Newtonsoft.Json.JsonProperty("appid")] + [System.Text.Json.Serialization.JsonPropertyName("appid")] +#pragma warning disable CS8618 +#pragma warning disable CS8765 + public override string AppId { get; set; } +#pragma warning restore CS8765 +#pragma warning restore CS8618 + + /// + /// 获取或设置终端设备号。 + /// + [Newtonsoft.Json.JsonProperty("device_info")] + [System.Text.Json.Serialization.JsonPropertyName("device_info")] + public string? DeviceInfo { get; set; } + + /// + /// 获取或设置用户唯一标识。 + /// + [Newtonsoft.Json.JsonProperty("openid")] + [System.Text.Json.Serialization.JsonPropertyName("openid")] + public string OpenId { get; set; } = default!; + + /// + /// 获取或设置用户是否订阅该公众号标识。 + /// + [Newtonsoft.Json.JsonProperty("is_subscribe")] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.YesOrNoNullableBooleanConverter))] + [System.Text.Json.Serialization.JsonPropertyName("is_subscribe")] + [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.YesOrNoNullableBooleanConverter))] + public bool? IsSubscribed { get; set; } + + /// + /// 获取或设置交易状态。 + /// + [Newtonsoft.Json.JsonProperty("trade_state")] + [System.Text.Json.Serialization.JsonPropertyName("trade_state")] + public string TradeState { get; set; } = default!; + + /// + /// 获取或设置交易状态描述。 + /// + [Newtonsoft.Json.JsonProperty("trade_state_desc")] + [System.Text.Json.Serialization.JsonPropertyName("trade_state_desc")] + public string TradeStateDescription { get; set; } = default!; + + /// + /// 获取或设置交易类型。 + /// + [Newtonsoft.Json.JsonProperty("trade_type")] + [System.Text.Json.Serialization.JsonPropertyName("trade_type")] + public string TradeType { get; set; } = default!; + + /// + /// 获取或设置付款银行。 + /// + [Newtonsoft.Json.JsonProperty("bank_type")] + [System.Text.Json.Serialization.JsonPropertyName("bank_type")] + public string BankType { get; set; } = default!; + + /// + /// 获取或设置订单金额(单位:分)。 + /// + [Newtonsoft.Json.JsonProperty("total_fee")] + [System.Text.Json.Serialization.JsonPropertyName("total_fee")] + [System.Text.Json.Serialization.JsonNumberHandling(System.Text.Json.Serialization.JsonNumberHandling.AllowReadingFromString)] + public int TotalFee { get; set; } + + /// + /// 获取或设置货币类型。 + /// + [Newtonsoft.Json.JsonProperty("fee_type")] + [System.Text.Json.Serialization.JsonPropertyName("fee_type")] + public string? FeeType { get; set; } + + /// + /// 获取或设置应结订单金额(单位:分)。 + /// + [Newtonsoft.Json.JsonProperty("settlement_total_fee")] + [System.Text.Json.Serialization.JsonPropertyName("settlement_total_fee")] + [System.Text.Json.Serialization.JsonNumberHandling(System.Text.Json.Serialization.JsonNumberHandling.AllowReadingFromString)] + public int? SettlementFee { get; set; } + + /// + /// 获取或设置代金券金额。 + /// + [Newtonsoft.Json.JsonProperty("coupon_fee")] + [System.Text.Json.Serialization.JsonPropertyName("coupon_fee")] + [System.Text.Json.Serialization.JsonNumberHandling(System.Text.Json.Serialization.JsonNumberHandling.AllowReadingFromString)] + public int? CouponFee { get; set; } + + /// + /// 获取或设置代金券使用数量。 + /// + [Newtonsoft.Json.JsonProperty("coupon_count")] + [System.Text.Json.Serialization.JsonPropertyName("coupon_count")] + [System.Text.Json.Serialization.JsonNumberHandling(System.Text.Json.Serialization.JsonNumberHandling.AllowReadingFromString)] + public int? CouponCount { get; set; } + + /// + /// 获取或设置代金券使用列表。 + /// + [Newtonsoft.Json.JsonProperty(Newtonsoft.Json.Converters.FlattenNArrayObjectConverterBase.PROPERTY_NAME_NARRAY)] + [System.Text.Json.Serialization.JsonPropertyName(System.Text.Json.Converters.FlattenNArrayObjectConverterBase.PROPERTY_NAME_NARRAY)] + public Types.Coupon[]? CouponList { get; set; } + + /// + /// 获取或设置现金支付金额(单位:分)。 + /// + [Newtonsoft.Json.JsonProperty("cash_fee")] + [System.Text.Json.Serialization.JsonPropertyName("cash_fee")] + [System.Text.Json.Serialization.JsonNumberHandling(System.Text.Json.Serialization.JsonNumberHandling.AllowReadingFromString)] + public int? CashFee { get; set; } + + /// + /// 获取或设置现金支付货币类型。 + /// + [Newtonsoft.Json.JsonProperty("cash_fee_type")] + [System.Text.Json.Serialization.JsonPropertyName("cash_fee_type")] + public string? CashFeeType { get; set; } + + /// + /// 获取或设置商户订单号。 + /// + [Newtonsoft.Json.JsonProperty("out_trade_no")] + [System.Text.Json.Serialization.JsonPropertyName("out_trade_no")] + public string OutTradeNumber { get; set; } = default!; + + /// + /// 获取或设置微信支付订单号。 + /// + [Newtonsoft.Json.JsonProperty("transaction_id")] + [System.Text.Json.Serialization.JsonPropertyName("transaction_id")] + public string TransactionId { get; set; } = default!; + + /// + /// 获取或设置附加数据。 + /// + [Newtonsoft.Json.JsonProperty("attach")] + [System.Text.Json.Serialization.JsonPropertyName("attach")] + public string? Attachment { get; set; } + + /// + /// 获取或设置支付完成时间。 + /// + [Newtonsoft.Json.JsonProperty("time_end")] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.PureDigitalTextNullableDateTimeOffsetConverter))] + [System.Text.Json.Serialization.JsonPropertyName("time_end")] + [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.PureDigitalTextNullableDateTimeOffsetConverter))] + public DateTimeOffset? EndTime { get; set; } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV2/Models/Vehicle/GetVehiclePayStateRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV2/Models/Vehicle/GetVehiclePayStateRequest.cs new file mode 100644 index 00000000..f466ec81 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV2/Models/Vehicle/GetVehiclePayStateRequest.cs @@ -0,0 +1,68 @@ +namespace SKIT.FlurlHttpClient.Wechat.TenpayV2.Models +{ + /// + /// 表示 [POST] /vehicle/pay/querystate 接口的请求。 + /// + public class GetVehiclePayStateRequest : WechatTenpaySignableRequest + { + /// + /// 获取或设置接口版本号。 + /// 默认值:3.0 + /// + [Newtonsoft.Json.JsonProperty("version")] + [System.Text.Json.Serialization.JsonPropertyName("version")] + public string Version { get; set; } = "3.0"; + + /// + /// + /// + [Newtonsoft.Json.JsonProperty("mch_id")] + [System.Text.Json.Serialization.JsonPropertyName("mch_id")] + public override string? MerchantId { get; set; } + + /// + /// + /// + [Newtonsoft.Json.JsonProperty("appid")] + [System.Text.Json.Serialization.JsonPropertyName("appid")] + public override string? AppId { get; set; } + + /// + /// + /// 默认值: + /// + [Newtonsoft.Json.JsonProperty("sign_type")] + [System.Text.Json.Serialization.JsonPropertyName("sign_type")] +#pragma warning disable CS8765 + public override string SignType { get; set; } = Constants.SignTypes.HMAC_SHA256; +#pragma warning restore CS8765 + + /// + /// 获取或设置交易场景值。 + /// + [Newtonsoft.Json.JsonProperty("trade_scene")] + [System.Text.Json.Serialization.JsonPropertyName("trade_scene")] + public string TradeScene { get; set; } = string.Empty; + + /// + /// 获取或设置跳转场景。 + /// + [Newtonsoft.Json.JsonProperty("jump_scene")] + [System.Text.Json.Serialization.JsonPropertyName("jump_scene")] + public string? JumpScene { get; set; } + + /// + /// 获取或设置用户的 OpenId。 + /// + [Newtonsoft.Json.JsonProperty("openid")] + [System.Text.Json.Serialization.JsonPropertyName("openid")] + public string? OpenId { get; set; } + + /// + /// 获取或设置车牌号。 + /// + [Newtonsoft.Json.JsonProperty("plate_number")] + [System.Text.Json.Serialization.JsonPropertyName("plate_number")] + public string? PlateNumber { get; set; } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV2/Models/Vehicle/GetVehiclePayStateResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV2/Models/Vehicle/GetVehiclePayStateResponse.cs new file mode 100644 index 00000000..4238d376 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV2/Models/Vehicle/GetVehiclePayStateResponse.cs @@ -0,0 +1,118 @@ +namespace SKIT.FlurlHttpClient.Wechat.TenpayV2.Models +{ + /// + /// 表示 [POST] /vehicle/pay/querystate 接口的响应。 + /// + public class GetVehiclePayStateResponse : WechatTenpaySignableResponse + { + public static class Types + { + public class PlateNumberInfo + { + public static class Types + { + public class Data + { + /// + /// 获取或设置车牌号。 + /// + [Newtonsoft.Json.JsonProperty("plate_number")] + [System.Text.Json.Serialization.JsonPropertyName("plate_number")] + public string PlateNumber { get; set; } = default!; + + /// + /// 获取或设置车牌通道标识。 + /// + [Newtonsoft.Json.JsonProperty("channel_type")] + [System.Text.Json.Serialization.JsonPropertyName("channel_type")] + public string? ChannelType { get; set; } + + /// + /// 获取或设置常用车牌标志。 + /// + [Newtonsoft.Json.JsonProperty("common_use_flag")] + [System.Text.Json.Serialization.JsonPropertyName("common_use_flag")] + public string? CommonUseFlag { get; set; } + } + } + + /// + /// 获取或设置车牌号信息。 + /// + [Newtonsoft.Json.JsonProperty("plate_number_info")] + [System.Text.Json.Serialization.JsonPropertyName("plate_number_info")] + public Types.Data[] Data { get; set; } = default!; + } + } + + internal static class Converters + { + internal class ResponsePropertyPlateNumberInfoNewtonsoftJsonConverter : Newtonsoft.Json.Converters.TextualObjectInJsonFormatConverterBase + { + } + + internal class ResponsePropertyPlateNumberInfoSystemTextJsonConverter : System.Text.Json.Converters.TextualObjectInJsonFormatConverterBase + { + } + } + + /// + /// + /// + [Newtonsoft.Json.JsonProperty("mch_id")] + [System.Text.Json.Serialization.JsonPropertyName("mch_id")] +#pragma warning disable CS8618 +#pragma warning disable CS8765 + public override string MerchantId { get; set; } +#pragma warning restore CS8765 +#pragma warning restore CS8618 + + /// + /// + /// + [Newtonsoft.Json.JsonProperty("appid")] + [System.Text.Json.Serialization.JsonPropertyName("appid")] +#pragma warning disable CS8618 +#pragma warning disable CS8765 + public override string AppId { get; set; } +#pragma warning restore CS8765 +#pragma warning restore CS8618 + + /// + /// 获取或设置用户状态。 + /// + [Newtonsoft.Json.JsonProperty("user_state")] + [System.Text.Json.Serialization.JsonPropertyName("user_state")] + public string UserState { get; set; } = default!; + + /// + /// 获取或设置发起扣费方式。 + /// + [Newtonsoft.Json.JsonProperty("deduct_mode")] + [System.Text.Json.Serialization.JsonPropertyName("deduct_mode")] + public string? DeductMode { get; set; } + + /// + /// 获取或设置用户的 OpenId。 + /// + [Newtonsoft.Json.JsonProperty("openid")] + [System.Text.Json.Serialization.JsonPropertyName("openid")] + public string? OpenId { get; set; } + + /// + /// 获取或设置跳转路径。 + /// + [Newtonsoft.Json.JsonProperty("path")] + [System.Text.Json.Serialization.JsonPropertyName("path")] + public string? JumpPath { get; set; } + + /// + /// 获取或设置车牌号信息。 + /// + [Newtonsoft.Json.JsonProperty("plate_number_info")] + [Newtonsoft.Json.JsonConverter(typeof(Converters.ResponsePropertyPlateNumberInfoNewtonsoftJsonConverter))] + [System.Text.Json.Serialization.JsonPropertyName("plate_number_info")] + [System.Text.Json.Serialization.JsonConverter(typeof(Converters.ResponsePropertyPlateNumberInfoSystemTextJsonConverter))] + public Types.PlateNumberInfo? PlateNumberInfo { get; set; } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV2/Models/Vehicle/NotifyVehiclePayRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV2/Models/Vehicle/NotifyVehiclePayRequest.cs new file mode 100644 index 00000000..c59d33b8 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV2/Models/Vehicle/NotifyVehiclePayRequest.cs @@ -0,0 +1,153 @@ +using System; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV2.Models +{ + /// + /// 表示 [POST] /vehicle/pay/notification 接口的请求。 + /// + public class NotifyVehiclePayRequest : WechatTenpaySignableRequest + { + public static class Types + { + public class Scene + { + public static class Types + { + public class Data + { + /// + /// 获取或设置入场时间。 + /// + [Newtonsoft.Json.JsonProperty("start_time")] + [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.PureDigitalTextDateTimeOffsetConverter))] + public DateTimeOffset StartTime { get; set; } + + /// + /// 获取或设置车牌号。 + /// + [Newtonsoft.Json.JsonProperty("plate_number")] + [System.Text.Json.Serialization.JsonPropertyName("plate_number")] + public string? PlateNumber { get; set; } + + /// + /// 获取或设置车辆类型。 + /// + [Newtonsoft.Json.JsonProperty("car_type")] + [System.Text.Json.Serialization.JsonPropertyName("car_type")] + public string? CarType { get; set; } + + /// + /// 获取或设置停车场名称。 + /// + [Newtonsoft.Json.JsonProperty("parking_name")] + [System.Text.Json.Serialization.JsonPropertyName("parking_name")] + public string? ParkingName { get; set; } + + /// + /// 获取或设置车位编号。 + /// + [Newtonsoft.Json.JsonProperty("space_number")] + [System.Text.Json.Serialization.JsonPropertyName("space_number")] + public string? SpaceNumber { get; set; } + + /// + /// 获取或设置免费时长(单位:秒)。 + /// + [Newtonsoft.Json.JsonProperty("free_time")] + [System.Text.Json.Serialization.JsonPropertyName("free_time")] + public int? FreeDuration { get; set; } + + /// + /// 获取或设置用户的 OpenId。 + /// + [Newtonsoft.Json.JsonProperty("openid")] + [System.Text.Json.Serialization.JsonPropertyName("openid")] + public string? OpenId { get; set; } + + /// + /// 获取或设置用户在子商户下的 OpenId。 + /// + [Newtonsoft.Json.JsonProperty("sub_openid")] + [System.Text.Json.Serialization.JsonPropertyName("sub_openid")] + public string? SubOpenId { get; set; } + + /// + /// 获取或设置通知地址。 + /// + [Newtonsoft.Json.JsonProperty("notify_url")] + [System.Text.Json.Serialization.JsonPropertyName("notify_url")] + public string? NotifyUrl { get; set; } + } + } + + /// + /// 获取或设置停车信息。 + /// + [Newtonsoft.Json.JsonProperty("scene_info")] + [System.Text.Json.Serialization.JsonPropertyName("scene_info")] + public Types.Data Data { get; set; } = new Types.Data(); + } + } + + internal static class Converters + { + internal class RequestPropertySceneNewtonsoftJsonConverter : Newtonsoft.Json.Converters.TextualObjectInJsonFormatConverterBase + { + } + + internal class RequestPropertySceneSystemTextJsonConverter : System.Text.Json.Converters.TextualObjectInJsonFormatConverterBase + { + } + } + + /// + /// 获取或设置接口版本号。 + /// 默认值:3.0 + /// + [Newtonsoft.Json.JsonProperty("version")] + [System.Text.Json.Serialization.JsonPropertyName("version")] + public string Version { get; set; } = "3.0"; + + /// + /// + /// + [Newtonsoft.Json.JsonProperty("mch_id")] + [System.Text.Json.Serialization.JsonPropertyName("mch_id")] + public override string? MerchantId { get; set; } + + /// + /// + /// + [Newtonsoft.Json.JsonProperty("appid")] + [System.Text.Json.Serialization.JsonPropertyName("appid")] + public override string? AppId { get; set; } + + /// + /// + /// 默认值: + /// + [Newtonsoft.Json.JsonProperty("sign_type")] + [System.Text.Json.Serialization.JsonPropertyName("sign_type")] +#pragma warning disable CS8765 + public override string SignType { get; set; } = Constants.SignTypes.HMAC_SHA256; +#pragma warning restore CS8765 + + /// + /// 获取或设置交易场景值。 + /// + [Newtonsoft.Json.JsonProperty("trade_scene")] + [System.Text.Json.Serialization.JsonPropertyName("trade_scene")] + public string TradeScene { get; set; } = string.Empty; + + /// + /// 获取或设置场景信息。 + /// + [Newtonsoft.Json.JsonProperty("scene_info")] + [Newtonsoft.Json.JsonConverter(typeof(Converters.RequestPropertySceneNewtonsoftJsonConverter))] + [System.Text.Json.Serialization.JsonPropertyName("scene_info")] + [System.Text.Json.Serialization.JsonConverter(typeof(Converters.RequestPropertySceneSystemTextJsonConverter))] + public Types.Scene? Scene { get; set; } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV2/Models/Vehicle/NotifyVehiclePayResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV2/Models/Vehicle/NotifyVehiclePayResponse.cs new file mode 100644 index 00000000..2970e03b --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV2/Models/Vehicle/NotifyVehiclePayResponse.cs @@ -0,0 +1,44 @@ +namespace SKIT.FlurlHttpClient.Wechat.TenpayV2.Models +{ + /// + /// 表示 [POST] /vehicle/pay/notification 接口的响应。 + /// + public class NotifyVehiclePayResponse : WechatTenpaySignableResponse + { + /// + /// + /// + [Newtonsoft.Json.JsonProperty("mch_id")] + [System.Text.Json.Serialization.JsonPropertyName("mch_id")] +#pragma warning disable CS8618 +#pragma warning disable CS8765 + public override string MerchantId { get; set; } +#pragma warning restore CS8765 +#pragma warning restore CS8618 + + /// + /// + /// + [Newtonsoft.Json.JsonProperty("appid")] + [System.Text.Json.Serialization.JsonPropertyName("appid")] +#pragma warning disable CS8618 +#pragma warning disable CS8765 + public override string AppId { get; set; } +#pragma warning restore CS8765 +#pragma warning restore CS8618 + + /// + /// 获取或设置用户状态。 + /// + [Newtonsoft.Json.JsonProperty("user_state")] + [System.Text.Json.Serialization.JsonPropertyName("user_state")] + public string UserState { get; set; } = default!; + + /// + /// 获取或设置发起扣费方式。 + /// + [Newtonsoft.Json.JsonProperty("deduct_mode")] + [System.Text.Json.Serialization.JsonPropertyName("deduct_mode")] + public string? DeductMode { get; set; } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV2/Models/VehiclePartner/ApplyVehiclePartnerPayRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV2/Models/VehiclePartner/ApplyVehiclePartnerPayRequest.cs index ca08970d..47f69a4a 100644 --- a/src/SKIT.FlurlHttpClient.Wechat.TenpayV2/Models/VehiclePartner/ApplyVehiclePartnerPayRequest.cs +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV2/Models/VehiclePartner/ApplyVehiclePartnerPayRequest.cs @@ -1,126 +1,18 @@ -using System; - namespace SKIT.FlurlHttpClient.Wechat.TenpayV2.Models { /// /// 表示 [POST] /vehicle/partnerpay/payapply 接口的请求。 /// - public class ApplyVehiclePartnerPayRequest : WechatTenpaySignableRequest + public class ApplyVehiclePartnerPayRequest : ApplyVehiclePayRequest { - public static class Types + public static new class Types { - public class Scene + public class Scene : ApplyVehiclePayRequest.Types.Scene { - public static class Types + public static new class Types { - public class Data : NotifyVehiclePartnerPayRequest.Types.Scene.Types.Data + public class Data : ApplyVehiclePayRequest.Types.Scene.Types.Data { - /// - /// 获取或设置出场时间。 - /// - [Newtonsoft.Json.JsonProperty("end_time")] - [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.PureDigitalTextNullableDateTimeOffsetConverter))] - public DateTimeOffset? EndTime { get; set; } - - /// - /// 获取或设置支持的扣费方式。 - /// - [Newtonsoft.Json.JsonProperty("support_deduct_mode")] - [System.Text.Json.Serialization.JsonPropertyName("support_deduct_mode")] - public string? SupportDeductMode { get; set; } - - /// - /// 获取或设置发起扣费方式。 - /// - [Newtonsoft.Json.JsonProperty("deduct_mode")] - [System.Text.Json.Serialization.JsonPropertyName("deduct_mode")] - public string? DeductMode { get; set; } - - /// - /// 获取或设置计费时长(单位:秒)。 - /// - [Newtonsoft.Json.JsonProperty("charging_time")] - [System.Text.Json.Serialization.JsonPropertyName("charging_time")] - public int? ChargingDuration { get; set; } - - /// - /// 获取或设置加油站名称。 - /// - [Newtonsoft.Json.JsonProperty("gas_station")] - [System.Text.Json.Serialization.JsonPropertyName("gas_station")] - public string? GasStation { get; set; } - - /// - /// 获取或设置油品标号名。 - /// - [Newtonsoft.Json.JsonProperty("gas_label_name")] - [System.Text.Json.Serialization.JsonPropertyName("gas_label_name")] - public string? GasLabelName { get; set; } - - /// - /// 获取或设置油品类型名称。 - /// - [Newtonsoft.Json.JsonProperty("gas_type")] - [System.Text.Json.Serialization.JsonPropertyName("gas_type")] - public string? GasType { get; set; } - - /// - /// 获取或设置油品标准。 - /// - [Newtonsoft.Json.JsonProperty("gas_standard")] - [System.Text.Json.Serialization.JsonPropertyName("gas_standard")] - public string? GasStandard { get; set; } - - /// - /// 获取或设置油量(单位:毫升)。 - /// - [Newtonsoft.Json.JsonProperty("gas_amount")] - [System.Text.Json.Serialization.JsonPropertyName("gas_amount")] - public int? GasAmount { get; set; } - - /// - /// 获取或设置油枪号。 - /// - [Newtonsoft.Json.JsonProperty("gas_gun_no")] - [System.Text.Json.Serialization.JsonPropertyName("gas_gun_no")] - public int? GasGunNumber { get; set; } - - /// - /// 获取或设置入口名称。 - /// - [Newtonsoft.Json.JsonProperty("entrance_name")] - [System.Text.Json.Serialization.JsonPropertyName("entrance_name")] - public string? EntranceName { get; set; } - - /// - /// 获取或设置出口名称。 - /// - [Newtonsoft.Json.JsonProperty("exit_name")] - [System.Text.Json.Serialization.JsonPropertyName("exit_name")] - public string? ExitName { get; set; } - - /// - /// 获取或设置核载人数。 - /// - [Newtonsoft.Json.JsonProperty("carrying_capacity")] - [System.Text.Json.Serialization.JsonPropertyName("carrying_capacity")] - public int? CarryingCapacity { get; set; } - - /// - /// 获取或设置核载区间字符串。 - /// - [Newtonsoft.Json.JsonProperty("carrying_range")] - [System.Text.Json.Serialization.JsonPropertyName("carrying_range")] - public string? CarryingRangeString { get; set; } - - /// - /// 获取或设置通道类型。 - /// - [Newtonsoft.Json.JsonProperty("channel_type")] - [System.Text.Json.Serialization.JsonPropertyName("channel_type")] - public string? ChannelType { get; set; } } } @@ -129,11 +21,11 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV2.Models /// [Newtonsoft.Json.JsonProperty("scene_info")] [System.Text.Json.Serialization.JsonPropertyName("scene_info")] - public Types.Data Data { get; set; } = new Types.Data(); + public new Types.Data Data { get; set; } = new Types.Data(); } } - internal static class Converters + internal static new class Converters { internal class RequestPropertySceneNewtonsoftJsonConverter : Newtonsoft.Json.Converters.TextualObjectInJsonFormatConverterBase { @@ -144,20 +36,6 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV2.Models } } - /// - /// - /// - [Newtonsoft.Json.JsonProperty("mch_id")] - [System.Text.Json.Serialization.JsonPropertyName("mch_id")] - public override string? MerchantId { get; set; } - - /// - /// - /// - [Newtonsoft.Json.JsonProperty("appid")] - [System.Text.Json.Serialization.JsonPropertyName("appid")] - public override string? AppId { get; set; } - /// /// 获取或设置子商户号。 /// @@ -172,92 +50,6 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV2.Models [System.Text.Json.Serialization.JsonPropertyName("sub_appid")] public string? SubAppId { get; set; } - /// - /// 获取或设置接口版本号。 - /// 默认值:3.0 - /// - [Newtonsoft.Json.JsonProperty("version")] - [System.Text.Json.Serialization.JsonPropertyName("version")] - public string Version { get; set; } = "3.0"; - - /// - /// 获取或设置商品描述。 - /// - [Newtonsoft.Json.JsonProperty("body")] - [System.Text.Json.Serialization.JsonPropertyName("body")] - public string Body { get; set; } = string.Empty; - - /// - /// 获取或设置商户订单号。 - /// - [Newtonsoft.Json.JsonProperty("out_trade_no")] - [System.Text.Json.Serialization.JsonPropertyName("out_trade_no")] - public string OutTradeNumber { get; set; } = string.Empty; - - /// - /// 获取或设置订单金额(单位:分)。 - /// - [Newtonsoft.Json.JsonProperty("total_fee")] - [System.Text.Json.Serialization.JsonPropertyName("total_fee")] - public int TotalFee { get; set; } - - /// - /// 获取或设置货币类型。 - /// - [Newtonsoft.Json.JsonProperty("fee_type")] - [System.Text.Json.Serialization.JsonPropertyName("fee_type")] - public string? FeeType { get; set; } - - /// - /// 获取或设置用户的 OpenId。 - /// - [Newtonsoft.Json.JsonProperty("openid")] - [System.Text.Json.Serialization.JsonPropertyName("openid")] - public string? OpenId { get; set; } - - /// - /// 获取或设置交易类型。 - /// 默认值:PAP - /// - [Newtonsoft.Json.JsonProperty("trade_type")] - [System.Text.Json.Serialization.JsonPropertyName("trade_type")] - public string TradeType { get; set; } = "PAP"; - - /// - /// 获取或设置交易场景值。 - /// - [Newtonsoft.Json.JsonProperty("trade_scene")] - [System.Text.Json.Serialization.JsonPropertyName("trade_scene")] - public string TradeScene { get; set; } = string.Empty; - - /// - /// 获取或设置附加数据。 - /// - [Newtonsoft.Json.JsonProperty("attach")] - [System.Text.Json.Serialization.JsonPropertyName("attach")] - public string? Attachment { get; set; } - - /// - /// 获取或设置用户终端 IP。 - /// - [Newtonsoft.Json.JsonProperty("spbill_create_ip")] - [System.Text.Json.Serialization.JsonPropertyName("spbill_create_ip")] - public string ClientIp { get; set; } = string.Empty; - - /// - /// 获取或设置订单优惠标记。 - /// - [Newtonsoft.Json.JsonProperty("goods_tag")] - [System.Text.Json.Serialization.JsonPropertyName("goods_tag")] - public string? GoodsTag { get; set; } - - /// - /// 获取或设置通知地址。 - /// - [Newtonsoft.Json.JsonProperty("notify_url")] - [System.Text.Json.Serialization.JsonPropertyName("notify_url")] - public string NotifyUrl { get; set; } = string.Empty; - /// /// 获取或设置场景信息。 /// @@ -265,25 +57,6 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV2.Models [Newtonsoft.Json.JsonConverter(typeof(Converters.RequestPropertySceneNewtonsoftJsonConverter))] [System.Text.Json.Serialization.JsonPropertyName("scene_info")] [System.Text.Json.Serialization.JsonConverter(typeof(Converters.RequestPropertySceneSystemTextJsonConverter))] - public Types.Scene? Scene { get; set; } - - /// - /// 获取或设置是否分账。 - /// - [Newtonsoft.Json.JsonProperty("profit_sharing")] - [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.YesOrNoNullableBooleanConverter))] - [System.Text.Json.Serialization.JsonPropertyName("profit_sharing")] - [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.YesOrNoNullableBooleanConverter))] - public bool? IsProfitSharing { get; set; } - - /// - /// - /// 默认值: - /// - [Newtonsoft.Json.JsonProperty("sign_type")] - [System.Text.Json.Serialization.JsonPropertyName("sign_type")] -#pragma warning disable CS8765 - public override string SignType { get; set; } = Constants.SignTypes.HMAC_SHA256; -#pragma warning restore CS8765 + public new Types.Scene? Scene { get; set; } } } diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV2/Models/VehiclePartner/ApplyVehiclePartnerPayResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV2/Models/VehiclePartner/ApplyVehiclePartnerPayResponse.cs index 4038725b..b01b8a9b 100644 --- a/src/SKIT.FlurlHttpClient.Wechat.TenpayV2/Models/VehiclePartner/ApplyVehiclePartnerPayResponse.cs +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV2/Models/VehiclePartner/ApplyVehiclePartnerPayResponse.cs @@ -3,30 +3,8 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV2.Models /// /// 表示 [POST] /vehicle/partnerpay/payapply 接口的响应。 /// - public class ApplyVehiclePartnerPayResponse : WechatTenpaySignableResponse + public class ApplyVehiclePartnerPayResponse : ApplyVehiclePayResponse { - /// - /// - /// - [Newtonsoft.Json.JsonProperty("mch_id")] - [System.Text.Json.Serialization.JsonPropertyName("mch_id")] -#pragma warning disable CS8618 -#pragma warning disable CS8765 - public override string MerchantId { get; set; } -#pragma warning restore CS8765 -#pragma warning restore CS8618 - - /// - /// - /// - [Newtonsoft.Json.JsonProperty("appid")] - [System.Text.Json.Serialization.JsonPropertyName("appid")] -#pragma warning disable CS8618 -#pragma warning disable CS8765 - public override string AppId { get; set; } -#pragma warning restore CS8765 -#pragma warning restore CS8618 - /// /// 获取或设置子商户号。 /// @@ -40,12 +18,5 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV2.Models [Newtonsoft.Json.JsonProperty("sub_appid")] [System.Text.Json.Serialization.JsonPropertyName("sub_appid")] public string? SubAppId { get; set; } - - /// - /// 获取或设置终端设备号。 - /// - [Newtonsoft.Json.JsonProperty("device_info")] - [System.Text.Json.Serialization.JsonPropertyName("device_info")] - public string? DeviceInfo { get; set; } } } diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV2/Models/VehiclePartner/GetTransitPartnerOrderRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV2/Models/VehiclePartner/GetTransitPartnerOrderRequest.cs new file mode 100644 index 00000000..60b3cb06 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV2/Models/VehiclePartner/GetTransitPartnerOrderRequest.cs @@ -0,0 +1,22 @@ +namespace SKIT.FlurlHttpClient.Wechat.TenpayV2.Models +{ + /// + /// 表示 [POST] /transit/partnerpay/queryorder 接口的请求。 + /// + public class GetTransitPartnerOrderRequest : GetTransitOrderRequest + { + /// + /// 获取或设置子商户号。 + /// + [Newtonsoft.Json.JsonProperty("sub_mch_id")] + [System.Text.Json.Serialization.JsonPropertyName("sub_mch_id")] + public string SubMerchantId { get; set; } = string.Empty; + + /// + /// 获取或设置子商户 AppId。 + /// + [Newtonsoft.Json.JsonProperty("sub_appid")] + [System.Text.Json.Serialization.JsonPropertyName("sub_appid")] + public string? SubAppId { get; set; } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV2/Models/VehiclePartner/GetTransitPartnerOrderResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV2/Models/VehiclePartner/GetTransitPartnerOrderResponse.cs new file mode 100644 index 00000000..89675f71 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV2/Models/VehiclePartner/GetTransitPartnerOrderResponse.cs @@ -0,0 +1,49 @@ +namespace SKIT.FlurlHttpClient.Wechat.TenpayV2.Models +{ + /// + /// 表示 [POST] /transit/partnerpay/queryorder 接口的响应。 + /// + [Newtonsoft.Json.JsonConverter(typeof(Converters.ResponseClassNewtonsoftJsonConverter))] + [System.Text.Json.Serialization.JsonConverter(typeof(Converters.ResponseClassSystemTextJsonConverter))] + public class GetTransitPartnerOrderResponse : GetTransitOrderResponse + { + public static new class Types + { + public class Coupon : GetTransitOrderResponse.Types.Coupon + { + } + } + + internal static new class Converters + { + internal class ResponseClassNewtonsoftJsonConverter : Newtonsoft.Json.Converters.FlattenNArrayObjectConverterBase + { + } + + internal class ResponseClassSystemTextJsonConverter : System.Text.Json.Converters.FlattenNArrayObjectConverterBase + { + } + } + + /// + /// 获取或设置子商户号。 + /// + [Newtonsoft.Json.JsonProperty("sub_mch_id")] + [System.Text.Json.Serialization.JsonPropertyName("sub_mch_id")] + public string SubMerchantId { get; set; } = default!; + + /// + /// 获取或设置子商户 AppId。 + /// + [Newtonsoft.Json.JsonProperty("sub_appid")] + [System.Text.Json.Serialization.JsonPropertyName("sub_appid")] + public string? SubAppId { get; set; } + + /// + /// 获取或设置代金券使用列表。 + /// + [Newtonsoft.Json.JsonProperty(Newtonsoft.Json.Converters.FlattenNArrayObjectConverterBase.PROPERTY_NAME_NARRAY)] + [System.Text.Json.Serialization.JsonPropertyName(System.Text.Json.Converters.FlattenNArrayObjectConverterBase.PROPERTY_NAME_NARRAY)] + public new Types.Coupon[]? CouponList { get; set; } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV2/Models/VehiclePartner/GetVehiclePartnerPayStateRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV2/Models/VehiclePartner/GetVehiclePartnerPayStateRequest.cs index f2821eff..6b3d42ad 100644 --- a/src/SKIT.FlurlHttpClient.Wechat.TenpayV2/Models/VehiclePartner/GetVehiclePartnerPayStateRequest.cs +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV2/Models/VehiclePartner/GetVehiclePartnerPayStateRequest.cs @@ -1,24 +1,10 @@ -namespace SKIT.FlurlHttpClient.Wechat.TenpayV2.Models +namespace SKIT.FlurlHttpClient.Wechat.TenpayV2.Models { /// /// 表示 [POST] /vehicle/partnerpay/querystate 接口的请求。 /// - public class GetVehiclePartnerPayStateRequest : WechatTenpaySignableRequest + public class GetVehiclePartnerPayStateRequest : GetVehiclePayStateRequest { - /// - /// - /// - [Newtonsoft.Json.JsonProperty("mch_id")] - [System.Text.Json.Serialization.JsonPropertyName("mch_id")] - public override string? MerchantId { get; set; } - - /// - /// - /// - [Newtonsoft.Json.JsonProperty("appid")] - [System.Text.Json.Serialization.JsonPropertyName("appid")] - public override string? AppId { get; set; } - /// /// 获取或设置子商户号。 /// @@ -33,57 +19,11 @@ [System.Text.Json.Serialization.JsonPropertyName("sub_appid")] public string? SubAppId { get; set; } - /// - /// 获取或设置接口版本号。 - /// 默认值:3.0 - /// - [Newtonsoft.Json.JsonProperty("version")] - [System.Text.Json.Serialization.JsonPropertyName("version")] - public string Version { get; set; } = "3.0"; - - /// - /// 获取或设置交易场景值。 - /// - [Newtonsoft.Json.JsonProperty("trade_scene")] - [System.Text.Json.Serialization.JsonPropertyName("trade_scene")] - public string TradeScene { get; set; } = string.Empty; - - /// - /// 获取或设置跳转场景。 - /// - [Newtonsoft.Json.JsonProperty("jump_scene")] - [System.Text.Json.Serialization.JsonPropertyName("jump_scene")] - public string? JumpScene { get; set; } - - /// - /// 获取或设置用户的 OpenId。 - /// - [Newtonsoft.Json.JsonProperty("openid")] - [System.Text.Json.Serialization.JsonPropertyName("openid")] - public string? OpenId { get; set; } - /// /// 获取或设置用户在子商户下的 OpenId。 /// [Newtonsoft.Json.JsonProperty("sub_openid")] [System.Text.Json.Serialization.JsonPropertyName("sub_openid")] public string? SubOpenId { get; set; } - - /// - /// 获取或设置车牌号。 - /// - [Newtonsoft.Json.JsonProperty("plate_number")] - [System.Text.Json.Serialization.JsonPropertyName("plate_number")] - public string? PlateNumber { get; set; } - - /// - /// - /// 默认值: - /// - [Newtonsoft.Json.JsonProperty("sign_type")] - [System.Text.Json.Serialization.JsonPropertyName("sign_type")] -#pragma warning disable CS8765 - public override string SignType { get; set; } = Constants.SignTypes.HMAC_SHA256; -#pragma warning restore CS8765 } } diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV2/Models/VehiclePartner/GetVehiclePartnerPayStateResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV2/Models/VehiclePartner/GetVehiclePartnerPayStateResponse.cs index 687be830..1e298de3 100644 --- a/src/SKIT.FlurlHttpClient.Wechat.TenpayV2/Models/VehiclePartner/GetVehiclePartnerPayStateResponse.cs +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV2/Models/VehiclePartner/GetVehiclePartnerPayStateResponse.cs @@ -3,36 +3,16 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV2.Models /// /// 表示 [POST] /vehicle/partnerpay/querystate 接口的响应。 /// - public class GetVehiclePartnerPayStateResponse : WechatTenpaySignableResponse + public class GetVehiclePartnerPayStateResponse : GetVehiclePayStateResponse { - public static class Types + public static new class Types { - public class PlateNumberInfo + public class PlateNumberInfo : GetVehiclePayStateResponse.Types.PlateNumberInfo { - public static class Types + public static new class Types { - public class Data + public class Data : GetVehiclePayStateResponse.Types.PlateNumberInfo.Types.Data { - /// - /// 获取或设置车牌号。 - /// - [Newtonsoft.Json.JsonProperty("plate_number")] - [System.Text.Json.Serialization.JsonPropertyName("plate_number")] - public string PlateNumber { get; set; } = default!; - - /// - /// 获取或设置车牌通道标识。 - /// - [Newtonsoft.Json.JsonProperty("channel_type")] - [System.Text.Json.Serialization.JsonPropertyName("channel_type")] - public string? ChannelType { get; set; } - - /// - /// 获取或设置常用车牌标志。 - /// - [Newtonsoft.Json.JsonProperty("common_use_flag")] - [System.Text.Json.Serialization.JsonPropertyName("common_use_flag")] - public string? CommonUseFlag { get; set; } } } @@ -41,11 +21,11 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV2.Models /// [Newtonsoft.Json.JsonProperty("plate_number_info")] [System.Text.Json.Serialization.JsonPropertyName("plate_number_info")] - public Types.Data Data { get; set; } = default!; + public new Types.Data[] Data { get; set; } = default!; } } - internal static class Converters + internal static new class Converters { internal class ResponsePropertyPlateNumberInfoNewtonsoftJsonConverter : Newtonsoft.Json.Converters.TextualObjectInJsonFormatConverterBase { @@ -56,28 +36,6 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV2.Models } } - /// - /// - /// - [Newtonsoft.Json.JsonProperty("mch_id")] - [System.Text.Json.Serialization.JsonPropertyName("mch_id")] -#pragma warning disable CS8618 -#pragma warning disable CS8765 - public override string MerchantId { get; set; } -#pragma warning restore CS8765 -#pragma warning restore CS8618 - - /// - /// - /// - [Newtonsoft.Json.JsonProperty("appid")] - [System.Text.Json.Serialization.JsonPropertyName("appid")] -#pragma warning disable CS8618 -#pragma warning disable CS8765 - public override string AppId { get; set; } -#pragma warning restore CS8765 -#pragma warning restore CS8618 - /// /// 获取或设置子商户号。 /// @@ -92,27 +50,6 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV2.Models [System.Text.Json.Serialization.JsonPropertyName("sub_appid")] public string? SubAppId { get; set; } - /// - /// 获取或设置用户状态。 - /// - [Newtonsoft.Json.JsonProperty("user_state")] - [System.Text.Json.Serialization.JsonPropertyName("user_state")] - public string UserState { get; set; } = default!; - - /// - /// 获取或设置发起扣费方式。 - /// - [Newtonsoft.Json.JsonProperty("deduct_mode")] - [System.Text.Json.Serialization.JsonPropertyName("deduct_mode")] - public string? DeductMode { get; set; } - - /// - /// 获取或设置用户的 OpenId。 - /// - [Newtonsoft.Json.JsonProperty("openid")] - [System.Text.Json.Serialization.JsonPropertyName("openid")] - public string? OpenId { get; set; } - /// /// 获取或设置用户在子商户下的 OpenId。 /// @@ -120,13 +57,6 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV2.Models [System.Text.Json.Serialization.JsonPropertyName("sub_openid")] public string? SubOpenId { get; set; } - /// - /// 获取或设置跳转路径。 - /// - [Newtonsoft.Json.JsonProperty("path")] - [System.Text.Json.Serialization.JsonPropertyName("path")] - public string? JumpPath { get; set; } - /// /// 获取或设置车牌号信息。 /// @@ -134,6 +64,6 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV2.Models [Newtonsoft.Json.JsonConverter(typeof(Converters.ResponsePropertyPlateNumberInfoNewtonsoftJsonConverter))] [System.Text.Json.Serialization.JsonPropertyName("plate_number_info")] [System.Text.Json.Serialization.JsonConverter(typeof(Converters.ResponsePropertyPlateNumberInfoSystemTextJsonConverter))] - public Types.PlateNumberInfo? PlateNumberInfo { get; set; } + public new Types.PlateNumberInfo? PlateNumberInfo { get; set; } } } diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV2/Models/VehiclePartner/NotifyVehiclePartnerPayRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV2/Models/VehiclePartner/NotifyVehiclePartnerPayRequest.cs index 1610dbac..03734459 100644 --- a/src/SKIT.FlurlHttpClient.Wechat.TenpayV2/Models/VehiclePartner/NotifyVehiclePartnerPayRequest.cs +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV2/Models/VehiclePartner/NotifyVehiclePartnerPayRequest.cs @@ -1,84 +1,18 @@ -using System; - namespace SKIT.FlurlHttpClient.Wechat.TenpayV2.Models { /// /// 表示 [POST] /vehicle/partnerpay/notification 接口的请求。 /// - public class NotifyVehiclePartnerPayRequest : WechatTenpaySignableRequest + public class NotifyVehiclePartnerPayRequest : NotifyVehiclePayRequest { - public static class Types + public static new class Types { - public class Scene + public class Scene : NotifyVehiclePayRequest.Types.Scene { - public static class Types + public static new class Types { - public class Data + public class Data : NotifyVehiclePayRequest.Types.Scene.Types.Data { - /// - /// 获取或设置入场时间。 - /// - [Newtonsoft.Json.JsonProperty("start_time")] - [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.PureDigitalTextDateTimeOffsetConverter))] - public DateTimeOffset StartTime { get; set; } - - /// - /// 获取或设置车牌号。 - /// - [Newtonsoft.Json.JsonProperty("plate_number")] - [System.Text.Json.Serialization.JsonPropertyName("plate_number")] - public string? PlateNumber { get; set; } - - /// - /// 获取或设置车辆类型。 - /// - [Newtonsoft.Json.JsonProperty("car_type")] - [System.Text.Json.Serialization.JsonPropertyName("car_type")] - public string? CarType { get; set; } - - /// - /// 获取或设置停车场名称。 - /// - [Newtonsoft.Json.JsonProperty("parking_name")] - [System.Text.Json.Serialization.JsonPropertyName("parking_name")] - public string? ParkingName { get; set; } - - /// - /// 获取或设置车位编号。 - /// - [Newtonsoft.Json.JsonProperty("space_number")] - [System.Text.Json.Serialization.JsonPropertyName("space_number")] - public string? SpaceNumber { get; set; } - - /// - /// 获取或设置免费时长(单位:秒)。 - /// - [Newtonsoft.Json.JsonProperty("free_time")] - [System.Text.Json.Serialization.JsonPropertyName("free_time")] - public int? FreeDuration { get; set; } - - /// - /// 获取或设置用户的 OpenId。 - /// - [Newtonsoft.Json.JsonProperty("openid")] - [System.Text.Json.Serialization.JsonPropertyName("openid")] - public string? OpenId { get; set; } - - /// - /// 获取或设置用户在子商户下的 OpenId。 - /// - [Newtonsoft.Json.JsonProperty("sub_openid")] - [System.Text.Json.Serialization.JsonPropertyName("sub_openid")] - public string? SubOpenId { get; set; } - - /// - /// 获取或设置通知地址。 - /// - [Newtonsoft.Json.JsonProperty("notify_url")] - [System.Text.Json.Serialization.JsonPropertyName("notify_url")] - public string? NotifyUrl { get; set; } } } @@ -87,11 +21,11 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV2.Models /// [Newtonsoft.Json.JsonProperty("scene_info")] [System.Text.Json.Serialization.JsonPropertyName("scene_info")] - public Types.Data Data { get; set; } = new Types.Data(); + public new Types.Data Data { get; set; } = new Types.Data(); } } - internal static class Converters + internal static new class Converters { internal class RequestPropertySceneNewtonsoftJsonConverter : Newtonsoft.Json.Converters.TextualObjectInJsonFormatConverterBase { @@ -102,20 +36,6 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV2.Models } } - /// - /// - /// - [Newtonsoft.Json.JsonProperty("mch_id")] - [System.Text.Json.Serialization.JsonPropertyName("mch_id")] - public override string? MerchantId { get; set; } - - /// - /// - /// - [Newtonsoft.Json.JsonProperty("appid")] - [System.Text.Json.Serialization.JsonPropertyName("appid")] - public override string? AppId { get; set; } - /// /// 获取或设置子商户号。 /// @@ -130,21 +50,6 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV2.Models [System.Text.Json.Serialization.JsonPropertyName("sub_appid")] public string? SubAppId { get; set; } - /// - /// 获取或设置接口版本号。 - /// 默认值:3.0 - /// - [Newtonsoft.Json.JsonProperty("version")] - [System.Text.Json.Serialization.JsonPropertyName("version")] - public string Version { get; set; } = "3.0"; - - /// - /// 获取或设置交易场景值。 - /// - [Newtonsoft.Json.JsonProperty("trade_scene")] - [System.Text.Json.Serialization.JsonPropertyName("trade_scene")] - public string TradeScene { get; set; } = string.Empty; - /// /// 获取或设置场景信息。 /// @@ -152,16 +57,6 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV2.Models [Newtonsoft.Json.JsonConverter(typeof(Converters.RequestPropertySceneNewtonsoftJsonConverter))] [System.Text.Json.Serialization.JsonPropertyName("scene_info")] [System.Text.Json.Serialization.JsonConverter(typeof(Converters.RequestPropertySceneSystemTextJsonConverter))] - public Types.Scene? Scene { get; set; } - - /// - /// - /// 默认值: - /// - [Newtonsoft.Json.JsonProperty("sign_type")] - [System.Text.Json.Serialization.JsonPropertyName("sign_type")] -#pragma warning disable CS8765 - public override string SignType { get; set; } = Constants.SignTypes.HMAC_SHA256; -#pragma warning restore CS8765 + public new Types.Scene? Scene { get; set; } } } diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV2/Models/VehiclePartner/NotifyVehiclePartnerPayResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV2/Models/VehiclePartner/NotifyVehiclePartnerPayResponse.cs index 728468c2..7b305864 100644 --- a/src/SKIT.FlurlHttpClient.Wechat.TenpayV2/Models/VehiclePartner/NotifyVehiclePartnerPayResponse.cs +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV2/Models/VehiclePartner/NotifyVehiclePartnerPayResponse.cs @@ -3,30 +3,8 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV2.Models /// /// 表示 [POST] /vehicle/partnerpay/notification 接口的响应。 /// - public class NotifyVehiclePartnerPayResponse : WechatTenpaySignableResponse + public class NotifyVehiclePartnerPayResponse : NotifyVehiclePayResponse { - /// - /// - /// - [Newtonsoft.Json.JsonProperty("mch_id")] - [System.Text.Json.Serialization.JsonPropertyName("mch_id")] -#pragma warning disable CS8618 -#pragma warning disable CS8765 - public override string MerchantId { get; set; } -#pragma warning restore CS8765 -#pragma warning restore CS8618 - - /// - /// - /// - [Newtonsoft.Json.JsonProperty("appid")] - [System.Text.Json.Serialization.JsonPropertyName("appid")] -#pragma warning disable CS8618 -#pragma warning disable CS8765 - public override string AppId { get; set; } -#pragma warning restore CS8765 -#pragma warning restore CS8618 - /// /// 获取或设置子商户号。 /// @@ -40,19 +18,5 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV2.Models [Newtonsoft.Json.JsonProperty("sub_appid")] [System.Text.Json.Serialization.JsonPropertyName("sub_appid")] public string? SubAppId { get; set; } - - /// - /// 获取或设置用户状态。 - /// - [Newtonsoft.Json.JsonProperty("user_state")] - [System.Text.Json.Serialization.JsonPropertyName("user_state")] - public string UserState { get; set; } = default!; - - /// - /// 获取或设置发起扣费方式。 - /// - [Newtonsoft.Json.JsonProperty("deduct_mode")] - [System.Text.Json.Serialization.JsonPropertyName("deduct_mode")] - public string? DeductMode { get; set; } } } diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV2.UnitTests/EventSamples/VehicleEvent.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV2.UnitTests/EventSamples/VehicleEvent.json new file mode 100644 index 00000000..93d2078a --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV2.UnitTests/EventSamples/VehicleEvent.json @@ -0,0 +1,10 @@ +{ + "mch_id": "100000981", + "appid": "wxcbda96de0b165486", + "nonce_str": "5K8264ILTKCH16CQ2502SI8ZNMTM67VS", + "sign_type": "HMAC-SHA256", + "sign": "EE088059BBC9141264F8D14293AD6C4BB94CEA8C08AA98FBF93E262D445F8FF5", + "plate_number": "粤A00000", + "vehicle_event_type": "NORMAL", + "vehicle_event_createtime": "20180101100000" +} diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV2.UnitTests/ModelSamples/Vehicle/ApplyVehiclePayRequest.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV2.UnitTests/ModelSamples/Vehicle/ApplyVehiclePayRequest.json new file mode 100644 index 00000000..3881eae3 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV2.UnitTests/ModelSamples/Vehicle/ApplyVehiclePayRequest.json @@ -0,0 +1,15 @@ +{ + "mch_id": "10000098", + "appid": "wxcbda96de0b165486", + "nonce_str": "5K8264ILTKCH16CQ2502SI8ZNMTM67VS", + "sign_type": "HMAC-SHA256", + "sign": " EE088059BBC9141264F8D14293AD6C4BB94CEA8C08AA98FBF93E262D445F8FF5", + "body": "公交代扣", + "out_trade_no": "217752501201407033233368018", + "total_fee": "888", + "spbill_create_ip": "8.8.8.8", + "notify_url": "http://yoursite.com/wxpay.html", + "trade_scene": " PARKING", + "version": "3.0", + "scene_info": "{\"scene_info\":{\"start_time\":\"20170926114339\",\"end_time\":\"20170826114339\",\"charging_time\":3600,\"free_time\":1200,\"plate_number\":\"CB1000sdfasd\",\"car_type\":\"大型车\",\"parking_name\":\"欢乐海岸停车场\"}}" +} diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV2.UnitTests/ModelSamples/Vehicle/ApplyVehiclePayResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV2.UnitTests/ModelSamples/Vehicle/ApplyVehiclePayResponse.json new file mode 100644 index 00000000..49637737 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV2.UnitTests/ModelSamples/Vehicle/ApplyVehiclePayResponse.json @@ -0,0 +1,9 @@ +{ + "return_code": "SUCCESS", + "return_msg": "OK", + "appid": "wxcbda96de0b165486", + "mch_id": "10000098", + "nonce_str": "IITRi8Iabbblz1Jc", + "sign": "EE088059BBC9141264F8D14293AD6C4BB94CEA8C08AA98FBF93E262D445F8FF5", + "result_code": "SUCCESS" +} diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV2.UnitTests/ModelSamples/Vehicle/GetTransitOrderRequest.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV2.UnitTests/ModelSamples/Vehicle/GetTransitOrderRequest.json new file mode 100644 index 00000000..caa44f95 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV2.UnitTests/ModelSamples/Vehicle/GetTransitOrderRequest.json @@ -0,0 +1,8 @@ +{ + "appid": "wx2421b1c4370ec43b", + "mch_id": "10000100", + "nonce_str": "ec2316275641faa3aacf3cc599e8730f", + "transaction_id": "1008450740201411110005820873", + "sign_type": "HMAC-SHA256", + "sign": "EE088059BBC9141264F8D14293AD6C4BB94CEA8C08AA98FBF93E262D445F8FF5" +} diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV2.UnitTests/ModelSamples/Vehicle/GetTransitOrderResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV2.UnitTests/ModelSamples/Vehicle/GetTransitOrderResponse.json new file mode 100644 index 00000000..145c5dcb --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV2.UnitTests/ModelSamples/Vehicle/GetTransitOrderResponse.json @@ -0,0 +1,21 @@ +{ + "return_code": "SUCCESS", + "return_msg": "OK", + "appid": "wx2421b1c4370ec43b", + "mch_id": "10000100", + "device_info": "1000", + "nonce_str": "TN55wO9Pba5yENl8", + "sign": "EE088059BBC9141264F8D14293AD6C4BB94CEA8C08AA98FBF93E262D445F8FF5", + "result_code": "SUCCESS", + "openid": "oUpF8uN95-Ptaags6E_roPHg7AG0", + "is_subscribe": "Y", + "trade_type": "PAP", + "bank_type": "CCB_DEBIT", + "total_fee": "1", + "fee_type": "CNY", + "transaction_id": "1008450740201411110005820873", + "out_trade_no": "1415757673", + "attach": "订单额外描述", + "time_end": "20141111170043", + "trade_state": "SUCCESS" +} diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV2.UnitTests/ModelSamples/Vehicle/GetVehiclePayStateRequest.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV2.UnitTests/ModelSamples/Vehicle/GetVehiclePayStateRequest.json new file mode 100644 index 00000000..6286ee1b --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV2.UnitTests/ModelSamples/Vehicle/GetVehiclePayStateRequest.json @@ -0,0 +1,10 @@ +{ + "mch_id": "100000981", + "appid": "wxcbda96de0b165486", + "nonce_str": "5K8264ILTKCH16CQ2502SI8ZNMTM67VS", + "sign_type": "HMAC-SHA256", + "trade_scene": "PARKING", + "sign": "EE088059BBC9141264F8D14293AD6C4BB94CEA8C08AA98FBF93E262D445F8FF5", + "openid": " oUpF8uMuAJO_M2pxb1Q9zNjWeS6o", + "plate_number": "粤A00000" +} diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV2.UnitTests/ModelSamples/Vehicle/GetVehiclePayStateResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV2.UnitTests/ModelSamples/Vehicle/GetVehiclePayStateResponse.json new file mode 100644 index 00000000..886ce75d --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV2.UnitTests/ModelSamples/Vehicle/GetVehiclePayStateResponse.json @@ -0,0 +1,11 @@ +{ + "return_code": "SUCCESS", + "return_msg": "OK", + "appid": "wx2421b1c4370ec43b", + "mch_id": "10000100", + "nonce_str": "ec2316275641faa3aacf3cc599e8730f", + "user_state": "NORMAL", + "result_code": "SUCCESS", + "sign": "EE088059BBC9141264F8D14293AD6C4BB94CEA8C08AA98FBF93E262D445F8FF5", + "plate_number_info": "{\"plate_number_info\":[{\"plate_number\":\"粤B888888\",\"channel_type\":\"ETC\"}]}" +} diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV2.UnitTests/ModelSamples/Vehicle/NotifyVehiclePayRequest.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV2.UnitTests/ModelSamples/Vehicle/NotifyVehiclePayRequest.json new file mode 100644 index 00000000..139156e0 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV2.UnitTests/ModelSamples/Vehicle/NotifyVehiclePayRequest.json @@ -0,0 +1,10 @@ +{ + "mch_id": "100000981", + "appid": "wxcbda96de0b165486", + "nonce_str": "5K8264ILTKCH16CQ2502SI8ZNMTM67VS", + "sign_type": "HMAC-SHA256", + "trade_scene": "PARKING", + "version": "3.0", + "sign": "EE088059BBC9141264F8D14293AD6C4BB94CEA8C08AA98FBF93E262D445F8FF5", + "scene_info": "{\"scene_info\":{\"start_time\":\"20170926114339\",\"plate_number\":\"CB1000sdfasd\",\"car_type\":\"大型车\",\"parking_name\":\"欢乐海岸停车场\",\"free_time\":1200}}" +} diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV2.UnitTests/ModelSamples/Vehicle/NotifyVehiclePayResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV2.UnitTests/ModelSamples/Vehicle/NotifyVehiclePayResponse.json new file mode 100644 index 00000000..5fd3d4a5 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV2.UnitTests/ModelSamples/Vehicle/NotifyVehiclePayResponse.json @@ -0,0 +1,10 @@ +{ + "return_code": "SUCCESS", + "return_msg": "OK", + "appid": "wx2421b1c4370ec43b", + "mch_id": "10000100", + "nonce_str": "ec2316275641faa3aacf3cc599e8730f", + "user_state": "NORMAL", + "result_code": "SUCCESS", + "sign": "EE088059BBC9141264F8D14293AD6C4BB94CEA8C08AA98FBF93E262D445F8FF5" +} diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV2.UnitTests/ModelSamples/VehiclePartner/GetTransitPartnerOrderRequest.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV2.UnitTests/ModelSamples/VehiclePartner/GetTransitPartnerOrderRequest.json new file mode 100644 index 00000000..d31fb73f --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV2.UnitTests/ModelSamples/VehiclePartner/GetTransitPartnerOrderRequest.json @@ -0,0 +1,9 @@ +{ + "appid": "wx2421b1c4370ec43b", + "mch_id": "10000100", + "sub_mch_id": "10000100", + "nonce_str": "ec2316275641faa3aacf3cc599e8730f", + "transaction_id": "1008450740201411110005820873", + "sign_type": "HMAC-SHA256", + "sign": "EE088059BBC9141264F8D14293AD6C4BB94CEA8C08AA98FBF93E262D445F8FF5" +} diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV2.UnitTests/ModelSamples/VehiclePartner/GetTransitPartnerOrderResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV2.UnitTests/ModelSamples/VehiclePartner/GetTransitPartnerOrderResponse.json new file mode 100644 index 00000000..bc0d8e9c --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV2.UnitTests/ModelSamples/VehiclePartner/GetTransitPartnerOrderResponse.json @@ -0,0 +1,22 @@ +{ + "return_code": "SUCCESS", + "return_msg": "OK", + "appid": "wx2421b1c4370ec43b", + "mch_id": "10000100", + "sub_mch_id": "10000100", + "device_info": "1000", + "nonce_str": "TN55wO9Pba5yENl8", + "sign": "EE088059BBC9141264F8D14293AD6C4BB94CEA8C08AA98FBF93E262D445F8FF5", + "result_code": "SUCCESS", + "openid": "oUpF8uN95-Ptaags6E_roPHg7AG0", + "is_subscribe": "Y", + "trade_type": "PAP", + "bank_type": "CCB_DEBIT", + "total_fee": "1", + "fee_type": "CNY", + "transaction_id": "1008450740201411110005820873", + "out_trade_no": "1415757673", + "attach": "订单额外描述", + "time_end": "20141111170043", + "trade_state": "SUCCESS" +}