Quellcode durchsuchen

WeChatPay 实现(#26)

Roc vor 6 Jahren
Ursprung
Commit
4cf67f7476
100 geänderte Dateien mit 3629 neuen und 800 gelöschten Zeilen
  1. 5 3
      samples/WebApplicationSample/Controllers/NotifyController.cs
  2. 57 54
      samples/WebApplicationSample/Controllers/WeChatPayController.cs
  3. 7 7
      samples/WebApplicationSample/Models/WeChatPayViewModel.cs
  4. 2 2
      samples/WebApplicationSample/Views/WeChatPay/AppPay.cshtml
  5. 2 2
      samples/WebApplicationSample/Views/WeChatPay/H5Pay.cshtml
  6. 2 2
      samples/WebApplicationSample/Views/WeChatPay/LiteAppPay.cshtml
  7. 2 2
      samples/WebApplicationSample/Views/WeChatPay/MicroPay.cshtml
  8. 2 2
      samples/WebApplicationSample/Views/WeChatPay/PubPay.cshtml
  9. 2 2
      samples/WebApplicationSample/Views/WeChatPay/QrCodePay.cshtml
  10. 2 2
      samples/WebApplicationSample/Views/WeChatPay/Transfers.cshtml
  11. 5 2
      src/Essensoft.AspNetCore.Payment.WeChatPay/Domain/CouponInfo.cs
  12. 3 0
      src/Essensoft.AspNetCore.Payment.WeChatPay/Domain/CouponRefundInfo.cs
  13. 5 2
      src/Essensoft.AspNetCore.Payment.WeChatPay/Domain/HBInfo.cs
  14. 3 0
      src/Essensoft.AspNetCore.Payment.WeChatPay/Domain/RefundInfo.cs
  15. 41 0
      src/Essensoft.AspNetCore.Payment.WeChatPay/IWeChatPayCertRequest.cs
  16. 0 31
      src/Essensoft.AspNetCore.Payment.WeChatPay/IWeChatPayCertificateRequest.cs
  17. 14 32
      src/Essensoft.AspNetCore.Payment.WeChatPay/IWeChatPayClient.cs
  18. 3 14
      src/Essensoft.AspNetCore.Payment.WeChatPay/IWeChatPayNotifyClient.cs
  19. 19 9
      src/Essensoft.AspNetCore.Payment.WeChatPay/IWeChatPayRequest.cs
  20. 8 4
      src/Essensoft.AspNetCore.Payment.WeChatPay/IWeChatPaySdkRequest.cs
  21. 3 7
      src/Essensoft.AspNetCore.Payment.WeChatPay/Notify/WeChatPayRefundNotify.cs
  22. 215 0
      src/Essensoft.AspNetCore.Payment.WeChatPay/Notify/WeChatPayTransitPartnerpayPayApplyNotify.cs
  23. 17 21
      src/Essensoft.AspNetCore.Payment.WeChatPay/Notify/WeChatPayUnifiedOrderNotify.cs
  24. 71 0
      src/Essensoft.AspNetCore.Payment.WeChatPay/Notify/WeChatPayVehiclePartnerPayNotificationNotify.cs
  25. 209 0
      src/Essensoft.AspNetCore.Payment.WeChatPay/Notify/WeChatPayVehiclePartnerpayPayApplyNotify.cs
  26. 0 3
      src/Essensoft.AspNetCore.Payment.WeChatPay/Parser/IWeChatPayParser.cs
  27. 99 32
      src/Essensoft.AspNetCore.Payment.WeChatPay/Parser/WeChatPayListPropertyParser.cs
  28. 21 34
      src/Essensoft.AspNetCore.Payment.WeChatPay/Parser/WeChatPayXmlParser.cs
  29. 0 46
      src/Essensoft.AspNetCore.Payment.WeChatPay/Request/WeChatPayAppCallPaymentRequest.cs
  30. 45 0
      src/Essensoft.AspNetCore.Payment.WeChatPay/Request/WeChatPayAppSdkRequest.cs
  31. 19 10
      src/Essensoft.AspNetCore.Payment.WeChatPay/Request/WeChatPayBillCommentSpBatchQueryCommentRequest.cs
  32. 19 9
      src/Essensoft.AspNetCore.Payment.WeChatPay/Request/WeChatPayCloseOrderRequest.cs
  33. 27 13
      src/Essensoft.AspNetCore.Payment.WeChatPay/Request/WeChatPayDepositConsumeRequest.cs
  34. 153 0
      src/Essensoft.AspNetCore.Payment.WeChatPay/Request/WeChatPayDepositFacePayRequest.cs
  35. 24 12
      src/Essensoft.AspNetCore.Payment.WeChatPay/Request/WeChatPayDepositMicroPayRequest.cs
  36. 21 9
      src/Essensoft.AspNetCore.Payment.WeChatPay/Request/WeChatPayDepositOrderQueryRequest.cs
  37. 21 9
      src/Essensoft.AspNetCore.Payment.WeChatPay/Request/WeChatPayDepositRefundQueryRequest.cs
  38. 24 10
      src/Essensoft.AspNetCore.Payment.WeChatPay/Request/WeChatPayDepositRefundRequest.cs
  39. 23 9
      src/Essensoft.AspNetCore.Payment.WeChatPay/Request/WeChatPayDepositReverseRequest.cs
  40. 18 8
      src/Essensoft.AspNetCore.Payment.WeChatPay/Request/WeChatPayDownloadBillRequest.cs
  41. 22 8
      src/Essensoft.AspNetCore.Payment.WeChatPay/Request/WeChatPayDownloadFundFlowRequest.cs
  42. 17 8
      src/Essensoft.AspNetCore.Payment.WeChatPay/Request/WeChatPayGetHBInfoRequest.cs
  43. 0 30
      src/Essensoft.AspNetCore.Payment.WeChatPay/Request/WeChatPayGetPublicKeyRequest.cs
  44. 17 8
      src/Essensoft.AspNetCore.Payment.WeChatPay/Request/WeChatPayGetTransferInfoRequest.cs
  45. 0 34
      src/Essensoft.AspNetCore.Payment.WeChatPay/Request/WeChatPayH5CallPaymentRequest.cs
  46. 39 0
      src/Essensoft.AspNetCore.Payment.WeChatPay/Request/WeChatPayJsApiSdkRequest.cs
  47. 0 34
      src/Essensoft.AspNetCore.Payment.WeChatPay/Request/WeChatPayLiteAppCallPaymentRequest.cs
  48. 38 0
      src/Essensoft.AspNetCore.Payment.WeChatPay/Request/WeChatPayLiteAppReceiveRedPacketSdkRequest.cs
  49. 39 0
      src/Essensoft.AspNetCore.Payment.WeChatPay/Request/WeChatPayLiteAppSdkRequest.cs
  50. 20 10
      src/Essensoft.AspNetCore.Payment.WeChatPay/Request/WeChatPayMicroPayRequest.cs
  51. 81 0
      src/Essensoft.AspNetCore.Payment.WeChatPay/Request/WeChatPayMultiProfitSharingRequest.cs
  52. 19 9
      src/Essensoft.AspNetCore.Payment.WeChatPay/Request/WeChatPayOrderQueryRequest.cs
  53. 95 0
      src/Essensoft.AspNetCore.Payment.WeChatPay/Request/WeChatPayPaPayPartnerDeleteContractRequest.cs
  54. 156 0
      src/Essensoft.AspNetCore.Payment.WeChatPay/Request/WeChatPayPaPayPartnerEntrustWebRequest.cs
  55. 85 0
      src/Essensoft.AspNetCore.Payment.WeChatPay/Request/WeChatPayPaPayPartnerQueryContractRequest.cs
  56. 30 2
      src/Essensoft.AspNetCore.Payment.WeChatPay/Request/WeChatPayPayBankRequest.cs
  57. 20 10
      src/Essensoft.AspNetCore.Payment.WeChatPay/Request/WeChatPayPayitilReportRequest.cs
  58. 69 0
      src/Essensoft.AspNetCore.Payment.WeChatPay/Request/WeChatPayProfitSharingAddReceiverRequest.cs
  59. 75 0
      src/Essensoft.AspNetCore.Payment.WeChatPay/Request/WeChatPayProfitSharingFinishRequest.cs
  60. 68 0
      src/Essensoft.AspNetCore.Payment.WeChatPay/Request/WeChatPayProfitSharingQueryRequest.cs
  61. 69 0
      src/Essensoft.AspNetCore.Payment.WeChatPay/Request/WeChatPayProfitSharingRemoveReceiverRequest.cs
  62. 81 0
      src/Essensoft.AspNetCore.Payment.WeChatPay/Request/WeChatPayProfitSharingRequest.cs
  63. 32 10
      src/Essensoft.AspNetCore.Payment.WeChatPay/Request/WeChatPayPromotionPayWwSpTrans2PockeRequest.cs
  64. 17 8
      src/Essensoft.AspNetCore.Payment.WeChatPay/Request/WeChatPayPromotionQueryWwSpTrans2PockeRequest.cs
  65. 19 10
      src/Essensoft.AspNetCore.Payment.WeChatPay/Request/WeChatPayPromotionTransfersRequest.cs
  66. 16 2
      src/Essensoft.AspNetCore.Payment.WeChatPay/Request/WeChatPayQueryBankRequest.cs
  67. 18 8
      src/Essensoft.AspNetCore.Payment.WeChatPay/Request/WeChatPayQueryCouponStockRequest.cs
  68. 18 8
      src/Essensoft.AspNetCore.Payment.WeChatPay/Request/WeChatPayQueryCouponsInfoRequest.cs
  69. 17 2
      src/Essensoft.AspNetCore.Payment.WeChatPay/Request/WeChatPayQueryWorkWxRedPackRequest.cs
  70. 20 10
      src/Essensoft.AspNetCore.Payment.WeChatPay/Request/WeChatPayRefundQueryRequest.cs
  71. 19 10
      src/Essensoft.AspNetCore.Payment.WeChatPay/Request/WeChatPayRefundRequest.cs
  72. 18 9
      src/Essensoft.AspNetCore.Payment.WeChatPay/Request/WeChatPayReverseRequest.cs
  73. 48 0
      src/Essensoft.AspNetCore.Payment.WeChatPay/Request/WeChatPayRiskGetPublicKeyRequest.cs
  74. 18 9
      src/Essensoft.AspNetCore.Payment.WeChatPay/Request/WeChatPaySendCouponRequest.cs
  75. 17 14
      src/Essensoft.AspNetCore.Payment.WeChatPay/Request/WeChatPaySendGroupRedPackRequest.cs
  76. 131 0
      src/Essensoft.AspNetCore.Payment.WeChatPay/Request/WeChatPaySendMiniProgramHbRequest.cs
  77. 17 14
      src/Essensoft.AspNetCore.Payment.WeChatPay/Request/WeChatPaySendRedPackRequest.cs
  78. 29 8
      src/Essensoft.AspNetCore.Payment.WeChatPay/Request/WeChatPaySendWorkWxRedPackRequest.cs
  79. 18 9
      src/Essensoft.AspNetCore.Payment.WeChatPay/Request/WeChatPayToolsAuthCodeToOpenIdRequest.cs
  80. 20 10
      src/Essensoft.AspNetCore.Payment.WeChatPay/Request/WeChatPayToolsShortUrlRequest.cs
  81. 144 0
      src/Essensoft.AspNetCore.Payment.WeChatPay/Request/WeChatPayTransitPartnerPayPayApplyRequest.cs
  82. 83 0
      src/Essensoft.AspNetCore.Payment.WeChatPay/Request/WeChatPayTransitPartnerPayQueryOrderRequest.cs
  83. 77 0
      src/Essensoft.AspNetCore.Payment.WeChatPay/Request/WeChatPayTransitPartnerPayQueryStateRequest.cs
  84. 21 11
      src/Essensoft.AspNetCore.Payment.WeChatPay/Request/WeChatPayUnifiedOrderRequest.cs
  85. 83 0
      src/Essensoft.AspNetCore.Payment.WeChatPay/Request/WeChatPayVehiclePartnerPayNotificationRequest.cs
  86. 101 0
      src/Essensoft.AspNetCore.Payment.WeChatPay/Request/WeChatPayVehiclePartnerPayQueryStateRequest.cs
  87. 144 0
      src/Essensoft.AspNetCore.Payment.WeChatPay/Request/WeChatPayVehiclePartnerpayPayApplyRequest.cs
  88. 2 6
      src/Essensoft.AspNetCore.Payment.WeChatPay/Response/WeChatPayBillCommentSpBatchQueryCommentResponse.cs
  89. 15 7
      src/Essensoft.AspNetCore.Payment.WeChatPay/Response/WeChatPayCloseOrderResponse.cs
  90. 4 8
      src/Essensoft.AspNetCore.Payment.WeChatPay/Response/WeChatPayDepositConsumeResponse.cs
  91. 176 0
      src/Essensoft.AspNetCore.Payment.WeChatPay/Response/WeChatPayDepositFacePayResponse.cs
  92. 7 11
      src/Essensoft.AspNetCore.Payment.WeChatPay/Response/WeChatPayDepositMicroPayResponse.cs
  93. 4 8
      src/Essensoft.AspNetCore.Payment.WeChatPay/Response/WeChatPayDepositOrderQueryResponse.cs
  94. 4 8
      src/Essensoft.AspNetCore.Payment.WeChatPay/Response/WeChatPayDepositRefundQueryResponse.cs
  95. 5 9
      src/Essensoft.AspNetCore.Payment.WeChatPay/Response/WeChatPayDepositRefundResponse.cs
  96. 3 7
      src/Essensoft.AspNetCore.Payment.WeChatPay/Response/WeChatPayDepositReverseResponse.cs
  97. 1 5
      src/Essensoft.AspNetCore.Payment.WeChatPay/Response/WeChatPayDownloadBillResponse.cs
  98. 1 5
      src/Essensoft.AspNetCore.Payment.WeChatPay/Response/WeChatPayDownloadFundFlowResponse.cs
  99. 7 11
      src/Essensoft.AspNetCore.Payment.WeChatPay/Response/WeChatPayGetHBInfoResponse.cs
  100. 2 6
      src/Essensoft.AspNetCore.Payment.WeChatPay/Response/WeChatPayGetTransferInfoResponse.cs

+ 5 - 3
samples/WebApplicationSample/Controllers/NotifyController.cs

@@ -140,10 +140,12 @@ namespace WebApplicationSample.Controllers
     public class WeChatPayNotifyController : Controller
     {
         private readonly IWeChatPayNotifyClient _client;
+        private readonly IOptions<WeChatPayOptions> _optionsAccessor;
 
-        public WeChatPayNotifyController(IWeChatPayNotifyClient client)
+        public WeChatPayNotifyController(IWeChatPayNotifyClient client, IOptions<WeChatPayOptions> optionsAccessor)
         {
             _client = client;
+            _optionsAccessor = optionsAccessor;
         }
 
         /// <summary>
@@ -156,7 +158,7 @@ namespace WebApplicationSample.Controllers
         {
             try
             {
-                var notify = await _client.ExecuteAsync<WeChatPayUnifiedOrderNotify>(Request);
+                var notify = await _client.ExecuteAsync<WeChatPayUnifiedOrderNotify>(Request, _optionsAccessor.Value);
                 if (notify.ReturnCode == "SUCCESS")
                 {
                     if (notify.ResultCode == "SUCCESS")
@@ -184,7 +186,7 @@ namespace WebApplicationSample.Controllers
         {
             try
             {
-                var notify = await _client.ExecuteAsync<WeChatPayRefundNotify>(Request);
+                var notify = await _client.ExecuteAsync<WeChatPayRefundNotify>(Request, _optionsAccessor.Value);
                 if (notify.ReturnCode == "SUCCESS")
                 {
                     if (notify.RefundStatus == "SUCCESS")

+ 57 - 54
samples/WebApplicationSample/Controllers/WeChatPayController.cs

@@ -2,6 +2,7 @@
 using Essensoft.AspNetCore.Payment.WeChatPay;
 using Essensoft.AspNetCore.Payment.WeChatPay.Request;
 using Microsoft.AspNetCore.Mvc;
+using Microsoft.Extensions.Options;
 using Newtonsoft.Json;
 using WebApplicationSample.Models;
 
@@ -10,10 +11,12 @@ namespace WebApplicationSample.Controllers
     public class WeChatPayController : Controller
     {
         private readonly IWeChatPayClient _client;
+        private readonly IOptions<WeChatPayOptions> _optionsAccessor;
 
-        public WeChatPayController(IWeChatPayClient client)
+        public WeChatPayController(IWeChatPayClient client, IOptions<WeChatPayOptions> optionsAccessor)
         {
             _client = client;
+            _optionsAccessor = optionsAccessor;
         }
 
         /// <summary>
@@ -48,11 +51,11 @@ namespace WebApplicationSample.Controllers
                 Body = viewModel.Body,
                 OutTradeNo = viewModel.OutTradeNo,
                 TotalFee = viewModel.TotalFee,
-                SpbillCreateIp = viewModel.SpbillCreateIp,
+                SpBillCreateIp = viewModel.SpBillCreateIp,
                 AuthCode = viewModel.AuthCode
             };
-            var response = await _client.ExecuteAsync(request);
-            ViewData["response"] = response.Body;
+            var response = await _client.ExecuteAsync(request, _optionsAccessor.Value);
+            ViewData["response"] = response.ResponseBody;
             return View();
         }
 
@@ -79,25 +82,25 @@ namespace WebApplicationSample.Controllers
                 Body = viewModel.Body,
                 OutTradeNo = viewModel.OutTradeNo,
                 TotalFee = viewModel.TotalFee,
-                SpbillCreateIp = viewModel.SpbillCreateIp,
+                SpBillCreateIp = viewModel.SpBillCreateIp,
                 NotifyUrl = viewModel.NotifyUrl,
                 TradeType = viewModel.TradeType,
                 OpenId = viewModel.OpenId
             };
-            var response = await _client.ExecuteAsync(request);
+            var response = await _client.ExecuteAsync(request, _optionsAccessor.Value);
             if (response.ReturnCode == "SUCCESS" && response.ResultCode == "SUCCESS")
             {
-                var req = new WeChatPayH5CallPaymentRequest
+                var req = new WeChatPayJsApiSdkRequest
                 {
                     Package = "prepay_id=" + response.PrepayId
                 };
-                var parameter = await _client.ExecuteAsync(req);
+                var parameter = await _client.ExecuteAsync(req, _optionsAccessor.Value);
                 // 将参数(parameter)给 公众号前端 让他在微信内H5调起支付(https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=7_7&index=6)
                 ViewData["parameter"] = JsonConvert.SerializeObject(parameter);
-                ViewData["response"] = response.Body;
+                ViewData["response"] = response.ResponseBody;
                 return View();
             }
-            ViewData["response"] = response.Body;
+            ViewData["response"] = response.ResponseBody;
             return View();
         }
 
@@ -124,14 +127,14 @@ namespace WebApplicationSample.Controllers
                 Body = viewModel.Body,
                 OutTradeNo = viewModel.OutTradeNo,
                 TotalFee = viewModel.TotalFee,
-                SpbillCreateIp = viewModel.SpbillCreateIp,
+                SpBillCreateIp = viewModel.SpBillCreateIp,
                 NotifyUrl = viewModel.NotifyUrl,
                 TradeType = viewModel.TradeType
             };
-            var response = await _client.ExecuteAsync(request);
+            var response = await _client.ExecuteAsync(request, _optionsAccessor.Value);
             // response.CodeUrl 给前端生成二维码
             ViewData["qrcode"] = response.CodeUrl;
-            ViewData["response"] = response.Body;
+            ViewData["response"] = response.ResponseBody;
             return View();
         }
 
@@ -158,25 +161,25 @@ namespace WebApplicationSample.Controllers
                 Body = viewModel.Body,
                 OutTradeNo = viewModel.OutTradeNo,
                 TotalFee = viewModel.TotalFee,
-                SpbillCreateIp = viewModel.SpbillCreateIp,
+                SpBillCreateIp = viewModel.SpBillCreateIp,
                 NotifyUrl = viewModel.NotifyUrl,
                 TradeType = viewModel.TradeType
             };
-            var response = await _client.ExecuteAsync(request);
+            var response = await _client.ExecuteAsync(request, _optionsAccessor.Value);
 
             if (response.ReturnCode == "SUCCESS" && response.ResultCode == "SUCCESS")
             {
-                var req = new WeChatPayAppCallPaymentRequest
+                var req = new WeChatPayAppSdkRequest
                 {
                     PrepayId = response.PrepayId
                 };
-                var parameter = await _client.ExecuteAsync(req);
+                var parameter = await _client.ExecuteAsync(req, _optionsAccessor.Value);
                 // 将参数(parameter)给 ios/android端 让他调起微信APP(https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=8_5)
                 ViewData["parameter"] = JsonConvert.SerializeObject(parameter);
-                ViewData["response"] = response.Body;
+                ViewData["response"] = response.ResponseBody;
                 return View();
             }
-            ViewData["response"] = response.Body;
+            ViewData["response"] = response.ResponseBody;
             return View();
         }
 
@@ -203,11 +206,11 @@ namespace WebApplicationSample.Controllers
                 Body = viewModel.Body,
                 OutTradeNo = viewModel.OutTradeNo,
                 TotalFee = viewModel.TotalFee,
-                SpbillCreateIp = viewModel.SpbillCreateIp,
+                SpBillCreateIp = viewModel.SpBillCreateIp,
                 NotifyUrl = viewModel.NotifyUrl,
                 TradeType = viewModel.TradeType
             };
-            var response = await _client.ExecuteAsync(request);
+            var response = await _client.ExecuteAsync(request, _optionsAccessor.Value);
 
             // mweb_url为拉起微信支付收银台的中间页面,可通过访问该url来拉起微信客户端,完成支付,mweb_url的有效期为5分钟。
             return Redirect(response.MwebUrl);
@@ -236,26 +239,26 @@ namespace WebApplicationSample.Controllers
                 Body = viewModel.Body,
                 OutTradeNo = viewModel.OutTradeNo,
                 TotalFee = viewModel.TotalFee,
-                SpbillCreateIp = viewModel.SpbillCreateIp,
+                SpBillCreateIp = viewModel.SpBillCreateIp,
                 NotifyUrl = viewModel.NotifyUrl,
                 TradeType = viewModel.TradeType,
                 OpenId = viewModel.OpenId
             };
-            var response = await _client.ExecuteAsync(request);
+            var response = await _client.ExecuteAsync(request, _optionsAccessor.Value);
 
             if (response.ReturnCode == "SUCCESS" && response.ResultCode == "SUCCESS")
             {
-                var req = new WeChatPayLiteAppCallPaymentRequest
+                var req = new WeChatPayLiteAppSdkRequest
                 {
                     Package = "prepay_id=" + response.PrepayId
                 };
-                var parameter = await _client.ExecuteAsync(req);
+                var parameter = await _client.ExecuteAsync(req, _optionsAccessor.Value);
                 // 将参数(parameter)给 小程序前端 让他调起支付API(https://pay.weixin.qq.com/wiki/doc/api/wxa/wxa_api.php?chapter=7_7&index=5)
                 ViewData["parameter"] = JsonConvert.SerializeObject(parameter);
-                ViewData["response"] = response.Body;
+                ViewData["response"] = response.ResponseBody;
                 return View();
             }
-            ViewData["response"] = response.Body;
+            ViewData["response"] = response.ResponseBody;
             return View();
         }
 
@@ -282,8 +285,8 @@ namespace WebApplicationSample.Controllers
                 TransactionId = viewModel.TransactionId,
                 OutTradeNo = viewModel.OutTradeNo
             };
-            var response = await _client.ExecuteAsync(request);
-            ViewData["response"] = response.Body;
+            var response = await _client.ExecuteAsync(request, _optionsAccessor.Value);
+            ViewData["response"] = response.ResponseBody;
             return View();
         }
 
@@ -310,8 +313,8 @@ namespace WebApplicationSample.Controllers
                 TransactionId = viewModel.TransactionId,
                 OutTradeNo = viewModel.OutTradeNo
             };
-            var response = await _client.ExecuteAsync(request, "wechatpayCertificateName");
-            ViewData["response"] = response.Body;
+            var response = await _client.ExecuteAsync(request, _optionsAccessor.Value);
+            ViewData["response"] = response.ResponseBody;
             return View();
         }
 
@@ -337,8 +340,8 @@ namespace WebApplicationSample.Controllers
             {
                 OutTradeNo = viewModel.OutTradeNo
             };
-            var response = await _client.ExecuteAsync(request);
-            ViewData["response"] = response.Body;
+            var response = await _client.ExecuteAsync(request, _optionsAccessor.Value);
+            ViewData["response"] = response.ResponseBody;
             return View();
         }
 
@@ -370,8 +373,8 @@ namespace WebApplicationSample.Controllers
                 RefundDesc = viewModel.RefundDesc,
                 NotifyUrl = viewModel.NotifyUrl
             };
-            var response = await _client.ExecuteAsync(request, "wechatpayCertificateName");
-            ViewData["response"] = response.Body;
+            var response = await _client.ExecuteAsync(request, _optionsAccessor.Value);
+            ViewData["response"] = response.ResponseBody;
             return View();
         }
 
@@ -400,8 +403,8 @@ namespace WebApplicationSample.Controllers
                 TransactionId = viewModel.TransactionId,
                 OutTradeNo = viewModel.OutTradeNo
             };
-            var response = await _client.ExecuteAsync(request);
-            ViewData["response"] = response.Body;
+            var response = await _client.ExecuteAsync(request, _optionsAccessor.Value);
+            ViewData["response"] = response.ResponseBody;
             return View();
         }
 
@@ -429,8 +432,8 @@ namespace WebApplicationSample.Controllers
                 BillType = viewModel.BillType,
                 TarType = viewModel.TarType
             };
-            var response = await _client.ExecuteAsync(request);
-            ViewData["response"] = response.Body;
+            var response = await _client.ExecuteAsync(request, _optionsAccessor.Value);
+            ViewData["response"] = response.ResponseBody;
             return View();
         }
 
@@ -458,8 +461,8 @@ namespace WebApplicationSample.Controllers
                 AccountType = viewModel.AccountType,
                 TarType = viewModel.TarType
             };
-            var response = await _client.ExecuteAsync(request, "wechatpayCertificateName");
-            ViewData["response"] = response.Body;
+            var response = await _client.ExecuteAsync(request, _optionsAccessor.Value);
+            ViewData["response"] = response.ResponseBody;
             return View();
         }
 
@@ -481,7 +484,7 @@ namespace WebApplicationSample.Controllers
         [HttpPost]
         public async Task<IActionResult> Transfers(WeChatPayTransfersViewModel viewModel)
         {
-            var request = new WeChatPayTransfersRequest
+            var request = new WeChatPayPromotionTransfersRequest
             {
                 PartnerTradeNo = viewModel.PartnerTradeNo,
                 OpenId = viewModel.OpenId,
@@ -489,10 +492,10 @@ namespace WebApplicationSample.Controllers
                 ReUserName = viewModel.ReUserName,
                 Amount = viewModel.Amount,
                 Desc = viewModel.Desc,
-                SpbillCreateIp = viewModel.SpbillCreateIp
+                SpBillCreateIp = viewModel.SpBillCreateIp
             };
-            var response = await _client.ExecuteAsync(request, "wechatpayCertificateName");
-            ViewData["response"] = response.Body;
+            var response = await _client.ExecuteAsync(request, _optionsAccessor.Value);
+            ViewData["response"] = response.ResponseBody;
             return View();
         }
 
@@ -518,8 +521,8 @@ namespace WebApplicationSample.Controllers
             {
                 PartnerTradeNo = viewModel.PartnerTradeNo
             };
-            var response = await _client.ExecuteAsync(request, "wechatpayCertificateName");
-            ViewData["response"] = response.Body;
+            var response = await _client.ExecuteAsync(request, _optionsAccessor.Value);
+            ViewData["response"] = response.ResponseBody;
             return View();
         }
 
@@ -550,8 +553,8 @@ namespace WebApplicationSample.Controllers
                 Amount = viewModel.Amount,
                 Desc = viewModel.Desc
             };
-            var response = await _client.ExecuteAsync(request, "wechatpayCertificateName");
-            ViewData["response"] = response.Body;
+            var response = await _client.ExecuteAsync(request, _optionsAccessor.Value);
+            ViewData["response"] = response.ResponseBody;
             return View();
         }
 
@@ -577,8 +580,8 @@ namespace WebApplicationSample.Controllers
             {
                 PartnerTradeNo = viewModel.PartnerTradeNo
             };
-            var response = await _client.ExecuteAsync(request, "wechatpayCertificateName");
-            ViewData["response"] = response.Body;
+            var response = await _client.ExecuteAsync(request, _optionsAccessor.Value);
+            ViewData["response"] = response.ResponseBody;
             return View();
         }
 
@@ -592,9 +595,9 @@ namespace WebApplicationSample.Controllers
         {
             if (Request.Method == "POST")
             {
-                var request = new WeChatPayGetPublicKeyRequest();
-                var response = await _client.ExecuteAsync(request, "wechatpayCertificateName");
-                ViewData["response"] = response.Body;
+                var request = new WeChatPayRiskGetPublicKeyRequest();
+                var response = await _client.ExecuteAsync(request, _optionsAccessor.Value);
+                ViewData["response"] = response.ResponseBody;
                 return View();
             }
 

+ 7 - 7
samples/WebApplicationSample/Models/WeChatPayViewModel.cs

@@ -18,7 +18,7 @@ namespace WebApplicationSample.Models
 
         [Required]
         [Display(Name = "spbill_create_ip")]
-        public string SpbillCreateIp { get; set; }
+        public string SpBillCreateIp { get; set; }
 
         [Required]
         [Display(Name = "auth_code")]
@@ -41,7 +41,7 @@ namespace WebApplicationSample.Models
 
         [Required]
         [Display(Name = "spbill_create_ip")]
-        public string SpbillCreateIp { get; set; }
+        public string SpBillCreateIp { get; set; }
 
         [Required]
         [Display(Name = "notify_url")]
@@ -72,7 +72,7 @@ namespace WebApplicationSample.Models
 
         [Required]
         [Display(Name = "spbill_create_ip")]
-        public string SpbillCreateIp { get; set; }
+        public string SpBillCreateIp { get; set; }
 
         [Required]
         [Display(Name = "notify_url")]
@@ -99,7 +99,7 @@ namespace WebApplicationSample.Models
 
         [Required]
         [Display(Name = "spbill_create_ip")]
-        public string SpbillCreateIp { get; set; }
+        public string SpBillCreateIp { get; set; }
 
         [Required]
         [Display(Name = "notify_url")]
@@ -126,7 +126,7 @@ namespace WebApplicationSample.Models
 
         [Required]
         [Display(Name = "spbill_create_ip")]
-        public string SpbillCreateIp { get; set; }
+        public string SpBillCreateIp { get; set; }
 
         [Required]
         [Display(Name = "notify_url")]
@@ -153,7 +153,7 @@ namespace WebApplicationSample.Models
 
         [Required]
         [Display(Name = "spbill_create_ip")]
-        public string SpbillCreateIp { get; set; }
+        public string SpBillCreateIp { get; set; }
 
         [Required]
         [Display(Name = "notify_url")]
@@ -290,7 +290,7 @@ namespace WebApplicationSample.Models
 
         [Required]
         [Display(Name = "spbill_create_ip")]
-        public string SpbillCreateIp { get; set; }
+        public string SpBillCreateIp { get; set; }
     }
 
     public class WeChatPayGetTransferInfoViewModel

