瀏覽代碼

Merge pull request #76 from essensoft/dev-wechatpay-apiv3

实现 微信支付APIv3-基础支付-合单支付
Roc 5 年之前
父節點
當前提交
f51b32b5eb
共有 35 個文件被更改,包括 1201 次插入7 次删除
  1. 1 1
      src/Essensoft.AspNetCore.Payment.WeChatPay/Domain/AmountResponse.cs
  2. 27 0
      src/Essensoft.AspNetCore.Payment.WeChatPay/Domain/CombineAmount.cs
  3. 43 0
      src/Essensoft.AspNetCore.Payment.WeChatPay/Domain/CombineAmountResponse.cs
  4. 36 0
      src/Essensoft.AspNetCore.Payment.WeChatPay/Domain/CombineCloseSubOrderInfo.cs
  5. 34 0
      src/Essensoft.AspNetCore.Payment.WeChatPay/Domain/CombineH5SceneInfo.cs
  6. 27 0
      src/Essensoft.AspNetCore.Payment.WeChatPay/Domain/CombineSceneInfo.cs
  7. 19 0
      src/Essensoft.AspNetCore.Payment.WeChatPay/Domain/CombineSceneInfoResponse.cs
  8. 66 0
      src/Essensoft.AspNetCore.Payment.WeChatPay/Domain/CombineSubOrderInfo.cs
  9. 101 0
      src/Essensoft.AspNetCore.Payment.WeChatPay/Domain/CombineSubOrderInfoResponse.cs
  10. 52 0
      src/Essensoft.AspNetCore.Payment.WeChatPay/Domain/H5Info.cs
  11. 83 0
      src/Essensoft.AspNetCore.Payment.WeChatPay/Domain/WeChatPayCombineTransactionsAppModel.cs
  12. 76 0
      src/Essensoft.AspNetCore.Payment.WeChatPay/Domain/WeChatPayCombineTransactionsH5Model.cs
  13. 83 0
      src/Essensoft.AspNetCore.Payment.WeChatPay/Domain/WeChatPayCombineTransactionsJsApiModel.cs
  14. 76 0
      src/Essensoft.AspNetCore.Payment.WeChatPay/Domain/WeChatPayCombineTransactionsNativeModel.cs
  15. 28 0
      src/Essensoft.AspNetCore.Payment.WeChatPay/Domain/WeChatPayCombineTransactionsOutTradeNoCloseModel.cs
  16. 62 0
      src/Essensoft.AspNetCore.Payment.WeChatPay/Notify/WeChatPayCombineTransactionsNotify.cs
  17. 1 1
      src/Essensoft.AspNetCore.Payment.WeChatPay/Notify/WeChatPayPartnerTransactionsNotify.cs
  18. 1 1
      src/Essensoft.AspNetCore.Payment.WeChatPay/Notify/WeChatPayTransactionsNotify.cs
  19. 29 0
      src/Essensoft.AspNetCore.Payment.WeChatPay/Request/WeChatPayCombineTransactionsAppRequest.cs
  20. 29 0
      src/Essensoft.AspNetCore.Payment.WeChatPay/Request/WeChatPayCombineTransactionsH5Request.cs
  21. 29 0
      src/Essensoft.AspNetCore.Payment.WeChatPay/Request/WeChatPayCombineTransactionsJsApiRequest.cs
  22. 29 0
      src/Essensoft.AspNetCore.Payment.WeChatPay/Request/WeChatPayCombineTransactionsNativeRequest.cs
  23. 36 0
      src/Essensoft.AspNetCore.Payment.WeChatPay/Request/WeChatPayCombineTransactionsOutTradeNoCloseRequest.cs
  24. 24 0
      src/Essensoft.AspNetCore.Payment.WeChatPay/Request/WeChatPayCombineTransactionsOutTradeNoRequest.cs
  25. 56 0
      src/Essensoft.AspNetCore.Payment.WeChatPay/Request/WeChatPayV3MiniProgramSdkRequest.cs
  26. 20 0
      src/Essensoft.AspNetCore.Payment.WeChatPay/Response/WeChatPayCombineTransactionsAppResponse.cs
  27. 20 0
      src/Essensoft.AspNetCore.Payment.WeChatPay/Response/WeChatPayCombineTransactionsH5Response.cs
  28. 20 0
      src/Essensoft.AspNetCore.Payment.WeChatPay/Response/WeChatPayCombineTransactionsJsApiResponse.cs
  29. 20 0
      src/Essensoft.AspNetCore.Payment.WeChatPay/Response/WeChatPayCombineTransactionsNativeResponse.cs
  30. 11 0
      src/Essensoft.AspNetCore.Payment.WeChatPay/Response/WeChatPayCombineTransactionsOutTradeNoCloseResponse.cs
  31. 58 0
      src/Essensoft.AspNetCore.Payment.WeChatPay/Response/WeChatPayCombineTransactionsOutTradeNoResponse.cs
  32. 1 1
      src/Essensoft.AspNetCore.Payment.WeChatPay/Response/WeChatPayPartnerTransactionsIdResponse.cs
  33. 1 1
      src/Essensoft.AspNetCore.Payment.WeChatPay/Response/WeChatPayPartnerTransactionsOutTradeNoResponse.cs
  34. 1 1
      src/Essensoft.AspNetCore.Payment.WeChatPay/Response/WeChatPayTransactionsIdResponse.cs
  35. 1 1
      src/Essensoft.AspNetCore.Payment.WeChatPay/Response/WeChatPayTransactionsOutTradeNoResponse.cs

+ 1 - 1
src/Essensoft.AspNetCore.Payment.WeChatPay/Domain/QueryAmount.cs → src/Essensoft.AspNetCore.Payment.WeChatPay/Domain/AmountResponse.cs

@@ -5,7 +5,7 @@ namespace Essensoft.AspNetCore.Payment.WeChatPay.Domain
     /// <summary>
     /// 订单金额信息
     /// </summary>    
