瀏覽代碼

新增 .NET CORE 3.0 示例

Roc 6 年之前
父節點
當前提交
5d8ef6a148
共有 100 個文件被更改,包括 7480 次插入0 次删除
  1. 7 0
      Payment.sln
  2. 438 0
      samples/WebApplicationSample_V3_0/Controllers/AlipayController.cs
  3. 53 0
      samples/WebApplicationSample_V3_0/Controllers/HomeController.cs
  4. 341 0
      samples/WebApplicationSample_V3_0/Controllers/JDPayController.cs
  5. 214 0
      samples/WebApplicationSample_V3_0/Controllers/LianLianPayController.cs
  6. 428 0
      samples/WebApplicationSample_V3_0/Controllers/NotifyController.cs
  7. 375 0
      samples/WebApplicationSample_V3_0/Controllers/QPayController.cs
  8. 90 0
      samples/WebApplicationSample_V3_0/Controllers/UnionPayController.cs
  9. 607 0
      samples/WebApplicationSample_V3_0/Controllers/WeChatPayController.cs
  10. 25 0
      samples/WebApplicationSample_V3_0/Helpers/HMTLHelperExtensions.cs
  11. 212 0
      samples/WebApplicationSample_V3_0/Models/AlipayViewModel.cs
  12. 9 0
      samples/WebApplicationSample_V3_0/Models/ErrorViewModel.cs
  13. 241 0
      samples/WebApplicationSample_V3_0/Models/JDPayViewModel.cs
  14. 125 0
      samples/WebApplicationSample_V3_0/Models/LianLianPayViewModel.cs
  15. 189 0
      samples/WebApplicationSample_V3_0/Models/QPayViewModel.cs
  16. 33 0
      samples/WebApplicationSample_V3_0/Models/UnionPayViewModel.cs
  17. 335 0
      samples/WebApplicationSample_V3_0/Models/WeChatPayViewModel.cs
  18. 21 0
      samples/WebApplicationSample_V3_0/Program.cs
  19. 27 0
      samples/WebApplicationSample_V3_0/Properties/launchSettings.json
  20. 74 0
      samples/WebApplicationSample_V3_0/Startup.cs
  21. 53 0
      samples/WebApplicationSample_V3_0/Views/Alipay/AppPay.cshtml
  22. 37 0
      samples/WebApplicationSample_V3_0/Views/Alipay/BillDownloadurlQuery.cshtml
  23. 87 0
      samples/WebApplicationSample_V3_0/Views/Alipay/Index.cshtml
  24. 50 0
      samples/WebApplicationSample_V3_0/Views/Alipay/PagePay.cshtml
  25. 15 0
      samples/WebApplicationSample_V3_0/Views/Alipay/PagePayReturn.cshtml
  26. 53 0
      samples/WebApplicationSample_V3_0/Views/Alipay/Pay.cshtml
  27. 56 0
      samples/WebApplicationSample_V3_0/Views/Alipay/PreCreate.cshtml
  28. 37 0
      samples/WebApplicationSample_V3_0/Views/Alipay/Query.cshtml
  29. 49 0
      samples/WebApplicationSample_V3_0/Views/Alipay/Refund.cshtml
  30. 41 0
      samples/WebApplicationSample_V3_0/Views/Alipay/RefundQuery.cshtml
  31. 37 0
      samples/WebApplicationSample_V3_0/Views/Alipay/TransQuery.cshtml
  32. 49 0
      samples/WebApplicationSample_V3_0/Views/Alipay/Transfer.cshtml
  33. 50 0
      samples/WebApplicationSample_V3_0/Views/Alipay/WapPay.cshtml
  34. 15 0
      samples/WebApplicationSample_V3_0/Views/Alipay/WapPayReturn.cshtml
  35. 9 0
      samples/WebApplicationSample_V3_0/Views/Home/Gratuity.cshtml
  36. 83 0
      samples/WebApplicationSample_V3_0/Views/Home/Index.cshtml
  37. 113 0
      samples/WebApplicationSample_V3_0/Views/JDPay/DefrayPay.cshtml
  38. 70 0
      samples/WebApplicationSample_V3_0/Views/JDPay/Index.cshtml
  39. 69 0
      samples/WebApplicationSample_V3_0/Views/JDPay/QrCodePay.cshtml
  40. 41 0
      samples/WebApplicationSample_V3_0/Views/JDPay/Query.cshtml
  41. 41 0
      samples/WebApplicationSample_V3_0/Views/JDPay/QueryRefund.cshtml
  42. 49 0
      samples/WebApplicationSample_V3_0/Views/JDPay/Refund.cshtml
  43. 16 0
      samples/WebApplicationSample_V3_0/Views/JDPay/Return.cshtml
  44. 58 0
      samples/WebApplicationSample_V3_0/Views/JDPay/SaveOrderH5.cshtml
  45. 58 0
      samples/WebApplicationSample_V3_0/Views/JDPay/SaveOrderPC.cshtml
  46. 45 0
      samples/WebApplicationSample_V3_0/Views/JDPay/TradeQuery.cshtml
  47. 54 0
      samples/WebApplicationSample_V3_0/Views/LianLianPay/H5QuickPay.cshtml
  48. 52 0
      samples/WebApplicationSample_V3_0/Views/LianLianPay/Index.cshtml
  49. 41 0
      samples/WebApplicationSample_V3_0/Views/LianLianPay/OrderQuery.cshtml
  50. 15 0
      samples/WebApplicationSample_V3_0/Views/LianLianPay/QuickPayCallback.cshtml
  51. 57 0
      samples/WebApplicationSample_V3_0/Views/LianLianPay/Refund.cshtml
  52. 41 0
      samples/WebApplicationSample_V3_0/Views/LianLianPay/RefundQuery.cshtml
  53. 54 0
      samples/WebApplicationSample_V3_0/Views/LianLianPay/WebQuickPay.cshtml
  54. 57 0
      samples/WebApplicationSample_V3_0/Views/QPay/AppPay.cshtml
  55. 69 0
      samples/WebApplicationSample_V3_0/Views/QPay/B2CPay.cshtml
  56. 33 0
      samples/WebApplicationSample_V3_0/Views/QPay/CloseOrder.cshtml
  57. 88 0
      samples/WebApplicationSample_V3_0/Views/QPay/Index.cshtml
  58. 65 0
      samples/WebApplicationSample_V3_0/Views/QPay/MicroPay.cshtml
  59. 34 0
      samples/WebApplicationSample_V3_0/Views/QPay/OrderQuery.cshtml
  60. 57 0
      samples/WebApplicationSample_V3_0/Views/QPay/PubPay.cshtml
  61. 64 0
      samples/WebApplicationSample_V3_0/Views/QPay/QrCodePay.cshtml
  62. 53 0
      samples/WebApplicationSample_V3_0/Views/QPay/Refund.cshtml
  63. 42 0
      samples/WebApplicationSample_V3_0/Views/QPay/RefundQuery.cshtml
  64. 33 0
      samples/WebApplicationSample_V3_0/Views/QPay/Reverse.cshtml
  65. 41 0
      samples/WebApplicationSample_V3_0/Views/QPay/StatementDown.cshtml
  66. 22 0
      samples/WebApplicationSample_V3_0/Views/Shared/Error.cshtml
  67. 93 0
      samples/WebApplicationSample_V3_0/Views/Shared/_Layout.cshtml
  68. 18 0
      samples/WebApplicationSample_V3_0/Views/Shared/_ValidationScriptsPartial.cshtml
  69. 50 0
      samples/WebApplicationSample_V3_0/Views/UnionPay/GatewayPayFrontConsume.cshtml
  70. 15 0
      samples/WebApplicationSample_V3_0/Views/UnionPay/GatewayPayFrontConsumeReturn.cshtml
  71. 28 0
      samples/WebApplicationSample_V3_0/Views/UnionPay/Index.cshtml
  72. 57 0
      samples/WebApplicationSample_V3_0/Views/WeChatPay/AppPay.cshtml
  73. 33 0
      samples/WebApplicationSample_V3_0/Views/WeChatPay/CloseOrder.cshtml
  74. 41 0
      samples/WebApplicationSample_V3_0/Views/WeChatPay/DownloadBill.cshtml
  75. 41 0
      samples/WebApplicationSample_V3_0/Views/WeChatPay/DownloadFundFlow.cshtml
  76. 24 0
      samples/WebApplicationSample_V3_0/Views/WeChatPay/GetPublicKey.cshtml
  77. 33 0
      samples/WebApplicationSample_V3_0/Views/WeChatPay/GetTransferInfo.cshtml
  78. 53 0
      samples/WebApplicationSample_V3_0/Views/WeChatPay/H5Pay.cshtml
  79. 130 0
      samples/WebApplicationSample_V3_0/Views/WeChatPay/Index.cshtml
  80. 61 0
      samples/WebApplicationSample_V3_0/Views/WeChatPay/LiteAppPay.cshtml
  81. 49 0
      samples/WebApplicationSample_V3_0/Views/WeChatPay/MicroPay.cshtml
  82. 37 0
      samples/WebApplicationSample_V3_0/Views/WeChatPay/OrderQuery.cshtml
  83. 53 0
      samples/WebApplicationSample_V3_0/Views/WeChatPay/PayBank.cshtml
  84. 61 0
      samples/WebApplicationSample_V3_0/Views/WeChatPay/PubPay.cshtml
  85. 60 0
      samples/WebApplicationSample_V3_0/Views/WeChatPay/QrCodePay.cshtml
  86. 33 0
      samples/WebApplicationSample_V3_0/Views/WeChatPay/QueryBank.cshtml
  87. 57 0
      samples/WebApplicationSample_V3_0/Views/WeChatPay/Refund.cshtml
  88. 45 0
      samples/WebApplicationSample_V3_0/Views/WeChatPay/RefundQuery.cshtml
  89. 37 0
      samples/WebApplicationSample_V3_0/Views/WeChatPay/Reverse.cshtml
  90. 56 0
      samples/WebApplicationSample_V3_0/Views/WeChatPay/Transfers.cshtml
  91. 3 0
      samples/WebApplicationSample_V3_0/Views/_ViewImports.cshtml
  92. 3 0
      samples/WebApplicationSample_V3_0/Views/_ViewStart.cshtml
  93. 21 0
      samples/WebApplicationSample_V3_0/WebApplicationSample_V3_0.csproj
  94. 9 0
      samples/WebApplicationSample_V3_0/appsettings.Development.json
  95. 10 0
      samples/WebApplicationSample_V3_0/appsettings.json
  96. 86 0
      samples/WebApplicationSample_V3_0/wwwroot/css/site.css
  97. 86 0
      samples/WebApplicationSample_V3_0/wwwroot/css/site.min.css
  98. 二進制
      samples/WebApplicationSample_V3_0/wwwroot/favicon.ico
  99. 二進制
      samples/WebApplicationSample_V3_0/wwwroot/images/payment.png
  100. 二進制
      samples/WebApplicationSample_V3_0/wwwroot/images/qrcode.png

+ 7 - 0
Payment.sln

@@ -12,6 +12,8 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "samples", "samples", "{DD8C
 EndProject
 EndProject
 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WebApplicationSample", "samples\WebApplicationSample\WebApplicationSample.csproj", "{53148C9A-E48E-45B1-B382-6485E4DA1006}"
 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WebApplicationSample", "samples\WebApplicationSample\WebApplicationSample.csproj", "{53148C9A-E48E-45B1-B382-6485E4DA1006}"
 EndProject
 EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WebApplicationSample_V3_0", "samples\WebApplicationSample_V3_0\WebApplicationSample_V3_0.csproj", "{6C90BFFA-2F73-4961-922A-588B589C444C}"
+EndProject
 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "solution-items", "solution-items", "{E2D9A588-E676-446B-BE7B-B3AAAD9FC9B6}"
 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "solution-items", "solution-items", "{E2D9A588-E676-446B-BE7B-B3AAAD9FC9B6}"
 	ProjectSection(SolutionItems) = preProject
 	ProjectSection(SolutionItems) = preProject
 		LICENSE = LICENSE
 		LICENSE = LICENSE
@@ -44,6 +46,10 @@ Global
 		{53148C9A-E48E-45B1-B382-6485E4DA1006}.Debug|Any CPU.Build.0 = Debug|Any CPU
 		{53148C9A-E48E-45B1-B382-6485E4DA1006}.Debug|Any CPU.Build.0 = Debug|Any CPU
 		{53148C9A-E48E-45B1-B382-6485E4DA1006}.Release|Any CPU.ActiveCfg = Release|Any CPU
 		{53148C9A-E48E-45B1-B382-6485E4DA1006}.Release|Any CPU.ActiveCfg = Release|Any CPU
 		{53148C9A-E48E-45B1-B382-6485E4DA1006}.Release|Any CPU.Build.0 = Release|Any CPU
 		{53148C9A-E48E-45B1-B382-6485E4DA1006}.Release|Any CPU.Build.0 = Release|Any CPU