+ 2 - 2
samples/WebApplicationSample/Views/WeChatPay/AppPay.cshtml

@@ -26,8 +26,8 @@
                 <input type="text" class="form-control" asp-for="TotalFee" value="1" />
             </div>
             <div class="form-group">
-                <label asp-for="SpbillCreateIp"></label>
-                <input type="text" class="form-control" asp-for="SpbillCreateIp" value="127.0.0.1" />
+                <label asp-for="SpBillCreateIp"></label>
+                <input type="text" class="form-control" asp-for="SpBillCreateIp" value="127.0.0.1" />
             </div>
             <div class="form-group">
                 <label asp-for="NotifyUrl"></label>

+ 2 - 2
samples/WebApplicationSample/Views/WeChatPay/H5Pay.cshtml

@@ -26,8 +26,8 @@
                 <input type="text" class="form-control" asp-for="TotalFee" value="1" />
             </div>
             <div class="form-group">
-                <label asp-for="SpbillCreateIp"></label>
-                <input type="text" class="form-control" asp-for="SpbillCreateIp" value="127.0.0.1" />
+                <label asp-for="SpBillCreateIp"></label>
+                <input type="text" class="form-control" asp-for="SpBillCreateIp" value="127.0.0.1" />
             </div>
             <div class="form-group">
                 <label asp-for="NotifyUrl"></label>

+ 2 - 2
samples/WebApplicationSample/Views/WeChatPay/LiteAppPay.cshtml

@@ -26,8 +26,8 @@
                 <input type="text" class="form-control" asp-for="TotalFee" value="1" />
             </div>
             <div class="form-group">
-                <label asp-for="SpbillCreateIp"></label>
-                <input type="text" class="form-control" asp-for="SpbillCreateIp" value="127.0.0.1" />
+                <label asp-for="SpBillCreateIp"></label>
+                <input type="text" class="form-control" asp-for="SpBillCreateIp" value="127.0.0.1" />
             </div>
             <div class="form-group">
                 <label asp-for="NotifyUrl"></label>

+ 2 - 2
samples/WebApplicationSample/Views/WeChatPay/MicroPay.cshtml

@@ -26,8 +26,8 @@
                 <input type="text" class="form-control" asp-for="TotalFee" value="1" />
             </div>
             <div class="form-group">
-                <label asp-for="SpbillCreateIp"></label>
-                <input type="text" class="form-control" asp-for="SpbillCreateIp" value="127.0.0.1" />
+                <label asp-for="SpBillCreateIp"></label>
+                <input type="text" class="form-control" asp-for="SpBillCreateIp" value="127.0.0.1" />
             </div>
             <div class="form-group">
                 <label asp-for="AuthCode"></label>

+ 2 - 2
samples/WebApplicationSample/Views/WeChatPay/PubPay.cshtml

@@ -26,8 +26,8 @@
                 <input type="text" class="form-control" asp-for="TotalFee" value="1" />
             </div>
             <div class="form-group">
-                <label asp-for="SpbillCreateIp"></label>
-                <input type="text" class="form-control" asp-for="SpbillCreateIp" value="127.0.0.1" />
+                <label asp-for="SpBillCreateIp"></label>
+                <input type="text" class="form-control" asp-for="SpBillCreateIp" value="127.0.0.1" />
             </div>
             <div class="form-group">
                 <label asp-for="NotifyUrl"></label>

+ 2 - 2
samples/WebApplicationSample/Views/WeChatPay/QrCodePay.cshtml

@@ -26,8 +26,8 @@
                 <input type="text" class="form-control" asp-for="TotalFee" value="1">
             </div>
             <div class="form-group">
-                <label asp-for="SpbillCreateIp"></label>
-                <input type="text" class="form-control" asp-for="SpbillCreateIp" value="127.0.0.1">
+                <label asp-for="SpBillCreateIp"></label>
+                <input type="text" class="form-control" asp-for="SpBillCreateIp" value="127.0.0.1">
             </div>
             <div class="form-group">
                 <label asp-for="NotifyUrl"></label>

+ 2 - 2
samples/WebApplicationSample/Views/WeChatPay/Transfers.cshtml

@@ -38,8 +38,8 @@
                 <input type="text" class="form-control" asp-for="Desc" value="企业付款到零钱说明信息" />
             </div>
             <div class="form-group">
-                <label asp-for="SpbillCreateIp"></label>
-                <input type="text" class="form-control" asp-for="SpbillCreateIp" value="127.0.0.1" />
+                <label asp-for="SpBillCreateIp"></label>
+                <input type="text" class="form-control" asp-for="SpBillCreateIp" value="127.0.0.1" />
             </div>
             <button type="submit" class="btn btn-primary">提交请求</button>
         </form>

+ 5 - 2
src/Essensoft.AspNetCore.Payment.WeChatPay/Domain/CouponInfo.cs

