feat(tenpayv3): 新增平台收付通账号托管模式相关接口

This commit is contained in:
Fu Diwei
2025-09-24 13:29:40 +08:00
parent dff1f69fb1
commit 587dc0251b
45 changed files with 1035 additions and 4 deletions

View File

@@ -1115,6 +1115,24 @@
- 查询赔付结果:`GetPlatformSolutionEcommerceMerchantTransferCompensationBillByOutBillNumber` / `GetPlatformSolutionEcommerceMerchantTransferCompensationBillByBillId`
- 账号托管模式(进件)
- 提交申请单:`CreateEcommerceApplymentForSubmitAccountHosting`
- 查询申请单状态:`GetEcommerceApplymentByOutRequestNumber` / `GetEcommerceApplymentByApplymentId`
- 撤销申请单:`RevokeEcommerceApplymentByOutRequestNumber` / `RevokeEcommerceApplymentByApplymentId`
- 平台代理签约核身:`CreateEcommerceApplymentForSubmitSignVerifyInfo`
- 账号托管模式(修改超级管理员)
- 提交申请单:`CreateMerchantAlterApplyMerchantContactAlterApplyment`
- 查询申请单状态:`GetMerchantAlterApplyMerchantContactAlterApplymentByOutRequestNumber` / `GetMerchantAlterApplyMerchantContactAlterApplymentByApplymentId`
- 撤销申请单:`RevokeMerchantAlterApplyMerchantContactAlterApplyment`
- 代金券
- 创建代金券批次:`CreateMarketingFavorStock`

View File

@@ -205,7 +205,8 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3
/// <para>异步调用 [GET] /ecommerce/applyments/{applyment_id} 接口。</para>
/// <para>
/// REF: <br/>
/// <![CDATA[ https://pay.weixin.qq.com/doc/v3/partner/4012691469 ]]>
/// <![CDATA[ https://pay.weixin.qq.com/doc/v3/partner/4012691469 ]]> <br/>
/// <![CDATA[ https://pay.weixin.qq.com/doc/v3/partner/4015616714 ]]>
/// </para>
/// </summary>
/// <param name="client"></param>
@@ -227,7 +228,8 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3
/// <para>异步调用 [GET] /ecommerce/applyments/out-request-no/{out_request_no} 接口。</para>
/// <para>
/// REF: <br/>
/// <![CDATA[ https://pay.weixin.qq.com/doc/v3/partner/4012691376 ]]>
/// <![CDATA[ https://pay.weixin.qq.com/doc/v3/partner/4012691376 ]]> <br/>
/// <![CDATA[ https://pay.weixin.qq.com/doc/v3/partner/4015616708 ]]>
/// </para>
/// </summary>
/// <param name="client"></param>
@@ -244,6 +246,94 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3
return await client.SendFlurlRequestAsJsonAsync<Models.GetEcommerceApplymentByOutRequestNumberResponse>(flurlReq, data: request, cancellationToken: cancellationToken).ConfigureAwait(false);
}
/// <summary>
/// <para>异步调用 [POST] /ecommerce/applyments/{applyment_id}/revoke 接口。</para>
/// <para>
/// REF: <br/>
/// <![CDATA[ https://pay.weixin.qq.com/doc/v3/partner/4015616720 ]]>
/// </para>
/// </summary>
/// <param name="client"></param>
/// <param name="request"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
public static async Task<Models.RevokeEcommerceApplymentByApplymentIdResponse> ExecuteRevokeEcommerceApplymentByApplymentIdAsync(this WechatTenpayClient client, Models.RevokeEcommerceApplymentByApplymentIdRequest 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, "ecommerce", "applyments", request.ApplymentId.ToString(), "revoke");
return await client.SendFlurlRequestAsJsonAsync<Models.RevokeEcommerceApplymentByApplymentIdResponse>(flurlReq, data: request, cancellationToken: cancellationToken).ConfigureAwait(false);
}
/// <summary>
/// <para>异步调用 [POST] /ecommerce/applyments/out-request-no/{out_request_no}/revoke 接口。</para>
/// <para>
/// REF: <br/>
/// <![CDATA[ https://pay.weixin.qq.com/doc/v3/partner/4015616721 ]]>
/// </para>
/// </summary>
/// <param name="client"></param>
/// <param name="request"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
public static async Task<Models.RevokeEcommerceApplymentByOutRequestNumberResponse> ExecuteRevokeEcommerceApplymentByOutRequestNumberAsync(this WechatTenpayClient client, Models.RevokeEcommerceApplymentByOutRequestNumberRequest 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, "ecommerce", "applyments", "out-request-no", request.OutRequestNumber, "revoke");
return await client.SendFlurlRequestAsJsonAsync<Models.RevokeEcommerceApplymentByOutRequestNumberResponse>(flurlReq, data: request, cancellationToken: cancellationToken).ConfigureAwait(false);
}
/// <summary>
/// <para>异步调用 [POST] /ecommerce/applyments/submit-account-hosting-applyment 接口。</para>
/// <para>
/// REF: <br/>
/// <![CDATA[ https://pay.weixin.qq.com/doc/v3/partner/4015616688 ]]>
/// </para>
/// </summary>
/// <param name="client"></param>
/// <param name="request"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
public static async Task<Models.CreateEcommerceApplymentForSubmitAccountHostingResponse> ExecuteCreateEcommerceApplymentForSubmitAccountHostingAsync(this WechatTenpayClient client, Models.CreateEcommerceApplymentForSubmitAccountHostingRequest 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, "ecommerce", "applyments", "submit-account-hosting-applyment");
return await client.SendFlurlRequestAsJsonAsync<Models.CreateEcommerceApplymentForSubmitAccountHostingResponse>(flurlReq, data: request, cancellationToken: cancellationToken).ConfigureAwait(false);
}
/// <summary>
/// <para>异步调用 [POST] /ecommerce/applyments/submit-sign-verify-info 接口。</para>
/// <para>
/// REF: <br/>
/// <![CDATA[ https://pay.weixin.qq.com/doc/v3/partner/4015616722 ]]>
/// </para>
/// </summary>
/// <param name="client"></param>
/// <param name="request"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
public static async Task<Models.CreateEcommerceApplymentForSubmitSignVerifyInfoResponse> ExecuteCreateEcommerceApplymentForSubmitSignVerifyInfoAsync(this WechatTenpayClient client, Models.CreateEcommerceApplymentForSubmitSignVerifyInfoRequest 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, "ecommerce", "applyments", "submit-sign-verify-info");
return await client.SendFlurlRequestAsJsonAsync<Models.CreateEcommerceApplymentForSubmitSignVerifyInfoResponse>(flurlReq, data: request, cancellationToken: cancellationToken).ConfigureAwait(false);
}
#endregion
#region Bill

View File

