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