From ffdf4c44c99cc84d6ad7994fa047b5064410b30e Mon Sep 17 00:00:00 2001 From: Fu Diwei Date: Thu, 24 Feb 2022 13:45:00 +0800 Subject: [PATCH] =?UTF-8?q?feat(tenpayv2):=20=E6=96=B0=E5=A2=9E=E5=A2=83?= =?UTF-8?q?=E5=A4=96=E5=AD=90=E5=95=86=E6=88=B7=E8=BF=9B=E4=BB=B6=E7=9B=B8?= =?UTF-8?q?=E5=85=B3=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...ExecuteMerchantInstitutionSubExtensions.cs | 68 ++++++ ...payClientExecuteMerchantMediaExtensions.cs | 51 ++++ .../Models/Fraud/GetRiskPublicKeyRequest.cs | 2 +- .../Models/Fraud/GetRiskPublicKeyResponse.cs | 2 +- .../AddSubMerchantInstitutionRequest.cs | 226 ++++++++++++++++++ .../AddSubMerchantInstitutionResponse.cs | 43 ++++ .../GetSubMerchantInstitutionRequest.cs | 29 +++ .../GetSubMerchantInstitutionResponse.cs | 197 +++++++++++++++ .../ModifySubMerchantInstitutionRequest.cs | 226 ++++++++++++++++++ .../ModifySubMerchantInstitutionResponse.cs | 29 +++ .../UploadMerchantMediaRequest.cs | 43 ++++ .../UploadMerchantMediaResponse.cs | 29 +++ .../PAP/Contract/GetPAPPayContractRequest.cs | 4 +- .../PAP/CreatePAPPayH5EntrustWebResponse.cs | 4 +- .../PAP/CreatePAPPayPreEntrustWebResponse.cs | 4 +- .../Pay/Bill/DownloadPayBillResponse.cs | 4 +- .../Pay/Bill/DownloadPayFundFlowResponse.cs | 4 +- .../PayITIL/SubmitPayITILReportResponse.cs | 4 +- ...ServicePartnerTransfersPayToBankRequest.cs | 2 +- ...ervicePartnerTransfersPayToBankResponse.cs | 2 +- ...icePartnerTransfersPayToBankInfoRequest.cs | 2 +- ...cePartnerTransfersPayToBankInfoResponse.cs | 2 +- .../Models/Risk/QueryRiskViolationRequest.cs | 2 +- .../Models/Risk/QueryRiskViolationResponse.cs | 4 +- .../AddSubMerchantDevelopConfigResponse.cs | 4 +- .../GetSubMerchantDevelopConfigResponse.cs | 4 +- .../GetVehiclePartnerPayStateRequest.cs | 4 +- .../Properties/AssemblyInfo.cs | 2 +- .../Utilities/Internal/RequestSigner.cs | 6 +- .../WechatTenpayClient.cs | 27 ++- .../AddSubMerchantInstitutionRequest.json | 23 ++ .../AddSubMerchantInstitutionResponse.json | 7 + .../GetSubMerchantInstitutionRequest.json | 6 + .../GetSubMerchantInstitutionResponse.json | 16 ++ .../ModifySubMerchantInstitutionRequest.json | 23 ++ .../ModifySubMerchantInstitutionResponse.json | 7 + 36 files changed, 1076 insertions(+), 36 deletions(-) create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV2/Extensions/WechatTenpayClientExecuteMerchantInstitutionSubExtensions.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV2/Extensions/WechatTenpayClientExecuteMerchantMediaExtensions.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV2/Models/MerchantInstitutionSub/AddSubMerchantInstitutionRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV2/Models/MerchantInstitutionSub/AddSubMerchantInstitutionResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV2/Models/MerchantInstitutionSub/GetSubMerchantInstitutionRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV2/Models/MerchantInstitutionSub/GetSubMerchantInstitutionResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV2/Models/MerchantInstitutionSub/ModifySubMerchantInstitutionRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV2/Models/MerchantInstitutionSub/ModifySubMerchantInstitutionResponse.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV2/Models/MerchantMedia/UploadMerchantMediaRequest.cs create mode 100644 src/SKIT.FlurlHttpClient.Wechat.TenpayV2/Models/MerchantMedia/UploadMerchantMediaResponse.cs create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV2.UnitTests/ModelSamples/MerchantInstitutionSub/AddSubMerchantInstitutionRequest.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV2.UnitTests/ModelSamples/MerchantInstitutionSub/AddSubMerchantInstitutionResponse.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV2.UnitTests/ModelSamples/MerchantInstitutionSub/GetSubMerchantInstitutionRequest.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV2.UnitTests/ModelSamples/MerchantInstitutionSub/GetSubMerchantInstitutionResponse.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV2.UnitTests/ModelSamples/MerchantInstitutionSub/ModifySubMerchantInstitutionRequest.json create mode 100644 test/SKIT.FlurlHttpClient.Wechat.TenpayV2.UnitTests/ModelSamples/MerchantInstitutionSub/ModifySubMerchantInstitutionResponse.json diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV2/Extensions/WechatTenpayClientExecuteMerchantInstitutionSubExtensions.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV2/Extensions/WechatTenpayClientExecuteMerchantInstitutionSubExtensions.cs new file mode 100644 index 00000000..396b8044 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV2/Extensions/WechatTenpayClientExecuteMerchantInstitutionSubExtensions.cs @@ -0,0 +1,68 @@ +using System; +using System.Net.Http; +using System.Threading; +using System.Threading.Tasks; +using Flurl.Http; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV2 +{ + public static class WechatTenpayClientExecuteMerchantInstitutionSubExtensions + { + /// + /// 异步调用 [POST] /secapi/mch/addInstitutionsub 接口。 + /// REF: https://pay.weixin.qq.com/wiki/doc/api/wxpay/en/sub_merchant_entry/chapter3_1.shtml + /// + /// + /// + /// + /// + public static async Task ExecuteAddSubMerchantInstitutionAsync(this WechatTenpayClient client, Models.AddSubMerchantInstitutionRequest 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, "secapi", "mch", "addInstitutionsub"); + + return await client.SendRequestWithXmlAsync(flurlReq, data: request, cancellationToken: cancellationToken); + } + + /// + /// 异步调用 [POST] /secapi/mch/queryInstitutionsub 接口。 + /// REF: https://pay.weixin.qq.com/wiki/doc/api/wxpay/en/sub_merchant_entry/chapter3_2.shtml + /// + /// + /// + /// + /// + public static async Task ExecuteGetSubMerchantInstitutionAsync(this WechatTenpayClient client, Models.GetSubMerchantInstitutionRequest 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, "secapi", "mch", "queryInstitutionsub"); + + return await client.SendRequestWithXmlAsync(flurlReq, data: request, cancellationToken: cancellationToken); + } + + /// + /// 异步调用 [POST] /secapi/mch/modifyInstitutionsub 接口。 + /// REF: https://pay.weixin.qq.com/wiki/doc/api/wxpay/en/sub_merchant_entry/chapter3_3.shtml + /// + /// + /// + /// + /// + public static async Task ExecuteModifySubMerchantInstitutionAsync(this WechatTenpayClient client, Models.ModifySubMerchantInstitutionRequest 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, "secapi", "mch", "modifyInstitutionsub"); + + return await client.SendRequestWithXmlAsync(flurlReq, data: request, cancellationToken: cancellationToken); + } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV2/Extensions/WechatTenpayClientExecuteMerchantMediaExtensions.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV2/Extensions/WechatTenpayClientExecuteMerchantMediaExtensions.cs new file mode 100644 index 00000000..7cceea6a --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV2/Extensions/WechatTenpayClientExecuteMerchantMediaExtensions.cs @@ -0,0 +1,51 @@ +using System; +using System.Collections.Generic; +using System.Net.Http; +using System.Net.Http.Headers; +using System.Text; +using System.Threading; +using System.Threading.Tasks; +using System.Web; +using Flurl.Http; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV2 +{ + public static class WechatTenpayClientExecuteMerchantMediaExtensions + { + /// + /// 异步调用 [POST] /secapi/mch/uploadmedia 接口。 + /// REF: https://pay.weixin.qq.com/wiki/doc/api/wxpay/en/tool/chapter3_1.shtml + /// + /// + /// + /// + /// + public static async Task ExecuteUploadMerchantMediaAsync(this WechatTenpayClient client, Models.UploadMerchantMediaRequest request, CancellationToken cancellationToken = default) + { + if (client is null) throw new ArgumentNullException(nameof(client)); + if (request is null) throw new ArgumentNullException(nameof(request)); + + if (request.FileName == null) + request.FileName = Guid.NewGuid().ToString("N").ToLower() + ".jpg"; + + if (request.FileHash == null) + request.FileHash = Utilities.MD5Utility.Hash(request.FileBytes).ToLower(); + + IFlurlRequest flurlReq = client + .CreateRequest(request, HttpMethod.Post, "secapi", "mch", "uploadmedia"); + + string boundary = "--BOUNDARY--" + DateTimeOffset.Now.Ticks.ToString("x"); + string sign = Utilities.RequestSigner.Sign(new Dictionary() { { "mch_id", client.Credentials.MerchantId }, { "media_hash", request.FileHash } }, client.Credentials.MerchantSecret, Constants.SignTypes.MD5); + using var fileContent = new ByteArrayContent(request.FileBytes); + using var httpContent = new MultipartFormDataContent(boundary); + httpContent.Add(fileContent, "\"media\"", $"\"{HttpUtility.UrlEncode(request.FileName)}\""); + httpContent.Add(new StringContent(client.Credentials.MerchantId, Encoding.UTF8), $"\"mch_id\""); + httpContent.Add(new StringContent(request.FileHash, Encoding.UTF8), $"\"media_hash\""); + httpContent.Add(new StringContent(sign, Encoding.UTF8), $"\"sign\""); + httpContent.Headers.ContentType = MediaTypeHeaderValue.Parse("multipart/form-data; boundary=" + boundary); + fileContent.Headers.ContentType = MediaTypeHeaderValue.Parse("image/jpeg"); + + return await client.SendRequestAsync(flurlReq, httpContent: httpContent, cancellationToken: cancellationToken); + } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV2/Models/Fraud/GetRiskPublicKeyRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV2/Models/Fraud/GetRiskPublicKeyRequest.cs index b7458a63..0269aca5 100644 --- a/src/SKIT.FlurlHttpClient.Wechat.TenpayV2/Models/Fraud/GetRiskPublicKeyRequest.cs +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV2/Models/Fraud/GetRiskPublicKeyRequest.cs @@ -13,7 +13,7 @@ public override string? MerchantId { get; set; } /// - /// + /// (请忽略此字段) /// [Newtonsoft.Json.JsonIgnore] [System.Text.Json.Serialization.JsonIgnore] diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV2/Models/Fraud/GetRiskPublicKeyResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV2/Models/Fraud/GetRiskPublicKeyResponse.cs index 5d262538..d377e315 100644 --- a/src/SKIT.FlurlHttpClient.Wechat.TenpayV2/Models/Fraud/GetRiskPublicKeyResponse.cs +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV2/Models/Fraud/GetRiskPublicKeyResponse.cs @@ -13,7 +13,7 @@ public override string? MerchantId { get; set; } /// - /// + /// (请忽略此字段) /// [Newtonsoft.Json.JsonIgnore] [System.Text.Json.Serialization.JsonIgnore] diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV2/Models/MerchantInstitutionSub/AddSubMerchantInstitutionRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV2/Models/MerchantInstitutionSub/AddSubMerchantInstitutionRequest.cs new file mode 100644 index 00000000..50ace17e --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV2/Models/MerchantInstitutionSub/AddSubMerchantInstitutionRequest.cs @@ -0,0 +1,226 @@ +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV2.Models +{ + /// + /// 表示 [POST] /secapi/mch/addInstitutionsub 接口的请求。 + /// + public class AddSubMerchantInstitutionRequest : WechatTenpaySignableRequest + { + internal static class Converters + { + internal class RequestPropertyStorePhotoMediaIdListNewtonsoftJsonConverter : Newtonsoft.Json.Converters.TextualObjectInJsonFormatConverterBase> + { + } + + internal class RequestPropertyStorePhotoMediaIdListSystemTextJsonConverter : System.Text.Json.Converters.TextualObjectInJsonFormatConverterBase> + { + } + } + + /// + /// + /// + [Newtonsoft.Json.JsonProperty("mch_id")] + [System.Text.Json.Serialization.JsonPropertyName("mch_id")] + public override string? MerchantId { get; set; } + + /// + /// + /// + [Newtonsoft.Json.JsonProperty("app_id")] + [System.Text.Json.Serialization.JsonPropertyName("app_id")] + public override string? AppId { get; set; } + + /// + /// 获取或设置渠道编号。 + /// + [Newtonsoft.Json.JsonProperty("channel_id")] + [System.Text.Json.Serialization.JsonPropertyName("channel_id")] + public string? ChannelId { get; set; } + + /// + /// 获取或设置子商户全称。 + /// + [Newtonsoft.Json.JsonProperty("merchant_name")] + [System.Text.Json.Serialization.JsonPropertyName("merchant_name")] + public string MerchantName { get; set; } = string.Empty; + + /// + /// 获取或设置子商户简称。 + /// + [Newtonsoft.Json.JsonProperty("merchant_shortname")] + [System.Text.Json.Serialization.JsonPropertyName("merchant_shortname")] + public string MerchantShortName { get; set; } = string.Empty; + + /// + /// 获取或设置子商户备注信息。 + /// + [Newtonsoft.Json.JsonProperty("merchant_remark")] + [System.Text.Json.Serialization.JsonPropertyName("merchant_remark")] + public string MerchantRemark { get; set; } = string.Empty; + + /// + /// 获取或设置商户类型。 + /// + [Newtonsoft.Json.JsonProperty("merchant_type")] + [System.Text.Json.Serialization.JsonPropertyName("merchant_type")] + public string MerchantType { get; set; } = string.Empty; + + /// + /// 获取或设置业务类目编码。 + /// + [Newtonsoft.Json.JsonProperty("business_category")] + [System.Text.Json.Serialization.JsonPropertyName("business_category")] + public string BusinessCategoryCode { get; set; } = string.Empty; + + /// + /// 获取或设置商户类别编码。 + /// + [Newtonsoft.Json.JsonProperty("mcc")] + [System.Text.Json.Serialization.JsonPropertyName("mcc")] + public string MerchantCategoryCode { get; set; } = string.Empty; + + /// + /// 获取或设置注册国家或地区代码。 + /// + [Newtonsoft.Json.JsonProperty("merchant_country_code")] + [System.Text.Json.Serialization.JsonPropertyName("merchant_country_code")] + public string CountryCode { get; set; } = string.Empty; + + /// + /// 获取或设置公司注册文件编号。 + /// + [Newtonsoft.Json.JsonProperty("registration_certificate_number")] + [System.Text.Json.Serialization.JsonPropertyName("registration_certificate_number")] + public string RegistrationCertificateNumber { get; set; } = string.Empty; + + /// + /// 获取或设置公司注册文件过期时间字符串(格式:yyyy-MM-dd / PERMANENT)。 + /// + [Newtonsoft.Json.JsonProperty("registration_certificate_date")] + [System.Text.Json.Serialization.JsonPropertyName("registration_certificate_date")] + public string RegistrationCertificateDateString { get; set; } = string.Empty; + + /// + /// 获取或设置公司注册文件照片 MediaId。 + /// + [Newtonsoft.Json.JsonProperty("registration_certificate_copy")] + [System.Text.Json.Serialization.JsonPropertyName("registration_certificate_copy")] + public string? RegistrationCertificatePictureMediaId { get; set; } + + /// + /// 获取或设置业务类型。 + /// + [Newtonsoft.Json.JsonProperty("business_type")] + [System.Text.Json.Serialization.JsonPropertyName("business_type")] + public string BusinessType { get; set; } = string.Empty; + + /// + /// 获取或设置 App 下载链接。 + /// + [Newtonsoft.Json.JsonProperty("app_download")] + [System.Text.Json.Serialization.JsonPropertyName("app_download")] + public string? AppDownloadUrl { get; set; } + + /// + /// 获取或设置业务网站地址。 + /// + [Newtonsoft.Json.JsonProperty("business_website")] + [System.Text.Json.Serialization.JsonPropertyName("business_website")] + public string? BusinessWebsiteUrl { get; set; } + + /// + /// 获取或设置公众号 AppId。 + /// + [Newtonsoft.Json.JsonProperty("office_account")] + [System.Text.Json.Serialization.JsonPropertyName("office_account")] + public string? OfficeAccountAppId { get; set; } + + /// + /// 获取或设置小程序 AppId。 + /// + [Newtonsoft.Json.JsonProperty("mini_program")] + [System.Text.Json.Serialization.JsonPropertyName("mini_program")] + public string? MiniProgramAppId { get; set; } + + /// + /// 获取或设置门店地址。 + /// + [Newtonsoft.Json.JsonProperty("store_address")] + [System.Text.Json.Serialization.JsonPropertyName("store_address")] + public string? StoreAddress { get; set; } + + /// + /// 获取或设置门店照片 MediaId 列表。 + /// + [Newtonsoft.Json.JsonProperty("store_photos")] + [Newtonsoft.Json.JsonConverter(typeof(Converters.RequestPropertyStorePhotoMediaIdListNewtonsoftJsonConverter))] + [System.Text.Json.Serialization.JsonPropertyName("store_photos")] + [System.Text.Json.Serialization.JsonConverter(typeof(Converters.RequestPropertyStorePhotoMediaIdListSystemTextJsonConverter))] + public IList? StorePhotoMediaIdList { get; set; } + + /// + /// 获取或设置董事姓名。 + /// + [Newtonsoft.Json.JsonProperty("director_name")] + [System.Text.Json.Serialization.JsonPropertyName("director_name")] + public string? DirectorName { get; set; } + + /// + /// 获取或设置董事证件号码。 + /// + [Newtonsoft.Json.JsonProperty("director_id_number")] + [System.Text.Json.Serialization.JsonPropertyName("director_id_number")] + public string? DirectorIdNumber { get; set; } + + /// + /// 获取或设置负责人姓名。 + /// + [Newtonsoft.Json.JsonProperty("principal_name")] + [System.Text.Json.Serialization.JsonPropertyName("principal_name")] + public string? PrincipalName { get; set; } + + /// + /// 获取或设置负责人证件号。 + /// + [Newtonsoft.Json.JsonProperty("principal_id_number")] + [System.Text.Json.Serialization.JsonPropertyName("principal_id_number")] + public string? PrincipalIdNumber { get; set; } + + /// + /// 获取或设置公司电话。 + /// + [Newtonsoft.Json.JsonProperty("office_phone")] + [System.Text.Json.Serialization.JsonPropertyName("office_phone")] + public string? OfficePhoneNumber { get; set; } + + /// + /// 获取或设置联系人姓名。 + /// + [Newtonsoft.Json.JsonProperty("contact_name")] + [System.Text.Json.Serialization.JsonPropertyName("contact_name")] + public string? ContactName { get; set; } + + /// + /// 获取或设置联系人电话号码。 + /// + [Newtonsoft.Json.JsonProperty("contact_phone")] + [System.Text.Json.Serialization.JsonPropertyName("contact_phone")] + public string? ContactPhotoNumber { get; set; } + + /// + /// 获取或设置联系人邮箱。 + /// + [Newtonsoft.Json.JsonProperty("contact_email")] + [System.Text.Json.Serialization.JsonPropertyName("contact_email")] + public string? ContactEmail { get; set; } + + /// + /// 获取或设置子商户结算银行账户 。 + /// + [Newtonsoft.Json.JsonProperty("settlement_bank_number")] + [System.Text.Json.Serialization.JsonPropertyName("settlement_bank_number")] + public string? SettlementBankNumber { get; set; } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV2/Models/MerchantInstitutionSub/AddSubMerchantInstitutionResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV2/Models/MerchantInstitutionSub/AddSubMerchantInstitutionResponse.cs new file mode 100644 index 00000000..c52db48d --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV2/Models/MerchantInstitutionSub/AddSubMerchantInstitutionResponse.cs @@ -0,0 +1,43 @@ +namespace SKIT.FlurlHttpClient.Wechat.TenpayV2.Models +{ + /// + /// 表示 [POST] /secapi/mch/addInstitutionsub 接口的响应。 + /// + public class AddSubMerchantInstitutionResponse : WechatTenpaySignableResponse + { + /// + /// (请忽略此字段) + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public override string? MerchantId { get; set; } + + /// + /// (请忽略此字段) + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public override string? AppId { get; set; } + + /// + /// 获取或设置子商户号。 + /// + [Newtonsoft.Json.JsonProperty("sub_mch_id")] + [System.Text.Json.Serialization.JsonPropertyName("sub_mch_id")] + public string SubMerhantId { get; set; } = default!; + + /// + /// 获取或设置验证状态。 + /// + [Newtonsoft.Json.JsonProperty("verification_status")] + [System.Text.Json.Serialization.JsonPropertyName("verification_status")] + public string? VerificationStatus { get; set; } + + /// + /// 获取或设置验证状态描述。 + /// + [Newtonsoft.Json.JsonProperty("description")] + [System.Text.Json.Serialization.JsonPropertyName("description")] + public string? VerificationStatusDescription { get; set; } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV2/Models/MerchantInstitutionSub/GetSubMerchantInstitutionRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV2/Models/MerchantInstitutionSub/GetSubMerchantInstitutionRequest.cs new file mode 100644 index 00000000..48f6fcd2 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV2/Models/MerchantInstitutionSub/GetSubMerchantInstitutionRequest.cs @@ -0,0 +1,29 @@ +namespace SKIT.FlurlHttpClient.Wechat.TenpayV2.Models +{ + /// + /// 表示 [POST] /secapi/mch/queryInstitutionsub 接口的请求。 + /// + public class GetSubMerchantInstitutionRequest : WechatTenpaySignableRequest + { + /// + /// + /// + [Newtonsoft.Json.JsonProperty("mch_id")] + [System.Text.Json.Serialization.JsonPropertyName("mch_id")] + public override string? MerchantId { get; set; } + + /// + /// + /// + [Newtonsoft.Json.JsonProperty("app_id")] + [System.Text.Json.Serialization.JsonPropertyName("app_id")] + public override string? AppId { get; set; } + + /// + /// 获取或设置子商户号。 + /// + [Newtonsoft.Json.JsonProperty("sub_mch_id")] + [System.Text.Json.Serialization.JsonPropertyName("sub_mch_id")] + public string SubMerchantId { get; set; } = string.Empty; + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV2/Models/MerchantInstitutionSub/GetSubMerchantInstitutionResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV2/Models/MerchantInstitutionSub/GetSubMerchantInstitutionResponse.cs new file mode 100644 index 00000000..f8b0ead4 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV2/Models/MerchantInstitutionSub/GetSubMerchantInstitutionResponse.cs @@ -0,0 +1,197 @@ +namespace SKIT.FlurlHttpClient.Wechat.TenpayV2.Models +{ + /// + /// 表示 [POST] /secapi/mch/queryInstitutionsub 接口的响应。 + /// + public class GetSubMerchantInstitutionResponse : WechatTenpaySignableResponse + { + /// + /// (请忽略此字段) + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public override string? MerchantId { get; set; } + + /// + /// (请忽略此字段) + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public override string? AppId { get; set; } + + /// + /// 获取或设置子商户号。 + /// + [Newtonsoft.Json.JsonProperty("sub_mch_id")] + [System.Text.Json.Serialization.JsonPropertyName("sub_mch_id")] + public string SubMerhantId { get; set; } = default!; + + /// + /// 获取或设置子商户全称。 + /// + [Newtonsoft.Json.JsonProperty("merchant_name")] + [System.Text.Json.Serialization.JsonPropertyName("merchant_name")] + public string MerchantName { get; set; } = default!; + + /// + /// 获取或设置子商户简称。 + /// + [Newtonsoft.Json.JsonProperty("merchant_shortname")] + [System.Text.Json.Serialization.JsonPropertyName("merchant_shortname")] + public string MerchantShortName { get; set; } = default!; + + /// + /// 获取或设置子商户备注信息。 + /// + [Newtonsoft.Json.JsonProperty("merchant_remark")] + [System.Text.Json.Serialization.JsonPropertyName("merchant_remark")] + public string MerchantRemark { get; set; } = default!; + + /// + /// 获取或设置商户类型。 + /// + [Newtonsoft.Json.JsonProperty("merchant_type")] + [System.Text.Json.Serialization.JsonPropertyName("merchant_type")] + public string MerchantType { get; set; } = default!; + + /// + /// 获取或设置业务类目编码。 + /// + [Newtonsoft.Json.JsonProperty("business_category")] + [System.Text.Json.Serialization.JsonPropertyName("business_category")] + public string BusinessCategoryCode { get; set; } = default!; + + /// + /// 获取或设置商户类别编码。 + /// + [Newtonsoft.Json.JsonProperty("mcc")] + [System.Text.Json.Serialization.JsonPropertyName("mcc")] + public string MerchantCategoryCode { get; set; } = default!; + + /// + /// 获取或设置注册国家或地区代码。 + /// + [Newtonsoft.Json.JsonProperty("merchant_country_code")] + [System.Text.Json.Serialization.JsonPropertyName("merchant_country_code")] + public string CountryCode { get; set; } = default!; + + /// + /// 获取或设置公司注册文件编号。 + /// + [Newtonsoft.Json.JsonProperty("registration_certificate_number")] + [System.Text.Json.Serialization.JsonPropertyName("registration_certificate_number")] + public string RegistrationCertificateNumber { get; set; } = default!; + + /// + /// 获取或设置公司注册文件过期时间字符串(格式:yyyy-MM-dd / PERMANENT)。 + /// + [Newtonsoft.Json.JsonProperty("registration_certificate_date")] + [System.Text.Json.Serialization.JsonPropertyName("registration_certificate_date")] + public string RegistrationCertificateDateString { get; set; } = default!; + + /// + /// 获取或设置业务类型。 + /// + [Newtonsoft.Json.JsonProperty("business_type")] + [System.Text.Json.Serialization.JsonPropertyName("business_type")] + public string BusinessType { get; set; } = default!; + + /// + /// 获取或设置 App 下载链接。 + /// + [Newtonsoft.Json.JsonProperty("app_download")] + [System.Text.Json.Serialization.JsonPropertyName("app_download")] + public string? AppDownloadUrl { get; set; } + + /// + /// 获取或设置业务网站地址。 + /// + [Newtonsoft.Json.JsonProperty("business_website")] + [System.Text.Json.Serialization.JsonPropertyName("business_website")] + public string? BusinessWebsiteUrl { get; set; } + + /// + /// 获取或设置公众号 AppId。 + /// + [Newtonsoft.Json.JsonProperty("office_account")] + [System.Text.Json.Serialization.JsonPropertyName("office_account")] + public string? OfficeAccountAppId { get; set; } + + /// + /// 获取或设置小程序 AppId。 + /// + [Newtonsoft.Json.JsonProperty("mini_program")] + [System.Text.Json.Serialization.JsonPropertyName("mini_program")] + public string? MiniProgramAppId { get; set; } + + /// + /// 获取或设置门店地址。 + /// + [Newtonsoft.Json.JsonProperty("store_address")] + [System.Text.Json.Serialization.JsonPropertyName("store_address")] + public string? StoreAddress { get; set; } + + /// + /// 获取或设置董事姓名。 + /// + [Newtonsoft.Json.JsonProperty("director_name")] + [System.Text.Json.Serialization.JsonPropertyName("director_name")] + public string? DirectorName { get; set; } + + /// + /// 获取或设置董事证件号码。 + /// + [Newtonsoft.Json.JsonProperty("director_id_number")] + [System.Text.Json.Serialization.JsonPropertyName("director_id_number")] + public string? DirectorIdNumber { get; set; } + + /// + /// 获取或设置负责人姓名。 + /// + [Newtonsoft.Json.JsonProperty("principal_name")] + [System.Text.Json.Serialization.JsonPropertyName("principal_name")] + public string? PrincipalName { get; set; } + + /// + /// 获取或设置负责人证件号。 + /// + [Newtonsoft.Json.JsonProperty("principal_id_number")] + [System.Text.Json.Serialization.JsonPropertyName("principal_id_number")] + public string? PrincipalIdNumber { get; set; } + + /// + /// 获取或设置公司电话。 + /// + [Newtonsoft.Json.JsonProperty("office_phone")] + [System.Text.Json.Serialization.JsonPropertyName("office_phone")] + public string? OfficePhoneNumber { get; set; } + + /// + /// 获取或设置联系人姓名。 + /// + [Newtonsoft.Json.JsonProperty("contact_name")] + [System.Text.Json.Serialization.JsonPropertyName("contact_name")] + public string? ContactName { get; set; } + + /// + /// 获取或设置联系人电话号码。 + /// + [Newtonsoft.Json.JsonProperty("contact_phone")] + [System.Text.Json.Serialization.JsonPropertyName("contact_phone")] + public string? ContactPhotoNumber { get; set; } + + /// + /// 获取或设置联系人邮箱。 + /// + [Newtonsoft.Json.JsonProperty("contact_email")] + [System.Text.Json.Serialization.JsonPropertyName("contact_email")] + public string? ContactEmail { get; set; } + + /// + /// 获取或设置子商户结算银行账户 。 + /// + [Newtonsoft.Json.JsonProperty("settlement_bank_number")] + [System.Text.Json.Serialization.JsonPropertyName("settlement_bank_number")] + public string? SettlementBankNumber { get; set; } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV2/Models/MerchantInstitutionSub/ModifySubMerchantInstitutionRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV2/Models/MerchantInstitutionSub/ModifySubMerchantInstitutionRequest.cs new file mode 100644 index 00000000..6fe59241 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV2/Models/MerchantInstitutionSub/ModifySubMerchantInstitutionRequest.cs @@ -0,0 +1,226 @@ +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV2.Models +{ + /// + /// 表示 [POST] /secapi/mch/modifyInstitutionsub 接口的请求。 + /// + public class ModifySubMerchantInstitutionRequest : WechatTenpaySignableRequest + { + internal static class Converters + { + internal class RequestPropertyStorePhotoMediaIdListNewtonsoftJsonConverter : Newtonsoft.Json.Converters.TextualObjectInJsonFormatConverterBase> + { + } + + internal class RequestPropertyStorePhotoMediaIdListSystemTextJsonConverter : System.Text.Json.Converters.TextualObjectInJsonFormatConverterBase> + { + } + } + + /// + /// + /// + [Newtonsoft.Json.JsonProperty("mch_id")] + [System.Text.Json.Serialization.JsonPropertyName("mch_id")] + public override string? MerchantId { get; set; } + + /// + /// + /// + [Newtonsoft.Json.JsonProperty("app_id")] + [System.Text.Json.Serialization.JsonPropertyName("app_id")] + public override string? AppId { get; set; } + + /// + /// 获取或设置子商户号。 + /// + [Newtonsoft.Json.JsonProperty("sub_mch_id")] + [System.Text.Json.Serialization.JsonPropertyName("sub_mch_id")] + public string SubMerhantId { get; set; } = string.Empty; + + /// + /// 获取或设置渠道编号。 + /// + [Newtonsoft.Json.JsonProperty("channel_id")] + [System.Text.Json.Serialization.JsonPropertyName("channel_id")] + public string? ChannelId { get; set; } + + /// + /// 获取或设置子商户全称。 + /// + [Newtonsoft.Json.JsonProperty("merchant_name")] + [System.Text.Json.Serialization.JsonPropertyName("merchant_name")] + public string MerchantName { get; set; } = string.Empty; + + /// + /// 获取或设置子商户简称。 + /// + [Newtonsoft.Json.JsonProperty("merchant_shortname")] + [System.Text.Json.Serialization.JsonPropertyName("merchant_shortname")] + public string MerchantShortName { get; set; } = string.Empty; + + /// + /// 获取或设置商户类型。 + /// + [Newtonsoft.Json.JsonProperty("merchant_type")] + [System.Text.Json.Serialization.JsonPropertyName("merchant_type")] + public string MerchantType { get; set; } = string.Empty; + + /// + /// 获取或设置业务类目编码。 + /// + [Newtonsoft.Json.JsonProperty("business_category")] + [System.Text.Json.Serialization.JsonPropertyName("business_category")] + public string BusinessCategoryCode { get; set; } = string.Empty; + + /// + /// 获取或设置商户类别编码。 + /// + [Newtonsoft.Json.JsonProperty("mcc")] + [System.Text.Json.Serialization.JsonPropertyName("mcc")] + public string MerchantCategoryCode { get; set; } = string.Empty; + + /// + /// 获取或设置注册国家或地区代码。 + /// + [Newtonsoft.Json.JsonProperty("merchant_country_code")] + [System.Text.Json.Serialization.JsonPropertyName("merchant_country_code")] + public string CountryCode { get; set; } = string.Empty; + + /// + /// 获取或设置公司注册文件编号。 + /// + [Newtonsoft.Json.JsonProperty("registration_certificate_number")] + [System.Text.Json.Serialization.JsonPropertyName("registration_certificate_number")] + public string RegistrationCertificateNumber { get; set; } = string.Empty; + + /// + /// 获取或设置公司注册文件过期时间字符串(格式:yyyy-MM-dd / PERMANENT)。 + /// + [Newtonsoft.Json.JsonProperty("registration_certificate_date")] + [System.Text.Json.Serialization.JsonPropertyName("registration_certificate_date")] + public string RegistrationCertificateDateString { get; set; } = string.Empty; + + /// + /// 获取或设置公司注册文件照片 MediaId。 + /// + [Newtonsoft.Json.JsonProperty("registration_certificate_copy")] + [System.Text.Json.Serialization.JsonPropertyName("registration_certificate_copy")] + public string? RegistrationCertificatePictureMediaId { get; set; } + + /// + /// 获取或设置业务类型。 + /// + [Newtonsoft.Json.JsonProperty("business_type")] + [System.Text.Json.Serialization.JsonPropertyName("business_type")] + public string BusinessType { get; set; } = string.Empty; + + /// + /// 获取或设置 App 下载链接。 + /// + [Newtonsoft.Json.JsonProperty("app_download")] + [System.Text.Json.Serialization.JsonPropertyName("app_download")] + public string? AppDownloadUrl { get; set; } + + /// + /// 获取或设置业务网站地址。 + /// + [Newtonsoft.Json.JsonProperty("business_website")] + [System.Text.Json.Serialization.JsonPropertyName("business_website")] + public string? BusinessWebsiteUrl { get; set; } + + /// + /// 获取或设置公众号 AppId。 + /// + [Newtonsoft.Json.JsonProperty("office_account")] + [System.Text.Json.Serialization.JsonPropertyName("office_account")] + public string? OfficeAccountAppId { get; set; } + + /// + /// 获取或设置小程序 AppId。 + /// + [Newtonsoft.Json.JsonProperty("mini_program")] + [System.Text.Json.Serialization.JsonPropertyName("mini_program")] + public string? MiniProgramAppId { get; set; } + + /// + /// 获取或设置门店地址。 + /// + [Newtonsoft.Json.JsonProperty("store_address")] + [System.Text.Json.Serialization.JsonPropertyName("store_address")] + public string? StoreAddress { get; set; } + + /// + /// 获取或设置门店照片 MediaId 列表。 + /// + [Newtonsoft.Json.JsonProperty("store_photos")] + [Newtonsoft.Json.JsonConverter(typeof(Converters.RequestPropertyStorePhotoMediaIdListNewtonsoftJsonConverter))] + [System.Text.Json.Serialization.JsonPropertyName("store_photos")] + [System.Text.Json.Serialization.JsonConverter(typeof(Converters.RequestPropertyStorePhotoMediaIdListSystemTextJsonConverter))] + public IList? StorePhotoMediaIdList { get; set; } + + /// + /// 获取或设置董事姓名。 + /// + [Newtonsoft.Json.JsonProperty("director_name")] + [System.Text.Json.Serialization.JsonPropertyName("director_name")] + public string? DirectorName { get; set; } + + /// + /// 获取或设置董事证件号码。 + /// + [Newtonsoft.Json.JsonProperty("director_id_number")] + [System.Text.Json.Serialization.JsonPropertyName("director_id_number")] + public string? DirectorIdNumber { get; set; } + + /// + /// 获取或设置负责人姓名。 + /// + [Newtonsoft.Json.JsonProperty("principal_name")] + [System.Text.Json.Serialization.JsonPropertyName("principal_name")] + public string? PrincipalName { get; set; } + + /// + /// 获取或设置负责人证件号。 + /// + [Newtonsoft.Json.JsonProperty("principal_id_number")] + [System.Text.Json.Serialization.JsonPropertyName("principal_id_number")] + public string? PrincipalIdNumber { get; set; } + + /// + /// 获取或设置公司电话。 + /// + [Newtonsoft.Json.JsonProperty("office_phone")] + [System.Text.Json.Serialization.JsonPropertyName("office_phone")] + public string? OfficePhoneNumber { get; set; } + + /// + /// 获取或设置联系人姓名。 + /// + [Newtonsoft.Json.JsonProperty("contact_name")] + [System.Text.Json.Serialization.JsonPropertyName("contact_name")] + public string? ContactName { get; set; } + + /// + /// 获取或设置联系人电话号码。 + /// + [Newtonsoft.Json.JsonProperty("contact_phone")] + [System.Text.Json.Serialization.JsonPropertyName("contact_phone")] + public string? ContactPhotoNumber { get; set; } + + /// + /// 获取或设置联系人邮箱。 + /// + [Newtonsoft.Json.JsonProperty("contact_email")] + [System.Text.Json.Serialization.JsonPropertyName("contact_email")] + public string? ContactEmail { get; set; } + + /// + /// 获取或设置子商户结算银行账户 。 + /// + [Newtonsoft.Json.JsonProperty("settlement_bank_number")] + [System.Text.Json.Serialization.JsonPropertyName("settlement_bank_number")] + public string? SettlementBankNumber { get; set; } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV2/Models/MerchantInstitutionSub/ModifySubMerchantInstitutionResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV2/Models/MerchantInstitutionSub/ModifySubMerchantInstitutionResponse.cs new file mode 100644 index 00000000..45910ccc --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV2/Models/MerchantInstitutionSub/ModifySubMerchantInstitutionResponse.cs @@ -0,0 +1,29 @@ +namespace SKIT.FlurlHttpClient.Wechat.TenpayV2.Models +{ + /// + /// 表示 [POST] /secapi/mch/modifyInstitutionsub 接口的响应。 + /// + public class ModifySubMerchantInstitutionResponse : WechatTenpaySignableResponse + { + /// + /// (请忽略此字段) + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public override string? MerchantId { get; set; } + + /// + /// (请忽略此字段) + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public override string? AppId { get; set; } + + /// + /// 获取或设置子商户号。 + /// + [Newtonsoft.Json.JsonProperty("sub_mch_id")] + [System.Text.Json.Serialization.JsonPropertyName("sub_mch_id")] + public string SubMerhantId { get; set; } = default!; + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV2/Models/MerchantMedia/UploadMerchantMediaRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV2/Models/MerchantMedia/UploadMerchantMediaRequest.cs new file mode 100644 index 00000000..8b411896 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV2/Models/MerchantMedia/UploadMerchantMediaRequest.cs @@ -0,0 +1,43 @@ +namespace SKIT.FlurlHttpClient.Wechat.TenpayV2.Models +{ + /// + /// 表示 [POST] /secapi/mch/uploadmedia 接口的请求。 + /// + public class UploadMerchantMediaRequest : WechatTenpayRequest + { + /// + /// (请忽略此字段) + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public override string? MerchantId { get; set; } + + /// + /// (请忽略此字段) + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public override string? AppId { get; set; } + + /// + /// 获取或设置任务上传字节数组。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public byte[] FileBytes { get; set; } = new byte[0]; + + /// + /// 获取或设置任务上传文件名。如果不指定将由系统自动生成。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string? FileName { get; set; } + + /// + /// 获取或设置任务上传文件摘要。如果不指定将由系统自动生成。 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public string? FileHash { get; set; } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV2/Models/MerchantMedia/UploadMerchantMediaResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV2/Models/MerchantMedia/UploadMerchantMediaResponse.cs new file mode 100644 index 00000000..3ace22d9 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV2/Models/MerchantMedia/UploadMerchantMediaResponse.cs @@ -0,0 +1,29 @@ +namespace SKIT.FlurlHttpClient.Wechat.TenpayV2.Models +{ + /// + /// 表示 [POST] /secapi/mch/uploadmedia 接口的响应。 + /// + public class UploadMerchantMediaResponse : WechatTenpaySignableResponse + { + /// + /// (请忽略此字段) + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public override string? MerchantId { get; set; } + + /// + /// (请忽略此字段) + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public override string? AppId { get; set; } + + /// + /// 获取或设置媒体标识 ID。 + /// + [Newtonsoft.Json.JsonProperty("media_id")] + [System.Text.Json.Serialization.JsonPropertyName("media_id")] + public string MediaId { get; set; } = default!; + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV2/Models/PAP/Contract/GetPAPPayContractRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV2/Models/PAP/Contract/GetPAPPayContractRequest.cs index 060d88d8..b4ffc56e 100644 --- a/src/SKIT.FlurlHttpClient.Wechat.TenpayV2/Models/PAP/Contract/GetPAPPayContractRequest.cs +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV2/Models/PAP/Contract/GetPAPPayContractRequest.cs @@ -1,6 +1,4 @@ -using System; - -namespace SKIT.FlurlHttpClient.Wechat.TenpayV2.Models +namespace SKIT.FlurlHttpClient.Wechat.TenpayV2.Models { /// /// 表示 [POST] /papay/querycontract 接口的请求。 diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV2/Models/PAP/CreatePAPPayH5EntrustWebResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV2/Models/PAP/CreatePAPPayH5EntrustWebResponse.cs index 566a74f0..a88ab692 100644 --- a/src/SKIT.FlurlHttpClient.Wechat.TenpayV2/Models/PAP/CreatePAPPayH5EntrustWebResponse.cs +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV2/Models/PAP/CreatePAPPayH5EntrustWebResponse.cs @@ -6,14 +6,14 @@ public class CreatePAPPayH5EntrustWebResponse : WechatTenpaySignableResponse { /// - /// + /// (请忽略此字段) /// [Newtonsoft.Json.JsonIgnore] [System.Text.Json.Serialization.JsonIgnore] public override string? MerchantId { get; set; } /// - /// + /// (请忽略此字段) /// [Newtonsoft.Json.JsonIgnore] [System.Text.Json.Serialization.JsonIgnore] diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV2/Models/PAP/CreatePAPPayPreEntrustWebResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV2/Models/PAP/CreatePAPPayPreEntrustWebResponse.cs index a02bb1f1..3c6f6e26 100644 --- a/src/SKIT.FlurlHttpClient.Wechat.TenpayV2/Models/PAP/CreatePAPPayPreEntrustWebResponse.cs +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV2/Models/PAP/CreatePAPPayPreEntrustWebResponse.cs @@ -1,6 +1,4 @@ -using System; - -namespace SKIT.FlurlHttpClient.Wechat.TenpayV2.Models +namespace SKIT.FlurlHttpClient.Wechat.TenpayV2.Models { /// /// 表示 [POST] /papay/preentrustweb 接口的响应。 diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV2/Models/Pay/Bill/DownloadPayBillResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV2/Models/Pay/Bill/DownloadPayBillResponse.cs index ba27bc7d..cc462089 100644 --- a/src/SKIT.FlurlHttpClient.Wechat.TenpayV2/Models/Pay/Bill/DownloadPayBillResponse.cs +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV2/Models/Pay/Bill/DownloadPayBillResponse.cs @@ -6,14 +6,14 @@ public class DownloadPayBillResponse : WechatTenpaySignableResponse { /// - /// + /// (请忽略此字段) /// [Newtonsoft.Json.JsonIgnore] [System.Text.Json.Serialization.JsonIgnore] public override string? MerchantId { get; set; } /// - /// + /// (请忽略此字段) /// [Newtonsoft.Json.JsonIgnore] [System.Text.Json.Serialization.JsonIgnore] diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV2/Models/Pay/Bill/DownloadPayFundFlowResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV2/Models/Pay/Bill/DownloadPayFundFlowResponse.cs index 28dec86f..2c507857 100644 --- a/src/SKIT.FlurlHttpClient.Wechat.TenpayV2/Models/Pay/Bill/DownloadPayFundFlowResponse.cs +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV2/Models/Pay/Bill/DownloadPayFundFlowResponse.cs @@ -6,14 +6,14 @@ public class DownloadPayFundFlowResponse : WechatTenpaySignableResponse { /// - /// + /// (请忽略此字段) /// [Newtonsoft.Json.JsonIgnore] [System.Text.Json.Serialization.JsonIgnore] public override string? MerchantId { get; set; } /// - /// + /// (请忽略此字段) /// [Newtonsoft.Json.JsonIgnore] [System.Text.Json.Serialization.JsonIgnore] diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV2/Models/PayITIL/SubmitPayITILReportResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV2/Models/PayITIL/SubmitPayITILReportResponse.cs index 5d1302ab..655d1138 100644 --- a/src/SKIT.FlurlHttpClient.Wechat.TenpayV2/Models/PayITIL/SubmitPayITILReportResponse.cs +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV2/Models/PayITIL/SubmitPayITILReportResponse.cs @@ -6,14 +6,14 @@ public class SubmitPayITILReportResponse : WechatTenpaySignableResponse { /// - /// + /// (请忽略此字段) /// [Newtonsoft.Json.JsonIgnore] [System.Text.Json.Serialization.JsonIgnore] public override string? MerchantId { get; set; } /// - /// + /// (请忽略此字段) /// [Newtonsoft.Json.JsonIgnore] [System.Text.Json.Serialization.JsonIgnore] diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV2/Models/PayServicePartnerTransfers/CreatePayServicePartnerTransfersPayToBankRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV2/Models/PayServicePartnerTransfers/CreatePayServicePartnerTransfersPayToBankRequest.cs index 23bb3192..607bbad0 100644 --- a/src/SKIT.FlurlHttpClient.Wechat.TenpayV2/Models/PayServicePartnerTransfers/CreatePayServicePartnerTransfersPayToBankRequest.cs +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV2/Models/PayServicePartnerTransfers/CreatePayServicePartnerTransfersPayToBankRequest.cs @@ -13,7 +13,7 @@ public override string? MerchantId { get; set; } /// - /// + /// (请忽略此字段) /// [Newtonsoft.Json.JsonIgnore] [System.Text.Json.Serialization.JsonIgnore] diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV2/Models/PayServicePartnerTransfers/CreatePayServicePartnerTransfersPayToBankResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV2/Models/PayServicePartnerTransfers/CreatePayServicePartnerTransfersPayToBankResponse.cs index 7b1f4b26..bcfad0e4 100644 --- a/src/SKIT.FlurlHttpClient.Wechat.TenpayV2/Models/PayServicePartnerTransfers/CreatePayServicePartnerTransfersPayToBankResponse.cs +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV2/Models/PayServicePartnerTransfers/CreatePayServicePartnerTransfersPayToBankResponse.cs @@ -13,7 +13,7 @@ public override string? MerchantId { get; set; } /// - /// + /// (请忽略此字段) /// [Newtonsoft.Json.JsonIgnore] [System.Text.Json.Serialization.JsonIgnore] diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV2/Models/PayServicePartnerTransfers/GetPayServicePartnerTransfersPayToBankInfoRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV2/Models/PayServicePartnerTransfers/GetPayServicePartnerTransfersPayToBankInfoRequest.cs index 1b04080d..acd0566a 100644 --- a/src/SKIT.FlurlHttpClient.Wechat.TenpayV2/Models/PayServicePartnerTransfers/GetPayServicePartnerTransfersPayToBankInfoRequest.cs +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV2/Models/PayServicePartnerTransfers/GetPayServicePartnerTransfersPayToBankInfoRequest.cs @@ -13,7 +13,7 @@ public override string? MerchantId { get; set; } /// - /// + /// (请忽略此字段) /// [Newtonsoft.Json.JsonIgnore] [System.Text.Json.Serialization.JsonIgnore] diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV2/Models/PayServicePartnerTransfers/GetPayServicePartnerTransfersPayToBankInfoResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV2/Models/PayServicePartnerTransfers/GetPayServicePartnerTransfersPayToBankInfoResponse.cs index 1ee5746c..a37e9991 100644 --- a/src/SKIT.FlurlHttpClient.Wechat.TenpayV2/Models/PayServicePartnerTransfers/GetPayServicePartnerTransfersPayToBankInfoResponse.cs +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV2/Models/PayServicePartnerTransfers/GetPayServicePartnerTransfersPayToBankInfoResponse.cs @@ -15,7 +15,7 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV2.Models public override string? MerchantId { get; set; } /// - /// + /// (请忽略此字段) /// [Newtonsoft.Json.JsonIgnore] [System.Text.Json.Serialization.JsonIgnore] diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV2/Models/Risk/QueryRiskViolationRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV2/Models/Risk/QueryRiskViolationRequest.cs index 238fc433..9a286a5c 100644 --- a/src/SKIT.FlurlHttpClient.Wechat.TenpayV2/Models/Risk/QueryRiskViolationRequest.cs +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV2/Models/Risk/QueryRiskViolationRequest.cs @@ -15,7 +15,7 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV2.Models public override string? MerchantId { get; set; } /// - /// + /// (请忽略此字段) /// [Newtonsoft.Json.JsonIgnore] [System.Text.Json.Serialization.JsonIgnore] diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV2/Models/Risk/QueryRiskViolationResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV2/Models/Risk/QueryRiskViolationResponse.cs index 9591e432..150ceac0 100644 --- a/src/SKIT.FlurlHttpClient.Wechat.TenpayV2/Models/Risk/QueryRiskViolationResponse.cs +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV2/Models/Risk/QueryRiskViolationResponse.cs @@ -86,14 +86,14 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV2.Models } /// - /// + /// (请忽略此字段) /// [Newtonsoft.Json.JsonIgnore] [System.Text.Json.Serialization.JsonIgnore] public override string? MerchantId { get; set; } /// - /// + /// (请忽略此字段) /// [Newtonsoft.Json.JsonIgnore] [System.Text.Json.Serialization.JsonIgnore] diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV2/Models/SubMerchant/AddSubMerchantDevelopConfigResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV2/Models/SubMerchant/AddSubMerchantDevelopConfigResponse.cs index 0a36c503..0b68ce60 100644 --- a/src/SKIT.FlurlHttpClient.Wechat.TenpayV2/Models/SubMerchant/AddSubMerchantDevelopConfigResponse.cs +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV2/Models/SubMerchant/AddSubMerchantDevelopConfigResponse.cs @@ -6,14 +6,14 @@ public class AddSubMerchantDevelopConfigResponse : WechatTenpaySignableResponse { /// - /// + /// (请忽略此字段) /// [Newtonsoft.Json.JsonIgnore] [System.Text.Json.Serialization.JsonIgnore] public override string? MerchantId { get; set; } /// - /// + /// (请忽略此字段) /// [Newtonsoft.Json.JsonIgnore] [System.Text.Json.Serialization.JsonIgnore] diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV2/Models/SubMerchant/GetSubMerchantDevelopConfigResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV2/Models/SubMerchant/GetSubMerchantDevelopConfigResponse.cs index 2169fbbe..7b68ade5 100644 --- a/src/SKIT.FlurlHttpClient.Wechat.TenpayV2/Models/SubMerchant/GetSubMerchantDevelopConfigResponse.cs +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV2/Models/SubMerchant/GetSubMerchantDevelopConfigResponse.cs @@ -65,14 +65,14 @@ } /// - /// + /// (请忽略此字段) /// [Newtonsoft.Json.JsonIgnore] [System.Text.Json.Serialization.JsonIgnore] public override string? MerchantId { get; set; } /// - /// + /// (请忽略此字段) /// [Newtonsoft.Json.JsonIgnore] [System.Text.Json.Serialization.JsonIgnore] diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV2/Models/VehiclePartner/GetVehiclePartnerPayStateRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV2/Models/VehiclePartner/GetVehiclePartnerPayStateRequest.cs index 0e8894cc..f2821eff 100644 --- a/src/SKIT.FlurlHttpClient.Wechat.TenpayV2/Models/VehiclePartner/GetVehiclePartnerPayStateRequest.cs +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV2/Models/VehiclePartner/GetVehiclePartnerPayStateRequest.cs @@ -1,6 +1,4 @@ -using System; - -namespace SKIT.FlurlHttpClient.Wechat.TenpayV2.Models +namespace SKIT.FlurlHttpClient.Wechat.TenpayV2.Models { /// /// 表示 [POST] /vehicle/partnerpay/querystate 接口的请求。 diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV2/Properties/AssemblyInfo.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV2/Properties/AssemblyInfo.cs index 0b90f6d6..f51506be 100644 --- a/src/SKIT.FlurlHttpClient.Wechat.TenpayV2/Properties/AssemblyInfo.cs +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV2/Properties/AssemblyInfo.cs @@ -1,3 +1,3 @@ using System.Runtime.CompilerServices; -[assembly: InternalsVisibleTo("SKIT.FlurlHttpClient.Wechat.TenpayV2.UnitTests")] \ No newline at end of file +[assembly: InternalsVisibleTo("SKIT.FlurlHttpClient.Wechat.TenpayV2.UnitTests")] \ No newline at end of file diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV2/Utilities/Internal/RequestSigner.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV2/Utilities/Internal/RequestSigner.cs index 67ade4c9..ed62d748 100644 --- a/src/SKIT.FlurlHttpClient.Wechat.TenpayV2/Utilities/Internal/RequestSigner.cs +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV2/Utilities/Internal/RequestSigner.cs @@ -6,7 +6,7 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV2.Utilities { internal static class RequestSigner { - public static string Sign(IDictionary paramsMap, string secret, string? signType) + public static string Sign(IDictionary paramsMap, string secret, string? signType = null) { if (paramsMap == null) throw new ArgumentNullException(nameof(paramsMap)); @@ -15,12 +15,12 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV2.Utilities return SignFromSortedQueryString(sortedQueryString, secret, signType); } - public static string SignFromJson(string json, string secret, string? signType) + public static string SignFromJson(string json, string secret, string? signType = null) { return SignFromSortedQueryString(JsonUtility.ParseToSortedQueryString(json), secret, signType); } - public static string SignFromSortedQueryString(string queryString, string secret, string? signType) + public static string SignFromSortedQueryString(string queryString, string secret, string? signType = null) { signType = signType ?? Constants.SignTypes.MD5; queryString = queryString + $"&key={secret}"; diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV2/WechatTenpayClient.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV2/WechatTenpayClient.cs index 70fb0dff..99c53783 100644 --- a/src/SKIT.FlurlHttpClient.Wechat.TenpayV2/WechatTenpayClient.cs +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV2/WechatTenpayClient.cs @@ -118,6 +118,30 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV2 return flurlRequest; } + /// + /// 异步发起请求。 + /// + /// + /// + /// + /// + /// + public async Task SendRequestAsync(IFlurlRequest flurlRequest, HttpContent? httpContent = null, CancellationToken cancellationToken = default) + where T : WechatTenpayResponse, new() + { + if (flurlRequest == null) throw new ArgumentNullException(nameof(flurlRequest)); + + try + { + using IFlurlResponse flurlResponse = await base.SendRequestAsync(flurlRequest, httpContent, cancellationToken); + return await WrapResponseWithJsonAsync(flurlResponse, cancellationToken); + } + catch (FlurlHttpException ex) + { + throw new WechatTenpayException(ex.Message, ex); + } + } + /// /// 异步发起请求。 /// @@ -148,8 +172,7 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV2 string xml = Utilities.XmlUtility.ConvertFromJson(json); using HttpContent httpContent = new StringContent(xml, Encoding.UTF8, "text/xml"); - using IFlurlResponse flurlResponse = await base.SendRequestAsync(flurlRequest, httpContent, cancellationToken); - return await WrapResponseWithXmlAsync(flurlResponse, cancellationToken); + return await SendRequestAsync(flurlRequest, httpContent: httpContent, cancellationToken); } } catch (FlurlHttpException ex) diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV2.UnitTests/ModelSamples/MerchantInstitutionSub/AddSubMerchantInstitutionRequest.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV2.UnitTests/ModelSamples/MerchantInstitutionSub/AddSubMerchantInstitutionRequest.json new file mode 100644 index 00000000..e36118b4 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV2.UnitTests/ModelSamples/MerchantInstitutionSub/AddSubMerchantInstitutionRequest.json @@ -0,0 +1,23 @@ +{ + "app_id": "wx2421b1c4370ec43b", + "mch_id": "1230000109", + "sign": "C47005DF5722D862EFF30E7B8964AE17", + "merchant_name": "ABC Merchant", + "merchant_shortname": "ABC", + "merchant_remark": "202012041", + "merchant_country_code": "036", + "merchant_type": "ENTERPRISE", + "business_category": "485", + "mcc": "4374", + "registration_certificate_number": "5555-8888", + "registration_certificate_date": "2020-05-27", + "registration_certificate_copy": "-x95m5iclsanHYauUt1__DsWXok2NqRliv2SDL42QoEmHIPs", + "business_type": "BOTH", + "mini_program": "Flower Plus", + "store_address": "First Street", + "office_phone": "+8602767883714", + "contact_name": "bob", + "contact_phone": "+8618688886666", + "contact_email": "test@163.com", + "settlement_bank_number": "55558888" +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV2.UnitTests/ModelSamples/MerchantInstitutionSub/AddSubMerchantInstitutionResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV2.UnitTests/ModelSamples/MerchantInstitutionSub/AddSubMerchantInstitutionResponse.json new file mode 100644 index 00000000..dde0bea3 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV2.UnitTests/ModelSamples/MerchantInstitutionSub/AddSubMerchantInstitutionResponse.json @@ -0,0 +1,7 @@ +{ + "return_code": "SUCCESS", + "return_msg": "OK", + "result_code": "SUCCESS", + "sign": "C380BEC2BFD727A4B6845133519F3AD6", + "sub_mch_id": "013467007045764" +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV2.UnitTests/ModelSamples/MerchantInstitutionSub/GetSubMerchantInstitutionRequest.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV2.UnitTests/ModelSamples/MerchantInstitutionSub/GetSubMerchantInstitutionRequest.json new file mode 100644 index 00000000..f71d0aaa --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV2.UnitTests/ModelSamples/MerchantInstitutionSub/GetSubMerchantInstitutionRequest.json @@ -0,0 +1,6 @@ +{ + "app_id": "wx2421b1c4370ec43b", + "mch_id": "1230000109", + "sign": "C380BEC2BFD727A4B6845133519F3AD6", + "sub_mch_id": "1230000109" +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV2.UnitTests/ModelSamples/MerchantInstitutionSub/GetSubMerchantInstitutionResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV2.UnitTests/ModelSamples/MerchantInstitutionSub/GetSubMerchantInstitutionResponse.json new file mode 100644 index 00000000..e9ca788a --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV2.UnitTests/ModelSamples/MerchantInstitutionSub/GetSubMerchantInstitutionResponse.json @@ -0,0 +1,16 @@ +{ + "return_code": "SUCCESS", + "return_msg": "OK", + "result_code": "SUCCESS", + "sign": "C380BEC2BFD727A4B6845133519F3AD6", + "sub_mch_id": "013467007045764", + "merchant_name": "ABC Merchant", + "merchant_shortname": "ABC", + "office_phone": "075586010000", + "contact_name": "Eric Lee", + "contact_phone": "13000000000", + "contact_email": "test@xxx.com", + "business_category": "101", + "merchant_remark": "ABC1234567", + "business_website": "http://abc.com" +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV2.UnitTests/ModelSamples/MerchantInstitutionSub/ModifySubMerchantInstitutionRequest.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV2.UnitTests/ModelSamples/MerchantInstitutionSub/ModifySubMerchantInstitutionRequest.json new file mode 100644 index 00000000..303aed52 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV2.UnitTests/ModelSamples/MerchantInstitutionSub/ModifySubMerchantInstitutionRequest.json @@ -0,0 +1,23 @@ +{ + "app_id": "wx2421b1c4370ec43b", + "mch_id": "1230000109", + "sub_mch_id": "013467007045764", + "sign": "C47005DF5722D862EFF30E7B8964AE17", + "merchant_name": "ABC Merchant", + "merchant_shortname": "ABC", + "merchant_country_code": "036", + "merchant_type": "ENTERPRISE", + "business_category": "485", + "mcc": "4374", + "registration_certificate_number": "5555-8888", + "registration_certificate_date": "2020-05-27", + "registration_certificate_copy": "-x95m5iclsanHYauUt1", + "business_type": "BOTH", + "mini_program": "Flower Plus", + "store_address": "First Street", + "office_phone": "+8602767883714", + "contact_name": "bob", + "contact_phone": "+8618688886666", + "contact_email": "test@163.com", + "settlement_bank_number": "55558888" +} \ No newline at end of file diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV2.UnitTests/ModelSamples/MerchantInstitutionSub/ModifySubMerchantInstitutionResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV2.UnitTests/ModelSamples/MerchantInstitutionSub/ModifySubMerchantInstitutionResponse.json new file mode 100644 index 00000000..dde0bea3 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV2.UnitTests/ModelSamples/MerchantInstitutionSub/ModifySubMerchantInstitutionResponse.json @@ -0,0 +1,7 @@ +{ + "return_code": "SUCCESS", + "return_msg": "OK", + "result_code": "SUCCESS", + "sign": "C380BEC2BFD727A4B6845133519F3AD6", + "sub_mch_id": "013467007045764" +} \ No newline at end of file