소스 검색

QQ钱包 SubAppId、SubMchId 调整到 QPayOptions

Roc 6 년 전
부모
커밋
2165f719d1
21개의 변경된 파일62개의 추가작업 그리고 102개의 파일을 삭제
  1. 1 1
      src/Essensoft.AspNetCore.Payment.QPay/Notify/QPayEPayB2CNotify.cs
  2. 1 1
      src/Essensoft.AspNetCore.Payment.QPay/Notify/QPayHbMchSendNotify.cs
  3. 1 1
      src/Essensoft.AspNetCore.Payment.QPay/Notify/QPayMicroPayNotify.cs
  4. 1 1
      src/Essensoft.AspNetCore.Payment.QPay/Notify/QPayUnifiedOrderNotify.cs
  5. 3 4
      src/Essensoft.AspNetCore.Payment.QPay/QPayClient.cs
  6. 2 0
      src/Essensoft.AspNetCore.Payment.QPay/QPayConsts.cs
  7. 25 6
      src/Essensoft.AspNetCore.Payment.QPay/QPayOptions.cs
  8. 3 13
      src/Essensoft.AspNetCore.Payment.QPay/Request/QPayCloseOrderRequest.cs
  9. 1 1
      src/Essensoft.AspNetCore.Payment.QPay/Request/QPayEPayB2CRequest.cs
  10. 1 1
      src/Essensoft.AspNetCore.Payment.QPay/Request/QPayEPayQueryRequest.cs
  11. 1 1
      src/Essensoft.AspNetCore.Payment.QPay/Request/QPayEPayStatementDownRequest.cs
  12. 1 1
      src/Essensoft.AspNetCore.Payment.QPay/Request/QPayHbMchDownListFileRequest.cs
  13. 1 1
      src/Essensoft.AspNetCore.Payment.QPay/Request/QPayHbMchListQueryRequest.cs
  14. 1 1
      src/Essensoft.AspNetCore.Payment.QPay/Request/QPayHbMchSendRequest.cs
  15. 3 13
      src/Essensoft.AspNetCore.Payment.QPay/Request/QPayMicroPayRequest.cs
  16. 3 13
      src/Essensoft.AspNetCore.Payment.QPay/Request/QPayOrderQueryRequest.cs
  17. 3 3
      src/Essensoft.AspNetCore.Payment.QPay/Request/QPayRefundQueryRequest.cs
  18. 3 13
      src/Essensoft.AspNetCore.Payment.QPay/Request/QPayRefundRequest.cs
  19. 3 13
      src/Essensoft.AspNetCore.Payment.QPay/Request/QPayReverseRequest.cs
  20. 1 1
      src/Essensoft.AspNetCore.Payment.QPay/Request/QPaySpDownloadStatementDownRequest.cs
  21. 3 13
      src/Essensoft.AspNetCore.Payment.QPay/Request/QPayUnifiedOrderRequest.cs

+ 1 - 1
src/Essensoft.AspNetCore.Payment.QPay/Notify/QPayEPayB2CNotify.cs