@@ -8,6 +8,97 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3
{
public static class WechatTenpayClientExecuteMerchantAlterApplyExtensions
{
#region MerchantContact
/// <summary>
/// <para>异步调用 [POST] /mchalterapply/mchcontactalterapplyment 接口。</para>
/// <para>
/// REF: <br/>
/// <![CDATA[ https://pay.weixin.qq.com/doc/v3/partner/4014090649 ]]>
/// </para>
/// </summary>
/// <param name="client"></param>
/// <param name="request"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
public static async Task<Models.CreateMerchantAlterApplyMerchantContactAlterApplymentResponse> ExecuteCreateMerchantAlterApplyMerchantContactAlterApplymentAsync(this WechatTenpayClient client, Models.CreateMerchantAlterApplyMerchantContactAlterApplymentRequest 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, "mchalterapply", "mchcontactalterapplyment");
return await client.SendFlurlRequestAsJsonAsync<Models.CreateMerchantAlterApplyMerchantContactAlterApplymentResponse>(flurlReq, data: request, cancellationToken: cancellationToken).ConfigureAwait(false);
}
/// <summary>
/// <para>异步调用 [POST] /mchalterapply/mchcontactalterapplyment/{apply_id}/revoke 接口。</para>
/// <para>
/// REF: <br/>
/// <![CDATA[ https://pay.weixin.qq.com/doc/v3/partner/4014090672 ]]>
/// </para>
/// </summary>
/// <param name="client"></param>
/// <param name="request"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
public static async Task<Models.RevokeMerchantAlterApplyMerchantContactAlterApplymentResponse> ExecuteRevokeMerchantAlterApplyMerchantContactAlterApplymentAsync(this WechatTenpayClient client, Models.RevokeMerchantAlterApplyMerchantContactAlterApplymentRequest 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, "mchalterapply", "mchcontactalterapplyment", request.ApplymentId, "revoke");
return await client.SendFlurlRequestAsJsonAsync<Models.RevokeMerchantAlterApplyMerchantContactAlterApplymentResponse>(flurlReq, data: request, cancellationToken: cancellationToken).ConfigureAwait(false);
}
/// <summary>
/// <para>异步调用 [GET] /mchalterapply/mchcontactalterapplyment/merchant/{merchant_code}/out-request-no/{out_request_no} 接口。</para>
/// <para>
/// REF: <br/>
/// <![CDATA[ https://pay.weixin.qq.com/doc/v3/partner/4014090667 ]]>
/// </para>
/// </summary>
/// <param name="client"></param>
/// <param name="request"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
public static async Task<Models.GetMerchantAlterApplyMerchantContactAlterApplymentByOutRequestNumberResponse> ExecuteGetMerchantAlterApplyMerchantContactAlterApplymentByOutRequestNumberAsync(this WechatTenpayClient client, Models.GetMerchantAlterApplyMerchantContactAlterApplymentByOutRequestNumberRequest 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, "mchalterapply", "mchcontactalterapplyment", "merchant", request.SubMerchantId, "out-request-no", request.OutRequestNumber);
return await client.SendFlurlRequestAsJsonAsync<Models.GetMerchantAlterApplyMerchantContactAlterApplymentByOutRequestNumberResponse>(flurlReq, data: request, cancellationToken: cancellationToken).ConfigureAwait(false);
}
/// <summary>
/// <para>异步调用 [GET] /mchalterapply/mchcontactalterapplyment/{apply_id} 接口。</para>
/// <para>
/// REF: <br/>
/// <![CDATA[ https://pay.weixin.qq.com/doc/v3/partner/4014090655 ]]>
/// </para>
/// </summary>
/// <param name="client"></param>
/// <param name="request"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
public static async Task<Models.GetMerchantAlterApplyMerchantContactAlterApplymentByApplymentIdResponse> ExecuteGetMerchantAlterApplyMerchantContactAlterApplymentByApplymentIdAsync(this WechatTenpayClient client, Models.GetMerchantAlterApplyMerchantContactAlterApplymentByApplymentIdRequest 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, "mchalterapply", "mchcontactalterapplyment", request.ApplymentId);
return await client.SendFlurlRequestAsJsonAsync<Models.GetMerchantAlterApplyMerchantContactAlterApplymentByApplymentIdResponse>(flurlReq, data: request, cancellationToken: cancellationToken).ConfigureAwait(false);
}
#endregion
#region MerchantSubject
/// <summary>
/// <para>异步调用 [POST] /mchalterapply/mchsubjectalterapplyment 接口。</para>
/// <para>
@@ -95,5 +186,6 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3
return await client.SendFlurlRequestAsJsonAsync<Models.GetMerchantAlterApplyMerchantSubjectAlterApplymentByApplymentIdResponse>(flurlReq, data: request, cancellationToken: cancellationToken).ConfigureAwait(false);
}
#endregion
}
}

View File

