feat(tenpayv3): 新增境外商户付款码付款相关接口

This commit is contained in:
Fu Diwei 2023-04-06 17:42:54 +08:00
parent d02a9fa140
commit 2ece289c90
14 changed files with 209 additions and 147 deletions

View File

@ -0,0 +1,78 @@
using System;
namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Events
{
/// <summary>
/// <para>表示 PAPAY.SIGN (仅限直连商户 For HK通知的数据。</para>
/// <para>表示 PAPAY.TERMINATE (仅限直连商户 For HK通知的数据。</para>
/// </summary>
public class HKPAPPayContractResource : WechatTenpayEvent.Types.IDecryptedResource
{
/// <summary>
/// 获取或设置微信商户号。
/// </summary>
[Newtonsoft.Json.JsonProperty("mchid")]
[System.Text.Json.Serialization.JsonPropertyName("mchid")]
public virtual string MerchantId { get; set; } = default!;
/// <summary>
/// 获取或设置微信 AppId。
/// </summary>
[Newtonsoft.Json.JsonProperty("appid")]
[System.Text.Json.Serialization.JsonPropertyName("appid")]
public virtual string AppId { get; set; } = default!;
/// <summary>
/// 获取或设置商户侧签约协议号。
/// </summary>
[Newtonsoft.Json.JsonProperty("out_contract_code")]
[System.Text.Json.Serialization.JsonPropertyName("out_contract_code")]
public string OutContractCode { get; set; } = default!;
/// <summary>
/// 获取或设置委托代扣协议 ID。
/// </summary>
[Newtonsoft.Json.JsonProperty("contract_id")]
[System.Text.Json.Serialization.JsonPropertyName("contract_id")]
public string ContractId { get; set; } = default!;
/// <summary>
/// 获取或设置模板 ID。
/// </summary>
[Newtonsoft.Json.JsonProperty("plan_id")]
[System.Text.Json.Serialization.JsonPropertyName("plan_id")]
public int PlanId { get; set; }
/// <summary>
/// 获取或设置用户唯一标识。
/// </summary>
[Newtonsoft.Json.JsonProperty("openid")]
[System.Text.Json.Serialization.JsonPropertyName("openid")]
public string OpenId { get; set; } = default!;
/// <summary>
/// 获取或设置操作时间。
/// </summary>
[Newtonsoft.Json.JsonProperty("operate_time")]
[Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.RFC3339DateTimeOffsetConverter))]
[System.Text.Json.Serialization.JsonPropertyName("operate_time")]
[System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.RFC3339DateTimeOffsetConverter))]
public DateTimeOffset OperateTime { get; set; }
/// <summary>
/// 获取或设置到期时间。
/// </summary>
[Newtonsoft.Json.JsonProperty("contract_expire_time")]
[Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.RFC3339NullableDateTimeOffsetConverter))]
[System.Text.Json.Serialization.JsonPropertyName("contract_expire_time")]
[System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.RFC3339NullableDateTimeOffsetConverter))]
public DateTimeOffset? ExpireTime { get; set; }
/// <summary>
/// 获取或设置解约方式。
/// </summary>
[Newtonsoft.Json.JsonProperty("contract_termination_mode")]
[System.Text.Json.Serialization.JsonPropertyName("contract_termination_mode")]
public string? TerminationMode { get; set; }
}
}

View File

@ -0,0 +1,37 @@
namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Events
{
/// <summary>
/// <para>表示 PAPAY.SIGN (仅限服务商 For HK通知的数据。</para>
/// <para>表示 PAPAY.TERMINATE (仅限服务商 For HK通知的数据。</para>
/// </summary>
public class HKPartnerPAPPayContractResource : HKPAPPayContractResource, WechatTenpayEvent.Types.IDecryptedResource
{
/// <summary>
/// <inheritdoc />
/// </summary>
[Newtonsoft.Json.JsonProperty("sp_mchid")]
[System.Text.Json.Serialization.JsonPropertyName("sp_mchid")]
public override string MerchantId { get; set; } = default!;
/// <summary>
/// <inheritdoc />
/// </summary>
[Newtonsoft.Json.JsonProperty("sp_appid")]
[System.Text.Json.Serialization.JsonPropertyName("sp_appid")]
public override string AppId { get; set; } = default!;
/// <summary>
/// 获取或设置子商户号。
/// </summary>
[Newtonsoft.Json.JsonProperty("sub_mchid")]
[System.Text.Json.Serialization.JsonPropertyName("sub_mchid")]
public string SubMerchantId { get; set; } = default!;
/// <summary>
/// 获取或设置子商户 AppId。
/// </summary>
[Newtonsoft.Json.JsonProperty("sub_appid")]
[System.Text.Json.Serialization.JsonPropertyName("sub_appid")]
public string SubAppId { get; set; } = default!;
}
}

