diff --git a/docs/WechatTenpayV3/Basic_ModelDefinition.md b/docs/WechatTenpayV3/Basic_ModelDefinition.md index a23934bd..617d180f 100644 --- a/docs/WechatTenpayV3/Basic_ModelDefinition.md +++ b/docs/WechatTenpayV3/Basic_ModelDefinition.md @@ -37,7 +37,7 @@ | √ | 支付产品:H5 支付 | 直连商户 & 合作伙伴 | | | √ | 支付产品:Native 支付 | 直连商户 & 合作伙伴 | | | √ | 支付产品:小程序支付 | 直连商户 & 合作伙伴 | | -| × | 支付产品:付款码支付 | 直连商户 & 合作伙伴 | 官方未提供 v3 API | +| √ | 支付产品:付款码支付 | 直连商户 & 合作伙伴 | | | √ | 支付产品:合单支付 | 直连商户 & 合作伙伴 | | | √ | 支付产品:资金/交易账单 | 直连商户 & 合作伙伴 | | | √ | 支付产品:退款 | 直连商户 & 合作伙伴 | | @@ -144,6 +144,12 @@ - 关闭订单:`ClosePayTransaction` + - 付款码支付 + + - 付款码支付:`CreatePayTransactionCodePay` + + - 撤销订单:`ReversePayTransaction` + - 合单支付 - 合单 APP 下单:`CreateCombineTransactionApp` @@ -618,6 +624,12 @@ - 关闭订单:`ClosePayPartnerTransaction` + - 付款码支付 + + - 付款码支付:`CreatePayPartnerTransactionCodePay` + + - 撤销订单:`ReversePayPartnerTransaction` + - 合单支付 - 合单 APP 下单:`CreateCombineTransactionApp` @@ -1378,7 +1390,7 @@ --- -### 【附】境外开发 API 模型命名速查表: +### 【附】境外支付 API 模型命名速查表: 注:树形结构与[微信支付开发者文档](https://pay.weixin.qq.com/wiki/doc/api/wxpay/en/pages/Overview.shtml)目录结构保持一致。 diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientExecutePayPartnerTransactionsExtensions.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientExecutePayPartnerTransactionsExtensions.cs index b556e1bb..43bd2c32 100644 --- a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientExecutePayPartnerTransactionsExtensions.cs +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientExecutePayPartnerTransactionsExtensions.cs @@ -115,6 +115,31 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3 return await client.SendFlurlRequestAsJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken).ConfigureAwait(false); } + /// + /// 异步调用 [POST] /pay/partner/transactions/codepay 接口。 + /// + /// REF:
+ /// + ///
+ ///
+ /// + /// + /// + /// + public static async Task ExecuteCreatePayPartnerTransactionCodePayAsync(this WechatTenpayClient client, Models.CreatePayPartnerTransactionCodePayRequest 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 is null) + request.MerchantId = client.Credentials.MerchantId; + + IFlurlRequest flurlReq = client + .CreateFlurlRequest(request, HttpMethod.Post, "pay", "partner", "transactions", "codepay"); + + return await client.SendFlurlRequestAsJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken).ConfigureAwait(false); + } + /// /// 异步调用 [POST] /pay/partner/transactions/scannedpos 接口。 /// @@ -233,5 +258,30 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3 return await client.SendFlurlRequestAsJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken).ConfigureAwait(false); } + + /// + /// 异步调用 [POST] /pay/partner/transactions/out-trade-no/{out_trade_no}/reverse 接口。 + /// + /// REF:
+ /// + ///
+ ///
+ /// + /// + /// + /// + public static async Task ExecuteReversePayPartnerTransactionAsync(this WechatTenpayClient client, Models.ReversePayPartnerTransactionRequest 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 is null) + request.MerchantId = client.Credentials.MerchantId; + + IFlurlRequest flurlReq = client + .CreateFlurlRequest(request, HttpMethod.Post, "pay", "partner", "transactions", "out-trade-no", request.OutTradeNumber, "reverse"); + + return await client.SendFlurlRequestAsJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken).ConfigureAwait(false); + } } } diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientExecutePayTransactionsExtensions.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientExecutePayTransactionsExtensions.cs index 10565098..d75daf52 100644 --- a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientExecutePayTransactionsExtensions.cs +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientExecutePayTransactionsExtensions.cs @@ -110,6 +110,31 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3 return await client.SendFlurlRequestAsJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken).ConfigureAwait(false); } + /// + /// 异步调用 [POST] /pay/transactions/codepay 接口。 + /// + /// REF:
+ /// + ///
+ ///
+ /// + /// + /// + /// + public static async Task ExecuteCreatePayTransactionCodePayAsync(this WechatTenpayClient client, Models.CreatePayTransactionCodePayRequest 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 is null) + request.MerchantId = client.Credentials.MerchantId; + + IFlurlRequest flurlReq = client + .CreateFlurlRequest(request, HttpMethod.Post, "pay", "transactions", "codepay"); + + return await client.SendFlurlRequestAsJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken).ConfigureAwait(false); + } + /// /// 异步调用 [GET] /pay/transactions/out-trade-no/{out_trade_no} 接口。 /// @@ -198,5 +223,30 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3 return await client.SendFlurlRequestAsJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken).ConfigureAwait(false); } + + /// + /// 异步调用 [POST] /pay/transactions/out-trade-no/{out_trade_no}/reverse 接口。 + /// + /// REF:
+ /// + ///
+ ///
+ /// + /// + /// + /// + public static async Task ExecuteReversePayTransactionAsync(this WechatTenpayClient client, Models.ReversePayTransactionRequest 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 is null) + request.MerchantId = client.Credentials.MerchantId; + + IFlurlRequest flurlReq = client + .CreateFlurlRequest(request, HttpMethod.Post, "pay", "transactions", "out-trade-no", request.OutTradeNumber, "reverse"); + + return await client.SendFlurlRequestAsJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken).ConfigureAwait(false); + } } } diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayTransactions/CreatePayTransactionAppRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayTransactions/CreatePayTransactionAppRequest.cs index 533427fc..d5696536 100644 --- a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayTransactions/CreatePayTransactionAppRequest.cs +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayTransactions/CreatePayTransactionAppRequest.cs @@ -141,7 +141,7 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models ///
[Newtonsoft.Json.JsonProperty("payer_client_ip")] [System.Text.Json.Serialization.JsonPropertyName("payer_client_ip")] - public string ClientIp { get; set; } = string.Empty; + public string? ClientIp { get; set; } /// /// 获取或设置商户端设备号。 @@ -150,6 +150,13 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models [System.Text.Json.Serialization.JsonPropertyName("device_id")] public string? DeviceId { get; set; } + /// + /// 获取或设置商户端设备 IP。 + /// + [Newtonsoft.Json.JsonProperty("device_ip")] + [System.Text.Json.Serialization.JsonPropertyName("device_ip")] + public string? DeviceIp { get; set; } + /// /// 获取或设置商户门店信息。 /// diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayTransactions/CreatePayTransactionCodePayRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayTransactions/CreatePayTransactionCodePayRequest.cs new file mode 100644 index 00000000..51d7775d --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayTransactions/CreatePayTransactionCodePayRequest.cs @@ -0,0 +1,190 @@ +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /pay/transactions/codepay 接口的请求。 + /// + public class CreatePayTransactionCodePayRequest : WechatTenpayRequest + { + public static class Types + { + public class Payer + { + /// + /// 获取或设置授权码。 + /// + [Newtonsoft.Json.JsonProperty("auth_code")] + [System.Text.Json.Serialization.JsonPropertyName("auth_code")] + public string AuthCode { get; set; } = string.Empty; + } + + public class Amount : CreatePayTransactionAppRequest.Types.Amount + { + } + + public class Detail + { + public static class Types + { + public class GoodsDetail + { + /// + /// 获取或设置商户侧商品编码。 + /// + [Newtonsoft.Json.JsonProperty("merchant_goods_id")] + [System.Text.Json.Serialization.JsonPropertyName("merchant_goods_id")] + public string MerchantGoodsId { get; set; } = string.Empty; + + /// + /// 获取或设置微信侧商品编码。 + /// + [Newtonsoft.Json.JsonProperty("wxpay_goods_id")] + [System.Text.Json.Serialization.JsonPropertyName("wxpay_goods_id")] + public string? WechatpayGoodsId { get; set; } + + /// + /// 获取或设置商品名称。 + /// + [Newtonsoft.Json.JsonProperty("goods_name")] + [System.Text.Json.Serialization.JsonPropertyName("goods_name")] + public string? GoodsName { get; set; } + + /// + /// 获取或设置商品数量。 + /// + [Newtonsoft.Json.JsonProperty("quantity")] + [System.Text.Json.Serialization.JsonPropertyName("quantity")] + public int Quantity { get; set; } + + /// + /// 获取或设置商品单价(单位:分)。 + /// + [Newtonsoft.Json.JsonProperty("unit_price")] + [System.Text.Json.Serialization.JsonPropertyName("unit_price")] + public int UnitPrice { get; set; } + } + } + + /// + /// 获取或设置订单原价(单位:分)。 + /// + [Newtonsoft.Json.JsonProperty("cost_price")] + [System.Text.Json.Serialization.JsonPropertyName("cost_price")] + public int? CostPrice { get; set; } + + /// + /// 获取或设置商品小票 ID。 + /// + [Newtonsoft.Json.JsonProperty("invoice_id")] + [System.Text.Json.Serialization.JsonPropertyName("invoice_id")] + public string? InvoiceId { get; set; } + + /// + /// 获取或设置单品列表。 + /// + [Newtonsoft.Json.JsonProperty("goods_detail")] + [System.Text.Json.Serialization.JsonPropertyName("goods_detail")] + public List? GoodsList { get; set; } + } + + public class Scene : CreatePayTransactionAppRequest.Types.Scene + { + public static new class Types + { + public class Store : CreatePayTransactionAppRequest.Types.Scene.Types.Store + { + } + } + } + + public class Settlement : CreatePayTransactionAppRequest.Types.Settlement + { + } + } + + /// + /// 获取或设置微信商户号。如果不指定将使用构造 时的 参数。 + /// + [Newtonsoft.Json.JsonProperty("mchid")] + [System.Text.Json.Serialization.JsonPropertyName("mchid")] + public string? MerchantId { get; set; } + + /// + /// 获取或设置微信 AppId。 + /// + [Newtonsoft.Json.JsonProperty("appid")] + [System.Text.Json.Serialization.JsonPropertyName("appid")] + public string? AppId { get; set; } + + /// + /// 获取或设置商品描述。 + /// + [Newtonsoft.Json.JsonProperty("description")] + [System.Text.Json.Serialization.JsonPropertyName("description")] + public string Description { get; set; } = string.Empty; + + /// + /// 获取或设置商户订单号。 + /// + [Newtonsoft.Json.JsonProperty("out_trade_no")] + [System.Text.Json.Serialization.JsonPropertyName("out_trade_no")] + public string OutTradeNumber { get; set; } = string.Empty; + + /// + /// 获取或设置附加数据。 + /// + [Newtonsoft.Json.JsonProperty("attach")] + [System.Text.Json.Serialization.JsonPropertyName("attach")] + public string? Attachment { get; set; } + + /// + /// 获取或设置订单优惠标记。 + /// + [Newtonsoft.Json.JsonProperty("goods_tag")] + [System.Text.Json.Serialization.JsonPropertyName("goods_tag")] + public string? GoodsTag { get; set; } + + /// + /// 获取或设置是否支持开票。 + /// + [Newtonsoft.Json.JsonProperty("support_fapiao")] + [System.Text.Json.Serialization.JsonPropertyName("support_fapiao")] + public bool? IsSupportFapiao { get; set; } + + /// + /// 获取或设置支付者信息。 + /// + [Newtonsoft.Json.JsonProperty("payer")] + [System.Text.Json.Serialization.JsonPropertyName("payer")] + public Types.Payer Payer { get; set; } = new Types.Payer(); + + /// + /// 获取或设置金额信息。 + /// + [Newtonsoft.Json.JsonProperty("amount")] + [System.Text.Json.Serialization.JsonPropertyName("amount")] + public Types.Amount Amount { get; set; } = new Types.Amount(); + + /// + /// 获取或设置商品信息。 + /// + [Newtonsoft.Json.JsonProperty("detail")] + [System.Text.Json.Serialization.JsonPropertyName("detail")] + public Types.Detail? Detail { get; set; } + + /// + /// 获取或设置场景信息。 + /// + [Newtonsoft.Json.JsonProperty("scene_info")] + [System.Text.Json.Serialization.JsonPropertyName("scene_info")] + public Types.Scene? Scene { get; set; } + + /// + /// 获取或设置结算信息。 + /// + [Newtonsoft.Json.JsonProperty("settle_info")] + [System.Text.Json.Serialization.JsonPropertyName("settle_info")] + public Types.Settlement? Settlement { get; set; } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayTransactions/CreatePayTransactionCodePayResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayTransactions/CreatePayTransactionCodePayResponse.cs new file mode 100644 index 00000000..66fa6014 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayTransactions/CreatePayTransactionCodePayResponse.cs @@ -0,0 +1,9 @@ +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /pay/transactions/codepay 接口的响应。 + /// + public class CreatePayTransactionCodePayResponse : GetPayTransactionByOutTradeNumberResponse + { + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayTransactions/ReversePayTransactionRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayTransactions/ReversePayTransactionRequest.cs new file mode 100644 index 00000000..c0cb9d05 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayTransactions/ReversePayTransactionRequest.cs @@ -0,0 +1,15 @@ +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /pay/transactions/out-trade-no/{out_trade_no}/reverse 接口的请求。 + /// + public class ReversePayTransactionRequest : ClosePayTransactionRequest + { + /// + /// 获取或设置微信 AppId。 + /// + [Newtonsoft.Json.JsonProperty("appid")] + [System.Text.Json.Serialization.JsonPropertyName("appid")] + public string AppId { get; set; } = string.Empty; + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayTransactions/ReversePayTransactionResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayTransactions/ReversePayTransactionResponse.cs new file mode 100644 index 00000000..15fc2292 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/PayTransactions/ReversePayTransactionResponse.cs @@ -0,0 +1,29 @@ +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /pay/transactions/out-trade-no/{out_trade_no}/reverse 接口的响应。 + /// + public class ReversePayTransactionResponse : WechatTenpayResponse + { + /// + /// 获取或设置微信商户号。 + /// + [Newtonsoft.Json.JsonProperty("mchid")] + [System.Text.Json.Serialization.JsonPropertyName("mchid")] + public string MerchantId { get; set; } = default!; + + /// + /// 获取或设置微信 AppId。 + /// + [Newtonsoft.Json.JsonProperty("appid")] + [System.Text.Json.Serialization.JsonPropertyName("appid")] + public string? AppId { get; set; } + + /// + /// 获取或设置商户订单号。 + /// + [Newtonsoft.Json.JsonProperty("out_trade_no")] + [System.Text.Json.Serialization.JsonPropertyName("out_trade_no")] + public string OutTradeNumber { get; set; } = default!; + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/PayTransactions/CreatePayPartnerTransactionCodePayRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/PayTransactions/CreatePayPartnerTransactionCodePayRequest.cs new file mode 100644 index 00000000..6e3f3f3f --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/PayTransactions/CreatePayPartnerTransactionCodePayRequest.cs @@ -0,0 +1,129 @@ +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /pay/partner/transactions/codepay 接口的请求。 + /// + public class CreatePayPartnerTransactionCodePayRequest : WechatTenpayRequest + { + public static class Types + { + public class Amount : CreatePayTransactionCodePayRequest.Types.Amount + { + } + + public class Payer : CreatePayTransactionCodePayRequest.Types.Payer + { + } + + public class Detail : CreatePayTransactionCodePayRequest.Types.Detail + { + } + + public class Scene : CreatePayTransactionCodePayRequest.Types.Scene + { + } + + public class Settlement : CreatePayTransactionCodePayRequest.Types.Settlement + { + } + } + + /// + /// 获取或设置服务商商户号。如果不指定将使用构造 时的 参数。 + /// + [Newtonsoft.Json.JsonProperty("sp_mchid")] + [System.Text.Json.Serialization.JsonPropertyName("sp_mchid")] + public string? MerchantId { get; set; } + + /// + /// 获取或设置子商户号。 + /// + [Newtonsoft.Json.JsonProperty("sub_mchid")] + [System.Text.Json.Serialization.JsonPropertyName("sub_mchid")] + public string SubMerchantId { get; set; } = string.Empty; + + /// + /// 获取或设置服务商 AppId。 + /// + [Newtonsoft.Json.JsonProperty("sp_appid")] + [System.Text.Json.Serialization.JsonPropertyName("sp_appid")] + public string AppId { get; set; } = string.Empty; + + /// + /// 获取或设置子商户 AppId。 + /// + [Newtonsoft.Json.JsonProperty("sub_appid")] + [System.Text.Json.Serialization.JsonPropertyName("sub_appid")] + public string? SubAppId { get; set; } + + /// + /// 获取或设置商品描述。 + /// + [Newtonsoft.Json.JsonProperty("description")] + [System.Text.Json.Serialization.JsonPropertyName("description")] + public string Description { get; set; } = string.Empty; + + /// + /// 获取或设置商户订单号。 + /// + [Newtonsoft.Json.JsonProperty("out_trade_no")] + [System.Text.Json.Serialization.JsonPropertyName("out_trade_no")] + public string OutTradeNumber { get; set; } = string.Empty; + + /// + /// 获取或设置附加数据。 + /// + [Newtonsoft.Json.JsonProperty("attach")] + [System.Text.Json.Serialization.JsonPropertyName("attach")] + public string? Attachment { get; set; } + + /// + /// 获取或设置订单优惠标记。 + /// + [Newtonsoft.Json.JsonProperty("goods_tag")] + [System.Text.Json.Serialization.JsonPropertyName("goods_tag")] + public string? GoodsTag { get; set; } + + /// + /// 获取或设置是否支持开票。 + /// + [Newtonsoft.Json.JsonProperty("support_fapiao")] + [System.Text.Json.Serialization.JsonPropertyName("support_fapiao")] + public bool? IsSupportFapiao { get; set; } + + /// + /// 获取或设置金额信息。 + /// + [Newtonsoft.Json.JsonProperty("amount")] + [System.Text.Json.Serialization.JsonPropertyName("amount")] + public Types.Amount Amount { get; set; } = new Types.Amount(); + + /// + /// 获取或设置支付者信息。 + /// + [Newtonsoft.Json.JsonProperty("payer")] + [System.Text.Json.Serialization.JsonPropertyName("payer")] + public Types.Payer Payer { get; set; } = new Types.Payer(); + + /// + /// 获取或设置商品信息。 + /// + [Newtonsoft.Json.JsonProperty("detail")] + [System.Text.Json.Serialization.JsonPropertyName("detail")] + public Types.Detail? Detail { get; set; } + + /// + /// 获取或设置场景信息。 + /// + [Newtonsoft.Json.JsonProperty("scene_info")] + [System.Text.Json.Serialization.JsonPropertyName("scene_info")] + public Types.Scene Scene { get; set; } = new Types.Scene(); + + /// + /// 获取或设置结算信息。 + /// + [Newtonsoft.Json.JsonProperty("settle_info")] + [System.Text.Json.Serialization.JsonPropertyName("settle_info")] + public Types.Settlement? Settlement { get; set; } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/PayTransactions/CreatePayPartnerTransactionCodePayResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/PayTransactions/CreatePayPartnerTransactionCodePayResponse.cs new file mode 100644 index 00000000..84ba3ecc --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/PayTransactions/CreatePayPartnerTransactionCodePayResponse.cs @@ -0,0 +1,9 @@ +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /pay/partner/transactions/codepay 接口的响应。 + /// + public class CreatePayPartnerTransactionCodePayResponse : GetPayPartnerTransactionByOutTradeNumberResponse + { + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/PayTransactions/ReversePayPartnerTransactionRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/PayTransactions/ReversePayPartnerTransactionRequest.cs new file mode 100644 index 00000000..5f917912 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/PayTransactions/ReversePayPartnerTransactionRequest.cs @@ -0,0 +1,22 @@ +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /pay/partner/transactions/out-trade-no/{out_trade_no}/reverse 接口的请求。 + /// + public class ReversePayPartnerTransactionRequest : ClosePayPartnerTransactionRequest + { + /// + /// 获取或设置服务商 AppId。 + /// + [Newtonsoft.Json.JsonProperty("sp_appid")] + [System.Text.Json.Serialization.JsonPropertyName("sp_appid")] + public string? AppId { get; set; } + + /// + /// 获取或设置子商户 AppId。 + /// + [Newtonsoft.Json.JsonProperty("sub_appid")] + [System.Text.Json.Serialization.JsonPropertyName("sub_appid")] + public string? SubAppId { get; set; } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/PayTransactions/ReversePayPartnerTransactionResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/PayTransactions/ReversePayPartnerTransactionResponse.cs new file mode 100644 index 00000000..126facc7 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/_Partner/PayTransactions/ReversePayPartnerTransactionResponse.cs @@ -0,0 +1,43 @@ +namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models +{ + /// + /// 表示 [POST] /pay/partner/transactions/out-trade-no/{out_trade_no}/reverse 接口的响应。 + /// + public class ReversePayPartnerTransactionResponse : WechatTenpayResponse + { + /// + /// 获取或设置服务商商户号。 + /// + [Newtonsoft.Json.JsonProperty("sp_mchid")] + [System.Text.Json.Serialization.JsonPropertyName("sp_mchid")] + public string MerchantId { get; set; } = default!; + + /// + /// 获取或设置子商户号。 + /// + [Newtonsoft.Json.JsonProperty("sub_mchid")] + [System.Text.Json.Serialization.JsonPropertyName("sub_mchid")] + public string SubMerchantId { get; set; } = default!; + + /// + /// 获取或设置服务商 AppId。 + /// + [Newtonsoft.Json.JsonProperty("sp_appid")] + [System.Text.Json.Serialization.JsonPropertyName("sp_appid")] + public string? AppId { get; set; } + + /// + /// 获取或设置子商户 AppId。 + /// + [Newtonsoft.Json.JsonProperty("sub_appid")] + [System.Text.Json.Serialization.JsonPropertyName("sub_appid")] + public string? SubAppId { get; set; } + + /// + /// 获取或设置商户订单号。 + /// + [Newtonsoft.Json.JsonProperty("out_trade_no")] + [System.Text.Json.Serialization.JsonPropertyName("out_trade_no")] + public string OutTradeNumber { get; set; } = default!; + } +} diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_/PayTransactions/CreatePayTransactionCodePayRequest.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_/PayTransactions/CreatePayTransactionCodePayRequest.json new file mode 100644 index 00000000..dd6db68c --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_/PayTransactions/CreatePayTransactionCodePayRequest.json @@ -0,0 +1,40 @@ +{ + "appid": "wxd678efh567hg6787", + "mchid": "1230000109", + "description": "Image形象店-深圳腾大-QQ公仔", + "out_trade_no": "1217752501201407033233368018", + "attach": "自定义数据说明", + "goods_tag": "WXG", + "support_fapiao": false, + "payer": { + "auth_code": "130061098828009406" + }, + "amount": { + "total": 100, + "currency": "CNY" + }, + "scene_info": { + "device_id": "013467007045764", + "device_ip": "128.0.0.1", + "store_info": { + "id": "0001", + "out_id": "A1111" + } + }, + "detail": { + "cost_price": 608800, + "invoice_id": "微信123", + "goods_detail": [ + { + "merchant_goods_id": "1246464644", + "wxpay_goods_id": "1001", + "goods_name": "iPhoneX 256G", + "quantity": 1, + "unit_price": 528800 + } + ] + }, + "settle_info": { + "profit_sharing": false + } +} diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_/PayTransactions/CreatePayTransactionCodePayResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_/PayTransactions/CreatePayTransactionCodePayResponse.json new file mode 100644 index 00000000..2db1e9f8 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_/PayTransactions/CreatePayTransactionCodePayResponse.json @@ -0,0 +1,44 @@ +{ + "appid": "wxd678efh567hg6787", + "mchid": "1230000109", + "out_trade_no": "1217752501201407033233368018", + "transaction_id": "1217752501201407033233368018", + "trade_type": "MICROPAY", + "bank_type": "CCB_DEBIT", + "success_time": "2018-06-08T10:34:56+08:00", + "trade_state": "SUCCESS", + "trade_state_desc": "支付成功", + "attach": "自定义数据说明", + "payer": { + "openid": "oUpF8uMuAJO_M2pxb1Q9zNjWeS6o" + }, + "amount": { + "total": 100, + "payer_total": 100, + "currency": "CNY", + "payer_currency": "CNY" + }, + "promotion_detail": [ + { + "coupon_id": "109519", + "name": "单品惠-6", + "scope": "GLOBAL", + "type": "CASH", + "amount": 100, + "stock_id": "931386", + "wechatpay_contribute": 0, + "merchant_contribute": 0, + "other_contribute": 0, + "currency": "CNY", + "goods_detail": [ + { + "goods_id": "M1006", + "quantity": 1, + "unit_price": 100, + "discount_amount": 1, + "goods_remark": "商品备注信息" + } + ] + } + ] +} diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_/PayTransactions/ReversePayTransactionRequest.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_/PayTransactions/ReversePayTransactionRequest.json new file mode 100644 index 00000000..34ca55ca --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_/PayTransactions/ReversePayTransactionRequest.json @@ -0,0 +1,4 @@ +{ + "appid": "wxd678efh567hg6787", + "mchid": "1230000109" +} diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_/PayTransactions/ReversePayTransactionResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_/PayTransactions/ReversePayTransactionResponse.json new file mode 100644 index 00000000..a395998f --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_/PayTransactions/ReversePayTransactionResponse.json @@ -0,0 +1,5 @@ +{ + "appid": "wxd678efh567hg6787", + "mchid": "1230000109", + "out_trade_no": "1217752501201407033233368018" +} diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_/_Partner/PayTransactions/CreatePayPartnerTransactionCodePayRequest.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_/_Partner/PayTransactions/CreatePayPartnerTransactionCodePayRequest.json new file mode 100644 index 00000000..d3631a82 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_/_Partner/PayTransactions/CreatePayPartnerTransactionCodePayRequest.json @@ -0,0 +1,42 @@ +{ + "sp_appid": "wxd678efh567hg6787", + "sp_mchid": "1230000109", + "sub_appid": "wxd678efh567hg6787", + "sub_mchid": "1230000109", + "description": "Image形象店-深圳腾大-QQ公仔", + "out_trade_no": "1217752501201407033233368018", + "attach": "自定义数据说明", + "goods_tag": "WXG", + "support_fapiao": false, + "payer": { + "auth_code": "130061098828009406" + }, + "amount": { + "total": 100, + "currency": "CNY" + }, + "scene_info": { + "device_id": "013467007045764", + "device_ip": "128.0.0.1", + "store_info": { + "id": "0001", + "out_id": "A1111" + } + }, + "detail": { + "cost_price": 608800, + "invoice_id": "微信123", + "goods_detail": [ + { + "merchant_goods_id": "1246464644", + "wxpay_goods_id": "1001", + "goods_name": "iPhoneX 256G", + "quantity": 1, + "unit_price": 528800 + } + ] + }, + "settle_info": { + "profit_sharing": false + } +} diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_/_Partner/PayTransactions/CreatePayPartnerTransactionCodePayResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_/_Partner/PayTransactions/CreatePayPartnerTransactionCodePayResponse.json new file mode 100644 index 00000000..7435da8a --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_/_Partner/PayTransactions/CreatePayPartnerTransactionCodePayResponse.json @@ -0,0 +1,47 @@ +{ + "sp_appid": "wxd678efh567hg6787", + "sp_mchid": "1230000109", + "sub_appid": "wxd678efh567hg6787", + "sub_mchid": "1230000109", + "out_trade_no": "1217752501201407033233368018", + "transaction_id": "1217752501201407033233368018", + "trade_type": "MICROPAY", + "bank_type": "CCB_DEBIT", + "success_time": "2018-06-08T10:34:56+08:00", + "trade_state": "SUCCESS", + "trade_state_desc": "支付成功", + "attach": "自定义数据说明", + "payer": { + "sp_openid": "oUpF8uMuAJO_M2pxb1Q9zNjWeS6o", + "sub_openid": "oUpF8uMuAJO_M2pxb1Q9zNjWeS6o" + }, + "amount": { + "total": 100, + "payer_total": 100, + "currency": "CNY", + "payer_currency": "CNY" + }, + "promotion_detail": [ + { + "coupon_id": "109519", + "name": "单品惠-6", + "scope": "GLOBAL", + "type": "CASH", + "amount": 100, + "stock_id": "931386", + "wechatpay_contribute": 0, + "merchant_contribute": 0, + "other_contribute": 0, + "currency": "CNY", + "goods_detail": [ + { + "goods_id": "M1006", + "quantity": 1, + "unit_price": 100, + "discount_amount": 1, + "goods_remark": "商品备注信息" + } + ] + } + ] +} diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_/_Partner/PayTransactions/ReversePayPartnerTransactionRequest.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_/_Partner/PayTransactions/ReversePayPartnerTransactionRequest.json new file mode 100644 index 00000000..a5905a59 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_/_Partner/PayTransactions/ReversePayPartnerTransactionRequest.json @@ -0,0 +1,6 @@ +{ + "sp_appid": "wxd678efh567hg6787", + "sp_mchid": "1230000109", + "sub_appid": "wxd678efh567hg6787", + "sub_mchid": "1230000109" +} diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_/_Partner/PayTransactions/ReversePayPartnerTransactionResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_/_Partner/PayTransactions/ReversePayPartnerTransactionResponse.json new file mode 100644 index 00000000..86952aab --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/_/_Partner/PayTransactions/ReversePayPartnerTransactionResponse.json @@ -0,0 +1,7 @@ +{ + "sp_appid": "wxd678efh567hg6787", + "sp_mchid": "1230000109", + "sub_appid": "wxd678efh567hg6787", + "sub_mchid": "1230000109", + "out_trade_no": "1217752501201407033233368018" +}