@@ -0,0 +1,189 @@
using System.Collections.Generic;
namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models
{
/// <summary>
/// <para>表示 [POST] /ecommerce/applyments/submit-account-hosting-applyment 接口的请求。</para>
/// </summary>
[WechatTenpaySensitive]
public class CreateEcommerceApplymentForSubmitAccountHostingRequest : WechatTenpayRequest
{
public static class Types
{
public class BusinessLicense : CreateEcommerceApplymentRequest.Types.BusinessLicense
{
}
public class FinanceInstitutionLicense : CreateEcommerceApplymentRequest.Types.FinanceInstitutionLicense
{
}
public class IdCard : CreateEcommerceApplymentRequest.Types.IdCard
{
}
public class IdDocument : CreateEcommerceApplymentRequest.Types.IdDocument
{
}
public class Contact : CreateEcommerceApplymentRequest.Types.Contact
{
}
public class UBO : CreateEcommerceApplymentRequest.Types.UBO
{
}
public class BankAccount : CreateEcommerceApplymentRequest.Types.BankAccount
{
}
public class SaleScene : CreateEcommerceApplymentRequest.Types.SaleScene
{
}
public class Settlement : CreateEcommerceApplymentRequest.Types.Settlement
{
}
}
/// <summary>
/// 获取或设置业务申请编号。
/// </summary>
[Newtonsoft.Json.JsonProperty("out_request_no")]
[System.Text.Json.Serialization.JsonPropertyName("out_request_no")]
public string OutRequestNumber { get; set; } = string.Empty;
/// <summary>
/// 获取或设置商户简称。
/// </summary>
[Newtonsoft.Json.JsonProperty("merchant_shortname")]
[System.Text.Json.Serialization.JsonPropertyName("merchant_shortname")]
public string MerchantShortName { get; set; } = string.Empty;
/// <summary>
/// 获取或设置主体类型。
/// </summary>
[Newtonsoft.Json.JsonProperty("organization_type")]
[System.Text.Json.Serialization.JsonPropertyName("organization_type")]
public string SubjectType { get; set; } = string.Empty;
/// <summary>
/// 获取或设置是否是金融机构。
/// </summary>
[Newtonsoft.Json.JsonProperty("finance_institution")]
[System.Text.Json.Serialization.JsonPropertyName("finance_institution")]
public bool? IsFinanceInstitution { get; set; }
/// <summary>
/// 获取或设置营业执照信息。
/// </summary>
[Newtonsoft.Json.JsonProperty("business_license_info")]
[System.Text.Json.Serialization.JsonPropertyName("business_license_info")]
public Types.BusinessLicense? BusinessLicense { get; set; }
/// <summary>
/// 获取或设置金融机构许可证信息。
/// </summary>
[Newtonsoft.Json.JsonProperty("finance_institution_info")]
[System.Text.Json.Serialization.JsonPropertyName("finance_institution_info")]
public Types.FinanceInstitutionLicense? FinanceInstitutionLicense { get; set; }
/// <summary>
/// 获取或设置证件持有人类型。
/// </summary>
[Newtonsoft.Json.JsonProperty("id_holder_type")]
[System.Text.Json.Serialization.JsonPropertyName("id_holder_type")]
public string? IdHolderType { get; set; }
/// <summary>
/// 获取或设置法人证件类型。
/// </summary>
[Newtonsoft.Json.JsonProperty("id_doc_type")]
[System.Text.Json.Serialization.JsonPropertyName("id_doc_type")]
public string IdentityType { get; set; } = string.Empty;
/// <summary>
/// 获取或设置身份证信息。
/// </summary>
[Newtonsoft.Json.JsonProperty("id_card_info")]
[System.Text.Json.Serialization.JsonPropertyName("id_card_info")]
public Types.IdCard? IdCard { get; set; }
/// <summary>
/// 获取或设置其他类型证件信息。
/// </summary>
[Newtonsoft.Json.JsonProperty("id_doc_info")]
[System.Text.Json.Serialization.JsonPropertyName("id_doc_info")]
public Types.IdDocument? IdDocument { get; set; }
/// <summary>
/// 获取或设置法人代表授权函媒体文件标识。
/// </summary>
[Newtonsoft.Json.JsonProperty("authorize_letter_copy")]
[System.Text.Json.Serialization.JsonPropertyName("authorize_letter_copy")]
public string? AuthorizeLetterCopyMediaId { get; set; }
/// <summary>
/// 获取或设置最终受益人列表。
/// </summary>
[Newtonsoft.Json.JsonProperty("ubo_info_list")]
[System.Text.Json.Serialization.JsonPropertyName("ubo_info_list")]
public IList<Types.UBO>? UBOList { get; set; }
/// <summary>
/// 获取或设置结算银行账户信息。
/// </summary>
[Newtonsoft.Json.JsonProperty("account_info")]
[System.Text.Json.Serialization.JsonPropertyName("account_info")]
public Types.BankAccount BankAccount { get; set; } = new Types.BankAccount();
/// <summary>
/// 获取或设置超级管理员信息。
/// </summary>
[Newtonsoft.Json.JsonProperty("contact_info")]
[System.Text.Json.Serialization.JsonPropertyName("contact_info")]
public Types.Contact Contact { get; set; } = new Types.Contact();
/// <summary>
/// 获取或设置销售场景信息。
/// </summary>
[Newtonsoft.Json.JsonProperty("sales_scene_info")]
[System.Text.Json.Serialization.JsonPropertyName("sales_scene_info")]
public Types.SaleScene SaleScene { get; set; } = new Types.SaleScene();
/// <summary>
/// 获取或设置结算规则信息。
/// </summary>
[Newtonsoft.Json.JsonProperty("settlement_info")]
[System.Text.Json.Serialization.JsonPropertyName("settlement_info")]
public Types.Settlement? Settlement { get; set; }
/// <summary>
/// 获取或设置特殊资质图片媒体文件标识 ID 列表。
/// </summary>
[Newtonsoft.Json.JsonProperty("qualifications")]
[System.Text.Json.Serialization.JsonPropertyName("qualifications")]
public IList<string>? QualificationPictureMediaIdList { get; set; }
/// <summary>
/// 获取或设置补充材料媒体文件标识 ID 列表。
/// </summary>
[Newtonsoft.Json.JsonProperty("business_addition_pics")]
[System.Text.Json.Serialization.JsonPropertyName("business_addition_pics")]
public IList<string>? BusinessAdditionPictureMediaIdList { get; set; }
/// <summary>
/// 获取或设置补充说明。
/// </summary>
[Newtonsoft.Json.JsonProperty("business_addition_desc")]
[System.Text.Json.Serialization.JsonPropertyName("business_addition_desc")]
public string? BusinessAdditionDescription { get; set; }
/// <summary>
/// 获取或设置是否走平台代理签约和代理核身入驻模式。
/// </summary>
[Newtonsoft.Json.JsonProperty("proxy_sign_verify_mode")]
[System.Text.Json.Serialization.JsonPropertyName("proxy_sign_verify_mode")]
public bool IsProxySignVerifyMode { get; set; }
}
}

View File

@@ -0,0 +1,22 @@
namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models
{
/// <summary>
/// <para>表示 [POST] /ecommerce/applyments/submit-account-hosting-applyment 接口的响应。</para>
/// </summary>
public class CreateEcommerceApplymentForSubmitAccountHostingResponse : WechatTenpayResponse
{
/// <summary>
/// 获取或设置业务申请编号。
/// </summary>
[Newtonsoft.Json.JsonProperty("out_request_no")]
[System.Text.Json.Serialization.JsonPropertyName("out_request_no")]
public string OutRequestNumber { get; set; } = default!;
/// <summary>
/// 获取或设置申请单编号。
/// </summary>
[Newtonsoft.Json.JsonProperty("applyment_id")]
[System.Text.Json.Serialization.JsonPropertyName("applyment_id")]
public long ApplymentId { get; set; }
}
}

View File

@@ -0,0 +1,60 @@
using System;
namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models
{
/// <summary>
/// <para>表示 [POST] /ecommerce/applyments/submit-sign-verify-info 接口的请求。</para>
/// </summary>
public class CreateEcommerceApplymentForSubmitSignVerifyInfoRequest : WechatTenpayRequest
{
public static class Types
{
public class ProxyVerifyIdentity
{
/// <summary>
/// 获取或设置核身方式。
/// </summary>
[Newtonsoft.Json.JsonProperty("verify_identity_type")]
[System.Text.Json.Serialization.JsonPropertyName("verify_identity_type")]
public string VerifyIdentityType { get; set; } = string.Empty;
/// <summary>
/// 获取或设置核身结果。
/// </summary>
[Newtonsoft.Json.JsonProperty("verify_identity_result")]
[System.Text.Json.Serialization.JsonPropertyName("verify_identity_result")]
public bool VerifyIdentityResult { get; set; }
}
}
/// <summary>
/// 获取或设置业务申请编号。与字段 <see cref="ApplymentId"/> 二选一。
/// </summary>
[Newtonsoft.Json.JsonProperty("out_request_no")]
[System.Text.Json.Serialization.JsonPropertyName("out_request_no")]
public string? OutRequestNumber { get; set; }
/// <summary>
/// 获取或设置申请单编号。与字段 <see cref="OutRequestNumber"/> 二选一。
/// </summary>
[Newtonsoft.Json.JsonProperty("applyment_id")]
[System.Text.Json.Serialization.JsonPropertyName("applyment_id")]
public long? ApplymentId { get; set; }
/// <summary>
/// 获取或设置预签署微信支付协议时间。
/// </summary>
[Newtonsoft.Json.JsonProperty("pre_sign_time")]
[Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.Common.Rfc3339DateTimeOffsetConverter))]
[System.Text.Json.Serialization.JsonPropertyName("pre_sign_time")]
[System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Serialization.Common.Rfc3339DateTimeOffsetConverter))]
public DateTimeOffset? PresignTime { get; set; }
/// <summary>
/// 获取或设置平台代理核身信息。
/// </summary>
[Newtonsoft.Json.JsonProperty("proxy_verify_identity_info")]
[System.Text.Json.Serialization.JsonPropertyName("proxy_verify_identity_info")]
public Types.ProxyVerifyIdentity? ProxyVerifyIdentity { get; set; }
}
}

View File