View File

@ -1,5 +1,3 @@
using System;
namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Events
{
/// <summary>
@ -7,9 +5,9 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Events
/// <para>表示 REFUND.ABNORMAL (仅限服务商 For HK通知的数据。</para>
/// <para>表示 REFUND.CLOSED (仅限服务商 For HK通知的数据。</para>
/// </summary>
public class HKPartnerRefundResource : WechatTenpayEvent.Types.IDecryptedResource
public class HKPartnerRefundResource : HKRefundResource, WechatTenpayEvent.Types.IDecryptedResource
{
public static class Types
public static new class Types
{
public class Amount : Models.GetHKPartnerRefundByOutRefundNumberResponse.Types.Amount
{
@ -17,11 +15,11 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Events
}
/// <summary>
/// 获取或设置服务商商户号。
/// <inheritdoc/>
/// </summary>
[Newtonsoft.Json.JsonProperty("sp_mchid")]
[System.Text.Json.Serialization.JsonPropertyName("sp_mchid")]
public string MerchantId { get; set; } = default!;
public override string MerchantId { get; set; } = default!;
/// <summary>
/// 获取或设置子商户号。
@ -30,69 +28,11 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Events
[System.Text.Json.Serialization.JsonPropertyName("sub_mchid")]
public string SubMerchantId { get; set; } = default!;
/// <summary>
/// 获取或设置商户订单号。
/// </summary>
[Newtonsoft.Json.JsonProperty("out_trade_no")]
[System.Text.Json.Serialization.JsonPropertyName("out_trade_no")]
public string OutTradeNumber { get; set; } = default!;
/// <summary>
/// 获取或设置微信支付订单号。
/// </summary>
[Newtonsoft.Json.JsonProperty("transaction_id")]
[System.Text.Json.Serialization.JsonPropertyName("transaction_id")]
public string TransactionId { get; set; } = default!;
/// <summary>
/// 获取或设置商户退款单号。
/// </summary>
[Newtonsoft.Json.JsonProperty("out_refund_no")]
[System.Text.Json.Serialization.JsonPropertyName("out_refund_no")]
public string OutRefundNumber { get; set; } = default!;
/// <summary>
/// 获取或设置微信支付退款号。
/// </summary>
[Newtonsoft.Json.JsonProperty("refund_id")]
[System.Text.Json.Serialization.JsonPropertyName("refund_id")]
public string RefundId { get; set; } = default!;
/// <summary>
/// 获取或设置退款状态。
/// </summary>
[Newtonsoft.Json.JsonProperty("refund_status")]
[System.Text.Json.Serialization.JsonPropertyName("refund_status")]
public string RefundStatus { get; set; } = default!;
/// <summary>
/// 获取或设置退款入账账户。
/// </summary>
[Newtonsoft.Json.JsonProperty("recv_account")]
[System.Text.Json.Serialization.JsonPropertyName("recv_account")]
public string ReceiveAccount { get; set; } = default!;
/// <summary>
/// 获取或设置退款资金来源。
/// </summary>
[Newtonsoft.Json.JsonProperty("fund_source")]
[System.Text.Json.Serialization.JsonPropertyName("fund_source")]
public string? FundSource { get; set; }
/// <summary>
/// 获取或设置退款成功时间。
/// </summary>
[Newtonsoft.Json.JsonProperty("success_time")]
[Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.RFC3339NullableDateTimeOffsetConverter))]
[System.Text.Json.Serialization.JsonPropertyName("success_time")]
[System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.RFC3339NullableDateTimeOffsetConverter))]
public DateTimeOffset? SuccessTime { get; set; }
/// <summary>
/// 获取或设置退款金额信息。
/// </summary>
[Newtonsoft.Json.JsonProperty("amount")]
[System.Text.Json.Serialization.JsonPropertyName("amount")]
public Types.Amount Amount { get; set; } = default!;
public new Types.Amount Amount { get; set; } = default!;
}
}