-    public class QueryAmount : WeChatPayObject
+    public class AmountResponse : WeChatPayObject
     {
         /// <summary>
         /// 订单金额

+ 27 - 0
src/Essensoft.AspNetCore.Payment.WeChatPay/Domain/CombineAmount.cs

@@ -0,0 +1,27 @@
+using System.Text.Json.Serialization;
+
+namespace Essensoft.AspNetCore.Payment.WeChatPay.Domain
+{
+    /// <summary>
+    /// 合单下单订单金额信息
+    /// </summary>    
+    public class CombineAmount : WeChatPayObject
+    {
+        /// <summary>
+        /// 标价金额
+        /// 子单金额,单位为分
+        /// 境外场景下,标价金额要超过商户结算币种的最小单位金额,例如结算币种为美元,则标价金额必须大于1美分
+        // 示例值:100
+        /// </summary>
+        [JsonPropertyName("total_amount")]
+        public int TotalAmount { get; set; }
+
+        /// <summary>
+        /// 标价币种	
+        /// 符合ISO 4217标准的三位字母代码,人民币:CNY 。
+        /// 示例值:CNY
+        /// </summary>
+        [JsonPropertyName("currency")]
+        public string Currency { get; set; }
+    }
+}

+ 43 - 0
src/Essensoft.AspNetCore.Payment.WeChatPay/Domain/CombineAmountResponse.cs

@@ -0,0 +1,43 @@
+using System.Text.Json.Serialization;
+
+namespace Essensoft.AspNetCore.Payment.WeChatPay.Domain
+{
+    /// <summary>
+    /// 合单下单订单金额信息
+    /// </summary>    
+    public class CombineAmountResponse : WeChatPayObject
+    {
+        /// <summary>
+        /// 标价金额
+        /// 子单金额,单位为分
+        /// 境外场景下,标价金额要超过商户结算币种的最小单位金额,例如结算币种为美元,则标价金额必须大于1美分
+        /// 示例值:100
+        /// </summary>
+        [JsonPropertyName("total_amount")]
+        public int TotalAmount { get; set; }
+
+        /// <summary>
+        /// 标价币种	
+        /// 符合ISO 4217标准的三位字母代码,人民币:CNY 。
+        /// 示例值:CNY
+        /// </summary>
+        [JsonPropertyName("currency")]
+        public string Currency { get; set; }
+
+        /// <summary>
+        /// 现金支付金额
+        /// 订单现金支付金额。
+        /// 示例值: 10
+        /// </summary>
+        [JsonPropertyName("payer_amount")]
+        public int PayerAmount { get; set; }
+
+        /// <summary>
+        /// 现金支付币种	
+        /// 货币类型,符合ISO 4217标准的三位字母代码,默认人民币:CNY。
+        /// 示例值: CNY
+        /// </summary>
+        [JsonPropertyName("payer_currency")]
+        public string PayerCurrency { get; set; }
+    }
+}

+ 36 - 0
src/Essensoft.AspNetCore.Payment.WeChatPay/Domain/CombineCloseSubOrderInfo.cs

@@ -0,0 +1,36 @@
+using System.Text.Json.Serialization;
+
+namespace Essensoft.AspNetCore.Payment.WeChatPay.Domain
+{
+    /// <summary>
+    /// 合单关闭订单子单信息
+    /// </summary>       
+    public class CombineCloseSubOrderInfo : WeChatPayObject
+    {
+        /// <summary>
+        /// 子单商户号
+        /// 子单发起方商户号,必须与发起方appid有绑定关系。
+        /// 示例值:1900000109
+        /// </summary>
+        [JsonPropertyName("mchid")]
+        public string MchId { get; set; }
+
+        /// <summary>
+        /// 子单商户订单号
+        /// 商户系统内部订单号,要求32个字符内,只能是数字、大小写字母_-|*@ ,且在同一个商户号下唯一。
+        /// 特殊规则:最小字符长度为6
+        /// 示例值:20150806125346
+        /// </summary>
+        [JsonPropertyName("out_trade_no")]
+        public string OutTradeNo { get; set; }
+
+        /// <summary>
+        /// 二级商户号
+        /// 二级商户商户号,由微信支付生成并下发。
+        /// 注意:仅适用于电商平台 服务商
+        /// 示例值:1900000109
+        /// </summary>
+        [JsonPropertyName("sub_mchid")]
+        public string SubMchId { get; set; }
+    }
+}

+ 34 - 0
src/Essensoft.AspNetCore.Payment.WeChatPay/Domain/CombineH5SceneInfo.cs

@@ -0,0 +1,34 @@
+using System.Text.Json.Serialization;
+
+namespace Essensoft.AspNetCore.Payment.WeChatPay.Domain
+{
+    /// <summary>
+    /// 合单下单H5支付场景描述
+    /// </summary>       
+    public class CombineH5SceneInfo : WeChatPayObject
+    {
+        /// <summary>
+        /// 商户端设备号
+        /// 终端设备号(门店号或收银设备ID) 。
+        /// 特殊规则:长度最小7个字节
+        /// 示例值:POS1:1
+        /// </summary>
+        [JsonPropertyName("device_id")]
+        public string DeviceId { get; set; }
+
+        /// <summary>
+        /// 用户终端IP
+        /// 格式: ip(ipv4+ipv6)
+        /// 示例值:14.17.22.32
+        /// </summary>
+        [JsonPropertyName("payer_client_ip")]
+        public string PayerClientIp { get; set; }
+
+        /// <summary>
+        /// H5场景信息
+        /// H5场景信息
+        /// </summary>
+        [JsonPropertyName("h5_info")]
+        public H5Info H5Info { get; set; }
+    }
+}

+ 27 - 0
src/Essensoft.AspNetCore.Payment.WeChatPay/Domain/CombineSceneInfo.cs

@@ -0,0 +1,27 @@
+using System.Text.Json.Serialization;
+
+namespace Essensoft.AspNetCore.Payment.WeChatPay.Domain
+{
+    /// <summary>
+    /// 合单下单支付场景描述
+    /// </summary>       
+    public class CombineSceneInfo : WeChatPayObject
+    {
+        /// <summary>
+        /// 商户端设备号
+        /// 终端设备号(门店号或收银设备ID) 。
+        /// 特殊规则:长度最小7个字节
+        /// 示例值:POS1:1
+        /// </summary>
+        [JsonPropertyName("device_id")]
+        public string DeviceId { get; set; }
+
+        /// <summary>
+        /// 用户终端IP
+        /// 格式: ip(ipv4+ipv6)
+        /// 示例值:14.17.22.32
+        /// </summary>
+        [JsonPropertyName("payer_client_ip")]
+        public string PayerClientIp { get; set; }
+    }
+}

+ 19 - 0
src/Essensoft.AspNetCore.Payment.WeChatPay/Domain/CombineSceneInfoResponse.cs

@@ -0,0 +1,19 @@
+using System.Text.Json.Serialization;
+
+namespace Essensoft.AspNetCore.Payment.WeChatPay.Domain
+{
+    /// <summary>
+    /// 合单下单支付场景描述
+    /// </summary>       
+    public class CombineSceneInfoResponse : WeChatPayObject
+    {
+        /// <summary>
+        /// 商户端设备号
+        /// 终端设备号(门店号或收银设备ID) 。
+        /// 特殊规则:长度最小7个字节
+        /// 示例值:POS1:1
+        /// </summary>
+        [JsonPropertyName("device_id")]
+        public string DeviceId { get; set; }
+    }
+}

+ 66 - 0
src/Essensoft.AspNetCore.Payment.WeChatPay/Domain/CombineSubOrderInfo.cs

@@ -0,0 +1,66 @@
+using System.Text.Json.Serialization;
+
+namespace Essensoft.AspNetCore.Payment.WeChatPay.Domain
+{
+    /// <summary>
+    /// 合单下单子单信息
+    /// </summary>       
+    public class CombineSubOrderInfo : WeChatPayObject
+    {
+        /// <summary>
+        /// 子单商户号
+        /// 子单发起方商户号,必须与发起方appid有绑定关系。
+        /// 示例值:1900000109
+        /// </summary>
+        [JsonPropertyName("mchid")]
+        public string MchId { get; set; }
+
+        /// <summary>
+        /// 附加数据
+        /// 附加数据,在查询API和支付通知中原样返回,可作为自定义参数使用。
+        /// 示例值:深圳分店
+        /// </summary>
+        [JsonPropertyName("attach")]
+        public string Attach { get; set; }
+
+        /// <summary>
+        /// 订单金额
+        /// 订单金额信息
+        /// </summary>
+        [JsonPropertyName("amount")]
+        public CombineAmount Amount { get; set; }
+
+        /// <summary>
+        /// 子单商户订单号
+        /// 商户系统内部订单号,要求32个字符内,只能是数字、大小写字母_-|*@ ,且在同一个商户号下唯一。
+        /// 特殊规则:最小字符长度为6
+        /// 示例值:20150806125346
+        /// </summary>
+        [JsonPropertyName("out_trade_no")]
+        public string OutTradeNo { get; set; }
+
+        /// <summary>
+        /// 二级商户号
+        /// 二级商户商户号,由微信支付生成并下发。
+        /// 注意:仅适用于电商平台 服务商
+        /// 示例值:1900000109
+        /// </summary>
+        [JsonPropertyName("sub_mchid")]
+        public string SubMchId { get; set; }
+
+        /// <summary>
+        /// 商品描述
+        /// 商品简单描述。需传入应用市场上的APP名字-实际商品名称,例如:天天爱消除-游戏充值。
+        /// 示例值:腾讯充值中心-QQ会员充值
+        /// </summary>
+        [JsonPropertyName("description")]
+        public string Description { get; set; }
+
+        /// <summary>
+        /// 结算信息
+        /// 结算信息
+        /// </summary>
+        [JsonPropertyName("settle_info")]
+        public SettleInfo SettleInfo { get; set; }
+    }
+}

+ 101 - 0
src/Essensoft.AspNetCore.Payment.WeChatPay/Domain/CombineSubOrderInfoResponse.cs

@@ -0,0 +1,101 @@
+using System.Text.Json.Serialization;
+
+namespace Essensoft.AspNetCore.Payment.WeChatPay.Domain
+{
+    /// <summary>
+    /// 合单下单子单信息
+    /// </summary>       
+    public class CombineSubOrderInfoResponse : WeChatPayObject
+    {
+        /// <summary>
+        /// 子单商户号
+        /// 子单发起方商户号,必须与发起方appid有绑定关系。
+        /// 示例值:1900000109
+        /// </summary>
+        [JsonPropertyName("mchid")]
+        public string MchId { get; set; }
+
+        /// <summary>
+        /// 交易类型
+        /// 枚举值:
+        /// NATIVE:扫码支付
+        /// JSAPI:公众号支付
+        /// APP:APP支付
+        /// MWEB:H5支付
+        /// 示例值: JSAPI
+        /// </summary>
+        [JsonPropertyName("trade_type")]
+        public string TradeType { get; set; }
+
+        /// <summary>
+        /// 交易状态
+        /// 枚举值:
+        /// SUCCESS:支付成功
+        /// REFUND:转入退款
+        /// NOTPAY:未支付
+        /// CLOSED:已关闭
+        /// USERPAYING:用户支付中(付款码支付)
+        /// PAYERROR:支付失败(其他原因,如银行返回失败)
+        /// 示例值:SUCCESS
+        /// </summary>
+        [JsonPropertyName("trade_state")]
+        public string TradeState { get; set; }
+
+        /// <summary>
+        /// 付款银行
+        /// 银行类型,采用字符串类型的银行标识。
+        /// 示例值:CMC
+        /// </summary>
+        [JsonPropertyName("bank_type")]
+        public string BankType { get; set; }
+
+        /// <summary>
+        /// 附加数据
+        /// 附加数据,在查询API和支付通知中原样返回,可作为自定义参数使用。
+        /// 示例值:深圳分店
+        /// </summary>
+        [JsonPropertyName("attach")]
+        public string Attach { get; set; }
+
+        /// <summary>
+        /// 支付完成时间
+        /// 订单支付时间,遵循rfc3339标准格式,格式为YYYY-MM-DDTHH:mm:ss:sss+TIMEZONE,YYYY-MM-DD表示年月日,T出现在字符串中,表示time元素的开头,HH:mm:ss:sss表示时分秒毫秒,TIMEZONE表示时区(+08:00表示东八区时间,领先UTC 8小时,即北京时间)。例如:2015-05-20T13:29:35+08:00表示,北京时间2015年5月20日13点29分35秒。
+        /// 示例值: 2015-05-20T13:29:35.120+08:00
+        /// </summary>
+        [JsonPropertyName("success_time")]
+        public string SuccessTime { get; set; }
+
+        /// <summary>
+        /// 微信支付订单号
+        /// 微信支付订单号。
+        /// 示例值:1009660380201506130728806387
+        /// </summary>
+        [JsonPropertyName("transaction_id")]
+        public string TransactionId { get; set; }
+
+        /// <summary>
+        /// 子单商户订单号
+        /// 商户系统内部订单号,要求32个字符内,只能是数字、大小写字母_-|*@ ,且在同一个商户号下唯一。
+        /// 特殊规则:最小字符长度为6
+        /// 示例值:20150806125346
+        /// </summary>
+        [JsonPropertyName("out_trade_no")]
+        public string OutTradeNo { get; set; }
+
+        /// <summary>
+        /// 二级商户号
+        /// 二级商户商户号,由微信支付生成并下发。
+        /// 注意:仅适用于电商平台 服务商
+        /// 示例值:1900000109
+        /// </summary>
+        [JsonPropertyName("sub_mchid")]
+        public string SubMchId { get; set; }
+
+        /// <summary>
+        /// 订单金额
+        /// 订单金额信息
+        /// </summary>
+        [JsonPropertyName("amount")]
+        public CombineAmountResponse Amount { get; set; }
+    }
+}

+ 52 - 0
src/Essensoft.AspNetCore.Payment.WeChatPay/Domain/H5Info.cs

@@ -0,0 +1,52 @@
+using System.Text.Json.Serialization;
+
+namespace Essensoft.AspNetCore.Payment.WeChatPay.Domain
+{
+    /// <summary>
+    /// H5场景信息
+    /// </summary>    
+    public class H5Info : WeChatPayObject
+    {
+        /// <summary>
+        /// 场景类型,枚举值:
+        /// iOS:IOS移动应用;
+        /// Android:安卓移动应用;
+        /// Wap:WAP网站应用;
+        /// 示例值:iOS
+        /// </summary>
+        [JsonPropertyName("type")]
+        public int Type { get; set; }
+
+        /// <summary>
+        /// 应用名称	
+        /// 应用名称
+        /// 示例值:王者荣耀
+        /// </summary>
+        [JsonPropertyName("app_name")]
+        public string AppName { get; set; }
+
+        /// <summary>
+        /// 网站URL	
+        /// 网站URL
+        /// 示例值:https://pay.qq.com
+        /// </summary>
+        [JsonPropertyName("app_url")]
+        public string AppUrl { get; set; }
+
+        /// <summary>
+        /// iOS平台BundleID	
+        /// iOS平台BundleID
+        /// 示例值:com.tencent.wzryiOS
+        /// </summary>
+        [JsonPropertyName("bundle_id")]
+        public string BundleId { get; set; }
+
+        /// <summary>
+        /// Android平台PackageName	
+        /// Android平台PackageName
+        /// 示例值:com.tencent.tmgp.sgame
+        /// </summary>
+        [JsonPropertyName("package_name")]
+        public string PackageName { get; set; }
+    }
+}

+ 83 - 0
src/Essensoft.AspNetCore.Payment.WeChatPay/Domain/WeChatPayCombineTransactionsAppModel.cs

@@ -0,0 +1,83 @@
+using System.Collections.Generic;
+using System.Text.Json.Serialization;
+
+namespace Essensoft.AspNetCore.Payment.WeChatPay.Domain
+{
+    /// <summary>
+    /// 合单下单-APP支付API-请求参数(电商平台、服务商、直连商户)
+    /// 最新更新时间:2020.05.21
+    /// https://pay.weixin.qq.com/wiki/doc/apiv3/wxpay/pay/combine/chapter3_1.shtml
+    /// </summary>
+    public class WeChatPayCombineTransactionsAppModel : WeChatPayObject
+    {
+        /// <summary>
+        /// 合单商户appid
+        /// 合单发起方的appid。
+        /// 示例值:wxd678efh567hg6787
+        /// </summary>
+        [JsonPropertyName("combine_appid")]
+        public string CombineAppId { get; set; }
+
+        /// <summary>
+        /// 合单商户号
+        /// 合单发起方商户号。
+        /// 示例值:1900000109
+        /// </summary>
+        [JsonPropertyName("combine_mchid")]
+        public string CombineMchId { get; set; }
+
+        /// <summary>
+        /// 合单商户订单号
+        /// 合单支付总订单号,要求32个字符内,只能是数字、大小写字母_-|*@ ,且在同一个商户号下唯一 。
+        /// 示例值:P20150806125346
+        /// </summary>
+        [JsonPropertyName("combine_out_trade_no")]
+        public string CombineOutTradeNo { get; set; }
+
+        /// <summary>
+        /// 场景信息
+        /// 支付场景描述
+        /// </summary>
+        [JsonPropertyName("scene_info")]
+        public CombineSceneInfo SceneInfo { get; set; }
+
+        /// <summary>
+        /// 子单信息
+        /// 最多支持子单条数:50
+        /// </summary>
+        [JsonPropertyName("sub_orders")]
+        public List<CombineSubOrderInfo> SubOrders { get; set; }
+
+        /// <summary>
+        /// 支付者
+        /// 支付者信息
+        /// </summary>
+        [JsonPropertyName("combine_payer_info")]
+        public PayerInfo CombinePayerInfo { get; set; }
+
+        /// <summary>
+        /// 交易起始时间
+        /// 订单生成时间,遵循rfc3339标准格式,格式为YYYY-MM-DDTHH:mm:ss+TIMEZONE,YYYY-MM-DD表示年月日,T出现在字符串中,表示time元素的开头,HH:mm:ss表示时分秒,TIMEZONE表示时区(+08:00表示东八区时间,领先UTC 8小时,即北京时间)。例如:2015-05-20T13:29:35+08:00表示,北京时间2015年5月20日 13点29分35秒。
+        /// 示例值:2019-12-31T15:59:60+08:00
+        /// </summary>
+        [JsonPropertyName("time_start")]
+        public string TimeStart { get; set; }
+
+        /// <summary>
+        /// 交易结束时间
+        /// 订单失效时间,遵循rfc3339标准格式,格式为YYYY-MM-DDTHH:mm:ss+TIMEZONE,YYYY-MM-DD表示年月日,T出现在字符串中,表示time元素的开头,HH:mm:ss表示时分秒,TIMEZONE表示时区(+08:00表示东八区时间,领先UTC 8小时,即北京时间)。例如:2015-05-20T13:29:35+08:00表示,北京时间2015年5月20日 13点29分35秒。
+        /// 示例值:2019-12-31T15:59:60+08:00
+        /// </summary>
+        [JsonPropertyName("time_expire")]
+        public string TimeExpire { get; set; }
+
+        /// <summary>
+        /// 通知地址
+        /// 接收微信支付异步通知回调地址,通知url必须为直接可访问的URL,不能携带参数。
+        /// 格式: URL
+        /// 示例值:https://yourapp.com/notify
+        /// </summary>
+        [JsonPropertyName("notify_url")]
+        public string NotifyUrl { get; set; }
+    }
+}

+ 76 - 0
src/Essensoft.AspNetCore.Payment.WeChatPay/Domain/WeChatPayCombineTransactionsH5Model.cs

@@ -0,0 +1,76 @@
+using System.Collections.Generic;
+using System.Text.Json.Serialization;
+
+namespace Essensoft.AspNetCore.Payment.WeChatPay.Domain
+{
+    /// <summary>
+    /// 合单下单-H5支付API-请求参数(电商平台、服务商、直连商户)
+    /// 最新更新时间:2020.06.09
+    /// https://pay.weixin.qq.com/wiki/doc/apiv3/wxpay/pay/combine/chapter3_9.shtml
+    /// </summary>
+    public class WeChatPayCombineTransactionsH5Model : WeChatPayObject
+    {
+        /// <summary>
+        /// 合单商户appid
+        /// 合单发起方的appid。
+        /// 示例值:wxd678efh567hg6787
+        /// </summary>
+        [JsonPropertyName("combine_appid")]
+        public string CombineAppId { get; set; }
+
+        /// <summary>
+        /// 合单商户号
+        /// 合单发起方商户号。
+        /// 示例值:1900000109
+        /// </summary>
+        [JsonPropertyName("combine_mchid")]
+        public string CombineMchId { get; set; }
+
+        /// <summary>
+        /// 合单商户订单号
+        /// 合单支付总订单号,要求32个字符内,只能是数字、大小写字母_-|*@ ,且在同一个商户号下唯一 。
+        /// 示例值:P20150806125346
+        /// </summary>
+        [JsonPropertyName("combine_out_trade_no")]
+        public string CombineOutTradeNo { get; set; }
+
+        /// <summary>
+        /// 场景信息
+        /// 支付场景描述
+        /// </summary>
+        [JsonPropertyName("scene_info")]
+        public CombineH5SceneInfo SceneInfo { get; set; }
+
+        /// <summary>
+        /// 子单信息
+        /// 最多支持子单条数:50
+        /// </summary>
+        [JsonPropertyName("sub_orders")]
+        public List<CombineSubOrderInfo> SubOrders { get; set; }
+
+        /// <summary>
+        /// 交易起始时间
+        /// 订单生成时间,遵循rfc3339标准格式,格式为YYYY-MM-DDTHH:mm:ss+TIMEZONE,YYYY-MM-DD表示年月日,T出现在字符串中,表示time元素的开头,HH:mm:ss表示时分秒,TIMEZONE表示时区(+08:00表示东八区时间,领先UTC 8小时,即北京时间)。例如:2015-05-20T13:29:35+08:00表示,北京时间2015年5月20日 13点29分35秒。
+        /// 示例值:2019-12-31T15:59:60+08:00
+        /// </summary>
+        [JsonPropertyName("time_start")]
+        public string TimeStart { get; set; }
+
+        /// <summary>
+        /// 交易结束时间
+        /// 订单失效时间,遵循rfc3339标准格式,格式为YYYY-MM-DDTHH:mm:ss+TIMEZONE,YYYY-MM-DD表示年月日,T出现在字符串中,表示time元素的开头,HH:mm:ss表示时分秒,TIMEZONE表示时区(+08:00表示东八区时间,领先UTC 8小时,即北京时间)。例如:2015-05-20T13:29:35+08:00表示,北京时间2015年5月20日 13点29分35秒。
+        /// 示例值:2019-12-31T15:59:60+08:00
+        /// </summary>
+        [JsonPropertyName("time_expire")]
+        public string TimeExpire { get; set; }
+
+        /// <summary>
+        /// 通知地址
+        /// 接收微信支付异步通知回调地址,通知url必须为直接可访问的URL,不能携带参数。
+        /// 格式: URL
+        /// 示例值:https://yourapp.com/notify
+        /// </summary>
+        [JsonPropertyName("notify_url")]
+        public string NotifyUrl { get; set; }
+    }
+}

+ 83 - 0
src/Essensoft.AspNetCore.Payment.WeChatPay/Domain/WeChatPayCombineTransactionsJsApiModel.cs

@@ -0,0 +1,83 @@
+using System.Collections.Generic;
+using System.Text.Json.Serialization;
+
+namespace Essensoft.AspNetCore.Payment.WeChatPay.Domain
+{
+    /// <summary>
+    /// 合单下单-JSAPI支付API-请求参数(电商平台、服务商、直连商户)
+    /// 最新更新时间:2020.05.21
+    /// https://pay.weixin.qq.com/wiki/doc/apiv3/wxpay/pay/combine/chapter3_2.shtml
+    /// </summary>
+    public class WeChatPayCombineTransactionsJsApiModel : WeChatPayObject
+    {
+        /// <summary>
+        /// 合单商户appid
+        /// 合单发起方的appid。
+        /// 示例值:wxd678efh567hg6787
+        /// </summary>
+        [JsonPropertyName("combine_appid")]
+        public string CombineAppId { get; set; }
+
+        /// <summary>
+        /// 合单商户号
+        /// 合单发起方商户号。
+        /// 示例值:1900000109
+        /// </summary>
+        [JsonPropertyName("combine_mchid")]
+        public string CombineMchId { get; set; }
+
+        /// <summary>
+        /// 合单商户订单号
+        /// 合单支付总订单号,要求32个字符内,只能是数字、大小写字母_-|*@ ,且在同一个商户号下唯一 。
+        /// 示例值:P20150806125346
+        /// </summary>
+        [JsonPropertyName("combine_out_trade_no")]
+        public string CombineOutTradeNo { get; set; }
+
+        /// <summary>
+        /// 场景信息
+        /// 支付场景描述
+        /// </summary>
+        [JsonPropertyName("scene_info")]
+        public CombineSceneInfo SceneInfo { get; set; }
+
+        /// <summary>
+        /// 子单信息
+        /// 最多支持子单条数:50
+        /// </summary>
+        [JsonPropertyName("sub_orders")]
+        public List<CombineSubOrderInfo> SubOrders { get; set; }
+
+        /// <summary>
+        /// 支付者
+        /// 支付者信息
+        /// </summary>
+        [JsonPropertyName("combine_payer_info")]
+        public PayerInfo CombinePayerInfo { get; set; }
+
+        /// <summary>
+        /// 交易起始时间
+        /// 订单生成时间,遵循rfc3339标准格式,格式为YYYY-MM-DDTHH:mm:ss+TIMEZONE,YYYY-MM-DD表示年月日,T出现在字符串中,表示time元素的开头,HH:mm:ss表示时分秒,TIMEZONE表示时区(+08:00表示东八区时间,领先UTC 8小时,即北京时间)。例如:2015-05-20T13:29:35+08:00表示,北京时间2015年5月20日 13点29分35秒。
+        /// 示例值:2019-12-31T15:59:60+08:00
+        /// </summary>
+        [JsonPropertyName("time_start")]
+        public string TimeStart { get; set; }
+
+        /// <summary>
+        /// 交易结束时间
+        /// 订单失效时间,遵循rfc3339标准格式,格式为YYYY-MM-DDTHH:mm:ss+TIMEZONE,YYYY-MM-DD表示年月日,T出现在字符串中,表示time元素的开头,HH:mm:ss表示时分秒,TIMEZONE表示时区(+08:00表示东八区时间,领先UTC 8小时,即北京时间)。例如:2015-05-20T13:29:35+08:00表示,北京时间2015年5月20日 13点29分35秒。
+        /// 示例值:2019-12-31T15:59:60+08:00
+        /// </summary>
+        [JsonPropertyName("time_expire")]
+        public string TimeExpire { get; set; }
+
+        /// <summary>
+        /// 通知地址
+        /// 接收微信支付异步通知回调地址,通知url必须为直接可访问的URL,不能携带参数。
+        /// 格式: URL
+        /// 示例值:https://yourapp.com/notify
+        /// </summary>
+        [JsonPropertyName("notify_url")]
+        public string NotifyUrl { get; set; }
+    }
+}

+ 76 - 0
src/Essensoft.AspNetCore.Payment.WeChatPay/Domain/WeChatPayCombineTransactionsNativeModel.cs

@@ -0,0 +1,76 @@
+using System.Collections.Generic;
+using System.Text.Json.Serialization;
+
+namespace Essensoft.AspNetCore.Payment.WeChatPay.Domain
+{
+    /// <summary>
+    /// 合单下单-Native支付API-请求参数(电商平台、服务商、直连商户)
+    /// 最新更新时间:2020.05.14
+    /// https://pay.weixin.qq.com/wiki/doc/apiv3/wxpay/pay/combine/chapter3_10.shtml
+    /// </summary>
+    public class WeChatPayCombineTransactionsNativeModel : WeChatPayObject
+    {
+        /// <summary>
+        /// 合单商户appid
+        /// 合单发起方的appid。
+        /// 示例值:wxd678efh567hg6787
+        /// </summary>
+        [JsonPropertyName("combine_appid")]
+        public string CombineAppId { get; set; }
+
+        /// <summary>
+        /// 合单商户号
+        /// 合单发起方商户号。
+        /// 示例值:1900000109
+        /// </summary>
+        [JsonPropertyName("combine_mchid")]
+        public string CombineMchId { get; set; }
+
+        /// <summary>
+        /// 合单商户订单号
+        /// 合单支付总订单号,要求32个字符内,只能是数字、大小写字母_-|*@ ,且在同一个商户号下唯一 。
+        /// 示例值:P20150806125346
+        /// </summary>
+        [JsonPropertyName("combine_out_trade_no")]
+        public string CombineOutTradeNo { get; set; }
+
+        /// <summary>
+        /// 场景信息
+        /// 支付场景描述
+        /// </summary>
+        [JsonPropertyName("scene_info")]
+        public CombineSceneInfo SceneInfo { get; set; }
+
+        /// <summary>
+        /// 子单信息
+        /// 最多支持子单条数:50
+        /// </summary>
+        [JsonPropertyName("sub_orders")]
+        public List<CombineSubOrderInfo> SubOrders { get; set; }
+
+        /// <summary>
+        /// 交易起始时间
+        /// 订单生成时间,遵循rfc3339标准格式,格式为YYYY-MM-DDTHH:mm:ss+TIMEZONE,YYYY-MM-DD表示年月日,T出现在字符串中,表示time元素的开头,HH:mm:ss表示时分秒,TIMEZONE表示时区(+08:00表示东八区时间,领先UTC 8小时,即北京时间)。例如:2015-05-20T13:29:35+08:00表示,北京时间2015年5月20日 13点29分35秒。
+        /// 示例值:2019-12-31T15:59:60+08:00
+        /// </summary>
+        [JsonPropertyName("time_start")]
+        public string TimeStart { get; set; }
+
+        /// <summary>
+        /// 交易结束时间
+        /// 订单失效时间,遵循rfc3339标准格式,格式为YYYY-MM-DDTHH:mm:ss+TIMEZONE,YYYY-MM-DD表示年月日,T出现在字符串中,表示time元素的开头,HH:mm:ss表示时分秒,TIMEZONE表示时区(+08:00表示东八区时间,领先UTC 8小时,即北京时间)。例如:2015-05-20T13:29:35+08:00表示,北京时间2015年5月20日 13点29分35秒。
+        /// 示例值:2019-12-31T15:59:60+08:00
+        /// </summary>
+        [JsonPropertyName("time_expire")]
+        public string TimeExpire { get; set; }
+
+        /// <summary>
+        /// 通知地址
+        /// 接收微信支付异步通知回调地址,通知url必须为直接可访问的URL,不能携带参数。
+        /// 格式: URL
+        /// 示例值:https://yourapp.com/notify
+        /// </summary>
+        [JsonPropertyName("notify_url")]
+        public string NotifyUrl { get; set; }
+    }
+}

+ 28 - 0
src/Essensoft.AspNetCore.Payment.WeChatPay/Domain/WeChatPayCombineTransactionsOutTradeNoCloseModel.cs

@@ -0,0 +1,28 @@
+using System.Collections.Generic;
+using System.Text.Json.Serialization;
+
+namespace Essensoft.AspNetCore.Payment.WeChatPay.Domain
+{
+    /// <summary>
+    /// 合单关闭订单API-请求参数(电商平台、服务商、直连商户)
+    /// 最新更新时间:2020.03.31
+    /// https://pay.weixin.qq.com/wiki/doc/apiv3/wxpay/pay/combine/chapter3_4.shtml
+    /// </summary>
+    public class WeChatPayCombineTransactionsOutTradeNoCloseModel : WeChatPayObject
+    {
+        /// <summary>
+        /// 合单商户appid
+        /// 合单发起方的appid。
+        /// 示例值:wxd678efh567hg6787
+        /// </summary>
+        [JsonPropertyName("combine_appid")]
+        public string CombineAppId { get; set; }
+
+        /// <summary>
+        /// 子单信息
+        /// 最多支持子单条数:50
+        /// </summary>
+        [JsonPropertyName("sub_orders")]
+        public List<CombineCloseSubOrderInfo> SubOrders { get; set; }
+    }
+}

+ 62 - 0
src/Essensoft.AspNetCore.Payment.WeChatPay/Notify/WeChatPayCombineTransactionsNotify.cs

@@ -0,0 +1,62 @@
+#if NETCOREAPP3_1
+
+using System.Collections.Generic;
+using System.Text.Json.Serialization;
+using Essensoft.AspNetCore.Payment.WeChatPay.Domain;
+
+namespace Essensoft.AspNetCore.Payment.WeChatPay.Notify
+{
+    /// <summary>
+    /// 合单支付-支付通知API (电商平台、服务商、直连商户)
+    /// 最新更新时间:2019.09.10
+    /// https://pay.weixin.qq.com/wiki/doc/apiv3/wxpay/pay/combine/chapter3_7.shtml
+    /// </summary>
+    public class WeChatPayCombineTransactionsNotify : WeChatPayV3Notify
+    {
+        /// 合单商户appid
+        /// 合单发起方的appid。
+        /// 示例值:wxd678efh567hg6787
+        /// </summary>
+        [JsonPropertyName("combine_appid")]
+        public string CombineAppId { get; set; }
+
+        /// <summary>
+        /// 合单商户号
+        /// 合单发起方商户号。
+        /// 示例值:1900000109
+        /// </summary>
+        [JsonPropertyName("combine_mchid")]
+        public string CombineMchId { get; set; }
+
+        /// <summary>
+        /// 合单商户订单号
+        /// 合单支付总订单号,要求32个字符内,只能是数字、大小写字母_-|*@ ,且在同一个商户号下唯一 。
+        /// 示例值:P20150806125346
+        /// </summary>
+        [JsonPropertyName("combine_out_trade_no")]
+        public string CombineOutTradeNo { get; set; }
+
+        /// <summary>
+        /// 场景信息
+        /// 支付场景描述
+        /// </summary>
+        [JsonPropertyName("scene_info")]
+        public CombineSceneInfoResponse SceneInfo { get; set; }
+
+        /// <summary>
+        /// 子单信息
+        /// 最多支持子单条数:50
+        /// </summary>
+        [JsonPropertyName("sub_orders")]
+        public List<CombineSubOrderInfoResponse> SubOrders { get; set; }
+
+        /// <summary>
+        /// 支付者
+        /// 支付者信息
+        /// </summary>
+        [JsonPropertyName("combine_payer_info")]
+        public PayerInfo CombinePayerInfo { get; set; }
+    }
+}
+
+#endif

+ 1 - 1
src/Essensoft.AspNetCore.Payment.WeChatPay/Notify/WeChatPayPartnerTransactionsNotify.cs

@@ -135,7 +135,7 @@ namespace Essensoft.AspNetCore.Payment.WeChatPay.Notify
         /// 订单金额信息
         /// </summary>
         [JsonPropertyName("amount")]
-        public QueryAmount Amount { get; set; }
+        public AmountResponse Amount { get; set; }
 
         /// <summary>
         /// 场景信息

+ 1 - 1
src/Essensoft.AspNetCore.Payment.WeChatPay/Notify/WeChatPayTransactionsNotify.cs

@@ -119,7 +119,7 @@ namespace Essensoft.AspNetCore.Payment.WeChatPay.Notify
         /// 订单金额信息
         /// </summary>
         [JsonPropertyName("amount")]
-        public QueryAmount Amount { get; set; }
+        public AmountResponse Amount { get; set; }
 
         /// <summary>
         /// 场景信息

+ 29 - 0
src/Essensoft.AspNetCore.Payment.WeChatPay/Request/WeChatPayCombineTransactionsAppRequest.cs

@@ -0,0 +1,29 @@
+using Essensoft.AspNetCore.Payment.WeChatPay.Response;
+
+namespace Essensoft.AspNetCore.Payment.WeChatPay.Request
+{
+    /// <summary>
+    /// 合单下单-APP支付API(电商平台、服务商、直连商户)
+    /// 最新更新时间:2020.05.21
+    /// https://pay.weixin.qq.com/wiki/doc/apiv3/wxpay/pay/combine/chapter3_1.shtml
+    /// </summary>
+    public class WeChatPayCombineTransactionsAppRequest : IWeChatPayV3PostRequest<WeChatPayCombineTransactionsAppResponse>
+    {
+        private WeChatPayObject queryModel;
+
+        public string GetRequestUrl()
+        {
+            return "https://api.mch.weixin.qq.com/v3/combine-transactions/app";
+        }
+
+        public WeChatPayObject GetQueryModel()
+        {
+            return queryModel;
+        }
+
+        public void SetQueryModel(WeChatPayObject queryModel)
+        {
+            this.queryModel = queryModel;
+        }
+    }
+}

+ 29 - 0
src/Essensoft.AspNetCore.Payment.WeChatPay/Request/WeChatPayCombineTransactionsH5Request.cs

@@ -0,0 +1,29 @@
+using Essensoft.AspNetCore.Payment.WeChatPay.Response;
+
+namespace Essensoft.AspNetCore.Payment.WeChatPay.Request
+{
+    /// <summary>
+    /// 合单下单-H5支付API(电商平台、服务商、直连商户)
+    /// 最新更新时间:2020.06.09
+    /// https://pay.weixin.qq.com/wiki/doc/apiv3/wxpay/pay/combine/chapter3_9.shtml
+    /// </summary>
+    public class WeChatPayCombineTransactionsH5Request : IWeChatPayV3PostRequest<WeChatPayCombineTransactionsH5Response>
+    {
+        private WeChatPayObject queryModel;
+
+        public string GetRequestUrl()
+        {
+            return "https://api.mch.weixin.qq.com/v3/combine-transactions/h5";
+        }
+
+        public WeChatPayObject GetQueryModel()
+        {
+            return queryModel;
+        }
+
+        public void SetQueryModel(WeChatPayObject queryModel)
+        {
+            this.queryModel = queryModel;
+        }
+    }
+}

+ 29 - 0
src/Essensoft.AspNetCore.Payment.WeChatPay/Request/WeChatPayCombineTransactionsJsApiRequest.cs

@@ -0,0 +1,29 @@
+using Essensoft.AspNetCore.Payment.WeChatPay.Response;
+
+namespace Essensoft.AspNetCore.Payment.WeChatPay.Request
+{
+    /// <summary>
+    /// 合单下单-JSAPI支付API(电商平台、服务商、直连商户)
+    /// 最新更新时间:2020.05.21
+    /// https://pay.weixin.qq.com/wiki/doc/apiv3/wxpay/pay/combine/chapter3_2.shtml
+    /// </summary>
+    public class WeChatPayCombineTransactionsJsApiRequest : IWeChatPayV3PostRequest<WeChatPayCombineTransactionsJsApiResponse>
+    {
+        private WeChatPayObject queryModel;
+
+        public string GetRequestUrl()
+        {
+            return "https://api.mch.weixin.qq.com/v3/combine-transactions/jsapi";
+        }
+
+        public WeChatPayObject GetQueryModel()
+        {
+            return queryModel;
+        }
+
+        public void SetQueryModel(WeChatPayObject queryModel)
+        {
+            this.queryModel = queryModel;
+        }
+    }
+}

+ 29 - 0
src/Essensoft.AspNetCore.Payment.WeChatPay/Request/WeChatPayCombineTransactionsNativeRequest.cs

@@ -0,0 +1,29 @@
+using Essensoft.AspNetCore.Payment.WeChatPay.Response;
+
+namespace Essensoft.AspNetCore.Payment.WeChatPay.Request
+{
+    /// <summary>
+    /// 合单下单-Native支付API(电商平台、服务商、直连商户)
+    /// 最新更新时间:2020.05.14
+    /// https://pay.weixin.qq.com/wiki/doc/apiv3/wxpay/pay/combine/chapter3_10.shtml
+    /// </summary>
+    public class WeChatPayCombineTransactionsNativeRequest : IWeChatPayV3PostRequest<WeChatPayCombineTransactionsNativeResponse>
+    {
+        private WeChatPayObject queryModel;
+
+        public string GetRequestUrl()
+        {
+            return "https://api.mch.weixin.qq.com/v3/combine-transactions/native";
+        }
+
+        public WeChatPayObject GetQueryModel()
+        {
+            return queryModel;
+        }
+
+        public void SetQueryModel(WeChatPayObject queryModel)
+        {
+            this.queryModel = queryModel;
+        }
+    }
+}

+ 36 - 0
src/Essensoft.AspNetCore.Payment.WeChatPay/Request/WeChatPayCombineTransactionsOutTradeNoCloseRequest.cs

@@ -0,0 +1,36 @@
+using Essensoft.AspNetCore.Payment.WeChatPay.Response;
+
+namespace Essensoft.AspNetCore.Payment.WeChatPay.Request
+{
+    /// <summary>
+    /// 合单关闭订单API(电商平台、服务商、直连商户)
+    /// 最新更新时间:2020.03.31
+    /// https://pay.weixin.qq.com/wiki/doc/apiv3/wxpay/pay/combine/chapter3_4.shtml
+    /// </summary>
+    public class WeChatPayCombineTransactionsOutTradeNoCloseRequest : IWeChatPayV3PostRequest<WeChatPayCombineTransactionsOutTradeNoCloseResponse>
+    {
+        /// <summary>
+        /// 合单商户订单号
+        /// 合单支付总订单号,要求32个字符内,只能是数字、大小写字母_-|*@ ,且在同一个商户号下唯一 。
+        /// 示例值:P20150806125346
+        /// </summary>
+        public string CombineOutTradeNo { get; set; }
+
+        private WeChatPayObject queryModel;
+
+        public string GetRequestUrl()
+        {
+            return $"https://api.mch.weixin.qq.com/v3/combine-transactions/out-trade-no/{CombineOutTradeNo}/close";
+        }
+
+        public WeChatPayObject GetQueryModel()
+        {
+            return queryModel;
+        }
+
+        public void SetQueryModel(WeChatPayObject queryModel)
+        {
+            this.queryModel = queryModel;
+        }
+    }
+}

+ 24 - 0
src/Essensoft.AspNetCore.Payment.WeChatPay/Request/WeChatPayCombineTransactionsOutTradeNoRequest.cs

@@ -0,0 +1,24 @@
+using Essensoft.AspNetCore.Payment.WeChatPay.Response;
+
+namespace Essensoft.AspNetCore.Payment.WeChatPay.Request
+{
+    /// <summary>
+    /// 合单查询订单API(电商平台、服务商、直连商户)
+    /// 最新更新时间:2020.03.27
+    /// https://pay.weixin.qq.com/wiki/doc/apiv3/wxpay/pay/combine/chapter3_3.shtml
+    /// </summary>
+    public class WeChatPayCombineTransactionsOutTradeNoRequest : IWeChatPayV3GetRequest<WeChatPayCombineTransactionsOutTradeNoResponse>
+    {
+        /// <summary>
+        /// 合单商户订单号
+        /// 合单支付总订单号,要求32个字符内,只能是数字、大小写字母_-|*@ ,且在同一个商户号下唯一 。
+        /// 示例值:P20150806125346
+        /// </summary>
+        public string CombineOutTradeNo { get; set; }
+
+        public string GetRequestUrl()
+        {
+            return $"https://api.mch.weixin.qq.com/v3/combine-transactions/out-trade-no/{CombineOutTradeNo}";
+        }
+    }
+}

+ 56 - 0
src/Essensoft.AspNetCore.Payment.WeChatPay/Request/WeChatPayV3MiniProgramSdkRequest.cs

@@ -0,0 +1,56 @@
+using System.Collections.Generic;
+using Essensoft.AspNetCore.Payment.Security;
+using Essensoft.AspNetCore.Payment.WeChatPay.Utility;
+
+namespace Essensoft.AspNetCore.Payment.WeChatPay.Request
+{
+    /// <summary>
+    /// 小程序调起支付API
+    /// 最新更新时间:2020.03.23
+    /// https://pay.weixin.qq.com/wiki/doc/apiv3/wxpay/pay/combine/chapter3_8.shtml
+    /// </summary>
+    public class WeChatPayV3MiniProgramSdkRequest : IWeChatPayV3SdkRequest
+    {
+        /// <summary>
+        /// 订单详情扩展字符串
+        /// </summary>
+        public string Package { get; set; }
+
+        #region IWeChatPayV3SdkRequest Members
+
+        public IDictionary<string, string> GetParameters()
+        {
+            var parameters = new WeChatPayDictionary
+            {
+                { "package", Package }
+            };
+            return parameters;
+        }
+
+        public void PrimaryHandler(WeChatPayOptions options, WeChatPayDictionary sortedTxtParams)
+        {
+            if (!string.IsNullOrEmpty(options.SubAppId))
+            {
+                sortedTxtParams.Add(WeChatPayConsts.appId, options.SubAppId);
+            }
+            else
+            {
+                sortedTxtParams.Add(WeChatPayConsts.appId, options.AppId);
+            }
+
+            sortedTxtParams.Add(WeChatPayConsts.timeStamp, WeChatPayUtility.GetTimeStamp());
+            sortedTxtParams.Add(WeChatPayConsts.nonceStr, WeChatPayUtility.GenerateNonceStr());
+            sortedTxtParams.Add(WeChatPayConsts.signType, WeChatPayConsts.RSA);
+
+            var signatureSourceDate = BuildSignatureSourceDate(sortedTxtParams);
+            sortedTxtParams.Add(WeChatPayConsts.paySign, options.CertificateRSAPrivateKey.Sign(signatureSourceDate));
+        }
+
+        private static string BuildSignatureSourceDate(WeChatPayDictionary sortedTxtParams)
+        {
+            return $"{sortedTxtParams.GetValue(WeChatPayConsts.appId)}\n{sortedTxtParams.GetValue(WeChatPayConsts.timeStamp)}\n{sortedTxtParams.GetValue(WeChatPayConsts.nonceStr)}\n{sortedTxtParams.GetValue(WeChatPayConsts.package)}\n";
+        }
+
+        #endregion
+    }
+}

+ 20 - 0
src/Essensoft.AspNetCore.Payment.WeChatPay/Response/WeChatPayCombineTransactionsAppResponse.cs

@@ -0,0 +1,20 @@
+using System.Text.Json.Serialization;
+
+namespace Essensoft.AspNetCore.Payment.WeChatPay.Response
+{
+    /// <summary>
+    /// 合单下单-APP支付API-返回参数(电商平台、服务商、直连商户)
+    /// 最新更新时间:2020.05.21
+    /// https://pay.weixin.qq.com/wiki/doc/apiv3/wxpay/pay/combine/chapter3_1.shtml
+    /// </summary>
+    public class WeChatPayCombineTransactionsAppResponse : WeChatPayV3Response
+    {
+        /// <summary>
+        /// 预支付交易会话标识
+        /// 数字和字母。微信生成的预支付会话标识,用于后续接口调用使用。
+        /// 示例值:wx201410272009395522657a690389285100
+        /// </summary>
+        [JsonPropertyName("prepay_id")]
+        public string PrepayId { get; set; }
+    }
+}

+ 20 - 0
src/Essensoft.AspNetCore.Payment.WeChatPay/Response/WeChatPayCombineTransactionsH5Response.cs

@@ -0,0 +1,20 @@
+using System.Text.Json.Serialization;
+
+namespace Essensoft.AspNetCore.Payment.WeChatPay.Response
+{
+    /// <summary>
+    /// 合单下单-H5支付API-返回参数(电商平台、服务商、直连商户)
+    /// 最新更新时间:2020.06.09
+    /// https://pay.weixin.qq.com/wiki/doc/apiv3/wxpay/pay/combine/chapter3_9.shtml
+    /// </summary>
+    public class WeChatPayCombineTransactionsH5Response : WeChatPayV3Response
+    {
+        /// <summary>
+        /// 支付跳转链接
+        /// 支付跳转链接
+        /// 示例值:https://wx.tenpay.com/cgi-bin/mmpayweb-bin/checkmweb?prepay_id=wx2016121516420242444321ca0631331346&package=1405458241
+        /// </summary>
+        [JsonPropertyName("h5_url")]
+        public string H5Url { get; set; }
+    }
+}

+ 20 - 0
src/Essensoft.AspNetCore.Payment.WeChatPay/Response/WeChatPayCombineTransactionsJsApiResponse.cs

@@ -0,0 +1,20 @@
+using System.Text.Json.Serialization;
+
+namespace Essensoft.AspNetCore.Payment.WeChatPay.Response
+{
+    /// <summary>
+    /// 合单下单-JSAPI支付API-返回参数(电商平台、服务商、直连商户)
+    /// 最新更新时间:2020.05.21
+    /// https://pay.weixin.qq.com/wiki/doc/apiv3/wxpay/pay/combine/chapter3_2.shtml
+    /// </summary>
+    public class WeChatPayCombineTransactionsJsApiResponse : WeChatPayV3Response
+    {
+        /// <summary>
+        /// 预支付交易会话标识
+        /// 数字和字母。微信生成的预支付会话标识,用于后续接口调用使用。
+        /// 示例值:wx201410272009395522657a690389285100
+        /// </summary>
+        [JsonPropertyName("prepay_id")]
+        public string PrepayId { get; set; }
+    }
+}

+ 20 - 0
src/Essensoft.AspNetCore.Payment.WeChatPay/Response/WeChatPayCombineTransactionsNativeResponse.cs

@@ -0,0 +1,20 @@
+using System.Text.Json.Serialization;
+
+namespace Essensoft.AspNetCore.Payment.WeChatPay.Response
+{
+    /// <summary>
+    /// 合单下单-Native支付API-返回参数(电商平台、服务商、直连商户)
+    /// 最新更新时间:2020.05.14
+    /// https://pay.weixin.qq.com/wiki/doc/apiv3/wxpay/pay/combine/chapter3_10.shtml
+    /// </summary>
+    public class WeChatPayCombineTransactionsNativeResponse : WeChatPayV3Response
+    {
+        /// <summary>
+        /// 二维码链接
+        /// 二维码链接
+        /// 示例值:weixin://pay.weixin.qq.com/bizpayurl/up?pr=NwY5Mz9&groupid=00
+        /// </summary>
+        [JsonPropertyName("code_url")]
+        public string CodeUrl { get; set; }
+    }
+}

+ 11 - 0
src/Essensoft.AspNetCore.Payment.WeChatPay/Response/WeChatPayCombineTransactionsOutTradeNoCloseResponse.cs

@@ -0,0 +1,11 @@
+namespace Essensoft.AspNetCore.Payment.WeChatPay.Response
+{
+    /// <summary>
+    /// 合单关闭订单API-返回参数(电商平台、服务商、直连商户)
+    /// 最新更新时间:2020.03.31
+    /// https://pay.weixin.qq.com/wiki/doc/apiv3/wxpay/pay/combine/chapter3_4.shtml
+    /// </summary>
+    public class WeChatPayCombineTransactionsOutTradeNoCloseResponse : WeChatPayV3Response
+    {
+    }
+}

+ 58 - 0
src/Essensoft.AspNetCore.Payment.WeChatPay/Response/WeChatPayCombineTransactionsOutTradeNoResponse.cs

@@ -0,0 +1,58 @@
+using System.Collections.Generic;
+using System.Text.Json.Serialization;
+using Essensoft.AspNetCore.Payment.WeChatPay.Domain;
+
+namespace Essensoft.AspNetCore.Payment.WeChatPay.Response
+{
+    /// <summary>
+    /// 合单查询订单API-返回参数(电商平台、服务商、直连商户)
+    /// 最新更新时间:2020.03.27
+    /// https://pay.weixin.qq.com/wiki/doc/apiv3/wxpay/pay/combine/chapter3_3.shtml
+    /// </summary>
+    public class WeChatPayCombineTransactionsOutTradeNoResponse : WeChatPayV3Response
+    {
+        /// 合单商户appid
+        /// 合单发起方的appid。
+        /// 示例值:wxd678efh567hg6787
+        /// </summary>
+        [JsonPropertyName("combine_appid")]
+        public string CombineAppId { get; set; }
+
+        /// <summary>
+        /// 合单商户号
+        /// 合单发起方商户号。
+        /// 示例值:1900000109
+        /// </summary>
+        [JsonPropertyName("combine_mchid")]
+        public string CombineMchId { get; set; }
+
+        /// <summary>
+        /// 合单商户订单号
+        /// 合单支付总订单号,要求32个字符内,只能是数字、大小写字母_-|*@ ,且在同一个商户号下唯一 。
+        /// 示例值:P20150806125346
+        /// </summary>
+        [JsonPropertyName("combine_out_trade_no")]
+        public string CombineOutTradeNo { get; set; }
+
+        /// <summary>
+        /// 场景信息
+        /// 支付场景描述
+        /// </summary>
+        [JsonPropertyName("scene_info")]
+        public CombineSceneInfoResponse SceneInfo { get; set; }
+
+        /// <summary>
+        /// 子单信息
+        /// 最多支持子单条数:50
+        /// </summary>
+        [JsonPropertyName("sub_orders")]
+        public List<CombineSubOrderInfoResponse> SubOrders { get; set; }
+
+        /// <summary>
+        /// 支付者
+        /// 支付者信息
+        /// </summary>
+        [JsonPropertyName("combine_payer_info")]
+        public PayerInfo CombinePayerInfo { get; set; }
+    }
+}

+ 1 - 1
src/Essensoft.AspNetCore.Payment.WeChatPay/Response/WeChatPayPartnerTransactionsIdResponse.cs

@@ -133,7 +133,7 @@ namespace Essensoft.AspNetCore.Payment.WeChatPay.Response
         /// 订单金额信息
         /// </summary>
         [JsonPropertyName("amount")]
-        public QueryAmount Amount { get; set; }
+        public AmountResponse Amount { get; set; }
 
         /// <summary>
         /// 场景信息

+ 1 - 1
src/Essensoft.AspNetCore.Payment.WeChatPay/Response/WeChatPayPartnerTransactionsOutTradeNoResponse.cs

@@ -133,7 +133,7 @@ namespace Essensoft.AspNetCore.Payment.WeChatPay.Response
         /// 订单金额信息
         /// </summary>
         [JsonPropertyName("amount")]
-        public QueryAmount Amount { get; set; }
+        public AmountResponse Amount { get; set; }
 
         /// <summary>
         /// 场景信息

+ 1 - 1
src/Essensoft.AspNetCore.Payment.WeChatPay/Response/WeChatPayTransactionsIdResponse.cs

@@ -117,7 +117,7 @@ namespace Essensoft.AspNetCore.Payment.WeChatPay.Response
         /// 订单金额信息
         /// </summary>
         [JsonPropertyName("amount")]
-        public QueryAmount Amount { get; set; }
+        public AmountResponse Amount { get; set; }
 
         /// <summary>
         /// 场景信息

+ 1 - 1
src/Essensoft.AspNetCore.Payment.WeChatPay/Response/WeChatPayTransactionsOutTradeNoResponse.cs

@@ -117,7 +117,7 @@ namespace Essensoft.AspNetCore.Payment.WeChatPay.Response
         /// 订单金额信息
         /// </summary>
         [JsonPropertyName("amount")]
-        public QueryAmount Amount { get; set; }
+        public AmountResponse Amount { get; set; }
 
         /// <summary>
         /// 场景信息