@@ -0,0 +1,15 @@
namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models
{
/// <summary>
/// <para>表示 [POST] /ecommerce/applyments/submit-sign-verify-info 接口的响应。</para>
/// </summary>
public class CreateEcommerceApplymentForSubmitSignVerifyInfoResponse : WechatTenpayResponse
{
/// <summary>
/// 获取或设置申请单编号。
/// </summary>
[Newtonsoft.Json.JsonProperty("applyment_id")]
[System.Text.Json.Serialization.JsonPropertyName("applyment_id")]
public long ApplymentId { get; set; }
}
}

View File

@@ -0,0 +1,15 @@
namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models
{
/// <summary>
/// <para>表示 [POST] /ecommerce/applyments/{applyment_id}/revoke 接口的请求。</para>
/// </summary>
public class RevokeEcommerceApplymentByApplymentIdRequest : WechatTenpayRequest
{
/// <summary>
/// 获取或设置申请单编号。
/// </summary>
[Newtonsoft.Json.JsonIgnore]
[System.Text.Json.Serialization.JsonIgnore]
public long ApplymentId { get; set; }
}
}

View File

@@ -0,0 +1,9 @@
namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models
{
/// <summary>
/// <para>表示 [POST] /ecommerce/applyments/{applyment_id}/revoke 接口的响应。</para>
/// </summary>
public class RevokeEcommerceApplymentByApplymentIdResponse : RevokeEcommerceApplymentByOutRequestNumberResponse
{
}
}

View File

@@ -0,0 +1,15 @@
namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models
{
/// <summary>
/// <para>表示 [POST] /ecommerce/applyments/out-request-no/{out_request_no}/revoke 接口的请求。</para>
/// </summary>
public class RevokeEcommerceApplymentByOutRequestNumberRequest : WechatTenpayRequest
{
/// <summary>
/// 获取或设置业务申请编号。
/// </summary>
[Newtonsoft.Json.JsonIgnore]
[System.Text.Json.Serialization.JsonIgnore]
public string OutRequestNumber { get; set; } = string.Empty;
}
}

View File

@@ -0,0 +1,22 @@
namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models
{
/// <summary>
/// <para>表示 [POST] /ecommerce/applyments/out-request-no/{out_request_no}/revoke 接口的响应。</para>
/// </summary>
public class RevokeEcommerceApplymentByOutRequestNumberResponse : WechatTenpayResponse
{
/// <summary>
/// 获取或设置申请单编号。
/// </summary>
[Newtonsoft.Json.JsonProperty("applyment_id")]
[System.Text.Json.Serialization.JsonPropertyName("applyment_id")]
public long ApplymentId { get; set; }
/// <summary>
/// 获取或设置业务申请编号。
/// </summary>
[Newtonsoft.Json.JsonProperty("out_request_no")]
[System.Text.Json.Serialization.JsonPropertyName("out_request_no")]
public string OutRequestNumber { get; set; } = default!;
}
}

View File

@@ -0,0 +1,98 @@
namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models
{
/// <summary>
/// <para>表示 [POST] /mchalterapply/mchcontactalterapplyment 接口的请求。</para>
/// </summary>
[WechatTenpaySensitive]
public class CreateMerchantAlterApplyMerchantContactAlterApplymentRequest : WechatTenpayRequest
{
public static class Types
{
public class Contact
{
/// <summary>
/// 获取或设置超级管理员姓名(需使用平台公钥/证书加密)。
/// </summary>
[Newtonsoft.Json.JsonProperty("contact_name")]
[System.Text.Json.Serialization.JsonPropertyName("contact_name")]
[WechatTenpaySensitiveProperty(scheme: Constants.SignSchemes.WECHATPAY2_RSA_2048_WITH_SHA256, algorithm: Constants.EncryptionAlgorithms.RSA_2048_ECB_PKCS8_OAEP_WITH_SHA1_AND_MGF1)]
[WechatTenpaySensitiveProperty(scheme: Constants.SignSchemes.WECHATPAY2_SM2_WITH_SM3, algorithm: Constants.EncryptionAlgorithms.SM2_C1C3C2_ASN1)]
public string ContactName { get; set; } = string.Empty;
/// <summary>
/// 获取或设置超级管理员证件类型。
/// </summary>
[Newtonsoft.Json.JsonProperty("contact_id_doc_type")]
[System.Text.Json.Serialization.JsonPropertyName("contact_id_doc_type")]
public string? IdentityType { get; set; }
/// <summary>
/// 获取或设置超级管理员证件号码(需使用平台公钥/证书加密)。与字段 <see cref="OpenId"/> 二选一。
/// </summary>
[Newtonsoft.Json.JsonProperty("contact_id_card_number")]
[System.Text.Json.Serialization.JsonPropertyName("contact_id_card_number")]
[WechatTenpaySensitiveProperty(scheme: Constants.SignSchemes.WECHATPAY2_RSA_2048_WITH_SHA256, algorithm: Constants.EncryptionAlgorithms.RSA_2048_ECB_PKCS8_OAEP_WITH_SHA1_AND_MGF1)]
[WechatTenpaySensitiveProperty(scheme: Constants.SignSchemes.WECHATPAY2_SM2_WITH_SM3, algorithm: Constants.EncryptionAlgorithms.SM2_C1C3C2_ASN1)]
public string? IdNumber { get; set; }
/// <summary>
/// 获取或设置超级管理员证件正面照片媒体文件标识 ID。
/// </summary>
[Newtonsoft.Json.JsonProperty("contact_id_doc_copy")]
[System.Text.Json.Serialization.JsonPropertyName("contact_id_doc_copy")]
public string? IdFrontCopyMediaId { get; set; }
/// <summary>
/// 获取或设置超级管理员证件背面照片媒体文件标识 ID。
/// </summary>
[Newtonsoft.Json.JsonProperty("contact_id_doc_copy_back")]
[System.Text.Json.Serialization.JsonPropertyName("contact_id_doc_copy_back")]
public string? IdBackCopyMediaId { get; set; }
/// <summary>
/// 获取或设置超级管理员证件有效期开始日期字符串格式yyyy-MM-dd
/// </summary>
[Newtonsoft.Json.JsonProperty("contact_id_doc_period_begin")]
[System.Text.Json.Serialization.JsonPropertyName("contact_id_doc_period_begin")]
public string? IdPeriodBeginDateString { get; set; }
/// <summary>
/// 获取或设置超级管理员证件有效期结束日期字符串格式yyyy-MM-dd / "长期")。
/// </summary>
[Newtonsoft.Json.JsonProperty("contact_id_doc_period_end")]
[System.Text.Json.Serialization.JsonPropertyName("contact_id_doc_period_end")]
public string? IdPeriodEndDateString { get; set; }
/// <summary>
/// 获取或设置联系人手机号(需使用平台公钥/证书加密)。
/// </summary>
[Newtonsoft.Json.JsonProperty("mobile_phone")]
[System.Text.Json.Serialization.JsonPropertyName("mobile_phone")]
[WechatTenpaySensitiveProperty(scheme: Constants.SignSchemes.WECHATPAY2_RSA_2048_WITH_SHA256, algorithm: Constants.EncryptionAlgorithms.RSA_2048_ECB_PKCS8_OAEP_WITH_SHA1_AND_MGF1)]
[WechatTenpaySensitiveProperty(scheme: Constants.SignSchemes.WECHATPAY2_SM2_WITH_SM3, algorithm: Constants.EncryptionAlgorithms.SM2_C1C3C2_ASN1)]
public string MobileNumber { get; set; } = string.Empty;
}
}
/// <summary>
/// 获取或设置特约商户号。
/// </summary>
[Newtonsoft.Json.JsonProperty("merchant_code")]
[System.Text.Json.Serialization.JsonPropertyName("merchant_code")]
public string SubMerchantId { get; set; } = string.Empty;
/// <summary>
/// 获取或设置业务申请编号。
/// </summary>
[Newtonsoft.Json.JsonProperty("out_request_no")]
[System.Text.Json.Serialization.JsonPropertyName("out_request_no")]
public string OutRequestNumber { get; set; } = string.Empty;
/// <summary>
/// 获取或设置超级管理员信息。
/// </summary>
[Newtonsoft.Json.JsonProperty("contact_info")]
[System.Text.Json.Serialization.JsonPropertyName("contact_info")]
public Types.Contact Contact { get; set; } = new Types.Contact();
}
}