View File

@ -1,13 +1,11 @@
using System;
namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Events
{
/// <summary>
/// <para>表示 TRANSACTION.SUCCESS (仅限服务商 For HK通知的数据。</para>
/// </summary>
public class HKPartnerTransactionResource : WechatTenpayEvent.Types.IDecryptedResource
public class HKPartnerTransactionResource : HKTransactionResource, WechatTenpayEvent.Types.IDecryptedResource
{
public static class Types
public static new class Types
{
public class Payer : Models.GetHKPartnerTransactionByOutTradeNumberResponse.Types.Payer
{
@ -23,18 +21,18 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Events
}
/// <summary>
/// 获取或设置服务商商户号。
/// <inheritdoc/>
/// </summary>
[Newtonsoft.Json.JsonProperty("sp_mchid")]
[System.Text.Json.Serialization.JsonPropertyName("sp_mchid")]
public string MerchantId { get; set; } = default!;
public override string MerchantId { get; set; } = default!;
/// <summary>
/// 获取或设置服务商 AppId。
/// <inheritdoc/>
/// </summary>
[Newtonsoft.Json.JsonProperty("sp_appid")]
[System.Text.Json.Serialization.JsonPropertyName("sp_appid")]
public string AppId { get; set; } = default!;
public override string AppId { get; set; } = default!;
/// <summary>
/// 获取或设置子商户号。
@ -50,83 +48,25 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Events
[System.Text.Json.Serialization.JsonPropertyName("sub_appid")]
public string? SubAppId { get; set; }
/// <summary>
/// 获取或设置商户订单号。
/// </summary>
[Newtonsoft.Json.JsonProperty("out_trade_no")]
[System.Text.Json.Serialization.JsonPropertyName("out_trade_no")]
public string OutTradeNumber { get; set; } = default!;
/// <summary>
/// 获取或设置微信支付订单号。
/// </summary>
[Newtonsoft.Json.JsonProperty("id")]
[System.Text.Json.Serialization.JsonPropertyName("id")]
public string TransactionId { get; set; } = default!;
/// <summary>
/// 获取或设置交易类型。
/// </summary>
[Newtonsoft.Json.JsonProperty("trade_type")]
[System.Text.Json.Serialization.JsonPropertyName("trade_type")]
public string TradeType { get; set; } = default!;
/// <summary>
/// 获取或设置交易状态。
/// </summary>
[Newtonsoft.Json.JsonProperty("trade_state")]
[System.Text.Json.Serialization.JsonPropertyName("trade_state")]
public string TradeState { get; set; } = default!;
/// <summary>
/// 获取或设置交易状态描述。
/// </summary>
[Newtonsoft.Json.JsonProperty("trade_state_desc")]
[System.Text.Json.Serialization.JsonPropertyName("trade_state_desc")]
public string TradeStateDescription { get; set; } = default!;
/// <summary>
/// 获取或设置付款银行类型。
/// </summary>
[Newtonsoft.Json.JsonProperty("bank_type")]
[System.Text.Json.Serialization.JsonPropertyName("bank_type")]
public string? BankType { get; set; }
/// <summary>
/// 获取或设置附加数据。
/// </summary>
[Newtonsoft.Json.JsonProperty("attach")]
[System.Text.Json.Serialization.JsonPropertyName("attach")]
public string? Attachment { get; set; }
/// <summary>
/// 获取或设置支付完成时间。
/// </summary>
[Newtonsoft.Json.JsonProperty("success_time")]
[Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.RFC3339DateTimeOffsetConverter))]
[System.Text.Json.Serialization.JsonPropertyName("success_time")]
[System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.RFC3339DateTimeOffsetConverter))]
public DateTimeOffset SuccessTime { get; set; }
/// <summary>
/// 获取或设置支付者信息。
/// </summary>
[Newtonsoft.Json.JsonProperty("payer")]
[System.Text.Json.Serialization.JsonPropertyName("payer")]
public Types.Payer? Payer { get; set; }
public new Types.Payer? Payer { get; set; }
/// <summary>
/// 获取或设置金额信息。
/// </summary>
[Newtonsoft.Json.JsonProperty("amount")]
[System.Text.Json.Serialization.JsonPropertyName("amount")]
public Types.Amount Amount { get; set; } = default!;
public new Types.Amount Amount { get; set; } = default!;
/// <summary>
/// 获取或设置优惠信息。
/// </summary>
[Newtonsoft.Json.JsonProperty("promotion_detail")]
[System.Text.Json.Serialization.JsonPropertyName("promotion_detail")]
public Types.Promotion[]? PromotionList { get; set; }
public new Types.Promotion[]? PromotionList { get; set; }
}
}

