diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientExecutePasswordExemptContractExtensions.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientExecutePasswordExemptContractExtensions.cs
new file mode 100644
index 00000000..5f3d1aa3
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientExecutePasswordExemptContractExtensions.cs
@@ -0,0 +1,143 @@
+using System;
+using System.Net.Http;
+using System.Threading;
+using System.Threading.Tasks;
+using Flurl.Http;
+
+namespace SKIT.FlurlHttpClient.Wechat.TenpayV3
+{
+ public static class WechatTenpayClientExecutePasswordExemptContractExtensions
+ {
+ ///
+ /// 异步调用 [POST] /password-exempt-contract/contracts/qs/pre-entrust-sign/mini-program 接口。
+ ///
+ /// REF:
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ public static async Task ExecutePresignPasswordExemptContractQsEntrustMiniProgramAsync(this WechatTenpayClient client, Models.PresignPasswordExemptContractQsEntrustMiniProgramRequest 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
+ .CreateFlurlRequest(request, HttpMethod.Post, "password-exempt-contract", "contracts", "qs", "pre-entrust-sign", "mini-program");
+
+ return await client.SendFlurlRequestAsJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken).ConfigureAwait(false);
+ }
+
+ ///
+ /// 异步调用 [POST] /password-exempt-contract/contracts/qs/pre-entrust-sign/pay-redirect-sign 接口。
+ ///
+ /// REF:
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ public static async Task ExecutePresignPasswordExemptContractQsEntrustPayRedirectSignAsync(this WechatTenpayClient client, Models.PresignPasswordExemptContractQsEntrustPayRedirectSignRequest 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
+ .CreateFlurlRequest(request, HttpMethod.Post, "password-exempt-contract", "contracts", "qs", "pre-entrust-sign", "pay-redirect-sign");
+
+ return await client.SendFlurlRequestAsJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken).ConfigureAwait(false);
+ }
+
+ ///
+ /// 异步调用 [POST] /password-exempt-contract/contracts/service-provider/pre-entrust-sign/mini-program 接口。
+ ///
+ /// REF:
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ public static async Task ExecutePresignPasswordExemptContractServiceProviderEntrustMiniProgramAsync(this WechatTenpayClient client, Models.PresignPasswordExemptContractServiceProviderEntrustMiniProgramRequest 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
+ .CreateFlurlRequest(request, HttpMethod.Post, "password-exempt-contract", "contracts", "service-provider", "pre-entrust-sign", "mini-program");
+
+ return await client.SendFlurlRequestAsJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken).ConfigureAwait(false);
+ }
+
+ ///
+ /// 异步调用 [POST] /password-exempt-contract/contracts/service-provider/pre-entrust-sign/pay-redirect-sign 接口。
+ ///
+ /// REF:
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ public static async Task ExecutePresignPasswordExemptContractServiceProviderEntrustPayRedirectSignAsync(this WechatTenpayClient client, Models.PresignPasswordExemptContractServiceProviderEntrustPayRedirectSignRequest 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
+ .CreateFlurlRequest(request, HttpMethod.Post, "password-exempt-contract", "contracts", "service-provider", "pre-entrust-sign", "pay-redirect-sign");
+
+ return await client.SendFlurlRequestAsJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken).ConfigureAwait(false);
+ }
+
+ ///
+ /// 异步调用 [GET] /password-exempt-contract/contracts/service-id/{service_id}/out-contract-code/{out_contract_code} 接口。
+ ///
+ /// REF:
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ public static async Task ExecuteGetPasswordExemptContractByOutContractCodeAsync(this WechatTenpayClient client, Models.GetPasswordExemptContractByOutContractCodeRequest 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
+ .CreateFlurlRequest(request, HttpMethod.Get, "password-exempt-contract", "contracts", "service-id", request.ServiceId, "out-contract-code", request.OutContractCode);
+
+ return await client.SendFlurlRequestAsJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken).ConfigureAwait(false);
+ }
+
+ ///
+ /// 异步调用 [POST] /password-exempt-contract/contracts/service-id/{service_id}/out-contract-code/{out_contract_code}/terminate 接口。
+ ///
+ /// REF:
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ public static async Task ExecuteTerminatePasswordExemptContractAsync(this WechatTenpayClient client, Models.TerminatePasswordExemptContractRequest 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
+ .CreateFlurlRequest(request, HttpMethod.Post, "password-exempt-contract", "contracts", "service-id", request.ServiceId, "out-contract-code", request.OutContractCode, "terminate");
+
+ return await client.SendFlurlRequestAsJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken).ConfigureAwait(false);
+ }
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/PasswordExemptContract/GetPasswordExemptContractByOutContractCodeRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/PasswordExemptContract/GetPasswordExemptContractByOutContractCodeRequest.cs
new file mode 100644
index 00000000..fe12c641
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/PasswordExemptContract/GetPasswordExemptContractByOutContractCodeRequest.cs
@@ -0,0 +1,22 @@
+namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models
+{
+ ///
+ /// 表示 [GET] /password-exempt-contract/contracts/service-id/{service_id}/out-contract-code/{out_contract_code} 接口的请求。
+ ///
+ public class GetPasswordExemptContractByOutContractCodeRequest : WechatTenpayRequest
+ {
+ ///
+ /// 获取或设置服务 ID。
+ ///
+ [Newtonsoft.Json.JsonIgnore]
+ [System.Text.Json.Serialization.JsonIgnore]
+ public string ServiceId { get; set; } = string.Empty;
+
+ ///
+ /// 获取或设置商户签约协议号。
+ ///
+ [Newtonsoft.Json.JsonIgnore]
+ [System.Text.Json.Serialization.JsonIgnore]
+ public string OutContractCode { get; set; } = string.Empty;
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/PasswordExemptContract/GetPasswordExemptContractByOutContractCodeResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/PasswordExemptContract/GetPasswordExemptContractByOutContractCodeResponse.cs
new file mode 100644
index 00000000..95884f1a
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/PasswordExemptContract/GetPasswordExemptContractByOutContractCodeResponse.cs
@@ -0,0 +1,127 @@
+using System;
+
+namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models
+{
+ ///
+ /// 表示 [GET] /password-exempt-contract/contracts/service-id/{service_id}/out-contract-code/{out_contract_code} 接口的响应。
+ ///
+ public class GetPasswordExemptContractByOutContractCodeResponse : WechatTenpayResponse
+ {
+ public static class Types
+ {
+ public class Termination
+ {
+ ///
+ /// 获取或设置解约方式。
+ ///
+ [Newtonsoft.Json.JsonProperty("contract_termination_mode")]
+ [System.Text.Json.Serialization.JsonPropertyName("contract_termination_mode")]
+ public string TerminationMode { get; set; } = default!;
+
+ ///
+ /// 获取或设置解约时间。
+ ///
+ [Newtonsoft.Json.JsonProperty("contract_terminated_time")]
+ [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.Common.Rfc3339DateTimeOffsetConverter))]
+ [System.Text.Json.Serialization.JsonPropertyName("contract_terminated_time")]
+ [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Serialization.Common.Rfc3339DateTimeOffsetConverter))]
+ public DateTimeOffset? TerminateTime { get; set; }
+
+ ///
+ /// 获取或设置解约备注。
+ ///
+ [Newtonsoft.Json.JsonProperty("contract_termination_remark")]
+ [System.Text.Json.Serialization.JsonPropertyName("contract_termination_remark")]
+ public string? TerminationRemark { get; set; }
+ }
+ }
+
+ ///
+ /// 获取或设置微信商户号。
+ ///
+ [Newtonsoft.Json.JsonProperty("mchid")]
+ [System.Text.Json.Serialization.JsonPropertyName("mchid")]
+ public string MerchantId { get; set; } = default!;
+
+ ///
+ /// 获取或设置微信 AppId。
+ ///
+ [Newtonsoft.Json.JsonProperty("appid")]
+ [System.Text.Json.Serialization.JsonPropertyName("appid")]
+ public string AppId { get; set; } = default!;
+
+ ///
+ /// 获取或设置子商户 AppId。
+ ///
+ [Newtonsoft.Json.JsonProperty("sub_appid")]
+ [System.Text.Json.Serialization.JsonPropertyName("sub_appid")]
+ public string? SubAppId { get; set; }
+
+ ///
+ /// 获取或设置服务 ID。
+ ///
+ [Newtonsoft.Json.JsonProperty("service_id")]
+ [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.Common.NumericalStringConverter))]
+ [System.Text.Json.Serialization.JsonPropertyName("service_id")]
+ [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Serialization.Common.NumericalStringConverter))]
+ public string ServiceId { get; set; } = default!;
+
+ ///
+ /// 获取或设置商户签约协议号。
+ ///
+ [Newtonsoft.Json.JsonProperty("out_contract_code")]
+ [System.Text.Json.Serialization.JsonPropertyName("out_contract_code")]
+ public string OutContractCode { get; set; } = default!;
+
+ ///
+ /// 获取或设置免密支付协议 ID。
+ ///
+ [Newtonsoft.Json.JsonProperty("contract_id")]
+ [System.Text.Json.Serialization.JsonPropertyName("contract_id")]
+ public string ContractId { get; set; } = default!;
+
+ ///
+ /// 获取或设置协议状态。
+ ///
+ [Newtonsoft.Json.JsonProperty("contract_state")]
+ [System.Text.Json.Serialization.JsonPropertyName("contract_state")]
+ public string ContractState { get; set; } = default!;
+
+ ///
+ /// 获取或设置签署时间。
+ ///
+ [Newtonsoft.Json.JsonProperty("contract_signed_time")]
+ [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.Common.Rfc3339DateTimeOffsetConverter))]
+ [System.Text.Json.Serialization.JsonPropertyName("contract_signed_time")]
+ [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Serialization.Common.Rfc3339DateTimeOffsetConverter))]
+ public DateTimeOffset? SignTime { get; set; }
+
+ ///
+ /// 获取或设置用户唯一标识。
+ ///
+ [Newtonsoft.Json.JsonProperty("openid")]
+ [System.Text.Json.Serialization.JsonPropertyName("openid")]
+ public string? OpenId { get; set; }
+
+ ///
+ /// 获取或设置用户在子商户下的唯一标识。
+ ///
+ [Newtonsoft.Json.JsonProperty("sub_openid")]
+ [System.Text.Json.Serialization.JsonPropertyName("sub_openid")]
+ public string? SubOpenId { get; set; } = default!;
+
+ ///
+ /// 获取或设置用户账户展示名称。
+ ///
+ [Newtonsoft.Json.JsonProperty("contract_display_account")]
+ [System.Text.Json.Serialization.JsonPropertyName("contract_display_account")]
+ public string ContractDisplayAccount { get; set; } = default!;
+
+ ///
+ /// 获取或设置解约信息。
+ ///
+ [Newtonsoft.Json.JsonProperty("contract_terminate_info")]
+ [System.Text.Json.Serialization.JsonPropertyName("contract_terminate_info")]
+ public Types.Termination? Termination { get; set; }
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/PasswordExemptContract/PresignPasswordExemptContractQsEntrustMiniProgramRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/PasswordExemptContract/PresignPasswordExemptContractQsEntrustMiniProgramRequest.cs
new file mode 100644
index 00000000..b23f52ed
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/PasswordExemptContract/PresignPasswordExemptContractQsEntrustMiniProgramRequest.cs
@@ -0,0 +1,73 @@
+namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models
+{
+ ///
+ /// 表示 [POST] /password-exempt-contract/contracts/qs/pre-entrust-sign/mini-program 接口的请求。
+ ///
+ public class PresignPasswordExemptContractQsEntrustMiniProgramRequest : WechatTenpayRequest
+ {
+ ///
+ /// 获取或设置子商户号。
+ ///
+ [Newtonsoft.Json.JsonProperty("sub_mchid")]
+ [System.Text.Json.Serialization.JsonPropertyName("sub_mchid")]
+ public string? SubMerchantId { get; set; }
+
+ ///
+ /// 获取或设置微信 AppId。
+ ///
+ [Newtonsoft.Json.JsonProperty("appid")]
+ [System.Text.Json.Serialization.JsonPropertyName("appid")]
+ public string AppId { get; set; } = string.Empty;
+
+ ///
+ /// 获取或设置子商户 AppId。
+ ///
+ [Newtonsoft.Json.JsonProperty("sub_appid")]
+ [System.Text.Json.Serialization.JsonPropertyName("sub_appid")]
+ public string? SubAppId { get; set; }
+
+ ///
+ /// 获取或设置服务 ID。
+ ///
+ [Newtonsoft.Json.JsonProperty("service_id")]
+ [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.Common.NumericalStringConverter))]
+ [System.Text.Json.Serialization.JsonPropertyName("service_id")]
+ [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Serialization.Common.NumericalStringConverter))]
+ public string ServiceId { get; set; } = string.Empty;
+
+ ///
+ /// 获取或设置商户签约协议号。
+ ///
+ [Newtonsoft.Json.JsonProperty("out_contract_code")]
+ [System.Text.Json.Serialization.JsonPropertyName("out_contract_code")]
+ public string OutContractCode { get; set; } = string.Empty;
+
+ ///
+ /// 获取或设置用户唯一标识。
+ ///
+ [Newtonsoft.Json.JsonProperty("openid")]
+ [System.Text.Json.Serialization.JsonPropertyName("openid")]
+ public string? OpenId { get; set; }
+
+ ///
+ /// 获取或设置用户在子商户下的唯一标识。
+ ///
+ [Newtonsoft.Json.JsonProperty("sub_openid")]
+ [System.Text.Json.Serialization.JsonPropertyName("sub_openid")]
+ public string? SubOpenId { get; set; }
+
+ ///
+ /// 获取或设置用户账户展示名称。
+ ///
+ [Newtonsoft.Json.JsonProperty("contract_display_account")]
+ [System.Text.Json.Serialization.JsonPropertyName("contract_display_account")]
+ public string ContractDisplayAccount { get; set; } = string.Empty;
+
+ ///
+ /// 获取或设置回调通知地址。
+ ///
+ [Newtonsoft.Json.JsonProperty("notify_url")]
+ [System.Text.Json.Serialization.JsonPropertyName("notify_url")]
+ public string NotifyUrl { get; set; } = string.Empty;
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/PasswordExemptContract/PresignPasswordExemptContractQsEntrustMiniProgramResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/PasswordExemptContract/PresignPasswordExemptContractQsEntrustMiniProgramResponse.cs
new file mode 100644
index 00000000..580c137e
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/PasswordExemptContract/PresignPasswordExemptContractQsEntrustMiniProgramResponse.cs
@@ -0,0 +1,52 @@
+namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models
+{
+ ///
+ /// 表示 [POST] /password-exempt-contract/contracts/qs/pre-entrust-sign/mini-program 接口的响应。
+ ///
+ public class PresignPasswordExemptContractQsEntrustMiniProgramResponse : WechatTenpayResponse
+ {
+ ///
+ /// 获取或设置预签约会话 ID。
+ ///
+ [Newtonsoft.Json.JsonProperty("pre_entrustweb_id")]
+ [System.Text.Json.Serialization.JsonPropertyName("pre_entrustweb_id")]
+ public string PresignSessionId { get; set; } = default!;
+
+ ///
+ /// 获取或设置跳转小程序 AppId。
+ ///
+ [Newtonsoft.Json.JsonProperty("sign_mp_appid")]
+ [System.Text.Json.Serialization.JsonPropertyName("sign_mp_appid")]
+ public string MiniProgramAppId { get; set; } = default!;
+
+ ///
+ /// 获取或设置跳转小程序页面路径。
+ ///
+ [Newtonsoft.Json.JsonProperty("sign_mp_path")]
+ [System.Text.Json.Serialization.JsonPropertyName("sign_mp_path")]
+ public string MiniProgramPagePath { get; set; } = default!;
+
+ ///
+ /// 获取或设置微信商户号。
+ ///
+ [Newtonsoft.Json.JsonProperty("mchid")]
+ [System.Text.Json.Serialization.JsonPropertyName("mchid")]
+ public string MerchantId { get; set; } = default!;
+
+ ///
+ /// 获取或设置服务 ID。
+ ///
+ [Newtonsoft.Json.JsonProperty("service_id")]
+ [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.Common.NumericalStringConverter))]
+ [System.Text.Json.Serialization.JsonPropertyName("service_id")]
+ [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Serialization.Common.NumericalStringConverter))]
+ public string ServiceId { get; set; } = default!;
+
+ ///
+ /// 获取或设置商户签约协议号。
+ ///
+ [Newtonsoft.Json.JsonProperty("out_contract_code")]
+ [System.Text.Json.Serialization.JsonPropertyName("out_contract_code")]
+ public string OutContractCode { get; set; } = default!;
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/PasswordExemptContract/PresignPasswordExemptContractQsEntrustPayRedirectSignRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/PasswordExemptContract/PresignPasswordExemptContractQsEntrustPayRedirectSignRequest.cs
new file mode 100644
index 00000000..f51fe4eb
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/PasswordExemptContract/PresignPasswordExemptContractQsEntrustPayRedirectSignRequest.cs
@@ -0,0 +1,15 @@
+namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models
+{
+ ///
+ /// 表示 [POST] /password-exempt-contract/contracts/qs/pre-entrust-sign/pay-redirect-sign 接口的请求。
+ ///
+ public class PresignPasswordExemptContractQsEntrustPayRedirectSignRequest : PresignPasswordExemptContractQsEntrustMiniProgramRequest
+ {
+ ///
+ /// 获取或设置预支付交易会话标识。
+ ///
+ [Newtonsoft.Json.JsonProperty("prepay_id")]
+ [System.Text.Json.Serialization.JsonPropertyName("prepay_id")]
+ public string PrepayId { get; set; } = string.Empty;
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/PasswordExemptContract/PresignPasswordExemptContractQsEntrustPayRedirectSignResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/PasswordExemptContract/PresignPasswordExemptContractQsEntrustPayRedirectSignResponse.cs
new file mode 100644
index 00000000..fd4b9950
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/PasswordExemptContract/PresignPasswordExemptContractQsEntrustPayRedirectSignResponse.cs
@@ -0,0 +1,31 @@
+namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models
+{
+ ///
+ /// 表示 [POST] /password-exempt-contract/contracts/qs/pre-entrust-sign/pay-redirect-sign 接口的响应。
+ ///
+ public class PresignPasswordExemptContractQsEntrustPayRedirectSignResponse : WechatTenpayResponse
+ {
+ ///
+ /// 获取或设置微信商户号。
+ ///
+ [Newtonsoft.Json.JsonProperty("mchid")]
+ [System.Text.Json.Serialization.JsonPropertyName("mchid")]
+ public string MerchantId { get; set; } = default!;
+
+ ///
+ /// 获取或设置服务 ID。
+ ///
+ [Newtonsoft.Json.JsonProperty("service_id")]
+ [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.Common.NumericalStringConverter))]
+ [System.Text.Json.Serialization.JsonPropertyName("service_id")]
+ [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Serialization.Common.NumericalStringConverter))]
+ public string ServiceId { get; set; } = default!;
+
+ ///
+ /// 获取或设置商户签约协议号。
+ ///
+ [Newtonsoft.Json.JsonProperty("out_contract_code")]
+ [System.Text.Json.Serialization.JsonPropertyName("out_contract_code")]
+ public string OutContractCode { get; set; } = default!;
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/PasswordExemptContract/PresignPasswordExemptContractServiceProviderEntrustMiniProgramRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/PasswordExemptContract/PresignPasswordExemptContractServiceProviderEntrustMiniProgramRequest.cs
new file mode 100644
index 00000000..4f993ad6
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/PasswordExemptContract/PresignPasswordExemptContractServiceProviderEntrustMiniProgramRequest.cs
@@ -0,0 +1,73 @@
+namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models
+{
+ ///
+ /// 表示 [POST] /password-exempt-contract/contracts/service-provider/pre-entrust-sign/mini-program 接口的请求。
+ ///
+ public class PresignPasswordExemptContractServiceProviderEntrustMiniProgramRequest : WechatTenpayRequest
+ {
+ ///
+ /// 获取或设置子商户号。
+ ///
+ [Newtonsoft.Json.JsonProperty("sub_mchid")]
+ [System.Text.Json.Serialization.JsonPropertyName("sub_mchid")]
+ public string? SubMerchantId { get; set; }
+
+ ///
+ /// 获取或设置微信 AppId。
+ ///
+ [Newtonsoft.Json.JsonProperty("sp_appid")]
+ [System.Text.Json.Serialization.JsonPropertyName("sp_appid")]
+ public string AppId { get; set; } = string.Empty;
+
+ ///
+ /// 获取或设置子商户 AppId。
+ ///
+ [Newtonsoft.Json.JsonProperty("sub_appid")]
+ [System.Text.Json.Serialization.JsonPropertyName("sub_appid")]
+ public string? SubAppId { get; set; }
+
+ ///
+ /// 获取或设置服务 ID。
+ ///
+ [Newtonsoft.Json.JsonProperty("service_id")]
+ [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.Common.NumericalStringConverter))]
+ [System.Text.Json.Serialization.JsonPropertyName("service_id")]
+ [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Serialization.Common.NumericalStringConverter))]
+ public string ServiceId { get; set; } = string.Empty;
+
+ ///
+ /// 获取或设置商户签约协议号。
+ ///
+ [Newtonsoft.Json.JsonProperty("out_contract_code")]
+ [System.Text.Json.Serialization.JsonPropertyName("out_contract_code")]
+ public string OutContractCode { get; set; } = string.Empty;
+
+ ///
+ /// 获取或设置用户唯一标识。
+ ///
+ [Newtonsoft.Json.JsonProperty("sp_openid")]
+ [System.Text.Json.Serialization.JsonPropertyName("sp_openid")]
+ public string? OpenId { get; set; }
+
+ ///
+ /// 获取或设置用户在子商户下的唯一标识。
+ ///
+ [Newtonsoft.Json.JsonProperty("sub_openid")]
+ [System.Text.Json.Serialization.JsonPropertyName("sub_openid")]
+ public string? SubOpenId { get; set; }
+
+ ///
+ /// 获取或设置用户账户展示名称。
+ ///
+ [Newtonsoft.Json.JsonProperty("contract_display_account")]
+ [System.Text.Json.Serialization.JsonPropertyName("contract_display_account")]
+ public string ContractDisplayAccount { get; set; } = string.Empty;
+
+ ///
+ /// 获取或设置回调通知地址。
+ ///
+ [Newtonsoft.Json.JsonProperty("notify_url")]
+ [System.Text.Json.Serialization.JsonPropertyName("notify_url")]
+ public string NotifyUrl { get; set; } = string.Empty;
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/PasswordExemptContract/PresignPasswordExemptContractServiceProviderEntrustMiniProgramResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/PasswordExemptContract/PresignPasswordExemptContractServiceProviderEntrustMiniProgramResponse.cs
new file mode 100644
index 00000000..e0dfea4e
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/PasswordExemptContract/PresignPasswordExemptContractServiceProviderEntrustMiniProgramResponse.cs
@@ -0,0 +1,59 @@
+namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models
+{
+ ///
+ /// 表示 [POST] /password-exempt-contract/contracts/service-provider/pre-entrust-sign/mini-program 接口的响应。
+ ///
+ public class PresignPasswordExemptContractServiceProviderEntrustMiniProgramResponse : WechatTenpayResponse
+ {
+ ///
+ /// 获取或设置预签约会话 ID。
+ ///
+ [Newtonsoft.Json.JsonProperty("pre_entrustweb_id")]
+ [System.Text.Json.Serialization.JsonPropertyName("pre_entrustweb_id")]
+ public string PresignSessionId { get; set; } = default!;
+
+ ///
+ /// 获取或设置跳转小程序 AppId。
+ ///
+ [Newtonsoft.Json.JsonProperty("sign_mp_appid")]
+ [System.Text.Json.Serialization.JsonPropertyName("sign_mp_appid")]
+ public string MiniProgramAppId { get; set; } = default!;
+
+ ///
+ /// 获取或设置跳转小程序页面路径。
+ ///
+ [Newtonsoft.Json.JsonProperty("sign_mp_path")]
+ [System.Text.Json.Serialization.JsonPropertyName("sign_mp_path")]
+ public string MiniProgramPagePath { get; set; } = default!;
+
+ ///
+ /// 获取或设置微信商户号。
+ ///
+ [Newtonsoft.Json.JsonProperty("mchid")]
+ [System.Text.Json.Serialization.JsonPropertyName("mchid")]
+ public string MerchantId { get; set; } = default!;
+
+ ///
+ /// 获取或设置子商户号。
+ ///
+ [Newtonsoft.Json.JsonProperty("sub_mchid")]
+ [System.Text.Json.Serialization.JsonPropertyName("sub_mchid")]
+ public string? SubMerchantId { get; set; }
+
+ ///
+ /// 获取或设置服务 ID。
+ ///
+ [Newtonsoft.Json.JsonProperty("service_id")]
+ [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.Common.NumericalStringConverter))]
+ [System.Text.Json.Serialization.JsonPropertyName("service_id")]
+ [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Serialization.Common.NumericalStringConverter))]
+ public string ServiceId { get; set; } = default!;
+
+ ///
+ /// 获取或设置商户签约协议号。
+ ///
+ [Newtonsoft.Json.JsonProperty("out_contract_code")]
+ [System.Text.Json.Serialization.JsonPropertyName("out_contract_code")]
+ public string OutContractCode { get; set; } = default!;
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/PasswordExemptContract/PresignPasswordExemptContractServiceProviderEntrustPayRedirectSignRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/PasswordExemptContract/PresignPasswordExemptContractServiceProviderEntrustPayRedirectSignRequest.cs
new file mode 100644
index 00000000..296039af
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/PasswordExemptContract/PresignPasswordExemptContractServiceProviderEntrustPayRedirectSignRequest.cs
@@ -0,0 +1,15 @@
+namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models
+{
+ ///
+ /// 表示 [POST] /password-exempt-contract/contracts/service-provider/pre-entrust-sign/pay-redirect-sign 接口的请求。
+ ///
+ public class PresignPasswordExemptContractServiceProviderEntrustPayRedirectSignRequest : PresignPasswordExemptContractServiceProviderEntrustMiniProgramRequest
+ {
+ ///
+ /// 获取或设置预支付交易会话标识。
+ ///
+ [Newtonsoft.Json.JsonProperty("prepay_id")]
+ [System.Text.Json.Serialization.JsonPropertyName("prepay_id")]
+ public string PrepayId { get; set; } = string.Empty;
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/PasswordExemptContract/PresignPasswordExemptContractServiceProviderEntrustPayRedirectSignResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/PasswordExemptContract/PresignPasswordExemptContractServiceProviderEntrustPayRedirectSignResponse.cs
new file mode 100644
index 00000000..6b3f35d9
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/PasswordExemptContract/PresignPasswordExemptContractServiceProviderEntrustPayRedirectSignResponse.cs
@@ -0,0 +1,38 @@
+namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models
+{
+ ///
+ /// 表示 [POST] /password-exempt-contract/contracts/service-provider/pre-entrust-sign/pay-redirect-sign 接口的响应。
+ ///
+ public class PresignPasswordExemptContractServiceProviderEntrustPayRedirectSignResponse : WechatTenpayResponse
+ {
+ ///
+ /// 获取或设置微信商户号。
+ ///
+ [Newtonsoft.Json.JsonProperty("mchid")]
+ [System.Text.Json.Serialization.JsonPropertyName("mchid")]
+ public string MerchantId { get; set; } = default!;
+
+ ///
+ /// 获取或设置子商户号。
+ ///
+ [Newtonsoft.Json.JsonProperty("sub_mchid")]
+ [System.Text.Json.Serialization.JsonPropertyName("sub_mchid")]
+ public string? SubMerchantId { get; set; }
+
+ ///
+ /// 获取或设置服务 ID。
+ ///
+ [Newtonsoft.Json.JsonProperty("service_id")]
+ [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.Common.NumericalStringConverter))]
+ [System.Text.Json.Serialization.JsonPropertyName("service_id")]
+ [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Serialization.Common.NumericalStringConverter))]
+ public string ServiceId { get; set; } = default!;
+
+ ///
+ /// 获取或设置商户签约协议号。
+ ///
+ [Newtonsoft.Json.JsonProperty("out_contract_code")]
+ [System.Text.Json.Serialization.JsonPropertyName("out_contract_code")]
+ public string OutContractCode { get; set; } = default!;
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/PasswordExemptContract/TerminatePasswordExemptContractRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/PasswordExemptContract/TerminatePasswordExemptContractRequest.cs
new file mode 100644
index 00000000..c151c407
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/PasswordExemptContract/TerminatePasswordExemptContractRequest.cs
@@ -0,0 +1,29 @@
+namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models
+{
+ ///
+ /// 表示 [POST] /password-exempt-contract/contracts/service-id/{service_id}/out-contract-code/{out_contract_code}/terminate 接口的请求。
+ ///
+ public class TerminatePasswordExemptContractRequest : WechatTenpayRequest
+ {
+ ///
+ /// 获取或设置服务 ID。
+ ///
+ [Newtonsoft.Json.JsonIgnore]
+ [System.Text.Json.Serialization.JsonIgnore]
+ public string ServiceId { get; set; } = string.Empty;
+
+ ///
+ /// 获取或设置商户签约协议号。
+ ///
+ [Newtonsoft.Json.JsonIgnore]
+ [System.Text.Json.Serialization.JsonIgnore]
+ public string OutContractCode { get; set; } = string.Empty;
+
+ ///
+ /// 获取或设置解约备注。
+ ///
+ [Newtonsoft.Json.JsonProperty("contract_termination_remark")]
+ [System.Text.Json.Serialization.JsonPropertyName("contract_termination_remark")]
+ public string TerminationRemark { get; set; } = string.Empty;
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/PasswordExemptContract/TerminatePasswordExemptContractResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/PasswordExemptContract/TerminatePasswordExemptContractResponse.cs
new file mode 100644
index 00000000..5f2cbc2f
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/PasswordExemptContract/TerminatePasswordExemptContractResponse.cs
@@ -0,0 +1,31 @@
+namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models
+{
+ ///
+ /// 表示 [POST] /password-exempt-contract/contracts/service-id/{service_id}/out-contract-code/{out_contract_code}/terminate 接口的响应。
+ ///
+ public class TerminatePasswordExemptContractResponse : WechatTenpayResponse
+ {
+ ///
+ /// 获取或设置微信商户号。
+ ///
+ [Newtonsoft.Json.JsonProperty("mchid")]
+ [System.Text.Json.Serialization.JsonPropertyName("mchid")]
+ public string MerchantId { get; set; } = default!;
+
+ ///
+ /// 获取或设置服务 ID。
+ ///
+ [Newtonsoft.Json.JsonProperty("service_id")]
+ [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.Common.NumericalStringConverter))]
+ [System.Text.Json.Serialization.JsonPropertyName("service_id")]
+ [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Serialization.Common.NumericalStringConverter))]
+ public string ServiceId { get; set; } = default!;
+
+ ///
+ /// 获取或设置商户签约协议号。
+ ///
+ [Newtonsoft.Json.JsonProperty("out_contract_code")]
+ [System.Text.Json.Serialization.JsonPropertyName("out_contract_code")]
+ public string OutContractCode { get; set; } = default!;
+ }
+}
diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_/_Partner/PasswordExemptContract/GetPasswordExemptContractByOutContractCodeResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_/_Partner/PasswordExemptContract/GetPasswordExemptContractByOutContractCodeResponse.json
new file mode 100644
index 00000000..1e7eb8d2
--- /dev/null
+++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_/_Partner/PasswordExemptContract/GetPasswordExemptContractByOutContractCodeResponse.json
@@ -0,0 +1,18 @@
+{
+ "mchid": "1900000109",
+ "contract_id": "123124412412423431",
+ "appid": "wxd678efh567hg6787",
+ "openid": "wxd678efh567hg6787",
+ "sub_appid": "wxd678efh567hg6787",
+ "sub_openid": "wxd678efh567hg6787",
+ "service_id": 12535,
+ "out_contract_code": "wxwtdk20200910100000",
+ "contract_display_account": "微信代扣用户A",
+ "contract_state": "SIGNED",
+ "contract_signed_time": "2020-09-10T13:29:35+08:00",
+ "contract_terminate_info": {
+ "contract_termination_mode": "USER_TERMINATE",
+ "contract_terminated_time": "2020-10-10T13:29:35+08:00",
+ "contract_termination_remark": "用户解约"
+ }
+}
diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_/_Partner/PasswordExemptContract/PresignPasswordExemptContractQsEntrustMiniProgramRequest.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_/_Partner/PasswordExemptContract/PresignPasswordExemptContractQsEntrustMiniProgramRequest.json
new file mode 100644
index 00000000..b779c165
--- /dev/null
+++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_/_Partner/PasswordExemptContract/PresignPasswordExemptContractQsEntrustMiniProgramRequest.json
@@ -0,0 +1,11 @@
+{
+ "appid": "wxd678efh567hg6787",
+ "sub_appid": "wxd678efh567hg6787",
+ "sub_mchid": "1900000109",
+ "service_id": 12535,
+ "out_contract_code": "wxwtdk20200910100000",
+ "notify_url": "https://yourapp.com/notify",
+ "contract_display_account": "微信代扣用户A",
+ "openid": "oUpF8uMuAJO_M2pxb1Q9zNjWeS6o",
+ "sub_openid": "oUpF8uMuAJO_M2pxb1Q9zNjWeS6o"
+}
diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_/_Partner/PasswordExemptContract/PresignPasswordExemptContractQsEntrustMiniProgramResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_/_Partner/PasswordExemptContract/PresignPasswordExemptContractQsEntrustMiniProgramResponse.json
new file mode 100644
index 00000000..f2a0b0f4
--- /dev/null
+++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_/_Partner/PasswordExemptContract/PresignPasswordExemptContractQsEntrustMiniProgramResponse.json
@@ -0,0 +1,8 @@
+{
+ "pre_entrustweb_id": "5778aadY9nltAsZzXixCkFIGYnV2V",
+ "mchid": "1900000109",
+ "service_id": 12535,
+ "out_contract_code": "wxwtdk20200910100000",
+ "sign_mp_appid": "wxbd687630cd02ce1d",
+ "sign_mp_path": "pages/PwdExemptContract/index"
+}
diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_/_Partner/PasswordExemptContract/PresignPasswordExemptContractQsEntrustPayRedirectSignRequest.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_/_Partner/PasswordExemptContract/PresignPasswordExemptContractQsEntrustPayRedirectSignRequest.json
new file mode 100644
index 00000000..56684612
--- /dev/null
+++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_/_Partner/PasswordExemptContract/PresignPasswordExemptContractQsEntrustPayRedirectSignRequest.json
@@ -0,0 +1,12 @@
+{
+ "appid": "wxd678efh567hg6787",
+ "sub_appid": "wxd678efh567hg6787",
+ "sub_mchid": "1900000109",
+ "service_id": 12535,
+ "out_contract_code": "wxwtdk20200910100000",
+ "notify_url": "https://yourapp.com/notify",
+ "contract_display_account": "微信代扣用户A",
+ "prepay_id": "wx201410272009395522657a690389285100",
+ "openid": "oUpF8uMuAJO_M2pxb1Q9zNjWeS6o",
+ "sub_openid": "oUpF8uMuAJO_M2pxb1Q9zNjWeS6o"
+}
diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_/_Partner/PasswordExemptContract/PresignPasswordExemptContractQsEntrustPayRedirectSignResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_/_Partner/PasswordExemptContract/PresignPasswordExemptContractQsEntrustPayRedirectSignResponse.json
new file mode 100644
index 00000000..a3629831
--- /dev/null
+++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_/_Partner/PasswordExemptContract/PresignPasswordExemptContractQsEntrustPayRedirectSignResponse.json
@@ -0,0 +1,5 @@
+{
+ "mchid": "1900000109",
+ "service_id": 12535,
+ "out_contract_code": "wxwtdk20200910100000"
+}
diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_/_Partner/PasswordExemptContract/PresignPasswordExemptContractServiceProviderEntrustMiniProgramRequest.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_/_Partner/PasswordExemptContract/PresignPasswordExemptContractServiceProviderEntrustMiniProgramRequest.json
new file mode 100644
index 00000000..c07300d8
--- /dev/null
+++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_/_Partner/PasswordExemptContract/PresignPasswordExemptContractServiceProviderEntrustMiniProgramRequest.json
@@ -0,0 +1,11 @@
+{
+ "sp_appid": "wxd678efh567hg6787",
+ "sp_openid": "oYobu0MVnQfWpSMOYJz2AHPG_gQw",
+ "sub_mchid": "1900000109",
+ "sub_appid": "wxd678efh567hg6787",
+ "sub_openid": "wxd678efh567hg6787",
+ "service_id": 12535,
+ "out_contract_code": "wxwtdk20200910100000",
+ "notify_url": "https://yourapp.com/notify",
+ "contract_display_account": "微信代扣用户A"
+}
diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_/_Partner/PasswordExemptContract/PresignPasswordExemptContractServiceProviderEntrustMiniProgramResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_/_Partner/PasswordExemptContract/PresignPasswordExemptContractServiceProviderEntrustMiniProgramResponse.json
new file mode 100644
index 00000000..ede05c73
--- /dev/null
+++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_/_Partner/PasswordExemptContract/PresignPasswordExemptContractServiceProviderEntrustMiniProgramResponse.json
@@ -0,0 +1,9 @@
+{
+ "pre_entrustweb_id": "5778aadY9nltAsZzXixCkFIGYnV2V",
+ "mchid": "1900000109",
+ "sub_mchid": "1900000109",
+ "service_id": 12535,
+ "out_contract_code": "wxwtdk20200910100000",
+ "sign_mp_appid": "wxbd687630cd02ce1d",
+ "sign_mp_path": "pages/PwdExemptContract/index"
+}
diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_/_Partner/PasswordExemptContract/PresignPasswordExemptContractServiceProviderEntrustPayRedirectSignRequest.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_/_Partner/PasswordExemptContract/PresignPasswordExemptContractServiceProviderEntrustPayRedirectSignRequest.json
new file mode 100644
index 00000000..0df35065
--- /dev/null
+++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_/_Partner/PasswordExemptContract/PresignPasswordExemptContractServiceProviderEntrustPayRedirectSignRequest.json
@@ -0,0 +1,12 @@
+{
+ "sp_appid": "wxd678efh567hg6787",
+ "sp_openid": "oYobu0MVnQfWpSMOYJz2AHPG_gQw",
+ "sub_mchid": "1900000109",
+ "sub_appid": "wxd678efh567hg6787",
+ "sub_openid": "wxd678efh567hg6787",
+ "service_id": 12535,
+ "out_contract_code": "wxwtdk20200910100000",
+ "notify_url": "https://yourapp.com/notify",
+ "contract_display_account": "微信代扣用户A",
+ "prepay_id": "wx201410272009395522657a690389285100"
+}
diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_/_Partner/PasswordExemptContract/PresignPasswordExemptContractServiceProviderEntrustPayRedirectSignResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_/_Partner/PasswordExemptContract/PresignPasswordExemptContractServiceProviderEntrustPayRedirectSignResponse.json
new file mode 100644
index 00000000..df28d7f9
--- /dev/null
+++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_/_Partner/PasswordExemptContract/PresignPasswordExemptContractServiceProviderEntrustPayRedirectSignResponse.json
@@ -0,0 +1,6 @@
+{
+ "mchid": "1900000109",
+ "sub_mchid": "1900000109",
+ "service_id": 12535,
+ "out_contract_code": "wxwtdk20200910100000"
+}
diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_/_Partner/PasswordExemptContract/TerminatePasswordExemptContractRequest.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_/_Partner/PasswordExemptContract/TerminatePasswordExemptContractRequest.json
new file mode 100644
index 00000000..4394aed8
--- /dev/null
+++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_/_Partner/PasswordExemptContract/TerminatePasswordExemptContractRequest.json
@@ -0,0 +1,3 @@
+{
+ "contract_termination_remark": "用户解约"
+}
diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_/_Partner/PasswordExemptContract/TerminatePasswordExemptContractResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_/_Partner/PasswordExemptContract/TerminatePasswordExemptContractResponse.json
new file mode 100644
index 00000000..a3629831
--- /dev/null
+++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_/_Partner/PasswordExemptContract/TerminatePasswordExemptContractResponse.json
@@ -0,0 +1,5 @@
+{
+ "mchid": "1900000109",
+ "service_id": 12535,
+ "out_contract_code": "wxwtdk20200910100000"
+}