View File

@@ -0,0 +1,15 @@
namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models
{
/// <summary>
/// <para>表示 [POST] /mchalterapply/mchcontactalterapplyment 接口的响应。</para>
/// </summary>
public class CreateMerchantAlterApplyMerchantContactAlterApplymentResponse : WechatTenpayResponse
{
/// <summary>
/// 获取或设置申请单号。
/// </summary>
[Newtonsoft.Json.JsonProperty("apply_id")]
[System.Text.Json.Serialization.JsonPropertyName("apply_id")]
public string ApplymentId { get; set; } = default!;
}
}

View File

@@ -0,0 +1,15 @@
namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models
{
/// <summary>
/// <para>表示 [GET] /mchalterapply/mchcontactalterapplyment/{apply_id} 接口的请求。</para>
/// </summary>
public class GetMerchantAlterApplyMerchantContactAlterApplymentByApplymentIdRequest : WechatTenpayRequest
{
/// <summary>
/// 获取或设置申请单号。
/// </summary>
[Newtonsoft.Json.JsonIgnore]
[System.Text.Json.Serialization.JsonIgnore]
public string ApplymentId { get; set; } = string.Empty;
}
}

View File

@@ -0,0 +1,9 @@
namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models
{
/// <summary>
/// <para>表示 [GET] /mchalterapply/mchcontactalterapplyment/{apply_id} 接口的响应。</para>
/// </summary>
public class GetMerchantAlterApplyMerchantContactAlterApplymentByApplymentIdResponse : GetMerchantAlterApplyMerchantContactAlterApplymentByOutRequestNumberResponse
{
}
}

View File

@@ -0,0 +1,22 @@
namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models
{
/// <summary>
/// <para>表示 [GET] /mchalterapply/mchcontactalterapplyment/merchant/{merchant_code}/out-request-no/{out_request_no} 接口的请求。</para>
/// </summary>
public class GetMerchantAlterApplyMerchantContactAlterApplymentByOutRequestNumberRequest : WechatTenpayRequest
{
/// <summary>
/// 获取或设置特约商户号。
/// </summary>
[Newtonsoft.Json.JsonIgnore]
[System.Text.Json.Serialization.JsonIgnore]
public string SubMerchantId { get; set; } = string.Empty;
/// <summary>
/// 获取或设置业务申请编号。
/// </summary>
[Newtonsoft.Json.JsonIgnore]
[System.Text.Json.Serialization.JsonIgnore]
public string OutRequestNumber { get; set; } = string.Empty;
}
}

View File

@@ -0,0 +1,70 @@
namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models
{
/// <summary>
/// <para>表示 [GET] /mchalterapply/mchcontactalterapplyment/merchant/{merchant_code}/out-request-no/{out_request_no} 接口的响应。</para>
/// </summary>
public class GetMerchantAlterApplyMerchantContactAlterApplymentByOutRequestNumberResponse : WechatTenpayResponse
{
public static class Types
{
public class AuditRejectDetail
{
/// <summary>
/// 获取或设置参数名称。
/// </summary>
[Newtonsoft.Json.JsonProperty("param_name")]
[System.Text.Json.Serialization.JsonPropertyName("param_name")]
public string ParameterName { get; set; } = default!;
/// <summary>
/// 获取或设置驳回原因。
/// </summary>
[Newtonsoft.Json.JsonProperty("reject_reason")]
[System.Text.Json.Serialization.JsonPropertyName("reject_reason")]
public string RejectReason { get; set; } = default!;
}
}
/// <summary>
/// 获取或设置特约商户号。
/// </summary>
[Newtonsoft.Json.JsonProperty("merchant_code")]
[System.Text.Json.Serialization.JsonPropertyName("merchant_code")]
public string SubMerchantId { get; set; } = default!;
/// <summary>
/// 获取或设置业务申请编号。
/// </summary>
[Newtonsoft.Json.JsonProperty("out_request_no")]
[System.Text.Json.Serialization.JsonPropertyName("out_request_no")]
public string OutRequestNumber { get; set; } = default!;
/// <summary>
/// 获取或设置申请单号。
/// </summary>
[Newtonsoft.Json.JsonProperty("apply_id")]
[System.Text.Json.Serialization.JsonPropertyName("apply_id")]
public string ApplymentId { get; set; } = default!;
/// <summary>
/// 获取或设置申请单状态。
/// </summary>
[Newtonsoft.Json.JsonProperty("state")]
[System.Text.Json.Serialization.JsonPropertyName("state")]
public string ApplymentState { get; set; } = default!;
/// <summary>
/// 获取或设置驳回原因。
/// </summary>
[Newtonsoft.Json.JsonProperty("audit_reject_reason")]
[System.Text.Json.Serialization.JsonPropertyName("audit_reject_reason")]
public string? AuditRejectReason { get; set; }
/// <summary>
/// 获取或设置驳回原因详情列表。
/// </summary>
[Newtonsoft.Json.JsonProperty("audit_reject_detail")]
[System.Text.Json.Serialization.JsonPropertyName("audit_reject_detail")]
public Types.AuditRejectDetail[]? AuditRejectDetailList { get; set; }
}
}

View File

@@ -0,0 +1,15 @@
namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models
{
/// <summary>
/// <para>表示 [POST] /mchalterapply/mchcontactalterapplyment/{apply_id}/revoke 接口的请求。</para>
/// </summary>
public class RevokeMerchantAlterApplyMerchantContactAlterApplymentRequest : WechatTenpayRequest
{
/// <summary>
/// 获取或设置申请单号。
/// </summary>
[Newtonsoft.Json.JsonIgnore]
[System.Text.Json.Serialization.JsonIgnore]
public string ApplymentId { get; set; } = string.Empty;
}
}

View File

@@ -0,0 +1,22 @@
namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models
{
/// <summary>
/// <para>表示 [POST] /mchalterapply/mchcontactalterapplyment/{apply_id}/revoke 接口的响应。</para>
/// </summary>
public class RevokeMerchantAlterApplyMerchantContactAlterApplymentResponse : WechatTenpayResponse
{
/// <summary>
/// 获取或设置申请单号。
/// </summary>
[Newtonsoft.Json.JsonProperty("apply_id")]
[System.Text.Json.Serialization.JsonPropertyName("apply_id")]
public string ApplymentId { get; set; } = default!;
/// <summary>
/// 获取或设置申请单状态。
/// </summary>
[Newtonsoft.Json.JsonProperty("state")]
[System.Text.Json.Serialization.JsonPropertyName("state")]
public string ApplymentState { get; set; } = default!;
}
}