+		{6C90BFFA-2F73-4961-922A-588B589C444C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{6C90BFFA-2F73-4961-922A-588B589C444C}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{6C90BFFA-2F73-4961-922A-588B589C444C}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{6C90BFFA-2F73-4961-922A-588B589C444C}.Release|Any CPU.Build.0 = Release|Any CPU
 		{167FAA95-300E-49D5-A29B-EFCFF90A0584}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
 		{167FAA95-300E-49D5-A29B-EFCFF90A0584}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
 		{167FAA95-300E-49D5-A29B-EFCFF90A0584}.Debug|Any CPU.Build.0 = Debug|Any CPU
 		{167FAA95-300E-49D5-A29B-EFCFF90A0584}.Debug|Any CPU.Build.0 = Debug|Any CPU
 		{167FAA95-300E-49D5-A29B-EFCFF90A0584}.Release|Any CPU.ActiveCfg = Release|Any CPU
 		{167FAA95-300E-49D5-A29B-EFCFF90A0584}.Release|Any CPU.ActiveCfg = Release|Any CPU
@@ -78,6 +84,7 @@ Global
 	EndGlobalSection
 	EndGlobalSection
 	GlobalSection(NestedProjects) = preSolution
 	GlobalSection(NestedProjects) = preSolution
 		{53148C9A-E48E-45B1-B382-6485E4DA1006} = {DD8CC860-F3E3-40F4-8A8F-20BF66EA051C}
 		{53148C9A-E48E-45B1-B382-6485E4DA1006} = {DD8CC860-F3E3-40F4-8A8F-20BF66EA051C}
+		{6C90BFFA-2F73-4961-922A-588B589C444C} = {DD8CC860-F3E3-40F4-8A8F-20BF66EA051C}
 		{167FAA95-300E-49D5-A29B-EFCFF90A0584} = {D3871E61-CA47-4BD0-8BF9-B64A42B2200D}
 		{167FAA95-300E-49D5-A29B-EFCFF90A0584} = {D3871E61-CA47-4BD0-8BF9-B64A42B2200D}
 		{071D1073-EEE3-45F1-ADC6-95CF90A64DD3} = {D3871E61-CA47-4BD0-8BF9-B64A42B2200D}
 		{071D1073-EEE3-45F1-ADC6-95CF90A64DD3} = {D3871E61-CA47-4BD0-8BF9-B64A42B2200D}
 		{3578E08D-A08E-4C4A-A5DE-8D31C21F7D66} = {D3871E61-CA47-4BD0-8BF9-B64A42B2200D}
 		{3578E08D-A08E-4C4A-A5DE-8D31C21F7D66} = {D3871E61-CA47-4BD0-8BF9-B64A42B2200D}

+ 438 - 0
samples/WebApplicationSample_V3_0/Controllers/AlipayController.cs

@@ -0,0 +1,438 @@
+using System.Text;
+using System.Threading.Tasks;
+using Essensoft.AspNetCore.Payment.Alipay;
+using Essensoft.AspNetCore.Payment.Alipay.Domain;
+using Essensoft.AspNetCore.Payment.Alipay.Notify;
+using Essensoft.AspNetCore.Payment.Alipay.Request;
+using Microsoft.AspNetCore.Mvc;
+using Microsoft.Extensions.Options;
+using WebApplicationSample_V3_0.Models;
+
+namespace WebApplicationSample_V3_0.Controllers
+{
+    public class AlipayController : Controller
+    {
+        private readonly IAlipayClient _client;
+        private readonly IAlipayNotifyClient _notifyClient;
+        private readonly IOptions<AlipayOptions> _optionsAccessor;
+
+        public AlipayController(IAlipayClient client, IAlipayNotifyClient notifyClient, IOptions<AlipayOptions> optionsAccessor)
+        {
+            _client = client;
+            _notifyClient = notifyClient;
+            _optionsAccessor = optionsAccessor;
+        }
+
+        /// <summary>
+        /// 支付宝指引页
+        /// </summary>
+        /// <returns></returns>
+        [HttpGet]
+        public IActionResult Index()
+        {
+            return View();
+        }
+
+        /// <summary>
+        /// 当面付-扫码支付
+        /// </summary>
+        /// <returns></returns>
+        [HttpGet]
+        public IActionResult PreCreate()
+        {
+            return View();
+        }
+
+        /// <summary>
+        /// 当面付-扫码支付
+        /// </summary>
+        /// <returns></returns>
+        [HttpPost]
+        public async Task<IActionResult> PreCreate(AlipayTradePreCreateViewModel viewModel)
+        {
+            var model = new AlipayTradePrecreateModel
+            {
+                OutTradeNo = viewModel.OutTradeNo,
+                Subject = viewModel.Subject,
+                TotalAmount = viewModel.TotalAmount,
+                Body = viewModel.Body
+            };
+            var req = new AlipayTradePrecreateRequest();
+            req.SetBizModel(model);
+            req.SetNotifyUrl(viewModel.NotifyUrl);
+
+            var response = await _client.ExecuteAsync(req, _optionsAccessor.Value);
+            ViewData["qrcode"] = response.QrCode;
+            ViewData["response"] = response.ResponseBody;
+            return View();
+        }
+
+        /// <summary>
+        /// 当面付-二维码/条码/声波支付
+        /// </summary>
+        /// <returns></returns>
+        [HttpGet]
+        public IActionResult Pay()
+        {
+            return View();
+        }
+
+        /// <summary>
+        /// 当面付-二维码/条码/声波支付
+        /// </summary>
+        /// <returns></returns>
+        [HttpPost]
+        public async Task<IActionResult> Pay(AlipayTradePayViewModel viewModel)
+        {
+            var model = new AlipayTradePayModel
+            {
+                OutTradeNo = viewModel.OutTradeNo,
+                Subject = viewModel.Subject,
+                Scene = viewModel.Scene,
+                AuthCode = viewModel.AuthCode,
+                TotalAmount = viewModel.TotalAmount,
+                Body = viewModel.Body
+            };
+            var req = new AlipayTradePayRequest();
+            req.SetBizModel(model);
+
+            var response = await _client.ExecuteAsync(req, _optionsAccessor.Value);
+            ViewData["response"] = response.ResponseBody;
+            return View();
+        }
+
+        /// <summary>
+        /// APP支付
+        /// </summary>
+        /// <returns></returns>
+        [HttpGet]
+        public IActionResult AppPay()
+        {
+            return View();
+        }
+
+        /// <summary>
+        /// APP支付
+        /// </summary>
+        /// <returns></returns>
+        [HttpPost]
+        public async Task<IActionResult> AppPay(AlipayTradeAppPayViewModel viewModel)
+        {
+            var model = new AlipayTradeAppPayModel
+            {
+                OutTradeNo = viewModel.OutTradeNo,
+                Subject = viewModel.Subject,
+                ProductCode = viewModel.ProductCode,
+                TotalAmount = viewModel.TotalAmount,
+                Body = viewModel.Body
+            };
+            var req = new AlipayTradeAppPayRequest();
+            req.SetBizModel(model);
+            req.SetNotifyUrl(viewModel.NotifyUrl);
+
+            var response = await _client.SdkExecuteAsync(req, _optionsAccessor.Value);
+            //将response.Body给 ios/android端 由其去调起支付宝APP(https://docs.open.alipay.com/204/105296/ https://docs.open.alipay.com/204/105295/)
+            ViewData["response"] = response.ResponseBody;
+            return View();
+        }
+
+        /// <summary>
+        /// 电脑网站支付
+        /// </summary>
+        /// <param name="viewModel"></param>
+        /// <returns></returns>
+        [HttpGet]
+        public IActionResult PagePay()
+        {
+            return View();
+        }
+
+        /// <summary>
+        /// 电脑网站支付
+        /// </summary>
+        /// <param name="viewModel"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public async Task<IActionResult> PagePay(AlipayTradePagePayViewModel viewModel)
+        {
+            var model = new AlipayTradePagePayModel
+            {
+                Body = viewModel.Body,
+                Subject = viewModel.Subject,
+                TotalAmount = viewModel.TotalAmount,
+                OutTradeNo = viewModel.OutTradeNo,
+                ProductCode = viewModel.ProductCode
+            };
+            var req = new AlipayTradePagePayRequest();
+            req.SetBizModel(model);
+            req.SetNotifyUrl(viewModel.NotifyUrl);
+            req.SetReturnUrl(viewModel.ReturnUrl);
+
+            var response = await _client.PageExecuteAsync(req, _optionsAccessor.Value);
+            return Content(response.ResponseBody, "text/html", Encoding.UTF8);
+        }
+
+        /// <summary>
+        /// 手机网站支付
+        /// </summary>
+        /// <returns></returns>
+        [HttpGet]
+        public IActionResult WapPay()
+        {
+            return View();
+        }
+
+        /// <summary>
+        /// 手机网站支付
+        /// </summary>
+        /// <returns></returns>
+        [HttpPost]
+        public async Task<IActionResult> WapPay(AlipayTradeWapPayViewModel viewMode)
+        {
+            var model = new AlipayTradeWapPayModel
+            {
+                Body = viewMode.Body,
+                Subject = viewMode.Subject,
+                TotalAmount = viewMode.TotalAmount,
+                OutTradeNo = viewMode.OutTradeNo,
+                ProductCode = viewMode.ProductCode
+            };
+            var req = new AlipayTradeWapPayRequest();
+            req.SetBizModel(model);
+            req.SetNotifyUrl(viewMode.NotifyUrl);
+            req.SetReturnUrl(viewMode.ReturnUrl);
+
+            var response = await _client.PageExecuteAsync(req, _optionsAccessor.Value);
+            return Content(response.ResponseBody, "text/html", Encoding.UTF8);
+        }
+
+        /// <summary>
+        /// 交易查询
+        /// </summary>
+        /// <returns></returns>
+        [HttpGet]
+        public IActionResult Query()
+        {
+            return View();
+        }
+
+        /// <summary>
+        /// 交易查询
+        /// </summary>
+        /// <returns></returns>
+        [HttpPost]
+        public async Task<IActionResult> Query(AlipayTradeQueryViewModel viewMode)
+        {
+            var model = new AlipayTradeQueryModel
+            {
+                OutTradeNo = viewMode.OutTradeNo,
+                TradeNo = viewMode.TradeNo
+            };
+
+            var req = new AlipayTradeQueryRequest();
+            req.SetBizModel(model);
+
+            var response = await _client.ExecuteAsync(req, _optionsAccessor.Value);
+            ViewData["response"] = response.ResponseBody;
+            return View();
+        }
+
+        /// <summary>
+        /// 交易退款
+        /// </summary>
+        /// <returns></returns>
+        [HttpGet]
+        public IActionResult Refund()
+        {
+            return View();
+        }
+
+        /// <summary>
+        /// 交易退款
+        /// </summary>
+        /// <returns></returns>
+        [HttpPost]
+        public async Task<IActionResult> Refund(AlipayTradeRefundViewModel viewMode)
+        {
+            var model = new AlipayTradeRefundModel
+            {
+                OutTradeNo = viewMode.OutTradeNo,
+                TradeNo = viewMode.TradeNo,
+                RefundAmount = viewMode.RefundAmount,
+                OutRequestNo = viewMode.OutRequestNo,
+                RefundReason = viewMode.RefundReason
+            };
+
+            var req = new AlipayTradeRefundRequest();
+            req.SetBizModel(model);
+
+            var response = await _client.ExecuteAsync(req, _optionsAccessor.Value);
+            ViewData["response"] = response.ResponseBody;
+            return View();
+        }
+
+        /// <summary>
+        /// 退款查询
+        /// </summary>
+        /// <returns></returns>
+        [HttpGet]
+        public IActionResult RefundQuery()
+        {
+            return View();
+        }
+
+        /// <summary>
+        /// 退款查询
+        /// </summary>
+        /// <returns></returns>
+        [HttpPost]
+        public async Task<IActionResult> RefundQuery(AlipayTradeRefundQueryViewModel viewMode)
+        {
+            var model = new AlipayTradeFastpayRefundQueryModel
+            {
+                OutTradeNo = viewMode.OutTradeNo,
+                TradeNo = viewMode.TradeNo,
+                OutRequestNo = viewMode.OutRequestNo
+            };
+
+            var req = new AlipayTradeFastpayRefundQueryRequest();
+            req.SetBizModel(model);
+
+            var response = await _client.ExecuteAsync(req, _optionsAccessor.Value);
+            ViewData["response"] = response.ResponseBody;
+            return View();
+        }
+
+        /// <summary>
+        /// 单笔转账到支付宝账户
+        /// </summary>
+        /// <returns></returns>
+        [HttpGet]
+        public IActionResult Transfer()
+        {
+            return View();
+        }
+
+        /// <summary>
+        /// 单笔转账到支付宝账户
+        /// </summary>
+        /// <returns></returns>
+        [HttpPost]
+        public async Task<IActionResult> Transfer(AlipayTransferViewModel viewMode)
+        {
+            var model = new AlipayFundTransToaccountTransferModel
+            {
+                OutBizNo = viewMode.OutBizNo,
+                PayeeType = viewMode.PayeeType,
+                PayeeAccount = viewMode.PayeeAccount,
+                Amount = viewMode.Amount,
+                Remark = viewMode.Remark
+            };
+            var req = new AlipayFundTransToaccountTransferRequest();
+            req.SetBizModel(model);
+            var response = await _client.ExecuteAsync(req, _optionsAccessor.Value);
+            ViewData["response"] = response.ResponseBody;
+            return View();
+        }
+
+        /// <summary>
+        /// 查询转账订单
+        /// </summary>
+        /// <returns></returns>
+        [HttpGet]
+        public IActionResult TransQuery()
+        {
+            return View();
+        }
+
+        /// <summary>
+        /// 查询转账订单
+        /// </summary>
+        /// <returns></returns>
+        [HttpPost]
+        public async Task<IActionResult> TransQuery(AlipayTransQueryViewModel viewMode)
+        {
+            var model = new AlipayFundTransOrderQueryModel
+            {
+                OutBizNo = viewMode.OutBizNo,
+                OrderId = viewMode.OrderId
+            };
+
+            var req = new AlipayFundTransOrderQueryRequest();
+            req.SetBizModel(model);
+            var response = await _client.ExecuteAsync(req, _optionsAccessor.Value);
+            ViewData["response"] = response.ResponseBody;
+            return View();
+        }
+
+        /// <summary>
+        /// 查询对账单下载地址
+        /// </summary>
+        /// <returns></returns>
+        [HttpGet]
+        public IActionResult BillDownloadurlQuery()
+        {
+            return View();
+        }
+
+        /// <summary>
+        /// 查询对账单下载地址
+        /// </summary>
+        /// <returns></returns>
+        [HttpPost]
+        public async Task<IActionResult> BillDownloadurlQuery(AlipayBillDownloadurlQueryViewModel viewModel)
+        {
+            var model = new AlipayDataDataserviceBillDownloadurlQueryModel
+            {
+                BillDate = viewModel.BillDate,
+                BillType = viewModel.BillType
+            };
+
+            var req = new AlipayDataDataserviceBillDownloadurlQueryRequest();
+            req.SetBizModel(model);
+            var response = await _client.ExecuteAsync(req, _optionsAccessor.Value);
+            ViewData["response"] = response.ResponseBody;
+            return View();
+        }
+
+        /// <summary>
+        /// 电脑网站支付 - 同步跳转
+        /// </summary>
+        /// <returns></returns>
+        [HttpGet]
+        public async Task<IActionResult> PagePayReturn()
+        {
+            try
+            {
+                var notify = await _notifyClient.ExecuteAsync<AlipayTradePagePayReturn>(Request, _optionsAccessor.Value);
+                ViewData["response"] = "支付成功";
+                return View();
+            }
+            catch
+            {
+                ViewData["response"] = "出现错误";
+                return View();
+            }
+        }
+
+        /// <summary>
+        /// 手机网站支付 - 同步跳转
+        /// </summary>
+        /// <returns></returns>
+        [HttpGet]
+        public async Task<IActionResult> WapPayReturn()
+        {
+            try
+            {
+                var notify = await _notifyClient.ExecuteAsync<AlipayTradeWapPayReturn>(Request, _optionsAccessor.Value);
+                ViewData["response"] = "支付成功";
+                return View();
+            }
+            catch
+            {
+                ViewData["response"] = "出现错误";
+                return View();
+            }
+        }
+    }
+}

+ 53 - 0
samples/WebApplicationSample_V3_0/Controllers/HomeController.cs

@@ -0,0 +1,53 @@
+using System.Diagnostics;
+using System.Drawing;
+using System.Text;
+using Microsoft.AspNetCore.Mvc;
+using QRCoder;
+using WebApplicationSample_V3_0.Models;
+
+namespace WebApplicationSample_V3_0.Controllers
+{
+    public class HomeController : Controller
+    {
+        /// <summary>
+        /// 前言
+        /// </summary>
+        /// <returns></returns>
+        public IActionResult Index()
+        {
+            return View();
+        }
+
+        /// <summary>
+        /// 打赏
+        /// </summary>
+        /// <returns></returns>
+        public IActionResult Gratuity()
+        {
+            return View();
+        }
+
+        /// <summary>
+        /// 生成二维码SVG
+        /// </summary>
+        /// <param name="data"></param>
+        /// <param name="size"></param>
+        /// <returns></returns>
+        [HttpGet]
+        public IActionResult QrCode(string data, int size = 168)
+        {
+            using (var qrGenerator = new QRCodeGenerator())
+            using (var qrCodeData = qrGenerator.CreateQrCode(data, QRCodeGenerator.ECCLevel.L))
+            using (var svgQrCode = new SvgQRCode(qrCodeData))
+            {
+                var svgText = svgQrCode.GetGraphic(new Size(size, size));
+                return File(Encoding.UTF8.GetBytes(svgText), "text/xml");
+            }
+        }
+
+        public IActionResult Error()
+        {
+            return View(new ErrorViewModel { RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier });
+        }
+    }
+}

+ 341 - 0
samples/WebApplicationSample_V3_0/Controllers/JDPayController.cs

@@ -0,0 +1,341 @@
+using System.Text;
+using System.Threading.Tasks;
+using Essensoft.AspNetCore.Payment.JDPay;
+using Essensoft.AspNetCore.Payment.JDPay.Notify;
+using Essensoft.AspNetCore.Payment.JDPay.Request;
+using Microsoft.AspNetCore.Mvc;
+using Microsoft.Extensions.Options;
+using WebApplicationSample_V3_0.Models;
+
+namespace WebApplicationSample_V3_0.Controllers
+{
+    public class JDPayController : Controller
+    {
+        private readonly IJDPayClient _client;
+        private readonly IJDPayNotifyClient _notifyClient;
+        private readonly IOptions<JDPayOptions> _optionsAccessor;
+
+        public JDPayController(IJDPayClient client, IJDPayNotifyClient notifyClient, IOptions<JDPayOptions> optionsAccessor)
+        {
+            _client = client;
+            _notifyClient = notifyClient;
+            _optionsAccessor = optionsAccessor;
+        }
+
+        /// <summary>
+        /// 京东支付指引页
+        /// </summary>
+        /// <returns></returns>
+        public IActionResult Index()
+        {
+            return View();
+        }
+
+        /// <summary>
+        /// PC在线支付
+        /// </summary>
+        /// <returns></returns>
+        [HttpGet]
+        public IActionResult SaveOrderPC()
+        {
+            return View();
+        }
+
+        /// <summary>
+        /// PC在线支付
+        /// </summary>
+        /// <param name="viewModel"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public async Task<IActionResult> SaveOrderPC(JDPaySaveOrderViewModel viewModel)
+        {
+            var request = new JDPaySaveOrderPCRequest
+            {
+                TradeNum = viewModel.TradeNum,
+                TradeName = viewModel.TradeName,
+                TradeTime = viewModel.TradeTime,
+                Amount = viewModel.Amount,
+                OrderType = viewModel.OrderType,
+                Currency = viewModel.Currency,
+                CallbackUrl = viewModel.CallbackUrl,
+                NotifyUrl = viewModel.NotifyUrl,
+                UserId = viewModel.UserId
+            };
+
+            var response = await _client.PageExecuteAsync(request, _optionsAccessor.Value);
+            return Content(response.Body, "text/html", Encoding.UTF8);
+        }
+
+        /// <summary>
+        /// H5在线支付
+        /// </summary>
+        /// <returns></returns>
+        [HttpGet]
+        public IActionResult SaveOrderH5()
+        {
+            return View();
+        }
+
+        /// <summary>
+        /// H5在线支付
+        /// </summary>
+        /// <param name="viewModel"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public async Task<IActionResult> SaveOrderH5(JDPaySaveOrderViewModel viewModel)
+        {
+            var request = new JDPaySaveOrderH5Request
+            {
+                TradeNum = viewModel.TradeNum,
+                TradeName = viewModel.TradeName,
+                TradeTime = viewModel.TradeTime,
+                Amount = viewModel.Amount,
+                OrderType = viewModel.OrderType,
+                Currency = viewModel.Currency,
+                CallbackUrl = viewModel.CallbackUrl,
+                NotifyUrl = viewModel.NotifyUrl,
+                UserId = viewModel.UserId
+            };
+
+            var response = await _client.PageExecuteAsync(request, _optionsAccessor.Value);
+            return Content(response.Body, "text/html", Encoding.UTF8);
+        }
+
+        /// <summary>
+        /// 扫码支付
+        /// </summary>
+        /// <returns></returns>
+        [HttpGet]
+        public IActionResult QrCodePay()
+        {
+            return View();
+        }
+
+        /// <summary>
+        /// 扫码支付
+        /// </summary>
+        /// <param name="viewModel"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public async Task<IActionResult> QrCodePay(JDPayUnifiedOrderViewModel viewModel)
+        {
+            var request = new JDPayUnifiedOrderRequest
+            {
+                TradeNum = viewModel.TradeNum,
+                TradeName = viewModel.TradeName,
+                TradeTime = viewModel.TradeTime,
+                Amount = viewModel.Amount,
+                OrderType = viewModel.OrderType,
+                Currency = viewModel.Currency,
+                NotifyUrl = viewModel.NotifyUrl,
+                TradeType = viewModel.TradeType
+            };
+
+            var response = await _client.ExecuteAsync(request, _optionsAccessor.Value);
+            ViewData["qrcode"] = response.QrCode;
+            ViewData["response"] = response.Body;
+            return View();
+        }
+
+        /// <summary>
+        /// 交易查询接口
+        /// </summary>
+        /// <returns></returns>
+        [HttpGet]
+        public IActionResult Query()
+        {
+            return View();
+        }
+
+        /// <summary>
+        /// 交易查询接口
+        /// </summary>
+        /// <param name="viewModel"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public async Task<IActionResult> Query(JDPayQueryViewModel viewModel)
+        {
+            var request = new JDPayQueryRequest
+            {
+                TradeNum = viewModel.TradeNum,
+                OTradeNum = viewModel.OTradeNum,
+                TradeType = viewModel.TradeType
+            };
+
+            var response = await _client.ExecuteAsync(request, _optionsAccessor.Value);
+            ViewData["response"] = response.Body;
+            return View();
+        }
+
+        /// <summary>
+        /// 退款申请接口
+        /// </summary>
+        /// <returns></returns>
+        [HttpGet]
+        public IActionResult Refund()
+        {
+            return View();
+        }
+
+        /// <summary>
+        /// 退款申请接口
+        /// </summary>
+        /// <param name="viewModel"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public async Task<IActionResult> Refund(JDPayRefundViewModel viewModel)
+        {
+            var request = new JDPayRefundRequest
+            {
+                TradeNum = viewModel.TradeNum,
+                OTradeNum = viewModel.OTradeNum,
+                Amount = viewModel.Amount,
+                Currency = viewModel.Currency,
+                NotifyUrl = viewModel.NotifyUrl
+            };
+
+            var response = await _client.ExecuteAsync(request, _optionsAccessor.Value);
+            ViewData["response"] = response.Body;
+            return View();
+        }
+
+        /// <summary>
+        /// 退款查询接口
+        /// </summary>
+        /// <returns></returns>
+        [HttpGet]
+        public IActionResult QueryRefund()
+        {
+            return View();
+        }
+
+        /// <summary>
+        /// 退款查询接口
+        /// </summary>
+        /// <param name="viewModel"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public async Task<IActionResult> QueryRefund(JDPayQueryRefundViewModel viewModel)
+        {
+            var request = new JDPayQueryRefundRequest
+            {
+                TradeNum = viewModel.TradeNum,
+                OTradeNum = viewModel.OTradeNum,
+                TradeType = viewModel.TradeType
+            };
+
+            var response = await _client.ExecuteAsync(request, _optionsAccessor.Value);
+            ViewData["response"] = response.Body;
+            return View();
+        }
+
+        /// <summary>
+        /// 代付交易请求
+        /// </summary>
+        /// <returns></returns>
+        [HttpGet]
+        public IActionResult DefrayPay()
+        {
+            return View();
+        }
+
+        /// <summary>
+        /// 代付交易请求
+        /// </summary>
+        /// <param name="viewModel"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public async Task<IActionResult> DefrayPay(JDPayDefrayPayViewModel viewModel)
+        {
+            var request = new JDPayDefrayPayRequest
+            {
+                RequestDatetime = viewModel.RequestDatetime,
+                OutTradeNo = viewModel.OutTradeNo,
+                BizTradeNo = viewModel.BizTradeNo,
+                OutTradeDate = viewModel.OutTradeDate,
+                TradeAmount = viewModel.TradeAmount,
+                TradeCurrency = viewModel.TradeCurrency,
+                SellerInfo = viewModel.SellerInfo,
+                TradeSubject = viewModel.TradeSubject,
+                CategoryCode = viewModel.CategoryCode,
+                PayTool = viewModel.PayTool,
+                TradeSource = viewModel.TradeSource,
+                PayeeBankCode = viewModel.PayeeBankCode,
+                PayeeBankAssociatedCode = viewModel.PayeeBankAssociatedCode,
+                PayeeBankFullname = viewModel.PayeeBankFullname,
+                PayeeBankCountryCode = viewModel.PayeeBankCountryCode,
+                PayeeBankProvinceCode = viewModel.PayeeBankProvinceCode,
+                PayeeBankCityCode = viewModel.PayeeBankCityCode,
+                PayeeCardType = viewModel.PayeeCardType,
+                PayeeAccountType = viewModel.PayeeAccountType,
+                PayeeAccountNo = viewModel.PayeeAccountNo,
+                PayeeAccountName = viewModel.PayeeAccountName,
+                PayeeIdType = viewModel.PayeeIdType,
+                PayeeIdNo = viewModel.PayeeIdNo,
+                PayeeMobile = viewModel.PayeeMobile,
+                NotifyUrl = viewModel.NotifyUrl,
+                ReturnParams = viewModel.ReturnParams,
+                ExtendParams = viewModel.ExtendParams,
+                BankCardInfoType = viewModel.BankCardInfoType,
+                BankCardId = viewModel.BankCardId
+            };
+
+            var response = await _client.ExecuteAsync(request, _optionsAccessor.Value);
+            ViewData["response"] = response.Body;
+            return View();
+        }
+
+        /// <summary>
+        /// 代付交易查询
+        /// </summary>
+        /// <returns></returns>
+        [HttpGet]
+        public IActionResult TradeQuery()
+        {
+            return View();
+        }
+
+        /// <summary>
+        /// 代付交易查询
+        /// </summary>
+        /// <param name="viewModel"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public async Task<IActionResult> TradeQuery(JDPayTradeQueryViewModel viewModel)
+        {
+            var request = new JDPayTradeQueryRequest
+            {
+                RequestDatetime = viewModel.RequestDatetime,
+                OutTradeNo = viewModel.OutTradeNo,
+                TradeNo = viewModel.TradeNo,
+                TradeType = viewModel.TradeType
+            };
+
+            var response = await _client.ExecuteAsync(request, _optionsAccessor.Value);
+            ViewData["response"] = response.Body;
+            return View();
+        }
+
+        /// <summary>
+        /// PC在线支付 / H5在线支付
+        /// pc post / h5 get
+        /// </summary>
+        /// <returns></returns>
+        [HttpGet]
+        [HttpPost]
+        public async Task<IActionResult> Return()
+        {
+            try
+            {
+                var notify = await _notifyClient.ExecuteAsync<JDPaySyncReturn>(Request, _optionsAccessor.Value);
+                ViewData["response"] = "支付成功";
+                return View();
+            }
+            catch
+            {
+                ViewData["response"] = "出现错误";
+                return View();
+            }
+        }
+    }
+}

+ 214 - 0
samples/WebApplicationSample_V3_0/Controllers/LianLianPayController.cs

@@ -0,0 +1,214 @@
+using System.Threading.Tasks;
+using Essensoft.AspNetCore.Payment.LianLianPay;
+using Essensoft.AspNetCore.Payment.LianLianPay.Notify;
+using Essensoft.AspNetCore.Payment.LianLianPay.Request;
+using Microsoft.AspNetCore.Mvc;
+using Microsoft.Extensions.Options;
+using WebApplicationSample_V3_0.Models;
+
+namespace WebApplicationSample_V3_0.Controllers
+{
+    public class LianLianPayController : Controller
+    {
+        private readonly ILianLianPayClient _client;
+        private readonly ILianLianPayNotifyClient _notifyClient;
+        private readonly IOptions<LianLianPayOptions> _optionsAccessor;
+
+        public LianLianPayController(ILianLianPayClient client, ILianLianPayNotifyClient notifyClient, IOptions<LianLianPayOptions> optionsAccessor)
+        {
+            _client = client;
+            _notifyClient = notifyClient;
+            _optionsAccessor = optionsAccessor;
+        }
+
+        /// <summary>
+        /// 连连支付指引页
+        /// </summary>
+        /// <returns></returns>
+        public IActionResult Index()
+        {
+            return View();
+        }
+
+        /// <summary>
+        /// WEB快捷支付
+        /// </summary>
+        /// <returns></returns>
+        [HttpGet]
+        public IActionResult WebQuickPay()
+        {
+            return View();
+        }
+
+        /// <summary>
+        /// WEB快捷支付
+        /// </summary>
+        /// <param name="viewModel"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public async Task<IActionResult> WebQuickPay(LianLianPayWebQuickPayViewModel viewModel)
+        {
+            var request = new LianLianPayCreateBillRequest
+            {
+                UserId = viewModel.UserId,
+                NoOrder = viewModel.NoOrder,
+                DtOrder = viewModel.DtOrder,
+                NameGoods = viewModel.NameGoods,
+                MoneyOrder = viewModel.MoneyOrder,
+                NotifyUrl = viewModel.NotifyUrl,
+                UrlReturn = viewModel.UrlReturn,
+                RiskItem = viewModel.RiskItem,
+                FlagPayProduct = "0",
+                FlagChnl = "2"
+            };
+            var response = await _client.ExecuteAsync(request, _optionsAccessor.Value);
+            return Redirect(response.GatewayUrl);
+        }
+
+        /// <summary>
+        /// H5快捷支付
+        /// </summary>
+        /// <returns></returns>
+        [HttpGet]
+        public IActionResult H5QuickPay()
+        {
+            return View();
+        }
+
+        /// <summary>
+        /// H5快捷支付
+        /// </summary>
+        /// <param name="viewModel"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public async Task<IActionResult> H5QuickPay(LianLianPayH5QuickPayViewModel viewModel)
+        {
+            var request = new LianLianPayCreateBillRequest
+            {
+                UserId = viewModel.UserId,
+                NoOrder = viewModel.NoOrder,
+                DtOrder = viewModel.DtOrder,
+                NameGoods = viewModel.NameGoods,
+                MoneyOrder = viewModel.MoneyOrder,
+                NotifyUrl = viewModel.NotifyUrl,
+                UrlReturn = viewModel.UrlReturn,
+                RiskItem = viewModel.RiskItem,
+                FlagPayProduct = "0",
+                FlagChnl = "3"
+            };
+            var response = await _client.ExecuteAsync(request, _optionsAccessor.Value);
+            return Redirect(response.GatewayUrl);
+        }
+
+        /// <summary>
+        /// 订单查询
+        /// </summary>
+        /// <returns></returns>
+        [HttpGet]
+        public IActionResult OrderQuery()
+        {
+            return View();
+        }
+
+        /// <summary>
+        /// 订单查询
+        /// </summary>
+        /// <param name="viewModel"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public async Task<IActionResult> OrderQuery(LianLianPayOrderQueryViewModel viewModel)
+        {
+            var request = new LianLianPayOrderQueryRequest
+            {
+                NoOrder = viewModel.NoOrder,
+                DtOrder = viewModel.DtOrder,
+                OidPayBill = viewModel.OidPayBill
+            };
+            var response = await _client.ExecuteAsync(request, _optionsAccessor.Value);
+            ViewData["response"] = response.Body;
+            return View();
+        }
+
+        /// <summary>
+        /// 退款
+        /// </summary>
+        /// <returns></returns>
+        [HttpGet]
+        public IActionResult Refund()
+        {
+            return View();
+        }
+
+        /// <summary>
+        /// 退款
+        /// </summary>
+        /// <param name="viewModel"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public async Task<IActionResult> Refund(LianLianPayRefundViewModel viewModel)
+        {
+            var request = new LianLianPayRefundRequest
+            {
+                NoRefund = viewModel.NoRefund,
+                DtRefund = viewModel.DtRefund,
+                MoneyRefund = viewModel.MoneyRefund,
+                NoOrder = viewModel.NoOrder,
+                DtOrder = viewModel.DtOrder,
+                OidPaybill = viewModel.OidPayBill,
+                NotifyUrl = viewModel.NotifyUrl
+            };
+            var response = await _client.ExecuteAsync(request, _optionsAccessor.Value);
+            ViewData["response"] = response.Body;
+            return View();
+        }
+
+        /// <summary>
+        /// 退款查询
+        /// </summary>
+        /// <returns></returns>
+        [HttpGet]
+        public IActionResult RefundQuery()
+        {
+            return View();
+        }
+
+        /// <summary>
+        /// 退款查询
+        /// </summary>
+        /// <param name="viewModel"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public async Task<IActionResult> RefundQuery(LianLianPayRefundQueryViewModel viewModel)
+        {
+            var request = new LianLianPayRefundQueryRequest
+            {
+                NoRefund = viewModel.NoRefund,
+                DtRefund = viewModel.DtRefund,
+                OidRefundNo = viewModel.OidRefundNo
+            };
+            var response = await _client.ExecuteAsync(request, _optionsAccessor.Value);
+            ViewData["response"] = response.Body;
+            return View();
+        }
+
+        /// <summary>
+        /// 快捷支付 - 同步跳转
+        /// </summary>
+        /// <returns></returns>
+        [HttpPost]
+        public async Task<IActionResult> QuickPayReturn()
+        {
+            try
+            {
+                var notify = await _notifyClient.ExecuteAsync<LianLianPayReceiveMoneyReturnResponse>(Request, _optionsAccessor.Value);
+                ViewData["response"] = "支付成功";
+                return View();
+            }
+            catch
+            {
+                ViewData["response"] = "出现错误";
+                return View();
+            }
+        }
+    }
+}

+ 428 - 0
samples/WebApplicationSample_V3_0/Controllers/NotifyController.cs

@@ -0,0 +1,428 @@
+using System;
+using System.Threading.Tasks;
+using Essensoft.AspNetCore.Payment.Alipay;
+using Essensoft.AspNetCore.Payment.Alipay.Notify;
+using Essensoft.AspNetCore.Payment.JDPay;
+using Essensoft.AspNetCore.Payment.JDPay.Notify;
+using Essensoft.AspNetCore.Payment.LianLianPay;
+using Essensoft.AspNetCore.Payment.LianLianPay.Notify;
+using Essensoft.AspNetCore.Payment.QPay;
+using Essensoft.AspNetCore.Payment.QPay.Notify;
+using Essensoft.AspNetCore.Payment.UnionPay;
+using Essensoft.AspNetCore.Payment.UnionPay.Notify;
+using Essensoft.AspNetCore.Payment.WeChatPay;
+using Essensoft.AspNetCore.Payment.WeChatPay.Notify;
+using Microsoft.AspNetCore.Mvc;
+using Microsoft.Extensions.Options;
+
+namespace WebApplicationSample_V3_0.Controllers
+{
+    #region 支付宝异步通知
+
+    [Route("notify/alipay")]
+    public class AlipayNotifyController : Controller
+    {
+        private readonly IAlipayNotifyClient _client;
+        private readonly IOptions<AlipayOptions> _optionsAccessor;
+
+        public AlipayNotifyController(IAlipayNotifyClient client, IOptions<AlipayOptions> optionsAccessor)
+        {
+            _client = client;
+            _optionsAccessor = optionsAccessor;
+        }
+
+        /// <summary>
+        /// 扫码支付异步通知
+        /// </summary>
+        /// <returns></returns>
+        [Route("precreate")]
+        [HttpPost]
+        public async Task<IActionResult> Precreate()
+        {
+            try
+            {
+                var notify = await _client.ExecuteAsync<AlipayTradePrecreateNotify>(Request, _optionsAccessor.Value);
+                if ("TRADE_SUCCESS" == notify.TradeStatus)
+                {
+                    Console.WriteLine("OutTradeNo: " + notify.OutTradeNo);
+
+                    return AlipayNotifyResult.Success;
+                }
+                return NoContent();
+            }
+            catch
+            {
+                return NoContent();
+            }
+        }
+
+        /// <summary>
+        /// APP支付异步通知
+        /// </summary>
+        /// <returns></returns>
+        [Route("apppay")]
+        [HttpPost]
+        public async Task<IActionResult> AppPay()
+        {
+            try
+            {
+                var notify = await _client.ExecuteAsync<AlipayTradeAppPayNotify>(Request, _optionsAccessor.Value);
+                if ("TRADE_SUCCESS" == notify.TradeStatus)
+                {
+                    Console.WriteLine("OutTradeNo: " + notify.OutTradeNo);
+
+                    return AlipayNotifyResult.Success;
+                }
+                return NoContent();
+            }
+            catch
+            {
+                return NoContent();
+            }
+        }
+
+        /// <summary>
+        /// 电脑网站支付异步通知
+        /// </summary>
+        /// <returns></returns>
+        [Route("pagepay")]
+        [HttpPost]
+        public async Task<IActionResult> PagePay()
+        {
+            try
+            {
+                var notify = await _client.ExecuteAsync<AlipayTradePagePayNotify>(Request, _optionsAccessor.Value);
+                if ("TRADE_SUCCESS" == notify.TradeStatus)
+                {
+                    Console.WriteLine("OutTradeNo: " + notify.OutTradeNo);
+
+                    return AlipayNotifyResult.Success;
+                }
+                return NoContent();
+            }
+            catch
+            {
+                return NoContent();
+            }
+        }
+
+        /// <summary>
+        /// 手机网站支付异步通知
+        /// </summary>
+        /// <returns></returns>
+        [Route("wappay")]
+        [HttpPost]
+        public async Task<IActionResult> WapPay()
+        {
+            try
+            {
+                var notify = await _client.ExecuteAsync<AlipayTradeWapPayNotify>(Request, _optionsAccessor.Value);
+                if ("TRADE_SUCCESS" == notify.TradeStatus)
+                {
+                    Console.WriteLine("OutTradeNo: " + notify.OutTradeNo);
+
+                    return AlipayNotifyResult.Success;
+                }
+                return NoContent();
+            }
+            catch
+            {
+                return NoContent();
+            }
+        }
+    }
+
+    #endregion
+
+    #region 微信支付异步通知
+
+    [Route("notify/wechatpay")]
+    public class WeChatPayNotifyController : Controller
+    {
+        private readonly IWeChatPayNotifyClient _client;
+        private readonly IOptions<WeChatPayOptions> _optionsAccessor;
+
+        public WeChatPayNotifyController(IWeChatPayNotifyClient client, IOptions<WeChatPayOptions> optionsAccessor)
+        {
+            _client = client;
+            _optionsAccessor = optionsAccessor;
+        }
+
+        /// <summary>
+        /// 统一下单支付结果通知
+        /// </summary>
+        /// <returns></returns>
+        [Route("unifiedorder")]
+        [HttpPost]
+        public async Task<IActionResult> Unifiedorder()
+        {
+            try
+            {
+                var notify = await _client.ExecuteAsync<WeChatPayUnifiedOrderNotify>(Request, _optionsAccessor.Value);
+                if (notify.ReturnCode == "SUCCESS")
+                {
+                    if (notify.ResultCode == "SUCCESS")
+                    {
+                        Console.WriteLine("OutTradeNo: " + notify.OutTradeNo);
+
+                        return WeChatPayNotifyResult.Success;
+                    }
+                }
+                return NoContent();
+            }
+            catch
+            {
+                return NoContent();
+            }
+        }
+
+        /// <summary>
+        /// 退款结果通知
+        /// </summary>
+        /// <returns></returns>
+        [Route("refund")]
+        [HttpPost]
+        public async Task<IActionResult> Refund()
+        {
+            try
+            {
+                var notify = await _client.ExecuteAsync<WeChatPayRefundNotify>(Request, _optionsAccessor.Value);
+                if (notify.ReturnCode == "SUCCESS")
+                {
+                    if (notify.RefundStatus == "SUCCESS")
+                    {
+                        Console.WriteLine("OutTradeNo: " + notify.OutTradeNo);
+                        return WeChatPayNotifyResult.Success;
+                    }
+                }
+                return NoContent();
+            }
+            catch
+            {
+                return NoContent();
+            }
+        }
+    }
+
+    #endregion
+
+    #region QQ钱包异步通知
+
+    [Route("notify/qpay")]
+    public class QPayNotifyController : Controller
+    {
+        private readonly IQPayNotifyClient _client;
+        private readonly IOptions<QPayOptions> _optionsAccessor;
+
+        public QPayNotifyController(IQPayNotifyClient client, IOptions<QPayOptions> optionsAccessor)
+        {
+            _client = client;
+            _optionsAccessor = optionsAccessor;
+        }
+
+        /// <summary>
+        /// 统一下单支付结果通知
+        /// </summary>
+        /// <returns></returns>
+        [Route("unifiedorder")]
+        [HttpPost]
+        public async Task<IActionResult> Unifiedorder()
+        {
+            try
+            {
+                var notify = await _client.ExecuteAsync<QPayUnifiedOrderNotify>(Request, _optionsAccessor.Value);
+                if ("SUCCESS" == notify.TradeState)
+                {
+                    Console.WriteLine("OutTradeNo: " + notify.OutTradeNo);
+                    return QPayNotifyResult.Success;
+                }
+                return NoContent();
+            }
+            catch
+            {
+                return NoContent();
+            }
+        }
+
+        /// <summary>
+        /// 付款码支付结果通知
+        /// </summary>
+        /// <returns></returns>
+        [Route("micropay")]
+        [HttpPost]
+        public async Task<IActionResult> MicroPay()
+        {
+            try
+            {
+                var notify = await _client.ExecuteAsync<QPayMicroPayNotify>(Request, _optionsAccessor.Value);
+                if ("SUCCESS" == notify.TradeState)
+                {
+                    Console.WriteLine("OutTradeNo: " + notify.OutTradeNo);
+                    return QPayNotifyResult.Success;
+                }
+                return NoContent();
+            }
+            catch
+            {
+                return NoContent();
+            }
+        }
+
+        /// <summary>
+        /// 企业付款 - 用户到账通知
+        /// </summary>
+        /// <returns></returns>
+        [Route("b2cpay")]
+        [HttpPost]
+        public async Task<IActionResult> B2CPay()
+        {
+            try
+            {
+                var notify = await _client.ExecuteAsync<QPayEPayB2CNotify>(Request, _optionsAccessor.Value);
+                Console.WriteLine("OutTradeNo: " + notify.OutTradeNo);
+                return QPayNotifyResult.Success;
+            }
+            catch
+            {
+                return NoContent();
+            }
+        }
+    }
+
+    #endregion
+
+    #region 京东支付异步通知
+
+    [Route("notify/jdpay")]
+    public class JDPayNotifyController : Controller
+    {
+        private readonly IJDPayNotifyClient _client;
+        private readonly IOptions<JDPayOptions> _optionsAccessor;
+
+        public JDPayNotifyController(IJDPayNotifyClient client, IOptions<JDPayOptions> optionsAccessor)
+        {
+            _client = client;
+            _optionsAccessor = optionsAccessor;
+        }
+
+        [Route("async")]
+        [HttpPost]
+        public async Task<IActionResult> Async()
+        {
+            try
+            {
+                var notify = await _client.ExecuteAsync<JDPayAsyncNotify>(Request, _optionsAccessor.Value);
+                Console.WriteLine("TradeNum: " + notify.TradeNum + " tradeType :" + notify.TradeType);// notify.TradeType 0-消费 1-退款
+                return JDPayNotifyResult.Success;
+            }
+            catch
+            {
+                return NoContent();
+            }
+        }
+
+        [Route("defraypay")]
+        [HttpPost]
+        public async Task<IActionResult> DefrayPay()
+        {
+            try
+            {
+                var notify = await _client.ExecuteAsync<JDPayDefrayPayNotify>(Request, _optionsAccessor.Value);
+                Console.WriteLine("trade_no: " + notify.TradeNo + " trade_amount :" + notify.TradeAmount);
+                return JDPayNotifyResult.Success;
+            }
+            catch
+            {
+                return NoContent();
+            }
+        }
+    }
+
+    #endregion
+
+    #region 连连支付异步通知
+
+    [Route("notify/lianlianpay")]
+    public class LianLianPayNotifyController : Controller
+    {
+        private readonly ILianLianPayNotifyClient _client;
+        private readonly IOptions<LianLianPayOptions> _optionsAccessor;
+
+        public LianLianPayNotifyController(ILianLianPayNotifyClient client, IOptions<LianLianPayOptions> optionsAccessor)
+        {
+            _client = client;
+            _optionsAccessor = optionsAccessor;
+        }
+
+        [Route("receivemoney")]
+        [HttpPost]
+        public async Task<IActionResult> ReceiveMoney()
+        {
+            try
+            {
+                var notify = await _client.ExecuteAsync<LianLianPayReceiveMoneyNotify>(Request, _optionsAccessor.Value);
+                Console.WriteLine("NoOrder: " + notify.NoOrder);
+                return LianLianPayNotifyResult.Success;
+            }
+            catch
+            {
+                return NoContent();
+            }
+        }
+
+        [Route("refund")]
+        [HttpPost]
+        public async Task<IActionResult> Refund()
+        {
+            try
+            {
+                var notify = await _client.ExecuteAsync<LianLianPayRefundNotify>(Request, _optionsAccessor.Value);
+                Console.WriteLine("NoRefund: " + notify.NoRefund);
+                return LianLianPayNotifyResult.Success;
+            }
+            catch
+            {
+                return NoContent();
+            }
+        }
+    }
+
+    #endregion
+
+    #region 银联支付异步通知
+
+    [Route("notify/unionpay")]
+    public class UnionPayNotifyController : Controller
+    {
+        private readonly IUnionPayNotifyClient _client;
+        private readonly IOptions<UnionPayOptions> _optionsAccessor;
+
+        public UnionPayNotifyController(IUnionPayNotifyClient client, IOptions<UnionPayOptions> optionsAccessor)
+        {
+            _client = client;
+            _optionsAccessor = optionsAccessor;
+        }
+
+        /// <summary>
+        /// 网关支付 - 跳转网关页面支付通知
+        /// </summary>
+        /// <returns></returns>
+        [Route("gatewaypayfrontconsume")]
+        [HttpPost]
+        public async Task<IActionResult> GatewayPayFrontConsume()
+        {
+            try
+            {
+                var notify = await _client.ExecuteAsync<UnionPayGatewayPayFrontConsumeNotify>(Request, _optionsAccessor.Value);
+                Console.WriteLine("OrderId: " + notify.OrderId + " respCode :" + notify.RespCode);
+                return UnionPayNotifyResult.Success;
+            }
+            catch
+            {
+                return NoContent();
+            }
+        }
+    }
+
+    #endregion
+}

+ 375 - 0
samples/WebApplicationSample_V3_0/Controllers/QPayController.cs

@@ -0,0 +1,375 @@
+using System.Threading.Tasks;
+using Essensoft.AspNetCore.Payment.QPay;
+using Essensoft.AspNetCore.Payment.QPay.Request;
+using Essensoft.AspNetCore.Payment.Security;
+using Microsoft.AspNetCore.Mvc;
+using Microsoft.Extensions.Options;
+using WebApplicationSample_V3_0.Models;
+
+namespace WebApplicationSample_V3_0.Controllers
+{
+    public class QPayController : Controller
+    {
+        private readonly IQPayClient _client;
+        private readonly IOptions<QPayOptions> _optionsAccessor;
+
+        public QPayController(IQPayClient client, IOptions<QPayOptions> optionsAccessor)
+        {
+            _client = client;
+            _optionsAccessor = optionsAccessor;
+        }
+
+        /// <summary>
+        /// QQ钱包指引页
+        /// </summary>
+        /// <returns></returns>
+        public IActionResult Index()
+        {
+            return View();
+        }
+
+        /// <summary>
+        /// 付款码支付
+        /// </summary>
+        /// <returns></returns>
+        [HttpGet]
+        public IActionResult MicroPay()
+        {
+            return View();
+        }
+
+        /// <summary>
+        /// 付款码支付
+        /// </summary>
+        /// <param name="viewModel"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public async Task<IActionResult> MicroPay(QPayMicroPayViewModel viewModel)
+        {
+            var request = new QPayMicroPayRequest
+            {
+                OutTradeNo = viewModel.OutTradeNo,
+                Body = viewModel.Body,
+                FeeType = viewModel.FeeType,
+                TotalFee = viewModel.TotalFee,
+                SpBillCreateIp = viewModel.SpBillCreateIp,
+                DeviceInfo = viewModel.DeviceInfo,
+                AuthCode = viewModel.AuthCode,
+                TradeType = viewModel.TradeType,
+                NotifyUrl = viewModel.NotifyUrl
+            };
+            var response = await _client.ExecuteAsync(request, _optionsAccessor.Value);
+            ViewData["response"] = response.ResponseBody;
+            return View();
+        }
+
+        /// <summary>
+        /// 扫码支付
+        /// </summary>
+        /// <returns></returns>
+        [HttpGet]
+        public IActionResult QrCodePay()
+        {
+            return View();
+        }
+
+        /// <summary>
+        /// 扫码支付
+        /// </summary>
+        /// <param name="viewModel"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public async Task<IActionResult> QrCodePay(QPayUnifiedOrderViewModel viewModel)
+        {
+            var request = new QPayUnifiedOrderRequest
+            {
+                OutTradeNo = viewModel.OutTradeNo,
+                Body = viewModel.Body,
+                FeeType = viewModel.FeeType,
+                TotalFee = viewModel.TotalFee,
+                SpBillCreateIp = viewModel.SpBillCreateIp,
+                TradeType = viewModel.TradeType,
+                NotifyUrl = viewModel.NotifyUrl
+            };
+            var response = await _client.ExecuteAsync(request, _optionsAccessor.Value);
+            ViewData["qrcode"] = response.CodeUrl;
+            ViewData["response"] = response.ResponseBody;
+            return View();
+        }
+
+        /// <summary>
+        /// 公众号支付
+        /// </summary>
+        /// <returns></returns>
+        [HttpGet]
+        public IActionResult PubPay()
+        {
+            return View();
+        }
+
+        /// <summary>
+        /// 公众号支付
+        /// </summary>
+        /// <param name="viewModel"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public async Task<IActionResult> PubPay(QPayUnifiedOrderViewModel viewModel)
+        {
+            var request = new QPayUnifiedOrderRequest
+            {
+                OutTradeNo = viewModel.OutTradeNo,
+                Body = viewModel.Body,
+                FeeType = viewModel.FeeType,
+                TotalFee = viewModel.TotalFee,
+                SpBillCreateIp = viewModel.SpBillCreateIp,
+                TradeType = viewModel.TradeType,
+                NotifyUrl = viewModel.NotifyUrl
+            };
+            var response = await _client.ExecuteAsync(request, _optionsAccessor.Value);
+            ViewData["response"] = response.ResponseBody;
+            return View();
+        }
+
+        /// <summary>
+        /// APP支付
+        /// </summary>
+        /// <returns></returns>
+        [HttpGet]
+        public IActionResult AppPay()
+        {
+            return View();
+        }
+
+        /// <summary>
+        /// APP支付
+        /// </summary>
+        /// <param name="viewModel"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public async Task<IActionResult> AppPay(QPayUnifiedOrderViewModel viewModel)
+        {
+            var request = new QPayUnifiedOrderRequest
+            {
+                OutTradeNo = viewModel.OutTradeNo,
+                Body = viewModel.Body,
+                FeeType = viewModel.FeeType,
+                TotalFee = viewModel.TotalFee,
+                SpBillCreateIp = viewModel.SpBillCreateIp,
+                TradeType = viewModel.TradeType,
+                NotifyUrl = viewModel.NotifyUrl
+            };
+            var response = await _client.ExecuteAsync(request, _optionsAccessor.Value);
+            ViewData["response"] = response.ResponseBody;
+            return View();
+        }
+
+        /// <summary>
+        /// 订单查询
+        /// </summary>
+        /// <returns></returns>
+        [HttpGet]
+        public IActionResult OrderQuery()
+        {
+            return View();
+        }
+
+        /// <summary>
+        /// 订单查询
+        /// </summary>
+        /// <param name="viewModel"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public async Task<IActionResult> OrderQuery(QPayOrderQueryViewModel viewModel)
+        {
+            var request = new QPayOrderQueryRequest
+            {
+                TransactionId = viewModel.TransactionId,
+                OutTradeNo = viewModel.OutTradeNo
+            };
+            var response = await _client.ExecuteAsync(request, _optionsAccessor.Value);
+            ViewData["response"] = response.ResponseBody;
+            return View();
+        }
+
+        /// <summary>
+        /// 撤销订单
+        /// </summary>
+        /// <returns></returns>
+        [HttpGet]
+        public IActionResult Reverse()
+        {
+            return View();
+        }
+
+        /// <summary>
+        /// 撤销订单
+        /// </summary>
+        /// <param name="viewModel"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public async Task<IActionResult> Reverse(QPayReverseViewModel viewModel)
+        {
+            var request = new QPayReverseRequest
+            {
+                OutTradeNo = viewModel.OutTradeNo
+            };
+            var response = await _client.ExecuteAsync(request, _optionsAccessor.Value);
+            ViewData["response"] = response.ResponseBody;
+            return View();
+        }
+
+        /// <summary>
+        /// 关闭订单
+        /// </summary>
+        /// <returns></returns>
+        [HttpGet]
+        public IActionResult CloseOrder()
+        {
+            return View();
+        }
+
+        /// <summary>
+        /// 关闭订单
+        /// </summary>
+        /// <param name="viewModel"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public async Task<IActionResult> CloseOrder(QPayCloseOrderViewModel viewModel)
+        {
+            var request = new QPayCloseOrderRequest
+            {
+                OutTradeNo = viewModel.OutTradeNo
+            };
+            var response = await _client.ExecuteAsync(request, _optionsAccessor.Value);
+            ViewData["response"] = response.ResponseBody;
+            return View();
+        }
+
+        /// <summary>
+        /// 申请退款
+        /// </summary>
+        /// <returns></returns>
+        [HttpGet]
+        public IActionResult Refund()
+        {
+            return View();
+        }
+
+        /// <summary>
+        /// 申请退款
+        /// </summary>
+        /// <param name="viewModel"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public async Task<IActionResult> Refund(QPayRefundViewModel viewModel)
+        {
+            var request = new QPayRefundRequest
+            {
+                OutRefundNo = viewModel.OutRefundNo,
+                TransactionId = viewModel.TransactionId,
+                OutTradeNo = viewModel.OutTradeNo,
+                RefundFee = viewModel.RefundFee,
+                OpUserId = viewModel.OpUserId,
+                OpUserPasswd = MD5.Compute(viewModel.OpUserPasswd).ToUpper(),
+            };
+            var response = await _client.ExecuteAsync(request, _optionsAccessor.Value);
+            ViewData["response"] = response.ResponseBody;
+            return View();
+        }
+
+        /// <summary>
+        /// 退款查询
+        /// </summary>
+        /// <returns></returns>
+        [HttpGet]
+        public IActionResult RefundQuery()
+        {
+            return View();
+        }
+
+        /// <summary>
+        /// 退款查询
+        /// </summary>
+        /// <param name="viewModel"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public async Task<IActionResult> RefundQuery(QPayRefundQueryViewModel viewModel)
+        {
+            var request = new QPayRefundQueryRequest
+            {
+                RefundId = viewModel.RefundId,
+                OutRefundNo = viewModel.OutRefundNo,
+                TransactionId = viewModel.TransactionId,
+                OutTradeNo = viewModel.OutTradeNo
+            };
+            var response = await _client.ExecuteAsync(request, _optionsAccessor.Value);
+            ViewData["response"] = response.ResponseBody;
+            return View();
+        }
+
+        /// <summary>
+        /// 对账单下载
+        /// </summary>
+        /// <returns></returns>
+        [HttpGet]
+        public IActionResult StatementDown()
+        {
+            return View();
+        }
+
+        /// <summary>
+        /// 对账单下载
+        /// </summary>
+        /// <param name="viewModel"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public async Task<IActionResult> StatementDown(QPayStatementDownViewModel viewModel)
+        {
+            var request = new QPaySpDownloadStatementDownRequest
+            {
+                BillDate = viewModel.BillDate,
+                BillType = viewModel.BillType,
+                TarType = viewModel.TarType
+            };
+            var response = await _client.ExecuteAsync(request, _optionsAccessor.Value);
+            ViewData["response"] = response.ResponseBody;
+            return View();
+        }
+
+        /// <summary>
+        /// 企业付款
+        /// </summary>
+        /// <returns></returns>
+        [HttpGet]
+        public IActionResult B2CPay()
+        {
+            return View();
+        }
+
+        /// <summary>
+        /// 企业付款
+        /// </summary>
+        /// <param name="viewModel"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public async Task<IActionResult> B2CPay(QPayB2CPayViewModel viewModel)
+        {
+            var request = new QPayEPayB2CRequest
+            {
+                OpenId = viewModel.OpenId,
+                Uin = viewModel.Uin,
+                OutTradeNo = viewModel.OutTradeNo,
+                TotalFee = viewModel.TotalFee,
+                Memo = viewModel.Memo,
+                CheckRealName = viewModel.CheckRealName,
+                OpUserId = viewModel.OpUserId,
+                OpUserPasswd = MD5.Compute(viewModel.OpUserPasswd).ToUpper(),
+                SpBillCreateIp = viewModel.SpBillCreateIp,
+                NotifyUrl = viewModel.NotifyUrl,
+            };
+            var response = await _client.ExecuteAsync(request, _optionsAccessor.Value);
+            ViewData["response"] = response.ResponseBody;
+            return View();
+        }
+    }
+}

+ 90 - 0
samples/WebApplicationSample_V3_0/Controllers/UnionPayController.cs

@@ -0,0 +1,90 @@
+using System.Text;
+using System.Threading.Tasks;
+using Essensoft.AspNetCore.Payment.UnionPay;
+using Essensoft.AspNetCore.Payment.UnionPay.Notify;
+using Essensoft.AspNetCore.Payment.UnionPay.Request;
+using Microsoft.AspNetCore.Mvc;
+using Microsoft.Extensions.Options;
+using WebApplicationSample_V3_0.Models;
+
+namespace WebApplicationSample_V3_0.Controllers
+{
+    public class UnionPayController : Controller
+    {
+        private readonly IUnionPayClient _client;
+        private readonly IUnionPayNotifyClient _notifyClient;
+        private readonly IOptions<UnionPayOptions> _optionsAccessor;
+
+        public UnionPayController(IUnionPayClient client, IUnionPayNotifyClient notifyClient, IOptions<UnionPayOptions> optionsAccessor)
+        {
+            _client = client;
+            _notifyClient = notifyClient;
+            _optionsAccessor = optionsAccessor;
+        }
+
+        /// <summary>
+        /// 银联支付指引页
+        /// </summary>
+        /// <returns></returns>
+        public IActionResult Index()
+        {
+            return View();
+        }
+
+        /// <summary>
+        /// 跳转网关页面支付
+        /// </summary>
+        /// <returns></returns>
+        [HttpGet]
+        public IActionResult GatewayPayFrontConsume()
+        {
+            return View();
+        }
+
+        /// <summary>
+        /// 跳转网关页面支付
+        /// </summary>
+        /// <param name="viewModel"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public async Task<IActionResult> GatewayPayFrontConsume(GatewayPayFrontConsumeFrontConsumeViewModel viewModel)
+        {
+            var request = new UnionPayGatewayPayFrontConsumeRequest
+            {
+                TxnType = "01",
+                TxnSubType = "01",
+                BizType = "000201",
+                ChannelType = "07",
+                OrderId = viewModel.OrderId,
+                TxnTime = viewModel.TxnTime,
+                TxnAmt = viewModel.TxnAmt,
+                CurrencyCode = viewModel.CurrencyCode,
+                PayTimeOut = viewModel.PayTimeOut,
+                FrontUrl = viewModel.FrontUrl,
+                BackUrl = viewModel.BackUrl
+            };
+            var response = await _client.PageExecuteAsync(request, _optionsAccessor.Value);
+            return Content(response.Body, "text/html", Encoding.UTF8);
+        }
+
+        /// <summary>
+        /// 网关页面支付 - 同步跳转
+        /// </summary>
+        /// <returns></returns>
+        [HttpPost]
+        public async Task<IActionResult> GatewayPayFrontConsumeReturn()
+        {
+            try
+            {
+                var notify = await _notifyClient.ExecuteAsync<UnionPayGatewayPayFrontConsumeReturn>(Request, _optionsAccessor.Value);
+                ViewData["response"] = "支付成功";
+                return View();
+            }
+            catch
+            {
+                ViewData["response"] = "出现错误";
+                return View();
+            }
+        }
+    }
+}

+ 607 - 0
samples/WebApplicationSample_V3_0/Controllers/WeChatPayController.cs

@@ -0,0 +1,607 @@
+using System.Threading.Tasks;
+using Essensoft.AspNetCore.Payment.WeChatPay;
+using Essensoft.AspNetCore.Payment.WeChatPay.Request;
+using Microsoft.AspNetCore.Mvc;
+using Microsoft.Extensions.Options;
+using Newtonsoft.Json;
+using WebApplicationSample_V3_0.Models;
+
+namespace WebApplicationSample_V3_0.Controllers
+{
+    public class WeChatPayController : Controller
+    {
+        private readonly IWeChatPayClient _client;
+        private readonly IOptions<WeChatPayOptions> _optionsAccessor;
+
+        public WeChatPayController(IWeChatPayClient client, IOptions<WeChatPayOptions> optionsAccessor)
+        {
+            _client = client;
+            _optionsAccessor = optionsAccessor;
+        }
+
+        /// <summary>
+        /// 微信支付指引页
+        /// </summary>
+        /// <returns></returns>
+        public IActionResult Index()
+        {
+            return View();
+        }
+
+        /// <summary>
+        /// 刷卡支付
+        /// </summary>
+        /// <returns></returns>
+        [HttpGet]
+        public IActionResult MicroPay()
+        {
+            return View();
+        }
+
+        /// <summary>
+        /// 刷卡支付
+        /// </summary>
+        /// <param name="viewModel"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public async Task<IActionResult> MicroPay(WeChatPayMicroPayViewModel viewModel)
+        {
+            var request = new WeChatPayMicroPayRequest
+            {
+                Body = viewModel.Body,
+                OutTradeNo = viewModel.OutTradeNo,
+                TotalFee = viewModel.TotalFee,
+                SpBillCreateIp = viewModel.SpBillCreateIp,
+                AuthCode = viewModel.AuthCode
+            };
+            var response = await _client.ExecuteAsync(request, _optionsAccessor.Value);
+            ViewData["response"] = response.ResponseBody;
+            return View();
+        }
+
+        /// <summary>
+        /// 公众号支付
+        /// </summary>
+        /// <returns></returns>
+        [HttpGet]
+        public IActionResult PubPay()
+        {
+            return View();
+        }
+
+        /// <summary>
+        /// 公众号支付
+        /// </summary>
+        /// <param name="viewModel"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public async Task<IActionResult> PubPay(WeChatPayPubPayViewModel viewModel)
+        {
+            var request = new WeChatPayUnifiedOrderRequest
+            {
+                Body = viewModel.Body,
+                OutTradeNo = viewModel.OutTradeNo,
+                TotalFee = viewModel.TotalFee,
+                SpBillCreateIp = viewModel.SpBillCreateIp,
+                NotifyUrl = viewModel.NotifyUrl,
+                TradeType = viewModel.TradeType,
+                OpenId = viewModel.OpenId
+            };
+            var response = await _client.ExecuteAsync(request, _optionsAccessor.Value);
+            if (response.ReturnCode == "SUCCESS" && response.ResultCode == "SUCCESS")
+            {
+                var req = new WeChatPayJsApiSdkRequest
+                {
+                    Package = "prepay_id=" + response.PrepayId
+                };
+                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.ResponseBody;
+                return View();
+            }
+            ViewData["response"] = response.ResponseBody;
+            return View();
+        }
+
+        /// <summary>
+        /// 扫码支付
+        /// </summary>
+        /// <returns></returns>
+        [HttpGet]
+        public IActionResult QrCodePay()
+        {
+            return View();
+        }
+
+        /// <summary>
+        /// 扫码支付
+        /// </summary>
+        /// <param name="viewModel"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public async Task<IActionResult> QrCodePay(WeChatPayQrCodePayViewModel viewModel)
+        {
+            var request = new WeChatPayUnifiedOrderRequest
+            {
+                Body = viewModel.Body,
+                OutTradeNo = viewModel.OutTradeNo,
+                TotalFee = viewModel.TotalFee,
+                SpBillCreateIp = viewModel.SpBillCreateIp,
+                NotifyUrl = viewModel.NotifyUrl,
+                TradeType = viewModel.TradeType
+            };
+            var response = await _client.ExecuteAsync(request, _optionsAccessor.Value);
+            // response.CodeUrl 给前端生成二维码
+            ViewData["qrcode"] = response.CodeUrl;
+            ViewData["response"] = response.ResponseBody;
+            return View();
+        }
+
+        /// <summary>
+        /// APP支付
+        /// </summary>
+        /// <returns></returns>
+        [HttpGet]
+        public IActionResult AppPay()
+        {
+            return View();
+        }
+
+        /// <summary>
+        /// APP支付
+        /// </summary>
+        /// <param name="viewModel"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public async Task<IActionResult> AppPay(WeChatPayAppPayViewModel viewModel)
+        {
+            var request = new WeChatPayUnifiedOrderRequest
+            {
+                Body = viewModel.Body,
+                OutTradeNo = viewModel.OutTradeNo,
+                TotalFee = viewModel.TotalFee,
+                SpBillCreateIp = viewModel.SpBillCreateIp,
+                NotifyUrl = viewModel.NotifyUrl,
+                TradeType = viewModel.TradeType
+            };
+            var response = await _client.ExecuteAsync(request, _optionsAccessor.Value);
+
+            if (response.ReturnCode == "SUCCESS" && response.ResultCode == "SUCCESS")
+            {
+                var req = new WeChatPayAppSdkRequest
+                {
+                    PrepayId = response.PrepayId
+                };
+                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.ResponseBody;
+                return View();
+            }
+            ViewData["response"] = response.ResponseBody;
+            return View();
+        }
+
+        /// <summary>
+        /// H5支付
+        /// </summary>
+        /// <returns></returns>
+        [HttpGet]
+        public IActionResult H5Pay()
+        {
+            return View();
+        }
+
+        /// <summary>
+        /// H5支付
+        /// </summary>
+        /// <param name="viewModel"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public async Task<IActionResult> H5Pay(WeChatPayH5PayViewModel viewModel)
+        {
+            var request = new WeChatPayUnifiedOrderRequest
+            {
+                Body = viewModel.Body,
+                OutTradeNo = viewModel.OutTradeNo,
+                TotalFee = viewModel.TotalFee,
+                SpBillCreateIp = viewModel.SpBillCreateIp,
+                NotifyUrl = viewModel.NotifyUrl,
+                TradeType = viewModel.TradeType
+            };
+            var response = await _client.ExecuteAsync(request, _optionsAccessor.Value);
+
+            // mweb_url为拉起微信支付收银台的中间页面,可通过访问该url来拉起微信客户端,完成支付,mweb_url的有效期为5分钟。
+            return Redirect(response.MwebUrl);
+        }
+
+        /// <summary>
+        /// 小程序支付
+        /// </summary>
+        /// <returns></returns>
+        [HttpGet]
+        public IActionResult LiteAppPay()
+        {
+            return View();
+        }
+
+        /// <summary>
+        /// 小程序支付
+        /// </summary>
+        /// <param name="viewModel"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public async Task<IActionResult> LiteAppPay(WeChatPayLiteAppPayViewModel viewModel)
+        {
+            var request = new WeChatPayUnifiedOrderRequest
+            {
+                Body = viewModel.Body,
+                OutTradeNo = viewModel.OutTradeNo,
+                TotalFee = viewModel.TotalFee,
+                SpBillCreateIp = viewModel.SpBillCreateIp,
+                NotifyUrl = viewModel.NotifyUrl,
+                TradeType = viewModel.TradeType,
+                OpenId = viewModel.OpenId
+            };
+            var response = await _client.ExecuteAsync(request, _optionsAccessor.Value);
+
+            if (response.ReturnCode == "SUCCESS" && response.ResultCode == "SUCCESS")
+            {
+                var req = new WeChatPayLiteAppSdkRequest
+                {
+                    Package = "prepay_id=" + response.PrepayId
+                };
+                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.ResponseBody;
+                return View();
+            }
+            ViewData["response"] = response.ResponseBody;
+            return View();
+        }
+
+        /// <summary>
+        /// 查询订单
+        /// </summary>
+        /// <returns></returns>
+        [HttpGet]
+        public IActionResult OrderQuery()
+        {
+            return View();
+        }
+
+        /// <summary>
+        /// 查询订单
+        /// </summary>
+        /// <param name="viewModel"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public async Task<IActionResult> OrderQuery(WeChatPayOrderQueryViewModel viewModel)
+        {
+            var request = new WeChatPayOrderQueryRequest
+            {
+                TransactionId = viewModel.TransactionId,
+                OutTradeNo = viewModel.OutTradeNo
+            };
+            var response = await _client.ExecuteAsync(request, _optionsAccessor.Value);
+            ViewData["response"] = response.ResponseBody;
+            return View();
+        }
+
+        /// <summary>
+        /// 撤销订单
+        /// </summary>
+        /// <returns></returns>
+        [HttpGet]
+        public IActionResult Reverse()
+        {
+            return View();
+        }
+
+        /// <summary>
+        /// 撤销订单
+        /// </summary>
+        /// <param name="viewModel"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public async Task<IActionResult> Reverse(WeChatPayReverseViewModel viewModel)
+        {
+            var request = new WeChatPayReverseRequest
+            {
+                TransactionId = viewModel.TransactionId,
+                OutTradeNo = viewModel.OutTradeNo
+            };
+            var response = await _client.ExecuteAsync(request, _optionsAccessor.Value);
+            ViewData["response"] = response.ResponseBody;
+            return View();
+        }
+
+        /// <summary>
+        /// 关闭订单
+        /// </summary>
+        /// <returns></returns>
+        [HttpGet]
+        public IActionResult CloseOrder()
+        {
+            return View();
+        }
+
+        /// <summary>
+        /// 关闭订单
+        /// </summary>
+        /// <param name="viewModel"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public async Task<IActionResult> CloseOrder(WeChatPayCloseOrderViewModel viewModel)
+        {
+            var request = new WeChatPayCloseOrderRequest
+            {
+                OutTradeNo = viewModel.OutTradeNo
+            };
+            var response = await _client.ExecuteAsync(request, _optionsAccessor.Value);
+            ViewData["response"] = response.ResponseBody;
+            return View();
+        }
+
+        /// <summary>
+        /// 申请退款
+        /// </summary>
+        /// <returns></returns>
+        [HttpGet]
+        public IActionResult Refund()
+        {
+            return View();
+        }
+
+        /// <summary>
+        /// 申请退款
+        /// </summary>
+        /// <param name="viewModel"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public async Task<IActionResult> Refund(WeChatPayRefundViewModel viewModel)
+        {
+            var request = new WeChatPayRefundRequest
+            {
+                OutRefundNo = viewModel.OutRefundNo,
+                TransactionId = viewModel.TransactionId,
+                OutTradeNo = viewModel.OutTradeNo,
+                TotalFee = viewModel.TotalFee,
+                RefundFee = viewModel.RefundFee,
+                RefundDesc = viewModel.RefundDesc,
+                NotifyUrl = viewModel.NotifyUrl
+            };
+            var response = await _client.ExecuteAsync(request, _optionsAccessor.Value);
+            ViewData["response"] = response.ResponseBody;
+            return View();
+        }
+
+        /// <summary>
+        /// 查询退款
+        /// </summary>
+        /// <returns></returns>
+        [HttpGet]
+        public IActionResult RefundQuery()
+        {
+            return View();
+        }
+
+        /// <summary>
+        /// 查询退款
+        /// </summary>
+        /// <param name="viewModel"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public async Task<IActionResult> RefundQuery(WeChatPayRefundQueryViewModel viewModel)
+        {
+            var request = new WeChatPayRefundQueryRequest
+            {
+                RefundId = viewModel.RefundId,
+                OutRefundNo = viewModel.OutRefundNo,
+                TransactionId = viewModel.TransactionId,
+                OutTradeNo = viewModel.OutTradeNo
+            };
+            var response = await _client.ExecuteAsync(request, _optionsAccessor.Value);
+            ViewData["response"] = response.ResponseBody;
+            return View();
+        }
+
+        /// <summary>
+        /// 下载对账单
+        /// </summary>
+        /// <returns></returns>
+        [HttpGet]
+        public IActionResult DownloadBill()
+        {
+            return View();
+        }
+
+        /// <summary>
+        /// 下载对账单
+        /// </summary>
+        /// <param name="viewModel"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public async Task<IActionResult> DownloadBill(WeChatPayDownloadBillViewModel viewModel)
+        {
+            var request = new WeChatPayDownloadBillRequest
+            {
+                BillDate = viewModel.BillDate,
+                BillType = viewModel.BillType,
+                TarType = viewModel.TarType
+            };
+            var response = await _client.ExecuteAsync(request, _optionsAccessor.Value);
+            ViewData["response"] = response.ResponseBody;
+            return View();
+        }
+
+        /// <summary>
+        /// 下载资金账单
+        /// </summary>
+        /// <returns></returns>
+        [HttpGet]
+        public IActionResult DownloadFundFlow()
+        {
+            return View();
+        }
+
+        /// <summary>
+        /// 下载资金账单
+        /// </summary>
+        /// <param name="viewModel"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public async Task<IActionResult> DownloadFundFlow(WeChatPayDownloadFundFlowViewModel viewModel)
+        {
+            var request = new WeChatPayDownloadFundFlowRequest
+            {
+                BillDate = viewModel.BillDate,
+                AccountType = viewModel.AccountType,
+                TarType = viewModel.TarType
+            };
+            var response = await _client.ExecuteAsync(request, _optionsAccessor.Value);
+            ViewData["response"] = response.ResponseBody;
+            return View();
+        }
+
+        /// <summary>
+        /// 企业付款到零钱
+        /// </summary>
+        /// <returns></returns>
+        [HttpGet]
+        public IActionResult Transfers()
+        {
+            return View();
+        }
+
+        /// <summary>
+        /// 企业付款到零钱
+        /// </summary>
+        /// <param name="viewModel"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public async Task<IActionResult> Transfers(WeChatPayTransfersViewModel viewModel)
+        {
+            var request = new WeChatPayPromotionTransfersRequest
+            {
+                PartnerTradeNo = viewModel.PartnerTradeNo,
+                OpenId = viewModel.OpenId,
+                CheckName = viewModel.CheckName,
+                ReUserName = viewModel.ReUserName,
+                Amount = viewModel.Amount,
+                Desc = viewModel.Desc,
+                SpBillCreateIp = viewModel.SpBillCreateIp
+            };
+            var response = await _client.ExecuteAsync(request, _optionsAccessor.Value);
+            ViewData["response"] = response.ResponseBody;
+            return View();
+        }
+
+        /// <summary>
+        /// 查询企业付款
+        /// </summary>
+        /// <returns></returns>
+        [HttpGet]
+        public IActionResult GetTransferInfo()
+        {
+            return View();
+        }
+
+        /// <summary>
+        /// 查询企业付款
+        /// </summary>
+        /// <param name="viewModel"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public async Task<IActionResult> GetTransferInfo(WeChatPayGetTransferInfoViewModel viewModel)
+        {
+            var request = new WeChatPayGetTransferInfoRequest
+            {
+                PartnerTradeNo = viewModel.PartnerTradeNo
+            };
+            var response = await _client.ExecuteAsync(request, _optionsAccessor.Value);
+            ViewData["response"] = response.ResponseBody;
+            return View();
+        }
+
+        /// <summary>
+        /// 企业付款到银行卡
+        /// </summary>
+        /// <returns></returns>
+        [HttpGet]
+        public IActionResult PayBank()
+        {
+            return View();
+        }
+
+        /// <summary>
+        /// 企业付款到银行卡
+        /// </summary>
+        /// <param name="viewModel"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public async Task<IActionResult> PayBank(WeChatPayPayBankViewModel viewModel)
+        {
+            var request = new WeChatPayPayBankRequest
+            {
+                PartnerTradeNo = viewModel.PartnerTradeNo,
+                EncBankNo = viewModel.EncBankNo,
+                EncTrueName = viewModel.EncTrueName,
+                BankCode = viewModel.BankCode,
+                Amount = viewModel.Amount,
+                Desc = viewModel.Desc
+            };
+            var response = await _client.ExecuteAsync(request, _optionsAccessor.Value);
+            ViewData["response"] = response.ResponseBody;
+            return View();
+        }
+
+        /// <summary>
+        /// 查询企业付款银行卡
+        /// </summary>
+        /// <returns></returns>
+        [HttpGet]
+        public IActionResult QueryBank()
+        {
+            return View();
+        }
+
+        /// <summary>
+        /// 查询企业付款银行卡
+        /// </summary>
+        /// <param name="viewModel"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public async Task<IActionResult> QueryBank(WeChatPayQueryBankViewModel viewModel)
+        {
+            var request = new WeChatPayQueryBankRequest
+            {
+                PartnerTradeNo = viewModel.PartnerTradeNo
+            };
+            var response = await _client.ExecuteAsync(request, _optionsAccessor.Value);
+            ViewData["response"] = response.ResponseBody;
+            return View();
+        }
+
+        /// <summary>
+        /// 获取RSA加密公钥
+        /// </summary>
+        /// <returns></returns>
+        [HttpGet]
+        [HttpPost]
+        public async Task<IActionResult> GetPublicKey()
+        {
+            if (Request.Method == "POST")
+            {
+                var request = new WeChatPayRiskGetPublicKeyRequest();
+                var response = await _client.ExecuteAsync(request, _optionsAccessor.Value);
+                ViewData["response"] = response.ResponseBody;
+                return View();
+            }
+
+            return View();
+        }
+    }
+}

+ 25 - 0
samples/WebApplicationSample_V3_0/Helpers/HMTLHelperExtensions.cs

@@ -0,0 +1,25 @@
+using Microsoft.AspNetCore.Mvc.Rendering;
+
+namespace WebApplicationSample_V3_0.Helpers
+{
+    public static class HtmlHelpers
+    {
+        public static string IsActive(this IHtmlHelper html, string controller = null, string action = null, string activeClass = "active")
+        {
+            var actualAction = (string)html.ViewContext.RouteData.Values["action"];
+            var actualController = (string)html.ViewContext.RouteData.Values["controller"];
+
+            if (string.IsNullOrEmpty(controller))
+            {
+                controller = actualController;
+            }
+
+            if (string.IsNullOrEmpty(action))
+            {
+                action = actualAction;
+            }
+
+            return controller == actualController && action == actualAction ? activeClass : string.Empty;
+        }
+    }
+}

+ 212 - 0
samples/WebApplicationSample_V3_0/Models/AlipayViewModel.cs

@@ -0,0 +1,212 @@
+using System.ComponentModel.DataAnnotations;
+
+namespace WebApplicationSample_V3_0.Models
+{
+    public class AlipayTradePreCreateViewModel
+    {
+        [Required]
+        [Display(Name = "out_trade_no")]
+        public string OutTradeNo { get; set; }
+
+        [Required]
+        [Display(Name = "subject")]
+        public string Subject { get; set; }
+
+        [Display(Name = "body")]
+        public string Body { get; set; }
+
+        [Required]
+        [Display(Name = "total_amount")]
+        public string TotalAmount { get; set; }
+
+        [Display(Name = "notify_url")]
+        public string NotifyUrl { get; set; }
+    }
+
+    public class AlipayTradePayViewModel
+    {
+        [Required]
+        [Display(Name = "out_trade_no")]
+        public string OutTradeNo { get; set; }
+
+        [Required]
+        [Display(Name = "subject")]
+        public string Subject { get; set; }
+
+        [Required]
+        [Display(Name = "scene")]
+        public string Scene { get; set; }
+
+        [Required]
+        [Display(Name = "auth_code")]
+        public string AuthCode { get; set; }
+
+        [Display(Name = "body")]
+        public string Body { get; set; }
+
+        [Required]
+        [Display(Name = "total_amount")]
+        public string TotalAmount { get; set; }
+    }
+
+    public class AlipayTradeAppPayViewModel
+    {
+        [Required]
+        [Display(Name = "out_trade_no")]
+        public string OutTradeNo { get; set; }
+
+        [Required]
+        [Display(Name = "subject")]
+        public string Subject { get; set; }
+
+        [Display(Name = "product_code")]
+        public string ProductCode { get; set; }
+
+        [Display(Name = "body")]
+        public string Body { get; set; }
+
+        [Required]
+        [Display(Name = "total_amount")]
+        public string TotalAmount { get; set; }
+
+        [Display(Name = "notify_url")]
+        public string NotifyUrl { get; set; }
+    }
+
+    public class AlipayTradePagePayViewModel
+    {
+        [Required]
+        [Display(Name = "out_trade_no")]
+        public string OutTradeNo { get; set; }
+
+        [Required]
+        [Display(Name = "subject")]
+        public string Subject { get; set; }
+
+        [Required]
+        [Display(Name = "product_code")]
+        public string ProductCode { get; set; }
+
+        [Display(Name = "body")]
+        public string Body { get; set; }
+
+        [Required]
+        [Display(Name = "total_amount")]
+        public string TotalAmount { get; set; }
+
+        [Display(Name = "notify_url")]
+        public string NotifyUrl { get; set; }
+
+        [Display(Name = "return_url")]
+        public string ReturnUrl { get; set; }
+    }
+
+    public class AlipayTradeWapPayViewModel
+    {
+        [Required]
+        [Display(Name = "out_trade_no")]
+        public string OutTradeNo { get; set; }
+
+        [Required]
+        [Display(Name = "subject")]
+        public string Subject { get; set; }
+
+        [Required]
+        [Display(Name = "product_code")]
+        public string ProductCode { get; set; }
+
+        [Display(Name = "body")]
+        public string Body { get; set; }
+
+        [Required]
+        [Display(Name = "total_amount")]
+        public string TotalAmount { get; set; }
+
+        [Display(Name = "notify_url")]
+        public string NotifyUrl { get; set; }
+
+        [Display(Name = "return_url")]
+        public string ReturnUrl { get; set; }
+    }
+
+    public class AlipayTradeQueryViewModel
+    {
+        [Display(Name = "out_trade_no")]
+        public string OutTradeNo { get; set; }
+
+        [Display(Name = "trade_no")]
+        public string TradeNo { get; set; }
+    }
+
+    public class AlipayTradeRefundViewModel
+    {
+        [Display(Name = "out_trade_no")]
+        public string OutTradeNo { get; set; }
+
+        [Display(Name = "trade_no")]
+        public string TradeNo { get; set; }
+
+        [Display(Name = "refund_amount")]
+        public string RefundAmount { get; set; }
+
+        [Display(Name = "out_request_no")]
+        public string OutRequestNo { get; set; }
+
+        [Display(Name = "refund_reason")]
+        public string RefundReason { get; set; }
+    }
+
+    public class AlipayTradeRefundQueryViewModel
+    {
+        [Display(Name = "out_trade_no")]
+        public string OutTradeNo { get; set; }
+
+        [Display(Name = "trade_no")]
+        public string TradeNo { get; set; }
+
+        [Display(Name = "out_request_no")]
+        public string OutRequestNo { get; set; }
+    }
+    
+    public class AlipayTransferViewModel
+    {
+        [Required]
+        [Display(Name = "out_biz_no")]
+        public string OutBizNo { get; set; }
+
+        [Required]
+        [Display(Name = "payee_account")]
+        public string PayeeAccount { get; set; }
+
+        [Required]
+        [Display(Name = "payee_type")]
+        public string PayeeType { get; set; }
+
+        [Required]
+        [Display(Name = "amount")]
+        public string Amount { get; set; }
+
+        [Display(Name = "remark")]
+        public string Remark { get; set; }
+    }
+
+    public class AlipayTransQueryViewModel
+    {
+        [Display(Name = "out_biz_no")]
+        public string OutBizNo { get; set; }
+
+        [Display(Name = "order_id")]
+        public string OrderId { get; set; }
+    }
+
+    public class AlipayBillDownloadurlQueryViewModel
+    {
+        [Required]
+        [Display(Name = "bill_type")]
+        public string BillType { get; set; }
+
+        [Required]
+        [Display(Name = "bill_date")]
+        public string BillDate { get; set; }
+    }
+}

+ 9 - 0
samples/WebApplicationSample_V3_0/Models/ErrorViewModel.cs

@@ -0,0 +1,9 @@
+namespace WebApplicationSample_V3_0.Models
+{
+    public class ErrorViewModel
+    {
+        public string RequestId { get; set; }
+
+        public bool ShowRequestId => !string.IsNullOrEmpty(RequestId);
+    }
+}

+ 241 - 0
samples/WebApplicationSample_V3_0/Models/JDPayViewModel.cs

@@ -0,0 +1,241 @@
+using System.ComponentModel.DataAnnotations;
+
+namespace WebApplicationSample_V3_0.Models
+{
+    public class JDPaySaveOrderViewModel
+    {
+        [Required]
+        [Display(Name = "tradeNum")]
+        public string TradeNum { get; set; }
+
+        [Required]
+        [Display(Name = "tradeName")]
+        public string TradeName { get; set; }
+
+        [Required]
+        [Display(Name = "tradeTime")]
+        public string TradeTime { get; set; }
+
+        [Required]
+        [Display(Name = "amount")]
+        public string Amount { get; set; }
+
+        [Required]
+        [Display(Name = "orderType")]
+        public string OrderType { get; set; }
+
+        [Required]
+        [Display(Name = "currency")]
+        public string Currency { get; set; }
+
+        [Required]
+        [Display(Name = "callbackUrl")]
+        public string CallbackUrl { get; set; }
+
+        [Required]
+        [Display(Name = "notifyUrl")]
+        public string NotifyUrl { get; set; }
+
+        [Display(Name = "userId")]
+        public string UserId { get; set; }
+    }
+
+    public class JDPayUnifiedOrderViewModel
+    {
+        [Required]
+        [Display(Name = "tradeNum")]
+        public string TradeNum { get; set; }
+
+        [Required]
+        [Display(Name = "tradeName")]
+        public string TradeName { get; set; }
+
+        [Required]
+        [Display(Name = "tradeTime")]
+        public string TradeTime { get; set; }
+
+        [Required]
+        [Display(Name = "amount")]
+        public string Amount { get; set; }
+
+        [Required]
+        [Display(Name = "orderType")]
+        public string OrderType { get; set; }
+
+        [Required]
+        [Display(Name = "currency")]
+        public string Currency { get; set; }
+
+        [Required]
+        [Display(Name = "notifyUrl")]
+        public string NotifyUrl { get; set; }
+
+        [Required]
+        [Display(Name = "tradeType")]
+        public string TradeType { get; set; }
+    }
+
+    public class JDPayQueryViewModel
+    {
+        [Required]
+        [Display(Name = "tradeNum")]
+        public string TradeNum { get; set; }
+
+        [Display(Name = "oTradeNum")]
+        public string OTradeNum { get; set; }
+
+        [Required]
+        [Display(Name = "tradeType")]
+        public string TradeType { get; set; }
+    }
+
+    public class JDPayRefundViewModel
+    {
+        [Required]
+        [Display(Name = "tradeNum")]
+        public string TradeNum { get; set; }
+
+        [Required]
+        [Display(Name = "oTradeNum")]
+        public string OTradeNum { get; set; }
+
+        [Required]
+        [Display(Name = "amount")]
+        public string Amount { get; set; }
+
+        [Required]
+        [Display(Name = "currency")]
+        public string Currency { get; set; }
+
+        [Required]
+        [Display(Name = "notifyUrl")]
+        public string NotifyUrl { get; set; }
+    }
+
+    public class JDPayQueryRefundViewModel
+    {
+        [Required]
+        [Display(Name = "tradeNum")]
+        public string TradeNum { get; set; }
+
+        [Display(Name = "oTradeNum")]
+        public string OTradeNum { get; set; }
+
+        [Required]
+        [Display(Name = "tradeType")]
+        public string TradeType { get; set; }
+    }
+
+    public class JDPayDefrayPayViewModel
+    {
+        [Required]
+        [Display(Name = "request_datetime")]
+        public string RequestDatetime { get; set; }
+
+        [Required]
+        [Display(Name = "out_trade_no")]
+        public string OutTradeNo { get; set; }
+
+        [Display(Name = "biz_trade_no")]
+        public string BizTradeNo { get; set; }
+
+        [Display(Name = "out_trade_date")]
+        public string OutTradeDate { get; set; }
+
+        [Required]
+        [Display(Name = "trade_amount")]
+        public string TradeAmount { get; set; }
+
+        [Required]
+        [Display(Name = "trade_currency")]
+        public string TradeCurrency { get; set; }
+
+        [Display(Name = "seller_info")]
+        public string SellerInfo { get; set; }
+
+        [Required]
+        [Display(Name = "trade_subject")]
+        public string TradeSubject { get; set; }
+
+        [Display(Name = "category_code")]
+        public string CategoryCode { get; set; }
+
+        [Required]
+        [Display(Name = "pay_tool")]
+        public string PayTool { get; set; }
+
+        [Display(Name = "trade_source")]
+        public string TradeSource { get; set; }
+
+        [Display(Name = "payee_bank_code")]
+        public string PayeeBankCode { get; set; }
+
+        [Display(Name = "payee_bank_associated_code")]
+        public string PayeeBankAssociatedCode { get; set; }
+
+        [Display(Name = "payee_bank_fullname")]
+        public string PayeeBankFullname { get; set; }
+
+        [Display(Name = "payee_bank_country_code")]
+        public string PayeeBankCountryCode { get; set; }
+
+        [Display(Name = "payee_bank_province_code")]
+        public string PayeeBankProvinceCode { get; set; }
+
+        [Display(Name = "payee_bank_city_code")]
+        public string PayeeBankCityCode { get; set; }
+
+        [Display(Name = "payee_card_type")]
+        public string PayeeCardType { get; set; }
+
+        [Display(Name = "payee_account_type")]
+        public string PayeeAccountType { get; set; }
+
+        [Display(Name = "payee_account_no")]
+        public string PayeeAccountNo { get; set; }
+
+        [Display(Name = "payee_account_name")]
+        public string PayeeAccountName { get; set; }
+
+        [Display(Name = "payee_id_type")]
+        public string PayeeIdType { get; set; }
+
+        [Display(Name = "payee_id_no")]
+        public string PayeeIdNo { get; set; }
+
+        [Display(Name = "payee_mobile")]
+        public string PayeeMobile { get; set; }
+
+        [Display(Name = "notify_url")]
+        public string NotifyUrl { get; set; }
+
+        [Display(Name = "return_params")]
+        public string ReturnParams { get; set; }
+
+        [Display(Name = "extend_params")]
+        public string ExtendParams { get; set; }
+
+        [Display(Name = "bank_card_info_type")]
+        public string BankCardInfoType { get; set; }
+
+        [Display(Name = "bank_card_id")]
+        public string BankCardId { get; set; }
+    }
+
+    public class JDPayTradeQueryViewModel
+    {
+        [Required]
+        [Display(Name = "request_datetime")]
+        public string RequestDatetime { get; set; }
+
+        [Display(Name = "out_trade_no")]
+        public string OutTradeNo { get; set; }
+
+        [Display(Name = "trade_no")]
+        public string TradeNo { get; set; }
+
+        [Required]
+        [Display(Name = "trade_type")]
+        public string TradeType { get; set; }
+    }
+}

+ 125 - 0
samples/WebApplicationSample_V3_0/Models/LianLianPayViewModel.cs

@@ -0,0 +1,125 @@
+using System.ComponentModel.DataAnnotations;
+
+namespace WebApplicationSample_V3_0.Models
+{
+    public class LianLianPayWebQuickPayViewModel
+    {
+        [Required]
+        [Display(Name = "no_order")]
+        public string NoOrder { get; set; }
+
+        [Required]
+        [Display(Name = "dt_order")]
+        public string DtOrder { get; set; }
+
+        [Required]
+        [Display(Name = "money_order")]
+        public string MoneyOrder { get; set; }
+
+        [Required]
+        [Display(Name = "name_goods")]
+        public string NameGoods { get; set; }
+
+        [Required]
+        [Display(Name = "user_id")]
+        public string UserId { get; set; }
+
+        [Required]
+        [Display(Name = "notify_url")]
+        public string NotifyUrl { get; set; }
+
+        [Display(Name = "url_return")]
+        public string UrlReturn { get; set; }
+
+        [Required]
+        [Display(Name = "risk_item")]
+        public string RiskItem { get; set; }
+    }
+
+    public class LianLianPayH5QuickPayViewModel
+    {
+        [Required]
+        [Display(Name = "no_order")]
+        public string NoOrder { get; set; }
+
+        [Required]
+        [Display(Name = "dt_order")]
+        public string DtOrder { get; set; }
+
+        [Required]
+        [Display(Name = "money_order")]
+        public string MoneyOrder { get; set; }
+
+        [Required]
+        [Display(Name = "name_goods")]
+        public string NameGoods { get; set; }
+
+        [Required]
+        [Display(Name = "user_id")]
+        public string UserId { get; set; }
+
+        [Required]
+        [Display(Name = "notify_url")]
+        public string NotifyUrl { get; set; }
+
+        [Display(Name = "url_return")]
+        public string UrlReturn { get; set; }
+
+        [Required]
+        [Display(Name = "risk_item")]
+        public string RiskItem { get; set; }
+    }
+
+    public class LianLianPayOrderQueryViewModel
+    {
+        [Required]
+        [Display(Name = "no_order")]
+        public string NoOrder { get; set; }
+
+        [Display(Name = "dt_order")]
+        public string DtOrder { get; set; }
+
+        [Display(Name = "oid_paybill")]
+        public string OidPayBill { get; set; }
+    }
+
+    public class LianLianPayRefundViewModel
+    {
+        [Required]
+        [Display(Name = "no_refund")]
+        public string NoRefund { get; set; }
+
+        [Required]
+        [Display(Name = "dt_refund")]
+        public string DtRefund { get; set; }
+
+        [Required]
+        [Display(Name = "money_refund")]
+        public string MoneyRefund { get; set; }
+
+        [Display(Name = "no_order")]
+        public string NoOrder { get; set; }
+
+        [Display(Name = "dt_order")]
+        public string DtOrder { get; set; }
+
+        [Display(Name = "oid_paybill")]
+        public string OidPayBill { get; set; }
+
+        [Required]
+        [Display(Name = "notify_url")]
+        public string NotifyUrl { get; set; }
+    }
+
+    public class LianLianPayRefundQueryViewModel
+    {
+        [Display(Name = "no_refund")]
+        public string NoRefund { get; set; }
+
+        [Display(Name = "dt_refund")]
+        public string DtRefund { get; set; }
+
+        [Display(Name = "oid_refundno")]
+        public string OidRefundNo { get; set; }
+    }
+}

+ 189 - 0
samples/WebApplicationSample_V3_0/Models/QPayViewModel.cs

@@ -0,0 +1,189 @@
+using System.ComponentModel.DataAnnotations;
+
+namespace WebApplicationSample_V3_0.Models
+{
+    public class QPayMicroPayViewModel
+    {
+        [Required]
+        [Display(Name = "out_trade_no")]
+        public string OutTradeNo { get; set; }
+
+        [Required]
+        [Display(Name = "body")]
+        public string Body { get; set; }
+
+        [Required]
+        [Display(Name = "fee_type")]
+        public string FeeType { get; set; }
+
+        [Required]
+        [Display(Name = "total_fee")]
+        public int TotalFee { get; set; }
+
+        [Required]
+        [Display(Name = "spbill_create_ip")]
+        public string SpBillCreateIp { get; set; }
+
+        [Required]
+        [Display(Name = "device_info")]
+        public string DeviceInfo { get; set; }
+
+        [Required]
+        [Display(Name = "auth_code")]
+        public string AuthCode { get; set; }
+
+        [Required]
+        [Display(Name = "trade_type")]
+        public string TradeType { get; set; }
+
+        [Required]
+        [Display(Name = "notify_url")]
+        public string NotifyUrl { get; set; }
+    }
+
+    public class QPayUnifiedOrderViewModel
+    {
+        [Required]
+        [Display(Name = "out_trade_no")]
+        public string OutTradeNo { get; set; }
+
+        [Required]
+        [Display(Name = "body")]
+        public string Body { get; set; }
+
+        [Required]
+        [Display(Name = "fee_type")]
+        public string FeeType { get; set; }
+
+        [Required]
+        [Display(Name = "total_fee")]
+        public int TotalFee { get; set; }
+
+        [Required]
+        [Display(Name = "spbill_create_ip")]
+        public string SpBillCreateIp { get; set; }
+
+        [Required]
+        [Display(Name = "trade_type")]
+        public string TradeType { get; set; }
+
+        [Required]
+        [Display(Name = "notify_url")]
+        public string NotifyUrl { get; set; }
+    }
+
+    public class QPayOrderQueryViewModel
+    {
+        [Display(Name = "transaction_id")]
+        public string TransactionId { get; set; }
+
+        [Display(Name = "out_trade_no")]
+        public string OutTradeNo { get; set; }
+    }
+
+    public class QPayReverseViewModel
+    {
+        [Required]
+        [Display(Name = "out_trade_no")]
+        public string OutTradeNo { get; set; }
+    }
+
+    public class QPayCloseOrderViewModel
+    {
+        [Required]
+        [Display(Name = "out_trade_no")]
+        public string OutTradeNo { get; set; }
+    }
+
+    public class QPayRefundViewModel
+    {
+        [Required]
+        [Display(Name = "out_refund_no")]
+        public string OutRefundNo { get; set; }
+
+        [Display(Name = "transaction_id")]
+        public string TransactionId { get; set; }
+
+        [Display(Name = "out_trade_no")]
+        public string OutTradeNo { get; set; }
+
+        [Required]
+        [Display(Name = "refund_fee")]
+        public int RefundFee { get; set; }
+
+        [Required]
+        [Display(Name = "op_user_id")]
+        public string OpUserId { get; set; }
+
+        [Required]
+        [Display(Name = "op_user_passwd")]
+        public string OpUserPasswd { get; set; }
+    }
+
+    public class QPayRefundQueryViewModel
+    {
+        [Display(Name = "refund_id")]
+        public string RefundId { get; set; }
+
+        [Display(Name = "out_refund_no")]
+        public string OutRefundNo { get; set; }
+
+        [Display(Name = "transaction_id")]
+        public string TransactionId { get; set; }
+
+        [Display(Name = "out_trade_no")]
+        public string OutTradeNo { get; set; }
+    }
+
+    public class QPayStatementDownViewModel
+    {
+        [Required]
+        [Display(Name = "bill_date")]
+        public string BillDate { get; set; }
+
+        [Required]
+        [Display(Name = "bill_type")]
+        public string BillType { get; set; }
+
+        [Display(Name = "tar_type")]
+        public string TarType { get; set; }
+    }
+
+    public class QPayB2CPayViewModel
+    {
+        [Display(Name = "openid")]
+        public string OpenId { get; set; }
+
+        [Display(Name = "uin")]
+        public string Uin { get; set; }
+
+        [Required]
+        [Display(Name = "out_trade_no")]
+        public string OutTradeNo { get; set; }
+
+        [Display(Name = "total_fee")]
+        [Required]
+        public int TotalFee { get; set; }
+
+        [Display(Name = "memo")]
+        public string Memo { get; set; }
+
+        [Display(Name = "check_real_name")]
+        public string CheckRealName { get; set; }
+
+        [Required]
+        [Display(Name = "op_user_id")]
+        public string OpUserId { get; set; }
+
+        [Required]
+        [Display(Name = "op_user_passwd")]
+        public string OpUserPasswd { get; set; }
+
+        [Required]
+        [Display(Name = "spbill_create_ip")]
+        public string SpBillCreateIp { get; set; }
+
+        [Display(Name = "notify_url")]
+        public string NotifyUrl { get; set; }
+    }
+}

+ 33 - 0
samples/WebApplicationSample_V3_0/Models/UnionPayViewModel.cs

@@ -0,0 +1,33 @@
+using System.ComponentModel.DataAnnotations;
+
+namespace WebApplicationSample_V3_0.Models
+{
+    public class GatewayPayFrontConsumeFrontConsumeViewModel
+    {
+        [Required]
+        [Display(Name = "orderId")]
+        public string OrderId { get; set; }
+
+        [Required]
+        [Display(Name = "txnTime")]
+        public string TxnTime { get; set; }
+
+        [Required]
+        [Display(Name = "txnAmt")]
+        public string TxnAmt { get; set; }
+
+        [Required]
+        [Display(Name = "currencyCode")]
+        public string CurrencyCode { get; set; }
+
+        [Display(Name = "payTimeout")]
+        public string PayTimeOut { get; set; }
+
+        [Display(Name = "frontUrl")]
+        public string FrontUrl { get; set; }
+
+        [Required]
+        [Display(Name = "backUrl")]
+        public string BackUrl { get; set; }
+    }
+}

+ 335 - 0
samples/WebApplicationSample_V3_0/Models/WeChatPayViewModel.cs

@@ -0,0 +1,335 @@
+using System.ComponentModel.DataAnnotations;
+
+namespace WebApplicationSample_V3_0.Models
+{
+    public class WeChatPayMicroPayViewModel
+    {
+        [Required]
+        [Display(Name = "out_trade_no")]
+        public string OutTradeNo { get; set; }
+
+        [Required]
+        [Display(Name = "body")]
+        public string Body { get; set; }
+
+        [Required]
+        [Display(Name = "total_fee")]
+        public int TotalFee { get; set; }
+
+        [Required]
+        [Display(Name = "spbill_create_ip")]
+        public string SpBillCreateIp { get; set; }
+
+        [Required]
+        [Display(Name = "auth_code")]
+        public string AuthCode { get; set; }
+    }
+
+    public class WeChatPayPubPayViewModel
+    {
+        [Required]
+        [Display(Name = "out_trade_no")]
+        public string OutTradeNo { get; set; }
+
+        [Required]
+        [Display(Name = "body")]
+        public string Body { get; set; }
+
+        [Required]
+        [Display(Name = "total_fee")]
+        public int TotalFee { get; set; }
+
+        [Required]
+        [Display(Name = "spbill_create_ip")]
+        public string SpBillCreateIp { get; set; }
+
+        [Required]
+        [Display(Name = "notify_url")]
+        public string NotifyUrl { get; set; }
+
+        [Required]
+        [Display(Name = "trade_type")]
+        public string TradeType { get; set; }
+
+        [Required]
+        [Display(Name = "openid")]
+        public string OpenId { get; set; }
+    }
+
+    public class WeChatPayQrCodePayViewModel
+    {
+        [Required]
+        [Display(Name = "out_trade_no")]
+        public string OutTradeNo { get; set; }
+
+        [Required]
+        [Display(Name = "body")]
+        public string Body { get; set; }
+
+        [Required]
+        [Display(Name = "total_fee")]
+        public int TotalFee { get; set; }
+
+        [Required]
+        [Display(Name = "spbill_create_ip")]
+        public string SpBillCreateIp { get; set; }
+
+        [Required]
+        [Display(Name = "notify_url")]
+        public string NotifyUrl { get; set; }
+
+        [Required]
+        [Display(Name = "trade_type")]
+        public string TradeType { get; set; }
+    }
+
+    public class WeChatPayAppPayViewModel
+    {
+        [Required]
+        [Display(Name = "out_trade_no")]
+        public string OutTradeNo { get; set; }
+
+        [Required]
+        [Display(Name = "body")]
+        public string Body { get; set; }
+
+        [Required]
+        [Display(Name = "total_fee")]
+        public int TotalFee { get; set; }
+
+        [Required]
+        [Display(Name = "spbill_create_ip")]
+        public string SpBillCreateIp { get; set; }
+
+        [Required]
+        [Display(Name = "notify_url")]
+        public string NotifyUrl { get; set; }
+
+        [Required]
+        [Display(Name = "trade_type")]
+        public string TradeType { get; set; }
+    }
+
+    public class WeChatPayH5PayViewModel
+    {
+        [Required]
+        [Display(Name = "out_trade_no")]
+        public string OutTradeNo { get; set; }
+
+        [Required]
+        [Display(Name = "body")]
+        public string Body { get; set; }
+
+        [Required]
+        [Display(Name = "total_fee")]
+        public int TotalFee { get; set; }
+
+        [Required]
+        [Display(Name = "spbill_create_ip")]
+        public string SpBillCreateIp { get; set; }
+
+        [Required]
+        [Display(Name = "notify_url")]
+        public string NotifyUrl { get; set; }
+
+        [Required]
+        [Display(Name = "trade_type")]
+        public string TradeType { get; set; }
+    }
+
+    public class WeChatPayLiteAppPayViewModel
+    {
+        [Required]
+        [Display(Name = "out_trade_no")]
+        public string OutTradeNo { get; set; }
+
+        [Required]
+        [Display(Name = "body")]
+        public string Body { get; set; }
+
+        [Required]
+        [Display(Name = "total_fee")]
+        public int TotalFee { get; set; }
+
+        [Required]
+        [Display(Name = "spbill_create_ip")]
+        public string SpBillCreateIp { get; set; }
+
+        [Required]
+        [Display(Name = "notify_url")]
+        public string NotifyUrl { get; set; }
+
+        [Required]
+        [Display(Name = "trade_type")]
+        public string TradeType { get; set; }
+
+        [Required]
+        [Display(Name = "openid")]
+        public string OpenId { get; set; }
+    }
+
+    public class WeChatPayOrderQueryViewModel
+    {
+        [Display(Name = "transaction_id")]
+        public string TransactionId { get; set; }
+
+        [Display(Name = "out_trade_no")]
+        public string OutTradeNo { get; set; }
+    }
+
+    public class WeChatPayReverseViewModel
+    {
+        [Display(Name = "transaction_id")]
+        public string TransactionId { get; set; }
+
+        [Display(Name = "out_trade_no")]
+        public string OutTradeNo { get; set; }
+    }
+
+    public class WeChatPayCloseOrderViewModel
+    {
+        [Required]
+        [Display(Name = "out_trade_no")]
+        public string OutTradeNo { get; set; }
+    }
+
+    public class WeChatPayRefundViewModel
+    {
+        [Required]
+        [Display(Name = "out_refund_no")]
+        public string OutRefundNo { get; set; }
+
+        [Display(Name = "transaction_id")]
+        public string TransactionId { get; set; }
+
+        [Display(Name = "out_trade_no")]
+        public string OutTradeNo { get; set; }
+
+        [Required]
+        [Display(Name = "total_fee")]
+        public int TotalFee { get; set; }
+
+        [Required]
+        [Display(Name = "refund_fee")]
+        public int RefundFee { get; set; }
+
+        [Display(Name = "refund_desc")]
+        public string RefundDesc { get; set; }
+
+        [Display(Name = "notify_url")]
+        public string NotifyUrl { get; set; }
+    }
+
+    public class WeChatPayRefundQueryViewModel
+    {
+        [Display(Name = "refund_id")]
+        public string RefundId { get; set; }
+
+        [Display(Name = "out_refund_no")]
+        public string OutRefundNo { get; set; }
+
+        [Display(Name = "transaction_id")]
+        public string TransactionId { get; set; }
+
+        [Display(Name = "out_trade_no")]
+        public string OutTradeNo { get; set; }
+    }
+
+    public class WeChatPayDownloadBillViewModel
+    {
+        [Required]
+        [Display(Name = "bill_date")]
+        public string BillDate { get; set; }
+
+        [Required]
+        [Display(Name = "bill_type")]
+        public string BillType { get; set; }
+
+        [Display(Name = "tar_type")]
+        public string TarType { get; set; }
+    }
+
+    public class WeChatPayDownloadFundFlowViewModel
+    {
+        [Required]
+        [Display(Name = "bill_date")]
+        public string BillDate { get; set; }
+
+        [Required]
+        [Display(Name = "account_type")]
+        public string AccountType { get; set; }
+
+        [Display(Name = "tar_type")]
+        public string TarType { get; set; }
+    }
+
+    public class WeChatPayTransfersViewModel
+    {
+        [Required]
+        [Display(Name = "partner_trade_no")]
+        public string PartnerTradeNo { get; set; }
+
+        [Required]
+        [Display(Name = "openid")]
+        public string OpenId { get; set; }
+
+        [Required]
+        [Display(Name = "check_name")]
+        public string CheckName { get; set; }
+
+        [Display(Name = "re_user_name")]
+        public string ReUserName { get; set; }
+
+        [Required]
+        [Display(Name = "amount")]
+        public int Amount { get; set; }
+
+        [Required]
+        [Display(Name = "desc")]
+        public string Desc { get; set; }
+
+        [Required]
+        [Display(Name = "spbill_create_ip")]
+        public string SpBillCreateIp { get; set; }
+    }
+
+    public class WeChatPayGetTransferInfoViewModel
+    {
+        [Required]
+        [Display(Name = "partner_trade_no")]
+        public string PartnerTradeNo { get; set; }
+    }
+
+    public class WeChatPayPayBankViewModel
+    {
+        [Required]
+        [Display(Name = "partner_trade_no")]
+        public string PartnerTradeNo { get; set; }
+
+        [Required]
+        [Display(Name = "enc_bank_no")]
+        public string EncBankNo { get; set; }
+
+        [Required]
+        [Display(Name = "enc_true_name")]
+        public string EncTrueName { get; set; }
+
+        [Required]
+        [Display(Name = "bank_code")]
+        public string BankCode { get; set; }
+
+        [Required]
+        [Display(Name = "amount")]
+        public int Amount { get; set; }
+
+        [Display(Name = "desc")]
+        public string Desc { get; set; }
+    }
+
+    public class WeChatPayQueryBankViewModel
+    {
+        [Required]
+        [Display(Name = "partner_trade_no")]
+        public string PartnerTradeNo { get; set; }
+    }
+}

+ 21 - 0
samples/WebApplicationSample_V3_0/Program.cs

@@ -0,0 +1,21 @@
+using Microsoft.AspNetCore.Hosting;
+using Microsoft.Extensions.Hosting;
+
+namespace WebApplicationSample_V3_0
+{
+    public class Program
+    {
+        public static void Main(string[] args)
+        {
+            CreateHostBuilder(args).Build().Run();
+        }
+
+        public static IHostBuilder CreateHostBuilder(string[] args) =>
+            Host.CreateDefaultBuilder(args)
+                .ConfigureWebHostDefaults(webBuilder =>
+                {
+                    webBuilder.UseUrls("http://*:5000");
+                    webBuilder.UseStartup<Startup>();
+                });
+    }
+}

+ 27 - 0
samples/WebApplicationSample_V3_0/Properties/launchSettings.json

@@ -0,0 +1,27 @@
+{
+  "iisSettings": {
+    "windowsAuthentication": false,
+    "anonymousAuthentication": true,
+    "iisExpress": {
+      "applicationUrl": "http://localhost:5000/",
+      "sslPort": 0
+    }
+  },
+  "profiles": {
+    "IIS Express": {
+      "commandName": "IISExpress",
+      "launchBrowser": true,
+      "environmentVariables": {
+        "ASPNETCORE_ENVIRONMENT": "Development"
+      }
+    },
+    "WebApplicationSample_V3_0": {
+      "commandName": "Project",
+      "launchBrowser": true,
+      "environmentVariables": {
+        "ASPNETCORE_ENVIRONMENT": "Development"
+      },
+      "applicationUrl": "http://localhost:5000/"
+    }
+  }
+}

+ 74 - 0
samples/WebApplicationSample_V3_0/Startup.cs

@@ -0,0 +1,74 @@
+using Essensoft.AspNetCore.Payment.Alipay;
+using Essensoft.AspNetCore.Payment.JDPay;
+using Essensoft.AspNetCore.Payment.LianLianPay;
+using Essensoft.AspNetCore.Payment.QPay;
+using Essensoft.AspNetCore.Payment.UnionPay;
+using Essensoft.AspNetCore.Payment.WeChatPay;
+using Microsoft.AspNetCore.Builder;
+using Microsoft.AspNetCore.Hosting;
+using Microsoft.Extensions.Configuration;
+using Microsoft.Extensions.DependencyInjection;
+using Microsoft.Extensions.Hosting;
+
+namespace WebApplicationSample_V3_0
+{
+    public class Startup
+    {
+        public Startup(IConfiguration configuration)
+        {
+            Configuration = configuration;
+        }
+
+        public IConfiguration Configuration { get; }
+
+        // This method gets called by the runtime. Use this method to add services to the container.
+        public void ConfigureServices(IServiceCollection services)
+        {
+            // 引入Payment 依赖注入
+            services.AddAlipay();
+            services.AddJDPay();
+            services.AddQPay();
+            services.AddUnionPay();
+            services.AddWeChatPay();
+            services.AddLianLianPay();
+
+            // 在 appsettings.json 中 配置选项
+            services.Configure<AlipayOptions>(Configuration.GetSection("Alipay"));
+            services.Configure<JDPayOptions>(Configuration.GetSection("JDPay"));
+            services.Configure<QPayOptions>(Configuration.GetSection("QPay"));
+            services.Configure<UnionPayOptions>(Configuration.GetSection("UnionPay"));
+            services.Configure<WeChatPayOptions>(Configuration.GetSection("WeChatPay"));
+            services.Configure<LianLianPayOptions>(Configuration.GetSection("LianLianPay"));
+
+            services.AddControllersWithViews();
+        }
+
+        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
+        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
+        {
+            if (env.IsDevelopment())
+            {
+                app.UseDeveloperExceptionPage();
+            }
+            else
+            {
+                app.UseExceptionHandler("/Home/Error");
+                // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
+                app.UseHsts();
+            }
+            app.UseHttpsRedirection();
+            app.UseStaticFiles();
+
+            app.UseRouting();
+
+            app.UseAuthorization();
+
+            app.UseEndpoints(endpoints =>
+            {
+                endpoints.MapControllerRoute(
+                    name: "default",
+                    pattern: "{controller=Home}/{action=Index}/{id?}");
+            });
+        }
+    }
+}

+ 53 - 0
samples/WebApplicationSample_V3_0/Views/Alipay/AppPay.cshtml

@@ -0,0 +1,53 @@
+@model AlipayTradeAppPayViewModel
+@{
+    ViewData["Title"] = "APP支付";
+}
+<nav aria-label="breadcrumb">
+    <ol class="breadcrumb">
+        <li class="breadcrumb-item"><a asp-controller="Alipay" asp-action="Index">支付宝</a></li>
+        <li class="breadcrumb-item active" aria-current="page">@ViewData["Title"]</li>
+    </ol>
+</nav>
+<br />
+<div class="card">
+    <div class="card-body">
+        <form asp-controller="Alipay" asp-action="AppPay">
+            <div asp-validation-summary="All" class="text-danger"></div>
+            <div class="form-group">
+                <label asp-for="OutTradeNo"></label>
+                <input type="text" class="form-control" asp-for="OutTradeNo" value="@DateTime.Now.ToString("yyyyMMddHHmmssfff")" />
+            </div>
+            <div class="form-group">
+                <label asp-for="Subject"></label>
+                <input type="text" class="form-control" asp-for="Subject" value="APP支付测试" />
+            </div>
+            <div class="form-group">
+                <label asp-for="Body"></label>
+                <input type="text" class="form-control" asp-for="Body" value="APP支付描述信息" />
+            </div>
+            <div class="form-group">
+                <label asp-for="ProductCode"></label>
+                <input type="text" class="form-control" asp-for="ProductCode" />
+            </div>
+            <div class="form-group">
+                <label asp-for="TotalAmount"></label>
+                <input type="text" class="form-control" asp-for="TotalAmount" value="0.01" />
+            </div>
+            <div class="form-group">
+                <label asp-for="NotifyUrl"></label>
+                <input type="text" class="form-control" asp-for="NotifyUrl" value="http://*/notify/alipay/apppay" />
+            </div>
+            <button type="submit" class="btn btn-primary">提交请求</button>
+        </form>
+        <hr />
+        <form class="form-horizontal">
+            <div class="form-group">
+                <label>Response:</label>
+                <textarea class="form-control" rows="10">@ViewData["response"]</textarea>
+            </div>
+        </form>
+    </div>
+</div>
+@section Scripts {
+    @{await Html.RenderPartialAsync("_ValidationScriptsPartial"); }
+}

+ 37 - 0
samples/WebApplicationSample_V3_0/Views/Alipay/BillDownloadurlQuery.cshtml

@@ -0,0 +1,37 @@
+@model AlipayBillDownloadurlQueryViewModel
+@{
+    ViewData["Title"] = "查询对账单下载地址";
+}
+<nav aria-label="breadcrumb">
+    <ol class="breadcrumb">
+        <li class="breadcrumb-item"><a asp-controller="Alipay" asp-action="Index">支付宝</a></li>
+        <li class="breadcrumb-item active" aria-current="page">@ViewData["Title"]</li>
+    </ol>
+</nav>
+<br />
+<div class="card">
+    <div class="card-body">
+        <form asp-controller="Alipay" asp-action="BillDownloadurlQuery">
+            <div asp-validation-summary="All" class="text-danger"></div>
+            <div class="form-group">
+                <label asp-for="BillDate"></label>
+                <input type="text" class="form-control" asp-for="BillDate" />
+            </div>
+            <div class="form-group">
+                <label asp-for="BillType"></label>
+                <input type="text" class="form-control" asp-for="BillType" />
+            </div>
+            <button type="submit" class="btn btn-primary">提交请求</button>
+        </form>
+        <hr />
+        <form class="form-horizontal">
+            <div class="form-group">
+                <label>Response:</label>
+                <textarea class="form-control" rows="10">@ViewData["response"]</textarea>
+            </div>
+        </form>
+    </div>
+</div>
+@section Scripts {
+    @{await Html.RenderPartialAsync("_ValidationScriptsPartial"); }
+}

+ 87 - 0
samples/WebApplicationSample_V3_0/Views/Alipay/Index.cshtml

@@ -0,0 +1,87 @@
+@{
+    ViewData["Title"] = "支付宝";
+}
+<nav aria-label="breadcrumb">
+    <ol class="breadcrumb">
+        <li class="breadcrumb-item"><a asp-controller="Home" asp-action="Index">首页</a></li>
+        <li class="breadcrumb-item active" aria-current="page">@ViewData["Title"]</li>
+    </ol>
+</nav>
+<br />
+<table class="table table-bordered table-hover">
+    <thead>
+        <tr>
+            <th scope="col">#</th>
+            <th scope="col">产品</th>
+            <th scope="col">接口</th>
+            <th scope="col">#</th>
+        </tr>
+    </thead>
+    <tbody>
+        <tr>
+            <th scope="row">1</th>
+            <td>当面付-扫码支付</td>
+            <td><a href="https://docs.open.alipay.com/api_1/alipay.trade.precreate" target="_blank">alipay.trade.precreate</a></td>
+            <td><a asp-controller="Alipay" asp-action="PreCreate">立即测试</a></td>
+        </tr>
+        <tr>
+            <th scope="row">2</th>
+            <td>当面付-二维码/条码/声波支付</td>
+            <td><a href="https://docs.open.alipay.com/api_1/alipay.trade.pay" target="_blank">alipay.trade.pay</a></td>
+            <td><a asp-controller="Alipay" asp-action="Pay">立即测试</a></td>
+        </tr>
+        <tr>
+            <th scope="row">3</th>
+            <td>App支付</td>
+            <td><a href="https://docs.open.alipay.com/api_1/alipay.trade.app.pay" target="_blank">alipay.trade.app.pay</a></td>
+            <td><a asp-controller="Alipay" asp-action="AppPay">立即测试</a></td>
+        </tr>
+        <tr>
+            <th scope="row">4</th>
+            <td>手机网站支付</td>
+            <td><a href="https://docs.open.alipay.com/api_1/alipay.trade.wap.pay" target="_blank">alipay.trade.wap.pay</a></td>
+            <td><a asp-controller="Alipay" asp-action="WapPay">立即测试</a></td>
+        </tr>
+        <tr>
+            <th scope="row">5</th>
+            <td>电脑网站支付</td>
+            <td><a href="https://docs.open.alipay.com/270/alipay.trade.page.pay" target="_blank">alipay.trade.page.pay</a></td>
+            <td><a asp-controller="Alipay" asp-action="PagePay">立即测试</a></td>
+        </tr>
+        <tr>
+            <th scope="row">6</th>
+            <td>交易查询</td>
+            <td><a href="https://docs.open.alipay.com/api_1/alipay.trade.query" target="_blank">alipay.trade.query</a></td>
+            <td><a asp-controller="Alipay" asp-action="Query">立即测试</a></td>
+        </tr>
+        <tr>
+            <th scope="row">7</th>
+            <td>交易退款</td>
+            <td><a href="https://docs.open.alipay.com/api_1/alipay.trade.refund" target="_blank">alipay.trade.refund</a></td>
+            <td><a asp-controller="Alipay" asp-action="Refund">立即测试</a></td>
+        </tr>
+        <tr>
+            <th scope="row">8</th>
+            <td>退款查询</td>
+            <td><a href="https://docs.open.alipay.com/api_1/alipay.trade.fastpay.refund.query" target="_blank">alipay.trade.fastpay.refund.query</a></td>
+            <td><a asp-controller="Alipay" asp-action="RefundQuery">立即测试</a></td>
+        </tr>
+        <tr>
+            <th scope="row">9</th>
+            <td>单笔转账到支付宝账户</td>
+            <td><a href="https://docs.open.alipay.com/api_28/alipay.fund.trans.toaccount.transfer" target="_blank">alipay.fund.trans.toaccount.transfer</a></td>
+            <td><a asp-controller="Alipay" asp-action="Transfer">立即测试</a></td>
+        </tr>
+        <tr>
+            <th scope="row">10</th>
+            <td>查询转账订单</td>
+            <td><a href="https://docs.open.alipay.com/api_28/alipay.fund.trans.order.query" target="_blank">alipay.fund.trans.order.query</a></td>
+            <td><a asp-controller="Alipay" asp-action="TransQuery">立即测试</a></td>
+        </tr>
+        <tr>
+            <th scope="row">11</th>
+            <td>查询对账单下载地址</td>
+            <td><a href="https://docs.open.alipay.com/api_15/alipay.data.dataservice.bill.downloadurl.query" target="_blank">alipay.data.dataservice.bill.downloadurl.query</a></td>
+            <td><a asp-controller="Alipay" asp-action="BillDownloadurlQuery">立即测试</a></td>
+        </tr>
+</table>

+ 50 - 0
samples/WebApplicationSample_V3_0/Views/Alipay/PagePay.cshtml

@@ -0,0 +1,50 @@
+@model AlipayTradePagePayViewModel
+@{
+    ViewData["Title"] = "电脑网站支付";
+}
+<nav aria-label="breadcrumb">
+    <ol class="breadcrumb">
+        <li class="breadcrumb-item"><a asp-controller="Alipay" asp-action="Index">支付宝</a></li>
+        <li class="breadcrumb-item active" aria-current="page">@ViewData["Title"]</li>
+    </ol>
+</nav>
+<br />
+<div class="card">
+    <div class="card-body">
+        <form asp-controller="Alipay" asp-action="PagePay" target="_blank">
+            <div asp-validation-summary="All" class="text-danger"></div>
+            <div class="form-group">
+                <label asp-for="OutTradeNo"></label>
+                <input type="text" class="form-control" asp-for="OutTradeNo" value="@DateTime.Now.ToString("yyyyMMddHHmmssfff")" />
+            </div>
+            <div class="form-group">
+                <label asp-for="Subject"></label>
+                <input type="text" class="form-control" asp-for="Subject" value="电脑网站支付测试" />
+            </div>
+            <div class="form-group">
+                <label asp-for="ProductCode"></label>
+                <input type="text" class="form-control" asp-for="ProductCode" value="FAST_INSTANT_TRADE_PAY" />
+            </div>
+            <div class="form-group">
+                <label asp-for="Body"></label>
+                <input type="text" class="form-control" asp-for="Body" value="电脑网站支付描述信息" />
+            </div>
+            <div class="form-group">
+                <label asp-for="TotalAmount"></label>
+                <input type="text" class="form-control" asp-for="TotalAmount" value="0.01" />
+            </div>
+            <div class="form-group">
+                <label asp-for="ReturnUrl"></label>
+                <input type="text" class="form-control" asp-for="ReturnUrl" value="http://*/alipay/pagepayreturn" />
+            </div>
+            <div class="form-group">
+                <label asp-for="NotifyUrl"></label>
+                <input type="text" class="form-control" asp-for="NotifyUrl" value="http://*/notify/alipay/pagepay" />
+            </div>
+            <button type="submit" class="btn btn-primary">提交请求</button>
+        </form>
+    </div>
+</div>
+@section Scripts {
+    @{await Html.RenderPartialAsync("_ValidationScriptsPartial"); }
+}

+ 15 - 0
samples/WebApplicationSample_V3_0/Views/Alipay/PagePayReturn.cshtml

@@ -0,0 +1,15 @@
+@{
+    ViewData["Title"] = "电脑网站支付-同步跳转";
+}
+<nav aria-label="breadcrumb">
+    <ol class="breadcrumb">
+        <li class="breadcrumb-item"><a asp-controller="Alipay" asp-action="Index">支付宝</a></li>
+        <li class="breadcrumb-item active" aria-current="page">@ViewData["Title"]</li>
+    </ol>
+</nav>
+<br />
+<div class="card">
+    <div class="card-body">
+        @ViewData["response"]
+    </div>
+</div>

+ 53 - 0
samples/WebApplicationSample_V3_0/Views/Alipay/Pay.cshtml

@@ -0,0 +1,53 @@
+@model AlipayTradePayViewModel
+@{
+    ViewData["Title"] = "当面付-二维码/条码/声波支付";
+}
+<nav aria-label="breadcrumb">
+    <ol class="breadcrumb">
+        <li class="breadcrumb-item"><a asp-controller="Alipay" asp-action="Index">支付宝</a></li>
+        <li class="breadcrumb-item active" aria-current="page">@ViewData["Title"]</li>
+    </ol>
+</nav>
+<br />
+<div class="card">
+    <div class="card-body">
+        <form asp-controller="Alipay" asp-action="Pay">
+            <div asp-validation-summary="All" class="text-danger"></div>
+            <div class="form-group">
+                <label asp-for="OutTradeNo"></label>
+                <input type="text" class="form-control" asp-for="OutTradeNo" value="@DateTime.Now.ToString("yyyyMMddHHmmssfff")" />
+            </div>
+            <div class="form-group">
+                <label asp-for="Subject"></label>
+                <input type="text" class="form-control" asp-for="Subject" value="二维码/条码/声波支付测试" />
+            </div>
+            <div class="form-group">
+                <label asp-for="Scene"></label>
+                <input type="text" class="form-control" asp-for="Scene" value="bar_code" />
+            </div>
+            <div class="form-group">
+                <label asp-for="AuthCode"></label>
+                <input type="text" class="form-control" asp-for="AuthCode" />
+            </div>
+            <div class="form-group">
+                <label asp-for="Body"></label>
+                <input type="text" class="form-control" asp-for="Body" value="二维码/条码/声波支付描述信息" />
+            </div>
+            <div class="form-group">
+                <label asp-for="TotalAmount"></label>
+                <input type="text" class="form-control" asp-for="TotalAmount" value="0.01" />
+            </div>
+            <button type="submit" class="btn btn-primary">提交请求</button>
+        </form>
+        <hr />
+        <form class="form-horizontal">
+            <div class="form-group">
+                <label>Response:</label>
+                <textarea class="form-control" rows="10">@ViewData["response"]</textarea>
+            </div>
+        </form>
+    </div>
+</div>
+@section Scripts {
+    @{await Html.RenderPartialAsync("_ValidationScriptsPartial"); }
+}

+ 56 - 0
samples/WebApplicationSample_V3_0/Views/Alipay/PreCreate.cshtml

@@ -0,0 +1,56 @@
+@model AlipayTradePreCreateViewModel
+@{
+    ViewData["Title"] = "当面付-扫码支付";
+}
+<nav aria-label="breadcrumb">
+    <ol class="breadcrumb">
+        <li class="breadcrumb-item"><a asp-controller="Alipay" asp-action="Index">支付宝</a></li>
+        <li class="breadcrumb-item active" aria-current="page">@ViewData["Title"]</li>
+    </ol>
+</nav>
+<br />
+<div class="card">
+    <div class="card-body">
+        <form asp-controller="Alipay" asp-action="PreCreate">
+            <div asp-validation-summary="All" class="text-danger"></div>
+            <div class="form-group">
+                <label asp-for="OutTradeNo"></label>
+                <input type="text" class="form-control" asp-for="OutTradeNo" value="@DateTime.Now.ToString("yyyyMMddHHmmssfff")" />
+            </div>
+            <div class="form-group">
+                <label asp-for="Subject"></label>
+                <input type="text" class="form-control" asp-for="Subject" value="扫码支付测试" />
+            </div>
+            <div class="form-group">
+                <label asp-for="Body"></label>
+                <input type="text" class="form-control" asp-for="Body" value="扫码支付描述信息" />
+            </div>
+            <div class="form-group">
+                <label asp-for="TotalAmount"></label>
+                <input type="text" class="form-control" asp-for="TotalAmount" value="0.01" />
+            </div>
+            <div class="form-group">
+                <label asp-for="NotifyUrl"></label>
+                <input type="text" class="form-control" asp-for="NotifyUrl" value="http://*/notify/alipay/precreate" />
+            </div>
+            <button type="submit" class="btn btn-primary">提交请求</button>
+        </form>
+        <hr />
+        <form class="form-horizontal">
+            <div class="form-group">
+                <label>QrCode:</label>
+                @if (!string.IsNullOrEmpty(ViewData["qrcode"] as string))
+                {
+                    <embed src="../Home/QrCode?size=168&data=@ViewData["qrcode"]" width="168" height="168" type="image/svg+xml" />
+                }
+            </div>
+            <div class="form-group">
+                <label>Response:</label>
+                <textarea class="form-control" rows="10">@ViewData["response"]</textarea>
+            </div>
+        </form>
+    </div>
+</div>
+@section Scripts {
+    @{await Html.RenderPartialAsync("_ValidationScriptsPartial"); }
+}

+ 37 - 0
samples/WebApplicationSample_V3_0/Views/Alipay/Query.cshtml

@@ -0,0 +1,37 @@
+@model AlipayTradeQueryViewModel
+@{
+    ViewData["Title"] = "交易查询";
+}
+<nav aria-label="breadcrumb">
+    <ol class="breadcrumb">
+        <li class="breadcrumb-item"><a asp-controller="Alipay" asp-action="Index">支付宝</a></li>
+        <li class="breadcrumb-item active" aria-current="page">@ViewData["Title"]</li>
+    </ol>
+</nav>
+<br />
+<div class="card">
+    <div class="card-body">
+        <form asp-controller="Alipay" asp-action="Query">
+            <div asp-validation-summary="All" class="text-danger"></div>
+            <div class="form-group">
+                <label asp-for="OutTradeNo"></label>
+                <input type="text" class="form-control" asp-for="OutTradeNo" />
+            </div>
+            <div class="form-group">
+                <label asp-for="TradeNo"></label>
+                <input type="text" class="form-control" asp-for="TradeNo" />
+            </div>
+            <button type="submit" class="btn btn-primary">提交请求</button>
+        </form>
+        <hr />
+        <form class="form-horizontal">
+            <div class="form-group">
+                <label>Response:</label>
+                <textarea class="form-control" rows="10">@ViewData["response"]</textarea>
+            </div>
+        </form>
+    </div>
+</div>
+@section Scripts {
+    @{await Html.RenderPartialAsync("_ValidationScriptsPartial"); }
+}

+ 49 - 0
samples/WebApplicationSample_V3_0/Views/Alipay/Refund.cshtml

@@ -0,0 +1,49 @@
+@model AlipayTradeRefundViewModel
+@{
+    ViewData["Title"] = "交易退款";
+}
+<nav aria-label="breadcrumb">
+    <ol class="breadcrumb">
+        <li class="breadcrumb-item"><a asp-controller="Alipay" asp-action="Index">支付宝</a></li>
+        <li class="breadcrumb-item active" aria-current="page">@ViewData["Title"]</li>
+    </ol>
+</nav>
+<br />
+<div class="card">
+    <div class="card-body">
+        <form asp-controller="Alipay" asp-action="Refund">
+            <div asp-validation-summary="All" class="text-danger"></div>
+            <div class="form-group">
+                <label asp-for="OutRequestNo"></label>
+                <input type="text" class="form-control" asp-for="OutRequestNo" value="@DateTime.Now.ToString("yyyyMMddHHmmssfff")" />
+            </div>
+            <div class="form-group">
+                <label asp-for="OutTradeNo"></label>
+                <input type="text" class="form-control" asp-for="OutTradeNo" />
+            </div>
+            <div class="form-group">
+                <label asp-for="TradeNo"></label>
+                <input type="text" class="form-control" asp-for="TradeNo" />
+            </div>
+            <div class="form-group">
+                <label asp-for="RefundAmount"></label>
+                <input type="text" class="form-control" asp-for="RefundAmount" />
+            </div>
+            <div class="form-group">
+                <label asp-for="RefundReason"></label>
+                <input type="text" class="form-control" asp-for="RefundReason" />
+            </div>
+            <button type="submit" class="btn btn-primary">提交请求</button>
+        </form>
+        <hr />
+        <form class="form-horizontal">
+            <div class="form-group">
+                <label>Response:</label>
+                <textarea class="form-control" rows="10">@ViewData["response"]</textarea>
+            </div>
+        </form>
+    </div>
+</div>
+@section Scripts {
+    @{await Html.RenderPartialAsync("_ValidationScriptsPartial"); }
+}

+ 41 - 0
samples/WebApplicationSample_V3_0/Views/Alipay/RefundQuery.cshtml

@@ -0,0 +1,41 @@
+@model AlipayTradeRefundQueryViewModel
+@{
+    ViewData["Title"] = "退款查询";
+}
+<nav aria-label="breadcrumb">
+    <ol class="breadcrumb">
+        <li class="breadcrumb-item"><a asp-controller="Alipay" asp-action="Index">支付宝</a></li>
+        <li class="breadcrumb-item active" aria-current="page">@ViewData["Title"]</li>
+    </ol>
+</nav>
+<br />
+<div class="card">
+    <div class="card-body">
+        <form asp-controller="Alipay" asp-action="RefundQuery">
+            <div asp-validation-summary="All" class="text-danger"></div>
+            <div class="form-group">
+                <label asp-for="OutRequestNo"></label>
+                <input type="text" class="form-control" asp-for="OutRequestNo" />
+            </div>
+            <div class="form-group">
+                <label asp-for="OutTradeNo"></label>
+                <input type="text" class="form-control" asp-for="OutTradeNo" />
+            </div>
+            <div class="form-group">
+                <label asp-for="TradeNo"></label>
+                <input type="text" class="form-control" asp-for="TradeNo" />
+            </div>
+            <button type="submit" class="btn btn-primary">提交请求</button>
+        </form>
+        <hr />
+        <form class="form-horizontal">
+            <div class="form-group">
+                <label>Response:</label>
+                <textarea class="form-control" rows="10">@ViewData["response"]</textarea>
+            </div>
+        </form>
+    </div>
+</div>
+@section Scripts {
+    @{await Html.RenderPartialAsync("_ValidationScriptsPartial"); }
+}

+ 37 - 0
samples/WebApplicationSample_V3_0/Views/Alipay/TransQuery.cshtml

@@ -0,0 +1,37 @@
+@model AlipayTransQueryViewModel
+@{
+    ViewData["Title"] = "查询转账订单";
+}
+<nav aria-label="breadcrumb">
+    <ol class="breadcrumb">
+        <li class="breadcrumb-item"><a asp-controller="Alipay" asp-action="Index">支付宝</a></li>
+        <li class="breadcrumb-item active" aria-current="page">@ViewData["Title"]</li>
+    </ol>
+</nav>
+<br />
+<div class="card">
+    <div class="card-body">
+        <form asp-controller="Alipay" asp-action="TransQuery">
+            <div asp-validation-summary="All" class="text-danger"></div>
+            <div class="form-group">
+                <label asp-for="OutBizNo"></label>
+                <input type="text" class="form-control" asp-for="OutBizNo" />
+            </div>
+            <div class="form-group">
+                <label asp-for="OrderId"></label>
+                <input type="text" class="form-control" asp-for="OrderId" />
+            </div>
+            <button type="submit" class="btn btn-primary">提交请求</button>
+        </form>
+        <hr />
+        <form class="form-horizontal">
+            <div class="form-group">
+                <label>Response:</label>
+                <textarea class="form-control" rows="10">@ViewData["response"]</textarea>
+            </div>
+        </form>
+    </div>
+</div>
+@section Scripts {
+    @{await Html.RenderPartialAsync("_ValidationScriptsPartial"); }
+}

+ 49 - 0
samples/WebApplicationSample_V3_0/Views/Alipay/Transfer.cshtml

@@ -0,0 +1,49 @@
+@model AlipayTransferViewModel
+@{
+    ViewData["Title"] = "单笔转账到支付宝账户";
+}
+<nav aria-label="breadcrumb">
+    <ol class="breadcrumb">
+        <li class="breadcrumb-item"><a asp-controller="Alipay" asp-action="Index">支付宝</a></li>
+        <li class="breadcrumb-item active" aria-current="page">@ViewData["Title"]</li>
+    </ol>
+</nav>
+<br />
+<div class="card">
+    <div class="card-body">
+        <form asp-controller="Alipay" asp-action="Transfer">
+            <div asp-validation-summary="All" class="text-danger"></div>
+            <div class="form-group">
+                <label asp-for="OutBizNo"></label>
+                <input type="text" class="form-control" asp-for="OutBizNo" value="@DateTime.Now.ToString("yyyyMMddHHmmssfff")" />
+            </div>
+            <div class="form-group">
+                <label asp-for="PayeeType"></label>
+                <input type="text" class="form-control" asp-for="PayeeType" value="ALIPAY_LOGONID" />
+            </div>
+            <div class="form-group">
+                <label asp-for="PayeeAccount"></label>
+                <input type="text" class="form-control" asp-for="PayeeAccount" />
+            </div>
+            <div class="form-group">
+                <label asp-for="Amount"></label>
+                <input type="text" class="form-control" asp-for="Amount" value="0.01" />
+            </div>
+            <div class="form-group">
+                <label asp-for="Remark"></label>
+                <input type="text" class="form-control" asp-for="Remark" value="单笔转账到支付宝账户转账备注" />
+            </div>
+            <button type="submit" class="btn btn-primary">提交请求</button>
+        </form>
+        <hr />
+        <form class="form-horizontal">
+            <div class="form-group">
+                <label>Response:</label>
+                <textarea class="form-control" rows="10">@ViewData["response"]</textarea>
+            </div>
+        </form>
+    </div>
+</div>
+@section Scripts {
+    @{await Html.RenderPartialAsync("_ValidationScriptsPartial"); }
+}

+ 50 - 0
samples/WebApplicationSample_V3_0/Views/Alipay/WapPay.cshtml

@@ -0,0 +1,50 @@
+@model AlipayTradeWapPayViewModel
+@{
+    ViewData["Title"] = "手机网站支付";
+}
+<nav aria-label="breadcrumb">
+    <ol class="breadcrumb">
+        <li class="breadcrumb-item"><a asp-controller="Alipay" asp-action="Index">支付宝</a></li>
+        <li class="breadcrumb-item active" aria-current="page">@ViewData["Title"]</li>
+    </ol>
+</nav>
+<br />
+<div class="card">
+    <div class="card-body">
+        <form asp-controller="Alipay" asp-action="WapPay" target="_blank">
+            <div asp-validation-summary="All" class="text-danger"></div>
+            <div class="form-group">
+                <label asp-for="OutTradeNo"></label>
+                <input type="text" class="form-control" asp-for="OutTradeNo" value="@DateTime.Now.ToString("yyyyMMddHHmmssfff")" />
+            </div>
+            <div class="form-group">
+                <label asp-for="Subject"></label>
+                <input type="text" class="form-control" asp-for="Subject" value="手机网站支付测试" />
+            </div>
+            <div class="form-group">
+                <label asp-for="ProductCode"></label>
+                <input type="text" class="form-control" asp-for="ProductCode" value="QUICK_WAP_WAY" />
+            </div>
+            <div class="form-group">
+                <label asp-for="Body"></label>
+                <input type="text" class="form-control" asp-for="Body" value="手机网站支付描述信息" />
+            </div>
+            <div class="form-group">
+                <label asp-for="TotalAmount"></label>
+                <input type="text" class="form-control" asp-for="TotalAmount" value="0.01" />
+            </div>
+            <div class="form-group">
+                <label asp-for="ReturnUrl"></label>
+                <input type="text" class="form-control" asp-for="ReturnUrl" value="http://*/alipay/wappayreturn" />
+            </div>
+            <div class="form-group">
+                <label asp-for="NotifyUrl"></label>
+                <input type="text" class="form-control" asp-for="NotifyUrl" value="http://*/notify/alipay/wappay" />
+            </div>
+            <button type="submit" class="btn btn-primary">提交请求</button>
+        </form>
+    </div>
+</div>
+@section Scripts {
+    @{await Html.RenderPartialAsync("_ValidationScriptsPartial"); }
+}

+ 15 - 0
samples/WebApplicationSample_V3_0/Views/Alipay/WapPayReturn.cshtml

@@ -0,0 +1,15 @@
+@{
+    ViewData["Title"] = "手机网站支付-同步跳转";
+}
+<nav aria-label="breadcrumb">
+    <ol class="breadcrumb">
+        <li class="breadcrumb-item"><a asp-controller="Alipay" asp-action="Index">支付宝</a></li>
+        <li class="breadcrumb-item active" aria-current="page">@ViewData["Title"]</li>
+    </ol>
+</nav>
+<br />
+<div class="card">
+    <div class="card-body">
+        @ViewData["response"]
+    </div>
+</div>

+ 9 - 0
samples/WebApplicationSample_V3_0/Views/Home/Gratuity.cshtml

@@ -0,0 +1,9 @@
+
+@{
+    ViewData["Title"] = "打赏";
+}
+<div align="center">
+    <img src="~/images/qrcode.png">
+    <hr />
+    <p>感谢你对本项目的支持!!!</p>
+</div>

+ 83 - 0
samples/WebApplicationSample_V3_0/Views/Home/Index.cshtml

@@ -0,0 +1,83 @@
+@{
+    ViewData["Title"] = "前言";
+}
+<p>
+    Payment 基于 .NET Core / ASP.NET Core 开发,支持多商户的跨平台支付SDK集。 简化了API调用及相关通知的处理流程。
+</p>
+<p class="text-danger">
+    注: 本Demo仅作为测试用途,基本涵盖了常用的API。用作实际业务时,请务必配合相关API文档及说明处理。
+</p>
+<br />
+<h5>NuGet 程序包:</h5>
+<table class="table table-bordered table-hover">
+    <thead>
+        <tr>
+            <th scope="col">#</th>
+            <th scope="col">Name</th>
+            <th scope="col">Package</th>
+            <th scope="col">NuGet</th>
+        </tr>
+    </thead>
+    <tbody>
+        <tr>
+            <th scope="row">1</th>
+            <td><a asp-controller="Alipay" asp-action="Index">支付宝</a></td>
+            <td><a href="https://www.nuget.org/packages/Essensoft.AspNetCore.Payment.Alipay" target="_blank">Essensoft.AspNetCore.Payment.Alipay</a></td>
+            <td>
+                <a href="https://www.nuget.org/packages/Essensoft.AspNetCore.Payment.Alipay" target="_blank">
+                    <img src="https://img.shields.io/nuget/v/Essensoft.AspNetCore.Payment.Alipay.svg?style=flat-square" />
+                </a>
+            </td>
+        </tr>
+        <tr>
+            <th scope="row">2</th>
+            <td><a asp-controller="WeChatPay" asp-action="Index">微信支付</a></td>
+            <td><a href="https://www.nuget.org/packages/Essensoft.AspNetCore.Payment.WeChatPay" target="_blank">Essensoft.AspNetCore.Payment.WeChatPay</a></td>
+            <td>
+                <a href="https://www.nuget.org/packages/Essensoft.AspNetCore.Payment.WeChatPay" target="_blank">
+                    <img src="https://img.shields.io/nuget/v/Essensoft.AspNetCore.Payment.WeChatPay.svg?style=flat-square" />
+                </a>
+            </td>
+        </tr>
+        <tr>
+            <th scope="row">3</th>
+            <td><a asp-controller="QPay" asp-action="Index">QQ钱包</a></td>
+            <td><a href="https://www.nuget.org/packages/Essensoft.AspNetCore.Payment.QPay" target="_blank">Essensoft.AspNetCore.Payment.QPay</a></td>
+            <td>
+                <a href="https://www.nuget.org/packages/Essensoft.AspNetCore.Payment.QPay" target="_blank">
+                    <img src="https://img.shields.io/nuget/v/Essensoft.AspNetCore.Payment.QPay.svg?style=flat-square" />
+                </a>
+            </td>
+        </tr>
+        <tr>
+            <th scope="row">4</th>
+            <td><a asp-controller="JDPay" asp-action="Index">京东支付</a></td>
+            <td><a href="https://www.nuget.org/packages/Essensoft.AspNetCore.Payment.JDPay" target="_blank">Essensoft.AspNetCore.Payment.JDPay</a></td>
+            <td>
+                <a href="https://www.nuget.org/packages/Essensoft.AspNetCore.Payment.JDPay" target="_blank">
+                    <img src="https://img.shields.io/nuget/v/Essensoft.AspNetCore.Payment.JDPay.svg?style=flat-square" />
+                </a>
+            </td>
+        </tr>
+        <tr>
+            <th scope="row">5</th>
+            <td><a asp-controller="LianLianPay" asp-action="Index">连连支付</a></td>
+            <td><a href="https://www.nuget.org/packages/Essensoft.AspNetCore.Payment.LianLianPay" target="_blank">Essensoft.AspNetCore.Payment.LianLianPay</a></td>
+            <td>
+                <a href="https://www.nuget.org/packages/Essensoft.AspNetCore.Payment.LianLianPay" target="_blank">
+                    <img src="https://img.shields.io/nuget/v/Essensoft.AspNetCore.Payment.LianLianPay.svg?style=flat-square" />
+                </a>
+            </td>
+        </tr>
+        <tr>
+            <th scope="row">6</th>
+            <td><a asp-controller="UnionPay" asp-action="Index">银联支付</a></td>
+            <td><a href="https://www.nuget.org/packages/Essensoft.AspNetCore.Payment.UnionPay" target="_blank">Essensoft.AspNetCore.Payment.UnionPay</a></td>
+            <td>
+                <a href="https://www.nuget.org/packages/Essensoft.AspNetCore.Payment.UnionPay" target="_blank">
+                    <img src="https://img.shields.io/nuget/v/Essensoft.AspNetCore.Payment.UnionPay.svg?style=flat-square" />
+                </a>
+            </td>
+        </tr>
+    </tbody>
+</table>

+ 113 - 0
samples/WebApplicationSample_V3_0/Views/JDPay/DefrayPay.cshtml

@@ -0,0 +1,113 @@
+@model JDPayDefrayPayViewModel
+@{
+    ViewData["Title"] = "代付交易请求";
+}
+<nav aria-label="breadcrumb">
+    <ol class="breadcrumb">
+        <li class="breadcrumb-item"><a asp-controller="JDPay" asp-action="Index">京东支付</a></li>
+        <li class="breadcrumb-item active" aria-current="page">@ViewData["Title"]</li>
+    </ol>
+</nav>
+<br />
+<div class="card">
+    <div class="card-body">
+        <form asp-controller="JDPay" asp-action="DefrayPay">
+            <div asp-validation-summary="All" class="text-danger"></div>
+            <div class="form-group">
+                <label asp-for="PayeeBankCode"></label>
+                <input type="text" class="form-control" asp-for="PayeeBankCode" value="ABC" />
+            </div>
+            <div class="form-group">
+                <label asp-for="ExtendParams"></label>
+                <input type="text" class="form-control" asp-for="ExtendParams" value="{'ssss':'ssss'}" />
+            </div>
+            <div class="form-group">
+                <label asp-for="PayeeAccountType"></label>
+                <input type="text" class="form-control" asp-for="PayeeAccountType" value="P" />
+            </div>
+            <div class="form-group">
+                <label asp-for="ReturnParams"></label>
+                <input type="text" class="form-control" asp-for="ReturnParams" value="1234ssddffgghhj" />
+            </div>
+            <div class="form-group">
+                <label asp-for="TradeCurrency"></label>
+                <input type="text" class="form-control" asp-for="TradeCurrency" value="CNY" />
+            </div>
+            <div class="form-group">
+                <label asp-for="PayTool"></label>
+                <input type="text" class="form-control" asp-for="PayTool" value="TRAN" />
+            </div>
+            <div class="form-group">
+                <label asp-for="CategoryCode"></label>
+                <input type="text" class="form-control" asp-for="CategoryCode" value="20jd222" />
+            </div>
+            <div class="form-group">
+                <label asp-for="PayeeAccountNo"></label>
+                <input type="text" class="form-control" asp-for="PayeeAccountNo" value="6222600210011817312" />
+            </div>
+            <div class="form-group">
+                <label asp-for="PayeeAccountName"></label>
+                <input type="text" class="form-control" asp-for="PayeeAccountName" value="张米克" />
+            </div>
+            <div class="form-group">
+                <label asp-for="TradeSource"></label>
+                <input type="text" class="form-control" asp-for="TradeSource" value="testetst" />
+            </div>
+            <div class="form-group">
+                <label asp-for="NotifyUrl"></label>
+                <input type="text" class="form-control" asp-for="NotifyUrl" value="http://*/notify/jdpay/defraypay" />
+            </div>
+            <div class="form-group">
+                <label asp-for="BizTradeNo"></label>
+                <input type="text" class="form-control" asp-for="BizTradeNo" value="@DateTime.Now.ToString("yyyyMMddHHmmssfff")" />
+            </div>
+            <div class="form-group">
+                <label asp-for="OutTradeNo"></label>
+                <input type="text" class="form-control" asp-for="OutTradeNo" value="@DateTime.Now.ToString("yyyyMMddHHmmssfff")" />
+            </div>
+            <div class="form-group">
+                <label asp-for="SellerInfo"></label>
+                <input type="text" class="form-control" asp-for="SellerInfo" value="{'customer_code':'360080002191800017','customer_type':'CUSTOMER_NO'}" />
+            </div>
+            <div class="form-group">
+                <label asp-for="OutTradeDate"></label>
+                <input type="text" class="form-control" asp-for="OutTradeDate" value="@DateTime.Now.ToString("yyyyMMddHHmmss")" />
+            </div>
+            <div class="form-group">
+                <label asp-for="TradeAmount"></label>
+                <input type="text" class="form-control" asp-for="TradeAmount" value="1" />
+            </div>
+            <div class="form-group">
+                <label asp-for="PayeeBankFullname"></label>
+                <input type="text" class="form-control" asp-for="PayeeBankFullname" value="农业银行" />
+            </div>
+            <div class="form-group">
+                <label asp-for="RequestDatetime"></label>
+                <input type="text" class="form-control" asp-for="RequestDatetime" value="@DateTime.Now.ToString("yyyyMMddHHmmss")" />
+            </div>
+            <div class="form-group">
+                <label asp-for="TradeSubject"></label>
+                <input type="text" class="form-control" asp-for="TradeSubject" value="test代付" />
+            </div>
+            <div class="form-group">
+                <label asp-for="PayeeCardType"></label>
+                <input type="text" class="form-control" asp-for="PayeeCardType" value="DE" />
+            </div>
+            <div class="form-group">
+                <label asp-for="PayeeMobile"></label>
+                <input type="text" class="form-control" asp-for="PayeeMobile" value="1333333333" />
+            </div>
+            <button type="submit" class="btn btn-primary">提交请求</button>
+        </form>
+        <hr />
+        <form class="form-horizontal">
+            <div class="form-group">
+                <label>Response:</label>
+                <textarea class="form-control" rows="10">@ViewData["response"]</textarea>
+            </div>
+        </form>
+    </div>
+</div>
+@section Scripts {
+    @{await Html.RenderPartialAsync("_ValidationScriptsPartial"); }
+}

+ 70 - 0
samples/WebApplicationSample_V3_0/Views/JDPay/Index.cshtml

@@ -0,0 +1,70 @@
+@{
+    ViewData["Title"] = "京东支付";
+}
+<nav aria-label="breadcrumb">
+    <ol class="breadcrumb">
+        <li class="breadcrumb-item"><a asp-controller="Home" asp-action="Index">首页</a></li>
+        <li class="breadcrumb-item active" aria-current="page">@ViewData["Title"]</li>
+    </ol>
+</nav>
+<br />
+<table class="table table-bordered table-hover">
+    <thead>
+        <tr>
+            <th scope="col">#</th>
+            <th scope="col">产品</th>
+            <th scope="col">接口</th>
+            <th scope="col">#</th>
+        </tr>
+    </thead>
+    <tbody>
+        <tr>
+            <th scope="row">1</th>
+            <td>在线支付接口PC版</td>
+            <td><a href="https://payapi.jd.com/interface/saveOrder.html" target="_blank">https://wepay.jd.com/jdpay/saveOrder</a></td>
+            <td><a asp-controller="JDPay" asp-action="SaveOrderPC">立即测试</a></td>
+        </tr>
+        <tr>
+            <th scope="row">2</th>
+            <td>在线支付接口H5版</td>
+            <td><a href="https://payapi.jd.com/interface/saveOrder.html" target="_blank">https://h5pay.jd.com/jdpay/saveOrder</a></td>
+            <td><a asp-controller="JDPay" asp-action="SaveOrderH5">立即测试</a></td>
+        </tr>
+        <tr>
+            <th scope="row">3</th>
+            <td>扫码支付-统一下单</td>
+            <td><a href="https://payapi.jd.com/interface/uniorder.html" target="_blank">https://paygate.jd.com/service/uniorder</a></td>
+            <td><a asp-controller="JDPay" asp-action="QrCodePay">立即测试</a></td>
+        </tr>
+        <tr>
+            <th scope="row">4</th>
+            <td>交易查询</td>
+            <td><a href="https://payapi.jd.com/interface/query.html" target="_blank">https://paygate.jd.com/service/query</a></td>
+            <td><a asp-controller="JDPay" asp-action="Query">立即测试</a></td>
+        </tr>
+        <tr>
+            <th scope="row">5</th>
+            <td>退款申请</td>
+            <td><a href="https://payapi.jd.com/interface/refund.html" target="_blank">https://paygate.jd.com/service/refund</a></td>
+            <td><a asp-controller="JDPay" asp-action="Refund">立即测试</a></td>
+        </tr>
+        <tr>
+            <th scope="row">6</th>
+            <td>退款查询</td>
+            <td><a href="https://payapi.jd.com/interface/queryRefund.html" target="_blank">https://paygate.jd.com/service/queryRefund</a></td>
+            <td><a asp-controller="JDPay" asp-action="QueryRefund">立即测试</a></td>
+        </tr>
+        <tr>
+            <th scope="row">7</th>
+            <td>代付交易</td>
+            <td>https://mapi.jdpay.com/npp10/defray_pay</td>
+            <td><a asp-controller="JDPay" asp-action="DefrayPay">立即测试</a></td>
+        </tr>
+        <tr>
+            <th scope="row">8</th>
+            <td>代付交易查询</td>
+            <td>https://mapi.jdpay.com/npp10/trade_query</td>
+            <td><a asp-controller="JDPay" asp-action="TradeQuery">立即测试</a></td>
+        </tr>
+    </tbody>
+</table>

+ 69 - 0
samples/WebApplicationSample_V3_0/Views/JDPay/QrCodePay.cshtml

@@ -0,0 +1,69 @@
+@model JDPayUnifiedOrderViewModel
+@{
+    ViewData["Title"] = "扫码支付";
+}
+<nav aria-label="breadcrumb">
+    <ol class="breadcrumb">
+        <li class="breadcrumb-item"><a asp-controller="JDPay" asp-action="Index">京东支付</a></li>
+        <li class="breadcrumb-item active" aria-current="page">@ViewData["Title"]</li>
+    </ol>
+</nav>
+<br />
+<div class="card">
+    <div class="card-body">
+        <form asp-controller="JDPay" asp-action="QrCodePay">
+            <div asp-validation-summary="All" class="text-danger"></div>
+            <div class="form-group">
+                <label asp-for="TradeNum"></label>
+                <input type="text" class="form-control" asp-for="TradeNum" value="@DateTime.Now.ToString("yyyyMMddHHmmssfff")" />
+            </div>
+            <div class="form-group">
+                <label asp-for="TradeName"></label>
+                <input type="text" class="form-control" asp-for="TradeName" value="扫码支付测试" />
+            </div>
+            <div class="form-group">
+                <label asp-for="TradeTime"></label>
+                <input type="text" class="form-control" asp-for="TradeTime" value="@DateTime.Now.ToString("yyyyMMddHHmmss")" />
+            </div>
+            <div class="form-group">
+                <label asp-for="Amount"></label>
+                <input type="text" class="form-control" asp-for="Amount" value="1" />
+            </div>
+            <div class="form-group">
+                <label asp-for="OrderType"></label>
+                <input type="text" class="form-control" asp-for="OrderType" value="1" />
+            </div>
+            <div class="form-group">
+                <label asp-for="Currency"></label>
+                <input type="text" class="form-control" asp-for="Currency" value="CNY" />
+            </div>
+            <div class="form-group">
+                <label asp-for="TradeType"></label>
+                <input type="text" class="form-control" asp-for="TradeType" value="QR" />
+            </div>
+            <div class="form-group">
+                <label asp-for="NotifyUrl"></label>
+                <input type="text" class="form-control" asp-for="NotifyUrl" value="http://*/notify/jdpay/async" />
+            </div>
+            <button type="submit" class="btn btn-primary">提交请求</button>
+        </form>
+        <hr />
+        <form class="form-horizontal">
+            <div class="form-group">
+                <label>QrCode:</label>
+                @if (!string.IsNullOrEmpty(ViewData["qrcode"] as string))
+                {
+                <embed src="../Home/QrCode?size=168&data=@ViewData["qrcode"]" width="168" height="168" type="image/svg+xml" />
+                }
+            </div>
+            <div class="form-group">
+                <label>Response:</label>
+                <textarea class="form-control" rows="10">@ViewData["response"]</textarea>
+            </div>
+        </form>
+    </div>
+</div>
+@section Scripts {
+    @{await Html.RenderPartialAsync("_ValidationScriptsPartial"); }
+}
+

+ 41 - 0
samples/WebApplicationSample_V3_0/Views/JDPay/Query.cshtml

@@ -0,0 +1,41 @@
+@model JDPayQueryViewModel
+@{
+    ViewData["Title"] = "交易查询接口";
+}
+<nav aria-label="breadcrumb">
+    <ol class="breadcrumb">
+        <li class="breadcrumb-item"><a asp-controller="JDPay" asp-action="Index">京东支付</a></li>
+        <li class="breadcrumb-item active" aria-current="page">@ViewData["Title"]</li>
+    </ol>
+</nav>
+<br />
+<div class="card">
+    <div class="card-body">
+        <form asp-controller="JDPay" asp-action="Query">
+            <div asp-validation-summary="All" class="text-danger"></div>
+            <div class="form-group">
+                <label asp-for="TradeNum"></label>
+                <input type="text" class="form-control" asp-for="TradeNum" />
+            </div>
+            <div class="form-group">
+                <label asp-for="OTradeNum"></label>
+                <input type="text" class="form-control" asp-for="OTradeNum" />
+            </div>
+            <div class="form-group">
+                <label asp-for="TradeType"></label>
+                <input type="text" class="form-control" asp-for="TradeType" value="0" />
+            </div>
+            <button type="submit" class="btn btn-primary">提交请求</button>
+        </form>
+        <hr />
+        <form class="form-horizontal">
+            <div class="form-group">
+                <label>Response:</label>
+                <textarea class="form-control" rows="10">@ViewData["response"]</textarea>
+            </div>
+        </form>
+    </div>
+</div>
+@section Scripts {
+    @{await Html.RenderPartialAsync("_ValidationScriptsPartial"); }
+}

+ 41 - 0
samples/WebApplicationSample_V3_0/Views/JDPay/QueryRefund.cshtml

@@ -0,0 +1,41 @@
+@model JDPayQueryRefundViewModel
+@{
+    ViewData["Title"] = "退款查询接口";
+}
+<nav aria-label="breadcrumb">
+    <ol class="breadcrumb">
+        <li class="breadcrumb-item"><a asp-controller="JDPay" asp-action="Index">京东支付</a></li>
+        <li class="breadcrumb-item active" aria-current="page">@ViewData["Title"]</li>
+    </ol>
+</nav>
+<br />
+<div class="card">
+    <div class="card-body">
+        <form asp-controller="JDPay" asp-action="QueryRefund">
+            <div asp-validation-summary="All" class="text-danger"></div>
+            <div class="form-group">
+                <label asp-for="TradeNum"></label>
+                <input type="text" class="form-control" asp-for="TradeNum" />
+            </div>
+            <div class="form-group">
+                <label asp-for="OTradeNum"></label>
+                <input type="text" class="form-control" asp-for="OTradeNum" />
+            </div>
+            <div class="form-group">
+                <label asp-for="TradeType"></label>
+                <input type="text" class="form-control" asp-for="TradeType" value="1" />
+            </div>
+            <button type="submit" class="btn btn-primary">提交请求</button>
+        </form>
+        <hr />
+        <form class="form-horizontal">
+            <div class="form-group">
+                <label>Response:</label>
+                <textarea class="form-control" rows="10">@ViewData["response"]</textarea>
+            </div>
+        </form>
+    </div>
+</div>
+@section Scripts {
+    @{await Html.RenderPartialAsync("_ValidationScriptsPartial"); }
+}

+ 49 - 0
samples/WebApplicationSample_V3_0/Views/JDPay/Refund.cshtml

@@ -0,0 +1,49 @@
+@model JDPayRefundViewModel
+@{
+    ViewData["Title"] = "退款申请接口";
+}
+<nav aria-label="breadcrumb">
+    <ol class="breadcrumb">
+        <li class="breadcrumb-item"><a asp-controller="JDPay" asp-action="Index">京东支付</a></li>
+        <li class="breadcrumb-item active" aria-current="page">@ViewData["Title"]</li>
+    </ol>
+</nav>
+<br />
+<div class="card">
+    <div class="card-body">
+        <form asp-controller="JDPay" asp-action="Refund">
+            <div asp-validation-summary="All" class="text-danger"></div>
+            <div class="form-group">
+                <label asp-for="TradeNum"></label>
+                <input type="text" class="form-control" asp-for="TradeNum" value="@DateTime.Now.ToString("yyyyMMddHHmmssfff")" />
+            </div>
+            <div class="form-group">
+                <label asp-for="OTradeNum"></label>
+                <input type="text" class="form-control" asp-for="OTradeNum" />
+            </div>
+            <div class="form-group">
+                <label asp-for="Amount"></label>
+                <input type="text" class="form-control" asp-for="Amount" value="1" />
+            </div>
+            <div class="form-group">
+                <label asp-for="Currency"></label>
+                <input type="text" class="form-control" asp-for="Currency" value="CNY" />
+            </div>
+            <div class="form-group">
+                <label asp-for="NotifyUrl"></label>
+                <input type="text" class="form-control" asp-for="NotifyUrl" value="http://*/notify/jdpay/async" />
+            </div>
+            <button type="submit" class="btn btn-primary">提交请求</button>
+        </form>
+        <hr />
+        <form class="form-horizontal">
+            <div class="form-group">
+                <label>Response:</label>
+                <textarea class="form-control" rows="10">@ViewData["response"]</textarea>
+            </div>
+        </form>
+    </div>
+</div>
+@section Scripts {
+    @{await Html.RenderPartialAsync("_ValidationScriptsPartial"); }
+}

+ 16 - 0
samples/WebApplicationSample_V3_0/Views/JDPay/Return.cshtml

@@ -0,0 +1,16 @@
+@{
+    ViewData["Title"] = "在线支付-同步跳转";
+}
+<nav aria-label="breadcrumb">
+    <ol class="breadcrumb">
+        <li class="breadcrumb-item"><a asp-controller="JDPay" asp-action="Index">京东支付</a></li>
+        <li class="breadcrumb-item active" aria-current="page">@ViewData["Title"]</li>
+    </ol>
+</nav>
+<br />
+<div class="card">
+    <div class="card-body">
+        @ViewData["response"]
+    </div>
+</div>
+

+ 58 - 0
samples/WebApplicationSample_V3_0/Views/JDPay/SaveOrderH5.cshtml

@@ -0,0 +1,58 @@
+@model JDPaySaveOrderViewModel
+@{
+    ViewData["Title"] = "H5在线支付";
+}
+<nav aria-label="breadcrumb">
+    <ol class="breadcrumb">
+        <li class="breadcrumb-item"><a asp-controller="JDPay" asp-action="Index">京东支付</a></li>
+        <li class="breadcrumb-item active" aria-current="page">@ViewData["Title"]</li>
+    </ol>
+</nav>
+<br />
+<div class="card">
+    <div class="card-body">
+        <form asp-controller="JDPay" asp-action="SaveOrderH5" target="_blank">
+            <div asp-validation-summary="All" class="text-danger"></div>
+            <div class="form-group">
+                <label asp-for="TradeNum"></label>
+                <input type="text" class="form-control" asp-for="TradeNum" value="@DateTime.Now.ToString("yyyyMMddHHmmssfff")" />
+            </div>
+            <div class="form-group">
+                <label asp-for="TradeName"></label>
+                <input type="text" class="form-control" asp-for="TradeName" value="H5在线支付测试" />
+            </div>
+            <div class="form-group">
+                <label asp-for="TradeTime"></label>
+                <input type="text" class="form-control" asp-for="TradeTime" value="@DateTime.Now.ToString("yyyyMMddHHmmss")" />
+            </div>
+            <div class="form-group">
+                <label asp-for="Amount"></label>
+                <input type="text" class="form-control" asp-for="Amount" value="1" />
+            </div>
+            <div class="form-group">
+                <label asp-for="OrderType"></label>
+                <input type="text" class="form-control" asp-for="OrderType" value="1" />
+            </div>
+            <div class="form-group">
+                <label asp-for="Currency"></label>
+                <input type="text" class="form-control" asp-for="Currency" value="CNY" />
+            </div>
+            <div class="form-group">
+                <label asp-for="CallbackUrl"></label>
+                <input type="text" class="form-control" asp-for="CallbackUrl" value="http://*/jdpay/return" />
+            </div>
+            <div class="form-group">
+                <label asp-for="NotifyUrl"></label>
+                <input type="text" class="form-control" asp-for="NotifyUrl" value="http://*/notify/jdpay/async" />
+            </div>
+            <div class="form-group">
+                <label asp-for="UserId"></label>
+                <input type="text" class="form-control" asp-for="UserId" />
+            </div>
+            <button type="submit" class="btn btn-primary">提交请求</button>
+        </form>
+    </div>
+</div>
+@section Scripts {
+    @{await Html.RenderPartialAsync("_ValidationScriptsPartial"); }
+}

+ 58 - 0
samples/WebApplicationSample_V3_0/Views/JDPay/SaveOrderPC.cshtml

@@ -0,0 +1,58 @@
+@model JDPaySaveOrderViewModel
+@{
+    ViewData["Title"] = "PC在线支付";
+}
+<nav aria-label="breadcrumb">
+    <ol class="breadcrumb">
+        <li class="breadcrumb-item"><a asp-controller="JDPay" asp-action="Index">京东支付</a></li>
+        <li class="breadcrumb-item active" aria-current="page">@ViewData["Title"]</li>
+    </ol>
+</nav>
+<br />
+<div class="card">
+    <div class="card-body">
+        <form asp-controller="JDPay" asp-action="SaveOrderPC" target="_blank">
+            <div asp-validation-summary="All" class="text-danger"></div>
+            <div class="form-group">
+                <label asp-for="TradeNum"></label>
+                <input type="text" class="form-control" asp-for="TradeNum" value="@DateTime.Now.ToString("yyyyMMddHHmmssfff")" />
+            </div>
+            <div class="form-group">
+                <label asp-for="TradeName"></label>
+                <input type="text" class="form-control" asp-for="TradeName" value="PC在线支付测试" />
+            </div>
+            <div class="form-group">
+                <label asp-for="TradeTime"></label>
+                <input type="text" class="form-control" asp-for="TradeTime" value="@DateTime.Now.ToString("yyyyMMddHHmmss")" />
+            </div>
+            <div class="form-group">
+                <label asp-for="Amount"></label>
+                <input type="text" class="form-control" asp-for="Amount" value="1" />
+            </div>
+            <div class="form-group">
+                <label asp-for="OrderType"></label>
+                <input type="text" class="form-control" asp-for="OrderType" value="1" />
+            </div>
+            <div class="form-group">
+                <label asp-for="Currency"></label>
+                <input type="text" class="form-control" asp-for="Currency" value="CNY" />
+            </div>
+            <div class="form-group">
+                <label asp-for="CallbackUrl"></label>
+                <input type="text" class="form-control" asp-for="CallbackUrl" value="http://*/jdpay/return" />
+            </div>
+            <div class="form-group">
+                <label asp-for="NotifyUrl"></label>
+                <input type="text" class="form-control" asp-for="NotifyUrl" value="http://*/notify/jdpay/async" />
+            </div>
+            <div class="form-group">
+                <label asp-for="UserId"></label>
+                <input type="text" class="form-control" asp-for="UserId" />
+            </div>
+            <button type="submit" class="btn btn-primary">提交请求</button>
+        </form>
+    </div>
+</div>
+@section Scripts {
+    @{await Html.RenderPartialAsync("_ValidationScriptsPartial"); }
+}

+ 45 - 0
samples/WebApplicationSample_V3_0/Views/JDPay/TradeQuery.cshtml

@@ -0,0 +1,45 @@
+@model JDPayTradeQueryViewModel
+@{
+    ViewData["Title"] = "代付交易查询";
+}
+<nav aria-label="breadcrumb">
+    <ol class="breadcrumb">
+        <li class="breadcrumb-item"><a asp-controller="JDPay" asp-action="Index">京东支付</a></li>
+        <li class="breadcrumb-item active" aria-current="page">@ViewData["Title"]</li>
+    </ol>
+</nav>
+<br />
+<div class="card">
+    <div class="card-body">
+        <form asp-controller="JDPay" asp-action="TradeQuery">
+            <div asp-validation-summary="All" class="text-danger"></div>
+            <div class="form-group">
+                <label asp-for="RequestDatetime"></label>
+                <input type="text" class="form-control" asp-for="RequestDatetime" value="@DateTime.Now.ToString("yyyyMMddHHmmss")" />
+            </div>
+            <div class="form-group">
+                <label asp-for="OutTradeNo"></label>
+                <input type="text" class="form-control" asp-for="OutTradeNo" />
+            </div>
+            <div class="form-group">
+                <label asp-for="TradeNo"></label>
+                <input type="text" class="form-control" asp-for="TradeNo" />
+            </div>
+            <div class="form-group">
+                <label asp-for="TradeType"></label>
+                <input type="text" class="form-control" asp-for="TradeType" value="T_AGD" />
+            </div>
+            <button type="submit" class="btn btn-primary">提交请求</button>
+        </form>
+        <hr />
+        <form class="form-horizontal">
+            <div class="form-group">
+                <label>Response:</label>
+                <textarea class="form-control" rows="10">@ViewData["response"]</textarea>
+            </div>
+        </form>
+    </div>
+</div>
+@section Scripts {
+    @{await Html.RenderPartialAsync("_ValidationScriptsPartial"); }
+}

+ 54 - 0
samples/WebApplicationSample_V3_0/Views/LianLianPay/H5QuickPay.cshtml

@@ -0,0 +1,54 @@
+@model LianLianPayH5QuickPayViewModel
+@{
+    ViewData["Title"] = "H5快捷支付";
+}
+<nav aria-label="breadcrumb">
+    <ol class="breadcrumb">
+        <li class="breadcrumb-item"><a asp-controller="LianLianPay" asp-action="Index">连连支付</a></li>
+        <li class="breadcrumb-item active" aria-current="page">@ViewData["Title"]</li>
+    </ol>
+</nav>
+<br />
+<div class="card">
+    <div class="card-body">
+        <form asp-controller="LianLianPay" asp-action="H5QuickPay" target="_blank">
+            <div asp-validation-summary="All" class="text-danger"></div>
+            <div class="form-group">
+                <label asp-for="NoOrder"></label>
+                <input type="text" class="form-control" asp-for="NoOrder" value="@DateTime.Now.ToString("yyyyMMddHHmmssfff")" />
+            </div>
+            <div class="form-group">
+                <label asp-for="DtOrder"></label>
+                <input type="text" class="form-control" asp-for="DtOrder" value="@DateTime.Now.ToString("yyyyMMddHHmmss")" />
+            </div>
+            <div class="form-group">
+                <label asp-for="MoneyOrder"></label>
+                <input type="text" class="form-control" asp-for="MoneyOrder" value="0.01" />
+            </div>
+            <div class="form-group">
+                <label asp-for="NameGoods"></label>
+                <input type="text" class="form-control" asp-for="NameGoods" value="WAP快捷支付测试" />
+            </div>
+            <div class="form-group">
+                <label asp-for="UserId"></label>
+                <input type="text" class="form-control" asp-for="UserId" />
+            </div>
+            <div class="form-group">
+                <label asp-for="NotifyUrl"></label>
+                <input type="text" class="form-control" asp-for="NotifyUrl" value="http://*/notify/lianlianpay/receivemoney" />
+            </div>
+            <div class="form-group">
+                <label asp-for="UrlReturn"></label>
+                <input type="text" class="form-control" asp-for="UrlReturn" value="http://*/lianlianpay/quickpayreturn" />
+            </div>
+            <div class="form-group">
+                <label asp-for="RiskItem"></label>
+                <input type="text" class="form-control" asp-for="RiskItem" value='{"frms_ware_category":"1999","user_info_full_name":"你好"}' />
+            </div>
+            <button type="submit" class="btn btn-primary">提交请求</button>
+        </form>
+    </div>
+</div>
+@section Scripts {
+    @{await Html.RenderPartialAsync("_ValidationScriptsPartial"); }
+}

+ 52 - 0
samples/WebApplicationSample_V3_0/Views/LianLianPay/Index.cshtml

@@ -0,0 +1,52 @@
+@{
+    ViewData["Title"] = "连连支付";
+}
+<nav aria-label="breadcrumb">
+    <ol class="breadcrumb">
+        <li class="breadcrumb-item"><a asp-controller="Home" asp-action="Index">首页</a></li>
+        <li class="breadcrumb-item active" aria-current="page">@ViewData["Title"]</li>
+    </ol>
+</nav>
+<br />
+<table class="table table-bordered table-hover">
+    <thead>
+        <tr>
+            <th scope="col">#</th>
+            <th scope="col">产品</th>
+            <th scope="col">接口</th>
+            <th scope="col">#</th>
+        </tr>
+    </thead>
+    <tbody>
+        <tr>
+            <th scope="row">1</th>
+            <td>Web快捷支付</td>
+            <td><a href="http://open.lianlianpay.com/#cat=35" target="_blank">https://payment.lianlianpay.com/payment/bankgateway.htm</a></td>
+            <td><a asp-controller="LianLianPay" asp-action="WebQuickPay">立即测试</a></td>
+        </tr>
+        <tr>
+            <th scope="row">2</th>
+            <td>H5快捷支付</td>
+            <td><a href="http://open.lianlianpay.com/#cat=36" target="_blank">https://wap.lianlianpay.com/payment.htm</a></td>
+            <td><a asp-controller="LianLianPay" asp-action="H5QuickPay">立即测试</a></td>
+        </tr>
+        <tr>
+            <th scope="row">3</th>
+            <td>订单查询</td>
+            <td><a href="http://open.lianlianpay.com/#cat=36" target="_blank">https://queryapi.lianlianpay.com/orderquery.htm</a></td>
+            <td><a asp-controller="LianLianPay" asp-action="OrderQuery">立即测试</a></td>
+        </tr>
+        <tr>
+            <th scope="row">4</th>
+            <td>退款</td>
+            <td><a href="http://open.lianlianpay.com/#cat=74" target="_blank">https://traderapi.lianlianpay.com/refund.htm</a></td>
+            <td><a asp-controller="LianLianPay" asp-action="Refund">立即测试</a></td>
+        </tr>
+        <tr>
+            <th scope="row">5</th>
+            <td>退款查询</td>
+            <td><a href="http://open.lianlianpay.com/#cat=74" target="_blank">https://queryapi.lianlianpay.com/refundquery.htm</a></td>
+            <td><a asp-controller="LianLianPay" asp-action="RefundQuery">立即测试</a></td>
+        </tr>
+    </tbody>
+</table>

+ 41 - 0
samples/WebApplicationSample_V3_0/Views/LianLianPay/OrderQuery.cshtml

@@ -0,0 +1,41 @@
+@model LianLianPayOrderQueryViewModel
+@{
+    ViewData["Title"] = "订单查询";
+}
+<nav aria-label="breadcrumb">
+    <ol class="breadcrumb">
+        <li class="breadcrumb-item"><a asp-controller="LianLianPay" asp-action="Index">连连支付</a></li>
+        <li class="breadcrumb-item active" aria-current="page">@ViewData["Title"]</li>
+    </ol>
+</nav>
+<br />
+<div class="card">
+    <div class="card-body">
+        <form asp-controller="LianLianPay" asp-action="OrderQuery">
+            <div asp-validation-summary="All" class="text-danger"></div>
+            <div class="form-group">
+                <label asp-for="NoOrder"></label>
+                <input type="text" class="form-control" asp-for="NoOrder" />
+            </div>
+            <div class="form-group">
+                <label asp-for="DtOrder"></label>
+                <input type="text" class="form-control" asp-for="DtOrder" />
+            </div>
+            <div class="form-group">
+                <label asp-for="OidPayBill"></label>
+                <input type="text" class="form-control" asp-for="OidPayBill" />
+            </div>
+            <button type="submit" class="btn btn-primary">提交请求</button>
+        </form>
+        <hr />
+        <form class="form-horizontal">
+            <div class="form-group">
+                <label>Response:</label>
+                <textarea class="form-control" rows="10">@ViewData["response"]</textarea>
+            </div>
+        </form>
+    </div>
+</div>
+@section Scripts {
+    @{await Html.RenderPartialAsync("_ValidationScriptsPartial"); }
+}

+ 15 - 0
samples/WebApplicationSample_V3_0/Views/LianLianPay/QuickPayCallback.cshtml

@@ -0,0 +1,15 @@
+@{
+    ViewData["Title"] = "快捷支付-同步通知";
+}
+<nav aria-label="breadcrumb">
+    <ol class="breadcrumb">
+        <li class="breadcrumb-item"><a asp-controller="LianLianPay" asp-action="Index">连连支付</a></li>
+        <li class="breadcrumb-item active" aria-current="page">@ViewData["Title"]</li>
+    </ol>
+</nav>
+<br />
+<div class="card">
+    <div class="card-body">
+        @ViewData["response"]
+    </div>
+</div>

+ 57 - 0
samples/WebApplicationSample_V3_0/Views/LianLianPay/Refund.cshtml

@@ -0,0 +1,57 @@
+@model LianLianPayRefundViewModel
+@{
+    ViewData["Title"] = "退款";
+}
+<nav aria-label="breadcrumb">
+    <ol class="breadcrumb">
+        <li class="breadcrumb-item"><a asp-controller="LianLianPay" asp-action="Index">连连支付</a></li>
+        <li class="breadcrumb-item active" aria-current="page">@ViewData["Title"]</li>
+    </ol>
+</nav>
+<br />
+<div class="card">
+    <div class="card-body">
+        <form asp-controller="LianLianPay" asp-action="Refund">
+            <div asp-validation-summary="All" class="text-danger"></div>
+            <div class="form-group">
+                <label asp-for="NoRefund"></label>
+                <input type="text" class="form-control" asp-for="NoRefund" value="@DateTime.Now.ToString("yyyyMMddHHmmssfff")" />
+            </div>
+            <div class="form-group">
+                <label asp-for="DtRefund"></label>
+                <input type="text" class="form-control" asp-for="DtRefund" value="@DateTime.Now.ToString("yyyyMMddHHmmss")" />
+            </div>
+            <div class="form-group">
+                <label asp-for="MoneyRefund"></label>
+                <input type="text" class="form-control" asp-for="MoneyRefund" value="0.01" />
+            </div>
+            <div class="form-group">
+                <label asp-for="NoOrder"></label>
+                <input type="text" class="form-control" asp-for="NoOrder" />
+            </div>
+            <div class="form-group">
+                <label asp-for="DtOrder"></label>
+                <input type="text" class="form-control" asp-for="DtOrder" />
+            </div>
+            <div class="form-group">
+                <label asp-for="OidPayBill"></label>
+                <input type="text" class="form-control" asp-for="OidPayBill" />
+            </div>
+            <div class="form-group">
+                <label asp-for="NotifyUrl"></label>
+                <input type="text" class="form-control" asp-for="NotifyUrl" value="http://*/notify/lianlianpay/refund" />
+            </div>
+            <button type="submit" class="btn btn-primary">提交请求</button>
+        </form>
+        <hr />
+        <form class="form-horizontal">
+            <div class="form-group">
+                <label>Response:</label>
+                <textarea class="form-control" rows="10">@ViewData["response"]</textarea>
+            </div>
+        </form>
+    </div>
+</div>
+@section Scripts {
+    @{await Html.RenderPartialAsync("_ValidationScriptsPartial"); }
+}

+ 41 - 0
samples/WebApplicationSample_V3_0/Views/LianLianPay/RefundQuery.cshtml

@@ -0,0 +1,41 @@
+@model LianLianPayRefundQueryViewModel
+@{
+    ViewData["Title"] = "退款查询";
+}
+<nav aria-label="breadcrumb">
+    <ol class="breadcrumb">
+        <li class="breadcrumb-item"><a asp-controller="LianLianPay" asp-action="Index">连连支付</a></li>
+        <li class="breadcrumb-item active" aria-current="page">@ViewData["Title"]</li>
+    </ol>
+</nav>
+<br />
+<div class="card">
+    <div class="card-body">
+        <form asp-controller="LianLianPay" asp-action="RefundQuery">
+            <div asp-validation-summary="All" class="text-danger"></div>
+            <div class="form-group">
+                <label asp-for="NoRefund"></label>
+                <input type="text" class="form-control" asp-for="NoRefund" />
+            </div>
+            <div class="form-group">
+                <label asp-for="DtRefund"></label>
+                <input type="text" class="form-control" asp-for="DtRefund" />
+            </div>
+            <div class="form-group">
+                <label asp-for="OidRefundNo"></label>
+                <input type="text" class="form-control" asp-for="OidRefundNo" />
+            </div>
+            <button type="submit" class="btn btn-primary">提交请求</button>
+        </form>
+        <hr />
+        <form class="form-horizontal">
+            <div class="form-group">
+                <label>Response:</label>
+                <textarea class="form-control" rows="10">@ViewData["response"]</textarea>
+            </div>
+        </form>
+    </div>
+</div>
+@section Scripts {
+    @{await Html.RenderPartialAsync("_ValidationScriptsPartial"); }
+}

+ 54 - 0
samples/WebApplicationSample_V3_0/Views/LianLianPay/WebQuickPay.cshtml

@@ -0,0 +1,54 @@
+@model LianLianPayWebQuickPayViewModel
+@{
+    ViewData["Title"] = "WEB快捷支付";
+}
+<nav aria-label="breadcrumb">
+    <ol class="breadcrumb">
+        <li class="breadcrumb-item"><a asp-controller="LianLianPay" asp-action="Index">连连支付</a></li>
+        <li class="breadcrumb-item active" aria-current="page">@ViewData["Title"]</li>
+    </ol>
+</nav>
+<br />
+<div class="card">
+    <div class="card-body">
+        <form asp-controller="LianLianPay" asp-action="WebQuickPay" target="_blank">
+            <div asp-validation-summary="All" class="text-danger"></div>
+            <div class="form-group">
+                <label asp-for="NoOrder"></label>
+                <input type="text" class="form-control" asp-for="NoOrder" value="@DateTime.Now.ToString("yyyyMMddHHmmssfff")" />
+            </div>
+            <div class="form-group">
+                <label asp-for="DtOrder"></label>
+                <input type="text" class="form-control" asp-for="DtOrder" value="@DateTime.Now.ToString("yyyyMMddHHmmss")" />
+            </div>
+            <div class="form-group">
+                <label asp-for="MoneyOrder"></label>
+                <input type="text" class="form-control" asp-for="MoneyOrder" value="0.01" />
+            </div>
+            <div class="form-group">
+                <label asp-for="NameGoods"></label>
+                <input type="text" class="form-control" asp-for="NameGoods" value="WEB快捷支付测试" />
+            </div>
+            <div class="form-group">
+                <label asp-for="UserId"></label>
+                <input type="text" class="form-control" asp-for="UserId" />
+            </div>
+            <div class="form-group">
+                <label asp-for="NotifyUrl"></label>
+                <input type="text" class="form-control" asp-for="NotifyUrl" value="http://*/notify/lianlianpay/receivemoney" />
+            </div>
+            <div class="form-group">
+                <label asp-for="UrlReturn"></label>
+                <input type="text" class="form-control" asp-for="UrlReturn" value="http://*/lianlianpay/quickpayreturn" />
+            </div>
+            <div class="form-group">
+                <label asp-for="RiskItem"></label>
+                <input type="text" class="form-control" asp-for="RiskItem" value='{"frms_ware_category":"1999","user_info_full_name":"你好"}' />
+            </div>
+            <button type="submit" class="btn btn-primary">提交请求</button>
+        </form>
+    </div>
+</div>
+@section Scripts {
+    @{await Html.RenderPartialAsync("_ValidationScriptsPartial"); }
+}

+ 57 - 0
samples/WebApplicationSample_V3_0/Views/QPay/AppPay.cshtml

@@ -0,0 +1,57 @@
+@model QPayUnifiedOrderViewModel
+@{
+    ViewData["Title"] = "APP支付-统一下单";
+}
+<nav aria-label="breadcrumb">
+    <ol class="breadcrumb">
+        <li class="breadcrumb-item"><a asp-controller="QPay" asp-action="Index">QQ钱包</a></li>
+        <li class="breadcrumb-item active" aria-current="page">@ViewData["Title"]</li>
+    </ol>
+</nav>
+<br />
+<div class="card">
+    <div class="card-body">
+        <form asp-controller="QPay" asp-action="AppPay">
+            <div asp-validation-summary="All" class="text-danger"></div>
+            <div class="form-group">
+                <label asp-for="OutTradeNo"></label>
+                <input type="text" class="form-control" asp-for="OutTradeNo" value="@DateTime.Now.ToString("yyyyMMddHHmmssfff")" />
+            </div>
+            <div class="form-group">
+                <label asp-for="Body"></label>
+                <input type="text" class="form-control" asp-for="Body" value="APP支付测试" />
+            </div>
+            <div class="form-group">
+                <label asp-for="FeeType"></label>
+                <input type="text" class="form-control" asp-for="FeeType" value="CNY" />
+            </div>
+            <div class="form-group">
+                <label asp-for="TotalFee"></label>
+                <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" />
+            </div>
+            <div class="form-group">
+                <label asp-for="TradeType"></label>
+                <input type="text" class="form-control" asp-for="TradeType" value="APP" />
+            </div>
+            <div class="form-group">
+                <label asp-for="NotifyUrl"></label>
+                <input type="text" class="form-control" asp-for="NotifyUrl" value="http://*/notify/qpay/unifiedorder" />
+            </div>
+            <button type="submit" class="btn btn-primary">提交请求</button>
+        </form>
+        <hr />
+        <form class="form-horizontal">
+            <div class="form-group">
+                <label>Response:</label>
+                <textarea class="form-control" rows="10">@ViewData["response"]</textarea>
+            </div>
+        </form>
+    </div>
+</div>
+@section Scripts {
+    @{await Html.RenderPartialAsync("_ValidationScriptsPartial"); }
+}

+ 69 - 0
samples/WebApplicationSample_V3_0/Views/QPay/B2CPay.cshtml

@@ -0,0 +1,69 @@
+@model QPayB2CPayViewModel
+@{
+    ViewData["Title"] = "企业付款到余额";
+}
+<nav aria-label="breadcrumb">
+    <ol class="breadcrumb">
+        <li class="breadcrumb-item"><a asp-controller="QPay" asp-action="Index">QQ钱包</a></li>
+        <li class="breadcrumb-item active" aria-current="page">@ViewData["Title"]</li>
+    </ol>
+</nav>
+<br />
+<div class="card">
+    <div class="card-body">
+        <form asp-controller="QPay" asp-action="B2CPay">
+            <div asp-validation-summary="All" class="text-danger"></div>
+            <div class="form-group">
+                <label asp-for="OpenId"></label>
+                <input type="text" class="form-control" asp-for="OpenId" />
+            </div>
+            <div class="form-group">
+                <label asp-for="Uin"></label>
+                <input type="text" class="form-control" asp-for="Uin" />
+            </div>
+            <div class="form-group">
+                <label asp-for="OutTradeNo"></label>
+                <input type="text" class="form-control" asp-for="OutTradeNo" value="@DateTime.Now.ToString("yyyyMMddHHmmssfff")" />
+            </div>
+            <div class="form-group">
+                <label asp-for="TotalFee"></label>
+                <input type="text" class="form-control" asp-for="TotalFee" value="1" />
+            </div>
+            <div class="form-group">
+                <label asp-for="Memo"></label>
+                <input type="text" class="form-control" asp-for="Memo" />
+            </div>
+            <div class="form-group">
+                <label asp-for="CheckRealName"></label>
+                <input type="text" class="form-control" asp-for="CheckRealName" value="0" />
+            </div>
+            <div class="form-group">
+                <label asp-for="OpUserId"></label>
+                <input type="text" class="form-control" asp-for="OpUserId" />
+            </div>
+            <div class="form-group">
+                <label asp-for="OpUserPasswd"></label>
+                <input type="text" class="form-control" asp-for="OpUserPasswd" />
+            </div>
+            <div class="form-group">
+                <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>
+                <input type="text" class="form-control" asp-for="NotifyUrl" value="http://*/notify/qpay/b2cpay" />
+            </div>
+            <button type="submit" class="btn btn-primary">提交请求</button>
+        </form>
+        <hr />
+        <form class="form-horizontal">
+            <div class="form-group">
+                <label>Response:</label>
+                <textarea class="form-control" rows="10">@ViewData["response"]</textarea>
+            </div>
+        </form>
+    </div>
+</div>
+@section Scripts {
+    @{await Html.RenderPartialAsync("_ValidationScriptsPartial"); }
+}

+ 33 - 0
samples/WebApplicationSample_V3_0/Views/QPay/CloseOrder.cshtml

@@ -0,0 +1,33 @@
+@model QPayCloseOrderViewModel
+@{
+    ViewData["Title"] = "关闭订单";
+}
+<nav aria-label="breadcrumb">
+    <ol class="breadcrumb">
+        <li class="breadcrumb-item"><a asp-controller="QPay" asp-action="Index">QQ钱包</a></li>
+        <li class="breadcrumb-item active" aria-current="page">@ViewData["Title"]</li>
+    </ol>
+</nav>
+<br />
+<div class="card">
+    <div class="card-body">
+        <form asp-controller="QPay" asp-action="CloseOrder">
+            <div asp-validation-summary="All" class="text-danger"></div>
+            <div class="form-group">
+                <label asp-for="OutTradeNo"></label>
+                <input type="text" class="form-control" asp-for="OutTradeNo" />
+            </div>
+            <button type="submit" class="btn btn-primary">提交请求</button>
+        </form>
+        <hr />
+        <form class="form-horizontal">
+            <div class="form-group">
+                <label>Response:</label>
+                <textarea class="form-control" rows="10">@ViewData["response"]</textarea>
+            </div>
+        </form>
+    </div>
+</div>
+@section Scripts {
+    @{await Html.RenderPartialAsync("_ValidationScriptsPartial"); }
+}

+ 88 - 0
samples/WebApplicationSample_V3_0/Views/QPay/Index.cshtml

@@ -0,0 +1,88 @@
+@{
+    ViewData["Title"] = "QQ钱包";
+}
+<nav aria-label="breadcrumb">
+    <ol class="breadcrumb">
+        <li class="breadcrumb-item"><a asp-controller="Home" asp-action="Index">首页</a></li>
+        <li class="breadcrumb-item active" aria-current="page">@ViewData["Title"]</li>
+    </ol>
+</nav>
+<br />
+<table class="table table-bordered table-hover">
+    <thead>
+        <tr>
+            <th scope="col">#</th>
+            <th scope="col">产品</th>
+            <th scope="col">接口</th>
+            <th scope="col">#</th>
+        </tr>
+    </thead>
+    <tbody>
+        <tr>
+            <th scope="row">1</th>
+            <td>付款码支付-提交付款码支付</td>
+            <td><a href="https://qpay.qq.com/buss/wiki/1/1119" target="_blank">https://qpay.qq.com/cgi-bin/pay/qpay_micro_pay.cgi</a></td>
+            <td><a asp-controller="QPay" asp-action="MicroPay">立即测试</a></td>
+        </tr>
+        <tr>
+            <th scope="row">2</th>
+            <td>扫码支付-统一下单</td>
+            <td><a href="https://qpay.qq.com/buss/wiki/38/1198" target="_blank">https://qpay.qq.com/cgi-bin/pay/qpay_unified_order.cgi</a></td>
+            <td><a asp-controller="QPay" asp-action="QrCodePay">立即测试</a></td>
+        </tr>
+        <tr>
+            <th scope="row">3</th>
+            <td>公众号支付-统一下单</td>
+            <td><a href="https://qpay.qq.com/buss/wiki/38/1200" target="_blank">https://qpay.qq.com/cgi-bin/pay/qpay_unified_order.cgi</a></td>
+            <td><a asp-controller="QPay" asp-action="PubPay">立即测试</a></td>
+        </tr>
+        <tr>
+            <th scope="row">4</th>
+            <td>APP支付-统一下单</td>
+            <td><a href="https://qpay.qq.com/buss/wiki/38/1194" target="_blank">https://qpay.qq.com/cgi-bin/pay/qpay_unified_order.cgi</a></td>
+            <td><a asp-controller="QPay" asp-action="AppPay">立即测试</a></td>
+        </tr>
+        <tr>
+            <th scope="row">5</th>
+            <td>订单查询</td>
+            <td><a href="https://qpay.qq.com/buss/wiki/38/1205" target="_blank">https://qpay.qq.com/cgi-bin/pay/qpay_order_query.cgi</a></td>
+            <td><a asp-controller="QPay" asp-action="OrderQuery">立即测试</a></td>
+        </tr>
+        <tr>
+            <th scope="row">6</th>
+            <td>撤销订单</td>
+            <td><a href="https://qpay.qq.com/qpaywiki/showdocument.php?pid=1&docid=168" target="_blank">https://api.qpay.qq.com/cgi-bin/pay/qpay_reverse.cgi</a></td>
+            <td><a asp-controller="QPay" asp-action="Reverse">立即测试</a></td>
+        </tr>
+        <tr>
+            <th scope="row">7</th>
+            <td>关闭订单</td>
+            <td><a href="https://qpay.qq.com/buss/wiki/38/1206" target="_blank">https://qpay.qq.com/cgi-bin/pay/qpay_close_order.cgi</a></td>
+            <td><a asp-controller="QPay" asp-action="CloseOrder">立即测试</a></td>
+        </tr>
+        <tr>
+            <th scope="row">8</th>
+            <td>申请退款</td>
+            <td><a href="https://qpay.qq.com/buss/wiki/38/1207" target="_blank">https://api.qpay.qq.com/cgi-bin/pay/qpay_refund.cgi</a></td>
+            <td><a asp-controller="QPay" asp-action="Refund">立即测试</a></td>
+        </tr>
+        <tr>
+            <th scope="row">9</th>
+            <td>退款查询</td>
+            <td><a href="https://qpay.qq.com/buss/wiki/38/1208" target="_blank">https://qpay.qq.com/cgi-bin/pay/qpay_refund_query.cgi</a></td>
+            <td><a asp-controller="QPay" asp-action="RefundQuery">立即测试</a></td>
+        </tr>
+        <tr>
+            <th scope="row">10</th>
+            <td>对账单下载</td>
+            <td><a href="https://qpay.qq.com/buss/wiki/38/1209" target="_blank">https://qpay.qq.com/cgi-bin/sp_download/qpay_mch_statement_down.cgi</a></td>
+            <td><a asp-controller="QPay" asp-action="StatementDown">立即测试</a></td>
+        </tr>
+        <tr>
+            <th scope="row">11</th>
+            <td>企业付款</td>
+            <td><a href="https://qpay.qq.com/buss/wiki/206/1215" target="_blank">https://api.qpay.qq.com/cgi-bin/epay/qpay_epay_b2c.cgi</a></td>
+            <td><a asp-controller="QPay" asp-action="B2CPay">立即测试</a></td>
+        </tr>
+    </tbody>
+</table>

+ 65 - 0
samples/WebApplicationSample_V3_0/Views/QPay/MicroPay.cshtml

@@ -0,0 +1,65 @@
+@model QPayMicroPayViewModel
+@{
+    ViewData["Title"] = "付款码支付-提交付款码支付";
+}
+<nav aria-label="breadcrumb">
+    <ol class="breadcrumb">
+        <li class="breadcrumb-item"><a asp-controller="QPay" asp-action="Index">QQ钱包</a></li>
+        <li class="breadcrumb-item active" aria-current="page">@ViewData["Title"]</li>
+    </ol>
+</nav>
+<br />
+<div class="card">
+    <div class="card-body">
+        <form asp-controller="QPay" asp-action="MicroPay">
+            <div asp-validation-summary="All" class="text-danger"></div>
+            <div class="form-group">
+                <label asp-for="OutTradeNo"></label>
+                <input type="text" class="form-control" asp-for="OutTradeNo" value="@DateTime.Now.ToString("yyyyMMddHHmmssfff")" />
+            </div>
+            <div class="form-group">
+                <label asp-for="Body"></label>
+                <input type="text" class="form-control" asp-for="Body" value="付款码支付测试" />
+            </div>
+            <div class="form-group">
+                <label asp-for="FeeType"></label>
+                <input type="text" class="form-control" asp-for="FeeType" value="CNY" />
+            </div>
+            <div class="form-group">
+                <label asp-for="TotalFee"></label>
+                <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" />
+            </div>
+            <div class="form-group">
+                <label asp-for="DeviceInfo"></label>
+                <input type="text" class="form-control" asp-for="DeviceInfo" value="10001" />
+            </div>
+            <div class="form-group">
+                <label asp-for="AuthCode"></label>
+                <input type="text" class="form-control" asp-for="AuthCode" />
+            </div>
+            <div class="form-group">
+                <label asp-for="TradeType"></label>
+                <input type="text" class="form-control" asp-for="TradeType" value="MICROPAY" />
+            </div>
+            <div class="form-group">
+                <label asp-for="NotifyUrl"></label>
+                <input type="text" class="form-control" asp-for="NotifyUrl" value="http://*/notify/qpay/micropay" />
+            </div>
+            <button type="submit" class="btn btn-primary">提交请求</button>
+        </form>
+        <hr />
+        <form class="form-horizontal">
+            <div class="form-group">
+                <label>Response:</label>
+                <textarea class="form-control" rows="10">@ViewData["response"]</textarea>
+            </div>
+        </form>
+    </div>
+</div>
+@section Scripts {
+    @{await Html.RenderPartialAsync("_ValidationScriptsPartial"); }
+}

+ 34 - 0
samples/WebApplicationSample_V3_0/Views/QPay/OrderQuery.cshtml

@@ -0,0 +1,34 @@
+@model QPayOrderQueryViewModel
+@{
+    ViewData["Title"] = "订单查询";
+}
+<nav aria-label="breadcrumb">
+    <ol class="breadcrumb">
+        <li class="breadcrumb-item"><a asp-controller="QPay" asp-action="Index">QQ钱包</a></li>
+        <li class="breadcrumb-item active" aria-current="page">@ViewData["Title"]</li>
+    </ol>
+</nav>
+<br />
+<div class="card">
+    <div class="card-body">
+        <form asp-controller="QPay" asp-action="OrderQuery">
+            <div asp-validation-summary="All" class="text-danger"></div>
+            <div class="form-group">
+                <label asp-for="TransactionId"></label>
+                <input type="text" class="form-control" asp-for="TransactionId" />
+            </div>
+            <div class="form-group">
+                <label asp-for="OutTradeNo"></label>
+                <input type="text" class="form-control" asp-for="OutTradeNo" />
+            </div>
+            <button type="submit" class="btn btn-primary">提交请求</button>
+        </form>
+        <hr />
+        <form class="form-horizontal">
+            <div class="form-group">
+                <label>Response:</label>
+                <textarea class="form-control" rows="10">@ViewData["response"]</textarea>
+            </div>
+        </form>
+    </div>
+</div>

+ 57 - 0
samples/WebApplicationSample_V3_0/Views/QPay/PubPay.cshtml

@@ -0,0 +1,57 @@
+@model QPayUnifiedOrderViewModel
+@{
+    ViewData["Title"] = "公众号支付-统一下单";
+}
+<nav aria-label="breadcrumb">
+    <ol class="breadcrumb">
+        <li class="breadcrumb-item"><a asp-controller="QPay" asp-action="Index">QQ钱包</a></li>
+        <li class="breadcrumb-item active" aria-current="page">@ViewData["Title"]</li>
+    </ol>
+</nav>
+<br />
+<div class="card">
+    <div class="card-body">
+        <form asp-controller="QPay" asp-action="PubPay">
+            <div asp-validation-summary="All" class="text-danger"></div>
+            <div class="form-group">
+                <label asp-for="OutTradeNo"></label>
+                <input type="text" class="form-control" asp-for="OutTradeNo" value="@DateTime.Now.ToString("yyyyMMddHHmmssfff")" />
+            </div>
+            <div class="form-group">
+                <label asp-for="Body"></label>
+                <input type="text" class="form-control" asp-for="Body" value="公众号支付测试" />
+            </div>
+            <div class="form-group">
+                <label asp-for="FeeType"></label>
+                <input type="text" class="form-control" asp-for="FeeType" value="CNY" />
+            </div>
+            <div class="form-group">
+                <label asp-for="TotalFee"></label>
+                <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" />
+            </div>
+            <div class="form-group">
+                <label asp-for="TradeType"></label>
+                <input type="text" class="form-control" asp-for="TradeType" value="JSAPI" />
+            </div>
+            <div class="form-group">
+                <label asp-for="NotifyUrl"></label>
+                <input type="text" class="form-control" asp-for="NotifyUrl" value="http://*/notify/qpay/unifiedorder" />
+            </div>
+            <button type="submit" class="btn btn-primary">提交请求</button>
+        </form>
+        <hr />
+        <form class="form-horizontal">
+            <div class="form-group">
+                <label>Response:</label>
+                <textarea class="form-control" rows="10">@ViewData["response"]</textarea>
+            </div>
+        </form>
+    </div>
+</div>
+@section Scripts {
+    @{await Html.RenderPartialAsync("_ValidationScriptsPartial"); }
+}

+ 64 - 0
samples/WebApplicationSample_V3_0/Views/QPay/QrCodePay.cshtml

@@ -0,0 +1,64 @@
+@model QPayUnifiedOrderViewModel
+@{
+    ViewData["Title"] = "扫码支付-统一下单";
+}
+<nav aria-label="breadcrumb">
+    <ol class="breadcrumb">
+        <li class="breadcrumb-item"><a asp-controller="QPay" asp-action="Index">QQ钱包</a></li>
+        <li class="breadcrumb-item active" aria-current="page">@ViewData["Title"]</li>
+    </ol>
+</nav>
+<br />
+<div class="card">
+    <div class="card-body">
+        <form asp-controller="QPay" asp-action="QrCodePay">
+            <div asp-validation-summary="All" class="text-danger"></div>
+            <div class="form-group">
+                <label asp-for="OutTradeNo"></label>
+                <input type="text" class="form-control" asp-for="OutTradeNo" value="@DateTime.Now.ToString("yyyyMMddHHmmssfff")" />
+            </div>
+            <div class="form-group">
+                <label asp-for="Body"></label>
+                <input type="text" class="form-control" asp-for="Body" value="扫码支付测试" />
+            </div>
+            <div class="form-group">
+                <label asp-for="FeeType"></label>
+                <input type="text" class="form-control" asp-for="FeeType" value="CNY" />
+            </div>
+            <div class="form-group">
+                <label asp-for="TotalFee"></label>
+                <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" />
+            </div>
+            <div class="form-group">
+                <label asp-for="TradeType"></label>
+                <input type="text" class="form-control" asp-for="TradeType" value="NATIVE" />
+            </div>
+            <div class="form-group">
+                <label asp-for="NotifyUrl"></label>
+                <input type="text" class="form-control" asp-for="NotifyUrl" value="http://*/notify/qpay/unifiedorder" />
+            </div>
+            <button type="submit" class="btn btn-primary">提交请求</button>
+        </form>
+        <hr />
+        <form class="form-horizontal">
+            <div class="form-group">
+                <label>QrCode:</label>
+                @if (!string.IsNullOrEmpty(ViewData["qrcode"] as string))
+                {
+                    <embed src="../Home/QrCode?size=168&data=@ViewData["qrcode"]" width="168" height="168" type="image/svg+xml" />
+                }
+            </div>
+            <div class="form-group">
+                <label>Response:</label>
+                <textarea class="form-control" rows="10">@ViewData["response"]</textarea>
+            </div>
+        </form>
+    </div>
+</div>
+@section Scripts {
+    @{await Html.RenderPartialAsync("_ValidationScriptsPartial"); }
+}

+ 53 - 0
samples/WebApplicationSample_V3_0/Views/QPay/Refund.cshtml

@@ -0,0 +1,53 @@
+@model QPayRefundViewModel
+@{
+    ViewData["Title"] = "申请退款";
+}
+<nav aria-label="breadcrumb">
+    <ol class="breadcrumb">
+        <li class="breadcrumb-item"><a asp-controller="QPay" asp-action="Index">QQ钱包</a></li>
+        <li class="breadcrumb-item active" aria-current="page">@ViewData["Title"]</li>
+    </ol>
+</nav>
+<br />
+<div class="card">
+    <div class="card-body">
+        <form asp-controller="QPay" asp-action="Refund">
+            <div asp-validation-summary="All" class="text-danger"></div>
+            <div class="form-group">
+                <label asp-for="OutRefundNo"></label>
+                <input type="text" class="form-control" asp-for="OutRefundNo" value="@DateTime.Now.ToString("yyyyMMddHHmmssfff")" />
+            </div>
+            <div class="form-group">
+                <label asp-for="TransactionId"></label>
+                <input type="text" class="form-control" asp-for="TransactionId" />
+            </div>
+            <div class="form-group">
+                <label asp-for="OutTradeNo"></label>
+                <input type="text" class="form-control" asp-for="OutTradeNo" />
+            </div>
+            <div class="form-group">
+                <label asp-for="RefundFee"></label>
+                <input type="text" class="form-control" asp-for="RefundFee" />
+            </div>
+            <div class="form-group">
+                <label asp-for="OpUserId"></label>
+                <input type="text" class="form-control" asp-for="OpUserId" />
+            </div>
+            <div class="form-group">
+                <label asp-for="OpUserPasswd"></label>
+                <input type="text" class="form-control" asp-for="OpUserPasswd" />
+            </div>
+            <button type="submit" class="btn btn-primary">提交请求</button>
+        </form>
+        <hr />
+        <form class="form-horizontal">
+            <div class="form-group">
+                <label>Response:</label>
+                <textarea class="form-control" rows="10">@ViewData["response"]</textarea>
+            </div>
+        </form>
+    </div>
+</div>
+@section Scripts {
+    @{await Html.RenderPartialAsync("_ValidationScriptsPartial"); }
+}

+ 42 - 0
samples/WebApplicationSample_V3_0/Views/QPay/RefundQuery.cshtml

@@ -0,0 +1,42 @@
+@model QPayRefundQueryViewModel
+@{
+    ViewData["Title"] = "退款查询";
+}
+<nav aria-label="breadcrumb">
+    <ol class="breadcrumb">
+        <li class="breadcrumb-item"><a asp-controller="QPay" asp-action="Index">QQ钱包</a></li>
+        <li class="breadcrumb-item active" aria-current="page">@ViewData["Title"]</li>
+    </ol>
+</nav>
+<br />
+<div class="card">
+    <div class="card-body">
+        <form asp-controller="QPay" asp-action="RefundQuery">
+            <div asp-validation-summary="All" class="text-danger"></div>
+            <div class="form-group">
+                <label asp-for="RefundId"></label>
+                <input type="text" class="form-control" asp-for="RefundId" />
+            </div>
+            <div class="form-group">
+                <label asp-for="OutRefundNo"></label>
+                <input type="text" class="form-control" asp-for="OutRefundNo" />
+            </div>
+            <div class="form-group">
+                <label asp-for="TransactionId"></label>
+                <input type="text" class="form-control" asp-for="TransactionId" />
+            </div>
+            <div class="form-group">
+                <label asp-for="OutTradeNo"></label>
+                <input type="text" class="form-control" asp-for="OutTradeNo" />
+            </div>
+            <button type="submit" class="btn btn-primary">提交请求</button>
+        </form>
+        <hr />
+        <form class="form-horizontal">
+            <div class="form-group">
+                <label>Response:</label>
+                <textarea class="form-control" rows="10">@ViewData["response"]</textarea>
+            </div>
+        </form>
+    </div>
+</div>

+ 33 - 0
samples/WebApplicationSample_V3_0/Views/QPay/Reverse.cshtml

@@ -0,0 +1,33 @@
+@model QPayReverseViewModel
+@{
+    ViewData["Title"] = "撤销订单";
+}
+<nav aria-label="breadcrumb">
+    <ol class="breadcrumb">
+        <li class="breadcrumb-item"><a asp-controller="QPay" asp-action="Index">QQ钱包</a></li>
+        <li class="breadcrumb-item active" aria-current="page">@ViewData["Title"]</li>
+    </ol>
+</nav>
+<br />
+<div class="card">
+    <div class="card-body">
+        <form asp-controller="QPay" asp-action="Reverse">
+            <div asp-validation-summary="All" class="text-danger"></div>
+            <div class="form-group">
+                <label asp-for="OutTradeNo"></label>
+                <input type="text" class="form-control" asp-for="OutTradeNo" />
+            </div>
+            <button type="submit" class="btn btn-primary">提交请求</button>
+        </form>
+        <hr />
+        <form class="form-horizontal">
+            <div class="form-group">
+                <label>Response:</label>
+                <textarea class="form-control" rows="10">@ViewData["response"]</textarea>
+            </div>
+        </form>
+    </div>
+</div>
+@section Scripts {
+    @{await Html.RenderPartialAsync("_ValidationScriptsPartial"); }
+}

+ 41 - 0
samples/WebApplicationSample_V3_0/Views/QPay/StatementDown.cshtml

@@ -0,0 +1,41 @@
+@model QPayStatementDownViewModel
+@{
+    ViewData["Title"] = "对账单下载";
+}
+<nav aria-label="breadcrumb">
+    <ol class="breadcrumb">
+        <li class="breadcrumb-item"><a asp-controller="QPay" asp-action="Index">QQ钱包</a></li>
+        <li class="breadcrumb-item active" aria-current="page">@ViewData["Title"]</li>
+    </ol>
+</nav>
+<br />
+<div class="card">
+    <div class="card-body">
+        <form asp-controller="QPay" asp-action="StatementDown">
+            <div asp-validation-summary="All" class="text-danger"></div>
+            <div class="form-group">
+                <label asp-for="BillDate"></label>
+                <input type="text" class="form-control" asp-for="BillDate" />
+            </div>
+            <div class="form-group">
+                <label asp-for="BillType"></label>
+                <input type="text" class="form-control" asp-for="BillType" />
+            </div>
+            <div class="form-group">
+                <label asp-for="TarType"></label>
+                <input type="text" class="form-control" asp-for="TarType" />
+            </div>
+            <button type="submit" class="btn btn-primary">提交请求</button>
+        </form>
+        <hr />
+        <form class="form-horizontal">
+            <div class="form-group">
+                <label>Response:</label>
+                <textarea class="form-control" rows="10">@ViewData["response"]</textarea>
+            </div>
+        </form>
+    </div>
+</div>
+@section Scripts {
+    @{await Html.RenderPartialAsync("_ValidationScriptsPartial"); }
+}

+ 22 - 0
samples/WebApplicationSample_V3_0/Views/Shared/Error.cshtml

@@ -0,0 +1,22 @@
+@model ErrorViewModel
+@{
+    ViewData["Title"] = "Error";
+}
+
+<h1 class="text-danger">Error.</h1>
+<h2 class="text-danger">An error occurred while processing your request.</h2>
+
+@if (Model.ShowRequestId)
+{
+    <p>
+        <strong>Request ID:</strong> <code>@Model.RequestId</code>
+    </p>
+}
+
+<h3>Development Mode</h3>
+<p>
+    Swapping to <strong>Development</strong> environment will display more detailed information about the error that occurred.
+</p>
+<p>
+    <strong>Development environment should not be enabled in deployed applications</strong>, as it can result in sensitive information from exceptions being displayed to end users. For local debugging, development environment can be enabled by setting the <strong>ASPNETCORE_ENVIRONMENT</strong> environment variable to <strong>Development</strong>, and restarting the application.
+</p>

+ 93 - 0
samples/WebApplicationSample_V3_0/Views/Shared/_Layout.cshtml

@@ -0,0 +1,93 @@
+@using WebApplicationSample_V3_0.Helpers
+<!DOCTYPE html>
+<html>
+<head>
+    <meta charset="utf-8" />
+    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+    <title>@ViewData["Title"] - Payment</title>
+
+    <environment include="Development">
+        <link rel="stylesheet" href="~/lib/bootstrap/dist/css/bootstrap.css" />
+        <link rel="stylesheet" href="~/css/site.css" />
+    </environment>
+    <environment exclude="Development">
+        <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.1.3/css/bootstrap.min.css"
+              asp-fallback-href="~/lib/bootstrap/dist/css/bootstrap.min.css"
+              asp-fallback-test-class="sr-only" asp-fallback-test-property="position" asp-fallback-test-value="absolute"
+              crossorigin="anonymous"
+              integrity="sha256-eSi1q2PG6J7g7ib17yAaWMcrr5GrtohYChqibrV7PBE=" />
+    </environment>
+</head>
+<body>
+    <nav class="navbar navbar-expand-lg navbar-light bg-white navbar-shadow">
+        <div class="container">
+            <a asp-controller="Home" asp-action="Index" class="navbar-brand"><img src="~/images/payment.png" /></a>
+            <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbar" aria-controls="navbar" aria-expanded="false" aria-label="Toggle navigation">
+                <span class="navbar-toggler-icon"></span>
+            </button>
+            <div class="collapse navbar-collapse" id="navbar">
+                <ul class="navbar-nav mr-auto">
+                    <li class="nav-item @Html.IsActive("Alipay")">
+                        <a class="nav-link" asp-controller="Alipay" asp-action="Index">支付宝</a>
+                    </li>
+                    <li class="nav-item @Html.IsActive("WeChatPay")">
+                        <a class="nav-link" asp-controller="WeChatPay" asp-action="Index">微信支付</a>
+                    </li>
+                    <li class="nav-item @Html.IsActive("QPay")">
+                        <a class="nav-link" asp-controller="QPay" asp-action="Index">QQ钱包</a>
+                    </li>
+                    <li class="nav-item @Html.IsActive("JDPay")">
+                        <a class="nav-link" asp-controller="JDPay" asp-action="Index">京东支付</a>
+                    </li>
+                    <li class="nav-item @Html.IsActive("LianLianPay")">
+                        <a class="nav-link" asp-controller="LianLianPay" asp-action="Index">连连支付</a>
+                    </li>
+                    <li class="nav-item @Html.IsActive("UnionPay")">
+                        <a class="nav-link" asp-controller="UnionPay" asp-action="Index">银联支付</a>
+                    </li>
+                </ul>
+                <ul class="navbar-nav navbar-right">
+                    <li class="nav-item @Html.IsActive("Home", "Gratuity")">
+                        <a class="nav-link" asp-controller="Home" asp-action="Gratuity">打赏</a>
+                    </li>
+                </ul>
+            </div>
+        </div>
+    </nav>
+    <div class="container body-content">
+        @RenderBody()
+    </div>
+    <footer>
+        <div class="container">
+            <ul class="list-style-none d-flex">
+                <li class="mr-3"><p>&copy; @DateTime.Now.Year Payment</p></li>
+                <li class="mr-3"><a target="_blank" href="https://github.com/Essensoft/Payment">GitHub</a></li>
+                <li class="mr-3"><a target="_blank" href="https://gitee.com/Essensoft/Payment">Gitee</a></li>
+                <li class="mr-3">Payment 交流群:<a target="_blank" href="https://shang.qq.com/wpa/qunwpa?idkey=aac56c8f02f54893267d3ac90787c1794a7687f3c31a923812a36b67c4ee6271">522457525</a></li>
+            </ul>
+        </div>
+    </footer>
+
+    <environment include="Development">
+        <script src="~/lib/jquery/dist/jquery.js"></script>
+        <script src="~/lib/bootstrap/dist/js/bootstrap.bundle.js"></script>
+    </environment>
+    <environment exclude="Development">
+        <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"
+                asp-fallback-src="~/lib/jquery/dist/jquery.min.js"
+                asp-fallback-test="window.jQuery"
+                crossorigin="anonymous"
+                integrity="sha256-FgpCb/KJQlLNfOu91ta32o/NMZxltwRo8QtmkMRdAu8=">
+        </script>
+        <script src="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.1.3/js/bootstrap.bundle.min.js"
+                asp-fallback-src="~/lib/bootstrap/dist/js/bootstrap.bundle.min.js"
+                asp-fallback-test="window.jQuery && window.jQuery.fn && window.jQuery.fn.modal"
+                crossorigin="anonymous"
+                integrity="sha256-E/V4cWE4qvAeO5MOhjtGtqDzPndRO1LBk8lJ/PR7CA4=">
+        </script>
+    </environment>
+    <script src="~/js/site.js" asp-append-version="true"></script>
+
+    @RenderSection("Scripts", false)
+</body>
+</html>

+ 18 - 0
samples/WebApplicationSample_V3_0/Views/Shared/_ValidationScriptsPartial.cshtml

@@ -0,0 +1,18 @@
+<environment include="Development">
+    <script src="~/lib/jquery-validation/dist/jquery.validate.js"></script>
+    <script src="~/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.js"></script>
+</environment>
+<environment exclude="Development">
+    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery-validate/1.17.0/jquery.validate.min.js"
+            asp-fallback-src="~/lib/jquery-validation/dist/jquery.validate.min.js"
+            asp-fallback-test="window.jQuery && window.jQuery.validator"
+            crossorigin="anonymous"
+            integrity="sha256-F6h55Qw6sweK+t7SiOJX+2bpSAa3b/fnlrVCJvmEj1A=">
+    </script>
+    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery-validation-unobtrusive/3.2.11/jquery.validate.unobtrusive.min.js"
+            asp-fallback-src="~/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.min.js"
+            asp-fallback-test="window.jQuery && window.jQuery.validator && window.jQuery.validator.unobtrusive"
+            crossorigin="anonymous"
+            integrity="sha256-9GycpJnliUjJDVDqP0UEu/bsm9U+3dnQUH8+3W10vkY=">
+    </script>
+</environment>

+ 50 - 0
samples/WebApplicationSample_V3_0/Views/UnionPay/GatewayPayFrontConsume.cshtml

@@ -0,0 +1,50 @@
+@model GatewayPayFrontConsumeFrontConsumeViewModel
+@{
+    ViewData["Title"] = "跳转网关页面支付 - 消费接口";
+}
+<nav aria-label="breadcrumb">
+    <ol class="breadcrumb">
+        <li class="breadcrumb-item"><a asp-controller="UnionPay" asp-action="Index">银联支付</a></li>
+        <li class="breadcrumb-item active" aria-current="page">@ViewData["Title"]</li>
+    </ol>
+</nav>
+<br />
+<div class="card">
+    <div class="card-body">
+        <form asp-controller="UnionPay" asp-action="GatewayPayFrontConsume" target="_blank">
+            <div asp-validation-summary="All" class="text-danger"></div>
+            <div class="form-group">
+                <label asp-for="OrderId"></label>
+                <input type="text" class="form-control" asp-for="OrderId" value="@DateTime.Now.ToString("yyyyMMddHHmmssfff")" />
+            </div>
+            <div class="form-group">
+                <label asp-for="TxnTime"></label>
+                <input type="text" class="form-control" asp-for="TxnTime" value="@DateTime.Now.ToString("yyyyMMddHHmmss")" />
+            </div>
+            <div class="form-group">
+                <label asp-for="TxnAmt"></label>
+                <input type="text" class="form-control" asp-for="TxnAmt" value="1" />
+            </div>
+            <div class="form-group">
+                <label asp-for="CurrencyCode"></label>
+                <input type="text" class="form-control" asp-for="CurrencyCode" value="156" />
+            </div>
+            <div class="form-group">
+                <label asp-for="PayTimeOut"></label>
+                <input type="text" class="form-control" asp-for="PayTimeOut" value="@DateTime.Now.AddDays(7).ToString("yyyyMMddHHmmss")" />
+            </div>
+            <div class="form-group">
+                <label asp-for="FrontUrl"></label>
+                <input type="text" class="form-control" asp-for="FrontUrl" value="http://*/unionpay/gatewaypayfrontconsumereturn" />
+            </div>
+            <div class="form-group">
+                <label asp-for="BackUrl"></label>
+                <input type="text" class="form-control" asp-for="BackUrl" value="http://*/notify/unionpay/gatewaypayfrontconsume" />
+            </div>
+            <button type="submit" class="btn btn-primary">提交请求</button>
+        </form>
+    </div>
+</div>
+@section Scripts {
+    @{await Html.RenderPartialAsync("_ValidationScriptsPartial"); }
+}

+ 15 - 0
samples/WebApplicationSample_V3_0/Views/UnionPay/GatewayPayFrontConsumeReturn.cshtml

@@ -0,0 +1,15 @@
+@{
+    ViewData["Title"] = "网关页面支付 - 同步跳转";
+}
+<nav aria-label="breadcrumb">
+    <ol class="breadcrumb">
+        <li class="breadcrumb-item"><a asp-controller="UnionPay" asp-action="Index">银联支付</a></li>
+        <li class="breadcrumb-item active" aria-current="page">@ViewData["Title"]</li>
+    </ol>
+</nav>
+<br />
+<div class="card">
+    <div class="card-body">
+        @ViewData["response"]
+    </div>
+</div>

+ 28 - 0
samples/WebApplicationSample_V3_0/Views/UnionPay/Index.cshtml

@@ -0,0 +1,28 @@
+@{
+    ViewData["Title"] = "银联支付";
+}
+<nav aria-label="breadcrumb">
+    <ol class="breadcrumb">
+        <li class="breadcrumb-item"><a asp-controller="Home" asp-action="Index">首页</a></li>
+        <li class="breadcrumb-item active" aria-current="page">@ViewData["Title"]</li>
+    </ol>
+</nav>
+<br />
+<table class="table table-bordered table-hover">
+    <thead>
+        <tr>
+            <th scope="col">#</th>
+            <th scope="col">产品</th>
+            <th scope="col">接口</th>
+            <th scope="col">#</th>
+        </tr>
+    </thead>
+    <tbody>
+        <tr>
+            <th scope="row">1</th>
+            <td>网关支付-跳转网关页面支付</td>
+            <td><a href="https://open.unionpay.com/tjweb/acproduct/APIList?acpAPIId=275&&apiservId=448&&version=V2.2" target="_blank">消费接口</a></td>
+            <td><a asp-controller="UnionPay" asp-action="GatewayPayFrontConsume">立即测试</a></td>
+        </tr>
+    </tbody>
+</table>

+ 57 - 0
samples/WebApplicationSample_V3_0/Views/WeChatPay/AppPay.cshtml

@@ -0,0 +1,57 @@
+@model WeChatPayAppPayViewModel
+@{
+    ViewData["Title"] = "APP支付-统一下单";
+}
+<nav aria-label="breadcrumb">
+    <ol class="breadcrumb">
+        <li class="breadcrumb-item"><a asp-controller="WeChatPay" asp-action="Index">微信支付</a></li>
+        <li class="breadcrumb-item active" aria-current="page">@ViewData["Title"]</li>
+    </ol>
+</nav>
+<br />
+<div class="card">
+    <div class="card-body">
+        <form asp-controller="WeChatPay" asp-action="AppPay">
+            <div asp-validation-summary="All" class="text-danger"></div>
+            <div class="form-group">
+                <label asp-for="OutTradeNo"></label>
+                <input type="text" class="form-control" asp-for="OutTradeNo" value="@DateTime.Now.ToString("yyyyMMddHHmmssfff")" />
+            </div>
+            <div class="form-group">
+                <label asp-for="Body"></label>
+                <input type="text" class="form-control" asp-for="Body" value="微信APP支付测试" />
+            </div>
+            <div class="form-group">
+                <label asp-for="TotalFee"></label>
+                <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" />
+            </div>
+            <div class="form-group">
+                <label asp-for="NotifyUrl"></label>
+                <input type="text" class="form-control" asp-for="NotifyUrl" value="http://*/notify/wechatpay/unifiedorder" />
+            </div>
+            <div class="form-group">
+                <label asp-for="TradeType"></label>
+                <input type="text" class="form-control" asp-for="TradeType" value="APP" />
+            </div>
+            <button type="submit" class="btn btn-primary">提交请求</button>
+        </form>
+        <hr />
+        <form class="form-horizontal">
+            <div class="form-group">
+                <label>Response:</label>
+                <textarea class="form-control" rows="10">@ViewData["response"]</textarea>
+            </div>
+            <div class="form-group">
+                <label>Parameter:</label>
+                <textarea class="form-control" rows="3">@ViewData["parameter"]</textarea>
+            </div>
+        </form>
+    </div>
+</div>
+@section Scripts {
+    @{await Html.RenderPartialAsync("_ValidationScriptsPartial"); }
+}

+ 33 - 0
samples/WebApplicationSample_V3_0/Views/WeChatPay/CloseOrder.cshtml

@@ -0,0 +1,33 @@
+@model WeChatPayCloseOrderViewModel
+@{
+    ViewData["Title"] = "关闭订单";
+}
+<nav aria-label="breadcrumb">
+    <ol class="breadcrumb">
+        <li class="breadcrumb-item"><a asp-controller="WeChatPay" asp-action="Index">微信支付</a></li>
+        <li class="breadcrumb-item active" aria-current="page">@ViewData["Title"]</li>
+    </ol>
+</nav>
+<br />
+<div class="card">
+    <div class="card-body">
+        <form asp-controller="WeChatPay" asp-action="CloseOrder">
+            <div asp-validation-summary="All" class="text-danger"></div>
+            <div class="form-group">
+                <label asp-for="OutTradeNo"></label>
+                <input type="text" class="form-control" asp-for="OutTradeNo" />
+            </div>
+            <button type="submit" class="btn btn-primary">提交请求</button>
+        </form>
+        <hr />
+        <form class="form-horizontal">
+            <div class="form-group">
+                <label>Response:</label>
+                <textarea class="form-control" rows="10">@ViewData["response"]</textarea>
+            </div>
+        </form>
+    </div>
+</div>
+@section Scripts {
+    @{await Html.RenderPartialAsync("_ValidationScriptsPartial"); }
+}

+ 41 - 0
samples/WebApplicationSample_V3_0/Views/WeChatPay/DownloadBill.cshtml

@@ -0,0 +1,41 @@
+@model WeChatPayDownloadBillViewModel
+@{
+    ViewData["Title"] = "下载对账单";
+}
+<nav aria-label="breadcrumb">
+    <ol class="breadcrumb">
+        <li class="breadcrumb-item"><a asp-controller="WeChatPay" asp-action="Index">微信支付</a></li>
+        <li class="breadcrumb-item active" aria-current="page">@ViewData["Title"]</li>
+    </ol>
+</nav>
+<br />
+<div class="card">
+    <div class="card-body">
+        <form asp-controller="WeChatPay" asp-action="DownloadBill">
+            <div asp-validation-summary="All" class="text-danger"></div>
+            <div class="form-group">
+                <label asp-for="BillDate"></label>
+                <input type="text" class="form-control" asp-for="BillDate" />
+            </div>
+            <div class="form-group">
+                <label asp-for="BillType"></label>
+                <input type="text" class="form-control" asp-for="BillType" value="ALL" />
+            </div>
+            <div class="form-group">
+                <label asp-for="TarType"></label>
+                <input type="text" class="form-control" asp-for="TarType" />
+            </div>
+            <button type="submit" class="btn btn-primary">提交请求</button>
+        </form>
+        <hr />
+        <form class="form-horizontal">
+            <div class="form-group">
+                <label>Response:</label>
+                <textarea class="form-control" rows="10">@ViewData["response"]</textarea>
+            </div>
+        </form>
+    </div>
+</div>
+@section Scripts {
+    @{await Html.RenderPartialAsync("_ValidationScriptsPartial"); }
+}

+ 41 - 0
samples/WebApplicationSample_V3_0/Views/WeChatPay/DownloadFundFlow.cshtml

@@ -0,0 +1,41 @@
+@model WeChatPayDownloadFundFlowViewModel
+@{
+    ViewData["Title"] = "下载资金账单";
+}
+<nav aria-label="breadcrumb">
+    <ol class="breadcrumb">
+        <li class="breadcrumb-item"><a asp-controller="WeChatPay" asp-action="Index">微信支付</a></li>
+        <li class="breadcrumb-item active" aria-current="page">@ViewData["Title"]</li>
+    </ol>
+</nav>
+<br />
+<div class="card">
+    <div class="card-body">
+        <form asp-controller="WeChatPay" asp-action="DownloadFundFlow">
+            <div asp-validation-summary="All" class="text-danger"></div>
+            <div class="form-group">
+                <label asp-for="BillDate"></label>
+                <input type="text" class="form-control" asp-for="BillDate" />
+            </div>
+            <div class="form-group">
+                <label asp-for="AccountType"></label>
+                <input type="text" class="form-control" asp-for="AccountType" value="Basic" />
+            </div>
+            <div class="form-group">
+                <label asp-for="TarType"></label>
+                <input type="text" class="form-control" asp-for="TarType" />
+            </div>
+            <button type="submit" class="btn btn-primary">提交请求</button>
+        </form>
+        <hr />
+        <form class="form-horizontal">
+            <div class="form-group">
+                <label>Response:</label>
+                <textarea class="form-control" rows="10">@ViewData["response"]</textarea>
+            </div>
+        </form>
+    </div>
+</div>
+@section Scripts {
+    @{await Html.RenderPartialAsync("_ValidationScriptsPartial"); }
+}

+ 24 - 0
samples/WebApplicationSample_V3_0/Views/WeChatPay/GetPublicKey.cshtml

@@ -0,0 +1,24 @@
+@{
+    ViewData["Title"] = "获取RSA加密公钥";
+}
+<nav aria-label="breadcrumb">
+    <ol class="breadcrumb">
+        <li class="breadcrumb-item"><a asp-controller="WeChatPay" asp-action="Index">微信支付</a></li>
+        <li class="breadcrumb-item active" aria-current="page">@ViewData["Title"]</li>
+    </ol>
+</nav>
+<br />
+<div class="card">
+    <div class="card-body">
+        <form asp-controller="WeChatPay" asp-action="GetPublicKey">
+            <button type="submit" class="btn btn-primary">提交请求</button>
+        </form>
+        <hr />
+        <form class="form-horizontal">
+            <div class="form-group">
+                <label>Response:</label>
+                <textarea class="form-control" rows="10">@ViewData["response"]</textarea>
+            </div>
+        </form>
+    </div>
+</div>

+ 33 - 0
samples/WebApplicationSample_V3_0/Views/WeChatPay/GetTransferInfo.cshtml

@@ -0,0 +1,33 @@
+@model WeChatPayGetTransferInfoViewModel
+@{
+    ViewData["Title"] = "查询企业付款";
+}
+<nav aria-label="breadcrumb">
+    <ol class="breadcrumb">
+        <li class="breadcrumb-item"><a asp-controller="WeChatPay" asp-action="Index">微信支付</a></li>
+        <li class="breadcrumb-item active" aria-current="page">@ViewData["Title"]</li>
+    </ol>
+</nav>
+<br />
+<div class="card">
+    <div class="card-body">
+        <form asp-controller="WeChatPay" asp-action="GetTransferInfo">
+            <div asp-validation-summary="All" class="text-danger"></div>
+            <div class="form-group">
+                <label asp-for="PartnerTradeNo"></label>
+                <input type="text" class="form-control" asp-for="PartnerTradeNo" />
+            </div>
+            <button type="submit" class="btn btn-primary">提交请求</button>
+        </form>
+        <hr />
+        <form class="form-horizontal">
+            <div class="form-group">
+                <label>Response:</label>
+                <textarea class="form-control" rows="10">@ViewData["response"]</textarea>
+            </div>
+        </form>
+    </div>
+</div>
+@section Scripts {
+    @{await Html.RenderPartialAsync("_ValidationScriptsPartial"); }
+}

+ 53 - 0
samples/WebApplicationSample_V3_0/Views/WeChatPay/H5Pay.cshtml

@@ -0,0 +1,53 @@
+@model WeChatPayH5PayViewModel
+@{
+    ViewData["Title"] = "H5支付-统一下单";
+}
+<nav aria-label="breadcrumb">
+    <ol class="breadcrumb">
+        <li class="breadcrumb-item"><a asp-controller="WeChatPay" asp-action="Index">微信支付</a></li>
+        <li class="breadcrumb-item active" aria-current="page">@ViewData["Title"]</li>
+    </ol>
+</nav>
+<br />
+<div class="card">
+    <div class="card-body">
+        <form asp-controller="WeChatPay" asp-action="H5Pay">
+            <div asp-validation-summary="All" class="text-danger"></div>
+            <div class="form-group">
+                <label asp-for="OutTradeNo"></label>
+                <input type="text" class="form-control" asp-for="OutTradeNo" value="@DateTime.Now.ToString("yyyyMMddHHmmssfff")" />
+            </div>
+            <div class="form-group">
+                <label asp-for="Body"></label>
+                <input type="text" class="form-control" asp-for="Body" value="微信H5支付测试" />
+            </div>
+            <div class="form-group">
+                <label asp-for="TotalFee"></label>
+                <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" />
+            </div>
+            <div class="form-group">
+                <label asp-for="NotifyUrl"></label>
+                <input type="text" class="form-control" asp-for="NotifyUrl" value="http://*/notify/wechatpay/unifiedorder" />
+            </div>
+            <div class="form-group">
+                <label asp-for="TradeType"></label>
+                <input type="text" class="form-control" asp-for="TradeType" value="MWEB" />
+            </div>
+            <button type="submit" class="btn btn-primary">提交请求</button>
+        </form>
+        <hr />
+        <form class="form-horizontal">
+            <div class="form-group">
+                <label>Response:</label>
+                <textarea class="form-control" rows="10">@ViewData["response"]</textarea>
+            </div>
+        </form>
+    </div>
+</div>
+@section Scripts {
+    @{await Html.RenderPartialAsync("_ValidationScriptsPartial"); }
+}

+ 130 - 0
samples/WebApplicationSample_V3_0/Views/WeChatPay/Index.cshtml

@@ -0,0 +1,130 @@
+@{
+    ViewData["Title"] = "微信支付";
+}
+<nav aria-label="breadcrumb">
+    <ol class="breadcrumb">
+        <li class="breadcrumb-item"><a asp-controller="Home" asp-action="Index">首页</a></li>
+        <li class="breadcrumb-item active" aria-current="page">@ViewData["Title"]</li>
+    </ol>
+</nav>
+<br />
+<table class="table table-bordered table-hover">
+    <thead>
+        <tr>
+            <th scope="col">#</th>
+            <th scope="col">产品</th>
+            <th scope="col">接口</th>
+            <th scope="col">#</th>
+        </tr>
+    </thead>
+    <tbody>
+        <tr>
+            <th scope="row">1</th>
+            <td>刷卡支付-提交刷卡支付</td>
+            <td><a href="https://pay.weixin.qq.com/wiki/doc/api/micropay.php?chapter=9_10&index=1" target="_blank">https://api.mch.weixin.qq.com/pay/micropay</a></td>
+            <td><a asp-controller="WeChatPay" asp-action="MicroPay">立即测试</a></td>
+        </tr>
+        <tr>
+            <th scope="row">2</th>
+            <td>公众号支付-统一下单</td>
+            <td><a href="https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_1" target="_blank">https://api.mch.weixin.qq.com/pay/unifiedorder</a></td>
+            <td><a asp-controller="WeChatPay" asp-action="PubPay">立即测试</a></td>
+        </tr>
+        <tr>
+            <th scope="row">3</th>
+            <td>扫码支付-统一下单</td>
+            <td><a href="https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=9_1" target="_blank">https://api.mch.weixin.qq.com/pay/unifiedorder</a></td>
+            <td><a asp-controller="WeChatPay" asp-action="QrCodePay">立即测试</a></td>
+        </tr>
+        <tr>
+            <th scope="row">4</th>
+            <td>APP支付-统一下单</td>
+            <td><a href="https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=9_1" target="_blank">https://api.mch.weixin.qq.com/pay/unifiedorder</a></td>
+            <td><a asp-controller="WeChatPay" asp-action="AppPay">立即测试</a></td>
+        </tr>
+        <tr>
+            <th scope="row">5</th>
+            <td>H5支付-统一下单</td>
+            <td><a href="https://pay.weixin.qq.com/wiki/doc/api/H5.php?chapter=9_20&index=1" target="_blank">https://api.mch.weixin.qq.com/pay/unifiedorder</a></td>
+            <td><a asp-controller="WeChatPay" asp-action="H5Pay">立即测试</a></td>
+        </tr>
+        <tr>
+            <th scope="row">6</th>
+            <td>小程序支付-统一下单</td>
+            <td><a href="https://pay.weixin.qq.com/wiki/doc/api/wxa/wxa_api.php?chapter=9_1" target="_blank">https://api.mch.weixin.qq.com/pay/unifiedorder</a></td>
+            <td><a asp-controller="WeChatPay" asp-action="LiteAppPay">立即测试</a></td>
+        </tr>
+        <tr>
+            <th scope="row">7</th>
+            <td>查询订单</td>
+            <td><a href="https://pay.weixin.qq.com/wiki/doc/api/micropay.php?chapter=9_2" target="_blank">https://api.mch.weixin.qq.com/pay/orderquery</a></td>
+            <td><a asp-controller="WeChatPay" asp-action="OrderQuery">立即测试</a></td>
+        </tr>
+        <tr>
+            <th scope="row">8</th>
+            <td>撤销订单</td>
+            <td><a href="https://pay.weixin.qq.com/wiki/doc/api/micropay.php?chapter=9_11&index=3" target="_blank">https://api.mch.weixin.qq.com/secapi/pay/reverse</a></td>
+            <td><a asp-controller="WeChatPay" asp-action="Reverse">立即测试</a></td>
+        </tr>
+        <tr>
+            <th scope="row">9</th>
+            <td>关闭订单</td>
+            <td><a href="https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=9_3" target="_blank">https://api.mch.weixin.qq.com/pay/closeorder</a></td>
+            <td><a asp-controller="WeChatPay" asp-action="CloseOrder">立即测试</a></td>
+        </tr>
+        <tr>
+            <th scope="row">10</th>
+            <td>申请退款</td>
+            <td><a href="https://pay.weixin.qq.com/wiki/doc/api/micropay.php?chapter=9_4" target="_blank">https://api.mch.weixin.qq.com/secapi/pay/refund</a></td>
+            <td><a asp-controller="WeChatPay" asp-action="Refund">立即测试</a></td>
+        </tr>
+        <tr>
+            <th scope="row">11</th>
+            <td>查询退款</td>
+            <td><a href="https://pay.weixin.qq.com/wiki/doc/api/micropay.php?chapter=9_5" target="_blank">https://api.mch.weixin.qq.com/pay/refundquery</a></td>
+            <td><a asp-controller="WeChatPay" asp-action="RefundQuery">立即测试</a></td>
+        </tr>
+        <tr>
+            <th scope="row">12</th>
+            <td>下载对账单</td>
+            <td><a href="https://pay.weixin.qq.com/wiki/doc/api/micropay.php?chapter=9_6" target="_blank">https://api.mch.weixin.qq.com/pay/downloadbill</a></td>
+            <td><a asp-controller="WeChatPay" asp-action="DownloadBill">立即测试</a></td>
+        </tr>
+        <tr>
+            <th scope="row">13</th>
+            <td>下载资金账单</td>
+            <td><a href="https://pay.weixin.qq.com/wiki/doc/api/micropay.php?chapter=9_18&index=7" target="_blank">https://api.mch.weixin.qq.com/pay/downloadfundflow</a></td>
+            <td><a asp-controller="WeChatPay" asp-action="DownloadFundFlow">立即测试</a></td>
+        </tr>
+        <tr>
+            <th scope="row">14</th>
+            <td>企业付款到零钱</td>
+            <td><a href="https://pay.weixin.qq.com/wiki/doc/api/tools/mch_pay.php?chapter=14_2" target="_blank">https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfers</a></td>
+            <td><a asp-controller="WeChatPay" asp-action="Transfers">立即测试</a></td>
+        </tr>
+        <tr>
+            <th scope="row">15</th>
+            <td>查询企业付款零钱</td>
+            <td><a href="https://pay.weixin.qq.com/wiki/doc/api/tools/mch_pay.php?chapter=14_3" target="_blank">https://api.mch.weixin.qq.com/mmpaymkttransfers/gettransferinfo</a></td>
+            <td><a asp-controller="WeChatPay" asp-action="GetTransferInfo">立即测试</a></td>
+        </tr>
+        <tr>
+            <th scope="row">16</th>
+            <td>企业付款到银行卡</td>
+            <td><a href="https://pay.weixin.qq.com/wiki/doc/api/tools/mch_pay.php?chapter=24_2" target="_blank">https://api.mch.weixin.qq.com/mmpaysptrans/pay_bank</a></td>
+            <td><a asp-controller="WeChatPay" asp-action="PayBank">立即测试</a></td>
+        </tr>
+        <tr>
+            <th scope="row">17</th>
+            <td>查询企业付款银行卡</td>
+            <td><a href="https://pay.weixin.qq.com/wiki/doc/api/tools/mch_pay.php?chapter=24_3" target="_blank">https://api.mch.weixin.qq.com/mmpaysptrans/query_bank</a></td>
+            <td><a asp-controller="WeChatPay" asp-action="QueryBank">立即测试</a></td>
+        </tr>
+        <tr>
+            <th scope="row">18</th>
+            <td>获取RSA加密公钥</td>
+            <td><a href="https://pay.weixin.qq.com/wiki/doc/api/tools/mch_pay.php?chapter=24_7&index=4" target="_blank">https://fraud.mch.weixin.qq.com/risk/getpublickey</a></td>
+            <td><a asp-controller="WeChatPay" asp-action="GetPublicKey">立即测试</a></td>
+        </tr>
+    </tbody>
+</table>

+ 61 - 0
samples/WebApplicationSample_V3_0/Views/WeChatPay/LiteAppPay.cshtml

@@ -0,0 +1,61 @@
+@model WeChatPayLiteAppPayViewModel
+@{
+    ViewData["Title"] = "小程序支付-统一下单";
+}
+<nav aria-label="breadcrumb">
+    <ol class="breadcrumb">
+        <li class="breadcrumb-item"><a asp-controller="WeChatPay" asp-action="Index">微信支付</a></li>
+        <li class="breadcrumb-item active" aria-current="page">@ViewData["Title"]</li>
+    </ol>
+</nav>
+<br />
+<div class="card">
+    <div class="card-body">
+        <form asp-controller="WeChatPay" asp-action="LiteAppPay">
+            <div asp-validation-summary="All" class="text-danger"></div>
+            <div class="form-group">
+                <label asp-for="OutTradeNo"></label>
+                <input type="text" class="form-control" asp-for="OutTradeNo" value="@DateTime.Now.ToString("yyyyMMddHHmmssfff")" />
+            </div>
+            <div class="form-group">
+                <label asp-for="Body"></label>
+                <input type="text" class="form-control" asp-for="Body" value="微信小程序支付测试" />
+            </div>
+            <div class="form-group">
+                <label asp-for="TotalFee"></label>
+                <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" />
+            </div>
+            <div class="form-group">
+                <label asp-for="NotifyUrl"></label>
+                <input type="text" class="form-control" asp-for="NotifyUrl" value="http://*/notify/wechatpay/unifiedorder" />
+            </div>
+            <div class="form-group">
+                <label asp-for="TradeType"></label>
+                <input type="text" class="form-control" asp-for="TradeType" value="JSAPI" />
+            </div>
+            <div class="form-group">
+                <label asp-for="OpenId"></label>
+                <input type="text" class="form-control" asp-for="OpenId" />
+            </div>
+            <button type="submit" class="btn btn-primary">提交请求</button>
+        </form>
+        <hr />
+        <form class="form-horizontal">
+            <div class="form-group">
+                <label>Response:</label>
+                <textarea class="form-control" rows="10">@ViewData["response"]</textarea>
+            </div>
+            <div class="form-group">
+                <label>Parameter:</label>
+                <textarea class="form-control" rows="3">@ViewData["parameter"]</textarea>
+            </div>
+        </form>
+    </div>
+</div>
+@section Scripts {
+    @{await Html.RenderPartialAsync("_ValidationScriptsPartial"); }
+}

+ 49 - 0
samples/WebApplicationSample_V3_0/Views/WeChatPay/MicroPay.cshtml

@@ -0,0 +1,49 @@
+@model WeChatPayMicroPayViewModel
+@{
+    ViewData["Title"] = "刷卡支付-提交刷卡支付";
+}
+<nav aria-label="breadcrumb">
+    <ol class="breadcrumb">
+        <li class="breadcrumb-item"><a asp-controller="WeChatPay" asp-action="Index">微信支付</a></li>
+        <li class="breadcrumb-item active" aria-current="page">@ViewData["Title"]</li>
+    </ol>
+</nav>
+<br />
+<div class="card">
+    <div class="card-body">
+        <form asp-controller="WeChatPay" asp-action="MicroPay">
+            <div asp-validation-summary="All" class="text-danger"></div>
+            <div class="form-group">
+                <label asp-for="OutTradeNo"></label>
+                <input type="text" class="form-control" asp-for="OutTradeNo" value="@DateTime.Now.ToString("yyyyMMddHHmmssfff")" />
+            </div>
+            <div class="form-group">
+                <label asp-for="Body"></label>
+                <input type="text" class="form-control" asp-for="Body" value="微信刷卡支付测试" />
+            </div>
+            <div class="form-group">
+                <label asp-for="TotalFee"></label>
+                <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" />
+            </div>
+            <div class="form-group">
+                <label asp-for="AuthCode"></label>
+                <input type="text" class="form-control" asp-for="AuthCode" />
+            </div>
+            <button type="submit" class="btn btn-primary">提交请求</button>
+        </form>
+        <hr />
+        <form class="form-horizontal">
+            <div class="form-group">
+                <label>Response:</label>
+                <textarea class="form-control" rows="10">@ViewData["response"]</textarea>
+            </div>
+        </form>
+    </div>
+</div>
+@section Scripts {
+    @{await Html.RenderPartialAsync("_ValidationScriptsPartial"); }
+}

+ 37 - 0
samples/WebApplicationSample_V3_0/Views/WeChatPay/OrderQuery.cshtml

@@ -0,0 +1,37 @@
+@model WeChatPayOrderQueryViewModel
+@{
+    ViewData["Title"] = "查询订单";
+}
+<nav aria-label="breadcrumb">
+    <ol class="breadcrumb">
+        <li class="breadcrumb-item"><a asp-controller="WeChatPay" asp-action="Index">微信支付</a></li>
+        <li class="breadcrumb-item active" aria-current="page">@ViewData["Title"]</li>
+    </ol>
+</nav>
+<br />
+<div class="card">
+    <div class="card-body">
+        <form asp-controller="WeChatPay" asp-action="OrderQuery">
+            <div asp-validation-summary="All" class="text-danger"></div>
+            <div class="form-group">
+                <label asp-for="TransactionId"></label>
+                <input type="text" class="form-control" asp-for="TransactionId" />
+            </div>
+            <div class="form-group">
+                <label asp-for="OutTradeNo"></label>
+                <input type="text" class="form-control" asp-for="OutTradeNo" />
+            </div>
+            <button type="submit" class="btn btn-primary">提交请求</button>
+        </form>
+        <hr />
+        <form class="form-horizontal">
+            <div class="form-group">
+                <label>Response:</label>
+                <textarea class="form-control" rows="10">@ViewData["response"]</textarea>
+            </div>
+        </form>
+    </div>
+</div>
+@section Scripts {
+    @{await Html.RenderPartialAsync("_ValidationScriptsPartial"); }
+}

+ 53 - 0
samples/WebApplicationSample_V3_0/Views/WeChatPay/PayBank.cshtml

@@ -0,0 +1,53 @@
+@model WeChatPayPayBankViewModel
+@{
+    ViewData["Title"] = "企业付款到银行卡";
+}
+<nav aria-label="breadcrumb">
+    <ol class="breadcrumb">
+        <li class="breadcrumb-item"><a asp-controller="WeChatPay" asp-action="Index">微信支付</a></li>
+        <li class="breadcrumb-item active" aria-current="page">@ViewData["Title"]</li>
+    </ol>
+</nav>
+<br />
+<div class="card">
+    <div class="card-body">
+        <form asp-controller="WeChatPay" asp-action="PayBank">
+            <div asp-validation-summary="All" class="text-danger"></div>
+            <div class="form-group">
+                <label asp-for="PartnerTradeNo"></label>
+                <input type="text" class="form-control" asp-for="PartnerTradeNo" value="@DateTime.Now.ToString("yyyyMMddHHmmssfff")" />
+            </div>
+            <div class="form-group">
+                <label asp-for="EncBankNo"></label>
+                <input type="text" class="form-control" asp-for="EncBankNo" />
+            </div>
+            <div class="form-group">
+                <label asp-for="EncTrueName"></label>
+                <input type="text" class="form-control" asp-for="EncTrueName" />
+            </div>
+            <div class="form-group">
+                <label asp-for="BankCode"></label>
+                <input type="text" class="form-control" asp-for="BankCode" />
+            </div>
+            <div class="form-group">
+                <label asp-for="Amount"></label>
+                <input type="text" class="form-control" asp-for="Amount" value="100" />
+            </div>
+            <div class="form-group">
+                <label asp-for="Desc"></label>
+                <input type="text" class="form-control" asp-for="Desc" value="企业付款到银行卡付款说明" />
+            </div>
+            <button type="submit" class="btn btn-primary">提交请求</button>
+        </form>
+        <hr />
+        <form class="form-horizontal">
+            <div class="form-group">
+                <label>Response:</label>
+                <textarea class="form-control" rows="10">@ViewData["response"]</textarea>
+            </div>
+        </form>
+    </div>
+</div>
+@section Scripts {
+    @{await Html.RenderPartialAsync("_ValidationScriptsPartial"); }
+}

+ 61 - 0
samples/WebApplicationSample_V3_0/Views/WeChatPay/PubPay.cshtml

@@ -0,0 +1,61 @@
+@model WeChatPayPubPayViewModel
+@{
+    ViewData["Title"] = "公众号支付-统一下单";
+}
+<nav aria-label="breadcrumb">
+    <ol class="breadcrumb">
+        <li class="breadcrumb-item"><a asp-controller="WeChatPay" asp-action="Index">微信支付</a></li>
+        <li class="breadcrumb-item active" aria-current="page">@ViewData["Title"]</li>
+    </ol>
+</nav>
+<br />
+<div class="card">
+    <div class="card-body">
+        <form asp-controller="WeChatPay" asp-action="PubPay">
+            <div asp-validation-summary="All" class="text-danger"></div>
+            <div class="form-group">
+                <label asp-for="OutTradeNo"></label>
+                <input type="text" class="form-control" asp-for="OutTradeNo" value="@DateTime.Now.ToString("yyyyMMddHHmmssfff")" />
+            </div>
+            <div class="form-group">
+                <label asp-for="Body"></label>
+                <input type="text" class="form-control" asp-for="Body" value="微信公众号支付测试" />
+            </div>
+            <div class="form-group">
+                <label asp-for="TotalFee"></label>
+                <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" />
+            </div>
+            <div class="form-group">
+                <label asp-for="NotifyUrl"></label>
+                <input type="text" class="form-control" asp-for="NotifyUrl" value="http://*/notify/wechatpay/unifiedorder" />
+            </div>
+            <div class="form-group">
+                <label asp-for="TradeType"></label>
+                <input type="text" class="form-control" asp-for="TradeType" value="JSAPI" />
+            </div>
+            <div class="form-group">
+                <label asp-for="OpenId"></label>
+                <input type="text" class="form-control" asp-for="OpenId" />
+            </div>
+            <button type="submit" class="btn btn-primary">提交请求</button>
+        </form>
+        <hr />
+        <form class="form-horizontal">
+            <div class="form-group">
+                <label>Response:</label>
+                <textarea class="form-control" rows="10">@ViewData["response"]</textarea>
+            </div>
+            <div class="form-group">
+                <label>Parameter:</label>
+                <textarea class="form-control" rows="3">@ViewData["parameter"]</textarea>
+            </div>
+        </form>
+    </div>
+</div>
+@section Scripts {
+    @{await Html.RenderPartialAsync("_ValidationScriptsPartial"); }
+}

+ 60 - 0
samples/WebApplicationSample_V3_0/Views/WeChatPay/QrCodePay.cshtml

@@ -0,0 +1,60 @@
+@model WeChatPayQrCodePayViewModel
+@{
+    ViewData["Title"] = "扫码支付-统一下单";
+}
+<nav aria-label="breadcrumb">
+    <ol class="breadcrumb">
+        <li class="breadcrumb-item"><a asp-controller="WeChatPay" asp-action="Index">微信支付</a></li>
+        <li class="breadcrumb-item active" aria-current="page">@ViewData["Title"]</li>
+    </ol>
+</nav>
+<br />
+<div class="card">
+    <div class="card-body">
+        <form asp-controller="WeChatPay" asp-action="QrCodePay">
+            <div asp-validation-summary="All" class="text-danger"></div>
+            <div class="form-group">
+                <label asp-for="OutTradeNo"></label>
+                <input type="text" class="form-control" asp-for="OutTradeNo" value="@DateTime.Now.ToString("yyyyMMddHHmmssfff")">
+            </div>
+            <div class="form-group">
+                <label asp-for="Body"></label>
+                <input type="text" class="form-control" asp-for="Body" value="微信扫码支付测试">
+            </div>
+            <div class="form-group">
+                <label asp-for="TotalFee"></label>
+                <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">
+            </div>
+            <div class="form-group">
+                <label asp-for="NotifyUrl"></label>
+                <input type="text" class="form-control" asp-for="NotifyUrl" value="http://*/notify/wechatpay/unifiedorder">
+            </div>
+            <div class="form-group">
+                <label asp-for="TradeType"></label>
+                <input type="text" class="form-control" asp-for="TradeType" value="NATIVE">
+            </div>
+            <button type="submit" class="btn btn-primary">提交请求</button>
+        </form>
+        <hr />
+        <form class="form-horizontal">
+            <div class="form-group">
+                <label>QrCode:</label>
+                @if (!string.IsNullOrEmpty(ViewData["qrcode"] as string))
+                {
+                    <embed src="../Home/QrCode?size=168&data=@ViewData["qrcode"]" width="168" height="168" type="image/svg+xml" />
+                }
+            </div>
+            <div class="form-group">
+                <label>Response:</label>
+                <textarea class="form-control" rows="10">@ViewData["response"]</textarea>
+            </div>
+        </form>
+    </div>
+</div>
+@section Scripts {
+    @{await Html.RenderPartialAsync("_ValidationScriptsPartial"); }
+}

+ 33 - 0
samples/WebApplicationSample_V3_0/Views/WeChatPay/QueryBank.cshtml

@@ -0,0 +1,33 @@
+@model WeChatPayQueryBankViewModel
+@{
+    ViewData["Title"] = "查询企业付款银行卡";
+}
+<nav aria-label="breadcrumb">
+    <ol class="breadcrumb">
+        <li class="breadcrumb-item"><a asp-controller="WeChatPay" asp-action="Index">微信支付</a></li>
+        <li class="breadcrumb-item active" aria-current="page">@ViewData["Title"]</li>
+    </ol>
+</nav>
+<br />
+<div class="card">
+    <div class="card-body">
+        <form asp-controller="WeChatPay" asp-action="QueryBank">
+            <div asp-validation-summary="All" class="text-danger"></div>
+            <div class="form-group">
+                <label asp-for="PartnerTradeNo"></label>
+                <input type="text" class="form-control" asp-for="PartnerTradeNo" />
+            </div>
+            <button type="submit" class="btn btn-primary">提交请求</button>
+        </form>
+        <hr />
+        <form class="form-horizontal">
+            <div class="form-group">
+                <label>Response:</label>
+                <textarea class="form-control" rows="10">@ViewData["response"]</textarea>
+            </div>
+        </form>
+    </div>
+</div>
+@section Scripts {
+    @{await Html.RenderPartialAsync("_ValidationScriptsPartial"); }
+}

+ 57 - 0
samples/WebApplicationSample_V3_0/Views/WeChatPay/Refund.cshtml

@@ -0,0 +1,57 @@
+@model WeChatPayRefundViewModel
+@{
+    ViewData["Title"] = "申请退款";
+}
+<nav aria-label="breadcrumb">
+    <ol class="breadcrumb">
+        <li class="breadcrumb-item"><a asp-controller="WeChatPay" asp-action="Index">微信支付</a></li>
+        <li class="breadcrumb-item active" aria-current="page">@ViewData["Title"]</li>
+    </ol>
+</nav>
+<br />
+<div class="card">
+    <div class="card-body">
+        <form asp-controller="WeChatPay" asp-action="Refund">
+            <div asp-validation-summary="All" class="text-danger"></div>
+            <div class="form-group">
+                <label asp-for="OutRefundNo"></label>
+                <input type="text" class="form-control" asp-for="OutRefundNo" value="@DateTime.Now.ToString("yyyyMMddHHmmssfff")" />
+            </div>
+            <div class="form-group">
+                <label asp-for="TransactionId"></label>
+                <input type="text" class="form-control" asp-for="TransactionId" />
+            </div>
+            <div class="form-group">
+                <label asp-for="OutTradeNo"></label>
+                <input type="text" class="form-control" asp-for="OutTradeNo" />
+            </div>
+            <div class="form-group">
+                <label asp-for="TotalFee"></label>
+                <input type="text" class="form-control" asp-for="TotalFee" />
+            </div>
+            <div class="form-group">
+                <label asp-for="RefundFee"></label>
+                <input type="text" class="form-control" asp-for="RefundFee" />
+            </div>
+            <div class="form-group">
+                <label asp-for="RefundDesc"></label>
+                <input type="text" class="form-control" asp-for="RefundDesc" />
+            </div>
+            <div class="form-group">
+                <label asp-for="NotifyUrl"></label>
+                <input type="text" class="form-control" asp-for="NotifyUrl" />
+            </div>
+            <button type="submit" class="btn btn-primary">提交请求</button>
+        </form>
+        <hr />
+        <form class="form-horizontal">
+            <div class="form-group">
+                <label>Response:</label>
+                <textarea class="form-control" rows="10">@ViewData["response"]</textarea>
+            </div>
+        </form>
+    </div>
+</div>
+@section Scripts {
+    @{await Html.RenderPartialAsync("_ValidationScriptsPartial"); }
+}

+ 45 - 0
samples/WebApplicationSample_V3_0/Views/WeChatPay/RefundQuery.cshtml

@@ -0,0 +1,45 @@
+@model WeChatPayRefundQueryViewModel
+@{
+    ViewData["Title"] = "查询退款";
+}
+<nav aria-label="breadcrumb">
+    <ol class="breadcrumb">
+        <li class="breadcrumb-item"><a asp-controller="WeChatPay" asp-action="Index">微信支付</a></li>
+        <li class="breadcrumb-item active" aria-current="page">@ViewData["Title"]</li>
+    </ol>
+</nav>
+<br />
+<div class="card">
+    <div class="card-body">
+        <form asp-controller="WeChatPay" asp-action="RefundQuery">
+            <div asp-validation-summary="All" class="text-danger"></div>
+            <div class="form-group">
+                <label asp-for="TransactionId"></label>
+                <input type="text" class="form-control" asp-for="TransactionId" />
+            </div>
+            <div class="form-group">
+                <label asp-for="OutTradeNo"></label>
+                <input type="text" class="form-control" asp-for="OutTradeNo" />
+            </div>
+            <div class="form-group">
+                <label asp-for="OutRefundNo"></label>
+                <input type="text" class="form-control" asp-for="OutRefundNo" />
+            </div>
+            <div class="form-group">
+                <label asp-for="RefundId"></label>
+                <input type="text" class="form-control" asp-for="RefundId" />
+            </div>
+            <button type="submit" class="btn btn-primary">提交请求</button>
+        </form>
+        <hr />
+        <form class="form-horizontal">
+            <div class="form-group">
+                <label>Response:</label>
+                <textarea class="form-control" rows="10">@ViewData["response"]</textarea>
+            </div>
+        </form>
+    </div>
+</div>
+@section Scripts {
+    @{await Html.RenderPartialAsync("_ValidationScriptsPartial"); }
+}

+ 37 - 0
samples/WebApplicationSample_V3_0/Views/WeChatPay/Reverse.cshtml

@@ -0,0 +1,37 @@
+@model WeChatPayReverseViewModel
+@{
+    ViewData["Title"] = "撤销订单";
+}
+<nav aria-label="breadcrumb">
+    <ol class="breadcrumb">
+        <li class="breadcrumb-item"><a asp-controller="WeChatPay" asp-action="Index">微信支付</a></li>
+        <li class="breadcrumb-item active" aria-current="page">@ViewData["Title"]</li>
+    </ol>
+</nav>
+<br />
+<div class="card">
+    <div class="card-body">
+        <form asp-controller="WeChatPay" asp-action="Reverse">
+            <div asp-validation-summary="All" class="text-danger"></div>
+            <div class="form-group">
+                <label asp-for="TransactionId"></label>
+                <input type="text" class="form-control" asp-for="TransactionId" />
+            </div>
+            <div class="form-group">
+                <label asp-for="OutTradeNo"></label>
+                <input type="text" class="form-control" asp-for="OutTradeNo" />
+            </div>
+            <button type="submit" class="btn btn-primary">提交请求</button>
+        </form>
+        <hr />
+        <form class="form-horizontal">
+            <div class="form-group">
+                <label>Response:</label>
+                <textarea class="form-control" rows="10">@ViewData["response"]</textarea>
+            </div>
+        </form>
+    </div>
+</div>
+@section Scripts {
+    @{await Html.RenderPartialAsync("_ValidationScriptsPartial"); }
+}

+ 56 - 0
samples/WebApplicationSample_V3_0/Views/WeChatPay/Transfers.cshtml

@@ -0,0 +1,56 @@
+@model WeChatPayTransfersViewModel
+@{
+    ViewData["Title"] = "企业付款到零钱";
+}
+<nav aria-label="breadcrumb">
+    <ol class="breadcrumb">
+        <li class="breadcrumb-item"><a asp-controller="WeChatPay" asp-action="Index">微信支付</a></li>
+        <li class="breadcrumb-item active" aria-current="page">@ViewData["Title"]</li>
+    </ol>
+</nav>
+<br />
+<div class="card">
+    <div class="card-body">
+        <form asp-controller="WeChatPay" asp-action="Transfers">
+            <div asp-validation-summary="All" class="text-danger"></div>
+            <div class="form-group">
+                <label asp-for="PartnerTradeNo"></label>
+                <input type="text" class="form-control" asp-for="PartnerTradeNo" value="@DateTime.Now.ToString("yyyyMMddHHmmssfff")" />
+            </div>
+            <div class="form-group">
+                <label asp-for="OpenId"></label>
+                <input type="text" class="form-control" asp-for="OpenId" />
+            </div>
+            <div class="form-group">
+                <label asp-for="CheckName"></label>
+                <input type="text" class="form-control" asp-for="CheckName" value="NO_CHECK" />
+            </div>
+            <div class="form-group">
+                <label asp-for="ReUserName"></label>
+                <input type="text" class="form-control" asp-for="ReUserName" />
+            </div>
+            <div class="form-group">
+                <label asp-for="Amount"></label>
+                <input type="text" class="form-control" asp-for="Amount" value="100" />
+            </div>
+            <div class="form-group">
+                <label asp-for="Desc"></label>
+                <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" />
+            </div>
+            <button type="submit" class="btn btn-primary">提交请求</button>
+        </form>
+        <form class="form-horizontal">
+            <div class="form-group">
+                <label>Response:</label>
+                <textarea class="form-control" rows="10">@ViewData["response"]</textarea>
+            </div>
+        </form>
+    </div>
+</div>
+@section Scripts {
+    @{await Html.RenderPartialAsync("_ValidationScriptsPartial"); }
+}

+ 3 - 0
samples/WebApplicationSample_V3_0/Views/_ViewImports.cshtml

@@ -0,0 +1,3 @@
+@using WebApplicationSample_V3_0
+@using WebApplicationSample_V3_0.Models
+@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers

+ 3 - 0
samples/WebApplicationSample_V3_0/Views/_ViewStart.cshtml

@@ -0,0 +1,3 @@
+@{
+    Layout = "_Layout";
+}

+ 21 - 0
samples/WebApplicationSample_V3_0/WebApplicationSample_V3_0.csproj

@@ -0,0 +1,21 @@
+<Project Sdk="Microsoft.NET.Sdk.Web">
+
+  <PropertyGroup>
+    <TargetFramework>netcoreapp3.0</TargetFramework>
+    <UserSecretsId>a59ca38e-9b52-44fe-b3d2-8cb5a1641623</UserSecretsId>
+  </PropertyGroup>
+
+  <ItemGroup>
+    <PackageReference Include="QRCoder" Version="1.3.5" />
+  </ItemGroup>
+
+  <ItemGroup>
+    <ProjectReference Include="..\..\src\Essensoft.AspNetCore.Payment.Alipay\Essensoft.AspNetCore.Payment.Alipay.csproj" />
+    <ProjectReference Include="..\..\src\Essensoft.AspNetCore.Payment.JDPay\Essensoft.AspNetCore.Payment.JDPay.csproj" />
+    <ProjectReference Include="..\..\src\Essensoft.AspNetCore.Payment.LianLianPay\Essensoft.AspNetCore.Payment.LianLianPay.csproj" />
+    <ProjectReference Include="..\..\src\Essensoft.AspNetCore.Payment.QPay\Essensoft.AspNetCore.Payment.QPay.csproj" />
+    <ProjectReference Include="..\..\src\Essensoft.AspNetCore.Payment.UnionPay\Essensoft.AspNetCore.Payment.UnionPay.csproj" />
+    <ProjectReference Include="..\..\src\Essensoft.AspNetCore.Payment.WeChatPay\Essensoft.AspNetCore.Payment.WeChatPay.csproj" />
+  </ItemGroup>
+
+</Project>

+ 9 - 0
samples/WebApplicationSample_V3_0/appsettings.Development.json

@@ -0,0 +1,9 @@
+{
+  "Logging": {
+    "LogLevel": {
+      "Default": "Debug",
+      "System": "Information",
+      "Microsoft": "Information"
+    }
+  }
+}

+ 10 - 0
samples/WebApplicationSample_V3_0/appsettings.json

@@ -0,0 +1,10 @@
+{
+  "Logging": {
+    "LogLevel": {
+      "Default": "Information",
+      "Microsoft": "Warning",
+      "Microsoft.Hosting.Lifetime": "Information"
+    }
+  },
+  "AllowedHosts": "*"
+}

+ 86 - 0
samples/WebApplicationSample_V3_0/wwwroot/css/site.css

@@ -0,0 +1,86 @@
+/* Please see documentation at https://docs.microsoft.com/aspnet/core/client-side/bundling-and-minification
+for details on configuring this project to bundle and minify static web assets. */
+
+body {
+    font-family: Monospaced Number,Chinese Quote,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Helvetica Neue,Helvetica,Arial,sans-serif;
+    line-height: 1.5;
+    color: #314659;
+    font-size: 14px;
+    background: #fff;
+}
+
+ul, ol {
+    margin: 0;
+    padding: 0;
+}
+
+.body-content {
+    padding-left: 15px;
+    padding-right: 15px;
+    margin-bottom: 40px !important;
+}
+
+.carousel-caption p {
+    font-size: 20px;
+    line-height: 1.4
+}
+
+.carousel-inner .item img[src$=".svg"] {
+    width: 100%
+}
+
+#qrCode {
+    margin: 15px
+}
+
+@media screen and (max-width:767px) {
+    .carousel-caption {
+        display: none
+    }
+}
+
+.bg-white {
+    background: #fff !important;
+}
+
+.navbar-shadow {
+    box-shadow: 0 2px 8px #f0f1f2;
+    margin-bottom: 40px !important;
+}
+
+.navbar-light .navbar-nav .nav-link:hover, .navbar-light .navbar-nav .nav-link:focus {
+    color: #1890ff;
+}
+
+.navbar-light .navbar-nav .show > .nav-link,
+.navbar-light .navbar-nav .active > .nav-link,
+.navbar-light .navbar-nav .nav-link.show,
+.navbar-light .navbar-nav .nav-link.active {
+    color: #1890ff;
+}
+
+.navbar-light .navbar-text a:hover, .navbar-light .navbar-text a:focus {
+    color: #1890ff;
+}
+
+footer {
+    font-size: 14px;
+    background-color: #000;
+    padding: 24px 0;
+}
+
+    footer a, footer p, footer ul {
+        color: hsla(0,0%,100%,.9);
+    }
+
+.list-style-none {
+    list-style: none !important;
+}
+
+.d-flex {
+    display: flex !important;
+}
+
+.mr-3 {
+    margin-right: 16px !important;
+}