@@ -3,7 +3,7 @@
 namespace Essensoft.AspNetCore.Payment.QPay.Notify
 {
     /// <summary>
-    /// 企业付款 - 用户到账通知
+    /// 企业付款 - 用户到账通知 (普通商户)
     /// </summary>
     [XmlRoot("xml")]
     public class QPayEPayB2CNotify : QPayNotify

+ 1 - 1
src/Essensoft.AspNetCore.Payment.QPay/Notify/QPayHbMchSendNotify.cs

@@ -3,7 +3,7 @@
 namespace Essensoft.AspNetCore.Payment.QPay.Notify
 {
     /// <summary>
-    /// 现金红包 - 领取结果通知
+    /// 现金红包 - 领取结果通知 (普通商户)
     /// </summary>
     [XmlRoot("xml")]
     public class QPayHbMchSendNotify : QPayNotify

+ 1 - 1
src/Essensoft.AspNetCore.Payment.QPay/Notify/QPayMicroPayNotify.cs

@@ -3,7 +3,7 @@
 namespace Essensoft.AspNetCore.Payment.QPay.Notify
 {
     /// <summary>
-    /// 提交付款码支付 - 支付结果通知
+    /// 提交付款码支付 - 支付结果通知 (普通商户 / 服务商)
     /// </summary>
     [XmlRoot("xml")]
     public class QPayMicroPayNotify : QPayNotify

+ 1 - 1
src/Essensoft.AspNetCore.Payment.QPay/Notify/QPayUnifiedOrderNotify.cs

@@ -3,7 +3,7 @@
 namespace Essensoft.AspNetCore.Payment.QPay.Notify
 {
     /// <summary>
-    /// 统一下单 - 支付结果通知
+    /// 统一下单 - 支付结果通知 (普通商户 / 服务商)
     /// </summary>
     [XmlRoot("xml")]
     public class QPayUnifiedOrderNotify : QPayNotify

+ 3 - 4
src/Essensoft.AspNetCore.Payment.QPay/QPayClient.cs

@@ -91,17 +91,16 @@ namespace Essensoft.AspNetCore.Payment.QPay
 
             request.PrimaryHandler(options, sortedTxtParams);
 
-            var hash = options.GetCertificateHash();
-            if (!_certificateManager.Contains(hash))
+            if (!_certificateManager.Contains(options.CertificateHash))
             {
                 var certificate = File.Exists(options.Certificate) ?
                     new X509Certificate2(options.Certificate, options.CertificatePassword, X509KeyStorageFlags.PersistKeySet | X509KeyStorageFlags.MachineKeySet) :
                     new X509Certificate2(Convert.FromBase64String(options.Certificate), options.CertificatePassword, X509KeyStorageFlags.PersistKeySet | X509KeyStorageFlags.MachineKeySet);
 
-                _certificateManager.TryAdd(hash, certificate);
+                _certificateManager.TryAdd(options.CertificateHash, certificate);
             }
 
-            var client = _httpClientFactory.CreateClient(Prefix + hash);
+            var client = _httpClientFactory.CreateClient(Prefix + options.CertificateHash);
             var body = await client.PostAsync(request.GetRequestUrl(), sortedTxtParams);
             var parser = new QPayXmlParser<T>();
             var rsp = parser.Parse(body);

+ 2 - 0
src/Essensoft.AspNetCore.Payment.QPay/QPayConsts.cs

@@ -3,7 +3,9 @@
     internal class QPayConsts
     {
         public const string APPID = "appid";
+        public const string SUB_APPID = "sub_appid";
         public const string MCH_ID = "mch_id";
+        public const string SUB_MCH_ID = "sub_mch_id";
         public const string NONCE_STR = "nonce_str";
         public const string SIGN = "sign";
 

+ 25 - 6
src/Essensoft.AspNetCore.Payment.QPay/QPayOptions.cs

@@ -4,6 +4,9 @@ namespace Essensoft.AspNetCore.Payment.QPay
 {
     public class QPayOptions
     {
+        internal string CertificateHash;
+
+        private string certificate;
         private string certificatePassword;
 
         /// <summary>
@@ -11,11 +14,21 @@ namespace Essensoft.AspNetCore.Payment.QPay
         /// </summary>
         public string AppId { get; set; }
 
+        /// <summary>
+        /// QQ钱包 子商户应用号(仅服务商时使用)
+        /// </summary>
+        public string SubAppId { get; set; }
+
         /// <summary>
         /// QQ钱包 商户号
         /// </summary>
         public string MchId { get; set; }
 
+        /// <summary>
+        /// QQ钱包 子商户号(仅服务商时使用)
+        /// </summary>
+        public string SubMchId { get; set; }
+
         /// <summary>
         /// QQ钱包 API秘钥
         /// </summary>
@@ -24,7 +37,18 @@ namespace Essensoft.AspNetCore.Payment.QPay
         /// <summary>
         /// QQ钱包 API证书(文件名/文件的Base64编码)
         /// </summary>
-        public string Certificate { get; set; }
+        public string Certificate
+        {
+            get => certificate;
+            set
+            {
+                if (!string.IsNullOrEmpty(value))
+                {
+                    certificate = value;
+                    CertificateHash = MD5.Compute(certificate);
+                }
+            }
+        }
 
         /// <summary>
         /// QQ钱包 API证书密码(默认为商户号)
@@ -34,10 +58,5 @@ namespace Essensoft.AspNetCore.Payment.QPay
             get => string.IsNullOrEmpty(certificatePassword) ? MchId : certificatePassword;
             set => certificatePassword = value;
         }
-
-        public string GetCertificateHash()
-        {
-            return MD5.Compute(Certificate);
-        }
     }
 }

+ 3 - 13
src/Essensoft.AspNetCore.Payment.QPay/Request/QPayCloseOrderRequest.cs

@@ -5,20 +5,10 @@ using Essensoft.AspNetCore.Payment.QPay.Utility;
 namespace Essensoft.AspNetCore.Payment.QPay.Request
 {
     /// <summary>
-    /// 关闭订单
+    /// 关闭订单 (普通商户 / 服务商)
     /// </summary>
     public class QPayCloseOrderRequest : IQPayRequest<QPayCloseOrderResponse>
     {
-        /// <summary>
-        /// 子商户应用ID
-        /// </summary>
-        public string SubAppId { get; set; }
-
-        /// <summary>
-        /// 子商户号
-        /// </summary>
-        public string SubMchId { get; set; }
-
         /// <summary>
         /// 商户订单号
         /// </summary>
@@ -40,8 +30,6 @@ namespace Essensoft.AspNetCore.Payment.QPay.Request
         {
             var parameters = new QPayDictionary
             {
-                { "sub_appid", SubAppId },
-                { "sub_mch_id", SubMchId },
                 { "out_trade_no", OutTradeNo },
                 { "total_fee", TotalFee }
             };
@@ -52,7 +40,9 @@ namespace Essensoft.AspNetCore.Payment.QPay.Request
         {
             sortedTxtParams.Add(QPayConsts.NONCE_STR, QPayUtility.GenerateNonceStr());
             sortedTxtParams.Add(QPayConsts.APPID, options.AppId);
+            sortedTxtParams.Add(QPayConsts.SUB_APPID, options.SubAppId);
             sortedTxtParams.Add(QPayConsts.MCH_ID, options.MchId);
+            sortedTxtParams.Add(QPayConsts.SUB_MCH_ID, options.SubMchId);
 
             sortedTxtParams.Add(QPayConsts.SIGN, QPaySignature.SignWithKey(sortedTxtParams, options.Key));
         }

+ 1 - 1
src/Essensoft.AspNetCore.Payment.QPay/Request/QPayEPayB2CRequest.cs

@@ -5,7 +5,7 @@ using Essensoft.AspNetCore.Payment.QPay.Utility;
 namespace Essensoft.AspNetCore.Payment.QPay.Request
 {
     /// <summary>
-    /// 企业付款 - 企业付款到余额
+    /// 企业付款 - 企业付款到余额 (普通商户)
     /// </summary>
     public class QPayEPayB2CRequest : IQPayCertRequest<QPayEPayB2CResponse>
     {

+ 1 - 1
src/Essensoft.AspNetCore.Payment.QPay/Request/QPayEPayQueryRequest.cs

@@ -5,7 +5,7 @@ using Essensoft.AspNetCore.Payment.QPay.Utility;
 namespace Essensoft.AspNetCore.Payment.QPay.Request
 {
     /// <summary>
-    /// 企业付款 - 查询企业付款
+    /// 企业付款 - 查询企业付款 (普通商户)
     /// </summary>
     public class QPayEPayQueryRequest : IQPayRequest<QPayEPayQueryResponse>
     {

+ 1 - 1
src/Essensoft.AspNetCore.Payment.QPay/Request/QPayEPayStatementDownRequest.cs

@@ -5,7 +5,7 @@ using Essensoft.AspNetCore.Payment.QPay.Utility;
 namespace Essensoft.AspNetCore.Payment.QPay.Request
 {
     /// <summary>
-    /// 企业付款 - 对账单下载
+    /// 企业付款 - 对账单下载 (普通商户)
     /// </summary>
     public class QPayEPayStatementDownRequest : IQPayRequest<QPayEPayStatementDownResponse>
     {

+ 1 - 1
src/Essensoft.AspNetCore.Payment.QPay/Request/QPayHbMchDownListFileRequest.cs

@@ -5,7 +5,7 @@ using Essensoft.AspNetCore.Payment.QPay.Utility;
 namespace Essensoft.AspNetCore.Payment.QPay.Request
 {
     /// <summary>
-    /// 现金红包 - 对账单下载
+    /// 现金红包 - 对账单下载 (普通商户)
     /// </summary>
     public class QPayHbMchDownListFileRequest : IQPayRequest<QPayHbMchDownListFileResponse>
     {

+ 1 - 1
src/Essensoft.AspNetCore.Payment.QPay/Request/QPayHbMchListQueryRequest.cs

@@ -5,7 +5,7 @@ using Essensoft.AspNetCore.Payment.QPay.Utility;
 namespace Essensoft.AspNetCore.Payment.QPay.Request
 {
     /// <summary>
-    /// 现金红包 - 红包详情查询
+    /// 现金红包 - 红包详情查询 (普通商户)
     /// </summary>
     public class QPayHbMchListQueryRequest : IQPayRequest<QPayHbMchListQueryResponse>
     {

+ 1 - 1
src/Essensoft.AspNetCore.Payment.QPay/Request/QPayHbMchSendRequest.cs

@@ -5,7 +5,7 @@ using Essensoft.AspNetCore.Payment.QPay.Utility;
 namespace Essensoft.AspNetCore.Payment.QPay.Request
 {
     /// <summary>
-    /// 现金红包 - 创建现金红包
+    /// 现金红包 - 创建现金红包 (普通商户)
     /// </summary>
     public class QPayHbMchSendRequest : IQPayCertRequest<QPayHbMchSendResponse>
     {

+ 3 - 13
src/Essensoft.AspNetCore.Payment.QPay/Request/QPayMicroPayRequest.cs

@@ -5,20 +5,10 @@ using Essensoft.AspNetCore.Payment.QPay.Utility;
 namespace Essensoft.AspNetCore.Payment.QPay.Request
 {
     /// <summary>
-    /// 提交付款码支付
+    /// 提交付款码支付 (普通商户 / 服务商)
     /// </summary>
     public class QPayMicroPayRequest : IQPayRequest<QPayMicroPayResponse>
     {
-        /// <summary>
-        /// 子商户应用ID
-        /// </summary>
-        public string SubAppId { get; set; }
-
-        /// <summary>
-        /// 子商户号
-        /// </summary>
-        public string SubMchId { get; set; }
-
         /// <summary>
         /// 商品描述
         /// </summary>
@@ -90,8 +80,6 @@ namespace Essensoft.AspNetCore.Payment.QPay.Request
         {
             var parameters = new QPayDictionary
             {
-                { "sub_appid", SubAppId },
-                { "sub_mch_id", SubMchId },
                 { "body", Body },
                 { "attach", Attach },
                 { "out_trade_no", OutTradeNo },
@@ -112,7 +100,9 @@ namespace Essensoft.AspNetCore.Payment.QPay.Request
         {
             sortedTxtParams.Add(QPayConsts.NONCE_STR, QPayUtility.GenerateNonceStr());
             sortedTxtParams.Add(QPayConsts.APPID, options.AppId);
+            sortedTxtParams.Add(QPayConsts.SUB_APPID, options.SubAppId);
             sortedTxtParams.Add(QPayConsts.MCH_ID, options.MchId);
+            sortedTxtParams.Add(QPayConsts.SUB_MCH_ID, options.SubMchId);
 
             sortedTxtParams.Add(QPayConsts.SIGN, QPaySignature.SignWithKey(sortedTxtParams, options.Key));
         }

+ 3 - 13
src/Essensoft.AspNetCore.Payment.QPay/Request/QPayOrderQueryRequest.cs

@@ -5,20 +5,10 @@ using Essensoft.AspNetCore.Payment.QPay.Utility;
 namespace Essensoft.AspNetCore.Payment.QPay.Request
 {
     /// <summary>
-    /// 订单查询
+    /// 订单查询 (普通商户 / 服务商)
     /// </summary>
     public class QPayOrderQueryRequest : IQPayRequest<QPayOrderQueryResponse>
     {
-        /// <summary>
-        /// 子商户应用ID
-        /// </summary>
-        public string SubAppId { get; set; }
-
-        /// <summary>
-        /// 子商户号
-        /// </summary>
-        public string SubMchId { get; set; }
-
         /// <summary>
         /// QQ钱包订单号
         /// </summary>
@@ -40,8 +30,6 @@ namespace Essensoft.AspNetCore.Payment.QPay.Request
         {
             var parameters = new QPayDictionary
             {
-                { "sub_appid", SubAppId },
-                { "sub_mch_id", SubMchId },
                 { "transaction_id", TransactionId },
                 { "out_trade_no", OutTradeNo }
             };
@@ -52,7 +40,9 @@ namespace Essensoft.AspNetCore.Payment.QPay.Request
         {
             sortedTxtParams.Add(QPayConsts.NONCE_STR, QPayUtility.GenerateNonceStr());
             sortedTxtParams.Add(QPayConsts.APPID, options.AppId);
+            sortedTxtParams.Add(QPayConsts.SUB_APPID, options.SubAppId);
             sortedTxtParams.Add(QPayConsts.MCH_ID, options.MchId);
+            sortedTxtParams.Add(QPayConsts.SUB_MCH_ID, options.SubMchId);
 
             sortedTxtParams.Add(QPayConsts.SIGN, QPaySignature.SignWithKey(sortedTxtParams, options.Key));
         }

+ 3 - 3
src/Essensoft.AspNetCore.Payment.QPay/Request/QPayRefundQueryRequest.cs

@@ -5,7 +5,7 @@ using Essensoft.AspNetCore.Payment.QPay.Utility;
 namespace Essensoft.AspNetCore.Payment.QPay.Request
 {
     /// <summary>
-    /// 退款查询
+    /// 退款查询 (普通商户 / 服务商)
     /// </summary>
     public class QPayRefundQueryRequest : IQPayRequest<QPayRefundQueryResponse>
     {
@@ -50,8 +50,6 @@ namespace Essensoft.AspNetCore.Payment.QPay.Request
         {
             var parameters = new QPayDictionary
             {
-                { "sub_appid", SubAppId },
-                { "sub_mch_id", SubMchId },
                 { "refund_id", RefundId },
                 { "out_refund_no", OutRefundNo },
                 { "transaction_id", TransactionId },
@@ -64,7 +62,9 @@ namespace Essensoft.AspNetCore.Payment.QPay.Request
         {
             sortedTxtParams.Add(QPayConsts.NONCE_STR, QPayUtility.GenerateNonceStr());
             sortedTxtParams.Add(QPayConsts.APPID, options.AppId);
+            sortedTxtParams.Add(QPayConsts.SUB_APPID, options.SubAppId);
             sortedTxtParams.Add(QPayConsts.MCH_ID, options.MchId);
+            sortedTxtParams.Add(QPayConsts.SUB_MCH_ID, options.SubMchId);
 
             sortedTxtParams.Add(QPayConsts.SIGN, QPaySignature.SignWithKey(sortedTxtParams, options.Key));
         }

+ 3 - 13
src/Essensoft.AspNetCore.Payment.QPay/Request/QPayRefundRequest.cs

@@ -5,20 +5,10 @@ using Essensoft.AspNetCore.Payment.QPay.Utility;
 namespace Essensoft.AspNetCore.Payment.QPay.Request
 {
     /// <summary>
-    /// 申请退款
+    /// 申请退款 (普通商户 / 服务商)
     /// </summary>
     public class QPayRefundRequest : IQPayCertRequest<QPayRefundResponse>
     {
-        /// <summary>
-        /// 子商户应用ID
-        /// </summary>
-        public string SubAppId { get; set; }
-
-        /// <summary>
-        /// 子商户号
-        /// </summary>
-        public string SubMchId { get; set; }
-
         /// <summary>
         /// QQ钱包订单号
         /// </summary>
@@ -65,8 +55,6 @@ namespace Essensoft.AspNetCore.Payment.QPay.Request
         {
             var parameters = new QPayDictionary
             {
-                { "sub_appid", SubAppId },
-                { "sub_mch_id", SubMchId },
                 { "transaction_id", TransactionId },
                 { "out_trade_no", OutTradeNo },
                 { "out_refund_no", OutRefundNo },
@@ -82,7 +70,9 @@ namespace Essensoft.AspNetCore.Payment.QPay.Request
         {
             sortedTxtParams.Add(QPayConsts.NONCE_STR, QPayUtility.GenerateNonceStr());
             sortedTxtParams.Add(QPayConsts.APPID, options.AppId);
+            sortedTxtParams.Add(QPayConsts.SUB_APPID, options.SubAppId);
             sortedTxtParams.Add(QPayConsts.MCH_ID, options.MchId);
+            sortedTxtParams.Add(QPayConsts.SUB_MCH_ID, options.SubMchId);
 
             sortedTxtParams.Add(QPayConsts.SIGN, QPaySignature.SignWithKey(sortedTxtParams, options.Key));
         }

+ 3 - 13
src/Essensoft.AspNetCore.Payment.QPay/Request/QPayReverseRequest.cs

@@ -5,20 +5,10 @@ using Essensoft.AspNetCore.Payment.QPay.Utility;
 namespace Essensoft.AspNetCore.Payment.QPay.Request
 {
     /// <summary>
-    /// 撤销订单
+    /// 撤销订单 (普通商户 / 服务商)
     /// </summary>
     public class QPayReverseRequest : IQPayCertRequest<QPayReverseResponse>
     {
-        /// <summary>
-        /// 子商户应用ID
-        /// </summary>
-        public string SubAppId { get; set; }
-
-        /// <summary>
-        /// 子商户号
-        /// </summary>
-        public string SubMchId { get; set; }
-
         /// <summary>
         /// 商户订单号
         /// </summary>
@@ -45,8 +35,6 @@ namespace Essensoft.AspNetCore.Payment.QPay.Request
         {
             var parameters = new QPayDictionary
             {
-                { "sub_appid", SubAppId },
-                { "sub_mch_id", SubMchId },
                 { "out_trade_no", OutTradeNo },
                 { "op_user_id", OpUserId },
                 { "op_user_passwd", OpUserPasswd }
@@ -58,7 +46,9 @@ namespace Essensoft.AspNetCore.Payment.QPay.Request
         {
             sortedTxtParams.Add(QPayConsts.NONCE_STR, QPayUtility.GenerateNonceStr());
             sortedTxtParams.Add(QPayConsts.APPID, options.AppId);
+            sortedTxtParams.Add(QPayConsts.SUB_APPID, options.SubAppId);
             sortedTxtParams.Add(QPayConsts.MCH_ID, options.MchId);
+            sortedTxtParams.Add(QPayConsts.SUB_MCH_ID, options.SubMchId);
 
             sortedTxtParams.Add(QPayConsts.SIGN, QPaySignature.SignWithKey(sortedTxtParams, options.Key));
         }

+ 1 - 1
src/Essensoft.AspNetCore.Payment.QPay/Request/QPaySpDownloadStatementDownRequest.cs

@@ -5,7 +5,7 @@ using Essensoft.AspNetCore.Payment.QPay.Utility;
 namespace Essensoft.AspNetCore.Payment.QPay.Request
 {
     /// <summary>
-    /// 对账单下载
+    /// 对账单下载 (普通商户)
     /// </summary>
     public class QPaySpDownloadStatementDownRequest : IQPayRequest<QPaySpDownloadStatementDownResponse>
     {

+ 3 - 13
src/Essensoft.AspNetCore.Payment.QPay/Request/QPayUnifiedOrderRequest.cs

@@ -5,20 +5,10 @@ using Essensoft.AspNetCore.Payment.QPay.Utility;
 namespace Essensoft.AspNetCore.Payment.QPay.Request
 {
     /// <summary>
-    /// 统一下单
+    /// 统一下单 (普通商户 / 服务商)
     /// </summary>
     public class QPayUnifiedOrderRequest : IQPayRequest<QPayUnifiedOrderResponse>
     {
-        /// <summary>
-        /// 子商户应用ID
-        /// </summary>
-        public string SubAppId { get; set; }
-
-        /// <summary>
-        /// 子商户号
-        /// </summary>
-        public string SubMchId { get; set; }
-
         /// <summary>
         /// 商品描述
         /// </summary>
@@ -105,8 +95,6 @@ namespace Essensoft.AspNetCore.Payment.QPay.Request
         {
             var parameters = new QPayDictionary
             {
-                { "sub_appid", SubAppId },
-                { "sub_mch_id", SubMchId },
                 { "body", Body },
                 { "attach", Attach },
                 { "out_trade_no", OutTradeNo },
@@ -130,7 +118,9 @@ namespace Essensoft.AspNetCore.Payment.QPay.Request
         {
             sortedTxtParams.Add(QPayConsts.NONCE_STR, QPayUtility.GenerateNonceStr());
             sortedTxtParams.Add(QPayConsts.APPID, options.AppId);
+            sortedTxtParams.Add(QPayConsts.SUB_APPID, options.SubAppId);
             sortedTxtParams.Add(QPayConsts.MCH_ID, options.MchId);
+            sortedTxtParams.Add(QPayConsts.SUB_MCH_ID, options.SubMchId);
 
             sortedTxtParams.Add(QPayConsts.SIGN, QPaySignature.SignWithKey(sortedTxtParams, options.Key));
         }