View File

@@ -62,7 +62,7 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models
public string? CompanyAddress { get; set; }
}
public class FinanceInstitutionLicense : CreateApplyForSubjectApplymentRequest.Types.Subject.Types.FinanceInstitutionLicense
public class FinanceInstitutionLicense : CreateApplyForSubMerchantApplymentRequest.Types.Subject.Types.FinanceInstitutionLicense
{
}

View File

@@ -9,7 +9,7 @@
### 【功能特性】
- 基于微信支付 v3 版 API 封装。
- 支持商户(直连模式)、合作伙伴(服务商、渠道商、机构、银行模式)两种角色模式。
- 支持普通商户(直连)、合作伙伴(服务商、渠道商、机构、银行)两种接入模式。\
- 请求时自动生成签名(支持国际 RSA 算法或国密 SM 算法),无需开发者手动干预。
- 提供了微信支付所需的 AES、RSA、SM2/SM3/SM4、SHA-256 等算法工具类。
- 提供了调起支付签名、解析响应敏感数据、解析回调通知事件敏感数据等扩展方法。

View File

@@ -0,0 +1,85 @@
{
"out_request_no": "APPLYMENT_00000000001",
"organization_type": "2",
"finance_institution": true,
"business_license_info": {
"cert_type": "CERTIFICATE_TYPE_2388",
"business_license_copy": "47ZC6GC-vnrbEny__Ie_An5-tCpqxucuxi-vByf3Gjm7KE53JXvGy9tqZm2XAUf-4KGprrKhpVBDIUv0OF4wFNIO4kqg05InE4d2I6_H7I4",
"business_license_number": "123456789012345678",
"merchant_name": "腾讯科技有限公司",
"legal_person": "张三",
"company_address": "深圳南山区科苑路",
"business_time": "[\\\"2014-01-01\\\",\\\"长期\\\"]"
},
"finance_institution_info": {
"finance_type": "BANK_AGENT",
"finance_license_pics": [
"example_finance_license_pics"
]
},
"id_holder_type": "LEGAL",
"id_doc_type": "IDENTIFICATION_TYPE_MACAO",
"authorize_letter_copy": "47ZC6GC-vnrbEny_Ie_An5-tCpqxucuxi-vByf3Gjm7KEIUv0OF4wFNIO4kqg05InE4d2I6_H7I4",
"id_card_info": {
"id_card_copy": "jTpGmxUX3FBWVQ5NJTZvlKX_gdU4cRz7z5NxpnFuAxhBTEO_PvWkfSCJ3zVIn001D8daLC-ehEuo0BJqRTvDujqhThn4ReFxikqJ5YW6zFQ",
"id_card_national": "47ZC6GC-vnrbEny__Ie_An5-tCpqxucuxi-vByf3Gjm7KE53JXvGy9tqZm2XAUf-4KGprrKhpVBDIUv0OF4wFNIO4kqg05InE4d2I6_H7I4",
"id_card_name": "pVd1HJ6zyvPedzGaV+X3qtmrq9bb9tPROvwia4ibL+F6mfjbzQIzfb3HHLEjZ4YiR/cJiCrZxnAqi+pjeKIEdkwzXRAI7FUhrfPK3SNjaBTEu9GmsugMIA9r3x887Q+ODuC8HH2nzAn7NGpE/e3yiHgWhk0ps5k5DP/2qIdGdONoDzZelrxCl/NWWNUyB93K9F+jC1JX2IMttdY+aQ6zBlw0xnOiNW6Hzy7UtC+xriudjD5APomty7/mYNxLMpRSvWKIjOv/69bDnuC4EL5Kz4jBHLiCyOb+tI0m2qhZ9evAM+Jv1z0NVa8MRtelw/wDa4SzfeespQO/0kjiwfqdfg==",
"id_card_number": "AOZdYGISxo4y44/UgZ69bdu9X+tfMUJ9dl+LetjM45/zMbrYu+wWZ8gn4CTdo+D/m9MrPg+V4sm73oxqdQu/hj7aWyDl4GQtPXVdaztB9jVbVZh3QFzV+BEmytMNQp9dt1uWJktlfdDdLR3AMWyMB377xd+m9bSr/ioDTzagEcGe+vLYiKrzcroQv3OR0p3ppFYoQ3IfYeU/04S4t9rNFL+kyblK2FCCqQ11NdbbHoCrJc7NV4oASq6ZFonjTtgjjgKsadIKHXtb3JZKGZjduGdtkRJJp0/0eow96uY1Pk7Rq79Jtt7+I8juwEc4P4TG5xzchG/5IL9DBd+Z0zZXkw==",
"id_card_valid_time_begin": "2019-06-06",
"id_card_valid_time": "2026-06-06"
},
"id_doc_info": {
"id_doc_copy": "47ZC6GC-vnrbEny__Ie_An5-tCpqxucuxi-vByf3Gjm7KE53JXvGy9tqZm2XAUf-4KGprrKhpVBDIUv0OF4wFNIO4kqg05InE4d2I6_H7I4",
"id_doc_copy_back": "47ZC6GC-vnrbEny__Ie_An5-tCpqxucuxi-vByf3Gjm7KE53JXvGy9tqZm2XAUf-4KGprrKhpVBDIUv0OF4wFNIO4kqg05InE4d2I6_H7I4",
"id_doc_name": "jTpGmxUX3FBWVQ5NJTZvlKX_gdU4cRz7z5NxpnFuAxhBTEO_PvWkfSCJ3zVIn001D8daLC-ehEuo0BJqRTvDujqhThn4ReFxikqJ5YW6zFQ",
"id_doc_number": "jTpGmxUX3FBWVQ5NJTZvlKX_gdU4cRz7z5NxpnFuAxhBTEO_PvWkfSCJ3zVIn001D8daLC-ehEuo0BJqRTvDujqhThn4ReFxikqJ5YW6zFQ",
"doc_period_begin": "2019-06-06",
"doc_period_end": "2020-01-02"
},
"ubo_info_list": [
{
"ubo_id_doc_type": "IDENTIFICATION_TYPE_MAINLAND_IDCARD",
"ubo_id_doc_copy": "jTpGmxUXqRTvDujqhThn4ReFxikqJ5YW6zFQ",
"ubo_id_doc_copy_back": "jTpGmxUX3FBWVQ5NJTZvvDujqhThn4ReFxikqJ5YW6zFQ",
"ubo_id_doc_name": "AOZdYGISxo4y44/Ug4P4TG5xzchG/5IL9DBd+Z0zZXkw==",
"ubo_id_doc_number": "AOZdYGISxo4y44/Ug4P4TG5xzchG/5IL9DBd+Z0zZXkw==",
"ubo_id_doc_address": "pVd1HJ6zyvPedzGaV+X3qtmrq9bb9tPROvwia4ibL+F6mfjbzQIzfb3HHLEjZ4YiR/cJiCrZxnAqi+pjeKIEdkwzXRAI7FUhrfPK3SNjaBTEu9GmsugMIA9r3x887Q+ODuC8HH2nzAn7NGpE/e3yiHgWhk0ps5k5DP/2qIdGdONoDzZelrxCl/NWWNUyB93K9F+jC1JX2IMttdY+aQ6zBlw0xnOiNW6Hzy7UtC+xriudjD5APomty7/mYNxLMpRSvWKIjOv/69bDnuC4EL5Kz4jBHLiCyOb+tI0m2qhZ9evAM+Jv1z0NVa8MRtelw/wDa4SzfeespQO/0kjiwfqdfg==",
"ubo_id_doc_period_begin": "2019-06-06",
"ubo_id_doc_period_end": "2026-06-06"
}
],
"account_info": {
"bank_account_type": "75",
"account_bank": "工商银行",
"account_name": "AOZdYGISxo4y44/UgZ69bdu9X+tfMUJ9dl+LetjM45/zMbrYu+wWZ8gn4CTdo+D/m9MrPg+V4sm73oxqdQu/hj7aWyDl4GQtPXVdaztB9jVbVZh3QFzV+BEmytMNQp9dt1uWJktlfdDdLR3AMWyMB377xd+m9bSr/ioDTzagEcGe+vLYiKrzcroQv3OR0p3ppFYoQ3IfYeU/04S4t9rNFL+kyblK2FCCqQ11NdbbHoCrJc7NV4oASq6ZFonjTtgjjgKsadIKHXtb3JZKGZjduGdtkRJJp0/0eow96uY1Pk7Rq79Jtt7+I8juwEc4P4TG5xzchG/5IL9DBd+Z0zZXkw==",
"bank_branch_id": "402713354941",
"bank_name": "施秉县农村信用合作联社城关信用社",
"account_number": "d+xT+MQCvrLHUVDWv/8MR/dB7TkXM2YYZlokmXzFsWs35NXUot7C0NcxIrUF5FnxqCJHkNgKtxa6RxEYyba1+VBRLnqKG2fSy/Y5qDN08Ej9zHCwJjq52Wg1VG8MRugli9YMI1fI83KGBxhuXyemgS/hqFKsfYGiOkJqjTUpgY5VqjtL2N4l4z11T0ECB/aSyVXUysOFGLVfSrUxMPZy6jWWYGvT1+4P633f+R+ki1gT4WF/2KxZOYmli385ZgVhcR30mr4/G3HBcxi13zp7FnEeOsLlvBmI1PHN4C7Rsu3WL8sPndjXTd75kPkyjqnoMRrEEaYQE8ZRGYoeorwC+w=="
},
"contact_info": {
"contact_type": "65",
"contact_name": "pVd1HJ6zyvPedzGaV+X3qtmrq9bb9tPROvwia4ibL+F6mfjbzQIzfb3HHLEjZ4YiR/cJiCrZxnAqi+pjeKIEdkwzXRAI7FUhrfPK3SNjaBTEu9GmsugMIA9r3x887Q+ODuC8HH2nzAn7NGpE/e3yiHgWhk0ps5k5DP/2qIdGdONoDzZelrxCl/NWWNUyB93K9F+jC1JX2IMttdY+aQ6zBlw0xnOiNW6Hzy7UtC+xriudjD5APomty7/mYNxLMpRSvWKIjOv/69bDnuC4EL5Kz4jBHLiCyOb+tI0m2qhZ9evAM+Jv1z0NVa8MRtelw/wDa4SzfeespQO/0kjiwfqdfg==",
"contact_id_doc_type": "IDENTIFICATION_TYPE_MACAO",
"contact_id_card_number": "pVd1HJ6zyvPedzGaV+X3qtmrq9bb9tPROvwia4ibL+F6mfjbzQIzfb3HHLEjZ4YiR/cJiCrZxnAqi+pjeKIEdkwzXRAI7FUhrfPK3SNjaBTEu9GmsugMIA9r3x887Q+ODuC8HH2nzAn7NGpE/e3yiHgWhk0ps5k5DP/2qIdGdONoDzZelrxCl/NWWNUyB93K9F+jC1JX2IMttdY+aQ6zBlw0xnOiNW6Hzy7UtC+xriudjD5APomty7/mYNxLMpRSvWKIjOv/69bDnuC4EL5Kz4jBHLiCyOb+tI0m2qhZ9evAM+Jv1z0NVa8MRtelw/wDa4SzfeespQO/0kjiwfqdfg==",
"contact_id_doc_copy": "jTpGmxUX3FBWVQ5NJTZvvDujqhThn4ReFxikqJ5YW6zFQ",
"contact_id_doc_copy_back": "jTpGmxUX3FBWVQ5NJTZvvDujqhThn4ReFxikqJ5YW6zFQ",
"contact_id_doc_period_begin": "2019-06-06",
"contact_id_doc_period_end": "2026-06-06",
"mobile_phone": "pVd1HJ6zyvPedzGaV+X3qtmrq9bb9tPROvwia4ibL+F6mfjbzQIzfb3HHLEjZ4YiR/cJiCrZxnAqi+pjeKIEdkwzXRAI7FUhrfPK3SNjaBTEu9GmsugMIA9r3x887Q+ODuC8HH2nzAn7NGpE/e3yiHgWhk0ps5k5DP/2qIdGdONoDzZelrxCl/NWWNUyB93K9F+jC1JX2IMttdY+aQ6zBlw0xnOiNW6Hzy7UtC+xriudjD5APomty7/mYNxLMpRSvWKIjOv/69bDnuC4EL5Kz4jBHLiCyOb+tI0m2qhZ9evAM+Jv1z0NVa8MRtelw/wDa4SzfeespQO/0kjiwfqdfg=="
},
"sales_scene_info": {
"store_name": "爱烧烤",
"store_url": "http://www.qq.com",
"store_qr_code": "jTpGmxUX3FBWVQ5NJTZvlKX_gdU4cRz7z5NxpnFuAxhBTEO_PvWkfSCJ3zVIn001D8daLC-ehEuo0BJqRTvDujqhThn4ReFxikqJ5YW6zFQ",
"mini_program_sub_appid": "wxa123344545577"
},
"settlement_info": {
"settlement_id": 719,
"qualification_type": "零售批发/生活娱乐/其他"
},
"merchant_shortname": "腾讯",
"qualifications": [ "jTpGmxUX3FBWVQ5NJTZvlKX_gdU4cRz7z5NxpnFuAxhBTEO_PvWkfSCJ3zVIn001D8daLC-ehEuo0BJqRTvDujqhThn4ReFxikqJ5YW6zFQ", "47ZC6GC-vnrbEny__Ie_An5-tCpqxucuxi-vByf3Gjm7KE53JXvGy9tqZm2XAUf-4KGprrKhpVBDIUv0OF4wFNIO4kqg05InE4d2I6_H7I4" ],
"business_addition_pics": [ "jTpGmxUX3FBWVQ5NJTZvlKX_gdU4cRz7z5NxpnFuAxhBTEO_PvWkfSCJ3zVIn001D8daLC-ehEuo0BJqRTvDujqhThn4ReFxikqJ5YW6zFQ", "47ZC6GC-vnrbEny__Ie_An5-tCpqxucuxi-vByf3Gjm7KE53JXvGy9tqZm2XAUf-4KGprrKhpVBDIUv0OF4wFNIO4kqg05InE4d2I6_H7I4" ],
"business_addition_desc": "特殊情况,说明原因",
"proxy_sign_verify_mode": true
}

