feat(tenpayv3): 随官方更新商户进件结算账号相关接口模型

This commit is contained in:
Fu Diwei
2023-03-30 21:40:48 +08:00
parent c52973539c
commit 86a7b4ecb9
17 changed files with 203 additions and 35 deletions

View File

@@ -520,6 +520,8 @@
- 查询结算账户:`GetApplyForSubMerchantSettlement` - 查询结算账户:`GetApplyForSubMerchantSettlement`
- 查询结算账户修改申请状态:`GetApplyForSubMerchantSettlementByApplicationNumber`
- 基础支付 - 基础支付
- JSAPI 支付 - JSAPI 支付
@@ -722,6 +724,8 @@
- 查询结算账户:`GetApplyForSubMerchantSettlement` - 查询结算账户:`GetApplyForSubMerchantSettlement`
- 查询结算账户修改申请状态:`GetApplyForSubMerchantSettlementByApplicationNumber`
- 电商收付通(普通支付) - 电商收付通(普通支付)
- APP 下单:`CreatePayPartnerTransactionApp` - APP 下单:`CreatePayPartnerTransactionApp`

View File

@@ -47,7 +47,8 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Sample.Controllers
{ {
// NOTICE: // NOTICE:
// 需提前注入 CertificateManager、并下载平台证书才可以使用扩展方法执行验签操作。 // 需提前注入 CertificateManager、并下载平台证书才可以使用扩展方法执行验签操作。
// 有关 CertificateManager 的用法请参阅《开发文档 / 基础用法 / 如何验证回调通知事件签名?》 // 请参考本示例项目 TenpayCertificateRefreshingBackgroundService 后台任务中的相关实现
// 有关 CertificateManager 的完整介绍请参阅《开发文档 / 基础用法 / 如何验证回调通知事件签名?》。
// 后续如何解密并反序列化,请参阅《开发文档 / 基础用法 / 如何解密回调通知事件中的敏感数据?》。 // 后续如何解密并反序列化,请参阅《开发文档 / 基础用法 / 如何解密回调通知事件中的敏感数据?》。
return new JsonResult(new { code = "FAIL", message = "验签失败" }); return new JsonResult(new { code = "FAIL", message = "验签失败" });

View File

@@ -38,7 +38,8 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Sample.Controllers
{ {
// NOTICE: // NOTICE:
// 需提前注入 CertificateManager、并添加平台证书才可以使用扩展方法执行验签操作。 // 需提前注入 CertificateManager、并添加平台证书才可以使用扩展方法执行验签操作。
// 有关 CertificateManager 的用法请参阅《开发文档 / 基础用法 / 如何验证回调通知事件签名?》 // 请参考本示例项目 TenpayCertificateRefreshingBackgroundService 后台任务中的相关实现
// 有关 CertificateManager 的完整介绍请参阅《开发文档 / 基础用法 / 如何验证回调通知事件签名?》。
// 后续如何解密并反序列化,请参阅《开发文档 / 基础用法 / 如何解密回调通知事件中的敏感数据?》。 // 后续如何解密并反序列化,请参阅《开发文档 / 基础用法 / 如何解密回调通知事件中的敏感数据?》。
return Json(new { code = "FAIL", message = "验签失败" }); return Json(new { code = "FAIL", message = "验签失败" });

View File

@@ -2,6 +2,8 @@ using System;
namespace SKIT.FlurlHttpClient.Wechat.TenpayV3 namespace SKIT.FlurlHttpClient.Wechat.TenpayV3
{ {
using SKIT.FlurlHttpClient.Wechat.TenpayV3.Settings;
internal static class WechatTenpayClientSignExtensions internal static class WechatTenpayClientSignExtensions
{ {
public static bool VerifySignature(this WechatTenpayClient client, string strTimestamp, string strNonce, string strContent, string strSignature, string strSignatureScheme, string strSerialNumber, out Exception? error) public static bool VerifySignature(this WechatTenpayClient client, string strTimestamp, string strNonce, string strContent, string strSignature, string strSignatureScheme, string strSerialNumber, out Exception? error)
@@ -18,14 +20,14 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3
return false; return false;
} }
var entry = client.PlatformCertificateManager.GetEntry(strSerialNumber); CertificateEntry? entry = client.PlatformCertificateManager.GetEntry(strSerialNumber);
if (!entry.HasValue) if (!entry.HasValue)
{ {
error = new Exception($"There is no platform certificate matched the serial number: \"{strSerialNumber}\". Please make sure you have downloaded platform certificates first."); error = new Exception($"There is no platform certificate matched the serial number: \"{strSerialNumber}\". Please make sure you have downloaded platform certificates first.");
return false; return false;
} }
if (!Settings.CertificateEntry.ALGORITHM_TYPE_RSA.Equals(entry.Value.AlgorithmType)) if (!CertificateEntry.ALGORITHM_TYPE_RSA.Equals(entry.Value.AlgorithmType))
{ {
error = new Exception($"The platform certificate with serial number: \"{strSerialNumber}\" is not for RSA."); error = new Exception($"The platform certificate with serial number: \"{strSerialNumber}\" is not for RSA.");
return false; return false;
@@ -55,14 +57,14 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3
return false; return false;
} }
var entry = client.PlatformCertificateManager.GetEntry(strSerialNumber); CertificateEntry? entry = client.PlatformCertificateManager.GetEntry(strSerialNumber);
if (!entry.HasValue) if (!entry.HasValue)
{ {
error = new Exception($"There is no platform certificate matched the serial number: \"{strSerialNumber}\". Please make sure you have downloaded platform certificates first."); error = new Exception($"There is no platform certificate matched the serial number: \"{strSerialNumber}\". Please make sure you have downloaded platform certificates first.");
return false; return false;
} }
if (!Settings.CertificateEntry.ALGORITHM_TYPE_SM2.Equals(entry.Value.AlgorithmType)) if (!CertificateEntry.ALGORITHM_TYPE_SM2.Equals(entry.Value.AlgorithmType))
{ {
error = new Exception($"The platform certificate with serial number: \"{strSerialNumber}\" is not for SM2."); error = new Exception($"The platform certificate with serial number: \"{strSerialNumber}\" is not for SM2.");
return false; return false;

View File

@@ -1,4 +1,4 @@
using System; using System;
using System.Net.Http; using System.Net.Http;
using System.Threading; using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
@@ -74,9 +74,7 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3
/// <summary> /// <summary>
/// <para>异步调用 [POST] /apply4sub/sub_merchants/{sub_mchid}/modify-settlement 接口。</para> /// <para>异步调用 [POST] /apply4sub/sub_merchants/{sub_mchid}/modify-settlement 接口。</para>
/// <para>REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter11_1_3.shtml </para> /// <para>REF: https://pay.weixin.qq.com/docs/partner/apis/modify-settlement/sub-merchants/modify-settlement.html </para>
/// <para>REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter7_1_4.shtml </para>
/// <para>REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/Offline/apis/chapter4_6_3.shtml </para>
/// </summary> /// </summary>
/// <param name="client"></param> /// <param name="client"></param>
/// <param name="request"></param> /// <param name="request"></param>
@@ -95,9 +93,7 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3
/// <summary> /// <summary>
/// <para>异步调用 [GET] /apply4sub/sub_merchants/{sub_mchid}/settlement 接口。</para> /// <para>异步调用 [GET] /apply4sub/sub_merchants/{sub_mchid}/settlement 接口。</para>
/// <para>REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter11_1_4.shtml </para> /// <para>REF: https://pay.weixin.qq.com/docs/partner/apis/modify-settlement/sub-merchants/get-settlement.html </para>
/// <para>REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter7_1_5.shtml </para>
/// <para>REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/Offline/apis/chapter4_6_5.shtml </para>
/// </summary> /// </summary>
/// <param name="client"></param> /// <param name="client"></param>
/// <param name="request"></param> /// <param name="request"></param>
@@ -113,5 +109,24 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3
return await client.SendRequestWithJsonAsync<Models.GetApplyForSubMerchantSettlementResponse>(flurlReq, data: request, cancellationToken: cancellationToken); return await client.SendRequestWithJsonAsync<Models.GetApplyForSubMerchantSettlementResponse>(flurlReq, data: request, cancellationToken: cancellationToken);
} }
/// <summary>
/// <para>异步调用 [GET] /apply4sub/sub_merchants/{sub_mchid}/application/{application_no} 接口。</para>
/// <para>REF: https://pay.weixin.qq.com/docs/partner/apis/modify-settlement/sub-merchants/get-application.html </para>
/// </summary>
/// <param name="client"></param>
/// <param name="request"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
public static async Task<Models.GetApplyForSubMerchantSettlementByApplicationNumberResponse> ExecuteGetApplyForSubMerchantSettlementByApplicationNumberAsync(this WechatTenpayClient client, Models.GetApplyForSubMerchantSettlementByApplicationNumberRequest 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.Get, "apply4sub", "sub_merchants", request.SubMerchantId, "application", request.ApplicationNumber);
return await client.SendRequestWithJsonAsync<Models.GetApplyForSubMerchantSettlementByApplicationNumberResponse>(flurlReq, data: request, cancellationToken: cancellationToken);
}
} }
} }

View File

@@ -1,9 +1,12 @@
using System; using System;
using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Reflection; using System.Reflection;
namespace SKIT.FlurlHttpClient.Wechat.TenpayV3 namespace SKIT.FlurlHttpClient.Wechat.TenpayV3
{ {
using SKIT.FlurlHttpClient.Wechat.TenpayV3.Settings;
/// <summary> /// <summary>
/// 为 <see cref="WechatTenpayClient"/> 提供请求模型敏感数据加密的扩展方法。 /// 为 <see cref="WechatTenpayClient"/> 提供请求模型敏感数据加密的扩展方法。
/// </summary> /// </summary>
@@ -14,7 +17,7 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3
{ {
Utilities.ReflectionUtility.ReplacePropertyStringValue(ref request, (target, currentProp, oldValue) => Utilities.ReflectionUtility.ReplacePropertyStringValue(ref request, (target, currentProp, oldValue) =>
{ {
var attribute = currentProp WechatTenpaySensitivePropertyAttribute? attribute = currentProp
.GetCustomAttributes<WechatTenpaySensitivePropertyAttribute>() .GetCustomAttributes<WechatTenpaySensitivePropertyAttribute>()
.FirstOrDefault(attr => Constants.SignSchemes.WECHATPAY2_RSA_2048_WITH_SHA256.Equals(attr.Scheme)); .FirstOrDefault(attr => Constants.SignSchemes.WECHATPAY2_RSA_2048_WITH_SHA256.Equals(attr.Scheme));
if (attribute == null) if (attribute == null)
@@ -27,22 +30,22 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3
if (string.IsNullOrEmpty(request.WechatpayCertificateSerialNumber)) if (string.IsNullOrEmpty(request.WechatpayCertificateSerialNumber))
{ {
// 如果未在请求中指定特定的平台证书序列号,从管理器中取过期时间最远的 // 如果未在请求中指定特定的平台证书序列号,从管理器中取过期时间最远的
var entries = client.PlatformCertificateManager.AllEntries() IEnumerable<CertificateEntry> entries = client.PlatformCertificateManager.AllEntries()
.Where(e => Settings.CertificateEntry.ALGORITHM_TYPE_RSA.Equals(e.AlgorithmType)) .Where(e => CertificateEntry.ALGORITHM_TYPE_RSA.Equals(e.AlgorithmType))
.OrderByDescending(e => e.ExpireTime); .OrderByDescending(e => e.ExpireTime);
if (!entries.Any()) if (!entries.Any())
{ {
throw new Exceptions.WechatTenpayEventVerificationException("Failed to encrypt request, because there is no platform certificate in the manager. Please make sure you have downloaded platform certificates first."); throw new Exceptions.WechatTenpayEventVerificationException("Failed to encrypt request, because there is no platform certificate in the manager. Please make sure you have downloaded platform certificates first.");
} }
var entry = entries.First(); CertificateEntry entry = entries.First();
certificate = entry.Certificate; certificate = entry.Certificate;
request.WechatpayCertificateSerialNumber = entry.SerialNumber; request.WechatpayCertificateSerialNumber = entry.SerialNumber;
} }
else else
{ {
// 如果已在请求中指定特定的平台证书序列号,直接从管理器中取值 // 如果已在请求中指定特定的平台证书序列号,直接从管理器中取值
var entry = client.PlatformCertificateManager.GetEntry(request.WechatpayCertificateSerialNumber!); CertificateEntry? entry = client.PlatformCertificateManager.GetEntry(request.WechatpayCertificateSerialNumber!);
if (!entry.HasValue) if (!entry.HasValue)
{ {
throw new Exceptions.WechatTenpayEventVerificationException($"Failed to encrypt request, because there is no platform certificate matched the serial number: \"{request.WechatpayCertificateSerialNumber}\". Please make sure you have downloaded platform certificates first."); throw new Exceptions.WechatTenpayEventVerificationException($"Failed to encrypt request, because there is no platform certificate matched the serial number: \"{request.WechatpayCertificateSerialNumber}\". Please make sure you have downloaded platform certificates first.");
@@ -89,7 +92,7 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3
{ {
Utilities.ReflectionUtility.ReplacePropertyStringValue(ref request, (target, currentProp, oldValue) => Utilities.ReflectionUtility.ReplacePropertyStringValue(ref request, (target, currentProp, oldValue) =>
{ {
var attribute = currentProp WechatTenpaySensitivePropertyAttribute? attribute = currentProp
.GetCustomAttributes<WechatTenpaySensitivePropertyAttribute>() .GetCustomAttributes<WechatTenpaySensitivePropertyAttribute>()
.FirstOrDefault(attr => Constants.SignSchemes.WECHATPAY2_SM2_WITH_SM3.Equals(attr.Scheme)); .FirstOrDefault(attr => Constants.SignSchemes.WECHATPAY2_SM2_WITH_SM3.Equals(attr.Scheme));
if (attribute == null) if (attribute == null)
@@ -102,22 +105,22 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3
if (string.IsNullOrEmpty(request.WechatpayCertificateSerialNumber)) if (string.IsNullOrEmpty(request.WechatpayCertificateSerialNumber))
{ {
// 如果未在请求中指定特定的平台证书序列号,从管理器中取过期时间最远的 // 如果未在请求中指定特定的平台证书序列号,从管理器中取过期时间最远的
var entries = client.PlatformCertificateManager.AllEntries() IEnumerable<CertificateEntry> entries = client.PlatformCertificateManager.AllEntries()
.Where(e => Settings.CertificateEntry.ALGORITHM_TYPE_SM2.Equals(e.AlgorithmType)) .Where(e => CertificateEntry.ALGORITHM_TYPE_SM2.Equals(e.AlgorithmType))
.OrderByDescending(e => e.ExpireTime); .OrderByDescending(e => e.ExpireTime);
if (!entries.Any()) if (!entries.Any())
{ {
throw new Exceptions.WechatTenpayEventVerificationException("Failed to encrypt request, because there is no platform certificate in the manager. Please make sure you have downloaded platform certificates first."); throw new Exceptions.WechatTenpayEventVerificationException("Failed to encrypt request, because there is no platform certificate in the manager. Please make sure you have downloaded platform certificates first.");
} }
var entry = entries.First(); CertificateEntry entry = entries.First();
certificate = entry.Certificate; certificate = entry.Certificate;
request.WechatpayCertificateSerialNumber = entry.SerialNumber; request.WechatpayCertificateSerialNumber = entry.SerialNumber;
} }
else else
{ {
// 如果已在请求中指定特定的平台证书序列号,直接从管理器中取值 // 如果已在请求中指定特定的平台证书序列号,直接从管理器中取值
var entry = client.PlatformCertificateManager.GetEntry(request.WechatpayCertificateSerialNumber!); CertificateEntry? entry = client.PlatformCertificateManager.GetEntry(request.WechatpayCertificateSerialNumber!);
if (!entry.HasValue) if (!entry.HasValue)
{ {
throw new Exceptions.WechatTenpayEventVerificationException($"Failed to encrypt request, because there is no platform certificate matched the serial number: \"{request.WechatpayCertificateSerialNumber}\". Please make sure you have downloaded platform certificates first."); throw new Exceptions.WechatTenpayEventVerificationException($"Failed to encrypt request, because there is no platform certificate matched the serial number: \"{request.WechatpayCertificateSerialNumber}\". Please make sure you have downloaded platform certificates first.");

View File

@@ -73,7 +73,7 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3
{ {
Utilities.ReflectionUtility.ReplacePropertyStringValue(ref response, (target, currentProp, oldValue) => Utilities.ReflectionUtility.ReplacePropertyStringValue(ref response, (target, currentProp, oldValue) =>
{ {
var attribute = currentProp WechatTenpaySensitivePropertyAttribute? attribute = currentProp
.GetCustomAttributes<WechatTenpaySensitivePropertyAttribute>() .GetCustomAttributes<WechatTenpaySensitivePropertyAttribute>()
.FirstOrDefault(attr => Constants.SignSchemes.WECHATPAY2_RSA_2048_WITH_SHA256.Equals(attr.Scheme)); .FirstOrDefault(attr => Constants.SignSchemes.WECHATPAY2_RSA_2048_WITH_SHA256.Equals(attr.Scheme));
if (attribute == null) if (attribute == null)
@@ -117,7 +117,7 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3
{ {
Utilities.ReflectionUtility.ReplacePropertyStringValue(ref response, (target, currentProp, oldValue) => Utilities.ReflectionUtility.ReplacePropertyStringValue(ref response, (target, currentProp, oldValue) =>
{ {
var attribute = currentProp WechatTenpaySensitivePropertyAttribute? attribute = currentProp
.GetCustomAttributes<WechatTenpaySensitivePropertyAttribute>() .GetCustomAttributes<WechatTenpaySensitivePropertyAttribute>()
.FirstOrDefault(attr => Constants.SignSchemes.WECHATPAY2_SM2_WITH_SM3.Equals(attr.Scheme)); .FirstOrDefault(attr => Constants.SignSchemes.WECHATPAY2_SM2_WITH_SM3.Equals(attr.Scheme));
if (attribute == null) if (attribute == null)

View File

@@ -0,0 +1,22 @@
namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models
{
/// <summary>
/// <para>表示 [GET] /apply4sub/sub_merchants/{sub_mchid}/application/{application_no} 接口的请求。</para>
/// </summary>
public class GetApplyForSubMerchantSettlementByApplicationNumberRequest : 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 ApplicationNumber { get; set; } = string.Empty;
}
}

View File

@@ -0,0 +1,82 @@
using System;
namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models
{
/// <summary>
/// <para>表示 [GET] /apply4sub/sub_merchants/{sub_mchid}/application/{application_no} 接口的响应。</para>
/// </summary>
public class GetApplyForSubMerchantSettlementByApplicationNumberResponse : WechatTenpayResponse
{
/// <summary>
/// 获取或设置账户类型。
/// </summary>
[Newtonsoft.Json.JsonProperty("account_type")]
[System.Text.Json.Serialization.JsonPropertyName("account_type")]
public string AccountType { get; set; } = default!;
/// <summary>
/// 获取或设置开户名称(掩码显示)。
/// </summary>
[Newtonsoft.Json.JsonProperty("account_name")]
[System.Text.Json.Serialization.JsonPropertyName("account_name")]
public string AccountName { get; set; } = default!;
/// <summary>
/// 获取或设置银行账号(掩码显示)。
/// </summary>
[Newtonsoft.Json.JsonProperty("account_number")]
[System.Text.Json.Serialization.JsonPropertyName("account_number")]
public string AccountNumber { get; set; } = default!;
/// <summary>
/// 获取或设置开户银行。
/// </summary>
[Newtonsoft.Json.JsonProperty("account_bank")]
[System.Text.Json.Serialization.JsonPropertyName("account_bank")]
public string AccountBank { get; set; } = default!;
/// <summary>
/// 获取或设置开户银行省市编码。
/// </summary>
[Newtonsoft.Json.JsonProperty("bank_address_code")]
[System.Text.Json.Serialization.JsonPropertyName("bank_address_code")]
public string? BankAddressCode { get; set; }
/// <summary>
/// 获取或设置开户银行联行号。
/// </summary>
[Newtonsoft.Json.JsonProperty("bank_branch_id")]
[System.Text.Json.Serialization.JsonPropertyName("bank_branch_id")]
public string? BankBranchId { get; set; }
/// <summary>
/// 获取或设置开户银行全称(含支行)。
/// </summary>
[Newtonsoft.Json.JsonProperty("bank_name")]
[System.Text.Json.Serialization.JsonPropertyName("bank_name")]
public string? BankBranchName { get; set; }
/// <summary>
/// 获取或设置汇款验证结果。
/// </summary>
[Newtonsoft.Json.JsonProperty("verify_result")]
[System.Text.Json.Serialization.JsonPropertyName("verify_result")]
public string VerifyResult { get; set; } = default!;
/// <summary>
/// 获取或设置汇款验证失败原因。
/// </summary>
[Newtonsoft.Json.JsonProperty("verify_fail_reason")]
[System.Text.Json.Serialization.JsonPropertyName("verify_fail_reason")]
public string? VerifyFailReason { get; set; }
/// <summary>
/// 获取或设置汇款验证失败原因。
/// </summary>
[Newtonsoft.Json.JsonProperty("verify_finish_time")]
[Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.RFC3339NullableDateTimeOffsetConverter))]
[System.Text.Json.Serialization.JsonPropertyName("verify_finish_time")]
[System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.RFC3339NullableDateTimeOffsetConverter))]
public DateTimeOffset? VerifyFinishTime { get; set; }
}
}

View File

@@ -1,4 +1,4 @@
namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models
{ {
/// <summary> /// <summary>
/// <para>表示 [GET] /apply4sub/sub_merchants/{sub_mchid}/settlement 接口的响应。</para> /// <para>表示 [GET] /apply4sub/sub_merchants/{sub_mchid}/settlement 接口的响应。</para>
@@ -31,7 +31,7 @@
/// </summary> /// </summary>
[Newtonsoft.Json.JsonProperty("bank_address_code")] [Newtonsoft.Json.JsonProperty("bank_address_code")]
[System.Text.Json.Serialization.JsonPropertyName("bank_address_code")] [System.Text.Json.Serialization.JsonPropertyName("bank_address_code")]
public string BankAddressCode { get; set; } = default!; public string? BankAddressCode { get; set; }
/// <summary> /// <summary>
/// 获取或设置开户银行联行号。 /// 获取或设置开户银行联行号。

View File

@@ -13,6 +13,13 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models
[System.Text.Json.Serialization.JsonIgnore] [System.Text.Json.Serialization.JsonIgnore]
public string SubMerchantId { get; set; } = string.Empty; public string SubMerchantId { get; set; } = string.Empty;
/// <summary>
/// 获取或设置修改模式。
/// </summary>
[Newtonsoft.Json.JsonProperty("modify_mode")]
[System.Text.Json.Serialization.JsonPropertyName("modify_mode")]
public string? ModifyMode { get; set; }
/// <summary> /// <summary>
/// 获取或设置账户类型。 /// 获取或设置账户类型。
/// </summary> /// </summary>
@@ -20,6 +27,15 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models
[System.Text.Json.Serialization.JsonPropertyName("account_type")] [System.Text.Json.Serialization.JsonPropertyName("account_type")]
public string AccountType { get; set; } = string.Empty; public string AccountType { get; set; } = string.Empty;
/// <summary>
/// 获取或设置开户名称(需使用平台公钥/证书加密)。
/// </summary>
[Newtonsoft.Json.JsonProperty("account_name")]
[System.Text.Json.Serialization.JsonPropertyName("account_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? AccountName { get; set; }
/// <summary> /// <summary>
/// 获取或设置银行账号(需使用平台公钥/证书加密)。 /// 获取或设置银行账号(需使用平台公钥/证书加密)。
/// </summary> /// </summary>

View File

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

View File

@@ -1,5 +1,4 @@
using System; using System;
using System.Linq;
using System.Net.Http; using System.Net.Http;
using System.Net.Http.Headers; using System.Net.Http.Headers;
using System.Threading; using System.Threading;

View File

@@ -0,0 +1,11 @@
{
"account_name": "张*",
"account_type": "ACCOUNT_TYPE_BUSINESS",
"account_bank": "工商银行",
"bank_name": "施秉县农村信用合作联社城关信用社",
"bank_branch_id": "402713354941",
"account_number": "62*************78",
"verify_result": "AUDIT_SUCCESS",
"verify_fail_reason": "银行卡户名或卡号有误",
"verify_finish_time": "2015-05-20T13:29:35+08:00"
}

View File

@@ -1,8 +1,9 @@
{ {
"account_type": "ACCOUNT_TYPE_BUSINESS", "account_type": "ACCOUNT_TYPE_BUSINESS",
"account_bank": "工商银行", "account_bank": "工商银行",
"bank_name": "施秉县农村信用合作联社城关信用社", "bank_name": "施秉县农村信用合作联社城关信用社",
"bank_branch_id": "402713354941", "bank_branch_id": "402713354941",
"account_number": "***************8678", "account_number": "62*************78",
"verify_result": "VERIFY_SUCCESS" "verify_result": "VERIFY_SUCCESS",
"verify_fail_reason": "用户姓名/证件/手机不匹配,请核对后重试"
} }

View File

@@ -1,8 +1,10 @@
{ {
"modify_mode": "MODIFY_MODE_ASYNC",
"account_type": "ACCOUNT_TYPE_BUSINESS", "account_type": "ACCOUNT_TYPE_BUSINESS",
"account_bank": "工商银行", "account_bank": "工商银行",
"bank_address_code": "110000", "bank_address_code": "110000",
"bank_name": "施秉县农村信用合作联社城关信用社", "bank_name": "中国工商银行股份有限公司北京市分行营业部",
"bank_branch_id": "402713354941", "bank_branch_id": "402713354941",
"account_number": "d+xT+MQCvrLHUVDWv/8MR/dB7TkXM2YYZlokmXzFsWs35NXUot7C0NcxIrUF5FnxqCJHkNgKtxa6RxEYyba1+VBRLnqKG2fSy/Y5qDN08Ej9zHCwJjq52Wg1VG8MRugli9YMI1fI83KGBxhuXyemgS/hqFKsfYGiOkJqjTUpgY5VqjtL2N4l4z11T0ECB/aSyVXUysOFGLVfSrUxMPZy6jWWYGvT1+4P633f+R+ki1gT4WF/2KxZOYmli385ZgVhcR30mr4/G3HBcxi13zp7FnEeOsLlvBmI1PHN4C7Rsu3WL8sPndjXTd75kPkyjqnoMRrEEaYQE8ZRGYoeorwC+w==" "account_number": "d+xT+MQCvrLHUVDWv/8MR/dB7TkXM2YYZlokmXzFsWs35NXUot7C0NcxIrUF5FnxqCJHkNgKtxa6RxEYyba1+VBRLnqKG2fSy/Y5qDN08Ej9zHCwJjq52Wg1VG8MRugli9YMI1fI83KGBxhuXyemgS/hqFKsfYGiOkJqjTUpgY5VqjtL2N4l4z11T0ECB/aSyVXUysOFGLVfSrUxMPZy6jWWYGvT1+4P633f+R+ki1gT4WF/2KxZOYmli385ZgVhcR30mr4/G3HBcxi13zp7FnEeOsLlvBmI1PHN4C7Rsu3WL8sPndjXTd75kPkyjqnoMRrEEaYQE8ZRGYoeorwC+w==",
"account_name": "VyOMa+SncfM4lLha65dsxZ/xYW1zqBVVp6/W5mNkolESJU9fqgMt0lxjtuiWdhR+qUjnC2dTfuJuCOZs/Qi6kmicogGFjDC9ZxzFpdjR7AidWDuCIId5WRnRN8lGUcVyxctZZ4WcxxL2ADq57h7dZoFxNgyRYR4Y6q37LpYDccmYO5SiCkUP3rMX1CrTwKJysVhHij62HiU/P/yScImgdKrc+/MBWb1O6TT2RgwU3U6IwSZRWx4QH4EmYBLAQTdcEyUz2wuDmPA4nMSeXJVyzKl/WB+QYBh4Yj+BLT0HkA2IbTRyGX1U2wvv3N/w59Xq0pWYSXMHlmxhle2Cqj/7Cw=="
} }