mirror of
https://gitee.com/fudiwei/DotNetCore.SKIT.FlurlHttpClient.Wechat.git
synced 2025-04-05 17:37:54 +08:00
feat(tenpayv3): 随官方更新商户进件结算账号相关接口模型
This commit is contained in:
parent
c52973539c
commit
86a7b4ecb9
@ -520,6 +520,8 @@
|
||||
|
||||
- 查询结算账户:`GetApplyForSubMerchantSettlement`
|
||||
|
||||
- 查询结算账户修改申请状态:`GetApplyForSubMerchantSettlementByApplicationNumber`
|
||||
|
||||
- 基础支付
|
||||
|
||||
- JSAPI 支付
|
||||
@ -722,6 +724,8 @@
|
||||
|
||||
- 查询结算账户:`GetApplyForSubMerchantSettlement`
|
||||
|
||||
- 查询结算账户修改申请状态:`GetApplyForSubMerchantSettlementByApplicationNumber`
|
||||
|
||||
- 电商收付通(普通支付)
|
||||
|
||||
- APP 下单:`CreatePayPartnerTransactionApp`
|
||||
|
@ -47,7 +47,8 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Sample.Controllers
|
||||
{
|
||||
// NOTICE:
|
||||
// 需提前注入 CertificateManager、并下载平台证书,才可以使用扩展方法执行验签操作。
|
||||
// 有关 CertificateManager 的用法请参阅《开发文档 / 基础用法 / 如何验证回调通知事件签名?》。
|
||||
// 请参考本示例项目 TenpayCertificateRefreshingBackgroundService 后台任务中的相关实现。
|
||||
// 有关 CertificateManager 的完整介绍请参阅《开发文档 / 基础用法 / 如何验证回调通知事件签名?》。
|
||||
// 后续如何解密并反序列化,请参阅《开发文档 / 基础用法 / 如何解密回调通知事件中的敏感数据?》。
|
||||
|
||||
return new JsonResult(new { code = "FAIL", message = "验签失败" });
|
||||
|
@ -38,7 +38,8 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Sample.Controllers
|
||||
{
|
||||
// NOTICE:
|
||||
// 需提前注入 CertificateManager、并添加平台证书,才可以使用扩展方法执行验签操作。
|
||||
// 有关 CertificateManager 的用法请参阅《开发文档 / 基础用法 / 如何验证回调通知事件签名?》。
|
||||
// 请参考本示例项目 TenpayCertificateRefreshingBackgroundService 后台任务中的相关实现。
|
||||
// 有关 CertificateManager 的完整介绍请参阅《开发文档 / 基础用法 / 如何验证回调通知事件签名?》。
|
||||
// 后续如何解密并反序列化,请参阅《开发文档 / 基础用法 / 如何解密回调通知事件中的敏感数据?》。
|
||||
|
||||
return Json(new { code = "FAIL", message = "验签失败" });
|
||||
|
@ -2,6 +2,8 @@ using System;
|
||||
|
||||
namespace SKIT.FlurlHttpClient.Wechat.TenpayV3
|
||||
{
|
||||
using SKIT.FlurlHttpClient.Wechat.TenpayV3.Settings;
|
||||
|
||||
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)
|
||||
@ -18,14 +20,14 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3
|
||||
return false;
|
||||
}
|
||||
|
||||
var entry = client.PlatformCertificateManager.GetEntry(strSerialNumber);
|
||||
CertificateEntry? entry = client.PlatformCertificateManager.GetEntry(strSerialNumber);
|
||||
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.");
|
||||
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.");
|
||||
return false;
|
||||
@ -55,14 +57,14 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3
|
||||
return false;
|
||||
}
|
||||
|
||||
var entry = client.PlatformCertificateManager.GetEntry(strSerialNumber);
|
||||
CertificateEntry? entry = client.PlatformCertificateManager.GetEntry(strSerialNumber);
|
||||
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.");
|
||||
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.");
|
||||
return false;
|
||||
|
@ -1,4 +1,4 @@
|
||||
using System;
|
||||
using System;
|
||||
using System.Net.Http;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
@ -74,9 +74,7 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3
|
||||
|
||||
/// <summary>
|
||||
/// <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/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>
|
||||
/// <para>REF: https://pay.weixin.qq.com/docs/partner/apis/modify-settlement/sub-merchants/modify-settlement.html </para>
|
||||
/// </summary>
|
||||
/// <param name="client"></param>
|
||||
/// <param name="request"></param>
|
||||
@ -95,9 +93,7 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3
|
||||
|
||||
/// <summary>
|
||||
/// <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/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>
|
||||
/// <para>REF: https://pay.weixin.qq.com/docs/partner/apis/modify-settlement/sub-merchants/get-settlement.html </para>
|
||||
/// </summary>
|
||||
/// <param name="client"></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);
|
||||
}
|
||||
|
||||
/// <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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1,9 +1,12 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Reflection;
|
||||
|
||||
namespace SKIT.FlurlHttpClient.Wechat.TenpayV3
|
||||
{
|
||||
using SKIT.FlurlHttpClient.Wechat.TenpayV3.Settings;
|
||||
|
||||
/// <summary>
|
||||
/// 为 <see cref="WechatTenpayClient"/> 提供请求模型敏感数据加密的扩展方法。
|
||||
/// </summary>
|
||||
@ -14,7 +17,7 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3
|
||||
{
|
||||
Utilities.ReflectionUtility.ReplacePropertyStringValue(ref request, (target, currentProp, oldValue) =>
|
||||
{
|
||||
var attribute = currentProp
|
||||
WechatTenpaySensitivePropertyAttribute? attribute = currentProp
|
||||
.GetCustomAttributes<WechatTenpaySensitivePropertyAttribute>()
|
||||
.FirstOrDefault(attr => Constants.SignSchemes.WECHATPAY2_RSA_2048_WITH_SHA256.Equals(attr.Scheme));
|
||||
if (attribute == null)
|
||||
@ -27,22 +30,22 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3
|
||||
if (string.IsNullOrEmpty(request.WechatpayCertificateSerialNumber))
|
||||
{
|
||||
// 如果未在请求中指定特定的平台证书序列号,从管理器中取过期时间最远的
|
||||
var entries = client.PlatformCertificateManager.AllEntries()
|
||||
.Where(e => Settings.CertificateEntry.ALGORITHM_TYPE_RSA.Equals(e.AlgorithmType))
|
||||
IEnumerable<CertificateEntry> entries = client.PlatformCertificateManager.AllEntries()
|
||||
.Where(e => CertificateEntry.ALGORITHM_TYPE_RSA.Equals(e.AlgorithmType))
|
||||
.OrderByDescending(e => e.ExpireTime);
|
||||
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.");
|
||||
}
|
||||
|
||||
var entry = entries.First();
|
||||
CertificateEntry entry = entries.First();
|
||||
certificate = entry.Certificate;
|
||||
request.WechatpayCertificateSerialNumber = entry.SerialNumber;
|
||||
}
|
||||
else
|
||||
{
|
||||
// 如果已在请求中指定特定的平台证书序列号,直接从管理器中取值
|
||||
var entry = client.PlatformCertificateManager.GetEntry(request.WechatpayCertificateSerialNumber!);
|
||||
CertificateEntry? entry = client.PlatformCertificateManager.GetEntry(request.WechatpayCertificateSerialNumber!);
|
||||
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.");
|
||||
@ -89,7 +92,7 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3
|
||||
{
|
||||
Utilities.ReflectionUtility.ReplacePropertyStringValue(ref request, (target, currentProp, oldValue) =>
|
||||
{
|
||||
var attribute = currentProp
|
||||
WechatTenpaySensitivePropertyAttribute? attribute = currentProp
|
||||
.GetCustomAttributes<WechatTenpaySensitivePropertyAttribute>()
|
||||
.FirstOrDefault(attr => Constants.SignSchemes.WECHATPAY2_SM2_WITH_SM3.Equals(attr.Scheme));
|
||||
if (attribute == null)
|
||||
@ -102,22 +105,22 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3
|
||||
if (string.IsNullOrEmpty(request.WechatpayCertificateSerialNumber))
|
||||
{
|
||||
// 如果未在请求中指定特定的平台证书序列号,从管理器中取过期时间最远的
|
||||
var entries = client.PlatformCertificateManager.AllEntries()
|
||||
.Where(e => Settings.CertificateEntry.ALGORITHM_TYPE_SM2.Equals(e.AlgorithmType))
|
||||
IEnumerable<CertificateEntry> entries = client.PlatformCertificateManager.AllEntries()
|
||||
.Where(e => CertificateEntry.ALGORITHM_TYPE_SM2.Equals(e.AlgorithmType))
|
||||
.OrderByDescending(e => e.ExpireTime);
|
||||
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.");
|
||||
}
|
||||
|
||||
var entry = entries.First();
|
||||
CertificateEntry entry = entries.First();
|
||||
certificate = entry.Certificate;
|
||||
request.WechatpayCertificateSerialNumber = entry.SerialNumber;
|
||||
}
|
||||
else
|
||||
{
|
||||
// 如果已在请求中指定特定的平台证书序列号,直接从管理器中取值
|
||||
var entry = client.PlatformCertificateManager.GetEntry(request.WechatpayCertificateSerialNumber!);
|
||||
CertificateEntry? entry = client.PlatformCertificateManager.GetEntry(request.WechatpayCertificateSerialNumber!);
|
||||
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.");
|
||||
|
@ -73,7 +73,7 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3
|
||||
{
|
||||
Utilities.ReflectionUtility.ReplacePropertyStringValue(ref response, (target, currentProp, oldValue) =>
|
||||
{
|
||||
var attribute = currentProp
|
||||
WechatTenpaySensitivePropertyAttribute? attribute = currentProp
|
||||
.GetCustomAttributes<WechatTenpaySensitivePropertyAttribute>()
|
||||
.FirstOrDefault(attr => Constants.SignSchemes.WECHATPAY2_RSA_2048_WITH_SHA256.Equals(attr.Scheme));
|
||||
if (attribute == null)
|
||||
@ -117,7 +117,7 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3
|
||||
{
|
||||
Utilities.ReflectionUtility.ReplacePropertyStringValue(ref response, (target, currentProp, oldValue) =>
|
||||
{
|
||||
var attribute = currentProp
|
||||
WechatTenpaySensitivePropertyAttribute? attribute = currentProp
|
||||
.GetCustomAttributes<WechatTenpaySensitivePropertyAttribute>()
|
||||
.FirstOrDefault(attr => Constants.SignSchemes.WECHATPAY2_SM2_WITH_SM3.Equals(attr.Scheme));
|
||||
if (attribute == null)
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
@ -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; }
|
||||
}
|
||||
}
|
@ -1,4 +1,4 @@
|
||||
namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models
|
||||
namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models
|
||||
{
|
||||
/// <summary>
|
||||
/// <para>表示 [GET] /apply4sub/sub_merchants/{sub_mchid}/settlement 接口的响应。</para>
|
||||
@ -31,7 +31,7 @@
|
||||
/// </summary>
|
||||
[Newtonsoft.Json.JsonProperty("bank_address_code")]
|
||||
[System.Text.Json.Serialization.JsonPropertyName("bank_address_code")]
|
||||
public string BankAddressCode { get; set; } = default!;
|
||||
public string? BankAddressCode { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 获取或设置开户银行联行号。
|
||||
|
@ -13,6 +13,13 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models
|
||||
[System.Text.Json.Serialization.JsonIgnore]
|
||||
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>
|
||||
@ -20,6 +27,15 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models
|
||||
[System.Text.Json.Serialization.JsonPropertyName("account_type")]
|
||||
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>
|
||||
|
@ -1,9 +1,15 @@
|
||||
namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models
|
||||
namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models
|
||||
{
|
||||
/// <summary>
|
||||
/// <para>表示 [POST] /apply4sub/sub_merchants/{sub_mchid}/modify-settlement 接口的响应。</para>
|
||||
/// </summary>
|
||||
public class ModifyApplyForSubMerchantSettlementResponse : WechatTenpayResponse
|
||||
{
|
||||
/// <summary>
|
||||
/// 获取或设置申请单号。
|
||||
/// </summary>
|
||||
[Newtonsoft.Json.JsonProperty("application_no")]
|
||||
[System.Text.Json.Serialization.JsonPropertyName("application_no")]
|
||||
public string ApplicationNumber { get; set; } = default!;
|
||||
}
|
||||
}
|
||||
|
@ -1,5 +1,4 @@
|
||||
using System;
|
||||
using System.Linq;
|
||||
using System.Net.Http;
|
||||
using System.Net.Http.Headers;
|
||||
using System.Threading;
|
||||
|
@ -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"
|
||||
}
|
@ -1,8 +1,9 @@
|
||||
{
|
||||
{
|
||||
"account_type": "ACCOUNT_TYPE_BUSINESS",
|
||||
"account_bank": "工商银行",
|
||||
"bank_name": "施秉县农村信用合作联社城关信用社",
|
||||
"bank_branch_id": "402713354941",
|
||||
"account_number": "***************8678",
|
||||
"verify_result": "VERIFY_SUCCESS"
|
||||
"account_number": "62*************78",
|
||||
"verify_result": "VERIFY_SUCCESS",
|
||||
"verify_fail_reason": "用户姓名/证件/手机不匹配,请核对后重试"
|
||||
}
|
||||
|
@ -1,8 +1,10 @@
|
||||
{
|
||||
{
|
||||
"modify_mode": "MODIFY_MODE_ASYNC",
|
||||
"account_type": "ACCOUNT_TYPE_BUSINESS",
|
||||
"account_bank": "工商银行",
|
||||
"bank_address_code": "110000",
|
||||
"bank_name": "施秉县农村信用合作联社城关信用社",
|
||||
"bank_name": "中国工商银行股份有限公司北京市分行营业部",
|
||||
"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=="
|
||||
}
|
||||
|
@ -0,0 +1,3 @@
|
||||
{
|
||||
"application_no": "102329389XXXX"
|
||||
}
|
Loading…
Reference in New Issue
Block a user