View File

@@ -0,0 +1,4 @@
{
"applyment_id": 2000002124775691,
"out_request_no": "APPLYMENT_00000000001"
}

View File

@@ -0,0 +1,9 @@
{
"out_request_no": "1900013511_10000",
"applyment_id": 2000002124775691,
"pre_sign_time": "2018-06-08T10:34:56+08:00",
"proxy_verify_identity_info": {
"verify_identity_type": "VERIFY_IDENTITY_TYPE_FACE_TO_FACE",
"verify_identity_result": true
}
}

View File

@@ -0,0 +1,4 @@
{
"applyment_id": 2000002124775691,
"out_request_no": "APPLYMENT_00000000001"
}

View File

@@ -0,0 +1,4 @@
{
"applyment_id": 2000002124775691,
"out_request_no": "APPLYMENT_00000000001"
}

View File

@@ -0,0 +1,14 @@
{
"merchant_code": "2492185251",
"out_request_no": "1900013511_10000",
"contact_info": {
"contact_name": "pVd1HJ6zyvPedzGaV+X3IdGdbDnuC4Eelw/wDa4SzfeespQO/0kjiwfqdfg==",
"contact_id_doc_type": "IDENTIFICATION_TYPE_IDCARD",
"contact_id_card_number": "pVd1HJ6zyvPedzGaV+X3qtmrq9bb9tPROvwia4ibL+F6mfjbzQIzfb3HHDnuC4EL5Kz4jBHLiCyOb+tI0m2qhZ9evAM+Jv1z0NVa8MRtelw/wDa4SzfeespQO/0kjiwfqdfg==",
"contact_id_doc_copy": "jTpGmxUX3FBWVQ5NJTZvvDujqhThn4ReFxikqJ5YW6zFQ",
"contact_id_doc_copy_back": "jTpGmxUX3FBWVQ5NJTZvvDujqhThn4ReFxikqJ5YW6zFQ",
"contact_id_doc_period_begin": "2019-06-06",
"contact_id_doc_period_end": "2026-06-06",
"mobile_phone": "pVd1HJ6zyvPedzGaV+X3qtmrq9bb9tPROvwia4ibL+F6mfjbzQIzfb3HHLEjZ4YiNWWNeespQO/0kjiwfqdfg=="
}
}