View File

@ -1,4 +1,4 @@
using System;
using System;
namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Events
{
@ -21,7 +21,7 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Events
/// </summary>
[Newtonsoft.Json.JsonProperty("mchid")]
[System.Text.Json.Serialization.JsonPropertyName("mchid")]
public string MerchantId { get; set; } = default!;
public virtual string MerchantId { get; set; } = default!;
/// <summary>
/// 获取或设置商户订单号。

View File

@ -1,4 +1,4 @@
using System;
using System;
namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Events
{
@ -27,14 +27,14 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Events
/// </summary>
[Newtonsoft.Json.JsonProperty("mchid")]
[System.Text.Json.Serialization.JsonPropertyName("mchid")]
public string MerchantId { get; set; } = default!;
public virtual string MerchantId { get; set; } = default!;
/// <summary>
/// 获取或设置微信 AppId。
/// </summary>
[Newtonsoft.Json.JsonProperty("appid")]
[System.Text.Json.Serialization.JsonPropertyName("appid")]
public string AppId { get; set; } = default!;
public virtual string AppId { get; set; } = default!;
/// <summary>
/// 获取或设置商户订单号。

View File

@ -104,6 +104,29 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3
return await client.SendRequestWithJsonAsync<Models.CreateHKPartnerTransactionNativeResponse>(flurlReq, data: request, cancellationToken: cancellationToken);
}
/// <summary>
/// <para>异步调用 [POST] /micropay/transactions/pay 接口。</para>
/// <para>REF: https://pay.weixin.qq.com/wiki/doc/api_external/en/apis/chapter3_1_1.shtml </para>
/// <para><i>(请注意此接口专为境外支付设计,调用时需在构造 <see cref="WechatTenpayClient" /> 时指定单独的 <see cref="WechatTenpayClientOptions.Endpoint"/>。)</i></para>
/// </summary>
/// <param name="client"></param>
/// <param name="request"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
public static async Task<Models.CreateHKPartnerTransactionMicroPayResponse> ExecuteCreateHKPartnerTransactionMicroPayAsync(this WechatTenpayClient client, Models.CreateHKPartnerTransactionMicroPayRequest request, CancellationToken cancellationToken = default)
{
if (client is null) throw new ArgumentNullException(nameof(client));
if (request is null) throw new ArgumentNullException(nameof(request));
if (request.MerchantId == null)
request.MerchantId = client.Credentials.MerchantId;
IFlurlRequest flurlReq = client
.CreateRequest(request, HttpMethod.Post, "micropay", "transactions", "pay");
return await client.SendRequestWithJsonAsync<Models.CreateHKPartnerTransactionMicroPayResponse>(flurlReq, data: request, cancellationToken: cancellationToken);
}
/// <summary>
/// <para>异步调用 [GET] /transactions/out-trade-no/{out_trade_no} 接口。</para>
/// <para>REF: https://pay.weixin.qq.com/wiki/doc/api/wxpay/en/fusion_wallet/In-AppPay/chapter8_1.shtml </para>

View File

@ -104,6 +104,29 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3
return await client.SendRequestWithJsonAsync<Models.CreateHKTransactionNativeResponse>(flurlReq, data: request, cancellationToken: cancellationToken);
}
/// <summary>
/// <para>异步调用 [POST] /micropay/transactions/pay 接口。</para>
/// <para>REF: https://pay.weixin.qq.com/wiki/doc/api_external/en/apis/chapter3_1_1.shtml </para>
/// <para><i>(请注意此接口专为境外支付设计,调用时需在构造 <see cref="WechatTenpayClient" /> 时指定单独的 <see cref="WechatTenpayClientOptions.Endpoint"/>。)</i></para>
/// </summary>
/// <param name="client"></param>
/// <param name="request"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
public static async Task<Models.CreateHKTransactionMicroPayResponse> ExecuteCreateHKTransactionMicroPayAsync(this WechatTenpayClient client, Models.CreateHKTransactionMicroPayRequest request, CancellationToken cancellationToken = default)
{
if (client is null) throw new ArgumentNullException(nameof(client));
if (request is null) throw new ArgumentNullException(nameof(request));
if (request.MerchantId == null)
request.MerchantId = client.Credentials.MerchantId;
IFlurlRequest flurlReq = client
.CreateRequest(request, HttpMethod.Post, "micropay", "transactions", "pay");
return await client.SendRequestWithJsonAsync<Models.CreateHKTransactionMicroPayResponse>(flurlReq, data: request, cancellationToken: cancellationToken);
}
/// <summary>
/// <para>异步调用 [GET] /transactions/out-trade-no/{out_trade_no} 接口。</para>
/// <para>REF: https://pay.weixin.qq.com/wiki/doc/api/wxpay/en/fusion_wallet/In-AppPay/chapter8_1.shtml </para>