@@ -2,6 +2,9 @@
 
 namespace Essensoft.AspNetCore.Payment.WeChatPay.Domain
 {
+    /// <summary>
+    /// 代金券或立减优惠信息
+    /// </summary>
     public class CouponInfo
     {
         /// <summary>
@@ -11,13 +14,13 @@ namespace Essensoft.AspNetCore.Payment.WeChatPay.Domain
         public string CouponType { get; set; }
 
         /// <summary>
-        /// 代金券ID
+        /// 代金券或立减优惠ID
         /// </summary>
         [XmlElement("coupon_id")]
         public string CouponId { get; set; }
 
         /// <summary>
-        /// 代金券金额
+        /// 代金券或立减优惠金额
         /// </summary>
         [XmlElement("coupon_fee")]
         public int CouponFee { get; set; }

+ 3 - 0
src/Essensoft.AspNetCore.Payment.WeChatPay/Domain/CouponRefundInfo.cs

@@ -2,6 +2,9 @@
 
 namespace Essensoft.AspNetCore.Payment.WeChatPay.Domain
 {
+    /// <summary>
+    /// 退款代金券信息
+    /// </summary>
     public class CouponRefundInfo
     {
         /// <summary>

+ 5 - 2
src/Essensoft.AspNetCore.Payment.WeChatPay/Domain/HBInfo.cs

@@ -2,10 +2,13 @@
 
 namespace Essensoft.AspNetCore.Payment.WeChatPay.Domain
 {
-    public class HBInfo
+    /// <summary>
+    /// 红包信息
+    /// </summary>
+    public class HbInfo
     {
         /// <summary>
-        /// 领取红包的Openid
+        /// 领取红包的OpenId
         /// </summary>
         [XmlElement("openid")]
         public string OpenId { get; set; }

+ 3 - 0
src/Essensoft.AspNetCore.Payment.WeChatPay/Domain/RefundInfo.cs

@@ -3,6 +3,9 @@ using System.Xml.Serialization;
 
 namespace Essensoft.AspNetCore.Payment.WeChatPay.Domain
 {
+    /// <summary>
+    /// 退款信息
+    /// </summary>
     public class RefundInfo
     {
         /// <summary>

+ 41 - 0
src/Essensoft.AspNetCore.Payment.WeChatPay/IWeChatPayCertRequest.cs

@@ -0,0 +1,41 @@
+using System.Collections.Generic;
+
+namespace Essensoft.AspNetCore.Payment.WeChatPay
+{
+    public interface IWeChatPayCertRequest<T> where T : WeChatPayResponse
+    {
+        /// <summary>
+        /// 获取API接口链接
+        /// </summary>
+        /// <returns>API接口链接</returns>
+        string GetRequestUrl();
+
+        /// <summary>
+        /// 获取所有的Key-Value形式的文本请求参数字典。其中:
+        /// Key: 请求参数名
+        /// Value: 请求参数文本值
+        /// </summary>
+        /// <returns>文本请求参数字典</returns>
+        IDictionary<string, string> GetParameters();
+
+        /// <summary>
+        /// 获取签名类型
+        /// </summary>
+        /// <returns>签名类型</returns>
+        WeChatPaySignType GetSignType();
+
+        /// <summary>
+        /// 基本参数处理器
+        /// </summary>
+        /// <param name="options">配置选项</param>
+        /// <param name="signType">签名类型</param>
+        /// <param name="sortedTxtParams">排序文本参数</param>
+        void PrimaryHandler(WeChatPayOptions options, WeChatPaySignType signType, WeChatPayDictionary sortedTxtParams);
+
+        /// <summary>
+        /// 是否需要检查响应内容签名
+        /// </summary>
+        /// <returns>是否需要检查</returns>
+        bool GetNeedCheckSign();
+    }
+}

+ 0 - 31
src/Essensoft.AspNetCore.Payment.WeChatPay/IWeChatPayCertificateRequest.cs

@@ -1,31 +0,0 @@
-using System.Collections.Generic;
-
-namespace Essensoft.AspNetCore.Payment.WeChatPay
-{
-    /// <summary>
-    /// WeChatPay 证书请求接口。
-    /// </summary>
-    /// <typeparam name="T"></typeparam>
-    public interface IWeChatPayCertificateRequest<T> where T : WeChatPayResponse
-    {
-        /// <summary>
-        /// API接口地址
-        /// </summary>
-        /// <returns></returns>
-        string GetRequestUrl();
-
-        /// <summary>
-        /// 获取所有的Key-Value形式的文本请求参数字典。其中:
-        /// Key: 请求参数名
-        /// Value: 请求参数文本值
-        /// </summary>
-        /// <returns>文本请求参数字典</returns>
-        IDictionary<string, string> GetParameters();
-
-        /// <summary>
-        /// 是否验证响应内容签名
-        /// </summary>
-        /// <returns>是否验证</returns>
-        bool IsCheckResponseSign();
-    }
-}

+ 14 - 32
src/Essensoft.AspNetCore.Payment.WeChatPay/IWeChatPayClient.cs

@@ -2,56 +2,38 @@
 
 namespace Essensoft.AspNetCore.Payment.WeChatPay
 {
-    /// <summary>
-    /// WeChatPay 客户端。
-    /// </summary>
     public interface IWeChatPayClient
     {
         /// <summary>
-        /// 执行WeChatPay API请求。
+        /// 执行 WeChatPay API请求。
         /// </summary>
         /// <param name="request">具体的WeChatPay API请求</param>
+        /// <param name="options">配置选项</param>
         /// <returns>领域对象</returns>
-        Task<T> ExecuteAsync<T>(IWeChatPayRequest<T> request) where T : WeChatPayResponse;
+        Task<T> ExecuteAsync<T>(IWeChatPayRequest<T> request, WeChatPayOptions options) where T : WeChatPayResponse;
 
         /// <summary>
-        /// 执行WeChatPay API请求。
+        /// 执行 WeChatPay API请求。
         /// </summary>
         /// <param name="request">具体的WeChatPay API请求</param>
-        /// <param name="optionsName">配置选项名称</param>
+        /// <param name="options">配置选项</param>
         /// <returns>领域对象</returns>
-        Task<T> ExecuteAsync<T>(IWeChatPayRequest<T> request, string optionsName) where T : WeChatPayResponse;
+        Task<T> PageExecuteAsync<T>(IWeChatPayRequest<T> request, WeChatPayOptions options) where T : WeChatPayResponse;
 
         /// <summary>
-        /// 执行WeChatPay API证书请求。
+        /// 执行 WeChatPay API证书请求。
         /// </summary>
         /// <param name="request">具体的WeChatPay API证书请求</param>
-        /// <param name="certificateName">证书名称</param>
+        /// <param name="options">配置选项</param>
         /// <returns>领域对象</returns>
-        Task<T> ExecuteAsync<T>(IWeChatPayCertificateRequest<T> request, string certificateName) where T : WeChatPayResponse;
+        Task<T> ExecuteAsync<T>(IWeChatPayCertRequest<T> request, WeChatPayOptions options) where T : WeChatPayResponse;
 
         /// <summary>
-        /// 执行WeChatPay API证书请求。
+        /// 执行 WeChatPay Sdk请求。
         /// </summary>
-        /// <param name="request">具体的WeChatPay API证书请求</param>
-        /// <param name="optionsName">配置选项名称</param>
-        /// <param name="certificateName">证书名称</param>
-        /// <returns>领域对象</returns>
-        Task<T> ExecuteAsync<T>(IWeChatPayCertificateRequest<T> request, string optionsName, string certificateName) where T : WeChatPayResponse;
-
-        /// <summary>
-        /// 执行WeChatPay API调起请求。
-        /// </summary>
-        /// <param name="request">具体的WeChatPay API调起请求</param>
-        /// <returns>领域对象</returns>
-        Task<WeChatPayDictionary> ExecuteAsync(IWeChatPayCallRequest request);
-
-        /// <summary>
-        /// 执行WeChatPay API调起请求。
-        /// </summary>
-        /// <param name="request">具体的WeChatPay API调起请求</param>
-        /// <param name="optionsName">配置选项名称</param>
-        /// <returns>领域对象</returns>
-        Task<WeChatPayDictionary> ExecuteAsync(IWeChatPayCallRequest request, string optionsName);
+        /// <param name="request">具体的WeChatPay Sdk请求</param>
+        /// <param name="options">配置选项名称</param>
+        /// <returns>响应字典</returns>
+        Task<WeChatPayDictionary> ExecuteAsync(IWeChatPaySdkRequest request, WeChatPayOptions options);
     }
 }

+ 3 - 14
src/Essensoft.AspNetCore.Payment.WeChatPay/IWeChatPayNotifyClient.cs

@@ -3,26 +3,15 @@ using Microsoft.AspNetCore.Http;
 
 namespace Essensoft.AspNetCore.Payment.WeChatPay
 {
-    /// <summary>
-    /// WeChatPay 通知解析客户端。
-    /// </summary>
     public interface IWeChatPayNotifyClient
     {
         /// <summary>
-        /// 执行WeChatPay通知请求解析
+        /// 执行 WeChatPay 通知请求解析
         /// </summary>
         /// <typeparam name="T">领域对象</typeparam>
         /// <param name="request">控制器的请求</param>
+        /// <param name="options">配置选项</param>
         /// <returns>领域对象</returns>
-        Task<T> ExecuteAsync<T>(HttpRequest request) where T : WeChatPayNotify;
-
-        /// <summary>
-        /// 执行WeChatPay通知请求解析。
-        /// </summary>
-        /// <typeparam name="T">领域对象</typeparam>
-        /// <param name="request">控制器的请求</param>
-        /// <param name="optionsName">配置选项名称</param>
-        /// <returns>领域对象</returns>
-        Task<T> ExecuteAsync<T>(HttpRequest request, string optionsName) where T : WeChatPayNotify;
+        Task<T> ExecuteAsync<T>(HttpRequest request, WeChatPayOptions options) where T : WeChatPayNotify;
     }
 }

+ 19 - 9
src/Essensoft.AspNetCore.Payment.WeChatPay/IWeChatPayRequest.cs

@@ -2,16 +2,12 @@
 
 namespace Essensoft.AspNetCore.Payment.WeChatPay
 {
-    /// <summary>
-    /// WeChatPay 请求接口。
-    /// </summary>
-    /// <typeparam name="T"></typeparam>
     public interface IWeChatPayRequest<T> where T : WeChatPayResponse
     {
         /// <summary>
-        /// API接口地址
+        /// 获取API接口链接
         /// </summary>
-        /// <returns></returns>
+        /// <returns>API接口链接</returns>
         string GetRequestUrl();
 
         /// <summary>
@@ -23,9 +19,23 @@ namespace Essensoft.AspNetCore.Payment.WeChatPay
         IDictionary<string, string> GetParameters();
 
         /// <summary>
-        /// 是否验证响应内容签名
+        /// 获取签名类型
         /// </summary>
-        /// <returns>是否验证</returns>
-        bool IsCheckResponseSign();
+        /// <returns>签名类型</returns>
+        WeChatPaySignType GetSignType();
+
+        /// <summary>
+        /// 基本参数处理器
+        /// </summary>
+        /// <param name="options">配置选项</param>
+        /// <param name="signType">签名类型</param>
+        /// <param name="sortedTxtParams">排序文本参数</param>
+        void PrimaryHandler(WeChatPayOptions options, WeChatPaySignType signType, WeChatPayDictionary sortedTxtParams);
+
+        /// <summary>
+        /// 是否需要检查响应内容签名
+        /// </summary>
+        /// <returns>是否需要检查</returns>
+        bool GetNeedCheckSign();
     }
 }

+ 8 - 4
src/Essensoft.AspNetCore.Payment.WeChatPay/IWeChatPayCallRequest.cs → src/Essensoft.AspNetCore.Payment.WeChatPay/IWeChatPaySdkRequest.cs

@@ -2,10 +2,7 @@
 
 namespace Essensoft.AspNetCore.Payment.WeChatPay
 {
-    /// <summary>
-    /// WeChatPay 调起请求接口。
-    /// </summary>
-    public interface IWeChatPayCallRequest
+    public interface IWeChatPaySdkRequest
     {
         /// <summary>
         /// 获取所有的Key-Value形式的文本请求参数字典。其中:
@@ -14,5 +11,12 @@ namespace Essensoft.AspNetCore.Payment.WeChatPay
         /// </summary>
         /// <returns>文本请求参数字典</returns>
         IDictionary<string, string> GetParameters();
+
+        /// <summary>
+        /// 请求参数处理器
+        /// </summary>
+        /// <param name="options"></param>
+        /// <param name="sortedTxtParams"></param>
+        void PrimaryHandler(WeChatPayOptions options, WeChatPayDictionary sortedTxtParams);
     }
 }

+ 3 - 7
src/Essensoft.AspNetCore.Payment.WeChatPay/Notify/WeChatPayRefundNotify.cs

@@ -10,22 +10,18 @@ namespace Essensoft.AspNetCore.Payment.WeChatPay.Notify
     {
         /// <summary>
         /// 返回状态码
-        /// 此字段是通信标识,非交易标识,
-        /// 交易是否成功需要查看result_code来判断
         /// </summary>
         [XmlElement("return_code")]
         public string ReturnCode { get; set; }
 
         /// <summary>
-        /// 返回信息,如非空,为错误原因
-        /// 签名失败
-        /// 参数格式校验错误
+        /// 返回信息
         /// </summary>
         [XmlElement("return_msg")]
         public string ReturnMsg { get; set; }
 
         /// <summary>
-        /// 公众账号ID
+        /// 应用号
         /// </summary>
         [XmlElement("appid")]
         public string AppId { get; set; }
@@ -37,7 +33,7 @@ namespace Essensoft.AspNetCore.Payment.WeChatPay.Notify
         public string MchId { get; set; }
 
         /// <summary>
-        /// 子商户公众账号ID
+        /// 子商户应用号
         /// </summary>
         [XmlElement("sub_appid")]
         public string SubAppId { get; set; }

+ 215 - 0
src/Essensoft.AspNetCore.Payment.WeChatPay/Notify/WeChatPayTransitPartnerpayPayApplyNotify.cs

@@ -0,0 +1,215 @@
+using System.Collections.Generic;
+using System.Xml.Serialization;
+using Essensoft.AspNetCore.Payment.WeChatPay.Domain;
+using Essensoft.AspNetCore.Payment.WeChatPay.Parser;
+
+namespace Essensoft.AspNetCore.Payment.WeChatPay.Notify
+{
+    /// <summary>
+    /// 微信代扣 - 乘车码代扣 - 申请扣款 - 支付结果通知
+    /// </summary>
+    [XmlRoot("xml")]
+    public class WeChatPayTransitPartnerpayPayApplyNotify : WeChatPayNotify
+    {
+        /// <summary>
+        /// 返回状态码
+        /// </summary>
+        [XmlElement("return_code")]
+        public string ReturnCode { get; set; }
+
+        /// <summary>
+        /// 返回信息
+        /// </summary>
+        [XmlElement("return_msg")]
+        public string ReturnMsg { get; set; }
+
+        /// <summary>
+        /// 应用号
+        /// </summary>
+        [XmlElement("appid")]
+        public string AppId { get; set; }
+
+        /// <summary>
+        /// 子商户应用号
+        /// </summary>
+        [XmlElement("sub_appid")]
+        public string SubAppId { get; set; }
+
+        /// <summary>
+        /// 商户号
+        /// </summary>
+        [XmlElement("mch_id")]
+        public string MchId { get; set; }
+
+        /// <summary>
+        /// 子商户号
+        /// </summary>
+        [XmlElement("sub_mch_id")]
+        public string SubMchId { get; set; }
+
+        /// <summary>
+        /// 设备号
+        /// </summary>
+        [XmlElement("device_info")]
+        public string DeviceInfo { get; set; }
+
+        /// <summary>
+        /// 随机字符串
+        /// </summary>
+        [XmlElement("nonce_str")]
+        public string NonceStr { get; set; }
+
+        /// <summary>
+        /// 签名类型
+        /// </summary>
+        [XmlElement("sign_type")]
+        public string SignType { get; set; }
+
+        /// <summary>
+        /// 签名
+        /// </summary>
+        [XmlElement("sign")]
+        public string Sign { get; set; }
+
+        /// <summary>
+        /// 业务结果
+        /// </summary>
+        [XmlElement("result_code")]
+        public string ResultCode { get; set; }
+
+        /// <summary>
+        /// 错误代码
+        /// </summary>
+        [XmlElement("err_code")]
+        public string ErrCode { get; set; }
+
+        /// <summary>
+        /// 错误描述	
+        /// </summary>
+        [XmlElement("err_code_des")]
+        public string ErrCodeDes { get; set; }
+
+        /// <summary>
+        /// 用户标识
+        /// </summary>
+        [XmlElement("openid")]
+        public string OpenId { get; set; }
+
+        /// <summary>
+        /// 用户子标识
+        /// </summary>
+        [XmlElement("sub_openid")]
+        public string SubOpenId { get; set; }
+
+        /// <summary>
+        /// 是否关注公众账号
+        /// </summary>
+        [XmlElement("is_subscribe")]
+        public string IsSubscribe { get; set; }
+
+        /// <summary>
+        /// 是否关注子公众账号
+        /// </summary>
+        [XmlElement("sub_is_subscribe")]
+        public string SubIsSubscribe { get; set; }
+
+        /// <summary>
+        /// 付款银行
+        /// </summary>
+        [XmlElement("bank_type")]
+        public string BankType { get; set; }
+
+        /// <summary>
+        /// 总金额
+        /// </summary>
+        [XmlElement("total_fee")]
+        public int TotalFee { get; set; }
+
+        /// <summary>
+        /// 货币种类
+        /// </summary>
+        [XmlElement("fee_type")]
+        public string FeeType { get; set; }
+
+        /// <summary>
+        /// 现金支付金额
+        /// </summary>
+        [XmlElement("cash_fee")]
+        public string CashFee { get; set; }
+
+        /// <summary>
+        /// 现金支付货币类型
+        /// </summary>
+        [XmlElement("cash_fee_type")]
+        public string CashFeeType { get; set; }
+
+        /// <summary>
+        /// 交易状态
+        /// </summary>
+        [XmlElement("trade_state")]
+        public string TradeState { get; set; }
+
+        /// <summary>
+        /// 代金券或立减优惠金额
+        /// </summary>
+        [XmlElement("coupon_fee")]
+        public string CouponFee { get; set; }
+
+        /// <summary>
+        /// 代金券或立减优惠使用数量
+        /// </summary>
+        [XmlElement("coupon_count")]
+        public string CouponCount { get; set; }
+
+        /// <summary>
+        /// 代金券或立减优惠信息
+        /// </summary>
+        [XmlIgnore]
+        public List<CouponInfo> CouponInfos { get; set; }
+
+        /// <summary>
+        /// 微信支付订单号
+        /// </summary>
+        [XmlElement("transaction_id")]
+        public string TransactionId { get; set; }
+
+        /// <summary>
+        /// 商户订单号
+        /// </summary>
+        [XmlElement("out_trade_no")]
+        public string OutTradeNo { get; set; }
+
+        /// <summary>
+        /// 商家数据包
+        /// </summary>
+        [XmlElement("attach")]
+        public string Attach { get; set; }
+
+        /// <summary>
+        /// 支付完成时间
+        /// </summary>
+        [XmlElement("time_end")]
+        public string TimeEnd { get; set; }
+
+        /// <summary>
+        /// 交易类型
+        /// </summary>
+        [XmlElement("trade_type")]
+        public string TradeType { get; set; }
+
+        /// <summary>
+        /// 委托代扣协议id
+        /// </summary>
+        [XmlElement("contract_id")]
+        public string ContractId { get; set; }
+
+        /// <summary>
+        /// 处理 _$n / _$n_$m
+        /// </summary>
+        internal override void Execute()
+        {
+            var parser = new WeChatPayListPropertyParser();
+            CouponInfos = parser.Parse<CouponInfo>(ResponseParameters);
+        }
+    }
+}

+ 17 - 21
src/Essensoft.AspNetCore.Payment.WeChatPay/Notify/WeChatPayUnifiedOrderNotify.cs

@@ -13,22 +13,18 @@ namespace Essensoft.AspNetCore.Payment.WeChatPay.Notify
     {
         /// <summary>
         /// 返回状态码
-        /// 此字段是通信标识,非交易标识,
-        /// 交易是否成功需要查看result_code来判断
         /// </summary>
         [XmlElement("return_code")]
         public string ReturnCode { get; set; }
 
         /// <summary>
-        /// 返回信息,如非空,为错误原因
-        /// 签名失败
-        /// 参数格式校验错误
+        /// 返回信息
         /// </summary>
         [XmlElement("return_msg")]
         public string ReturnMsg { get; set; }
 
         /// <summary>
-        /// 公众账号ID
+        /// 应用号
         /// </summary>
         [XmlElement("appid")]
         public string AppId { get; set; }
@@ -40,7 +36,7 @@ namespace Essensoft.AspNetCore.Payment.WeChatPay.Notify
         public string MchId { get; set; }
 
         /// <summary>
-        /// 子商户公众账号ID
+        /// 子商户应用号
         /// </summary>
         [XmlElement("sub_appid")]
         public string SubAppId { get; set; }
@@ -57,12 +53,24 @@ namespace Essensoft.AspNetCore.Payment.WeChatPay.Notify
         [XmlElement("device_info")]
         public string DeviceInfo { get; set; }
 
+        /// <summary>
+        /// 是否关注公众账号
+        /// </summary>
+        [XmlElement("is_subscribe")]
+        public string IsSubscribe { get; set; }
+
         /// <summary>
         /// 随机字符串
         /// </summary>
         [XmlElement("nonce_str")]
         public string NonceStr { get; set; }
 
+        /// <summary>
+        /// 是否关注子公众账号
+        /// </summary>
+        [XmlElement("sub_is_subscribe")]
+        public string SubIsSubscribe { get; set; }
+
         /// <summary>
         /// 签名
         /// </summary>
@@ -93,24 +101,12 @@ namespace Essensoft.AspNetCore.Payment.WeChatPay.Notify
         [XmlElement("openid")]
         public string OpenId { get; set; }
 
-        /// <summary>
-        /// 是否关注公众账号
-        /// </summary>
-        [XmlElement("is_subscribe")]
-        public string IsSubscribe { get; set; }
-
         /// <summary>
         /// 用户子标识
         /// </summary>
         [XmlElement("sub_openid")]
         public string SubOpenId { get; set; }
 
-        /// <summary>
-        /// 是否关注子公众账号
-        /// </summary>
-        [XmlElement("sub_is_subscribe")]
-        public string SubIsSubscribe { get; set; }
-
         /// <summary>
         /// 交易类型
         /// </summary>
@@ -127,7 +123,7 @@ namespace Essensoft.AspNetCore.Payment.WeChatPay.Notify
         /// 总金额
         /// </summary>
         [XmlElement("total_fee")]
-        public string TotalFee { get; set; }
+        public int TotalFee { get; set; }
 
         /// <summary>
         /// 货币种类
@@ -201,7 +197,7 @@ namespace Essensoft.AspNetCore.Payment.WeChatPay.Notify
         internal override void Execute()
         {
             var parser = new WeChatPayListPropertyParser();
-            CouponInfos = parser.Parse<CouponInfo, object>(Parameters);
+            CouponInfos = parser.Parse<CouponInfo>(ResponseParameters);
         }
     }
 }

+ 71 - 0
src/Essensoft.AspNetCore.Payment.WeChatPay/Notify/WeChatPayVehiclePartnerPayNotificationNotify.cs

@@ -0,0 +1,71 @@
+using System.Xml.Serialization;
+
+namespace Essensoft.AspNetCore.Payment.WeChatPay.Notify
+{
+    /// <summary>
+    /// 微信代扣 - 车主平台 - 车牌状态变更通知
+    /// </summary>
+    [XmlRoot("xml")]
+    public class WeChatPayVehiclePartnerPayNotificationNotify : WeChatPayNotify
+    {
+        /// <summary>
+        /// 商户号
+        /// </summary>
+        [XmlElement("mch_id")]
+        public string MchId { get; set; }
+
+        /// <summary>
+        /// 子商户号
+        /// </summary>
+        [XmlElement("sub_mch_id")]
+        public string SubMchId { get; set; }
+
+        /// <summary>
+        /// 应用号
+        /// </summary>
+        [XmlElement("appid")]
+        public string AppId { get; set; }
+
+        /// <summary>
+        /// 子商户应用号
+        /// </summary>
+        [XmlElement("sub_appid")]
+        public string SubAppId { get; set; }
+
+        /// <summary>
+        /// 车牌号
+        /// </summary>
+        [XmlElement("plate_number")]
+        public string PlateNumber { get; set; }
+
+        /// <summary>
+        /// 车牌变更事件类型
+        /// </summary>
+        [XmlElement("vehicle_event_type")]
+        public string VehicleEventType { get; set; }
+
+        /// <summary>
+        /// 随机字符串
+        /// </summary>
+        [XmlElement("nonce_str")]
+        public string NonceStr { get; set; }
+
+        /// <summary>
+        /// 签名类型
+        /// </summary>
+        [XmlElement("sign_type")]
+        public string SignType { get; set; }
+
+        /// <summary>
+        /// 签名
+        /// </summary>
+        [XmlElement("sign")]
+        public string Sign { get; set; }
+
+        /// <summary>
+        /// 车牌变更事件发生时间
+        /// </summary>
+        [XmlElement("vehicle_event_createtime")]
+        public string VehicleEventCreateTime { get; set; }
+    }
+}

+ 209 - 0
src/Essensoft.AspNetCore.Payment.WeChatPay/Notify/WeChatPayVehiclePartnerpayPayApplyNotify.cs

@@ -0,0 +1,209 @@
+using System.Collections.Generic;
+using System.Xml.Serialization;
+using Essensoft.AspNetCore.Payment.WeChatPay.Domain;
+using Essensoft.AspNetCore.Payment.WeChatPay.Parser;
+
+namespace Essensoft.AspNetCore.Payment.WeChatPay.Notify
+{
+    /// <summary>
+    /// 微信代扣 - 车主平台 - 申请扣款 - 支付结果通知
+    /// </summary>
+    [XmlRoot("xml")]
+    public class WeChatPayVehiclePartnerpayPayApplyNotify : WeChatPayNotify
+    {
+        /// <summary>
+        /// 返回状态码
+        /// </summary>
+        [XmlElement("return_code")]
+        public string ReturnCode { get; set; }
+
+        /// <summary>
+        /// 返回信息
+        /// </summary>
+        [XmlElement("return_msg")]
+        public string ReturnMsg { get; set; }
+
+        /// <summary>
+        /// 应用号
+        /// </summary>
+        [XmlElement("appid")]
+        public string AppId { get; set; }
+
+        /// <summary>
+        /// 子商户应用号
+        /// </summary>
+        [XmlElement("sub_appid")]
+        public string SubAppId { get; set; }
+
+        /// <summary>
+        /// 商户号
+        /// </summary>
+        [XmlElement("mch_id")]
+        public string MchId { get; set; }
+
+        /// <summary>
+        /// 子商户号
+        /// </summary>
+        [XmlElement("sub_mch_id")]
+        public string SubMchId { get; set; }
+
+        /// <summary>
+        /// 设备号
+        /// </summary>
+        [XmlElement("device_info")]
+        public string DeviceInfo { get; set; }
+
+        /// <summary>
+        /// 随机字符串
+        /// </summary>
+        [XmlElement("nonce_str")]
+        public string NonceStr { get; set; }
+
+        /// <summary>
+        /// 签名类型
+        /// </summary>
+        [XmlElement("sign_type")]
+        public string SignType { get; set; }
+
+        /// <summary>
+        /// 签名
+        /// </summary>
+        [XmlElement("sign")]
+        public string Sign { get; set; }
+
+        /// <summary>
+        /// 业务结果
+        /// </summary>
+        [XmlElement("result_code")]
+        public string ResultCode { get; set; }
+
+        /// <summary>
+        /// 错误代码
+        /// </summary>
+        [XmlElement("err_code")]
+        public string ErrCode { get; set; }
+
+        /// <summary>
+        /// 错误描述	
+        /// </summary>
+        [XmlElement("err_code_des")]
+        public string ErrCodeDes { get; set; }
+
+        /// <summary>
+        /// 用户标识
+        /// </summary>
+        [XmlElement("openid")]
+        public string OpenId { get; set; }
+
+        /// <summary>
+        /// 用户子标识
+        /// </summary>
+        [XmlElement("sub_openid")]
+        public string SubOpenId { get; set; }
+
+        /// <summary>
+        /// 是否关注公众账号
+        /// </summary>
+        [XmlElement("is_subscribe")]
+        public string IsSubscribe { get; set; }
+
+        /// <summary>
+        /// 是否关注子公众账号
+        /// </summary>
+        [XmlElement("sub_is_subscribe")]
+        public string SubIsSubscribe { get; set; }
+
+        /// <summary>
+        /// 付款银行
+        /// </summary>
+        [XmlElement("bank_type")]
+        public string BankType { get; set; }
+
+        /// <summary>
+        /// 总金额
+        /// </summary>
+        [XmlElement("total_fee")]
+        public int TotalFee { get; set; }
+
+        /// <summary>
+        /// 货币种类
+        /// </summary>
+        [XmlElement("fee_type")]
+        public string FeeType { get; set; }
+
+        /// <summary>
+        /// 现金支付金额
+        /// </summary>
+        [XmlElement("cash_fee")]
+        public string CashFee { get; set; }
+
+        /// <summary>
+        /// 现金支付货币类型
+        /// </summary>
+        [XmlElement("cash_fee_type")]
+        public string CashFeeType { get; set; }
+
+        /// <summary>
+        /// 交易状态
+        /// </summary>
+        [XmlElement("trade_state")]
+        public string TradeState { get; set; }
+
+        /// <summary>
+        /// 代金券或立减优惠金额
+        /// </summary>
+        [XmlElement("coupon_fee")]
+        public string CouponFee { get; set; }
+
+        /// <summary>
+        /// 代金券或立减优惠使用数量
+        /// </summary>
+        [XmlElement("coupon_count")]
+        public string CouponCount { get; set; }
+
+        /// <summary>
+        /// 代金券或立减优惠信息
+        /// </summary>
+        [XmlIgnore]
+        public List<CouponInfo> CouponInfos { get; set; }
+
+        /// <summary>
+        /// 微信支付订单号
+        /// </summary>
+        [XmlElement("transaction_id")]
+        public string TransactionId { get; set; }
+
+        /// <summary>
+        /// 商户订单号
+        /// </summary>
+        [XmlElement("out_trade_no")]
+        public string OutTradeNo { get; set; }
+
+        /// <summary>
+        /// 商家数据包
+        /// </summary>
+        [XmlElement("attach")]
+        public string Attach { get; set; }
+
+        /// <summary>
+        /// 支付完成时间
+        /// </summary>
+        [XmlElement("time_end")]
+        public string TimeEnd { get; set; }
+
+        /// <summary>
+        /// 交易类型
+        /// </summary>
+        [XmlElement("trade_type")]
+        public string TradeType { get; set; }
+
+        /// <summary>
+        /// 处理 _$n / _$n_$m
+        /// </summary>
+        internal override void Execute()
+        {
+            var parser = new WeChatPayListPropertyParser();
+            CouponInfos = parser.Parse<CouponInfo>(ResponseParameters);
+        }
+    }
+}

+ 0 - 3
src/Essensoft.AspNetCore.Payment.WeChatPay/Parser/IWeChatPayParser.cs

@@ -1,8 +1,5 @@
 namespace Essensoft.AspNetCore.Payment.WeChatPay.Parser
 {
-    /// <summary>
-    /// WeChatPay 解释器。
-    /// </summary>
     public interface IWeChatPayParser<T> where T : WeChatPayObject
     {
         T Parse(string body);

+ 99 - 32
src/Essensoft.AspNetCore.Payment.WeChatPay/Parser/WeChatPayListPropertyParser.cs

@@ -1,63 +1,117 @@
 using System;
 using System.Collections.Generic;
+using System.Linq;
+using System.Reflection;
+using System.Text.RegularExpressions;
 using System.Xml.Serialization;
 
 namespace Essensoft.AspNetCore.Payment.WeChatPay.Parser
 {
-    /// <summary>
-    /// WeChatPay ListPropert 解释器。
-    /// </summary>
     public class WeChatPayListPropertyParser
     {
-        public List<T> Parse<T, TChildren>(WeChatPayDictionary dictionary, int index = -1)
+        public List<T> Parse<T>(WeChatPayDictionary dictionary) where T : new()
+        {
+            var list = new List<T>();
+            var properties = typeof(T).GetProperties();
+            var keyfirst = properties[0];
+            var count = dictionary.Keys.Where(p => Regex.IsMatch(p, $@"{GetKeyName(keyfirst)}_\d")).Count();
+
+            for (var i = 0; i < count; i++)
+            {
+                var item = new T();
+                foreach (var field in properties)
+                {
+                    var name = $"{GetKeyName(field)}_{i}";
+                    field.SetValue(item, Convert.ChangeType(dictionary.GetValue(name), field.PropertyType));
+                }
+                list.Add(item);
+            }
+            return list;
+        }
+
+        public List<T> Parse<T, TChildren>(WeChatPayDictionary dictionary) where T : new() where TChildren : new()
+        {
+            var list = new List<T>();
+            var properties = typeof(T).GetProperties();
+            var keyfirst = properties[0];
+            var count = dictionary.Keys.Where(p => Regex.IsMatch(p, $@"{GetKeyName(keyfirst)}_\d")).Count();
+
+            for (var i = 0; i < count; i++)
+            {
+                var item = new T();
+                foreach (var field in properties)
+                {
+                    if (field.PropertyType == typeof(List<TChildren>))
+                    {
+                        var sublist = new List<TChildren>();
+                        var subProperties = typeof(TChildren).GetProperties();
+                        var subFirstkey = subProperties[0];
+                        var SubFirstName = GetKeyName(subFirstkey);
+                        var subCount = dictionary.Keys.Where(p => Regex.IsMatch(p, $@"{SubFirstName}_{i}_\d")).Count();
+                        for (var j = 0; j < subCount; j++)
+                        {
+                            var subItem = new TChildren();
+                            foreach (var subfield in subProperties)
+                            {
+                                var name = $"{GetKeyName(subfield)}_{i}_{j}";
+                                subfield.SetValue(item, Convert.ChangeType(dictionary.GetValue(name), subfield.PropertyType));
+                            }
+                            sublist.Add(subItem);
+                        }
+                        field.SetValue(item, sublist);
+                    }
+                    else
+                    {
+                        var name = $"{GetKeyName(field)}_{i}";
+                        field.SetValue(item, Convert.ChangeType(dictionary.GetValue(name), field.PropertyType));
+                    }
+                }
+                list.Add(item);
+            }
+            return list;
+        }
+
+        public List<T> Parse<T, TChildren>(WeChatPayDictionary dictionary, int index) where T : new() where TChildren : new()
         {
             var flag = true;
             var list = new List<T>();
             var i = 0;
-
             while (flag)
             {
                 var type = typeof(T);
-                var obj = Activator.CreateInstance(type);
+                var obj = new T();
                 var properties = type.GetProperties();
                 var isFirstProperty = true;
 
-                foreach (var propertie in properties)
+                foreach (var item in properties)
                 {
-                    if (propertie.PropertyType == typeof(List<TChildren>))
+                    if (item.PropertyType == typeof(List<TChildren>))
                     {
                         var chidrenList = Parse<TChildren, object>(dictionary, i);
-                        propertie.SetValue(obj, chidrenList);
+                        item.SetValue(obj, chidrenList);
                         continue;
                     }
 
-                    var renameAttribute = propertie.GetCustomAttributes(typeof(XmlElementAttribute), true);
-                    if (renameAttribute.Length > 0)
+                    var key = GetKeyName(item);
+                    if (index > -1)
                     {
-                        var key = ((XmlElementAttribute)renameAttribute[0]).ElementName;
-
-                        if (index > -1)
-                        {
-                            key += $"_{index}";
-                        }
-
-                        key += $"_{i}";
+                        key += $"_{index}";
+                    }
+                    key += $"_{i}";
 
-                        var value = dictionary.GetValue(key);
-                        if (value == null)
+                    var value = dictionary.GetValue(key);
+                    if (value == null)
+                    {
+                        if (isFirstProperty)
                         {
-                            if (isFirstProperty)
-                            {
-                                flag = false;
-                                break;
-                            }
-
-                            continue;
+                            flag = false;
+                            break;
                         }
-
-                        isFirstProperty = false;
-                        propertie.SetValue(obj, Convert.ChangeType(value, propertie.PropertyType));
+                        continue;
                     }
+
+                    isFirstProperty = false;
+                    item.SetValue(obj, Convert.ChangeType(value, item.PropertyType));
                 }
 
                 if (!flag)
@@ -65,11 +119,24 @@ namespace Essensoft.AspNetCore.Payment.WeChatPay.Parser
                     return list;
                 }
 
-                list.Add((T)obj);
+                list.Add(obj);
                 i++;
             }
 
             return list;
         }
+
+        private string GetKeyName(PropertyInfo item)
+        {
+            var key = item.GetCustomAttributes(typeof(XmlElementAttribute), true);
+            if (key.Length > 0)
+            {
+                return ((XmlElementAttribute)key[0]).ElementName;
+            }
+            else
+            {
+                throw new WeChatPayException($"{item.Name} undefined key name.");
+            }
+        }
     }
 }

+ 21 - 34
src/Essensoft.AspNetCore.Payment.WeChatPay/Parser/WeChatPayXmlParser.cs

@@ -6,10 +6,6 @@ using System.Xml.Serialization;
 
 namespace Essensoft.AspNetCore.Payment.WeChatPay.Parser
 {
-    /// <summary>
-    /// WeChatPay XML 解释器。
-    /// </summary>
-    /// <typeparam name="T"></typeparam>
     public class WeChatPayXmlParser<T> : IWeChatPayParser<T> where T : WeChatPayObject
     {
         public T Parse(string body)
@@ -19,17 +15,17 @@ namespace Essensoft.AspNetCore.Payment.WeChatPay.Parser
 
             try
             {
-                using (var sr = new StringReader(body))
-                {
-                    var xmldes = new XmlSerializer(typeof(T));
-                    result = (T)xmldes.Deserialize(sr);
-                }
-
                 var bodyDoc = XDocument.Parse(body).Element("xml");
                 foreach (var element in bodyDoc.Elements())
                 {
                     parameters.Add(element.Name.LocalName, element.Value);
                 }
+
+                using (var sr = new StringReader(body))
+                {
+                    var xmldes = new XmlSerializer(typeof(T));
+                    result = (T)xmldes.Deserialize(sr);
+                }
             }
             catch { }
 
@@ -38,28 +34,24 @@ namespace Essensoft.AspNetCore.Payment.WeChatPay.Parser
                 result = Activator.CreateInstance<T>();
             }
 
-            if (result != null)
-            {
-                result.Body = body;
-
-                result.Parameters = parameters;
-
-                result.Execute();
-            }
-
+            result.ResponseBody = body;
+            result.ResponseParameters = parameters;
+            result.Execute();
             return result;
         }
 
-        public T Parse(string body, string data)
+        public T Parse(string body, string root)
         {
             T result = null;
+            var newBody = string.Empty;
             var parameters = new WeChatPayDictionary();
 
             try
             {
                 var bodyDoc = XDocument.Parse(body).Element("xml");
-                var rootDoc = XDocument.Parse(data).Element("root");
+                var rootDoc = XDocument.Parse(root).Element("root");
                 bodyDoc.Add(rootDoc.Nodes());
+                newBody = bodyDoc.ToString();
 
                 var sb = new StringBuilder();
                 using (var writer = new StringWriter(sb))
@@ -67,15 +59,15 @@ namespace Essensoft.AspNetCore.Payment.WeChatPay.Parser
                     bodyDoc.Save(writer, SaveOptions.None);
                 }
 
-                using (var sr = new StringReader(sb.ToString()))
+                foreach (var xe in bodyDoc.Elements())
                 {
-                    var xmldes = new XmlSerializer(typeof(T));
-                    result = (T)xmldes.Deserialize(sr);
+                    parameters.Add(xe.Name.LocalName, xe.Value);
                 }
 
-                foreach (var xe in bodyDoc.Elements())
+                using (var sr = new StringReader(sb.ToString()))
                 {
-                    parameters.Add(xe.Name.LocalName, xe.Value);
+                    var xmldes = new XmlSerializer(typeof(T));
+                    result = (T)xmldes.Deserialize(sr);
                 }
             }
             catch { }
@@ -85,14 +77,9 @@ namespace Essensoft.AspNetCore.Payment.WeChatPay.Parser
                 result = Activator.CreateInstance<T>();
             }
 
-            if (result != null)
-            {
-                result.Body = data;
-
-                result.Parameters = parameters;
-
-                result.Execute();
-            }
+            result.ResponseBody = newBody;
+            result.ResponseParameters = parameters;
+            result.Execute();
 
             return result;
         }

+ 0 - 46
src/Essensoft.AspNetCore.Payment.WeChatPay/Request/WeChatPayAppCallPaymentRequest.cs

@@ -1,46 +0,0 @@
-using System.Collections.Generic;
-
-namespace Essensoft.AspNetCore.Payment.WeChatPay.Request
-{
-    /// <summary>
-    /// APP支付 调起支付
-    /// </summary>
-    public class WeChatPayAppCallPaymentRequest : IWeChatPayCallRequest
-    {
-        /// <summary>
-        /// 应用ID
-        /// </summary>
-        public string AppId { get; set; }
-
-        /// <summary>
-        /// 子商户号
-        /// </summary>
-        public string PartnerId { get; set; }
-
-        /// <summary>
-        /// 预支付交易会话ID
-        /// </summary>
-        public string PrepayId { get; set; }
-
-        /// <summary>
-        /// 扩展字段
-        /// </summary>
-        public string Package { get; set; } = "Sign=WXPay";
-
-        #region IWeChatPayCalcRequest Members
-
-        public IDictionary<string, string> GetParameters()
-        {
-            var parameters = new WeChatPayDictionary
-            {
-                { "appid", AppId },
-                { "partnerid", PartnerId },
-                { "prepayid", PrepayId },
-                { "package", Package }
-            };
-            return parameters;
-        }
-
-        #endregion
-    }
-}

+ 45 - 0
src/Essensoft.AspNetCore.Payment.WeChatPay/Request/WeChatPayAppSdkRequest.cs

@@ -0,0 +1,45 @@
+using System.Collections.Generic;
+using Essensoft.AspNetCore.Payment.WeChatPay.Utility;
+
+namespace Essensoft.AspNetCore.Payment.WeChatPay.Request
+{
+    /// <summary>
+    /// APP支付 调起支付
+    /// </summary>
+    public class WeChatPayAppSdkRequest : IWeChatPaySdkRequest
+    {
+        /// <summary>
+        /// 预支付交易会话ID
+        /// </summary>
+        public string PrepayId { get; set; }
+
+        /// <summary>
+        /// 扩展字段
+        /// </summary>
+        public string Package { get; set; } = "Sign=WXPay";
+
+        #region IWeChatPaySdkRequest Members
+
+        public IDictionary<string, string> GetParameters()
+        {
+            var parameters = new WeChatPayDictionary
+            {
+                { "prepayid", PrepayId },
+                { "package", Package }
+            };
+            return parameters;
+        }
+
+        public void PrimaryHandler(WeChatPayOptions options, WeChatPayDictionary sortedTxtParams)
+        {
+            sortedTxtParams.Add(WeChatPayConsts.noncestr, WeChatPayUtility.GenerateNonceStr());
+            sortedTxtParams.Add(WeChatPayConsts.timestamp, WeChatPayUtility.GetTimeStamp());
+            sortedTxtParams.Add(WeChatPayConsts.appid, options.AppId);
+            sortedTxtParams.Add(WeChatPayConsts.partnerid, options.MchId);
+
+            sortedTxtParams.Add(WeChatPayConsts.sign, WeChatPaySignature.SignWithKey(sortedTxtParams, options.Key, WeChatPaySignType.MD5));
+        }
+
+        #endregion
+    }
+}

+ 19 - 10
src/Essensoft.AspNetCore.Payment.WeChatPay/Request/WeChatPayBatchQueryCommentRequest.cs → src/Essensoft.AspNetCore.Payment.WeChatPay/Request/WeChatPayBillCommentSpBatchQueryCommentRequest.cs

@@ -1,18 +1,14 @@
 using System.Collections.Generic;
 using Essensoft.AspNetCore.Payment.WeChatPay.Response;
+using Essensoft.AspNetCore.Payment.WeChatPay.Utility;
 
 namespace Essensoft.AspNetCore.Payment.WeChatPay.Request
 {
     /// <summary>
     /// 拉取订单评价数据
     /// </summary>
-    public class WeChatPayBatchQueryCommentRequest : IWeChatPayCertificateRequest<WeChatPayBatchQueryCommentResponse>
+    public class WeChatPayBillCommentSpBatchQueryCommentRequest : IWeChatPayCertRequest<WeChatPayBillCommentSpBatchQueryCommentResponse>
     {
-        /// <summary>
-        /// 应用ID
-        /// </summary>
-        public string AppId { get; set; }
-
         /// <summary>
         /// 开始时间
         /// </summary>
@@ -26,12 +22,12 @@ namespace Essensoft.AspNetCore.Payment.WeChatPay.Request
         /// <summary>
         /// 位移
         /// </summary>
-        public string Offset { get; set; }
+        public uint Offset { get; set; }
 
         /// <summary>
         /// 条数
         /// </summary>
-        public string Limit { get; set; }
+        public uint Limit { get; set; }
 
         #region IWeChatPayCertificateRequest Members
 
@@ -44,7 +40,6 @@ namespace Essensoft.AspNetCore.Payment.WeChatPay.Request
         {
             var parameters = new WeChatPayDictionary
             {
-                { "appid", AppId },
                 { "begin_time", BeginTime },
                 { "end_time", EndTime },
                 { "offset", Offset },
@@ -53,7 +48,21 @@ namespace Essensoft.AspNetCore.Payment.WeChatPay.Request
             return parameters;
         }
 
-        public bool IsCheckResponseSign()
+        public WeChatPaySignType GetSignType()
+        {
+            return WeChatPaySignType.MD5;
+        }
+
+        public void PrimaryHandler(WeChatPayOptions options, WeChatPaySignType signType, WeChatPayDictionary sortedTxtParams)
+        {
+            sortedTxtParams.Add(WeChatPayConsts.nonce_str, WeChatPayUtility.GenerateNonceStr());
+            sortedTxtParams.Add(WeChatPayConsts.appid, options.AppId);
+            sortedTxtParams.Add(WeChatPayConsts.mch_id, options.MchId);
+
+            sortedTxtParams.Add(WeChatPayConsts.sign, WeChatPaySignature.SignWithKey(sortedTxtParams, options.Key, signType));
+        }
+
+        public bool GetNeedCheckSign()
         {
             return false;
         }

+ 19 - 9
src/Essensoft.AspNetCore.Payment.WeChatPay/Request/WeChatPayCloseOrderRequest.cs

@@ -1,5 +1,6 @@
-using System.Collections.Generic;
+using System.Collections.Generic;
 using Essensoft.AspNetCore.Payment.WeChatPay.Response;
+using Essensoft.AspNetCore.Payment.WeChatPay.Utility;
 
 namespace Essensoft.AspNetCore.Payment.WeChatPay.Request
 {
@@ -9,12 +10,7 @@ namespace Essensoft.AspNetCore.Payment.WeChatPay.Request
     public class WeChatPayCloseOrderRequest : IWeChatPayRequest<WeChatPayCloseOrderResponse>
     {
         /// <summary>
-        /// 应用ID
-        /// </summary>
-        public string AppId { get; set; }
-
-        /// <summary>
-        /// 子商户公众账号ID
+        /// 子商户应用号
         /// </summary>
         public string SubAppId { get; set; }
 
@@ -39,7 +35,6 @@ namespace Essensoft.AspNetCore.Payment.WeChatPay.Request
         {
             var parameters = new WeChatPayDictionary
             {
-                { "appid", AppId },
                 { "sub_appid", SubAppId },
                 { "sub_mch_id", SubMchId },
                 { "out_trade_no", OutTradeNo }
@@ -47,7 +42,22 @@ namespace Essensoft.AspNetCore.Payment.WeChatPay.Request
             return parameters;
         }
 
-        public bool IsCheckResponseSign()
+        public WeChatPaySignType GetSignType()
+        {
+            return WeChatPaySignType.MD5;
+        }
+
+
+        public void PrimaryHandler(WeChatPayOptions options, WeChatPaySignType signType, WeChatPayDictionary sortedTxtParams)
+        {
+            sortedTxtParams.Add(WeChatPayConsts.nonce_str, WeChatPayUtility.GenerateNonceStr());
+            sortedTxtParams.Add(WeChatPayConsts.appid, options.AppId);
+            sortedTxtParams.Add(WeChatPayConsts.mch_id, options.MchId);
+
+            sortedTxtParams.Add(WeChatPayConsts.sign, WeChatPaySignature.SignWithKey(sortedTxtParams, options.Key, signType));
+        }
+
+        public bool GetNeedCheckSign()
         {
             return true;
         }

+ 27 - 13
src/Essensoft.AspNetCore.Payment.WeChatPay/Request/WeChatPayDepositConsumeRequest.cs

@@ -1,20 +1,16 @@
-using System.Collections.Generic;
+using System.Collections.Generic;
 using Essensoft.AspNetCore.Payment.WeChatPay.Response;
+using Essensoft.AspNetCore.Payment.WeChatPay.Utility;
 
 namespace Essensoft.AspNetCore.Payment.WeChatPay.Request
 {
     /// <summary>
     /// 酒店押金 - 消费押金
     /// </summary>
-    public class WeChatPayDepositConsumeRequest : IWeChatPayCertificateRequest<WeChatPayDepositConsumeResponse>
+    public class WeChatPayDepositConsumeRequest : IWeChatPayCertRequest<WeChatPayDepositConsumeResponse>
     {
         /// <summary>
-        /// 应用ID
-        /// </summary>
-        public string AppId { get; set; }
-
-        /// <summary>
-        /// 子商户公众账号ID
+        /// 子商户应用号
         /// </summary>
         public string SubAppId { get; set; }
 
@@ -36,12 +32,12 @@ namespace Essensoft.AspNetCore.Payment.WeChatPay.Request
         /// <summary>
         /// 押金总金额
         /// </summary>
-        public string TotalFee { get; set; }
+        public int TotalFee { get; set; }
 
         /// <summary>
         /// 消费金额
         /// </summary>
-        public string ConsumeFee { get; set; }
+        public int ConsumeFee { get; set; }
 
         /// <summary>
         /// 货币类型
@@ -60,11 +56,10 @@ namespace Essensoft.AspNetCore.Payment.WeChatPay.Request
         {
             var parameters = new WeChatPayDictionary
             {
-                { "appid", AppId },
                 { "sub_appid", SubAppId },
                 { "sub_mch_id", SubMchId },
                 { "transaction_id", TransactionId },
-                { "out_trade_no",OutTradeNo},
+                { "out_trade_no", OutTradeNo },
                 { "total_fee", TotalFee },
                 { "consume_fee", ConsumeFee },
                 { "fee_type", FeeType },
@@ -72,7 +67,26 @@ namespace Essensoft.AspNetCore.Payment.WeChatPay.Request
             return parameters;
         }
 
-        public bool IsCheckResponseSign()
+        public WeChatPaySignType GetSignType()
+        {
+            return WeChatPaySignType.HMAC_SHA256;
+        }
+
+        public void PrimaryHandler(WeChatPayOptions options, WeChatPaySignType signType, WeChatPayDictionary sortedTxtParams)
+        {
+            sortedTxtParams.Add(WeChatPayConsts.nonce_str, WeChatPayUtility.GenerateNonceStr());
+            sortedTxtParams.Add(WeChatPayConsts.appid, options.AppId);
+            sortedTxtParams.Add(WeChatPayConsts.mch_id, options.MchId);
+
+            if (signType == WeChatPaySignType.HMAC_SHA256)
+            {
+                sortedTxtParams.Add(WeChatPayConsts.sign_type, WeChatPayConsts.HMAC_SHA256);
+            }
+
+            sortedTxtParams.Add(WeChatPayConsts.sign, WeChatPaySignature.SignWithKey(sortedTxtParams, options.Key, signType));
+        }
+
+        public bool GetNeedCheckSign()
         {
             return true;
         }

+ 153 - 0
src/Essensoft.AspNetCore.Payment.WeChatPay/Request/WeChatPayDepositFacePayRequest.cs

@@ -0,0 +1,153 @@
+using System.Collections.Generic;
+using Essensoft.AspNetCore.Payment.WeChatPay.Response;
+using Essensoft.AspNetCore.Payment.WeChatPay.Utility;
+
+namespace Essensoft.AspNetCore.Payment.WeChatPay.Request
+{
+    /// <summary>
+    /// 酒店押金 - 支付押金(人脸支付)
+    /// </summary>
+    public class WeChatPayDepositFacePayRequest : IWeChatPayRequest<WeChatPayDepositFacePayResponse>
+    {
+        /// <summary>
+        /// 是否押金支付
+        /// </summary>
+        public string Deposit { get; set; }
+
+        /// <summary>
+        /// 子商户应用号
+        /// </summary>
+        public string SubAppId { get; set; }
+
+        /// <summary>
+        /// 子商户号
+        /// </summary>
+        public string SubMchId { get; set; }
+
+        /// <summary>
+        /// 设备号
+        /// </summary>
+        public string DeviceInfo { get; set; }
+
+        /// <summary>
+        /// 商品描述
+        /// </summary>
+        public string Body { get; set; }
+
+        /// <summary>
+        /// 商品详情
+        /// </summary>
+        public string Detail { get; set; }
+
+        /// <summary>
+        /// 附加数据
+        /// </summary>
+        public string Attach { get; set; }
+
+        /// <summary>
+        /// 商户订单号
+        /// </summary>
+        public string OutTradeNo { get; set; }
+
+        /// <summary>
+        /// 总金额
+        /// </summary>
+        public int TotalFee { get; set; }
+
+        /// <summary>
+        /// 货币类型
+        /// </summary>
+        public string FeeType { get; set; }
+
+        /// <summary>
+        /// 终端IP
+        /// </summary>
+        public string SpBillCreateIp { get; set; }
+
+        /// <summary>
+        /// 订单优惠标记
+        /// </summary>
+        public string GoodsTag { get; set; }
+
+        /// <summary>
+        /// 指定支付方式
+        /// </summary>
+        public string LimitPay { get; set; }
+
+        /// <summary>
+        /// 交易起始时间
+        /// </summary>
+        public string TimeStart { get; set; }
+
+        /// <summary>
+        /// 交易结束时间
+        /// </summary>
+        public string TimeExpire { get; set; }
+
+        /// <summary>
+        /// 用户标识
+        /// </summary>
+        public string OpenId { get; set; }
+
+        /// <summary>
+        /// 授权码
+        /// </summary>
+        public string FaceCode { get; set; }
+
+        #region IWeChatPayRequest Members
+
+        public string GetRequestUrl()
+        {
+            return "https://api.mch.weixin.qq.com/deposit/facepay";
+        }
+
+        public IDictionary<string, string> GetParameters()
+        {
+            var parameters = new WeChatPayDictionary
+            {
+                { "deposit", Deposit },
+                { "sub_appid", SubAppId },
+                { "sub_mch_id", SubMchId },
+                { "device_info", DeviceInfo },
+                { "body", Body },
+                { "detail", Detail },
+                { "attach", Attach },
+                { "out_trade_no", OutTradeNo },
+                { "total_fee", TotalFee },
+                { "fee_type", FeeType },
+                { "spbill_create_ip", SpBillCreateIp },
+                { "goods_tag", GoodsTag },
+                { "limit_pay", LimitPay },
+                { "time_start", TimeStart },
+                { "time_expire", TimeExpire },
+                { "openid", OpenId },
+                { "face_code", FaceCode },
+            };
+            return parameters;
+        }
+
+        public WeChatPaySignType GetSignType()
+        {
+            return WeChatPaySignType.HMAC_SHA256;
+        }
+
+        public void PrimaryHandler(WeChatPayOptions options, WeChatPaySignType signType, WeChatPayDictionary sortedTxtParams)
+        {
+            sortedTxtParams.Add(WeChatPayConsts.nonce_str, WeChatPayUtility.GenerateNonceStr());
+            sortedTxtParams.Add(WeChatPayConsts.appid, options.AppId);
+            sortedTxtParams.Add(WeChatPayConsts.mch_id, options.MchId);
+
+            if (signType == WeChatPaySignType.HMAC_SHA256)
+            {
+                sortedTxtParams.Add(WeChatPayConsts.sign_type, WeChatPayConsts.HMAC_SHA256);
+            }
+        }
+
+        public bool GetNeedCheckSign()
+        {
+            return true;
+        }
+
+        #endregion
+    }
+}

+ 24 - 12
src/Essensoft.AspNetCore.Payment.WeChatPay/Request/WeChatPayDepositMicroPayRequest.cs

@@ -1,25 +1,21 @@
 using System.Collections.Generic;
 using Essensoft.AspNetCore.Payment.WeChatPay.Response;
+using Essensoft.AspNetCore.Payment.WeChatPay.Utility;
 
 namespace Essensoft.AspNetCore.Payment.WeChatPay.Request
 {
     /// <summary>
-    /// 酒店押金 - 支付押金
+    /// 酒店押金 - 支付押金(付款码支付)
     /// </summary>
     public class WeChatPayDepositMicroPayRequest : IWeChatPayRequest<WeChatPayDepositMicroPayResponse>
     {
         /// <summary>
         /// 是否押金支付
         /// </summary>
-        public string Deposit { get; set; } = "Y";
+        public string Deposit { get; set; }
 
         /// <summary>
-        /// 应用ID
-        /// </summary>
-        public string AppId { get; set; }
-
-        /// <summary>
-        /// 子商户公众账号ID
+        /// 子商户应用号
         /// </summary>
         public string SubAppId { get; set; }
 
@@ -66,7 +62,7 @@ namespace Essensoft.AspNetCore.Payment.WeChatPay.Request
         /// <summary>
         /// 终端IP
         /// </summary>
-        public string SpbillCreateIp { get; set; }
+        public string SpBillCreateIp { get; set; }
 
         /// <summary>
         /// 订单优惠标记
@@ -110,7 +106,6 @@ namespace Essensoft.AspNetCore.Payment.WeChatPay.Request
             var parameters = new WeChatPayDictionary
             {
                 { "deposit", Deposit },
-                { "appid", AppId },
                 { "sub_appid", SubAppId },
                 { "sub_mch_id", SubMchId },
                 { "device_info", DeviceInfo },
@@ -120,7 +115,7 @@ namespace Essensoft.AspNetCore.Payment.WeChatPay.Request
                 { "out_trade_no", OutTradeNo },
                 { "total_fee", TotalFee },
                 { "fee_type", FeeType },
-                { "spbill_create_ip", SpbillCreateIp },
+                { "spbill_create_ip", SpBillCreateIp },
                 { "goods_tag", GoodsTag },
                 { "limit_pay", LimitPay },
                 { "time_start", TimeStart },
@@ -131,7 +126,24 @@ namespace Essensoft.AspNetCore.Payment.WeChatPay.Request
             return parameters;
         }
 
-        public bool IsCheckResponseSign()
+        public WeChatPaySignType GetSignType()
+        {
+            return WeChatPaySignType.HMAC_SHA256;
+        }
+
+        public void PrimaryHandler(WeChatPayOptions options, WeChatPaySignType signType, WeChatPayDictionary sortedTxtParams)
+        {
+            sortedTxtParams.Add(WeChatPayConsts.nonce_str, WeChatPayUtility.GenerateNonceStr());
+            sortedTxtParams.Add(WeChatPayConsts.appid, options.AppId);
+            sortedTxtParams.Add(WeChatPayConsts.mch_id, options.MchId);
+
+            if (signType == WeChatPaySignType.HMAC_SHA256)
+            {
+                sortedTxtParams.Add(WeChatPayConsts.sign_type, WeChatPayConsts.HMAC_SHA256);
+            }
+        }
+
+        public bool GetNeedCheckSign()
         {
             return true;
         }

+ 21 - 9
src/Essensoft.AspNetCore.Payment.WeChatPay/Request/WeChatPayDepositOrderQueryRequest.cs

@@ -1,5 +1,6 @@
-using System.Collections.Generic;
+using System.Collections.Generic;
 using Essensoft.AspNetCore.Payment.WeChatPay.Response;
+using Essensoft.AspNetCore.Payment.WeChatPay.Utility;
 
 namespace Essensoft.AspNetCore.Payment.WeChatPay.Request
 {
@@ -9,12 +10,7 @@ namespace Essensoft.AspNetCore.Payment.WeChatPay.Request
     public class WeChatPayDepositOrderQueryRequest : IWeChatPayRequest<WeChatPayDepositOrderQueryResponse>
     {
         /// <summary>
-        /// 应用ID
-        /// </summary>
-        public string AppId { get; set; }
-
-        /// <summary>
-        /// 子商户公众账号ID
+        /// 子商户应用号
         /// </summary>
         public string SubAppId { get; set; }
 
@@ -44,7 +40,6 @@ namespace Essensoft.AspNetCore.Payment.WeChatPay.Request
         {
             var parameters = new WeChatPayDictionary
             {
-                { "appid", AppId },
                 { "sub_appid", SubAppId },
                 { "sub_mch_id", SubMchId },
                 { "transaction_id", TransactionId },
@@ -53,7 +48,24 @@ namespace Essensoft.AspNetCore.Payment.WeChatPay.Request
             return parameters;
         }
 
-        public bool IsCheckResponseSign()
+        public WeChatPaySignType GetSignType()
+        {
+            return WeChatPaySignType.HMAC_SHA256;
+        }
+
+        public void PrimaryHandler(WeChatPayOptions options, WeChatPaySignType signType, WeChatPayDictionary sortedTxtParams)
+        {
+            sortedTxtParams.Add(WeChatPayConsts.nonce_str, WeChatPayUtility.GenerateNonceStr());
+            sortedTxtParams.Add(WeChatPayConsts.appid, options.AppId);
+            sortedTxtParams.Add(WeChatPayConsts.mch_id, options.MchId);
+
+            if (signType == WeChatPaySignType.HMAC_SHA256)
+            {
+                sortedTxtParams.Add(WeChatPayConsts.sign_type, WeChatPayConsts.HMAC_SHA256);
+            }
+        }
+
+        public bool GetNeedCheckSign()
         {
             return true;
         }

+ 21 - 9
src/Essensoft.AspNetCore.Payment.WeChatPay/Request/WeChatPayDepositRefundQueryRequest.cs

@@ -1,5 +1,6 @@
-using System.Collections.Generic;
+using System.Collections.Generic;
 using Essensoft.AspNetCore.Payment.WeChatPay.Response;
+using Essensoft.AspNetCore.Payment.WeChatPay.Utility;
 
 namespace Essensoft.AspNetCore.Payment.WeChatPay.Request
 {
@@ -9,12 +10,7 @@ namespace Essensoft.AspNetCore.Payment.WeChatPay.Request
     public class WeChatPayDepositRefundQueryRequest : IWeChatPayRequest<WeChatPayDepositRefundQueryResponse>
     {
         /// <summary>
-        /// 应用ID
-        /// </summary>
-        public string AppId { get; set; }
-
-        /// <summary>
-        /// 子商户公众账号ID
+        /// 子商户应用号
         /// </summary>
         public string SubAppId { get; set; }
 
@@ -44,7 +40,6 @@ namespace Essensoft.AspNetCore.Payment.WeChatPay.Request
         {
             var parameters = new WeChatPayDictionary
             {
-                { "appid", AppId },
                 { "sub_appid", SubAppId },
                 { "sub_mch_id", SubMchId },
                 { "out_refund_no", OutRefundNo },
@@ -53,7 +48,24 @@ namespace Essensoft.AspNetCore.Payment.WeChatPay.Request
             return parameters;
         }
 
-        public bool IsCheckResponseSign()
+        public WeChatPaySignType GetSignType()
+        {
+            return WeChatPaySignType.HMAC_SHA256;
+        }
+
+        public void PrimaryHandler(WeChatPayOptions options, WeChatPaySignType signType, WeChatPayDictionary sortedTxtParams)
+        {
+            sortedTxtParams.Add(WeChatPayConsts.nonce_str, WeChatPayUtility.GenerateNonceStr());
+            sortedTxtParams.Add(WeChatPayConsts.appid, options.AppId);
+            sortedTxtParams.Add(WeChatPayConsts.mch_id, options.MchId);
+
+            if (signType == WeChatPaySignType.HMAC_SHA256)
+            {
+                sortedTxtParams.Add(WeChatPayConsts.sign_type, WeChatPayConsts.HMAC_SHA256);
+            }
+        }
+
+        public bool GetNeedCheckSign()
         {
             return true;
         }

+ 24 - 10
src/Essensoft.AspNetCore.Payment.WeChatPay/Request/WeChatPayDepositRefundRequest.cs

@@ -1,20 +1,16 @@
-using System.Collections.Generic;
+using System.Collections.Generic;
 using Essensoft.AspNetCore.Payment.WeChatPay.Response;
+using Essensoft.AspNetCore.Payment.WeChatPay.Utility;
 
 namespace Essensoft.AspNetCore.Payment.WeChatPay.Request
 {
     /// <summary>
     /// 酒店押金 - 申请退款
     /// </summary>
-    public class WeChatPayDepositRefundRequest : IWeChatPayCertificateRequest<WeChatPayDepositRefundResponse>
+    public class WeChatPayDepositRefundRequest : IWeChatPayCertRequest<WeChatPayDepositRefundResponse>
     {
         /// <summary>
-        /// 应用ID
-        /// </summary>
-        public string AppId { get; set; }
-
-        /// <summary>
-        /// 子商户公众账号ID
+        /// 子商户应用号
         /// </summary>
         public string SubAppId { get; set; }
 
@@ -69,7 +65,6 @@ namespace Essensoft.AspNetCore.Payment.WeChatPay.Request
         {
             var parameters = new WeChatPayDictionary
             {
-                { "appid", AppId },
                 { "sub_appid", SubAppId },
                 { "sub_mch_id", SubMchId },
                 { "transaction_id", TransactionId },
@@ -83,7 +78,26 @@ namespace Essensoft.AspNetCore.Payment.WeChatPay.Request
             return parameters;
         }
 
-        public bool IsCheckResponseSign()
+        public WeChatPaySignType GetSignType()
+        {
+            return WeChatPaySignType.HMAC_SHA256;
+        }
+
+        public void PrimaryHandler(WeChatPayOptions options, WeChatPaySignType signType, WeChatPayDictionary sortedTxtParams)
+        {
+            sortedTxtParams.Add(WeChatPayConsts.nonce_str, WeChatPayUtility.GenerateNonceStr());
+            sortedTxtParams.Add(WeChatPayConsts.appid, options.AppId);
+            sortedTxtParams.Add(WeChatPayConsts.mch_id, options.MchId);
+
+            if (signType == WeChatPaySignType.HMAC_SHA256)
+            {
+                sortedTxtParams.Add(WeChatPayConsts.sign_type, WeChatPayConsts.HMAC_SHA256);
+            }
+
+            sortedTxtParams.Add(WeChatPayConsts.sign, WeChatPaySignature.SignWithKey(sortedTxtParams, options.Key, signType));
+        }
+
+        public bool GetNeedCheckSign()
         {
             return true;
         }

+ 23 - 9
src/Essensoft.AspNetCore.Payment.WeChatPay/Request/WeChatPayDepositReverseRequest.cs

@@ -1,20 +1,16 @@
 using System.Collections.Generic;
 using Essensoft.AspNetCore.Payment.WeChatPay.Response;
+using Essensoft.AspNetCore.Payment.WeChatPay.Utility;
 
 namespace Essensoft.AspNetCore.Payment.WeChatPay.Request
 {
     /// <summary>
     /// 酒店押金 - 撤销订单
     /// </summary>
-    public class WeChatPayDepositReverseRequest : IWeChatPayCertificateRequest<WeChatPayDepositReverseResponse>
+    public class WeChatPayDepositReverseRequest : IWeChatPayCertRequest<WeChatPayDepositReverseResponse>
     {
         /// <summary>
-        /// 应用ID
-        /// </summary>
-        public string AppId { get; set; }
-
-        /// <summary>
-        /// 子商户公众账号ID
+        /// 子商户应用号
         /// </summary>
         public string SubAppId { get; set; }
 
@@ -44,7 +40,6 @@ namespace Essensoft.AspNetCore.Payment.WeChatPay.Request
         {
             var parameters = new WeChatPayDictionary
             {
-                { "appid", AppId },
                 { "sub_appid", SubAppId },
                 { "sub_mch_id", SubMchId },
                 { "transaction_id", TransactionId },
@@ -53,7 +48,26 @@ namespace Essensoft.AspNetCore.Payment.WeChatPay.Request
             return parameters;
         }
 
-        public bool IsCheckResponseSign()
+        public WeChatPaySignType GetSignType()
+        {
+            return WeChatPaySignType.HMAC_SHA256;
+        }
+
+        public void PrimaryHandler(WeChatPayOptions options, WeChatPaySignType signType, WeChatPayDictionary sortedTxtParams)
+        {
+            sortedTxtParams.Add(WeChatPayConsts.nonce_str, WeChatPayUtility.GenerateNonceStr());
+            sortedTxtParams.Add(WeChatPayConsts.appid, options.AppId);
+            sortedTxtParams.Add(WeChatPayConsts.mch_id, options.MchId);
+
+            if (signType == WeChatPaySignType.HMAC_SHA256)
+            {
+                sortedTxtParams.Add(WeChatPayConsts.sign_type, WeChatPayConsts.HMAC_SHA256);
+            }
+
+            sortedTxtParams.Add(WeChatPayConsts.sign, WeChatPaySignature.SignWithKey(sortedTxtParams, options.Key, signType));
+        }
+
+        public bool GetNeedCheckSign()
         {
             return true;
         }

+ 18 - 8
src/Essensoft.AspNetCore.Payment.WeChatPay/Request/WeChatPayDownloadBillRequest.cs

@@ -1,5 +1,6 @@
 using System.Collections.Generic;
 using Essensoft.AspNetCore.Payment.WeChatPay.Response;
+using Essensoft.AspNetCore.Payment.WeChatPay.Utility;
 
 namespace Essensoft.AspNetCore.Payment.WeChatPay.Request
 {
@@ -9,12 +10,7 @@ namespace Essensoft.AspNetCore.Payment.WeChatPay.Request
     public class WeChatPayDownloadBillRequest : IWeChatPayRequest<WeChatPayDownloadBillResponse>
     {
         /// <summary>
-        /// 应用ID
-        /// </summary>
-        public string AppId { get; set; }
-
-        /// <summary>
-        /// 子商户公众账号ID
+        /// 子商户应用号
         /// </summary>
         public string SubAppId { get; set; }
 
@@ -49,7 +45,6 @@ namespace Essensoft.AspNetCore.Payment.WeChatPay.Request
         {
             var parameters = new WeChatPayDictionary
             {
-                { "appid", AppId },
                 { "sub_appid", SubAppId },
                 { "sub_mch_id", SubMchId },
                 { "bill_date", BillDate },
@@ -59,7 +54,22 @@ namespace Essensoft.AspNetCore.Payment.WeChatPay.Request
             return parameters;
         }
 
-        public bool IsCheckResponseSign()
+        public WeChatPaySignType GetSignType()
+        {
+            return WeChatPaySignType.MD5;
+        }
+
+
+        public void PrimaryHandler(WeChatPayOptions options, WeChatPaySignType signType, WeChatPayDictionary sortedTxtParams)
+        {
+            sortedTxtParams.Add(WeChatPayConsts.nonce_str, WeChatPayUtility.GenerateNonceStr());
+            sortedTxtParams.Add(WeChatPayConsts.appid, options.AppId);
+            sortedTxtParams.Add(WeChatPayConsts.mch_id, options.MchId);
+
+            sortedTxtParams.Add(WeChatPayConsts.sign, WeChatPaySignature.SignWithKey(sortedTxtParams, options.Key, signType));
+        }
+
+        public bool GetNeedCheckSign()
         {
             return false;
         }

+ 22 - 8
src/Essensoft.AspNetCore.Payment.WeChatPay/Request/WeChatPayDownloadFundFlowRequest.cs

@@ -1,18 +1,14 @@
 using System.Collections.Generic;
 using Essensoft.AspNetCore.Payment.WeChatPay.Response;
+using Essensoft.AspNetCore.Payment.WeChatPay.Utility;
 
 namespace Essensoft.AspNetCore.Payment.WeChatPay.Request
 {
     /// <summary>
     /// 下载资金账单
     /// </summary>
-    public class WeChatPayDownloadFundFlowRequest : IWeChatPayCertificateRequest<WeChatPayDownloadFundFlowResponse>
+    public class WeChatPayDownloadFundFlowRequest : IWeChatPayCertRequest<WeChatPayDownloadFundFlowResponse>
     {
-        /// <summary>
-        /// 应用ID
-        /// </summary>
-        public string AppId { get; set; }
-
         /// <summary>
         /// 资金账单日期
         /// 下载对账单的日期,格式:20140603
@@ -45,7 +41,6 @@ namespace Essensoft.AspNetCore.Payment.WeChatPay.Request
         {
             var parameters = new WeChatPayDictionary
             {
-                { "appid", AppId },
                 { "bill_date", BillDate },
                 { "account_type", AccountType },
                 { "tar_type", TarType }
@@ -53,7 +48,26 @@ namespace Essensoft.AspNetCore.Payment.WeChatPay.Request
             return parameters;
         }
 
-        public bool IsCheckResponseSign()
+        public WeChatPaySignType GetSignType()
+        {
+            return WeChatPaySignType.HMAC_SHA256;
+        }
+
+        public void PrimaryHandler(WeChatPayOptions options, WeChatPaySignType signType, WeChatPayDictionary sortedTxtParams)
+        {
+            sortedTxtParams.Add(WeChatPayConsts.nonce_str, WeChatPayUtility.GenerateNonceStr());
+            sortedTxtParams.Add(WeChatPayConsts.appid, options.AppId);
+            sortedTxtParams.Add(WeChatPayConsts.mch_id, options.MchId);
+
+            if (signType == WeChatPaySignType.HMAC_SHA256)
+            {
+                sortedTxtParams.Add(WeChatPayConsts.sign_type, WeChatPayConsts.HMAC_SHA256);
+            }
+
+            sortedTxtParams.Add(WeChatPayConsts.sign, WeChatPaySignature.SignWithKey(sortedTxtParams, options.Key, signType));
+        }
+
+        public bool GetNeedCheckSign()
         {
             return false;
         }

+ 17 - 8
src/Essensoft.AspNetCore.Payment.WeChatPay/Request/WeChatPayGetHBInfoRequest.cs

@@ -1,18 +1,14 @@
 using System.Collections.Generic;
 using Essensoft.AspNetCore.Payment.WeChatPay.Response;
+using Essensoft.AspNetCore.Payment.WeChatPay.Utility;
 
 namespace Essensoft.AspNetCore.Payment.WeChatPay.Request
 {
     /// <summary>
     /// 查询红包记录
     /// </summary>
-    public class WeChatPayGetHBInfoRequest : IWeChatPayCertificateRequest<WeChatPayGetHBInfoResponse>
+    public class WeChatPayGetHbInfoRequest : IWeChatPayCertRequest<WeChatPayGetHbInfoResponse>
     {
-        /// <summary>
-        /// 应用ID
-        /// </summary>
-        public string AppId { get; set; }
-
         /// <summary>
         /// 商户订单号
         /// </summary>
@@ -34,14 +30,27 @@ namespace Essensoft.AspNetCore.Payment.WeChatPay.Request
         {
             var parameters = new WeChatPayDictionary
             {
-                { "appid", AppId },
                 { "mch_billno", MchBillNo },
                 { "bill_type", BillType }
             };
             return parameters;
         }
 
-        public bool IsCheckResponseSign()
+        public WeChatPaySignType GetSignType()
+        {
+            return WeChatPaySignType.MD5;
+        }
+
+        public void PrimaryHandler(WeChatPayOptions options, WeChatPaySignType signType, WeChatPayDictionary sortedTxtParams)
+        {
+            sortedTxtParams.Add(WeChatPayConsts.nonce_str, WeChatPayUtility.GenerateNonceStr());
+            sortedTxtParams.Add(WeChatPayConsts.appid, options.AppId);
+            sortedTxtParams.Add(WeChatPayConsts.mch_id, options.MchId);
+
+            sortedTxtParams.Add(WeChatPayConsts.sign, WeChatPaySignature.SignWithKey(sortedTxtParams, options.Key, signType));
+        }
+
+        public bool GetNeedCheckSign()
         {
             return true;
         }

+ 0 - 30
src/Essensoft.AspNetCore.Payment.WeChatPay/Request/WeChatPayGetPublicKeyRequest.cs

@@ -1,30 +0,0 @@
-using System.Collections.Generic;
-using Essensoft.AspNetCore.Payment.WeChatPay.Response;
-
-namespace Essensoft.AspNetCore.Payment.WeChatPay.Request
-{
-    /// <summary>
-    /// 获取RSA加密公钥
-    /// </summary>
-    public class WeChatPayGetPublicKeyRequest : IWeChatPayCertificateRequest<WeChatPayGetPublicKeyResponse>
-    {
-        #region IWeChatPayCertificateRequest Members
-
-        public string GetRequestUrl()
-        {
-            return "https://fraud.mch.weixin.qq.com/risk/getpublickey";
-        }
-
-        public IDictionary<string, string> GetParameters()
-        {
-            return new WeChatPayDictionary();
-        }
-
-        public bool IsCheckResponseSign()
-        {
-            return false;
-        }
-
-        #endregion
-    }
-}

+ 17 - 8
src/Essensoft.AspNetCore.Payment.WeChatPay/Request/WeChatPayGetTransferInfoRequest.cs

@@ -1,18 +1,14 @@
 using System.Collections.Generic;
 using Essensoft.AspNetCore.Payment.WeChatPay.Response;
+using Essensoft.AspNetCore.Payment.WeChatPay.Utility;
 
 namespace Essensoft.AspNetCore.Payment.WeChatPay.Request
 {
     /// <summary>
     /// 查询企业付款
     /// </summary>
-    public class WeChatPayGetTransferInfoRequest : IWeChatPayCertificateRequest<WeChatPayGetTransferInfoResponse>
+    public class WeChatPayGetTransferInfoRequest : IWeChatPayCertRequest<WeChatPayGetTransferInfoResponse>
     {
-        /// <summary>
-        /// 应用ID
-        /// </summary>
-        public string AppId { get; set; }
-
         /// <summary>
         /// 商户订单号
         /// </summary>
@@ -29,13 +25,26 @@ namespace Essensoft.AspNetCore.Payment.WeChatPay.Request
         {
             var parameters = new WeChatPayDictionary
             {
-                { "appid", AppId },
                 { "partner_trade_no", PartnerTradeNo }
             };
             return parameters;
         }
 
-        public bool IsCheckResponseSign()
+        public WeChatPaySignType GetSignType()
+        {
+            return WeChatPaySignType.MD5;
+        }
+
+        public void PrimaryHandler(WeChatPayOptions options, WeChatPaySignType signType, WeChatPayDictionary sortedTxtParams)
+        {
+            sortedTxtParams.Add(WeChatPayConsts.nonce_str, WeChatPayUtility.GenerateNonceStr());
+            sortedTxtParams.Add(WeChatPayConsts.appid, options.AppId);
+            sortedTxtParams.Add(WeChatPayConsts.mch_id, options.MchId);
+
+            sortedTxtParams.Add(WeChatPayConsts.sign, WeChatPaySignature.SignWithKey(sortedTxtParams, options.Key, signType));
+        }
+
+        public bool GetNeedCheckSign()
         {
             return false;
         }

+ 0 - 34
src/Essensoft.AspNetCore.Payment.WeChatPay/Request/WeChatPayH5CallPaymentRequest.cs

@@ -1,34 +0,0 @@
-using System.Collections.Generic;
-
-namespace Essensoft.AspNetCore.Payment.WeChatPay.Request
-{
-    /// <summary>
-    /// 微信内H5调起支付
-    /// </summary>
-    public class WeChatPayH5CallPaymentRequest : IWeChatPayCallRequest
-    {
-        /// <summary>
-        /// 公众号ID
-        /// </summary>
-        public string AppId { get; set; }
-
-        /// <summary>
-        /// 订单详情扩展字符串
-        /// </summary>
-        public string Package { get; set; }
-
-        #region IWeChatPayCalcRequest Members
-
-        public IDictionary<string, string> GetParameters()
-        {
-            var parameters = new WeChatPayDictionary
-            {
-                { "appId", AppId },
-                { "package", Package }
-            };
-            return parameters;
-        }
-
-        #endregion
-    }
-}

+ 39 - 0
src/Essensoft.AspNetCore.Payment.WeChatPay/Request/WeChatPayJsApiSdkRequest.cs

@@ -0,0 +1,39 @@
+using System.Collections.Generic;
+using Essensoft.AspNetCore.Payment.WeChatPay.Utility;
+
+namespace Essensoft.AspNetCore.Payment.WeChatPay.Request
+{
+    /// <summary>
+    /// 微信内H5 调起支付
+    /// </summary>
+    public class WeChatPayJsApiSdkRequest : IWeChatPaySdkRequest
+    {
+        /// <summary>
+        /// 订单详情扩展字符串
+        /// </summary>
+        public string Package { get; set; }
+
+        #region IWeChatPaySdkRequest Members
+
+        public IDictionary<string, string> GetParameters()
+        {
+            var parameters = new WeChatPayDictionary
+            {
+                { "package", Package }
+            };
+            return parameters;
+        }
+
+        public void PrimaryHandler(WeChatPayOptions options, WeChatPayDictionary sortedTxtParams)
+        {
+            sortedTxtParams.Add(WeChatPayConsts.timeStamp, WeChatPayUtility.GetTimeStamp());
+            sortedTxtParams.Add(WeChatPayConsts.nonceStr, WeChatPayUtility.GenerateNonceStr());
+            sortedTxtParams.Add(WeChatPayConsts.appId, options.AppId);
+
+            sortedTxtParams.Add(WeChatPayConsts.signType, WeChatPayConsts.MD5);
+            sortedTxtParams.Add(WeChatPayConsts.paySign, WeChatPaySignature.SignWithKey(sortedTxtParams, options.Key, WeChatPaySignType.MD5));
+        }
+
+        #endregion
+    }
+}

+ 0 - 34
src/Essensoft.AspNetCore.Payment.WeChatPay/Request/WeChatPayLiteAppCallPaymentRequest.cs

@@ -1,34 +0,0 @@
-using System.Collections.Generic;
-
-namespace Essensoft.AspNetCore.Payment.WeChatPay.Request
-{
-    /// <summary>
-    /// 小程序调起支付
-    /// </summary>
-    public class WeChatPayLiteAppCallPaymentRequest : IWeChatPayCallRequest
-    {
-        /// <summary>
-        /// 小程序ID
-        /// </summary>
-        public string AppId { get; set; }
-
-        /// <summary>
-        /// 扩展字段
-        /// </summary>
-        public string Package { get; set; }
-
-        #region IWeChatPayCalcRequest Members
-
-        public IDictionary<string, string> GetParameters()
-        {
-            var parameters = new WeChatPayDictionary
-            {
-                { "appId", AppId },
-                { "package", Package }
-            };
-            return parameters;
-        }
-
-        #endregion
-    }
-}

+ 38 - 0
src/Essensoft.AspNetCore.Payment.WeChatPay/Request/WeChatPayLiteAppReceiveRedPacketSdkRequest.cs

@@ -0,0 +1,38 @@
+using System.Collections.Generic;
+using Essensoft.AspNetCore.Payment.WeChatPay.Utility;
+
+namespace Essensoft.AspNetCore.Payment.WeChatPay.Request
+{
+    /// <summary>
+    /// 小程序红包 - 领取红包
+    /// </summary>
+    public class WeChatPayLiteAppReceiveRedPacketSdkRequest : IWeChatPaySdkRequest
+    {
+        /// <summary>
+        /// 红包详情的扩展
+        /// </summary>
+        public string Package { get; set; }
+
+        #region IWeChatPaySdkRequest Members
+
+        public IDictionary<string, string> GetParameters()
+        {
+            var parameters = new WeChatPayDictionary
+            {
+                { "package", Package }
+            };
+            return parameters;
+        }
+
+        public void PrimaryHandler(WeChatPayOptions options, WeChatPayDictionary sortedTxtParams)
+        {
+            sortedTxtParams.Add(WeChatPayConsts.timeStamp, WeChatPayUtility.GetTimeStamp());
+            sortedTxtParams.Add(WeChatPayConsts.nonceStr, WeChatPayUtility.GenerateNonceStr());
+
+            sortedTxtParams.Add(WeChatPayConsts.signType, WeChatPayConsts.MD5);
+            sortedTxtParams.Add(WeChatPayConsts.paySign, WeChatPaySignature.SignWithKey(sortedTxtParams, options.Key, WeChatPaySignType.MD5));
+        }
+
+        #endregion
+    }
+}

+ 39 - 0
src/Essensoft.AspNetCore.Payment.WeChatPay/Request/WeChatPayLiteAppSdkRequest.cs

@@ -0,0 +1,39 @@
+using System.Collections.Generic;
+using Essensoft.AspNetCore.Payment.WeChatPay.Utility;
+
+namespace Essensoft.AspNetCore.Payment.WeChatPay.Request
+{
+    /// <summary>
+    /// 小程序调起支付
+    /// </summary>
+    public class WeChatPayLiteAppSdkRequest : IWeChatPaySdkRequest
+    {
+        /// <summary>
+        /// 扩展字段
+        /// </summary>
+        public string Package { get; set; }
+
+        #region IWeChatPaySdkRequest Members
+
+        public IDictionary<string, string> GetParameters()
+        {
+            var parameters = new WeChatPayDictionary
+            {
+                { "package", Package }
+            };
+            return parameters;
+        }
+
+        public void PrimaryHandler(WeChatPayOptions options, WeChatPayDictionary sortedTxtParams)
+        {
+            sortedTxtParams.Add(WeChatPayConsts.timeStamp, WeChatPayUtility.GetTimeStamp());
+            sortedTxtParams.Add(WeChatPayConsts.nonceStr, WeChatPayUtility.GenerateNonceStr());
+            sortedTxtParams.Add(WeChatPayConsts.appId, options.AppId);
+
+            sortedTxtParams.Add(WeChatPayConsts.signType, WeChatPayConsts.MD5);
+            sortedTxtParams.Add(WeChatPayConsts.paySign, WeChatPaySignature.SignWithKey(sortedTxtParams, options.Key, WeChatPaySignType.MD5));
+        }
+
+        #endregion
+    }
+}

+ 20 - 10
src/Essensoft.AspNetCore.Payment.WeChatPay/Request/WeChatPayMicroPayRequest.cs

@@ -1,5 +1,6 @@
 using System.Collections.Generic;
 using Essensoft.AspNetCore.Payment.WeChatPay.Response;
+using Essensoft.AspNetCore.Payment.WeChatPay.Utility;
 
 namespace Essensoft.AspNetCore.Payment.WeChatPay.Request
 {
@@ -9,12 +10,7 @@ namespace Essensoft.AspNetCore.Payment.WeChatPay.Request
     public class WeChatPayMicroPayRequest : IWeChatPayRequest<WeChatPayMicroPayResponse>
     {
         /// <summary>
-        /// 应用ID
-        /// </summary>
-        public string AppId { get; set; }
-
-        /// <summary>
-        /// 子商户公众账号ID
+        /// 子商户应用号
         /// </summary>
         public string SubAppId { get; set; }
 
@@ -61,7 +57,7 @@ namespace Essensoft.AspNetCore.Payment.WeChatPay.Request
         /// <summary>
         /// 终端IP
         /// </summary>
-        public string SpbillCreateIp { get; set; }
+        public string SpBillCreateIp { get; set; }
 
         /// <summary>
         /// 订单优惠标记
@@ -104,7 +100,6 @@ namespace Essensoft.AspNetCore.Payment.WeChatPay.Request
         {
             var parameters = new WeChatPayDictionary
             {
-                { "appid", AppId },
                 { "sub_appid", SubAppId },
                 { "sub_mch_id", SubMchId },
                 { "device_info", DeviceInfo },
@@ -114,7 +109,7 @@ namespace Essensoft.AspNetCore.Payment.WeChatPay.Request
                 { "out_trade_no", OutTradeNo },
                 { "total_fee", TotalFee },
                 { "fee_type", FeeType },
-                { "spbill_create_ip", SpbillCreateIp },
+                { "spbill_create_ip", SpBillCreateIp },
                 { "goods_tag", GoodsTag },
                 { "limit_pay", LimitPay },
                 { "time_start", TimeStart },
@@ -125,7 +120,22 @@ namespace Essensoft.AspNetCore.Payment.WeChatPay.Request
             return parameters;
         }
 
-        public bool IsCheckResponseSign()
+        public WeChatPaySignType GetSignType()
+        {
+            return WeChatPaySignType.MD5;
+        }
+
+
+        public void PrimaryHandler(WeChatPayOptions options, WeChatPaySignType signType, WeChatPayDictionary sortedTxtParams)
+        {
+            sortedTxtParams.Add(WeChatPayConsts.nonce_str, WeChatPayUtility.GenerateNonceStr());
+            sortedTxtParams.Add(WeChatPayConsts.appid, options.AppId);
+            sortedTxtParams.Add(WeChatPayConsts.mch_id, options.MchId);
+
+            sortedTxtParams.Add(WeChatPayConsts.sign, WeChatPaySignature.SignWithKey(sortedTxtParams, options.Key, signType));
+        }
+
+        public bool GetNeedCheckSign()
         {
             return true;
         }

+ 81 - 0
src/Essensoft.AspNetCore.Payment.WeChatPay/Request/WeChatPayMultiProfitSharingRequest.cs

@@ -0,0 +1,81 @@
+using System.Collections.Generic;
+using Essensoft.AspNetCore.Payment.WeChatPay.Response;
+using Essensoft.AspNetCore.Payment.WeChatPay.Utility;
+
+namespace Essensoft.AspNetCore.Payment.WeChatPay.Request
+{
+    /// <summary>
+    /// 多次分账
+    /// </summary>
+    public class WeChatPayMultiProfitSharingRequest : IWeChatPayCertRequest<WeChatPayMultiProfitSharingResponse>
+    {
+        /// <summary>
+        /// 子商户号
+        /// </summary>
+        public string SubMchId { get; set; }
+
+        /// <summary>
+        /// 子商户应用号
+        /// </summary>
+        public string SubAppId { get; set; }
+
+        /// <summary>
+        /// 微信订单号
+        /// </summary>
+        public string TransactionId { get; set; }
+
+        /// <summary>
+        /// 商户分账单号
+        /// </summary>
+        public string OutOrderNo { get; set; }
+
+        /// <summary>
+        /// 分账接收方列表
+        /// </summary>
+        public string Receivers { get; set; }
+
+        #region IWeChatPayCertificateRequest Members
+
+        public string GetRequestUrl()
+        {
+            return "https://api.mch.weixin.qq.com/secapi/pay/multiprofitsharing";
+        }
+
+        public IDictionary<string, string> GetParameters()
+        {
+            var parameters = new WeChatPayDictionary
+            {
+                { "sub_mch_id", SubMchId },
+                { "sub_appid", SubAppId },
+                { "transaction_id", TransactionId },
+                { "out_order_no", OutOrderNo },
+                { "receivers", Receivers },
+            };
+            return parameters;
+        }
+
+        public WeChatPaySignType GetSignType()
+        {
+            return WeChatPaySignType.HMAC_SHA256;
+        }
+
+        public void PrimaryHandler(WeChatPayOptions options, WeChatPaySignType signType, WeChatPayDictionary sortedTxtParams)
+        {
+            sortedTxtParams.Add(WeChatPayConsts.nonce_str, WeChatPayUtility.GenerateNonceStr());
+            sortedTxtParams.Add(WeChatPayConsts.appid, options.AppId);
+            sortedTxtParams.Add(WeChatPayConsts.mch_id, options.MchId);
+
+            if (signType == WeChatPaySignType.HMAC_SHA256)
+            {
+                sortedTxtParams.Add(WeChatPayConsts.sign_type, WeChatPayConsts.HMAC_SHA256);
+            }
+        }
+
+        public bool GetNeedCheckSign()
+        {
+            return true;
+        }
+
+        #endregion
+    }
+}

+ 19 - 9
src/Essensoft.AspNetCore.Payment.WeChatPay/Request/WeChatPayOrderQueryRequest.cs

@@ -1,5 +1,6 @@
-using System.Collections.Generic;
+using System.Collections.Generic;
 using Essensoft.AspNetCore.Payment.WeChatPay.Response;
+using Essensoft.AspNetCore.Payment.WeChatPay.Utility;
 
 namespace Essensoft.AspNetCore.Payment.WeChatPay.Request
 {
@@ -9,12 +10,7 @@ namespace Essensoft.AspNetCore.Payment.WeChatPay.Request
     public class WeChatPayOrderQueryRequest : IWeChatPayRequest<WeChatPayOrderQueryResponse>
     {
         /// <summary>
-        /// 应用ID
-        /// </summary>
-        public string AppId { get; set; }
-
-        /// <summary>
-        /// 子商户公众账号ID
+        /// 子商户应用号
         /// </summary>
         public string SubAppId { get; set; }
 
@@ -44,7 +40,6 @@ namespace Essensoft.AspNetCore.Payment.WeChatPay.Request
         {
             var parameters = new WeChatPayDictionary
             {
-                { "appid", AppId },
                 { "sub_appid", SubAppId },
                 { "sub_mch_id", SubMchId },
                 { "transaction_id", TransactionId },
@@ -53,7 +48,22 @@ namespace Essensoft.AspNetCore.Payment.WeChatPay.Request
             return parameters;
         }
 
-        public bool IsCheckResponseSign()
+        public WeChatPaySignType GetSignType()
+        {
+            return WeChatPaySignType.MD5;
+        }
+
+
+        public void PrimaryHandler(WeChatPayOptions options, WeChatPaySignType signType, WeChatPayDictionary sortedTxtParams)
+        {
+            sortedTxtParams.Add(WeChatPayConsts.nonce_str, WeChatPayUtility.GenerateNonceStr());
+            sortedTxtParams.Add(WeChatPayConsts.appid, options.AppId);
+            sortedTxtParams.Add(WeChatPayConsts.mch_id, options.MchId);
+
+            sortedTxtParams.Add(WeChatPayConsts.sign, WeChatPaySignature.SignWithKey(sortedTxtParams, options.Key, signType));
+        }
+
+        public bool GetNeedCheckSign()
         {
             return true;
         }

+ 95 - 0
src/Essensoft.AspNetCore.Payment.WeChatPay/Request/WeChatPayPaPayPartnerDeleteContractRequest.cs

@@ -0,0 +1,95 @@
+using System.Collections.Generic;
+using Essensoft.AspNetCore.Payment.WeChatPay.Response;
+using Essensoft.AspNetCore.Payment.WeChatPay.Utility;
+
+namespace Essensoft.AspNetCore.Payment.WeChatPay.Request
+{
+    /// <summary>
+    /// 微信代扣 - 乘车码代扣 - 申请解约
+    /// </summary>
+    public class WeChatPayPaPayPartnerDeleteContractRequest : IWeChatPayRequest<WeChatPayPaPayPartnerDeleteContractResponse>
+    {
+        /// <summary>
+        /// 子商户应用号
+        /// </summary>
+        public string SubAppId { get; set; }
+
+        /// <summary>
+        /// 子商户号
+        /// </summary>
+        public string SubMchId { get; set; }
+
+        /// <summary>
+        /// 模板id
+        /// </summary>
+        public string PlanId { get; set; }
+
+        /// <summary>
+        /// 签约协议号
+        /// </summary>
+        public string ContractCode { get; set; }
+
+        /// <summary>
+        /// 委托代扣协议id
+        /// </summary>
+        public string ContractId { get; set; }
+
+        /// <summary>
+        /// 解约备注
+        /// </summary>
+        public string ContractTerminationRemark { get; set; }
+
+        /// <summary>
+        /// 版本号
+        /// </summary>
+        public string Version { get; set; }
+
+        #region IWeChatPayRequest Members
+
+        public string GetRequestUrl()
+        {
+            return "https://api.mch.weixin.qq.com/papay/partner/deletecontract";
+        }
+
+        public IDictionary<string, string> GetParameters()
+        {
+            var parameters = new WeChatPayDictionary
+            {
+                { "sub_appid", SubAppId },
+                { "sub_mch_id", SubMchId },
+                { "plan_id", PlanId },
+                { "contract_code", ContractCode },
+                { "contract_id", ContractId },
+                { "contract_termination_remark", ContractTerminationRemark },
+                { "version", Version },
+            };
+            return parameters;
+        }
+
+        public WeChatPaySignType GetSignType()
+        {
+            return WeChatPaySignType.HMAC_SHA256;
+        }
+
+        public void PrimaryHandler(WeChatPayOptions options, WeChatPaySignType signType, WeChatPayDictionary sortedTxtParams)
+        {
+            sortedTxtParams.Add(WeChatPayConsts.nonce_str, WeChatPayUtility.GenerateNonceStr());
+            sortedTxtParams.Add(WeChatPayConsts.appid, options.AppId);
+            sortedTxtParams.Add(WeChatPayConsts.mch_id, options.MchId);
+
+            if (signType == WeChatPaySignType.HMAC_SHA256)
+            {
+                sortedTxtParams.Add(WeChatPayConsts.sign_type, WeChatPayConsts.HMAC_SHA256);
+            }
+
+            sortedTxtParams.Add(WeChatPayConsts.sign, WeChatPaySignature.SignWithKey(sortedTxtParams, options.Key, signType));
+        }
+
+        public bool GetNeedCheckSign()
+        {
+            return true;
+        }
+
+        #endregion
+    }
+}

+ 156 - 0
src/Essensoft.AspNetCore.Payment.WeChatPay/Request/WeChatPayPaPayPartnerEntrustWebRequest.cs

@@ -0,0 +1,156 @@
+using System.Collections.Generic;
+using Essensoft.AspNetCore.Payment.WeChatPay.Response;
+using Essensoft.AspNetCore.Payment.WeChatPay.Utility;
+
+namespace Essensoft.AspNetCore.Payment.WeChatPay.Request
+{
+    /// <summary>
+    /// 微信代扣 - 乘车码代扣 - 申请签约
+    /// </summary>
+    public class WeChatPayPaPayPartnerEntrustWebRequest : IWeChatPayRequest<WeChatPayPaPayPartnerEntrustWebResponse>
+    {
+        /// <summary>
+        /// 子商户应用号
+        /// </summary>
+        public string SubAppId { get; set; }
+
+        /// <summary>
+        /// 子商户号
+        /// </summary>
+        public string SubMchId { get; set; }
+
+        /// <summary>
+        /// 模板id
+        /// </summary>
+        public string PlanId { get; set; }
+
+        /// <summary>
+        /// 签约协议号
+        /// </summary>
+        public string ContractCode { get; set; }
+
+        /// <summary>
+        /// 请求序列号
+        /// </summary>
+        public string RequestSerial { get; set; }
+
+        /// <summary>
+        /// 用户账户展示名称
+        /// </summary>
+        public string ContractDisplayAccount { get; set; }
+
+        /// <summary>
+        /// 回调通知url
+        /// </summary>
+        public string NotifyUrl { get; set; }
+
+        /// <summary>
+        /// 版本号
+        /// </summary>
+        public string Version { get; set; }
+
+        /// <summary>
+        /// 客户端 IP
+        /// </summary>
+        public string ClientIp { get; set; }
+
+        /// <summary>
+        /// 设备ID
+        /// </summary>
+        public string Deviceid { get; set; }
+
+        /// <summary>
+        /// 手机号
+        /// </summary>
+        public string Mobile { get; set; }
+
+        /// <summary>
+        /// 邮箱地址
+        /// </summary>
+        public string Email { get; set; }
+
+        /// <summary>
+        /// QQ号
+        /// </summary>
+        public string QQ { get; set; }
+
+        /// <summary>
+        /// 微信OpenId
+        /// </summary>
+        public string OpenId { get; set; }
+
+        /// <summary>
+        /// 身份证号
+        /// </summary>
+        public string CreId { get; set; }
+
+        /// <summary>
+        /// 商户侧用户标识
+        /// </summary>
+        public string OuterId { get; set; }
+
+        /// <summary>
+        /// 返回app
+        /// </summary>
+        public string ReturnApp { get; set; }
+
+        /// <summary>
+        /// 返回web
+        /// </summary>
+        public string ReturnWeb { get; set; }
+
+        #region IWeChatPayRequest Members
+
+        public string GetRequestUrl()
+        {
+            return "https://api.mch.weixin.qq.com/papay/partner/entrustweb";
+        }
+
+        public IDictionary<string, string> GetParameters()
+        {
+            var parameters = new WeChatPayDictionary
+            {
+                { "sub_appid", SubAppId },
+                { "sub_mch_id", SubMchId },
+                { "plan_id", PlanId },
+                { "contract_code", ContractCode },
+                { "request_serial", RequestSerial },
+                { "contract_display_account", ContractDisplayAccount },
+                { "notify_url", NotifyUrl },
+                { "version", Version },
+                { "clientip", ClientIp },
+                { "deviceid", Deviceid },
+                { "mobile", Mobile },
+                { "email", Email },
+                { "qq", QQ },
+                { "creid", CreId },
+                { "outerid", OuterId },
+                { "return_app", ReturnApp },
+                { "return_web", ReturnWeb },
+            };
+            return parameters;
+        }
+
+        public WeChatPaySignType GetSignType()
+        {
+            return WeChatPaySignType.MD5;
+        }
+
+        public void PrimaryHandler(WeChatPayOptions options, WeChatPaySignType signType, WeChatPayDictionary sortedTxtParams)
+        {
+            sortedTxtParams.Add(WeChatPayConsts.nonce_str, WeChatPayUtility.GenerateNonceStr());
+            sortedTxtParams.Add(WeChatPayConsts.appid, options.AppId);
+            sortedTxtParams.Add(WeChatPayConsts.mch_id, options.MchId);
+            sortedTxtParams.Add(WeChatPayConsts.timestamp, WeChatPayUtility.GetTimeStamp());
+
+            sortedTxtParams.Add(WeChatPayConsts.sign, WeChatPaySignature.SignWithKey(sortedTxtParams, options.Key, signType));
+        }
+
+        public bool GetNeedCheckSign()
+        {
+            return false;
+        }
+
+        #endregion
+    }
+}

+ 85 - 0
src/Essensoft.AspNetCore.Payment.WeChatPay/Request/WeChatPayPaPayPartnerQueryContractRequest.cs

@@ -0,0 +1,85 @@
+using System.Collections.Generic;
+using Essensoft.AspNetCore.Payment.WeChatPay.Response;
+using Essensoft.AspNetCore.Payment.WeChatPay.Utility;
+
+namespace Essensoft.AspNetCore.Payment.WeChatPay.Request
+{
+    /// <summary>
+    /// 微信代扣 - 乘车码代扣 - 查询签约关系
+    /// </summary>
+    public class WeChatPayPaPayPartnerQueryContractRequest : IWeChatPayRequest<WeChatPayPaPayPartnerQueryContractResponse>
+    {
+        /// <summary>
+        /// 子商户应用号
+        /// </summary>
+        public string SubAppId { get; set; }
+
+        /// <summary>
+        /// 子商户号
+        /// </summary>
+        public string SubMchId { get; set; }
+
+        /// <summary>
+        /// 委托代扣协议id
+        /// </summary>
+        public string ContractId { get; set; }
+
+        /// <summary>
+        /// 模板id
+        /// </summary>
+        public string PlanId { get; set; }
+
+        /// <summary>
+        /// 签约协议号
+        /// </summary>
+        public string ContractCode { get; set; }
+
+        /// <summary>
+        /// 版本号
+        /// </summary>
+        public string Version { get; set; }
+
+        #region IWeChatPayRequest Members
+
+        public string GetRequestUrl()
+        {
+            return "https://api.mch.weixin.qq.com/papay/partner/querycontract";
+        }
+
+        public IDictionary<string, string> GetParameters()
+        {
+            var parameters = new WeChatPayDictionary
+            {
+                { "sub_appid", SubAppId },
+                { "sub_mch_id", SubMchId },
+                { "contract_id", ContractId },
+                { "plan_id", PlanId },
+                { "contract_code", ContractCode },
+                { "version", Version },
+            };
+            return parameters;
+        }
+
+        public WeChatPaySignType GetSignType()
+        {
+            return WeChatPaySignType.MD5;
+        }
+
+        public void PrimaryHandler(WeChatPayOptions options, WeChatPaySignType signType, WeChatPayDictionary sortedTxtParams)
+        {
+            sortedTxtParams.Add(WeChatPayConsts.nonce_str, WeChatPayUtility.GenerateNonceStr());
+            sortedTxtParams.Add(WeChatPayConsts.appid, options.AppId);
+            sortedTxtParams.Add(WeChatPayConsts.mch_id, options.MchId);
+            sortedTxtParams.Add(WeChatPayConsts.timestamp, WeChatPayUtility.GetTimeStamp());
+
+            sortedTxtParams.Add(WeChatPayConsts.sign, WeChatPaySignature.SignWithKey(sortedTxtParams, options.Key, signType));
+        }
+
+        public bool GetNeedCheckSign()
+        {
+            return false;
+        }
+
+        #endregion
+    }
+}

+ 30 - 2
src/Essensoft.AspNetCore.Payment.WeChatPay/Request/WeChatPayPayBankRequest.cs

@@ -1,12 +1,14 @@
 using System.Collections.Generic;
+using Essensoft.AspNetCore.Payment.Security;
 using Essensoft.AspNetCore.Payment.WeChatPay.Response;
+using Essensoft.AspNetCore.Payment.WeChatPay.Utility;
 
 namespace Essensoft.AspNetCore.Payment.WeChatPay.Request
 {
     /// <summary>
     /// 企业付款到银行卡
     /// </summary>
-    public class WeChatPayPayBankRequest : IWeChatPayCertificateRequest<WeChatPayPayBankResponse>
+    public class WeChatPayPayBankRequest : IWeChatPayCertRequest<WeChatPayPayBankResponse>
     {
         /// <summary>
         /// 商户企业付款单号
@@ -59,7 +61,33 @@ namespace Essensoft.AspNetCore.Payment.WeChatPay.Request
             return parameters;
         }
 
-        public bool IsCheckResponseSign()
+        public WeChatPaySignType GetSignType()
+        {
+            return WeChatPaySignType.MD5;
+        }
+
+        public void PrimaryHandler(WeChatPayOptions options, WeChatPaySignType signType, WeChatPayDictionary sortedTxtParams)
+        {
+            if (string.IsNullOrEmpty(options.RsaPublicKey))
+            {
+                throw new WeChatPayException("WeChatPayPayBankRequest: RsaPublicKey is null!");
+            }
+
+            sortedTxtParams.Add(WeChatPayConsts.nonce_str, WeChatPayUtility.GenerateNonceStr());
+            sortedTxtParams.Add(WeChatPayConsts.mch_id, options.MchId);
+
+            var key = RSAUtilities.GetAsymmetricKeyParameterFormRsaPublicKey(options.RsaPublicKey);
+
+            var no = RSA_ECB_OAEPWithSHA1AndMGF1Padding.Encrypt(sortedTxtParams.GetValue(WeChatPayConsts.enc_bank_no), key);
+            sortedTxtParams.SetValue(WeChatPayConsts.enc_bank_no, no);
+
+            var name = RSA_ECB_OAEPWithSHA1AndMGF1Padding.Encrypt(sortedTxtParams.GetValue(WeChatPayConsts.enc_true_name), key);
+            sortedTxtParams.SetValue(WeChatPayConsts.enc_true_name, name);
+
+            sortedTxtParams.Add(WeChatPayConsts.sign, WeChatPaySignature.SignWithKey(sortedTxtParams, options.Key, signType));
+        }
+
+        public bool GetNeedCheckSign()
         {
             return false;
         }

+ 20 - 10
src/Essensoft.AspNetCore.Payment.WeChatPay/Request/WeChatPayReportRequest.cs → src/Essensoft.AspNetCore.Payment.WeChatPay/Request/WeChatPayPayitilReportRequest.cs

@@ -1,20 +1,16 @@
-using System.Collections.Generic;
+using System.Collections.Generic;
 using Essensoft.AspNetCore.Payment.WeChatPay.Response;
+using Essensoft.AspNetCore.Payment.WeChatPay.Utility;
 
 namespace Essensoft.AspNetCore.Payment.WeChatPay.Request
 {
     /// <summary>
     /// 交易保障
     /// </summary>
-    public class WeChatPayReportRequest : IWeChatPayRequest<WeChatPayReportResponse>
+    public class WeChatPayPayitilReportRequest : IWeChatPayRequest<WeChatPayPayitilReportResponse>
     {
         /// <summary>
-        /// 应用ID
-        /// </summary>
-        public string AppId { get; set; }
-
-        /// <summary>
-        /// 子商户公众账号ID
+        /// 子商户应用号
         /// </summary>
         public string SubAppId { get; set; }
 
@@ -89,7 +85,6 @@ namespace Essensoft.AspNetCore.Payment.WeChatPay.Request
         {
             var parameters = new WeChatPayDictionary
             {
-                { "appid", AppId },
                 { "sub_appid", SubAppId },
                 { "sub_mch_id", SubMchId },
                 { "device_info", DeviceInfo },
@@ -107,7 +102,22 @@ namespace Essensoft.AspNetCore.Payment.WeChatPay.Request
             return parameters;
         }
 
-        public bool IsCheckResponseSign()
+        public WeChatPaySignType GetSignType()
+        {
+            return WeChatPaySignType.MD5;
+        }
+
+
+        public void PrimaryHandler(WeChatPayOptions options, WeChatPaySignType signType, WeChatPayDictionary sortedTxtParams)
+        {
+            sortedTxtParams.Add(WeChatPayConsts.nonce_str, WeChatPayUtility.GenerateNonceStr());
+            sortedTxtParams.Add(WeChatPayConsts.appid, options.AppId);
+            sortedTxtParams.Add(WeChatPayConsts.mch_id, options.MchId);
+
+            sortedTxtParams.Add(WeChatPayConsts.sign, WeChatPaySignature.SignWithKey(sortedTxtParams, options.Key, signType));
+        }
+
+        public bool GetNeedCheckSign()
         {
             return false;
         }

+ 69 - 0
src/Essensoft.AspNetCore.Payment.WeChatPay/Request/WeChatPayProfitSharingAddReceiverRequest.cs

@@ -0,0 +1,69 @@
+using System.Collections.Generic;
+using Essensoft.AspNetCore.Payment.WeChatPay.Response;
+using Essensoft.AspNetCore.Payment.WeChatPay.Utility;
+
+namespace Essensoft.AspNetCore.Payment.WeChatPay.Request
+{
+    /// <summary>
+    /// 添加分账接收方
+    /// </summary>
+    public class WeChatPayProfitSharingAddReceiverRequest : IWeChatPayRequest<WeChatPayProfitSharingAddReceiverResponse>
+    {
+        /// <summary>
+        /// 子商户号
+        /// </summary>
+        public string SubMchId { get; set; }
+
+        /// <summary>
+        /// 子商户应用号
+        /// </summary>
+        public string SubAppId { get; set; }
+
+        /// <summary>
+        /// 分账接收方
+        /// </summary>
+        public string Receiver { get; set; }
+
+        #region IWeChatPayRequest Members
+
+        public string GetRequestUrl()
+        {
+            return "https://api.mch.weixin.qq.com/pay/profitsharingaddreceiver";
+        }
+
+        public IDictionary<string, string> GetParameters()
+        {
+            var parameters = new WeChatPayDictionary
+            {
+                { "sub_mch_id", SubMchId },
+                { "sub_appid", SubAppId },
+                { "receiver", Receiver },
+            };
+            return parameters;
+        }
+
+        public WeChatPaySignType GetSignType()
+        {
+            return WeChatPaySignType.HMAC_SHA256;
+        }
+
+        public void PrimaryHandler(WeChatPayOptions options, WeChatPaySignType signType, WeChatPayDictionary sortedTxtParams)
+        {
+            sortedTxtParams.Add(WeChatPayConsts.nonce_str, WeChatPayUtility.GenerateNonceStr());
+            sortedTxtParams.Add(WeChatPayConsts.mch_id, options.MchId);
+            sortedTxtParams.Add(WeChatPayConsts.appid, options.AppId);
+
+            if (signType == WeChatPaySignType.HMAC_SHA256)
+            {
+                sortedTxtParams.Add(WeChatPayConsts.sign_type, WeChatPayConsts.HMAC_SHA256);
+            }
+        }
+
+        public bool GetNeedCheckSign()
+        {
+            return true;
+        }
+
+        #endregion
+    }
+}

+ 75 - 0
src/Essensoft.AspNetCore.Payment.WeChatPay/Request/WeChatPayProfitSharingFinishRequest.cs

@@ -0,0 +1,75 @@
+using System.Collections.Generic;
+using Essensoft.AspNetCore.Payment.WeChatPay.Response;
+using Essensoft.AspNetCore.Payment.WeChatPay.Utility;
+
+namespace Essensoft.AspNetCore.Payment.WeChatPay.Request
+{
+    /// <summary>
+    /// 完结分账
+    /// </summary>
+    public class WeChatPayProfitSharingFinishRequest : IWeChatPayCertRequest<WeChatPayProfitSharingFinishResponse>
+    {
+        /// <summary>
+        /// 子商户号
+        /// </summary>
+        public string SubMchId { get; set; }
+
+        /// <summary>
+        /// 微信订单号
+        /// </summary>
+        public string TransactionId { get; set; }
+
+        /// <summary>
+        /// 商户分账单号
+        /// </summary>
+        public string OutOrderNo { get; set; }
+
+        /// <summary>
+        /// 分账完结描述
+        /// </summary>
+        public string Description { get; set; }
+
+        #region IWeChatPayCertificateRequest Members
+
+        public string GetRequestUrl()
+        {
+            return "https://api.mch.weixin.qq.com/secapi/pay/profitsharingfinish";
+        }
+
+        public IDictionary<string, string> GetParameters()
+        {
+            var parameters = new WeChatPayDictionary
+            {
+                { "sub_mch_id", SubMchId },
+                { "transaction_id", TransactionId },
+                { "out_order_no", OutOrderNo },
+                { "description", Description },
+            };
+            return parameters;
+        }
+
+        public WeChatPaySignType GetSignType()
+        {
+            return WeChatPaySignType.HMAC_SHA256;
+        }
+
+        public void PrimaryHandler(WeChatPayOptions options, WeChatPaySignType signType, WeChatPayDictionary sortedTxtParams)
+        {
+            sortedTxtParams.Add(WeChatPayConsts.nonce_str, WeChatPayUtility.GenerateNonceStr());
+            sortedTxtParams.Add(WeChatPayConsts.appid, options.AppId);
+            sortedTxtParams.Add(WeChatPayConsts.mch_id, options.MchId);
+
+            if (signType == WeChatPaySignType.HMAC_SHA256)
+            {
+                sortedTxtParams.Add(WeChatPayConsts.sign_type, WeChatPayConsts.HMAC_SHA256);
+            }
+        }
+
+        public bool GetNeedCheckSign()
+        {
+            return true;
+        }
+
+        #endregion
+    }
+}

+ 68 - 0
src/Essensoft.AspNetCore.Payment.WeChatPay/Request/WeChatPayProfitSharingQueryRequest.cs

@@ -0,0 +1,68 @@
+using System.Collections.Generic;
+using Essensoft.AspNetCore.Payment.WeChatPay.Response;
+using Essensoft.AspNetCore.Payment.WeChatPay.Utility;
+
+namespace Essensoft.AspNetCore.Payment.WeChatPay.Request
+{
+    /// <summary>
+    /// 查询分账结果
+    /// </summary>
+    public class WeChatPayProfitSharingQueryRequest : IWeChatPayRequest<WeChatPayProfitSharingQueryResponse>
+    {
+        /// <summary>
+        /// 子商户号
+        /// </summary>
+        public string SubMchId { get; set; }
+
+        /// <summary>
+        /// 微信订单号
+        /// </summary>
+        public string TransactionId { get; set; }
+
+        /// <summary>
+        /// 商户订单号
+        /// </summary>
+        public string OutTradeNo { get; set; }
+
+        #region IWeChatPayRequest Members
+
+        public string GetRequestUrl()
+        {
+            return "https://api.mch.weixin.qq.com/pay/profitsharingquery";
+        }
+
+        public IDictionary<string, string> GetParameters()
+        {
+            var parameters = new WeChatPayDictionary
+            {
+                { "sub_mch_id", SubMchId },
+                { "transaction_id", TransactionId },
+                { "out_trade_no", OutTradeNo }
+            };
+            return parameters;
+        }
+
+        public WeChatPaySignType GetSignType()
+        {
+            return WeChatPaySignType.HMAC_SHA256;
+        }
+
+        public void PrimaryHandler(WeChatPayOptions options, WeChatPaySignType signType, WeChatPayDictionary sortedTxtParams)
+        {
+            sortedTxtParams.Add(WeChatPayConsts.nonce_str, WeChatPayUtility.GenerateNonceStr());
+            sortedTxtParams.Add(WeChatPayConsts.mch_id, options.MchId);
+
+            if (signType == WeChatPaySignType.HMAC_SHA256)
+            {
+                sortedTxtParams.Add(WeChatPayConsts.sign_type, WeChatPayConsts.HMAC_SHA256);
+            }
+        }
+
+        public bool GetNeedCheckSign()
+        {
+            return true;
+        }
+
+        #endregion
+    }
+}

+ 69 - 0
src/Essensoft.AspNetCore.Payment.WeChatPay/Request/WeChatPayProfitSharingRemoveReceiverRequest.cs

@@ -0,0 +1,69 @@
+using System.Collections.Generic;
+using Essensoft.AspNetCore.Payment.WeChatPay.Response;
+using Essensoft.AspNetCore.Payment.WeChatPay.Utility;
+
+namespace Essensoft.AspNetCore.Payment.WeChatPay.Request
+{
+    /// <summary>
+    /// 删除分账接收方
+    /// </summary>
+    public class WeChatPayProfitSharingRemoveReceiverRequest : IWeChatPayRequest<WeChatPayProfitSharingRemoveReceiverResponse>
+    {
+        /// <summary>
+        /// 子商户号
+        /// </summary>
+        public string SubMchId { get; set; }
+
+        /// <summary>
+        /// 子商户应用号
+        /// </summary>
+        public string SubAppId { get; set; }
+
+        /// <summary>
+        /// 分账接收方
+        /// </summary>
+        public string Receiver { get; set; }
+
+        #region IWeChatPayRequest Members
+
+        public string GetRequestUrl()
+        {
+            return "https://api.mch.weixin.qq.com/pay/profitsharingremovereceiver";
+        }
+
+        public IDictionary<string, string> GetParameters()
+        {
+            var parameters = new WeChatPayDictionary
+            {
+                { "sub_mch_id", SubMchId },
+                { "sub_appid", SubAppId },
+                { "receiver", Receiver },
+            };
+            return parameters;
+        }
+
+        public WeChatPaySignType GetSignType()
+        {
+            return WeChatPaySignType.HMAC_SHA256;
+        }
+
+        public void PrimaryHandler(WeChatPayOptions options, WeChatPaySignType signType, WeChatPayDictionary sortedTxtParams)
+        {
+            sortedTxtParams.Add(WeChatPayConsts.nonce_str, WeChatPayUtility.GenerateNonceStr());
+            sortedTxtParams.Add(WeChatPayConsts.mch_id, options.MchId);
+            sortedTxtParams.Add(WeChatPayConsts.appid, options.AppId);
+
+            if (signType == WeChatPaySignType.HMAC_SHA256)
+            {
+                sortedTxtParams.Add(WeChatPayConsts.sign_type, WeChatPayConsts.HMAC_SHA256);
+            }
+        }
+
+        public bool GetNeedCheckSign()
+        {
+            return true;
+        }
+
+        #endregion
+    }
+}

+ 81 - 0
src/Essensoft.AspNetCore.Payment.WeChatPay/Request/WeChatPayProfitSharingRequest.cs

@@ -0,0 +1,81 @@
+using System.Collections.Generic;
+using Essensoft.AspNetCore.Payment.WeChatPay.Response;
+using Essensoft.AspNetCore.Payment.WeChatPay.Utility;
+
+namespace Essensoft.AspNetCore.Payment.WeChatPay.Request
+{
+    /// <summary>
+    /// 单次分账
+    /// </summary>
+    public class WeChatPayProfitSharingRequest : IWeChatPayCertRequest<WeChatPayProfitSharingResponse>
+    {
+        /// <summary>
+        /// 子商户号
+        /// </summary>
+        public string SubMchId { get; set; }
+
+        /// <summary>
+        /// 子商户应用号
+        /// </summary>
+        public string SubAppId { get; set; }
+
+        /// <summary>
+        /// 微信订单号
+        /// </summary>
+        public string TransactionId { get; set; }
+
+        /// <summary>
+        /// 商户分账单号
+        /// </summary>
+        public string OutOrderNo { get; set; }
+
+        /// <summary>
+        /// 分账接收方列表
+        /// </summary>
+        public string Receivers { get; set; }
+
+        #region IWeChatPayCertificateRequest Members
+
+        public string GetRequestUrl()
+        {
+            return "https://api.mch.weixin.qq.com/secapi/pay/profitsharing";
+        }
+
+        public IDictionary<string, string> GetParameters()
+        {
+            var parameters = new WeChatPayDictionary
+            {
+                { "sub_mch_id", SubMchId },
+                { "sub_appid", SubAppId },
+                { "transaction_id", TransactionId },
+                { "out_order_no", OutOrderNo },
+                { "receivers", Receivers },
+            };
+            return parameters;
+        }
+
+        public WeChatPaySignType GetSignType()
+        {
+            return WeChatPaySignType.HMAC_SHA256;
+        }
+
+        public void PrimaryHandler(WeChatPayOptions options, WeChatPaySignType signType, WeChatPayDictionary sortedTxtParams)
+        {
+            sortedTxtParams.Add(WeChatPayConsts.nonce_str, WeChatPayUtility.GenerateNonceStr());
+            sortedTxtParams.Add(WeChatPayConsts.appid, options.AppId);
+            sortedTxtParams.Add(WeChatPayConsts.mch_id, options.MchId);
+
+            if (signType == WeChatPaySignType.HMAC_SHA256)
+            {
+                sortedTxtParams.Add(WeChatPayConsts.sign_type, WeChatPayConsts.HMAC_SHA256);
+            }
+        }
+
+        public bool GetNeedCheckSign()
+        {
+            return true;
+        }
+
+        #endregion
+    }
+}

+ 32 - 10
src/Essensoft.AspNetCore.Payment.WeChatPay/Request/WeChatPayPayWwSpTrans2PockeRequest.cs → src/Essensoft.AspNetCore.Payment.WeChatPay/Request/WeChatPayPromotionPayWwSpTrans2PockeRequest.cs

@@ -1,18 +1,14 @@
 using System.Collections.Generic;
 using Essensoft.AspNetCore.Payment.WeChatPay.Response;
+using Essensoft.AspNetCore.Payment.WeChatPay.Utility;
 
 namespace Essensoft.AspNetCore.Payment.WeChatPay.Request
 {
     /// <summary>
     /// 企业支付 - 向员工付款
     /// </summary>
-    public class WeChatPayPayWwSpTrans2PockeRequest : IWeChatPayCertificateRequest<WeChatPayPayWwSpTrans2PockeResponse>
+    public class WeChatPayPromotionPayWwSpTrans2PockeRequest : IWeChatPayCertRequest<WeChatPayPromotionPayWwSpTrans2PockeResponse>
     {
-        /// <summary>
-        /// 公众账号appid
-        /// </summary>
-        public string AppId { get; set; }
-
         /// <summary>
         /// 设备号
         /// </summary>
@@ -51,7 +47,7 @@ namespace Essensoft.AspNetCore.Payment.WeChatPay.Request
         /// <summary>
         /// Ip地址
         /// </summary>
-        public string SpbillCreateIp { get; set; }
+        public string SpBillCreateIp { get; set; }
 
         /// <summary>
         /// 付款消息类型
@@ -89,7 +85,6 @@ namespace Essensoft.AspNetCore.Payment.WeChatPay.Request
         {
             var parameters = new WeChatPayDictionary
             {
-                { "appid", AppId },
                 { "device_info", DeviceInfo },
                 { "partner_trade_no", PartnerTradeNo },
                 { "openid", OpenId },
@@ -97,7 +92,7 @@ namespace Essensoft.AspNetCore.Payment.WeChatPay.Request
                 { "re_user_name", ReUserName },
                 { "amount", Amount },
                 { "desc", Desc },
-                { "spbill_create_ip", SpbillCreateIp },
+                { "spbill_create_ip", SpBillCreateIp },
                 { "ww_msg_type", WwMsgType },
                 { "approval_number", ApprovalNumber },
                 { "approval_type", ApprovalType },
@@ -107,7 +102,34 @@ namespace Essensoft.AspNetCore.Payment.WeChatPay.Request
             return parameters;
         }
 
-        public bool IsCheckResponseSign()
+        public WeChatPaySignType GetSignType()
+        {
+            return WeChatPaySignType.MD5;
+        }
+
+        public void PrimaryHandler(WeChatPayOptions options, WeChatPaySignType signType, WeChatPayDictionary sortedTxtParams)
+        {
+            sortedTxtParams.Add(WeChatPayConsts.nonce_str, WeChatPayUtility.GenerateNonceStr());
+            sortedTxtParams.Add(WeChatPayConsts.appid, options.AppId);
+            sortedTxtParams.Add(WeChatPayConsts.mch_id, options.MchId);
+
+            var signList = new List<string>
+            {
+                "amount",
+                "appid",
+                "desc",
+                "mch_id",
+                "nonce_str",
+                "openid",
+                "partner_trade_no",
+                "ww_msg_type",
+            };
+
+            sortedTxtParams.Add(WeChatPayConsts.workwx_sign, WeChatPaySignature.SignWithSecret(sortedTxtParams, options.Secret, signList));
+            sortedTxtParams.Add(WeChatPayConsts.sign, WeChatPaySignature.SignWithKey(sortedTxtParams, options.Key, signType));
+        }
+
+        public bool GetNeedCheckSign()
         {
             return false;
         }

+ 17 - 8
src/Essensoft.AspNetCore.Payment.WeChatPay/Request/WeChatPayQueryWwSpTrans2PockeRequest.cs → src/Essensoft.AspNetCore.Payment.WeChatPay/Request/WeChatPayPromotionQueryWwSpTrans2PockeRequest.cs

@@ -1,18 +1,14 @@
 using System.Collections.Generic;
 using Essensoft.AspNetCore.Payment.WeChatPay.Response;
+using Essensoft.AspNetCore.Payment.WeChatPay.Utility;
 
 namespace Essensoft.AspNetCore.Payment.WeChatPay.Request
 {
     /// <summary>
     /// 企业支付 - 查询付款记录
     /// </summary>
-    public class WeChatPayQueryWwSpTrans2PockeRequest : IWeChatPayCertificateRequest<WeChatPayQueryWwSpTrans2PockeResponse>
+    public class WeChatPayPromotionQueryWwSpTrans2PockeRequest : IWeChatPayCertRequest<WeChatPayPromotionQueryWwSpTrans2PockeResponse>
     {
-        /// <summary>
-        /// 公众账号appid
-        /// </summary>
-        public string AppId { get; set; }
-
         /// <summary>
         /// 商户订单号
         /// </summary>
@@ -29,13 +25,26 @@ namespace Essensoft.AspNetCore.Payment.WeChatPay.Request
         {
             var parameters = new WeChatPayDictionary
             {
-                { "appid", AppId },
                 { "partner_trade_no", PartnerTradeNo },
             };
             return parameters;
         }
 
-        public bool IsCheckResponseSign()
+        public WeChatPaySignType GetSignType()
+        {
+            return WeChatPaySignType.MD5;
+        }
+
+        public void PrimaryHandler(WeChatPayOptions options, WeChatPaySignType signType, WeChatPayDictionary sortedTxtParams)
+        {
+            sortedTxtParams.Add(WeChatPayConsts.nonce_str, WeChatPayUtility.GenerateNonceStr());
+            sortedTxtParams.Add(WeChatPayConsts.appid, options.AppId);
+            sortedTxtParams.Add(WeChatPayConsts.mch_id, options.MchId);
+
+            sortedTxtParams.Add(WeChatPayConsts.sign, WeChatPaySignature.SignWithKey(sortedTxtParams, options.Key, signType));
+        }
+
+        public bool GetNeedCheckSign()
         {
             return false;
         }

+ 19 - 10
src/Essensoft.AspNetCore.Payment.WeChatPay/Request/WeChatPayTransfersRequest.cs → src/Essensoft.AspNetCore.Payment.WeChatPay/Request/WeChatPayPromotionTransfersRequest.cs

@@ -1,18 +1,14 @@
 using System.Collections.Generic;
 using Essensoft.AspNetCore.Payment.WeChatPay.Response;
+using Essensoft.AspNetCore.Payment.WeChatPay.Utility;
 
 namespace Essensoft.AspNetCore.Payment.WeChatPay.Request
 {
     /// <summary>
     /// 企业付款到零钱
     /// </summary>
-    public class WeChatPayTransfersRequest : IWeChatPayCertificateRequest<WeChatPayTransfersResponse>
+    public class WeChatPayPromotionTransfersRequest : IWeChatPayCertRequest<WeChatPayPromotionTransfersResponse>
     {
-        /// <summary>
-        /// 商户账号appid
-        /// </summary>
-        public string MchAppId { get; set; }
-
         /// <summary>
         /// 设备号
         /// </summary>
@@ -51,7 +47,7 @@ namespace Essensoft.AspNetCore.Payment.WeChatPay.Request
         /// <summary>
         /// Ip地址
         /// </summary>
-        public string SpbillCreateIp { get; set; }
+        public string SpBillCreateIp { get; set; }
 
         #region IWeChatPayCertificateRequest Members
 
@@ -64,7 +60,6 @@ namespace Essensoft.AspNetCore.Payment.WeChatPay.Request
         {
             var parameters = new WeChatPayDictionary
             {
-                { "mch_appid", MchAppId },
                 { "device_info", DeviceInfo },
                 { "partner_trade_no", PartnerTradeNo },
                 { "openid", OpenId },
@@ -72,12 +67,26 @@ namespace Essensoft.AspNetCore.Payment.WeChatPay.Request
                 { "re_user_name", ReUserName },
                 { "amount", Amount },
                 { "desc", Desc },
-                { "spbill_create_ip", SpbillCreateIp }
+                { "spbill_create_ip", SpBillCreateIp }
             };
             return parameters;
         }
 
-        public bool IsCheckResponseSign()
+        public WeChatPaySignType GetSignType()
+        {
+            return WeChatPaySignType.MD5;
+        }
+
+        public void PrimaryHandler(WeChatPayOptions options, WeChatPaySignType signType, WeChatPayDictionary sortedTxtParams)
+        {
+            sortedTxtParams.Add(WeChatPayConsts.nonce_str, WeChatPayUtility.GenerateNonceStr());
+            sortedTxtParams.Add(WeChatPayConsts.mch_appid, options.AppId);
+            sortedTxtParams.Add(WeChatPayConsts.mchid, options.MchId);
+
+            sortedTxtParams.Add(WeChatPayConsts.sign, WeChatPaySignature.SignWithKey(sortedTxtParams, options.Key, signType));
+        }
+
+        public bool GetNeedCheckSign()
         {
             return false;
         }

+ 16 - 2
src/Essensoft.AspNetCore.Payment.WeChatPay/Request/WeChatPayQueryBankRequest.cs

@@ -1,12 +1,13 @@
 using System.Collections.Generic;
 using Essensoft.AspNetCore.Payment.WeChatPay.Response;
+using Essensoft.AspNetCore.Payment.WeChatPay.Utility;
 
 namespace Essensoft.AspNetCore.Payment.WeChatPay.Request
 {
     /// <summary>
     /// 查询企业付款银行卡
     /// </summary>
-    public class WeChatPayQueryBankRequest : IWeChatPayCertificateRequest<WeChatPayQueryBankResponse>
+    public class WeChatPayQueryBankRequest : IWeChatPayCertRequest<WeChatPayQueryBankResponse>
     {
         /// <summary>
         /// 商户企业付款单号
@@ -29,7 +30,20 @@ namespace Essensoft.AspNetCore.Payment.WeChatPay.Request
             return parameters;
         }
 
-        public bool IsCheckResponseSign()
+        public WeChatPaySignType GetSignType()
+        {
+            return WeChatPaySignType.MD5;
+        }
+
+        public void PrimaryHandler(WeChatPayOptions options, WeChatPaySignType signType, WeChatPayDictionary sortedTxtParams)
+        {
+            sortedTxtParams.Add(WeChatPayConsts.nonce_str, WeChatPayUtility.GenerateNonceStr());
+            sortedTxtParams.Add(WeChatPayConsts.mch_id, options.MchId);
+
+            sortedTxtParams.Add(WeChatPayConsts.sign, WeChatPaySignature.SignWithKey(sortedTxtParams, options.Key, signType));
+        }
+
+        public bool GetNeedCheckSign()
         {
             return false;
         }

+ 18 - 8
src/Essensoft.AspNetCore.Payment.WeChatPay/Request/WeChatPayQueryCouponStockRequest.cs

@@ -1,5 +1,6 @@
-using System.Collections.Generic;
+using System.Collections.Generic;
 using Essensoft.AspNetCore.Payment.WeChatPay.Response;
+using Essensoft.AspNetCore.Payment.WeChatPay.Utility;
 
 namespace Essensoft.AspNetCore.Payment.WeChatPay.Request
 {
@@ -8,11 +9,6 @@ namespace Essensoft.AspNetCore.Payment.WeChatPay.Request
     /// </summary>
     public class WeChatPayQueryCouponStockRequest : IWeChatPayRequest<WeChatPayQueryCouponStockResponse>
     {
-        /// <summary>
-        /// 应用ID
-        /// </summary>
-        public string AppId { get; set; }
-
         /// <summary>
         /// 代金券批次id
         /// </summary>
@@ -49,7 +45,6 @@ namespace Essensoft.AspNetCore.Payment.WeChatPay.Request
         {
             var parameters = new WeChatPayDictionary
             {
-                { "appid", AppId },
                 { "coupon_stock_id", CouponStockId },
                 { "op_user_id", OpUserId },
                 { "device_info", DeviceInfo },
@@ -59,7 +54,22 @@ namespace Essensoft.AspNetCore.Payment.WeChatPay.Request
             return parameters;
         }
 
-        public bool IsCheckResponseSign()
+        public WeChatPaySignType GetSignType()
+        {
+            return WeChatPaySignType.MD5;
+        }
+
+
+        public void PrimaryHandler(WeChatPayOptions options, WeChatPaySignType signType, WeChatPayDictionary sortedTxtParams)
+        {
+            sortedTxtParams.Add(WeChatPayConsts.nonce_str, WeChatPayUtility.GenerateNonceStr());
+            sortedTxtParams.Add(WeChatPayConsts.appid, options.AppId);
+            sortedTxtParams.Add(WeChatPayConsts.mch_id, options.MchId);
+
+            sortedTxtParams.Add(WeChatPayConsts.sign, WeChatPaySignature.SignWithKey(sortedTxtParams, options.Key, signType));
+        }
+
+        public bool GetNeedCheckSign()
         {
             return true;
         }

+ 18 - 8
src/Essensoft.AspNetCore.Payment.WeChatPay/Request/WeChatPayQueryCouponsInfoRequest.cs

@@ -1,5 +1,6 @@
-using System.Collections.Generic;
+using System.Collections.Generic;
 using Essensoft.AspNetCore.Payment.WeChatPay.Response;
+using Essensoft.AspNetCore.Payment.WeChatPay.Utility;
 
 namespace Essensoft.AspNetCore.Payment.WeChatPay.Request
 {
@@ -8,11 +9,6 @@ namespace Essensoft.AspNetCore.Payment.WeChatPay.Request
     /// </summary>
     public class WeChatPayQueryCouponsInfoRequest : IWeChatPayRequest<WeChatPayQueryCouponsInfoResponse>
     {
-        /// <summary>
-        /// 应用ID
-        /// </summary>
-        public string AppId { get; set; }
-
         /// <summary>
         /// 代金券id
         /// </summary>
@@ -59,7 +55,6 @@ namespace Essensoft.AspNetCore.Payment.WeChatPay.Request
         {
             var parameters = new WeChatPayDictionary
             {
-                { "appid", AppId },
                 { "coupon_id", CouponId },
                 { "openid", OpenId },
                 { "stock_id", StockId },
@@ -71,7 +66,22 @@ namespace Essensoft.AspNetCore.Payment.WeChatPay.Request
             return parameters;
         }
 
-        public bool IsCheckResponseSign()
+        public WeChatPaySignType GetSignType()
+        {
+            return WeChatPaySignType.MD5;
+        }
+
+
+        public void PrimaryHandler(WeChatPayOptions options, WeChatPaySignType signType, WeChatPayDictionary sortedTxtParams)
+        {
+            sortedTxtParams.Add(WeChatPayConsts.nonce_str, WeChatPayUtility.GenerateNonceStr());
+            sortedTxtParams.Add(WeChatPayConsts.appid, options.AppId);
+            sortedTxtParams.Add(WeChatPayConsts.mch_id, options.MchId);
+
+            sortedTxtParams.Add(WeChatPayConsts.sign, WeChatPaySignature.SignWithKey(sortedTxtParams, options.Key, signType));
+        }
+
+        public bool GetNeedCheckSign()
         {
             return true;
         }

+ 17 - 2
src/Essensoft.AspNetCore.Payment.WeChatPay/Request/WeChatPayQueryWorkWxRedPackRequest.cs

@@ -1,12 +1,13 @@
 using System.Collections.Generic;
 using Essensoft.AspNetCore.Payment.WeChatPay.Response;
+using Essensoft.AspNetCore.Payment.WeChatPay.Utility;
 
 namespace Essensoft.AspNetCore.Payment.WeChatPay.Request
 {
     /// <summary>
     /// 企业支付 - 查询红包记录
     /// </summary>
-    public class WeChatPayQueryWorkWxRedPackRequest : IWeChatPayCertificateRequest<WeChatPayQueryWorkWxRedPackResponse>
+    public class WeChatPayQueryWorkWxRedPackRequest : IWeChatPayCertRequest<WeChatPayQueryWorkWxRedPackResponse>
     {
         /// <summary>
         /// 商户订单号
@@ -29,7 +30,21 @@ namespace Essensoft.AspNetCore.Payment.WeChatPay.Request
             return parameters;
         }
 
-        public bool IsCheckResponseSign()
+        public WeChatPaySignType GetSignType()
+        {
+            return WeChatPaySignType.MD5;
+        }
+
+        public void PrimaryHandler(WeChatPayOptions options, WeChatPaySignType signType, WeChatPayDictionary sortedTxtParams)
+        {
+            sortedTxtParams.Add(WeChatPayConsts.nonce_str, WeChatPayUtility.GenerateNonceStr());
+            sortedTxtParams.Add(WeChatPayConsts.appid, options.AppId);
+            sortedTxtParams.Add(WeChatPayConsts.mch_id, options.MchId);
+
+            sortedTxtParams.Add(WeChatPayConsts.sign, WeChatPaySignature.SignWithKey(sortedTxtParams, options.Key, signType));
+        }
+
+        public bool GetNeedCheckSign()
         {
             return true;
         }

+ 20 - 10
src/Essensoft.AspNetCore.Payment.WeChatPay/Request/WeChatPayRefundQueryRequest.cs

@@ -1,5 +1,6 @@
-using System.Collections.Generic;
+using System.Collections.Generic;
 using Essensoft.AspNetCore.Payment.WeChatPay.Response;
+using Essensoft.AspNetCore.Payment.WeChatPay.Utility;
 
 namespace Essensoft.AspNetCore.Payment.WeChatPay.Request
 {
@@ -9,12 +10,7 @@ namespace Essensoft.AspNetCore.Payment.WeChatPay.Request
     public class WeChatPayRefundQueryRequest : IWeChatPayRequest<WeChatPayRefundQueryResponse>
     {
         /// <summary>
-        /// 应用ID
-        /// </summary>
-        public string AppId { get; set; }
-
-        /// <summary>
-        /// 子商户公众账号ID
+        /// 子商户应用号
         /// </summary>
         public string SubAppId { get; set; }
 
@@ -46,7 +42,7 @@ namespace Essensoft.AspNetCore.Payment.WeChatPay.Request
         /// <summary>
         /// 偏移量
         /// </summary>
-        public string Offset { get; set; }
+        public int Offset { get; set; }
 
         #region IWeChatPayRequest Members
 
@@ -59,7 +55,6 @@ namespace Essensoft.AspNetCore.Payment.WeChatPay.Request
         {
             var parameters = new WeChatPayDictionary
             {
-                { "appid", AppId },
                 { "sub_appid", SubAppId },
                 { "sub_mch_id", SubMchId },
                 { "transaction_id", TransactionId },
@@ -71,7 +66,22 @@ namespace Essensoft.AspNetCore.Payment.WeChatPay.Request
             return parameters;
         }
 
-        public bool IsCheckResponseSign()
+        public WeChatPaySignType GetSignType()
+        {
+            return WeChatPaySignType.MD5;
+        }
+
+
+        public void PrimaryHandler(WeChatPayOptions options, WeChatPaySignType signType, WeChatPayDictionary sortedTxtParams)
+        {
+            sortedTxtParams.Add(WeChatPayConsts.nonce_str, WeChatPayUtility.GenerateNonceStr());
+            sortedTxtParams.Add(WeChatPayConsts.appid, options.AppId);
+            sortedTxtParams.Add(WeChatPayConsts.mch_id, options.MchId);
+
+            sortedTxtParams.Add(WeChatPayConsts.sign, WeChatPaySignature.SignWithKey(sortedTxtParams, options.Key, signType));
+        }
+
+        public bool GetNeedCheckSign()
         {
             return true;
         }

+ 19 - 10
src/Essensoft.AspNetCore.Payment.WeChatPay/Request/WeChatPayRefundRequest.cs

@@ -1,20 +1,16 @@
-using System.Collections.Generic;
+using System.Collections.Generic;
 using Essensoft.AspNetCore.Payment.WeChatPay.Response;
+using Essensoft.AspNetCore.Payment.WeChatPay.Utility;
 
 namespace Essensoft.AspNetCore.Payment.WeChatPay.Request
 {
     /// <summary>
     /// 申请退款
     /// </summary>
-    public class WeChatPayRefundRequest : IWeChatPayCertificateRequest<WeChatPayRefundResponse>
+    public class WeChatPayRefundRequest : IWeChatPayCertRequest<WeChatPayRefundResponse>
     {
         /// <summary>
-        /// 应用ID
-        /// </summary>
-        public string AppId { get; set; }
-
-        /// <summary>
-        /// 子商户公众账号ID
+        /// 子商户应用号
         /// </summary>
         public string SubAppId { get; set; }
 
@@ -79,7 +75,6 @@ namespace Essensoft.AspNetCore.Payment.WeChatPay.Request
         {
             var parameters = new WeChatPayDictionary
             {
-                { "appid", AppId },
                 { "sub_appid", SubAppId },
                 { "sub_mch_id", SubMchId },
                 { "transaction_id", TransactionId },
@@ -95,7 +90,21 @@ namespace Essensoft.AspNetCore.Payment.WeChatPay.Request
             return parameters;
         }
 
-        public bool IsCheckResponseSign()
+        public WeChatPaySignType GetSignType()
+        {
+            return WeChatPaySignType.MD5;
+        }
+
+        public void PrimaryHandler(WeChatPayOptions options, WeChatPaySignType signType, WeChatPayDictionary sortedTxtParams)
+        {
+            sortedTxtParams.Add(WeChatPayConsts.nonce_str, WeChatPayUtility.GenerateNonceStr());
+            sortedTxtParams.Add(WeChatPayConsts.appid, options.AppId);
+            sortedTxtParams.Add(WeChatPayConsts.mch_id, options.MchId);
+
+            sortedTxtParams.Add(WeChatPayConsts.sign, WeChatPaySignature.SignWithKey(sortedTxtParams, options.Key, signType));
+        }
+
+        public bool GetNeedCheckSign()
         {
             return true;
         }

+ 18 - 9
src/Essensoft.AspNetCore.Payment.WeChatPay/Request/WeChatPayReverseRequest.cs

@@ -1,20 +1,16 @@
 using System.Collections.Generic;
 using Essensoft.AspNetCore.Payment.WeChatPay.Response;
+using Essensoft.AspNetCore.Payment.WeChatPay.Utility;
 
 namespace Essensoft.AspNetCore.Payment.WeChatPay.Request
 {
     /// <summary>
     /// 撤销订单
     /// </summary>
-    public class WeChatPayReverseRequest : IWeChatPayCertificateRequest<WeChatPayReverseResponse>
+    public class WeChatPayReverseRequest : IWeChatPayCertRequest<WeChatPayReverseResponse>
     {
         /// <summary>
-        /// 应用ID
-        /// </summary>
-        public string AppId { get; set; }
-
-        /// <summary>
-        /// 子商户公众账号ID
+        /// 子商户应用号
         /// </summary>
         public string SubAppId { get; set; }
 
@@ -44,7 +40,6 @@ namespace Essensoft.AspNetCore.Payment.WeChatPay.Request
         {
             var parameters = new WeChatPayDictionary
             {
-                { "appid", AppId },
                 { "sub_appid", SubAppId },
                 { "sub_mch_id", SubMchId },
                 { "transaction_id", TransactionId },
@@ -53,7 +48,21 @@ namespace Essensoft.AspNetCore.Payment.WeChatPay.Request
             return parameters;
         }
 
-        public bool IsCheckResponseSign()
+        public WeChatPaySignType GetSignType()
+        {
+            return WeChatPaySignType.MD5;
+        }
+
+        public void PrimaryHandler(WeChatPayOptions options, WeChatPaySignType signType, WeChatPayDictionary sortedTxtParams)
+        {
+            sortedTxtParams.Add(WeChatPayConsts.nonce_str, WeChatPayUtility.GenerateNonceStr());
+            sortedTxtParams.Add(WeChatPayConsts.appid, options.AppId);
+            sortedTxtParams.Add(WeChatPayConsts.mch_id, options.MchId);
+
+            sortedTxtParams.Add(WeChatPayConsts.sign, WeChatPaySignature.SignWithKey(sortedTxtParams, options.Key, signType));
+        }
+
+        public bool GetNeedCheckSign()
         {
             return true;
         }

+ 48 - 0
src/Essensoft.AspNetCore.Payment.WeChatPay/Request/WeChatPayRiskGetPublicKeyRequest.cs

@@ -0,0 +1,48 @@
+using System.Collections.Generic;
+using Essensoft.AspNetCore.Payment.WeChatPay.Response;
+using Essensoft.AspNetCore.Payment.WeChatPay.Utility;
+
+namespace Essensoft.AspNetCore.Payment.WeChatPay.Request
+{
+    /// <summary>
+    /// 获取RSA加密公钥
+    /// </summary>
+    public class WeChatPayRiskGetPublicKeyRequest : IWeChatPayCertRequest<WeChatPayRiskGetPublicKeyResponse>
+    {
+        #region IWeChatPayCertificateRequest Members
+
+        public string GetRequestUrl()
+        {
+            return "https://fraud.mch.weixin.qq.com/risk/getpublickey";
+        }
+
+        public IDictionary<string, string> GetParameters()
+        {
+            var parameters = new WeChatPayDictionary
+            {
+            };
+            return parameters;
+        }
+
+        public WeChatPaySignType GetSignType()
+        {
+            return WeChatPaySignType.MD5;
+        }
+
+        public void PrimaryHandler(WeChatPayOptions options, WeChatPaySignType signType, WeChatPayDictionary sortedTxtParams)
+        {
+            sortedTxtParams.Add(WeChatPayConsts.nonce_str, WeChatPayUtility.GenerateNonceStr());
+            sortedTxtParams.Add(WeChatPayConsts.mch_id, options.MchId);
+
+            sortedTxtParams.Add(WeChatPayConsts.sign_type, WeChatPayConsts.MD5);
+            sortedTxtParams.Add(WeChatPayConsts.sign, WeChatPaySignature.SignWithKey(sortedTxtParams, options.Key, signType));
+        }
+
+        public bool GetNeedCheckSign()
+        {
+            return false;
+        }
+
+        #endregion
+    }
+}

+ 18 - 9
src/Essensoft.AspNetCore.Payment.WeChatPay/Request/WeChatPaySendCouponRequest.cs

@@ -1,18 +1,14 @@
-using System.Collections.Generic;
+using System.Collections.Generic;
 using Essensoft.AspNetCore.Payment.WeChatPay.Response;
+using Essensoft.AspNetCore.Payment.WeChatPay.Utility;
 
 namespace Essensoft.AspNetCore.Payment.WeChatPay.Request
 {
     /// <summary>
     /// 发放代金券
     /// </summary>
-    public class WeChatPaySendCouponRequest : IWeChatPayCertificateRequest<WeChatPaySendCouponResponse>
+    public class WeChatPaySendCouponRequest : IWeChatPayCertRequest<WeChatPaySendCouponResponse>
     {
-        /// <summary>
-        /// 应用ID
-        /// </summary>
-        public string AppId { get; set; }
-
         /// <summary>
         /// 代金券批次id
         /// </summary>
@@ -64,7 +60,6 @@ namespace Essensoft.AspNetCore.Payment.WeChatPay.Request
         {
             var parameters = new WeChatPayDictionary
             {
-                { "appid", AppId },
                 { "coupon_stock_id", CouponStockId },
                 { "openid_count", OpenIdCount },
                 { "partner_trade_no", PartnerTradeNo },
@@ -77,7 +72,21 @@ namespace Essensoft.AspNetCore.Payment.WeChatPay.Request
             return parameters;
         }
 
-        public bool IsCheckResponseSign()
+        public WeChatPaySignType GetSignType()
+        {
+            return WeChatPaySignType.MD5;
+        }
+
+        public void PrimaryHandler(WeChatPayOptions options, WeChatPaySignType signType, WeChatPayDictionary sortedTxtParams)
+        {
+            sortedTxtParams.Add(WeChatPayConsts.nonce_str, WeChatPayUtility.GenerateNonceStr());
+            sortedTxtParams.Add(WeChatPayConsts.appid, options.AppId);
+            sortedTxtParams.Add(WeChatPayConsts.mch_id, options.MchId);
+
+            sortedTxtParams.Add(WeChatPayConsts.sign, WeChatPaySignature.SignWithKey(sortedTxtParams, options.Key, signType));
+        }
+
+        public bool GetNeedCheckSign()
         {
             return true;
         }

+ 17 - 14
src/Essensoft.AspNetCore.Payment.WeChatPay/Request/WeChatPaySendGroupRedPackRequest.cs

@@ -1,12 +1,13 @@
 using System.Collections.Generic;
 using Essensoft.AspNetCore.Payment.WeChatPay.Response;
+using Essensoft.AspNetCore.Payment.WeChatPay.Utility;
 
 namespace Essensoft.AspNetCore.Payment.WeChatPay.Request
 {
     /// <summary>
     /// 发放裂变红包
     /// </summary>
-    public class WeChatPaySendGroupRedPackRequest : IWeChatPayCertificateRequest<WeChatPaySendGroupRedPackResponse>
+    public class WeChatPaySendGroupRedPackRequest : IWeChatPayCertRequest<WeChatPaySendGroupRedPackResponse>
     {
         /// <summary>
         /// 商户订单号
@@ -18,11 +19,6 @@ namespace Essensoft.AspNetCore.Payment.WeChatPay.Request
         /// </summary>
         public string SubMchId { get; set; }
 
-        /// <summary>
-        /// 公众账号appid
-        /// </summary>
-        public string WXAppId { get; set; }
-
         /// <summary>
         /// 触达用户appid
         /// </summary>
@@ -78,11 +74,6 @@ namespace Essensoft.AspNetCore.Payment.WeChatPay.Request
         /// </summary>
         public string RiskInfo { get; set; }
 
-        /// <summary>
-        /// 资金授权商户号
-        /// </summary>
-        public string ConsumeMchId { get; set; }
-
         #region IWeChatPayCertificateRequest Members
 
         public string GetRequestUrl()
@@ -96,7 +87,6 @@ namespace Essensoft.AspNetCore.Payment.WeChatPay.Request
             {
                 { "mch_billno", MchBillNo },
                 { "sub_mch_id", SubMchId },
-                { "wxappid", WXAppId },
                 { "msgappid", MsgAppId },
                 { "send_name", SendName },
                 { "re_openid", ReOpenId },
@@ -108,12 +98,25 @@ namespace Essensoft.AspNetCore.Payment.WeChatPay.Request
                 { "remark", Remark },
                 { "scene_id", SceneId },
                 { "risk_info", RiskInfo },
-                { "consume_mch_id", ConsumeMchId }
             };
             return parameters;
         }
 
-        public bool IsCheckResponseSign()
+        public WeChatPaySignType GetSignType()
+        {
+            return WeChatPaySignType.MD5;
+        }
+
+        public void PrimaryHandler(WeChatPayOptions options, WeChatPaySignType signType, WeChatPayDictionary sortedTxtParams)
+        {
+            sortedTxtParams.Add(WeChatPayConsts.nonce_str, WeChatPayUtility.GenerateNonceStr());
+            sortedTxtParams.Add(WeChatPayConsts.wxappid, options.AppId);
+            sortedTxtParams.Add(WeChatPayConsts.mch_id, options.MchId);
+
+            sortedTxtParams.Add(WeChatPayConsts.sign, WeChatPaySignature.SignWithKey(sortedTxtParams, options.Key, signType));
+        }
+
+        public bool GetNeedCheckSign()
         {
             return true;
         }

+ 131 - 0
src/Essensoft.AspNetCore.Payment.WeChatPay/Request/WeChatPaySendMiniProgramHbRequest.cs

@@ -0,0 +1,131 @@
+using System.Collections.Generic;
+using Essensoft.AspNetCore.Payment.WeChatPay.Response;
+using Essensoft.AspNetCore.Payment.WeChatPay.Utility;
+
+namespace Essensoft.AspNetCore.Payment.WeChatPay.Request
+{
+    /// <summary>
+    /// 小程序红包 - 发放普通红包
+    /// </summary>
+    public class WeChatPaySendMiniProgramHbRequest : IWeChatPayCertRequest<WeChatPaySendMiniProgramHbResponse>
+    {
+        /// <summary>
+        /// 商户订单号
+        /// </summary>
+        public string MchBillNo { get; set; }
+
+        /// <summary>
+        /// 子商户号
+        /// </summary>
+        public string SubMchId { get; set; }
+
+        /// <summary>
+        /// 触达用户appid
+        /// </summary>
+        public string MsgAppId { get; set; }
+
+        /// <summary>
+        /// 商户名称
+        /// </summary>
+        public string SendName { get; set; }
+
+        /// <summary>
+        /// 用户openid
+        /// </summary>
+        public string ReOpenId { get; set; }
+
+        /// <summary>
+        /// 付款金额
+        /// </summary>
+        public int TotalAmount { get; set; }
+
+        /// <summary>
+        /// 红包发放总人数
+        /// </summary>
+        public int TotalNum { get; set; }
+
+        /// <summary>
+        /// 红包祝福语
+        /// </summary>
+        public string Wishing { get; set; }
+
+        /// <summary>
+        /// Ip地址
+        /// </summary>
+        public string ClientIp { get; set; }
+
+        /// <summary>
+        /// 活动名称
+        /// </summary>
+        public string ActName { get; set; }
+
+        /// <summary>
+        /// 备注
+        /// </summary>
+        public string Remark { get; set; }
+
+        /// <summary>
+        /// 通知用户形式
+        /// </summary>
+        public string NotifyWay { get; set; }
+
+        /// <summary>
+        /// 场景id
+        /// </summary>
+        public string SceneId { get; set; }
+
+        /// <summary>
+        /// 活动信息
+        /// </summary>
+        public string RiskInfo { get; set; }
+
+        #region IWeChatPayCertificateRequest Members
+
+        public string GetRequestUrl()
+        {
+            return "https://api.mch.weixin.qq.com/mmpaymkttransfers/sendminiprogramhb";
+        }
+
+        public IDictionary<string, string> GetParameters()
+        {
+            var parameters = new WeChatPayDictionary
+            {
+                { "mch_billno", MchBillNo },
+                { "sub_mch_id", SubMchId },
+                { "msgappid", MsgAppId },
+                { "send_name", SendName },
+                { "re_openid", ReOpenId },
+                { "total_amount", TotalAmount },
+                { "total_num", TotalNum },
+                { "wishing", Wishing },
+                { "client_ip", ClientIp },
+                { "act_name", ActName },
+                { "remark", Remark },
+                { "scene_id", SceneId },
+                { "risk_info", RiskInfo },
+            };
+            return parameters;
+        }
+
+        public WeChatPaySignType GetSignType()
+        {
+            return WeChatPaySignType.MD5;
+        }
+
+        public void PrimaryHandler(WeChatPayOptions options, WeChatPaySignType signType, WeChatPayDictionary sortedTxtParams)
+        {
+            sortedTxtParams.Add(WeChatPayConsts.nonce_str, WeChatPayUtility.GenerateNonceStr());
+            sortedTxtParams.Add(WeChatPayConsts.wxappid, options.AppId);
+            sortedTxtParams.Add(WeChatPayConsts.mch_id, options.MchId);
+
+            sortedTxtParams.Add(WeChatPayConsts.sign, WeChatPaySignature.SignWithKey(sortedTxtParams, options.Key, signType));
+        }
+
+        public bool GetNeedCheckSign()
+        {
+            return true;
+        }
+
+        #endregion
+    }
+}

+ 17 - 14
src/Essensoft.AspNetCore.Payment.WeChatPay/Request/WeChatPaySendRedPackRequest.cs

@@ -1,12 +1,13 @@
 using System.Collections.Generic;
 using Essensoft.AspNetCore.Payment.WeChatPay.Response;
+using Essensoft.AspNetCore.Payment.WeChatPay.Utility;
 
 namespace Essensoft.AspNetCore.Payment.WeChatPay.Request
 {
     /// <summary>
     /// 发放普通红包
     /// </summary>
-    public class WeChatPaySendRedPackRequest : IWeChatPayCertificateRequest<WeChatPaySendRedPackResponse>
+    public class WeChatPaySendRedPackRequest : IWeChatPayCertRequest<WeChatPaySendRedPackResponse>
     {
         /// <summary>
         /// 商户订单号
@@ -18,11 +19,6 @@ namespace Essensoft.AspNetCore.Payment.WeChatPay.Request
         /// </summary>
         public string SubMchId { get; set; }
 
-        /// <summary>
-        /// 公众账号appid
-        /// </summary>
-        public string WXAppId { get; set; }
-
         /// <summary>
         /// 触达用户appid
         /// </summary>
@@ -78,11 +74,6 @@ namespace Essensoft.AspNetCore.Payment.WeChatPay.Request
         /// </summary>
         public string RiskInfo { get; set; }
 
-        /// <summary>
-        /// 扣钱方mchid
-        /// </summary>
-        public string ConsumeMchId { get; set; }
-
         #region IWeChatPayCertificateRequest Members
 
         public string GetRequestUrl()
@@ -96,7 +87,6 @@ namespace Essensoft.AspNetCore.Payment.WeChatPay.Request
             {
                 { "mch_billno", MchBillNo },
                 { "sub_mch_id", SubMchId },
-                { "wxappid", WXAppId },
                 { "msgappid", MsgAppId },
                 { "send_name", SendName },
                 { "re_openid", ReOpenId },
@@ -108,12 +98,25 @@ namespace Essensoft.AspNetCore.Payment.WeChatPay.Request
                 { "remark", Remark },
                 { "scene_id", SceneId },
                 { "risk_info", RiskInfo },
-                { "consume_mch_id", ConsumeMchId }
             };
             return parameters;
         }
 
-        public bool IsCheckResponseSign()
+        public WeChatPaySignType GetSignType()
+        {
+            return WeChatPaySignType.MD5;
+        }
+
+        public void PrimaryHandler(WeChatPayOptions options, WeChatPaySignType signType, WeChatPayDictionary sortedTxtParams)
+        {
+            sortedTxtParams.Add(WeChatPayConsts.nonce_str, WeChatPayUtility.GenerateNonceStr());
+            sortedTxtParams.Add(WeChatPayConsts.wxappid, options.AppId);
+            sortedTxtParams.Add(WeChatPayConsts.mch_id, options.MchId);
+
+            sortedTxtParams.Add(WeChatPayConsts.sign, WeChatPaySignature.SignWithKey(sortedTxtParams, options.Key, signType));
+        }
+
+        public bool GetNeedCheckSign()
         {
             return true;
         }

+ 29 - 8
src/Essensoft.AspNetCore.Payment.WeChatPay/Request/WeChatPaySendWorkWxRedPackRequest.cs

@@ -1,23 +1,19 @@
 using System.Collections.Generic;
 using Essensoft.AspNetCore.Payment.WeChatPay.Response;
+using Essensoft.AspNetCore.Payment.WeChatPay.Utility;
 
 namespace Essensoft.AspNetCore.Payment.WeChatPay.Request
 {
     /// <summary>
     /// 企业支付 - 发放企业红包
     /// </summary>
-    public class WeChatPaySendWorkWxRedPackRequest : IWeChatPayCertificateRequest<WeChatPaySendWorkWxRedPackResponse>
+    public class WeChatPaySendWorkWxRedPackRequest : IWeChatPayCertRequest<WeChatPaySendWorkWxRedPackResponse>
     {
         /// <summary>
         /// 商户订单号
         /// </summary>
         public string MchBillNo { get; set; }
 
-        /// <summary>
-        /// 公众账号appid
-        /// </summary>
-        public string WxAppId { get; set; }
-
         /// <summary>
         /// 发送者名称
         /// </summary>
@@ -75,7 +71,6 @@ namespace Essensoft.AspNetCore.Payment.WeChatPay.Request
             var parameters = new WeChatPayDictionary
             {
                 { "mch_billno", MchBillNo },
-                { "wxappid", WxAppId },
                 { "sender_name", SenderName },
                 { "agentid", AgentId },
                 { "sender_header_media_id", SenderHeaderMediaId },
@@ -89,7 +84,33 @@ namespace Essensoft.AspNetCore.Payment.WeChatPay.Request
             return parameters;
         }
 
-        public bool IsCheckResponseSign()
+        public WeChatPaySignType GetSignType()
+        {
+            return WeChatPaySignType.MD5;
+        }
+
+        public void PrimaryHandler(WeChatPayOptions options, WeChatPaySignType signType, WeChatPayDictionary sortedTxtParams)
+        {
+            sortedTxtParams.Add(WeChatPayConsts.nonce_str, WeChatPayUtility.GenerateNonceStr());
+            sortedTxtParams.Add(WeChatPayConsts.wxappid, options.AppId);
+            sortedTxtParams.Add(WeChatPayConsts.mch_id, options.MchId);
+
+            var signList = new List<string>
+            {
+                "act_name",
+                "mch_billno",
+                "mch_id",
+                "nonce_str",
+                "re_openid",
+                "total_amount",
+                "wxappid",
+            };
+
+            sortedTxtParams.Add(WeChatPayConsts.workwx_sign, WeChatPaySignature.SignWithSecret(sortedTxtParams, options.Secret, signList));
+            sortedTxtParams.Add(WeChatPayConsts.sign, WeChatPaySignature.SignWithKey(sortedTxtParams, options.Key, signType));
+        }
+
+        public bool GetNeedCheckSign()
         {
             return true;
         }

+ 18 - 9
src/Essensoft.AspNetCore.Payment.WeChatPay/Request/WeChatPayAuthCodeToOpenIdRequest.cs → src/Essensoft.AspNetCore.Payment.WeChatPay/Request/WeChatPayToolsAuthCodeToOpenIdRequest.cs

@@ -1,20 +1,16 @@
 using System.Collections.Generic;
 using Essensoft.AspNetCore.Payment.WeChatPay.Response;
+using Essensoft.AspNetCore.Payment.WeChatPay.Utility;
 
 namespace Essensoft.AspNetCore.Payment.WeChatPay.Request
 {
     /// <summary>
     /// 授权码查询openid
     /// </summary>
-    public class WeChatPayAuthCodeToOpenIdRequest : IWeChatPayRequest<WeChatPayAuthCodeToOpenIdResponse>
+    public class WeChatPayToolsAuthCodeToOpenIdRequest : IWeChatPayRequest<WeChatPayToolsAuthCodeToOpenIdResponse>
     {
         /// <summary>
-        /// 应用ID
-        /// </summary>
-        public string AppId { get; set; }
-
-        /// <summary>
-        /// 子商户应用ID
+        /// 子商户应用号
         /// </summary>
         public string SubAppId { get; set; }
 
@@ -39,7 +35,6 @@ namespace Essensoft.AspNetCore.Payment.WeChatPay.Request
         {
             var parameters = new WeChatPayDictionary
             {
-                { "appid", AppId },
                 { "sub_appid", SubAppId },
                 { "sub_mch_id", SubMchId },
                 { "auth_code", AuthCode }
@@ -47,7 +42,21 @@ namespace Essensoft.AspNetCore.Payment.WeChatPay.Request
             return parameters;
         }
 
-        public bool IsCheckResponseSign()
+        public WeChatPaySignType GetSignType()
+        {
+            return WeChatPaySignType.MD5;
+        }
+
+        public void PrimaryHandler(WeChatPayOptions options, WeChatPaySignType signType, WeChatPayDictionary sortedTxtParams)
+        {
+            sortedTxtParams.Add(WeChatPayConsts.nonce_str, WeChatPayUtility.GenerateNonceStr());
+            sortedTxtParams.Add(WeChatPayConsts.appid, options.AppId);
+            sortedTxtParams.Add(WeChatPayConsts.mch_id, options.MchId);
+
+            sortedTxtParams.Add(WeChatPayConsts.sign, WeChatPaySignature.SignWithKey(sortedTxtParams, options.Key, signType));
+        }
+
+        public bool GetNeedCheckSign()
         {
             return true;
         }

+ 20 - 10
src/Essensoft.AspNetCore.Payment.WeChatPay/Request/WeChatPayShortUrlRequest.cs → src/Essensoft.AspNetCore.Payment.WeChatPay/Request/WeChatPayToolsShortUrlRequest.cs

@@ -1,20 +1,16 @@
-using System.Collections.Generic;
+using System.Collections.Generic;
 using Essensoft.AspNetCore.Payment.WeChatPay.Response;
+using Essensoft.AspNetCore.Payment.WeChatPay.Utility;
 
 namespace Essensoft.AspNetCore.Payment.WeChatPay.Request
 {
     /// <summary>
     /// 转换短链接
     /// </summary>
-    public class WeChatPayShortUrlRequest : IWeChatPayRequest<WeChatPayShortUrlResponse>
+    public class WeChatPayToolsShortUrlRequest : IWeChatPayRequest<WeChatPayToolsShortUrlResponse>
     {
         /// <summary>
-        /// 应用ID
-        /// </summary>
-        public string AppId { get; set; }
-
-        /// <summary>
-        /// 子商户公众账号ID
+        /// 子商户应用号
         /// </summary>
         public string SubAppId { get; set; }
 
@@ -39,7 +35,6 @@ namespace Essensoft.AspNetCore.Payment.WeChatPay.Request
         {
             var parameters = new WeChatPayDictionary
             {
-                { "appid", AppId },
                 { "sub_appid", SubAppId },
                 { "sub_mch_id", SubMchId },
                 { "long_url", LongUrl }
@@ -47,7 +42,22 @@ namespace Essensoft.AspNetCore.Payment.WeChatPay.Request
             return parameters;
         }
 
-        public bool IsCheckResponseSign()
+        public WeChatPaySignType GetSignType()
+        {
+            return WeChatPaySignType.MD5;
+        }
+
+
+        public void PrimaryHandler(WeChatPayOptions options, WeChatPaySignType signType, WeChatPayDictionary sortedTxtParams)
+        {
+            sortedTxtParams.Add(WeChatPayConsts.nonce_str, WeChatPayUtility.GenerateNonceStr());
+            sortedTxtParams.Add(WeChatPayConsts.appid, options.AppId);
+            sortedTxtParams.Add(WeChatPayConsts.mch_id, options.MchId);
+
+            sortedTxtParams.Add(WeChatPayConsts.sign, WeChatPaySignature.SignWithKey(sortedTxtParams, options.Key, signType));
+        }
+
+        public bool GetNeedCheckSign()
         {
             return true;
         }

+ 144 - 0
src/Essensoft.AspNetCore.Payment.WeChatPay/Request/WeChatPayTransitPartnerPayPayApplyRequest.cs

@@ -0,0 +1,144 @@
+using System.Collections.Generic;
+using Essensoft.AspNetCore.Payment.WeChatPay.Response;
+using Essensoft.AspNetCore.Payment.WeChatPay.Utility;
+
+namespace Essensoft.AspNetCore.Payment.WeChatPay.Request
+{
+    /// <summary>
+    /// 微信代扣 - 乘车码代扣 - 申请扣款
+    /// </summary>
+    public class WeChatPayTransitPartnerPayPayApplyRequest : IWeChatPayRequest<WeChatPayTransitPartnerPayPayApplyResponse>
+    {
+        /// <summary>
+        /// 子商户应用号
+        /// </summary>
+        public string SubAppId { get; set; }
+
+        /// <summary>
+        /// 子商户号
+        /// </summary>
+        public string SubMchId { get; set; }
+
+        /// <summary>
+        /// 商品描述
+        /// </summary>
+        public string Body { get; set; }
+
+        /// <summary>
+        /// 商品详情
+        /// </summary>
+        public string Detail { get; set; }
+
+        /// <summary>
+        /// 附加数据
+        /// </summary>
+        public string Attach { get; set; }
+
+        /// <summary>
+        /// 商户订单号
+        /// </summary>
+        public string OutTradeNo { get; set; }
+
+        /// <summary>
+        /// 总金额
+        /// </summary>
+        public int TotalFee { get; set; }
+
+        /// <summary>
+        /// 货币类型
+        /// </summary>
+        public int FeeType { get; set; }
+
+        /// <summary>
+        /// 终端IP
+        /// </summary>
+        public int SpBillCreateIp { get; set; }
+
+        /// <summary>
+        /// 商品标记
+        /// </summary>
+        public int GoodsTag { get; set; }
+
+        /// <summary>
+        /// 回调通知url
+        /// </summary>
+        public int NotifyUrl { get; set; }
+
+        /// <summary>
+        /// 交易类型
+        /// </summary>
+        public int TradeType { get; set; }
+
+        /// <summary>
+        /// 委托代扣协议id
+        /// </summary>
+        public int ContractId { get; set; }
+
+        /// <summary>
+        /// 交易场景
+        /// </summary>
+        public string TradeScene { get; set; }
+
+        /// <summary>
+        /// 场景信息
+        /// </summary>
+        public string SceneInfo { get; set; }
+
+
+        #region IWeChatPayRequest Members
+
+        public string GetRequestUrl()
+        {
+            return "https://api.mch.weixin.qq.com/vehicle/partnerpay/payapply";
+        }
+
+        public IDictionary<string, string> GetParameters()
+        {
+            var parameters = new WeChatPayDictionary
+            {
+                { "sub_appid", SubAppId },
+                { "sub_mch_id", SubMchId },
+                { "body", Body },
+                { "detail", Detail },
+                { "attach", Attach },
+                { "out_trade_no", OutTradeNo },
+                { "total_fee", TotalFee },
+                { "fee_type", FeeType },
+                { "spbill_create_ip", SpBillCreateIp },
+                { "goods_tag", GoodsTag },
+                { "notify_url", NotifyUrl },
+                { "trade_type", TradeType },
+                { "contract_id", ContractId },
+                { "trade_scene", TradeScene },
+                { "scene_info", SceneInfo },
+            };
+            return parameters;
+        }
+
+        public WeChatPaySignType GetSignType()
+        {
+            return WeChatPaySignType.HMAC_SHA256;
+        }
+
+        public void PrimaryHandler(WeChatPayOptions options, WeChatPaySignType signType, WeChatPayDictionary sortedTxtParams)
+        {
+            sortedTxtParams.Add(WeChatPayConsts.nonce_str, WeChatPayUtility.GenerateNonceStr());
+            sortedTxtParams.Add(WeChatPayConsts.appid, options.AppId);
+            sortedTxtParams.Add(WeChatPayConsts.mch_id, options.MchId);
+
+            if (signType == WeChatPaySignType.HMAC_SHA256)
+            {
+                sortedTxtParams.Add(WeChatPayConsts.sign_type, WeChatPayConsts.HMAC_SHA256);
+            }
+
+            sortedTxtParams.Add(WeChatPayConsts.sign, WeChatPaySignature.SignWithKey(sortedTxtParams, options.Key, signType));
+        }
+
+        public bool GetNeedCheckSign()
+        {
+            return true;
+        }
+
+        #endregion
+    }
+}

+ 83 - 0
src/Essensoft.AspNetCore.Payment.WeChatPay/Request/WeChatPayTransitPartnerPayQueryOrderRequest.cs

@@ -0,0 +1,83 @@
+using System.Collections.Generic;
+using Essensoft.AspNetCore.Payment.WeChatPay.Response;
+using Essensoft.AspNetCore.Payment.WeChatPay.Utility;
+
+namespace Essensoft.AspNetCore.Payment.WeChatPay.Request
+{
+    /// <summary>
+    /// 微信代扣 - 车主平台/乘车码代扣 - 查询订单
+    /// </summary>
+    public class WeChatPayTransitPartnerPayQueryOrderRequest : IWeChatPayRequest<WeChatPayTransitPartnerPayQueryOrderResponse>
+    {
+        /// <summary>
+        /// 子商户应用号
+        /// </summary>
+        public string SubAppId { get; set; }
+
+        /// <summary>
+        /// 子商户号
+        /// </summary>
+        public string SubMchId { get; set; }
+
+        /// <summary>
+        /// 微信订单号
+        /// </summary>
+        public string TransactionId { get; set; }
+
+        /// <summary>
+        /// 商户订单号
+        /// </summary>
+        public string OutTradeNo { get; set; }
+
+        /// <summary>
+        /// 委托代扣协议id
+        /// </summary>
+        public string ContractId { get; set; }
+
+        #region IWeChatPayRequest Members
+
+        public string GetRequestUrl()
+        {
+            return "https://api.mch.weixin.qq.com/transit/partnerpay/queryorder";
+        }
+
+        public IDictionary<string, string> GetParameters()
+        {
+            var parameters = new WeChatPayDictionary
+            {
+                { "sub_appid", SubAppId },
+                { "sub_mch_id", SubMchId },
+                { "transaction_id", TransactionId },
+                { "out_trade_no", OutTradeNo },
+                { "contract_id", ContractId },
+            };
+            return parameters;
+        }
+
+        public WeChatPaySignType GetSignType()
+        {
+            return WeChatPaySignType.HMAC_SHA256;
+        }
+
+        public void PrimaryHandler(WeChatPayOptions options, WeChatPaySignType signType, WeChatPayDictionary sortedTxtParams)
+        {
+            sortedTxtParams.Add(WeChatPayConsts.nonce_str, WeChatPayUtility.GenerateNonceStr());
+            sortedTxtParams.Add(WeChatPayConsts.appid, options.AppId);
+            sortedTxtParams.Add(WeChatPayConsts.mch_id, options.MchId);
+
+            if (signType == WeChatPaySignType.HMAC_SHA256)
+            {
+                sortedTxtParams.Add(WeChatPayConsts.sign_type, WeChatPayConsts.HMAC_SHA256);
+            }
+
+            sortedTxtParams.Add(WeChatPayConsts.sign, WeChatPaySignature.SignWithKey(sortedTxtParams, options.Key, signType));
+        }
+
+        public bool GetNeedCheckSign()
+        {
+            return true;
+        }
+
+        #endregion
+    }
+}

+ 77 - 0
src/Essensoft.AspNetCore.Payment.WeChatPay/Request/WeChatPayTransitPartnerPayQueryStateRequest.cs

@@ -0,0 +1,77 @@
+using System.Collections.Generic;
+using Essensoft.AspNetCore.Payment.WeChatPay.Response;
+using Essensoft.AspNetCore.Payment.WeChatPay.Utility;
+
+namespace Essensoft.AspNetCore.Payment.WeChatPay.Request
+{
+    /// <summary>
+    /// 微信代扣 - 乘车码代扣 - 用户状态查询
+    /// </summary>
+    public class WeChatPayTransitPartnerPayQueryStateRequest : IWeChatPayRequest<WeChatPayTransitPartnerPayQueryStateResponse>
+    {
+        /// <summary>
+        /// 子商户应用号
+        /// </summary>
+        public string SubAppId { get; set; }
+
+        /// <summary>
+        /// 子商户号
+        /// </summary>
+        public string SubMchId { get; set; }
+
+        /// <summary>
+        /// 委托代扣协议id
+        /// </summary>
+        public string ContractId { get; set; }
+
+        /// <summary>
+        /// 微信OpenId
+        /// </summary>
+        public string OpenId { get; set; }
+
+        #region IWeChatPayRequest Members
+
+        public string GetRequestUrl()
+        {
+            return "https://api.mch.weixin.qq.com/transit/partnerpay/querystate";
+        }
+
+        public IDictionary<string, string> GetParameters()
+        {
+            var parameters = new WeChatPayDictionary
+            {
+                { "sub_appid", SubAppId },
+                { "sub_mch_id", SubMchId },
+                { "contract_id", ContractId },
+                { "openid", OpenId },
+            };
+            return parameters;
+        }
+
+        public WeChatPaySignType GetSignType()
+        {
+            return WeChatPaySignType.HMAC_SHA256;
+        }
+
+        public void PrimaryHandler(WeChatPayOptions options, WeChatPaySignType signType, WeChatPayDictionary sortedTxtParams)
+        {
+            sortedTxtParams.Add(WeChatPayConsts.nonce_str, WeChatPayUtility.GenerateNonceStr());
+            sortedTxtParams.Add(WeChatPayConsts.appid, options.AppId);
+            sortedTxtParams.Add(WeChatPayConsts.mch_id, options.MchId);
+
+            if (signType == WeChatPaySignType.HMAC_SHA256)
+            {
+                sortedTxtParams.Add(WeChatPayConsts.sign_type, WeChatPayConsts.HMAC_SHA256);
+            }
+
+            sortedTxtParams.Add(WeChatPayConsts.sign, WeChatPaySignature.SignWithKey(sortedTxtParams, options.Key, signType));
+        }
+
+        public bool GetNeedCheckSign()
+        {
+            return true;
+        }
+
+        #endregion
+    }
+}

+ 21 - 11
src/Essensoft.AspNetCore.Payment.WeChatPay/Request/WeChatPayUnifiedOrderRequest.cs

@@ -1,5 +1,6 @@
-using System.Collections.Generic;
+using System.Collections.Generic;
 using Essensoft.AspNetCore.Payment.WeChatPay.Response;
+using Essensoft.AspNetCore.Payment.WeChatPay.Utility;
 
 namespace Essensoft.AspNetCore.Payment.WeChatPay.Request
 {
@@ -9,12 +10,7 @@ namespace Essensoft.AspNetCore.Payment.WeChatPay.Request
     public class WeChatPayUnifiedOrderRequest : IWeChatPayRequest<WeChatPayUnifiedOrderResponse>
     {
         /// <summary>
-        /// 应用ID
-        /// </summary>
-        public string AppId { get; set; }
-
-        /// <summary>
-        /// 子商户公众账号ID
+        /// 子商户应用号
         /// </summary>
         public string SubAppId { get; set; }
 
@@ -61,7 +57,7 @@ namespace Essensoft.AspNetCore.Payment.WeChatPay.Request
         /// <summary>
         /// 终端IP
         /// </summary>
-        public string SpbillCreateIp { get; set; }
+        public string SpBillCreateIp { get; set; }
 
         /// <summary>
         /// 交易起始时间
@@ -125,7 +121,6 @@ namespace Essensoft.AspNetCore.Payment.WeChatPay.Request
         {
             var parameters = new WeChatPayDictionary
             {
-                { "appid", AppId },
                 { "sub_appid", SubAppId },
                 { "sub_mch_id", SubMchId },
                 { "device_info", DeviceInfo },
@@ -135,7 +130,7 @@ namespace Essensoft.AspNetCore.Payment.WeChatPay.Request
                 { "out_trade_no", OutTradeNo },
                 { "fee_type", FeeType },
                 { "total_fee", TotalFee },
-                { "spbill_create_ip", SpbillCreateIp },
+                { "spbill_create_ip", SpBillCreateIp },
                 { "time_start", TimeStart },
                 { "time_expire", TimeExpire },
                 { "goods_tag", GoodsTag },
@@ -150,7 +145,22 @@ namespace Essensoft.AspNetCore.Payment.WeChatPay.Request
             return parameters;
         }
 
-        public bool IsCheckResponseSign()
+        public WeChatPaySignType GetSignType()
+        {
+            return WeChatPaySignType.MD5;
+        }
+
+
+        public void PrimaryHandler(WeChatPayOptions options, WeChatPaySignType signType, WeChatPayDictionary sortedTxtParams)
+        {
+            sortedTxtParams.Add(WeChatPayConsts.nonce_str, WeChatPayUtility.GenerateNonceStr());
+            sortedTxtParams.Add(WeChatPayConsts.appid, options.AppId);
+            sortedTxtParams.Add(WeChatPayConsts.mch_id, options.MchId);
+
+            sortedTxtParams.Add(WeChatPayConsts.sign, WeChatPaySignature.SignWithKey(sortedTxtParams, options.Key, signType));
+        }
+
+        public bool GetNeedCheckSign()
         {
             return true;
         }

+ 83 - 0
src/Essensoft.AspNetCore.Payment.WeChatPay/Request/WeChatPayVehiclePartnerPayNotificationRequest.cs

@@ -0,0 +1,83 @@
+using System.Collections.Generic;
+using Essensoft.AspNetCore.Payment.WeChatPay.Response;
+using Essensoft.AspNetCore.Payment.WeChatPay.Utility;
+
+namespace Essensoft.AspNetCore.Payment.WeChatPay.Request
+{
+    /// <summary>
+    /// 微信代扣 - 车主平台 - 用户入场通知
+    /// </summary>
+    public class WeChatPayVehiclePartnerPayNotificationRequest : IWeChatPayRequest<WeChatPayVehiclePartnerPayNotificationResponse>
+    {
+        /// <summary>
+        /// 子商户应用号
+        /// </summary>
+        public string SubAppId { get; set; }
+
+        /// <summary>
+        /// 子商户号
+        /// </summary>
+        public string SubMchId { get; set; }
+
+        /// <summary>
+        /// 版本号
+        /// </summary>
+        public string Version { get; set; }
+
+        /// <summary>
+        /// 交易场景
+        /// </summary>
+        public string TradeScene { get; set; }
+
+        /// <summary>
+        /// 场景信息
+        /// </summary>
+        public string SceneInfo { get; set; }
+
+        #region IWeChatPayRequest Members
+
+        public string GetRequestUrl()
+        {
+            return "https://api.mch.weixin.qq.com/vehicle/partnerpay/notification";
+        }
+
+        public IDictionary<string, string> GetParameters()
+        {
+            var parameters = new WeChatPayDictionary
+            {
+                { "sub_appid", SubAppId },
+                { "sub_mch_id", SubMchId },
+                { "version", Version },
+                { "trade_scene", TradeScene },
+                { "scene_info", SceneInfo },
+            };
+            return parameters;
+        }
+
+        public WeChatPaySignType GetSignType()
+        {
+            return WeChatPaySignType.HMAC_SHA256;
+        }
+
+        public void PrimaryHandler(WeChatPayOptions options, WeChatPaySignType signType, WeChatPayDictionary sortedTxtParams)
+        {
+            sortedTxtParams.Add(WeChatPayConsts.nonce_str, WeChatPayUtility.GenerateNonceStr());
+            sortedTxtParams.Add(WeChatPayConsts.appid, options.AppId);
+            sortedTxtParams.Add(WeChatPayConsts.mch_id, options.MchId);
+
+            if (signType == WeChatPaySignType.HMAC_SHA256)
+            {
+                sortedTxtParams.Add(WeChatPayConsts.sign_type, WeChatPayConsts.HMAC_SHA256);
+            }
+
+            sortedTxtParams.Add(WeChatPayConsts.sign, WeChatPaySignature.SignWithKey(sortedTxtParams, options.Key, signType));
+        }
+
+        public bool GetNeedCheckSign()
+        {
+            return true;
+        }
+
+        #endregion
+    }
+}

+ 101 - 0
src/Essensoft.AspNetCore.Payment.WeChatPay/Request/WeChatPayVehiclePartnerPayQueryStateRequest.cs

@@ -0,0 +1,101 @@
+using System.Collections.Generic;
+using Essensoft.AspNetCore.Payment.WeChatPay.Response;
+using Essensoft.AspNetCore.Payment.WeChatPay.Utility;
+
+namespace Essensoft.AspNetCore.Payment.WeChatPay.Request
+{
+    /// <summary>
+    /// 微信代扣 - 车主平台 - 用户状态查询
+    /// </summary>
+    public class WeChatPayVehiclePartnerPayQueryStateRequest : IWeChatPayRequest<WeChatPayVehiclePartnerPayQueryStateResponse>
+    {
+        /// <summary>
+        /// 子商户应用号
+        /// </summary>
+        public string SubAppId { get; set; }
+
+        /// <summary>
+        /// 子商户号
+        /// </summary>
+        public string SubMchId { get; set; }
+
+        /// <summary>
+        /// 交易场景
+        /// </summary>
+        public string TradeScene { get; set; }
+
+        /// <summary>
+        /// 跳转场景
+        /// </summary>
+        public string JumpScene { get; set; }
+
+        /// <summary>
+        /// 用户标识
+        /// </summary>
+        public string OpenId { get; set; }
+
+        /// <summary>
+        /// 用户子标识
+        /// </summary>
+        public string SubOpenId { get; set; }
+
+        /// <summary>
+        /// 车牌号
+        /// </summary>
+        public string PlateNumber { get; set; }
+
+        /// <summary>
+        /// 版本号
+        /// </summary>
+        public string Version { get; set; }
+
+        #region IWeChatPayRequest Members
+
+        public string GetRequestUrl()
+        {
+            return "https://api.mch.weixin.qq.com/vehicle/partnerpay/querystate";
+        }
+
+        public IDictionary<string, string> GetParameters()
+        {
+            var parameters = new WeChatPayDictionary
+            {
+                { "sub_appid", SubAppId },
+                { "sub_mch_id", SubMchId },
+                { "trade_scene", TradeScene },
+                { "jump_scene", JumpScene },
+                { "openid", OpenId },
+                { "sub_openid", SubOpenId },
+                { "plate_number", PlateNumber },
+                { "version", Version },
+            };
+            return parameters;
+        }
+
+        public WeChatPaySignType GetSignType()
+        {
+            return WeChatPaySignType.HMAC_SHA256;
+        }
+
+        public void PrimaryHandler(WeChatPayOptions options, WeChatPaySignType signType, WeChatPayDictionary sortedTxtParams)
+        {
+            sortedTxtParams.Add(WeChatPayConsts.nonce_str, WeChatPayUtility.GenerateNonceStr());
+            sortedTxtParams.Add(WeChatPayConsts.appid, options.AppId);
+            sortedTxtParams.Add(WeChatPayConsts.mch_id, options.MchId);
+
+            if (signType == WeChatPaySignType.HMAC_SHA256)
+            {
+                sortedTxtParams.Add(WeChatPayConsts.sign_type, WeChatPayConsts.HMAC_SHA256);
+            }
+
+            sortedTxtParams.Add(WeChatPayConsts.sign, WeChatPaySignature.SignWithKey(sortedTxtParams, options.Key, signType));
+        }
+
+        public bool GetNeedCheckSign()
+        {
+            return true;
+        }
+
+        #endregion
+    }
+}

+ 144 - 0
src/Essensoft.AspNetCore.Payment.WeChatPay/Request/WeChatPayVehiclePartnerpayPayApplyRequest.cs

@@ -0,0 +1,144 @@
+using System.Collections.Generic;
+using Essensoft.AspNetCore.Payment.WeChatPay.Response;
+using Essensoft.AspNetCore.Payment.WeChatPay.Utility;
+
+namespace Essensoft.AspNetCore.Payment.WeChatPay.Request
+{
+    /// <summary>
+    /// 微信代扣 - 车主平台 - 申请扣款
+    /// </summary>
+    public class WeChatPayVehiclePartnerPayPayApplyRequest : IWeChatPayRequest<WeChatPayVehiclePartnerPayPayApplyResponse>
+    {
+        /// <summary>
+        /// 子商户应用号
+        /// </summary>
+        public string SubAppId { get; set; }
+
+        /// <summary>
+        /// 子商户号
+        /// </summary>
+        public string SubMchId { get; set; }
+
+        /// <summary>
+        /// 商品描述
+        /// </summary>
+        public string Body { get; set; }
+
+        /// <summary>
+        /// 商品详情
+        /// </summary>
+        public string Detail { get; set; }
+
+        /// <summary>
+        /// 附加数据
+        /// </summary>
+        public string Attach { get; set; }
+
+        /// <summary>
+        /// 商户订单号
+        /// </summary>
+        public string OutTradeNo { get; set; }
+
+        /// <summary>
+        /// 总金额
+        /// </summary>
+        public int TotalFee { get; set; }
+
+        /// <summary>
+        /// 货币类型
+        /// </summary>
+        public int FeeType { get; set; }
+
+        /// <summary>
+        /// 终端IP
+        /// </summary>
+        public int SpBillCreateIp { get; set; }
+
+        /// <summary>
+        /// 商品标记
+        /// </summary>
+        public int GoodsTag { get; set; }
+
+        /// <summary>
+        /// 回调通知url
+        /// </summary>
+        public int NotifyUrl { get; set; }
+
+        /// <summary>
+        /// 交易类型
+        /// </summary>
+        public int TradeType { get; set; }
+
+        /// <summary>
+        /// 版本号
+        /// </summary>
+        public string Version { get; set; }
+
+        /// <summary>
+        /// 交易场景
+        /// </summary>
+        public string TradeScene { get; set; }
+
+        /// <summary>
+        /// 场景信息
+        /// </summary>
+        public string SceneInfo { get; set; }
+
+
+        #region IWeChatPayRequest Members
+
+        public string GetRequestUrl()
+        {
+            return "https://api.mch.weixin.qq.com/vehicle/partnerpay/payapply";
+        }
+
+        public IDictionary<string, string> GetParameters()
+        {
+            var parameters = new WeChatPayDictionary
+            {
+                { "sub_appid", SubAppId },
+                { "sub_mch_id", SubMchId },
+                { "body", Body },
+                { "detail", Detail },
+                { "attach", Attach },
+                { "out_trade_no", OutTradeNo },
+                { "total_fee", TotalFee },
+                { "fee_type", FeeType },
+                { "spbill_create_ip", SpBillCreateIp },
+                { "goods_tag", GoodsTag },
+                { "notify_url", NotifyUrl },
+                { "trade_type", TradeType },
+                { "version", Version },
+                { "trade_scene", TradeScene },
+                { "scene_info", SceneInfo },
+            };
+            return parameters;
+        }
+
+        public WeChatPaySignType GetSignType()
+        {
+            return WeChatPaySignType.HMAC_SHA256;
+        }
+
+        public void PrimaryHandler(WeChatPayOptions options, WeChatPaySignType signType, WeChatPayDictionary sortedTxtParams)
+        {
+            sortedTxtParams.Add(WeChatPayConsts.nonce_str, WeChatPayUtility.GenerateNonceStr());
+            sortedTxtParams.Add(WeChatPayConsts.appid, options.AppId);
+            sortedTxtParams.Add(WeChatPayConsts.mch_id, options.MchId);
+
+            if (signType == WeChatPaySignType.HMAC_SHA256)
+            {
+                sortedTxtParams.Add(WeChatPayConsts.sign_type, WeChatPayConsts.HMAC_SHA256);
+            }
+
+            sortedTxtParams.Add(WeChatPayConsts.sign, WeChatPaySignature.SignWithKey(sortedTxtParams, options.Key, signType));
+        }
+
+        public bool GetNeedCheckSign()
+        {
+            return true;
+        }
+
+        #endregion
+    }
+}

+ 2 - 6
src/Essensoft.AspNetCore.Payment.WeChatPay/Response/WeChatPayBatchQueryCommentResponse.cs → src/Essensoft.AspNetCore.Payment.WeChatPay/Response/WeChatPayBillCommentSpBatchQueryCommentResponse.cs

@@ -3,20 +3,16 @@
 namespace Essensoft.AspNetCore.Payment.WeChatPay.Response
 {
     [XmlRoot("xml")]
-    public class WeChatPayBatchQueryCommentResponse : WeChatPayResponse
+    public class WeChatPayBillCommentSpBatchQueryCommentResponse : WeChatPayResponse
     {
         /// <summary>
         /// 返回状态码
-        /// 此字段是通信标识,非交易标识,
-        /// 交易是否成功需要查看result_code来判断
         /// </summary>
         [XmlElement("return_code")]
         public string ReturnCode { get; set; }
 
         /// <summary>
-        /// 返回信息,如非空,为错误原因
-        /// 签名失败
-        /// 参数格式校验错误
+        /// 返回信息
         /// </summary>
         [XmlElement("return_msg")]
         public string ReturnMsg { get; set; }

+ 15 - 7
src/Essensoft.AspNetCore.Payment.WeChatPay/Response/WeChatPayCloseOrderResponse.cs

@@ -7,22 +7,18 @@ namespace Essensoft.AspNetCore.Payment.WeChatPay.Response
     {
         /// <summary>
         /// 返回状态码
-        /// 此字段是通信标识,非交易标识,
-        /// 交易是否成功需要查看result_code来判断
         /// </summary>
         [XmlElement("return_code")]
         public string ReturnCode { get; set; }
 
         /// <summary>
-        /// 返回信息,如非空,为错误原因
-        /// 签名失败
-        /// 参数格式校验错误
+        /// 返回信息
         /// </summary>
         [XmlElement("return_msg")]
         public string ReturnMsg { get; set; }
 
         /// <summary>
-        /// 公众账号ID
+        /// 应用号
         /// </summary>
         [XmlElement("appid")]
         public string AppId { get; set; }
@@ -34,7 +30,7 @@ namespace Essensoft.AspNetCore.Payment.WeChatPay.Response
         public string MchId { get; set; }
 
         /// <summary>
-        /// 子商户公众账号ID
+        /// 子商户应用号
         /// </summary>
         [XmlElement("sub_appid")]
         public string SubAppId { get; set; }
@@ -57,6 +53,18 @@ namespace Essensoft.AspNetCore.Payment.WeChatPay.Response
         [XmlElement("sign")]
         public string Sign { get; set; }
 
+        /// <summary>
+        /// 业务结果
+        /// </summary>
+        [XmlElement("result_code")]
+        public string ResultCode { get; set; }
+
+        /// <summary>
+        /// 业务结果描述	
+        /// </summary>
+        [XmlElement("result_msg")]
+        public string ResultMsg { get; set; }
+
         /// <summary>
         /// 错误代码
         /// </summary>

+ 4 - 8
src/Essensoft.AspNetCore.Payment.WeChatPay/Response/WeChatPayDepositConsumeResponse.cs

@@ -7,28 +7,24 @@ namespace Essensoft.AspNetCore.Payment.WeChatPay.Response
     {
         /// <summary>
         /// 返回状态码
-        /// 此字段是通信标识,非交易标识,
-        /// 交易是否成功需要查看result_code来判断
         /// </summary>
         [XmlElement("return_code")]
         public string ReturnCode { get; set; }
 
         /// <summary>
-        /// 返回信息,如非空,为错误原因
-        /// 签名失败
-        /// 参数格式校验错误
+        /// 返回信息
         /// </summary>
         [XmlElement("return_msg")]
         public string ReturnMsg { get; set; }
 
         /// <summary>
-        /// 公众账号ID
+        /// 应用号
         /// </summary>
         [XmlElement("appid")]
         public string AppId { get; set; }
 
         /// <summary>
-        /// 子商户公众账号ID
+        /// 子商户应用号
         /// </summary>
         [XmlElement("sub_appid")]
         public string SubAppId { get; set; }
@@ -97,7 +93,7 @@ namespace Essensoft.AspNetCore.Payment.WeChatPay.Response
         /// 押金消费金额
         /// </summary>
         [XmlElement("consume_fee")]
-        public string ConsumeFee { get; set; }
+        public int ConsumeFee { get; set; }
 
         /// <summary>
         /// 货币类型

+ 176 - 0
src/Essensoft.AspNetCore.Payment.WeChatPay/Response/WeChatPayDepositFacePayResponse.cs

@@ -0,0 +1,176 @@
+using System.Xml.Serialization;
+
+namespace Essensoft.AspNetCore.Payment.WeChatPay.Response
+{
+    [XmlRoot("xml")]
+    public class WeChatPayDepositFacePayResponse : WeChatPayResponse
+    {
+        /// <summary>
+        /// 返回状态码
+        /// </summary>
+        [XmlElement("return_code")]
+        public string ReturnCode { get; set; }
+
+        /// <summary>
+        /// 返回信息
+        /// </summary>
+        [XmlElement("return_msg")]
+        public string ReturnMsg { get; set; }
+
+        /// <summary>
+        /// 应用号
+        /// </summary>
+        [XmlElement("appid")]
+        public string AppId { get; set; }
+
+        /// <summary>
+        /// 子商户应用号
+        /// </summary>
+        [XmlElement("sub_appid")]
+        public string SubAppId { get; set; }
+
+        /// <summary>
+        /// 商户号
+        /// </summary>
+        [XmlElement("mch_id")]
+        public string MchId { get; set; }
+
+        /// <summary>
+        /// 子商户号
+        /// </summary>
+        [XmlElement("sub_mch_id")]
+        public string SubMchId { get; set; }
+
+        /// <summary>
+        /// 设备号
+        /// </summary>
+        [XmlElement("device_info")]
+        public string DeviceInfo { get; set; }
+
+        /// <summary>
+        /// 随机字符串
+        /// </summary>
+        [XmlElement("nonce_str")]
+        public string NonceStr { get; set; }
+
+        /// <summary>
+        /// 签名
+        /// </summary>
+        [XmlElement("sign")]
+        public string Sign { get; set; }
+
+        /// <summary>
+        /// 业务结果
+        /// </summary>
+        [XmlElement("result_code")]
+        public string ResultCode { get; set; }
+
+        /// <summary>
+        /// 错误代码
+        /// </summary>
+        [XmlElement("err_code")]
+        public string ErrCode { get; set; }
+
+        /// <summary>
+        /// 错误描述	
+        /// </summary>
+        [XmlElement("err_code_des")]
+        public string ErrCodeDes { get; set; }
+
+        /// <summary>
+        /// 用户标识	
+        /// </summary>
+        [XmlElement("openid")]
+        public string OpenId { get; set; }
+
+        /// <summary>
+        /// 是否关注公众账号	
+        /// </summary>
+        [XmlElement("is_subscribe")]
+        public string IsSubscribe { get; set; }
+
+        /// <summary>
+        /// 用户子标识	
+        /// </summary>
+        [XmlElement("sub_openid")]
+        public string SubOpenId { get; set; }
+
+        /// <summary>
+        /// 是否关注子公众账号	
+        /// </summary>
+        [XmlElement("sub_is_subscribe")]
+        public string SubIsSubscribe { get; set; }
+
+        /// <summary>
+        /// 交易类型
+        /// </summary>
+        [XmlElement("trade_type")]
+        public string TradeType { get; set; }
+
+        /// <summary>
+        /// 付款银行	
+        /// </summary>
+        [XmlElement("bank_type")]
+        public string BankType { get; set; }
+
+        /// <summary>
+        /// 标价币种	
+        /// </summary>
+        [XmlElement("fee_type")]
+        public string FeeType { get; set; }
+
+        /// <summary>
+        /// 标价金额		
+        /// </summary>
+        [XmlElement("total_fee")]
+        public int TotalFee { get; set; }
+
+        /// <summary>
+        /// 现金支付币种	
+        /// </summary>
+        [XmlElement("cash_fee_type")]
+        public string CashFeeType { get; set; }
+
+        /// <summary>
+        /// 现金支付金额	
+        /// </summary>
+        [XmlElement("cash_fee")]
+        public int CashFee { get; set; }
+
+        /// <summary>
+        /// 应结订单金额	
+        /// </summary>
+        [XmlElement("settlement_total_fee")]
+        public int SettlementTotalFee { get; set; }
+
+        /// <summary>
+        /// 代金券金额	
+        /// </summary>
+        [XmlElement("coupon_fee")]
+        public int CouponFee { get; set; }
+
+        /// <summary>
+        /// 微信支付订单号	
+        /// </summary>
+        [XmlElement("transaction_id")]
+        public string TransactionId { get; set; }
+
+        /// <summary>
+        /// 商户订单号	
+        /// </summary>
+        [XmlElement("out_trade_no")]
+        public string OutTradeNo { get; set; }
+
+        /// <summary>
+        /// 商家数据包	
+        /// </summary>
+        [XmlElement("attach")]
+        public string Attach { get; set; }
+
+        /// <summary>
+        /// 支付完成时间	
+        /// </summary>
+        [XmlElement("time_end")]
+        public string TimeEnd { get; set; }
+    }
+}

+ 7 - 11
src/Essensoft.AspNetCore.Payment.WeChatPay/Response/WeChatPayDepositMicroPayResponse.cs

@@ -7,28 +7,24 @@ namespace Essensoft.AspNetCore.Payment.WeChatPay.Response
     {
         /// <summary>
         /// 返回状态码
-        /// 此字段是通信标识,非交易标识,
-        /// 交易是否成功需要查看result_code来判断
         /// </summary>
         [XmlElement("return_code")]
         public string ReturnCode { get; set; }
 
         /// <summary>
-        /// 返回信息,如非空,为错误原因
-        /// 签名失败
-        /// 参数格式校验错误
+        /// 返回信息
         /// </summary>
         [XmlElement("return_msg")]
         public string ReturnMsg { get; set; }
 
         /// <summary>
-        /// 公众账号ID
+        /// 应用号
         /// </summary>
         [XmlElement("appid")]
         public string AppId { get; set; }
 
         /// <summary>
-        /// 子商户公众账号ID
+        /// 子商户应用号
         /// </summary>
         [XmlElement("sub_appid")]
         public string SubAppId { get; set; }
@@ -127,7 +123,7 @@ namespace Essensoft.AspNetCore.Payment.WeChatPay.Response
         /// 标价金额		
         /// </summary>
         [XmlElement("total_fee")]
-        public string TotalFee { get; set; }
+        public int TotalFee { get; set; }
 
         /// <summary>
         /// 现金支付币种	
@@ -139,19 +135,19 @@ namespace Essensoft.AspNetCore.Payment.WeChatPay.Response
         /// 现金支付金额	
         /// </summary>
         [XmlElement("cash_fee")]
-        public string CashFee { get; set; }
+        public int CashFee { get; set; }
 
         /// <summary>
         /// 应结订单金额	
         /// </summary>
         [XmlElement("settlement_total_fee")]
-        public string SettlementTotalFee { get; set; }
+        public int SettlementTotalFee { get; set; }
 
         /// <summary>
         /// 代金券金额	
         /// </summary>
         [XmlElement("coupon_fee")]
-        public string CouponFee { get; set; }
+        public int CouponFee { get; set; }
 
         /// <summary>
         /// 微信支付订单号	

+ 4 - 8
src/Essensoft.AspNetCore.Payment.WeChatPay/Response/WeChatPayDepositOrderQueryResponse.cs

@@ -7,22 +7,18 @@ namespace Essensoft.AspNetCore.Payment.WeChatPay.Response
     {
         /// <summary>
         /// 返回状态码
-        /// 此字段是通信标识,非交易标识,
-        /// 交易是否成功需要查看result_code来判断
         /// </summary>
         [XmlElement("return_code")]
         public string ReturnCode { get; set; }
 
         /// <summary>
-        /// 返回信息,如非空,为错误原因
-        /// 签名失败
-        /// 参数格式校验错误
+        /// 返回信息
         /// </summary>
         [XmlElement("return_msg")]
         public string ReturnMsg { get; set; }
 
         /// <summary>
-        /// 公众账号ID
+        /// 应用号
         /// </summary>
         [XmlElement("appid")]
         public string AppId { get; set; }
@@ -34,7 +30,7 @@ namespace Essensoft.AspNetCore.Payment.WeChatPay.Response
         public string MchId { get; set; }
 
         /// <summary>
-        /// 子商户公众账号ID
+        /// 子商户应用号
         /// </summary>
         [XmlElement("sub_appid")]
         public string SubAppId { get; set; }
@@ -193,6 +189,6 @@ namespace Essensoft.AspNetCore.Payment.WeChatPay.Response
         /// 押金消费金额
         /// </summary>
         [XmlElement("consume_fee")]
-        public string ConsumeFee { get; set; }
+        public int ConsumeFee { get; set; }
     }
 }

+ 4 - 8
src/Essensoft.AspNetCore.Payment.WeChatPay/Response/WeChatPayDepositRefundQueryResponse.cs

@@ -7,16 +7,12 @@ namespace Essensoft.AspNetCore.Payment.WeChatPay.Response
     {
         /// <summary>
         /// 返回状态码
-        /// 此字段是通信标识,非交易标识,
-        /// 交易是否成功需要查看result_code来判断
         /// </summary>
         [XmlElement("return_code")]
         public string ReturnCode { get; set; }
 
         /// <summary>
-        /// 返回信息,如非空,为错误原因
-        /// 签名失败
-        /// 参数格式校验错误
+        /// 返回信息
         /// </summary>
         [XmlElement("return_msg")]
         public string ReturnMsg { get; set; }
@@ -40,7 +36,7 @@ namespace Essensoft.AspNetCore.Payment.WeChatPay.Response
         public string ErrCodeDes { get; set; }
 
         /// <summary>
-        /// 公众账号ID
+        /// 应用号
         /// </summary>
         [XmlElement("appid")]
         public string AppId { get; set; }
@@ -52,7 +48,7 @@ namespace Essensoft.AspNetCore.Payment.WeChatPay.Response
         public string MchId { get; set; }
 
         /// <summary>
-        /// 子商户公众账号ID
+        /// 子商户应用号
         /// </summary>
         [XmlElement("sub_appid")]
         public string SubAppId { get; set; }
@@ -115,7 +111,7 @@ namespace Essensoft.AspNetCore.Payment.WeChatPay.Response
         /// 商户退款单号
         /// </summary>
         [XmlElement("out_refund_no")]
-        public string out_refund_no { get; set; }
+        public string OutRefundNo { get; set; }
 
         /// <summary>
         /// 微信退款单号

+ 5 - 9
src/Essensoft.AspNetCore.Payment.WeChatPay/Response/WeChatPayDepositRefundResponse.cs

@@ -7,16 +7,12 @@ namespace Essensoft.AspNetCore.Payment.WeChatPay.Response
     {
         /// <summary>
         /// 返回状态码
-        /// 此字段是通信标识,非交易标识,
-        /// 交易是否成功需要查看result_code来判断
         /// </summary>
         [XmlElement("return_code")]
         public string ReturnCode { get; set; }
 
         /// <summary>
-        /// 返回信息,如非空,为错误原因
-        /// 签名失败
-        /// 参数格式校验错误
+        /// 返回信息
         /// </summary>
         [XmlElement("return_msg")]
         public string ReturnMsg { get; set; }
@@ -40,7 +36,7 @@ namespace Essensoft.AspNetCore.Payment.WeChatPay.Response
         public string ErrCodeDes { get; set; }
 
         /// <summary>
-        /// 公众账号ID
+        /// 应用号
         /// </summary>
         [XmlElement("appid")]
         public string AppId { get; set; }
@@ -52,7 +48,7 @@ namespace Essensoft.AspNetCore.Payment.WeChatPay.Response
         public string MchId { get; set; }
 
         /// <summary>
-        /// 子商户公众账号ID
+        /// 子商户应用号
         /// </summary>
         [XmlElement("sub_appid")]
         public string SubAppId { get; set; }
@@ -103,13 +99,13 @@ namespace Essensoft.AspNetCore.Payment.WeChatPay.Response
         /// 申请退款金额	
         /// </summary>
         [XmlElement("refund_fee")]
-        public string RefundFee { get; set; }
+        public int RefundFee { get; set; }
 
         /// <summary>
         /// 退款金额	
         /// </summary>
         [XmlElement("settlement_refund_fee")]
-        public string SettlementRefundFee { get; set; }
+        public int SettlementRefundFee { get; set; }
 
         /// <summary>
         /// 订单金额	

+ 3 - 7
src/Essensoft.AspNetCore.Payment.WeChatPay/Response/WeChatPayDepositReverseResponse.cs

@@ -7,28 +7,24 @@ namespace Essensoft.AspNetCore.Payment.WeChatPay.Response
     {
         /// <summary>
         /// 返回状态码
-        /// 此字段是通信标识,非交易标识,
-        /// 交易是否成功需要查看result_code来判断
         /// </summary>
         [XmlElement("return_code")]
         public string ReturnCode { get; set; }
 
         /// <summary>
-        /// 返回信息,如非空,为错误原因
-        /// 签名失败
-        /// 参数格式校验错误
+        /// 返回信息
         /// </summary>
         [XmlElement("return_msg")]
         public string ReturnMsg { get; set; }
 
         /// <summary>
-        /// 公众账号ID
+        /// 应用号
         /// </summary>
         [XmlElement("appid")]
         public string AppId { get; set; }
 
         /// <summary>
-        /// 子商户公众账号ID
+        /// 子商户应用号
         /// </summary>
         [XmlElement("sub_appid")]
         public string SubAppId { get; set; }

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

@@ -7,16 +7,12 @@ namespace Essensoft.AspNetCore.Payment.WeChatPay.Response
     {
         /// <summary>
         /// 返回状态码
-        /// 此字段是通信标识,非交易标识,
-        /// 交易是否成功需要查看result_code来判断
         /// </summary>
         [XmlElement("return_code")]
         public string ReturnCode { get; set; }
 
         /// <summary>
-        /// 返回信息,如非空,为错误原因
-        /// 签名失败
-        /// 参数格式校验错误
+        /// 返回信息
         /// </summary>
         [XmlElement("return_msg")]
         public string ReturnMsg { get; set; }

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

@@ -7,16 +7,12 @@ namespace Essensoft.AspNetCore.Payment.WeChatPay.Response
     {
         /// <summary>
         /// 返回状态码
-        /// 此字段是通信标识,非交易标识,
-        /// 交易是否成功需要查看result_code来判断
         /// </summary>
         [XmlElement("return_code")]
         public string ReturnCode { get; set; }
 
         /// <summary>
-        /// 返回信息,如非空,为错误原因
-        /// 签名失败
-        /// 参数格式校验错误
+        /// 返回信息
         /// </summary>
         [XmlElement("return_msg")]
         public string ReturnMsg { get; set; }

+ 7 - 11
src/Essensoft.AspNetCore.Payment.WeChatPay/Response/WeChatPayGetHBInfoResponse.cs

@@ -5,20 +5,16 @@ using Essensoft.AspNetCore.Payment.WeChatPay.Domain;
 namespace Essensoft.AspNetCore.Payment.WeChatPay.Response
 {
     [XmlRoot("xml")]
-    public class WeChatPayGetHBInfoResponse : WeChatPayResponse
+    public class WeChatPayGetHbInfoResponse : WeChatPayResponse
     {
         /// <summary>
         /// 返回状态码
-        /// 此字段是通信标识,非交易标识,
-        /// 交易是否成功需要查看result_code来判断
         /// </summary>
         [XmlElement("return_code")]
         public string ReturnCode { get; set; }
 
         /// <summary>
-        /// 返回信息,如非空,为错误原因
-        /// 签名失败
-        /// 参数格式校验错误
+        /// 返回信息
         /// </summary>
         [XmlElement("return_msg")]
         public string ReturnMsg { get; set; }
@@ -81,19 +77,19 @@ namespace Essensoft.AspNetCore.Payment.WeChatPay.Response
         /// 红包类型
         /// </summary>
         [XmlElement("hb_type")]
-        public string HBType { get; set; }
+        public string HbType { get; set; }
 
         /// <summary>
         /// 红包个数
         /// </summary>
         [XmlElement("total_num")]
-        public string TotalNum { get; set; }
+        public int TotalNum { get; set; }
 
         /// <summary>
         /// 红包金额
         /// </summary>
         [XmlElement("total_amount")]
-        public string TotalAmount { get; set; }
+        public int TotalAmount { get; set; }
 
         /// <summary>
         /// 失败原因
@@ -117,7 +113,7 @@ namespace Essensoft.AspNetCore.Payment.WeChatPay.Response
         /// 红包退款金额
         /// </summary>
         [XmlElement("refund_amount")]
-        public string RefundAmount { get; set; }
+        public int RefundAmount { get; set; }
 
         /// <summary>
         /// 祝福语
@@ -142,6 +138,6 @@ namespace Essensoft.AspNetCore.Payment.WeChatPay.Response
         /// </summary>
         [XmlArray("hblist")]
         [XmlArrayItem("hbinfo")]
-        public List<HBInfo> HBList { get; set; }
+        public List<HbInfo> HbList { get; set; }
     }
 }

+ 2 - 6
src/Essensoft.AspNetCore.Payment.WeChatPay/Response/WeChatPayGetTransferInfoResponse.cs

@@ -7,16 +7,12 @@ namespace Essensoft.AspNetCore.Payment.WeChatPay.Response
     {
         /// <summary>
         /// 返回状态码
-        /// 此字段是通信标识,非交易标识,
-        /// 交易是否成功需要查看result_code来判断
         /// </summary>
         [XmlElement("return_code")]
         public string ReturnCode { get; set; }
 
         /// <summary>
-        /// 返回信息,如非空,为错误原因
-        /// 签名失败
-        /// 参数格式校验错误
+        /// 返回信息
         /// </summary>
         [XmlElement("return_msg")]
         public string ReturnMsg { get; set; }
@@ -46,7 +42,7 @@ namespace Essensoft.AspNetCore.Payment.WeChatPay.Response
         public string PartnerTradeNo { get; set; }
 
         /// <summary>
-        /// 应用ID
+        /// 应用
         /// </summary>
         [XmlElement("appid")]
         public string AppId { get; set; }

Einige Dateien werden nicht angezeigt, da zu viele Dateien in diesem Diff geändert wurden.