View File

@@ -0,0 +1,13 @@
{
"apply_id": "20220617143306000013906025001",
"out_request_no": "1900013511_10000",
"merchant_code": "1900006491",
"state": "APPLYMENT_STATE_AUDITING",
"audit_reject_reason": "身份证背面识别失败,请上传更清晰的身份证图片。",
"audit_reject_detail": [
{
"param_name": "ubo_info_list.card_number_0",
"reject_reason": "身份证背面识别失败,请上传更清晰的身份证图片。"
}
]
}

View File

@@ -0,0 +1,13 @@
{
"apply_id": "20220617143306000013906025001",
"out_request_no": "1900013511_10000",
"merchant_code": "1900006491",
"state": "APPLYMENT_STATE_AUDITING",
"audit_reject_reason": "身份证背面识别失败,请上传更清晰的身份证图片。",
"audit_reject_detail": [
{
"param_name": "ubo_info_list.card_number_0",
"reject_reason": "身份证背面识别失败,请上传更清晰的身份证图片。"
}
]
}

View File

@@ -0,0 +1,4 @@
{
"apply_id": "20220617143306000013906025001",
"state": "APPLYMENT_STATE_AUDITING"
}

View File

@@ -1324,6 +1324,68 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests
}
}
[Fact(DisplayName = "测试用例:加密请求中的敏感数据([POST] /mchalterapply/mchcontactalterapplyment")]
public async Task TestEncryptRequestSensitiveProperty_CreateMerchantAlterApplyMerchantContactAlterApplymentRequest()
{
static Models.CreateMerchantAlterApplyMerchantContactAlterApplymentRequest GenerateMockRequestModel()
{
return new Models.CreateMerchantAlterApplyMerchantContactAlterApplymentRequest()
{
Contact = new Models.CreateMerchantAlterApplyMerchantContactAlterApplymentRequest.Types.Contact()
{
ContactName = MOCK_PLAIN_STR,
IdNumber = MOCK_PLAIN_STR,
MobileNumber = MOCK_PLAIN_STR
}
};
}
static void AssertMockRequestModel(Models.CreateMerchantAlterApplyMerchantContactAlterApplymentRequest request, Func<string, string> decryptor)
{
Assert.NotEqual(MOCK_PLAIN_STR, request.Contact!.ContactName!);
Assert.NotEqual(MOCK_PLAIN_STR, request.Contact!.IdNumber!);
Assert.NotEqual(MOCK_PLAIN_STR, request.Contact!.MobileNumber!);
Assert.Equal(MOCK_PLAIN_STR, decryptor.Invoke(request.Contact!.ContactName!));
Assert.Equal(MOCK_PLAIN_STR, decryptor.Invoke(request.Contact!.IdNumber!));
Assert.Equal(MOCK_PLAIN_STR, decryptor.Invoke(request.Contact!.MobileNumber!));
Assert.Equal(MOCK_CERT_SN, request.WechatpaySerialNumber!, ignoreCase: true);
}
if (!string.IsNullOrEmpty(TestConfigs.WechatMerchantRSACertificatePrivateKey))
{
using (var client = CreateMockClientUseRSA(autoEncrypt: false))
{
var request = GenerateMockRequestModel();
client.EncryptRequestSensitiveProperty(request);
AssertMockRequestModel(request, (cipher) => Utilities.RSAUtility.DecryptWithECB(RSA_PEM_PRIVATE_KEY, (EncodedString)cipher)!);
}
using (var client = CreateMockClientUseRSA(autoEncrypt: true))
{
var request = GenerateMockRequestModel();
await client.ExecuteCreateMerchantAlterApplyMerchantContactAlterApplymentAsync(request);
AssertMockRequestModel(request, (cipher) => Utilities.RSAUtility.DecryptWithECB(RSA_PEM_PRIVATE_KEY, (EncodedString)cipher)!);
}
}
if (!string.IsNullOrEmpty(TestConfigs.WechatMerchantSM2CertificatePrivateKey))
{
using (var client = CreateMockClientUseSM2(autoEncrypt: false))
{
var request = GenerateMockRequestModel();
client.EncryptRequestSensitiveProperty(request);
AssertMockRequestModel(request, (cipher) => Utilities.SM2Utility.Decrypt(SM2_PEM_PRIVATE_KEY, (EncodedString)cipher)!);
}
using (var client = CreateMockClientUseSM2(autoEncrypt: true))
{
var request = GenerateMockRequestModel();
await client.ExecuteCreateMerchantAlterApplyMerchantContactAlterApplymentAsync(request);
AssertMockRequestModel(request, (cipher) => Utilities.SM2Utility.Decrypt(SM2_PEM_PRIVATE_KEY, (EncodedString)cipher)!);
}
}
}
[Fact(DisplayName = "测试用例:加密请求中的敏感数据([POST] /mchalterapply/mchsubjectalterapplyment")]
public async Task TestEncryptRequestSensitiveProperty_CreateMerchantAlterApplyMerchantSubjectAlterApplymentRequest()
{