View File

@ -1,7 +1,7 @@
namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models
namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models
{
/// <summary>
/// <para>表示 [POST] /transactions/micropay 接口的请求。</para>
/// <para>表示 [POST] /micropay/transactions/pay 接口的请求。</para>
/// </summary>
public class CreateHKPartnerTransactionMicroPayRequest : WechatTenpayRequest
{

View File

@ -1,7 +1,7 @@
namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models
namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models
{
/// <summary>
/// <para>表示 [POST] /transactions/micropay 接口的响应。</para>
/// <para>表示 [POST] /micropay/transactions/pay 接口的响应。</para>
/// </summary>
public class CreateHKPartnerTransactionMicroPayResponse : GetHKPartnerTransactionByOutTradeNumberResponse
{

View File

@ -1,7 +1,7 @@
namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models
namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models
{
/// <summary>
/// <para>表示 [POST] /transactions/micropay 接口的请求。</para>
/// <para>表示 [POST] /micropay/transactions/pay 接口的请求。</para>
/// </summary>
public class CreateHKTransactionMicroPayRequest : WechatTenpayRequest
{

View File

@ -1,7 +1,7 @@
namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models
namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models
{
/// <summary>
/// <para>表示 [POST] /transactions/micropay 接口的响应。</para>
/// <para>表示 [POST] /micropay/transactions/pay 接口的响应。</para>
/// </summary>
public class CreateHKTransactionMicroPayResponse : GetHKTransactionByOutTradeNumberResponse
{

View File

@ -0,0 +1,10 @@
{
"mchid": "10000091",
"out_contract_code": "100001256",
"plan_id": 123,
"contract_id": "Wx15463511252015071056489715",
"appid": "wxcbda96de0b165486",
"openid": "ouFhd5X9s9WteC3eWRjXV3lea123",
"contract_termination_mode": "USER",
"operate_time": "2015-09-01T10:00:00+08:00"
}

View File

@ -0,0 +1,11 @@
{
"sp_mchid": "10000091",
"sub_mchid": "10000097",
"out_contract_code": "100001256",
"plan_id": 123,
"contract_id": "Wx15463511252015071056489715",
"sp_appid": "wxcbda96de0b165486",
"openid": "ouFhd5X9s9WteC3eWRjXV3lea123",
"contract_termination_mode": "USER",
"operate_time": "2015-09-01T10:00:00+08:00"
}