+ 86 - 0
samples/WebApplicationSample_V3_0/wwwroot/css/site.min.css

@@ -0,0 +1,86 @@
+/* Please see documentation at https://docs.microsoft.com/aspnet/core/client-side/bundling-and-minification
+for details on configuring this project to bundle and minify static web assets. */
+
+body {
+    font-family: Monospaced Number,Chinese Quote,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Helvetica Neue,Helvetica,Arial,sans-serif;
+    line-height: 1.5;
+    color: #314659;
+    font-size: 14px;
+    background: #fff;
+}
+
+ul, ol {
+    margin: 0;
+    padding: 0;
+}
+
+.body-content {
+    padding-left: 15px;
+    padding-right: 15px;
+    margin-bottom: 40px !important;
+}
+
+.carousel-caption p {
+    font-size: 20px;
+    line-height: 1.4
+}
+
+.carousel-inner .item img[src$=".svg"] {
+    width: 100%
+}
+
+#qrCode {
+    margin: 15px
+}
+
+@media screen and (max-width:767px) {
+    .carousel-caption {
+        display: none
+    }
+}
+
+.bg-white {
+    background: #fff !important;
+}
+
+.navbar-shadow {
+    box-shadow: 0 2px 8px #f0f1f2;
+    margin-bottom: 40px !important;
+}
+
+.navbar-light .navbar-nav .nav-link:hover, .navbar-light .navbar-nav .nav-link:focus {
+    color: #1890ff;
+}
+
+.navbar-light .navbar-nav .show > .nav-link,
+.navbar-light .navbar-nav .active > .nav-link,
+.navbar-light .navbar-nav .nav-link.show,
+.navbar-light .navbar-nav .nav-link.active {
+    color: #1890ff;
+}
+
+.navbar-light .navbar-text a:hover, .navbar-light .navbar-text a:focus {
+    color: #1890ff;
+}
+
+footer {
+    font-size: 14px;
+    background-color: #000;
+    padding: 24px 0;
+}
+
+    footer a, footer p, footer ul {
+        color: hsla(0,0%,100%,.9);
+    }
+
+.list-style-none {
+    list-style: none !important;
+}
+
+.d-flex {
+    display: flex !important;
+}
+
+.mr-3 {
+    margin-right: 16px !important;
+}

二進制
samples/WebApplicationSample_V3_0/wwwroot/favicon.ico


二進制
samples/WebApplicationSample_V3_0/wwwroot/images/payment.png


二進制
samples/WebApplicationSample_V3_0/wwwroot/images/qrcode.png


Some files were not shown because too many files changed in this diff