Browse Source

1.4.0

1. 修复京东验签失败.
2. 新增通知返回结果类
3. 新增部分微信支付API
4. 其他优化
5. 新版示例.
Roc 7 years ago
parent
commit
a70149d548
100 changed files with 6675 additions and 36 deletions
  1. 6 13
      Payment.sln
  2. 74 23
      README.MD
  3. 341 0
      samples/NewWebApplicationSample/Controllers/AlipayController.cs
  4. 24 0
      samples/NewWebApplicationSample/Controllers/HomeController.cs
  5. 187 0
      samples/NewWebApplicationSample/Controllers/JDPayController.cs
  6. 183 0
      samples/NewWebApplicationSample/Controllers/LianLianPayController.cs
  7. 414 0
      samples/NewWebApplicationSample/Controllers/NotifyController.cs
  8. 241 0
      samples/NewWebApplicationSample/Controllers/QPayController.cs
  9. 69 0
      samples/NewWebApplicationSample/Controllers/UnionPayController.cs
  10. 444 0
      samples/NewWebApplicationSample/Controllers/WeChatPayController.cs
  11. 21 0
      samples/NewWebApplicationSample/Helpers/HMTLHelperExtensions.cs
  12. 216 0
      samples/NewWebApplicationSample/Models/AlipayViewModel.cs
  13. 9 0
      samples/NewWebApplicationSample/Models/ErrorViewModel.cs
  14. 128 0
      samples/NewWebApplicationSample/Models/JDPayViewModel.cs
  15. 165 0
      samples/NewWebApplicationSample/Models/LianLianPayViewModel.cs
  16. 152 0
      samples/NewWebApplicationSample/Models/QPayViewModel.cs
  17. 33 0
      samples/NewWebApplicationSample/Models/UnionPayViewModel.cs
  18. 335 0
      samples/NewWebApplicationSample/Models/WeChatPayViewModel.cs
  19. 33 0
      samples/NewWebApplicationSample/NewWebApplicationSample.csproj
  20. 19 0
      samples/NewWebApplicationSample/Program.cs
  21. 19 0
      samples/NewWebApplicationSample/Properties/PublishProfiles/FolderProfile.pubxml
  22. 27 0
      samples/NewWebApplicationSample/Properties/launchSettings.json
  23. 73 0
      samples/NewWebApplicationSample/Startup.cs
  24. 49 0
      samples/NewWebApplicationSample/Views/Alipay/AppPay.cshtml
  25. 37 0
      samples/NewWebApplicationSample/Views/Alipay/BillDownloadurlQuery.cshtml
  26. 87 0
      samples/NewWebApplicationSample/Views/Alipay/Index.cshtml
  27. 50 0
      samples/NewWebApplicationSample/Views/Alipay/PagePay.cshtml
  28. 15 0
      samples/NewWebApplicationSample/Views/Alipay/PagePayReturn.cshtml
  29. 57 0
      samples/NewWebApplicationSample/Views/Alipay/Pay.cshtml
  30. 56 0
      samples/NewWebApplicationSample/Views/Alipay/PreCreate.cshtml
  31. 37 0
      samples/NewWebApplicationSample/Views/Alipay/Query.cshtml
  32. 49 0
      samples/NewWebApplicationSample/Views/Alipay/Refund.cshtml
  33. 41 0
      samples/NewWebApplicationSample/Views/Alipay/RefundQuery.cshtml
  34. 37 0
      samples/NewWebApplicationSample/Views/Alipay/TransQuery.cshtml
  35. 49 0
      samples/NewWebApplicationSample/Views/Alipay/Transfer.cshtml
  36. 50 0
      samples/NewWebApplicationSample/Views/Alipay/WapPay.cshtml
  37. 15 0
      samples/NewWebApplicationSample/Views/Alipay/WapPayReturn.cshtml
  38. 9 0
      samples/NewWebApplicationSample/Views/Home/Gratuity.cshtml
  39. 85 0
      samples/NewWebApplicationSample/Views/Home/Index.cshtml
  40. 58 0
      samples/NewWebApplicationSample/Views/JDPay/Index.cshtml
  41. 69 0
      samples/NewWebApplicationSample/Views/JDPay/QRPay.cshtml
  42. 41 0
      samples/NewWebApplicationSample/Views/JDPay/Query.cshtml
  43. 41 0
      samples/NewWebApplicationSample/Views/JDPay/QueryRefund.cshtml
  44. 49 0
      samples/NewWebApplicationSample/Views/JDPay/Refund.cshtml
  45. 16 0
      samples/NewWebApplicationSample/Views/JDPay/Return.cshtml
  46. 58 0
      samples/NewWebApplicationSample/Views/JDPay/SaveOrderH5.cshtml
  47. 58 0
      samples/NewWebApplicationSample/Views/JDPay/SaveOrderPC.cshtml
  48. 52 0
      samples/NewWebApplicationSample/Views/LianLianPay/Index.cshtml
  49. 41 0
      samples/NewWebApplicationSample/Views/LianLianPay/OrderQuery.cshtml
  50. 57 0
      samples/NewWebApplicationSample/Views/LianLianPay/Refund.cshtml
  51. 41 0
      samples/NewWebApplicationSample/Views/LianLianPay/RefundQuery.cshtml
  52. 78 0
      samples/NewWebApplicationSample/Views/LianLianPay/WapQuickPay.cshtml
  53. 15 0
      samples/NewWebApplicationSample/Views/LianLianPay/WapQuickPayReturn.cshtml
  54. 82 0
      samples/NewWebApplicationSample/Views/LianLianPay/WebQuickPay.cshtml
  55. 15 0
      samples/NewWebApplicationSample/Views/LianLianPay/WebQuickPayReturn.cshtml
  56. 57 0
      samples/NewWebApplicationSample/Views/QPay/AppPay.cshtml
  57. 33 0
      samples/NewWebApplicationSample/Views/QPay/CloseOrder.cshtml
  58. 82 0
      samples/NewWebApplicationSample/Views/QPay/Index.cshtml
  59. 65 0
      samples/NewWebApplicationSample/Views/QPay/MicroPay.cshtml
  60. 34 0
      samples/NewWebApplicationSample/Views/QPay/OrderQuery.cshtml
  61. 57 0
      samples/NewWebApplicationSample/Views/QPay/PubPay.cshtml
  62. 64 0
      samples/NewWebApplicationSample/Views/QPay/QRPay.cshtml
  63. 53 0
      samples/NewWebApplicationSample/Views/QPay/Refund.cshtml
  64. 42 0
      samples/NewWebApplicationSample/Views/QPay/RefundQuery.cshtml
  65. 33 0
      samples/NewWebApplicationSample/Views/QPay/Reverse.cshtml
  66. 41 0
      samples/NewWebApplicationSample/Views/QPay/StatementDown.cshtml
  67. 22 0
      samples/NewWebApplicationSample/Views/Shared/Error.cshtml
  68. 91 0
      samples/NewWebApplicationSample/Views/Shared/_Layout.cshtml
  69. 18 0
      samples/NewWebApplicationSample/Views/Shared/_ValidationScriptsPartial.cshtml
  70. 50 0
      samples/NewWebApplicationSample/Views/UnionPay/FrontConsume62.cshtml
  71. 15 0
      samples/NewWebApplicationSample/Views/UnionPay/FrontConsume62Return.cshtml
  72. 28 0
      samples/NewWebApplicationSample/Views/UnionPay/Index.cshtml
  73. 57 0
      samples/NewWebApplicationSample/Views/WeChatPay/AppPay.cshtml
  74. 33 0
      samples/NewWebApplicationSample/Views/WeChatPay/CloseOrder.cshtml
  75. 41 0
      samples/NewWebApplicationSample/Views/WeChatPay/DownloadBill.cshtml
  76. 41 0
      samples/NewWebApplicationSample/Views/WeChatPay/DownloadFundFlow.cshtml
  77. 24 0
      samples/NewWebApplicationSample/Views/WeChatPay/GetPublicKey.cshtml
  78. 33 0
      samples/NewWebApplicationSample/Views/WeChatPay/GetTransferInfo.cshtml
  79. 53 0
      samples/NewWebApplicationSample/Views/WeChatPay/H5Pay.cshtml
  80. 130 0
      samples/NewWebApplicationSample/Views/WeChatPay/Index.cshtml
  81. 61 0
      samples/NewWebApplicationSample/Views/WeChatPay/LiteAppPay.cshtml
  82. 49 0
      samples/NewWebApplicationSample/Views/WeChatPay/MicroPay.cshtml
  83. 37 0
      samples/NewWebApplicationSample/Views/WeChatPay/OrderQuery.cshtml
  84. 53 0
      samples/NewWebApplicationSample/Views/WeChatPay/PayBank.cshtml
  85. 61 0
      samples/NewWebApplicationSample/Views/WeChatPay/PubPay.cshtml
  86. 60 0
      samples/NewWebApplicationSample/Views/WeChatPay/QRPay.cshtml
  87. 33 0
      samples/NewWebApplicationSample/Views/WeChatPay/QueryBank.cshtml
  88. 57 0
      samples/NewWebApplicationSample/Views/WeChatPay/Refund.cshtml
  89. 45 0
      samples/NewWebApplicationSample/Views/WeChatPay/RefundQuery.cshtml
  90. 37 0
      samples/NewWebApplicationSample/Views/WeChatPay/Reverse.cshtml
  91. 56 0
      samples/NewWebApplicationSample/Views/WeChatPay/Transfers.cshtml
  92. 3 0
      samples/NewWebApplicationSample/Views/_ViewImports.cshtml
  93. 3 0
      samples/NewWebApplicationSample/Views/_ViewStart.cshtml
  94. 10 0
      samples/NewWebApplicationSample/appsettings.Development.json
  95. 8 0
      samples/NewWebApplicationSample/appsettings.json
  96. 24 0
      samples/NewWebApplicationSample/bundleconfig.json
  97. 87 0
      samples/NewWebApplicationSample/wwwroot/css/site.css
  98. 87 0
      samples/NewWebApplicationSample/wwwroot/css/site.min.css
  99. BIN
      samples/NewWebApplicationSample/wwwroot/favicon.ico
  100. BIN
      samples/NewWebApplicationSample/wwwroot/images/payment.png

+ 6 - 13
Payment.sln

@@ -5,12 +5,10 @@ VisualStudioVersion = 15.0.26124.0
 MinimumVisualStudioVersion = 15.0.26124.0
 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "samples", "samples", "{DD8CC860-F3E3-40F4-8A8F-20BF66EA051C}"
 EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WebApplicationSample", "samples\WebApplicationSample\WebApplicationSample.csproj", "{07FED8BA-3825-43DE-BCA7-7C8B19F1AB76}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "NewWebApplicationSample", "samples\NewWebApplicationSample\NewWebApplicationSample.csproj", "{53148C9A-E48E-45B1-B382-6485E4DA1006}"
 EndProject
 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{D3871E61-CA47-4BD0-8BF9-B64A42B2200D}"
 EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Essensoft.AspNetCore.Payment.All", "src\Essensoft.AspNetCore.Payment.All\Essensoft.AspNetCore.Payment.All.csproj", "{084545C4-FA61-4BF4-913A-59E4C063212D}"
-EndProject
 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Essensoft.AspNetCore.Payment.Alipay", "src\Essensoft.AspNetCore.Payment.Alipay\Essensoft.AspNetCore.Payment.Alipay.csproj", "{167FAA95-300E-49D5-A29B-EFCFF90A0584}"
 EndProject
 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Essensoft.AspNetCore.Payment.QPay", "src\Essensoft.AspNetCore.Payment.QPay\Essensoft.AspNetCore.Payment.QPay.csproj", "{071D1073-EEE3-45F1-ADC6-95CF90A64DD3}"
@@ -31,14 +29,10 @@ Global
 		Release|Any CPU = Release|Any CPU
 	EndGlobalSection
 	GlobalSection(ProjectConfigurationPlatforms) = postSolution
-		{07FED8BA-3825-43DE-BCA7-7C8B19F1AB76}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
-		{07FED8BA-3825-43DE-BCA7-7C8B19F1AB76}.Debug|Any CPU.Build.0 = Debug|Any CPU
-		{07FED8BA-3825-43DE-BCA7-7C8B19F1AB76}.Release|Any CPU.ActiveCfg = Release|Any CPU
-		{07FED8BA-3825-43DE-BCA7-7C8B19F1AB76}.Release|Any CPU.Build.0 = Release|Any CPU
-		{084545C4-FA61-4BF4-913A-59E4C063212D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
-		{084545C4-FA61-4BF4-913A-59E4C063212D}.Debug|Any CPU.Build.0 = Debug|Any CPU
-		{084545C4-FA61-4BF4-913A-59E4C063212D}.Release|Any CPU.ActiveCfg = Release|Any CPU
-		{084545C4-FA61-4BF4-913A-59E4C063212D}.Release|Any CPU.Build.0 = Release|Any CPU
+		{53148C9A-E48E-45B1-B382-6485E4DA1006}.Debug|Any CPU.ActiveCfg = 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.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.Build.0 = Debug|Any CPU
 		{167FAA95-300E-49D5-A29B-EFCFF90A0584}.Release|Any CPU.ActiveCfg = Release|Any CPU
@@ -72,8 +66,7 @@ Global
 		HideSolutionNode = FALSE
 	EndGlobalSection
 	GlobalSection(NestedProjects) = preSolution
-		{07FED8BA-3825-43DE-BCA7-7C8B19F1AB76} = {DD8CC860-F3E3-40F4-8A8F-20BF66EA051C}
-		{084545C4-FA61-4BF4-913A-59E4C063212D} = {D3871E61-CA47-4BD0-8BF9-B64A42B2200D}
+		{53148C9A-E48E-45B1-B382-6485E4DA1006} = {DD8CC860-F3E3-40F4-8A8F-20BF66EA051C}
 		{167FAA95-300E-49D5-A29B-EFCFF90A0584} = {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}

+ 74 - 23
README.MD

@@ -1,51 +1,102 @@
 # Payment
 
+## 简介
+
+Payment 是基于 .NET Core 2.0 / ASP NET Core 开发的支付SDK集。
+
 ## Package
 
 Package  | NuGet 
 -------- | :------------ 
-Essensoft.AspNetCore.Payment.Alipay		| [![NuGet](https://img.shields.io/nuget/v/Essensoft.AspNetCore.Payment.Alipay.svg)](https://www.nuget.org/packages/Essensoft.AspNetCore.Payment.Alipay)
-Essensoft.AspNetCore.Payment.JdPay		| [![NuGet](https://img.shields.io/nuget/v/Essensoft.AspNetCore.Payment.JdPay.svg)](https://www.nuget.org/packages/Essensoft.AspNetCore.Payment.JdPay)
-Essensoft.AspNetCore.Payment.QPay		| [![NuGet](https://img.shields.io/nuget/v/Essensoft.AspNetCore.Payment.QPay.svg)](https://www.nuget.org/packages/Essensoft.AspNetCore.Payment.QPay)
-Essensoft.AspNetCore.Payment.Security		| [![NuGet](https://img.shields.io/nuget/v/Essensoft.AspNetCore.Payment.Security.svg)](https://www.nuget.org/packages/Essensoft.AspNetCore.Payment.Security)
-Essensoft.AspNetCore.Payment.UnionPay		| [![NuGet](https://img.shields.io/nuget/v/Essensoft.AspNetCore.Payment.UnionPay.svg)](https://www.nuget.org/packages/Essensoft.AspNetCore.Payment.UnionPay)
-Essensoft.AspNetCore.Payment.WeChatPay		| [![NuGet](https://img.shields.io/nuget/v/Essensoft.AspNetCore.Payment.WeChatPay.svg)](https://www.nuget.org/packages/Essensoft.AspNetCore.Payment.WeChatPay)
-Essensoft.AspNetCore.Payment.LianLianPay		| [![NuGet](https://img.shields.io/nuget/v/Essensoft.AspNetCore.Payment.LianLianPay.svg)](https://www.nuget.org/packages/Essensoft.AspNetCore.Payment.LianLianPay)
+Essensoft.AspNetCore.Payment.Alipay         | [![NuGet](https://img.shields.io/nuget/v/Essensoft.AspNetCore.Payment.Alipay.svg)](https://www.nuget.org/packages/Essensoft.AspNetCore.Payment.Alipay)
+Essensoft.AspNetCore.Payment.WeChatPay      | [![NuGet](https://img.shields.io/nuget/v/Essensoft.AspNetCore.Payment.WeChatPay.svg)](https://www.nuget.org/packages/Essensoft.AspNetCore.Payment.WeChatPay)
+Essensoft.AspNetCore.Payment.QPay           | [![NuGet](https://img.shields.io/nuget/v/Essensoft.AspNetCore.Payment.QPay.svg)](https://www.nuget.org/packages/Essensoft.AspNetCore.Payment.QPay)
+Essensoft.AspNetCore.Payment.JDPay		    | [![NuGet](https://img.shields.io/nuget/v/Essensoft.AspNetCore.Payment.JDPay.svg)](https://www.nuget.org/packages/Essensoft.AspNetCore.Payment.JDPay)
+Essensoft.AspNetCore.Payment.LianLianPay    | [![NuGet](https://img.shields.io/nuget/v/Essensoft.AspNetCore.Payment.LianLianPay.svg)](https://www.nuget.org/packages/Essensoft.AspNetCore.Payment.LianLianPay)
+Essensoft.AspNetCore.Payment.UnionPay       | [![NuGet](https://img.shields.io/nuget/v/Essensoft.AspNetCore.Payment.UnionPay.svg)](https://www.nuget.org/packages/Essensoft.AspNetCore.Payment.UnionPay)
 
-## 官方文档
+## Payment 交流方式
+* Payment Q群 [522457525](https://shang.qq.com/wpa/qunwpa?idkey=aac56c8f02f54893267d3ac90787c1794a7687f3c31a923812a36b67c4ee6271)
+
+## 支持渠道
+
+### 支付宝
+
+* 当面付(主扫\被扫)
+* APP支付
+* 手机网站支付
+* 电脑网站支付
+* 单笔转账到支付宝账户
+* ...
+
+### 微信支付
+
+* 刷卡支付
+* 公众号支付
+* 扫码支付
+* APP支付
+* H5支付
+* 小程序支付
+* 企业付款(零钱/银行卡)
+* 现金红包
+* ...
+
+### QQ钱包
+
+* 付款码支付
+* 扫码支付
+* 公众号支付
+* APP支付
+* ...
+
+### 京东支付
+* 网页支付
+* APP支付
+* 扫一扫
+* 付款码
+* ...
+
+### 连连支付
+* 快捷支付
+* 网银支付
+* 认证支付
+* 实时付款
+* ...
+
+### 银联支付
+* 网关支付
+* 无跳转支付
+* 二维码支付(主扫\被扫)
 
-* QQ交流群 [Payment <522457525>](https://shang.qq.com/wpa/qunwpa?idkey=aac56c8f02f54893267d3ac90787c1794a7687f3c31a923812a36b67c4ee6271)
+## 官方文档
 
-* 支付宝 [文档中心](https://openhome.alipay.com/developmentDocument.htm)、[技术支持中心](https://open.alipay.com/support/supportCenter.htm)、[开发者社区](https://openclub.alipay.com/index.php)
+* 支付宝 [文档中心](https://openhome.alipay.com/developmentDocument.htm)
 
-* 微信支付 [开发文档](https://pay.weixin.qq.com/wiki/doc/api/index.html)、[问答中心](http://wxpay.wxutil.com/qa/index.php)、[帮助中心](http://kf.qq.com/product/wechatpaymentmerchant.html) 
+* 微信支付 [开发文档](https://pay.weixin.qq.com/wiki/doc/api/index.html)
 
-* QQ钱包 [开发文档](https://qpay.qq.com/qpaywiki.shtml)、[帮助中心](http://kf.qq.com/product/qq_enterprise.html)
+* QQ钱包 [开发文档](https://qpay.qq.com/qpaywiki.shtml)
 
 * 京东支付 [开发文档](http://payapi.jd.com)
 
-* 银联支付 [开放平台](https://open.unionpay.com/ajweb/product)
+* 连连支付 [开放平台](http://open.LianLianPay.com)
 
-* 连连支付 [开放平台](http://open.lianlianpay.com/)
+* 银联支付 [开放平台](https://open.unionpay.com/ajweb/product)
 
 ## 开发环境
-* Windows 10
-* VS2017 15.6.5
-* .NET Core SDK 2.1.103
-
-## 支持渠道
-支付宝、微信支付、QQ钱包、京东支付、银联支付、连连支付
+* Windows 10 1803 17133.1
+* VS2017 15.6.6
+* .NET Core SDK 2.1.105 (x64)
 
 ## 使用方式
 见示例项目:WebApplicationSample</p>
 
 <p align="center">
-    <img src="http://p687qfgw0.bkt.clouddn.com/demo.png">
+    <img src="http://p687qfgw0.bkt.clouddn.com/NewWebApplicationSample.png">
 </p>
 
----
+----
 
-## 支持/打赏
+## 打赏
 
 <p align="center">
     <img src="http://p687qfgw0.bkt.clouddn.com/payment.png">

+ 341 - 0
samples/NewWebApplicationSample/Controllers/AlipayController.cs

@@ -0,0 +1,341 @@
+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 NewWebApplicationSample.Models;
+using System.Threading.Tasks;
+
+namespace NewWebApplicationSample.Controllers
+{
+    public class AlipayController : Controller
+    {
+        private readonly AlipayClient _client = null;
+        private readonly AlipayNotifyClient _notifyClient = null;
+
+        public AlipayController(AlipayClient client, AlipayNotifyClient notifyClient)
+        {
+            _client = client;
+            _notifyClient = notifyClient;
+        }
+
+        [HttpGet]
+        public IActionResult Index()
+        {
+            return View();
+        }
+
+        [HttpGet]
+        public IActionResult PreCreate()
+        {
+            return View();
+        }
+
+        [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);
+            ViewData["qrcode"] = response.QrCode;
+            ViewData["response"] = response.Body;
+            return View();
+        }
+
+        [HttpGet]
+        public IActionResult Pay()
+        {
+            return View();
+        }
+
+        [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);
+            req.SetNotifyUrl(viewModel.NotifyUrl);
+
+            var response = await _client.ExecuteAsync(req);
+            ViewData["response"] = response.Body;
+            return View();
+        }
+
+        [HttpGet]
+        public IActionResult AppPay()
+        {
+            return View();
+        }
+
+        [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);
+            //将response.Body给 ios/android端 由其去调起支付宝APP(https://docs.open.alipay.com/204/105296/、https://docs.open.alipay.com/204/105295/)
+            ViewData["response"] = response.Body;
+            return View();
+        }
+
+        [HttpGet]
+        public IActionResult PagePay()
+        {
+            return View();
+        }
+
+        [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);
+            return Content(response.Body, "text/html");
+        }
+
+        [HttpGet]
+        public IActionResult WapPay()
+        {
+            return View();
+        }
+
+        [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);
+            return Content(response.Body, "text/html");
+        }
+
+        [HttpGet]
+        public IActionResult Query()
+        {
+            return View();
+        }
+
+        [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);
+            ViewData["response"] = response.Body;
+            return View();
+        }
+
+        [HttpGet]
+        public IActionResult Refund()
+        {
+            return View();
+        }
+
+        [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);
+            ViewData["response"] = response.Body;
+            return View();
+        }
+
+        [HttpGet]
+        public IActionResult RefundQuery()
+        {
+            return View();
+        }
+
+        [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);
+            ViewData["response"] = response.Body;
+            return View();
+        }
+
+        [HttpGet]
+        public IActionResult Transfer()
+        {
+            return View();
+        }
+
+        [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);
+            ViewData["response"] = response.Body;
+            return View();
+        }
+
+        [HttpGet]
+        public IActionResult TransQuery()
+        {
+            return View();
+        }
+
+        [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);
+            ViewData["response"] = response.Body;
+            return View();
+        }
+
+        [HttpGet]
+        public IActionResult BillDownloadurlQuery()
+        {
+            return View();
+        }
+
+        [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);
+            ViewData["response"] = response.Body;
+            return View();
+        }
+
+        /// <summary>
+        /// 电脑网站支付-同步跳转
+        /// </summary>
+        /// <returns></returns>
+        [HttpGet]
+        public async Task<IActionResult> PagePayReturn()
+        {
+            try
+            {
+                var notify = await _notifyClient.ExecuteAsync<AlipayTradePagePayReturnResponse>(Request);
+                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<AlipayTradeWapPayReturnResponse>(Request);
+                ViewData["response"] = "支付成功";
+                return View();
+            }
+            catch
+            {
+                ViewData["response"] = "出现错误";
+                return View();
+            }
+        }
+    }
+}

+ 24 - 0
samples/NewWebApplicationSample/Controllers/HomeController.cs

@@ -0,0 +1,24 @@
+using Microsoft.AspNetCore.Mvc;
+using NewWebApplicationSample.Models;
+using System.Diagnostics;
+
+namespace NewWebApplicationSample.Controllers
+{
+    public class HomeController : Controller
+    {
+        public IActionResult Index()
+        {
+            return View();
+        }
+
+        public IActionResult Gratuity()
+        {
+            return View();
+        }
+
+        public IActionResult Error()
+        {
+            return View(new ErrorViewModel { RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier });
+        }
+    }
+}

+ 187 - 0
samples/NewWebApplicationSample/Controllers/JDPayController.cs

@@ -0,0 +1,187 @@
+using Essensoft.AspNetCore.Payment.JDPay;
+using Essensoft.AspNetCore.Payment.JDPay.Notify;
+using Essensoft.AspNetCore.Payment.JDPay.Request;
+using Microsoft.AspNetCore.Mvc;
+using NewWebApplicationSample.Models;
+using System.Threading.Tasks;
+
+namespace NewWebApplicationSample.Controllers
+{
+    public class JDPayController : Controller
+    {
+        private readonly JDPayClient _client = null;
+        private readonly JDPayNotifyClient _notifyClient = null;
+
+        public JDPayController(JDPayClient client, JDPayNotifyClient notifyClient)
+        {
+            _client = client;
+            _notifyClient = notifyClient;
+        }
+
+        public IActionResult Index()
+        {
+            return View();
+        }
+
+        [HttpGet]
+        public IActionResult SaveOrderPC()
+        {
+            return View();
+        }
+
+        [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);
+            return Content(response.Body, "text/html");
+        }
+
+        [HttpGet]
+        public IActionResult SaveOrderH5()
+        {
+            return View();
+        }
+
+        [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);
+            return Content(response.Body, "text/html");
+        }
+
+        [HttpGet]
+        public IActionResult QRPay()
+        {
+            return View();
+        }
+
+        [HttpPost]
+        public async Task<IActionResult> QRPay(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);
+            ViewData["qrcode"] = response.QrCode;
+            ViewData["response"] = response.Body;
+            return View();
+        }
+
+        [HttpGet]
+        public IActionResult Query()
+        {
+            return View();
+        }
+
+        [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);
+            ViewData["response"] = response.Body;
+            return View();
+        }
+
+        [HttpGet]
+        public IActionResult Refund()
+        {
+            return View();
+        }
+
+        [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);
+            ViewData["response"] = response.Body;
+            return View();
+        }
+
+        [HttpGet]
+        public IActionResult QueryRefund()
+        {
+            return View();
+        }
+
+        [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);
+            ViewData["response"] = response.Body;
+            return View();
+        }
+
+        [HttpGet]  // h5 get
+        [HttpPost] // pc post
+        public async Task<IActionResult> Return()
+        {
+            try
+            {
+                var notify = await _notifyClient.ExecuteAsync<JDPaySyncReturnResponse>(Request);
+                ViewData["response"] = "支付成功";
+                return View();
+            }
+            catch
+            {
+                ViewData["response"] = "出现错误";
+                return View();
+            }
+        }
+    }
+}

+ 183 - 0
samples/NewWebApplicationSample/Controllers/LianLianPayController.cs

@@ -0,0 +1,183 @@
+using Essensoft.AspNetCore.Payment.LianLianPay;
+using Essensoft.AspNetCore.Payment.LianLianPay.Notify;
+using Essensoft.AspNetCore.Payment.LianLianPay.Request;
+using Microsoft.AspNetCore.Mvc;
+using NewWebApplicationSample.Models;
+using System.Threading.Tasks;
+
+namespace NewWebApplicationSample.Controllers
+{
+    public class LianLianPayController : Controller
+    {
+        private readonly LianLianPayClient _client = null;
+        private readonly LianLianPayNotifyClient _notifyClient = null;
+
+        public LianLianPayController(LianLianPayClient client, LianLianPayNotifyClient notifyClient)
+        {
+            _client = client;
+            _notifyClient = notifyClient;
+        }
+
+        public IActionResult Index()
+        {
+            return View();
+        }
+
+        [HttpGet]
+        public IActionResult WebQuickPay()
+        {
+            return View();
+        }
+
+        [HttpPost]
+        public async Task<IActionResult> WebQuickPay(LianLianPayWebQuickPayViewModel viewModel)
+        {
+            var request = new LianLianPayWebQuickPayRequest()
+            {
+                NoOrder = viewModel.NoOrder,
+                DtOrder = viewModel.DtOrder,
+                MoneyOrder = viewModel.MoneyOrder,
+                NameGoods = viewModel.NameGoods,
+                UserId = viewModel.UserId,
+                NotifyUrl = viewModel.NotifyUrl,
+                UrlReturn = viewModel.UrlReturn,
+                BankCode = viewModel.BankCode,
+                PayType = viewModel.PayType,
+                NoAgree = viewModel.NoAgree,
+                RiskItem = viewModel.RiskItem,
+                IdType = viewModel.IdType,
+                IdNo = viewModel.IdNo,
+                AcctName = viewModel.AcctName,
+                CardNo = viewModel.CardNo,
+            };
+            var response = await _client.PageExecuteAsync(request);
+            return Content(response.Body, "text/html");
+        }
+
+        [HttpGet]
+        public IActionResult WapQuickPay()
+        {
+            return View();
+        }
+
+        [HttpPost]
+        public async Task<IActionResult> WapQuickPay(LianLianPayWapQuickPayViewModel viewModel)
+        {
+            var request = new LianLianPayWapQuickPayRequest()
+            {
+                NoOrder = viewModel.NoOrder,
+                DtOrder = viewModel.DtOrder,
+                MoneyOrder = viewModel.MoneyOrder,
+                NameGoods = viewModel.NameGoods,
+                UserId = viewModel.UserId,
+                AppRequest = viewModel.AppRequest,
+                NotifyUrl = viewModel.NotifyUrl,
+                UrlReturn = viewModel.UrlReturn,
+                NoAgree = viewModel.NoAgree,
+                RiskItem = viewModel.RiskItem,
+                IdType = viewModel.IdType,
+                IdNo = viewModel.IdNo,
+                AcctName = viewModel.AcctName,
+                CardNo = viewModel.CardNo,
+            };
+            var response = await _client.PageReqDataExecuteAsync(request);
+            return Content(response.Body, "text/html");
+        }
+
+        [HttpGet]
+        public IActionResult OrderQuery()
+        {
+            return View();
+        }
+
+        [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);
+            ViewData["response"] = response.Body;
+            return View();
+        }
+
+        [HttpGet]
+        public IActionResult Refund()
+        {
+            return View();
+        }
+
+        [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);
+            ViewData["response"] = response.Body;
+            return View();
+        }
+
+        [HttpGet]
+        public IActionResult RefundQuery()
+        {
+            return View();
+        }
+
+        [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);
+            ViewData["response"] = response.Body;
+            return View();
+        }
+
+        [HttpPost]
+        public async Task<IActionResult> WebQuickPayReturn()
+        {
+            try
+            {
+                var notify = await _notifyClient.ExecuteAsync<LianLianPayWebQuickPayReturnResponse>(Request);
+                ViewData["response"] = "支付成功";
+                return View();
+            }
+            catch
+            {
+                ViewData["response"] = "出现错误";
+                return View();
+            }
+        }
+
+        [HttpPost]
+        public async Task<IActionResult> WapQuickPayReturn()
+        {
+            try
+            {
+                var notify = await _notifyClient.ExecuteAsync<LianLianPayWapQuickPayReturnResponse>(Request);
+                ViewData["response"] = "支付成功";
+                return View();
+            }
+            catch
+            {
+                ViewData["response"] = "出现错误";
+                return View();
+            }
+        }
+    }
+}

+ 414 - 0
samples/NewWebApplicationSample/Controllers/NotifyController.cs

@@ -0,0 +1,414 @@
+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 System;
+using System.Threading.Tasks;
+
+namespace NewWebApplicationSample.Controllers
+{
+    #region 支付宝异步通知
+
+    [Route("notify/alipay")]
+    public class AlipayNotifyController : Controller
+    {
+        private readonly AlipayNotifyClient _client = null;
+        public AlipayNotifyController(AlipayNotifyClient client)
+        {
+            _client = client;
+        }
+
+        /// <summary>
+        /// 扫码支付异步通知
+        /// </summary>
+        /// <returns></returns>
+        [Route("precreate")]
+        [HttpPost]
+        public async Task<IActionResult> Precreate()
+        {
+            try
+            {
+                var notify = await _client.ExecuteAsync<AlipayTradePrecreateNotifyResponse>(Request);
+                if ("TRADE_SUCCESS" == notify.TradeStatus)
+                {
+                    Console.WriteLine("OutTradeNo: " + notify.OutTradeNo);
+
+                    return AlipayNotifyResult.Success;
+                }
+                return NoContent();
+            }
+            catch
+            {
+                return NoContent();
+            }
+        }
+
+        /// <summary>
+        /// 条码支付异步通知
+        /// </summary>
+        /// <returns></returns>
+        [Route("pay")]
+        [HttpPost]
+        public async Task<IActionResult> Pay()
+        {
+            try
+            {
+                var notify = await _client.ExecuteAsync<AlipayTradePayNotifyResponse>(Request);
+                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<AlipayTradeAppPayNotifyResponse>(Request);
+                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<AlipayTradePagePayNotifyResponse>(Request);
+                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<AlipayTradeWapPayNotifyResponse>(Request);
+                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 WeChatPayNotifyClient _client = null;
+        public WeChatPayNotifyController(WeChatPayNotifyClient client)
+        {
+            _client = client;
+        }
+
+        /// <summary>
+        /// 统一下单支付结果通知
+        /// </summary>
+        /// <returns></returns>
+        [Route("unifiedorder")]
+        [HttpPost]
+        public async Task<IActionResult> Unifiedorder()
+        {
+            try
+            {
+                var notify = await _client.ExecuteAsync<WeChatPayUnifiedOrderNotifyResponse>(Request);
+                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<WeChatPayRefundNotifyResponse>(Request);
+                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 QPayNotifyClient _client = null;
+        public QPayNotifyController(QPayNotifyClient client)
+        {
+            _client = client;
+        }
+
+        /// <summary>
+        /// 统一下单支付结果通知
+        /// </summary>
+        /// <returns></returns>
+        [Route("unifiedorder")]
+        [HttpPost]
+        public async Task<IActionResult> Unifiedorder()
+        {
+            try
+            {
+                var notify = await _client.ExecuteAsync<QPayUnifiedOrderNotifyResponse>(Request);
+                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<QPayMicroPayNotifyResponse>(Request);
+                if ("SUCCESS" == notify.TradeState)
+                {
+                    Console.WriteLine("OutTradeNo: " + notify.OutTradeNo);
+                    return QPayNotifyResult.Success;
+                }
+                return NoContent();
+            }
+            catch
+            {
+                return NoContent();
+            }
+        }
+    }
+
+    #endregion
+
+    #region 京东支付异步通知
+
+    [Route("notify/jdpay")]
+    public class JDPayNotifyController : Controller
+    {
+        private readonly JDPayNotifyClient _client = null;
+        public JDPayNotifyController(JDPayNotifyClient client)
+        {
+            _client = client;
+        }
+
+        [Route("async")]
+        [HttpPost]
+        public async Task<IActionResult> Async()
+        {
+            try
+            {
+                var notify = await _client.ExecuteAsync<JDPayAsyncNotifyResponse>(Request);
+                Console.WriteLine("TradeNum: " + notify.TradeNum + " tradeType :" + notify.TradeType);// notify.TradeType 0-消费 1-退款
+                return JDPayNotifyResult.Success;
+            }
+            catch
+            {
+                return NoContent();
+            }
+        }
+    }
+
+    #endregion
+
+    #region 连连支付异步通知
+
+    [Route("notify/lianlianpay")]
+    public class LianLianPayNotifyController : Controller
+    {
+        private readonly LianLianPayNotifyClient _client = null;
+        public LianLianPayNotifyController(LianLianPayNotifyClient client)
+        {
+            _client = client;
+        }
+
+        [Route("webquickpay")]
+        [HttpPost]
+        public async Task<IActionResult> WebQuickPay()
+        {
+            try
+            {
+                var notify = await _client.ExecuteAsync<LianLianPayWebQuickPayNotifyResponse>(Request);
+                Console.WriteLine("NoOrder: " + notify.NoOrder);
+                return LianLianPayNotifyResult.Success;
+            }
+            catch
+            {
+                return NoContent();
+            }
+        }
+
+        [Route("wapquickpay")]
+        [HttpPost]
+        public async Task<IActionResult> WapQuickPay()
+        {
+            try
+            {
+                var notify = await _client.ExecuteAsync<LianLianPayWapQuickPayNotifyResponse>(Request);
+                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<LianLianPayRefundNotifyResponse>(Request);
+                Console.WriteLine("NoRefund: " + notify.NoRefund);
+                return LianLianPayNotifyResult.Success;
+            }
+            catch
+            {
+                return NoContent();
+            }
+        }
+    }
+
+    #endregion
+
+    #region 银联支付异步通知
+
+    [Route("notify/unionpay")]
+    public class UnionPayNotifyController : Controller
+    {
+        private readonly UnionPayNotifyClient _client = null;
+        public UnionPayNotifyController(UnionPayNotifyClient client)
+        {
+            _client = client;
+        }
+
+        /// <summary>
+        /// 网关支付 - 跳转网关页面支付通知
+        /// </summary>
+        /// <returns></returns>
+        [Route("frontconsume62")]
+        [HttpPost]
+        public async Task<IActionResult> FrontConsume62()
+        {
+            try
+            {
+                var notify = await _client.ExecuteAsync<UnionPayForm_6_2_FrontConsumeNotifyResponse>(Request);
+                Console.WriteLine("OrderId: " + notify.OrderId + " respCode :" + notify.RespCode);
+                return UnionPayNotifyResult.Ok;
+            }
+            catch
+            {
+                return NoContent();
+            }
+        }
+    }
+
+    #endregion
+}

+ 241 - 0
samples/NewWebApplicationSample/Controllers/QPayController.cs

@@ -0,0 +1,241 @@
+using Essensoft.AspNetCore.Payment.QPay;
+using Essensoft.AspNetCore.Payment.QPay.Request;
+using Microsoft.AspNetCore.Mvc;
+using NewWebApplicationSample.Models;
+using System.Threading.Tasks;
+
+namespace NewWebApplicationSample.Controllers
+{
+    public class QPayController : Controller
+    {
+        private readonly QPayClient _client = null;
+        public QPayController(QPayClient client)
+        {
+            _client = client;
+        }
+
+        public IActionResult Index()
+        {
+            return View();
+        }
+
+        [HttpGet]
+        public IActionResult MicroPay()
+        {
+            return View();
+        }
+
+        [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);
+            ViewData["response"] = response.Body;
+            return View();
+        }
+
+        [HttpGet]
+        public IActionResult QRPay()
+        {
+            return View();
+        }
+
+        [HttpPost]
+        public async Task<IActionResult> QRPay(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);
+            ViewData["qrcode"] = response.CodeUrl;
+            ViewData["response"] = response.Body;
+            return View();
+        }
+
+        [HttpGet]
+        public IActionResult PubPay()
+        {
+            return View();
+        }
+
+        [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);
+            ViewData["response"] = response.Body;
+            return View();
+        }
+
+        [HttpGet]
+        public IActionResult AppPay()
+        {
+            return View();
+        }
+
+        [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);
+            ViewData["response"] = response.Body;
+            return View();
+        }
+
+        [HttpGet]
+        public IActionResult OrderQuery()
+        {
+            return View();
+        }
+
+        [HttpPost]
+        public async Task<IActionResult> OrderQuery(QPayOrderQueryViewModel viewModel)
+        {
+            var request = new QPayOrderQueryRequest()
+            {
+                TransactionId = viewModel.TransactionId,
+                OutTradeNo = viewModel.OutTradeNo,
+            };
+            var response = await _client.ExecuteAsync(request);
+            ViewData["response"] = response.Body;
+            return View();
+        }
+
+        [HttpGet]
+        public IActionResult Reverse()
+        {
+            return View();
+        }
+
+        [HttpPost]
+        public async Task<IActionResult> Reverse(QPayReverseViewModel viewModel)
+        {
+            var request = new QPayReverseRequest()
+            {
+                OutTradeNo = viewModel.OutTradeNo,
+            };
+            var response = await _client.ExecuteAsync(request);
+            ViewData["response"] = response.Body;
+            return View();
+        }
+
+
+        [HttpGet]
+        public IActionResult CloseOrder()
+        {
+            return View();
+        }
+
+        [HttpPost]
+        public async Task<IActionResult> CloseOrder(QPayCloseOrderViewModel viewModel)
+        {
+            var request = new QPayCloseOrderRequest()
+            {
+                OutTradeNo = viewModel.OutTradeNo,
+            };
+            var response = await _client.ExecuteAsync(request);
+            ViewData["response"] = response.Body;
+            return View();
+        }
+
+        [HttpGet]
+        public IActionResult Refund()
+        {
+            return View();
+        }
+
+        [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 = viewModel.OpUserPasswd,
+            };
+            var response = await _client.ExecuteAsync(request);
+            ViewData["response"] = response.Body;
+            return View();
+        }
+
+        [HttpGet]
+        public IActionResult RefundQuery()
+        {
+            return View();
+        }
+
+        [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);
+            ViewData["response"] = response.Body;
+            return View();
+        }
+
+        [HttpGet]
+        public IActionResult StatementDown()
+        {
+            return View();
+        }
+
+        [HttpPost]
+        public async Task<IActionResult> StatementDown(QPayStatementDownViewModel viewModel)
+        {
+            var request = new QPayStatementDownRequest()
+            {
+                BillDate = viewModel.BillDate,
+                BillType = viewModel.BillType,
+                TarType = viewModel.TarType,
+            };
+            var response = await _client.ExecuteAsync(request);
+            ViewData["response"] = response.Body;
+            return View();
+        }
+    }
+}

+ 69 - 0
samples/NewWebApplicationSample/Controllers/UnionPayController.cs

@@ -0,0 +1,69 @@
+using Essensoft.AspNetCore.Payment.UnionPay;
+using Essensoft.AspNetCore.Payment.UnionPay.Notify;
+using Essensoft.AspNetCore.Payment.UnionPay.Request;
+using Microsoft.AspNetCore.Mvc;
+using NewWebApplicationSample.Models;
+using System.Threading.Tasks;
+
+namespace NewWebApplicationSample.Controllers
+{
+    public class UnionPayController : Controller
+    {
+        private readonly UnionPayClient _client = null;
+        private readonly UnionPayNotifyClient _notifyClient = null;
+
+        public UnionPayController(UnionPayClient client, UnionPayNotifyClient notifyClient)
+        {
+            _client = client;
+            _notifyClient = notifyClient;
+        }
+
+        public IActionResult Index()
+        {
+            return View();
+        }
+
+        [HttpGet]
+        public IActionResult FrontConsume62()
+        {
+            return View();
+        }
+
+        [HttpPost]
+        public async Task<IActionResult> FrontConsume62(UnionPayForm_6_2_FrontConsumeViewModel viewModel)
+        {
+            var request = new UnionPayForm_6_2_FrontConsumeRequest()
+            {
+                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);
+            return Content(response.Body, "text/html");
+        }
+
+        [HttpPost]
+        public async Task<IActionResult> FrontConsume62Return()
+        {
+            try
+            {
+                var notify = await _notifyClient.ExecuteAsync<UnionPayForm_6_2_FrontConsumeReturnResponse>(Request);
+                ViewData["response"] = "支付成功";
+                return View();
+            }
+            catch
+            {
+                ViewData["response"] = "出现错误";
+                return View();
+            }
+        }
+    }
+}

+ 444 - 0
samples/NewWebApplicationSample/Controllers/WeChatPayController.cs

@@ -0,0 +1,444 @@
+using Essensoft.AspNetCore.Payment.WeChatPay;
+using Essensoft.AspNetCore.Payment.WeChatPay.Request;
+using Microsoft.AspNetCore.Mvc;
+using Newtonsoft.Json;
+using NewWebApplicationSample.Models;
+using System.Threading.Tasks;
+
+namespace NewWebApplicationSample.Controllers
+{
+    public class WeChatPayController : Controller
+    {
+        private readonly WeChatPayClient _client = null;
+
+        public WeChatPayController(WeChatPayClient client)
+        {
+            _client = client;
+        }
+
+        public IActionResult Index()
+        {
+            return View();
+        }
+
+        [HttpGet]
+        public IActionResult MicroPay()
+        {
+            return View();
+        }
+
+        [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);
+            ViewData["response"] = response.Body;
+            return View();
+        }
+
+        [HttpGet]
+        public IActionResult PubPay()
+        {
+            return View();
+        }
+
+        [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);
+            if (response.ReturnCode == "SUCCESS" && response.ResultCode == "SUCCESS")
+            {
+                var req = new WeChatPayH5CallPaymentRequest()
+                {
+                    Package = "prepay_id=" + response.PrepayId,
+                };
+                var parameter = await _client.ExecuteAsync(req);
+                // 将参数(parameter)给 公众号前端 让他在微信内H5调起支付(https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=7_7&index=6)
+                ViewData["parameter"] = JsonConvert.SerializeObject(parameter);
+                ViewData["response"] = response.Body;
+                return View();
+            }
+            ViewData["response"] = response.Body;
+            return View();
+        }
+
+        [HttpGet]
+        public IActionResult QRPay()
+        {
+            return View();
+        }
+
+        [HttpPost]
+        public async Task<IActionResult> QRPay(WeChatPayQRPayViewModel 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);
+            // response.CodeUrl 给前端生成二维码
+            ViewData["qrcode"] = response.CodeUrl;
+            ViewData["response"] = response.Body;
+            return View();
+        }
+
+        [HttpGet]
+        public IActionResult AppPay()
+        {
+            return View();
+        }
+
+        [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);
+
+            if (response.ReturnCode == "SUCCESS" && response.ResultCode == "SUCCESS")
+            {
+                var req = new WeChatPayAppCallPaymentRequest()
+                {
+                    PrepayId = response.PrepayId,
+                };
+                var parameter = await _client.ExecuteAsync(req);
+                // 将参数(parameter)给 ios/android端 让他调起微信APP(https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=8_5)
+                ViewData["parameter"] = JsonConvert.SerializeObject(parameter);
+                ViewData["response"] = response.Body;
+                return View();
+            }
+            ViewData["response"] = response.Body;
+            return View();
+        }
+
+        [HttpGet]
+        public IActionResult H5Pay()
+        {
+            return View();
+        }
+
+        [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);
+            ViewData["response"] = response.Body;
+            return View();
+        }
+
+        [HttpGet]
+        public IActionResult LiteAppPay()
+        {
+            return View();
+        }
+
+        [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);
+
+            if (response.ReturnCode == "SUCCESS" && response.ResultCode == "SUCCESS")
+            {
+                var req = new WeChatPayLiteAppCallPaymentRequest()
+                {
+                    Package = "prepay_id=" + response.PrepayId,
+                };
+                var parameter = await _client.ExecuteAsync(req);
+                // 将参数(parameter)给 小程序前端 让他调起支付API(https://pay.weixin.qq.com/wiki/doc/api/wxa/wxa_api.php?chapter=7_7&index=5)
+                ViewData["parameter"] = JsonConvert.SerializeObject(parameter);
+                ViewData["response"] = response.Body;
+                return View();
+            }
+            ViewData["response"] = response.Body;
+            return View();
+        }
+
+        [HttpGet]
+        public IActionResult OrderQuery()
+        {
+            return View();
+        }
+
+        [HttpPost]
+        public async Task<IActionResult> OrderQuery(WeChatPayOrderQueryViewModel viewModel)
+        {
+            var request = new WeChatPayOrderQueryRequest()
+            {
+                TransactionId = viewModel.TransactionId,
+                OutTradeNo = viewModel.OutTradeNo,
+            };
+            var response = await _client.ExecuteAsync(request);
+            ViewData["response"] = response.Body;
+            return View();
+        }
+
+        [HttpGet]
+        public IActionResult Reverse()
+        {
+            return View();
+        }
+
+        [HttpPost]
+        public async Task<IActionResult> Reverse(WeChatPayReverseViewModel viewModel)
+        {
+            var request = new WeChatPayReverseRequest()
+            {
+                TransactionId = viewModel.TransactionId,
+                OutTradeNo = viewModel.OutTradeNo,
+            };
+            var response = await _client.ExecuteAsync(request);
+            ViewData["response"] = response.Body;
+            return View();
+        }
+
+        [HttpGet]
+        public IActionResult CloseOrder()
+        {
+            return View();
+        }
+
+        [HttpPost]
+        public async Task<IActionResult> CloseOrder(WeChatPayCloseOrderViewModel viewModel)
+        {
+            var request = new WeChatPayCloseOrderRequest()
+            {
+                OutTradeNo = viewModel.OutTradeNo,
+            };
+            var response = await _client.ExecuteAsync(request);
+            ViewData["response"] = response.Body;
+            return View();
+        }
+
+        [HttpGet]
+        public IActionResult Refund()
+        {
+            return View();
+        }
+
+        [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);
+            ViewData["response"] = response.Body;
+            return View();
+        }
+
+        [HttpGet]
+        public IActionResult RefundQuery()
+        {
+            return View();
+        }
+
+        [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);
+            ViewData["response"] = response.Body;
+            return View();
+        }
+
+        [HttpGet]
+        public IActionResult DownloadBill()
+        {
+            return View();
+        }
+
+        [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);
+            ViewData["response"] = response.Body;
+            return View();
+        }
+
+        [HttpGet]
+        public IActionResult DownloadFundFlow()
+        {
+            return View();
+        }
+
+        [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);
+            ViewData["response"] = response.Body;
+            return View();
+        }
+
+        [HttpGet]
+        public IActionResult Transfers()
+        {
+            return View();
+        }
+
+        [HttpPost]
+        public async Task<IActionResult> Transfers(WeChatPayTransfersViewModel viewModel)
+        {
+            var request = new WeChatPayTransfersRequest()
+            {
+                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);
+            ViewData["response"] = response.Body;
+            return View();
+        }
+
+        [HttpGet]
+        public IActionResult GetTransferInfo()
+        {
+            return View();
+        }
+
+        [HttpPost]
+        public async Task<IActionResult> GetTransferInfo(WeChatPayGetTransferInfoViewModel viewModel)
+        {
+            var request = new WeChatPayGetTransferInfoRequest()
+            {
+                PartnerTradeNo = viewModel.PartnerTradeNo,
+            };
+            var response = await _client.ExecuteAsync(request);
+            ViewData["response"] = response.Body;
+            return View();
+        }
+
+        [HttpGet]
+        public IActionResult PayBank()
+        {
+            return View();
+        }
+
+        [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);
+            ViewData["response"] = response.Body;
+            return View();
+        }
+
+        [HttpGet]
+        public IActionResult QueryBank()
+        {
+            return View();
+        }
+
+        [HttpPost]
+        public async Task<IActionResult> QueryBank(WeChatPayQueryBankViewModel viewModel)
+        {
+            var request = new WeChatPayQueryBankRequest()
+            {
+                PartnerTradeNo = viewModel.PartnerTradeNo,
+            };
+            var response = await _client.ExecuteAsync(request);
+            ViewData["response"] = response.Body;
+            return View();
+        }
+
+        [HttpGet]
+        [HttpPost]
+        public async Task<IActionResult> GetPublicKey()
+        {
+            if (Request.Method == "POST")
+            {
+                var request = new WeChatPayGetPublicKeyRequest();
+                var response = await _client.ExecuteAsync(request);
+                ViewData["response"] = response.Body;
+                return View();
+            }
+            else
+            {
+                return View();
+            }
+        }
+    }
+}

+ 21 - 0
samples/NewWebApplicationSample/Helpers/HMTLHelperExtensions.cs

@@ -0,0 +1,21 @@
+using Microsoft.AspNetCore.Mvc.Rendering;
+
+namespace NewWebApplicationSample
+{
+    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;
+        }
+    }
+}

+ 216 - 0
samples/NewWebApplicationSample/Models/AlipayViewModel.cs

@@ -0,0 +1,216 @@
+using System.ComponentModel.DataAnnotations;
+
+namespace NewWebApplicationSample.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; }
+
+        [Display(Name = "notify_url")]
+        public string NotifyUrl { 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; }
+
+        [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; }
+    }
+
+    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/NewWebApplicationSample/Models/ErrorViewModel.cs

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

+ 128 - 0
samples/NewWebApplicationSample/Models/JDPayViewModel.cs

@@ -0,0 +1,128 @@
+using System.ComponentModel.DataAnnotations;
+
+namespace NewWebApplicationSample.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; }
+    }
+}

+ 165 - 0
samples/NewWebApplicationSample/Models/LianLianPayViewModel.cs

@@ -0,0 +1,165 @@
+using System.ComponentModel.DataAnnotations;
+
+namespace NewWebApplicationSample.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; }
+
+        [Display(Name = "bank_code")]
+        public string BankCode { get; set; }
+
+        [Display(Name = "pay_type")]
+        public string PayType { get; set; }
+
+        [Display(Name = "no_agree")]
+        public string NoAgree { get; set; }
+
+        [Required]
+        [Display(Name = "risk_item")]
+        public string RiskItem { get; set; }
+
+        [Display(Name = "id_type")]
+        public string IdType { get; set; }
+
+        [Display(Name = "id_no")]
+        public string IdNo { get; set; }
+
+        [Display(Name = "acct_name")]
+        public string AcctName { get; set; }
+
+        [Display(Name = "card_no")]
+        public string CardNo { get; set; }
+    }
+
+    public class LianLianPayWapQuickPayViewModel
+    {
+        [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 = "app_request")]
+        public string AppRequest { get; set; }
+
+        [Required]
+        [Display(Name = "notify_url")]
+        public string NotifyUrl { get; set; }
+
+        [Display(Name = "url_return")]
+        public string UrlReturn { get; set; }
+
+        [Display(Name = "no_agree")]
+        public string NoAgree { get; set; }
+
+        [Required]
+        [Display(Name = "risk_item")]
+        public string RiskItem { get; set; }
+
+        [Display(Name = "id_type")]
+        public string IdType { get; set; }
+
+        [Display(Name = "id_no")]
+        public string IdNo { get; set; }
+
+        [Display(Name = "acct_name")]
+        public string AcctName { get; set; }
+
+        [Display(Name = "card_no")]
+        public string CardNo { 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; }
+    }
+}

+ 152 - 0
samples/NewWebApplicationSample/Models/QPayViewModel.cs

@@ -0,0 +1,152 @@
+using System;
+using System.ComponentModel.DataAnnotations;
+
+namespace NewWebApplicationSample.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; }
+    }
+}

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

@@ -0,0 +1,33 @@
+using System.ComponentModel.DataAnnotations;
+
+namespace NewWebApplicationSample.Models
+{
+    public class UnionPayForm_6_2_FrontConsumeViewModel
+    {
+        [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/NewWebApplicationSample/Models/WeChatPayViewModel.cs

@@ -0,0 +1,335 @@
+using System.ComponentModel.DataAnnotations;
+
+namespace NewWebApplicationSample.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 WeChatPayQRPayViewModel
+    {
+        [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; }
+    }
+}

+ 33 - 0
samples/NewWebApplicationSample/NewWebApplicationSample.csproj

@@ -0,0 +1,33 @@
+<Project Sdk="Microsoft.NET.Sdk.Web">
+
+  <PropertyGroup>
+    <TargetFramework>netcoreapp2.0</TargetFramework>
+    <UserSecretsId>a59ca38e-9b52-44fe-b3d2-8cb5a1641623</UserSecretsId>
+    <Version>1.0.0</Version>
+  </PropertyGroup>
+
+  <ItemGroup>
+    <PackageReference Include="Microsoft.AspNetCore.All" Version="2.0.7" />
+    <PackageReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Design" Version="2.0.3" />
+  </ItemGroup>
+
+  <ItemGroup>
+    <DotNetCliToolReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Tools" Version="2.0.3" />
+  </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>
+
+  <ItemGroup>
+    <Content Update="Views\LianLianPay\WapQuickPayReturn.cshtml">
+      <Pack>$(IncludeRazorContentInPack)</Pack>
+    </Content>
+  </ItemGroup>
+
+</Project>

+ 19 - 0
samples/NewWebApplicationSample/Program.cs

@@ -0,0 +1,19 @@
+using Microsoft.AspNetCore;
+using Microsoft.AspNetCore.Hosting;
+
+namespace NewWebApplicationSample
+{
+    public class Program
+    {
+        public static void Main(string[] args)
+        {
+            BuildWebHost(args).Run();
+        }
+
+        public static IWebHost BuildWebHost(string[] args) =>
+            WebHost.CreateDefaultBuilder(args)
+                .UseStartup<Startup>()
+                .UseUrls("http://*:5000")
+                .Build();
+    }
+}

+ 19 - 0
samples/NewWebApplicationSample/Properties/PublishProfiles/FolderProfile.pubxml

@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+此文件由 Web 项目的发布/打包过程使用。可以通过编辑此 MSBuild 文件
+自定义此过程的行为。为了解与此相关的更多内容,请访问 https://go.microsoft.com/fwlink/?LinkID=208121。 
+-->
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <WebPublishMethod>FileSystem</WebPublishMethod>
+    <PublishProvider>FileSystem</PublishProvider>
+    <LastUsedBuildConfiguration>Release</LastUsedBuildConfiguration>
+    <LastUsedPlatform>Any CPU</LastUsedPlatform>
+    <SiteUrlToLaunchAfterPublish />
+    <LaunchSiteAfterPublish>True</LaunchSiteAfterPublish>
+    <ExcludeApp_Data>False</ExcludeApp_Data>
+    <ProjectGuid>53148c9a-e48e-45b1-b382-6485e4da1006</ProjectGuid>
+    <publishUrl>bin\Release\PublishOutput</publishUrl>
+    <DeleteExistingFiles>False</DeleteExistingFiles>
+  </PropertyGroup>
+</Project>

+ 27 - 0
samples/NewWebApplicationSample/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"
+      }
+    },
+    "NewWebApplicationSample": {
+      "commandName": "Project",
+      "launchBrowser": true,
+      "environmentVariables": {
+        "ASPNETCORE_ENVIRONMENT": "Development"
+      },
+      "applicationUrl": "http://localhost:5000/"
+    }
+  }
+}

+ 73 - 0
samples/NewWebApplicationSample/Startup.cs

@@ -0,0 +1,73 @@
+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 System.Text.Encodings.Web;
+using System.Text.Unicode;
+
+namespace NewWebApplicationSample
+{
+    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)
+        {
+            services.AddMvc();
+
+            services.AddAlipay();
+            services.AddJDPay();
+            services.AddQPay();
+            services.AddUnionPay();
+            services.AddWeChatPay();
+            services.AddLianLianPay();
+
+            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.AddWebEncoders(opt =>
+            {
+                opt.TextEncoderSettings = new TextEncoderSettings(UnicodeRanges.All);
+            });
+        }
+
+        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
+        public void Configure(IApplicationBuilder app, IHostingEnvironment env)
+        {
+            if (env.IsDevelopment())
+            {
+                app.UseBrowserLink();
+                app.UseDeveloperExceptionPage();
+            }
+            else
+            {
+                app.UseExceptionHandler("/Home/Error");
+            }
+
+            app.UseStaticFiles();
+
+            app.UseMvc(routes =>
+            {
+                routes.MapRoute(
+                    name: "default",
+                    template: "{controller=Home}/{action=Index}/{id?}");
+            });
+        }
+    }
+}

+ 49 - 0
samples/NewWebApplicationSample/Views/Alipay/AppPay.cshtml

@@ -0,0 +1,49 @@
+@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="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/NewWebApplicationSample/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/NewWebApplicationSample/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-dark">
+    <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/NewWebApplicationSample/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/NewWebApplicationSample/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>

+ 57 - 0
samples/NewWebApplicationSample/Views/Alipay/Pay.cshtml

@@ -0,0 +1,57 @@
+@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>
+            <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>Response:</label>
+                <textarea class="form-control" rows="10">@ViewData["response"]</textarea>
+            </div>
+        </form>
+    </div>
+</div>
+@section Scripts {
+    @{await Html.RenderPartialAsync("_ValidationScriptsPartial"); }
+}

+ 56 - 0
samples/NewWebApplicationSample/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))
+                {
+                    <img src="http://pan.baidu.com/share/qrcode?w=168&h=168&url=@ViewData["qrcode"]" />
+                }
+            </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/NewWebApplicationSample/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/NewWebApplicationSample/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/NewWebApplicationSample/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/NewWebApplicationSample/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/NewWebApplicationSample/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/NewWebApplicationSample/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/NewWebApplicationSample/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/NewWebApplicationSample/Views/Home/Gratuity.cshtml

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

+ 85 - 0
samples/NewWebApplicationSample/Views/Home/Index.cshtml

@@ -0,0 +1,85 @@
+@{
+    ViewData["Title"] = "前言";
+}
+<h5>@ViewData["Title"]</h5>
+<p>
+    Payment 是基于 .NET Core 2.0 / ASP NET Core 开发的支付SDK集。
+</p>
+<h5>注意</h5>
+<p>
+    本Demo仅作为测试用途,基本涵盖了常用的API。用作实际业务时,请务必配合相关API说明及文档处理。
+</p>
+<br />
+<h5>NuGet 程序包:</h5>
+<table class="table table-dark">
+    <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>

+ 58 - 0
samples/NewWebApplicationSample/Views/JDPay/Index.cshtml

@@ -0,0 +1,58 @@
+@{
+    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-dark">
+    <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="QRPay">立即测试</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>
+    </tbody>
+</table>

+ 69 - 0
samples/NewWebApplicationSample/Views/JDPay/QRPay.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="QRPay">
+            <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))
+            {
+                <img src="http://pan.baidu.com/share/qrcode?w=168&h=168&url=@ViewData["qrcode"]" />
+        }
+            </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/NewWebApplicationSample/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/NewWebApplicationSample/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/NewWebApplicationSample/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/NewWebApplicationSample/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/NewWebApplicationSample/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/NewWebApplicationSample/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"); }
+}

+ 52 - 0
samples/NewWebApplicationSample/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-dark">
+    <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>WAP快捷支付</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="WapQuickPay">立即测试</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/NewWebApplicationSample/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"); }
+}

+ 57 - 0
samples/NewWebApplicationSample/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/NewWebApplicationSample/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"); }
+}

+ 78 - 0
samples/NewWebApplicationSample/Views/LianLianPay/WapQuickPay.cshtml

@@ -0,0 +1,78 @@
+@model LianLianPayWapQuickPayViewModel
+@{
+    ViewData["Title"] = "WAP快捷支付";
+}
+<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="WapQuickPay" 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="AppRequest"></label>
+                <input type="text" class="form-control" asp-for="AppRequest" value="3" />
+            </div>
+            <div class="form-group">
+                <label asp-for="NotifyUrl"></label>
+                <input type="text" class="form-control" asp-for="NotifyUrl" value="http://*/notify/lianlianpay/wapquickpay" />
+            </div>
+            <div class="form-group">
+                <label asp-for="UrlReturn"></label>
+                <input type="text" class="form-control" asp-for="UrlReturn" value="http://*/lianlianpay/wapquickpayreturn" />
+            </div>
+            <div class="form-group">
+                <label asp-for="NoAgree"></label>
+                <input type="text" class="form-control" asp-for="NoAgree" />
+            </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>
+            <div class="form-group">
+                <label asp-for="IdType"></label>
+                <input type="text" class="form-control" asp-for="IdType" />
+            </div>
+            <div class="form-group">
+                <label asp-for="IdNo"></label>
+                <input type="text" class="form-control" asp-for="IdNo" />
+            </div>
+            <div class="form-group">
+                <label asp-for="AcctName"></label>
+                <input type="text" class="form-control" asp-for="AcctName" />
+            </div>
+            <div class="form-group">
+                <label asp-for="CardNo"></label>
+                <input type="text" class="form-control" asp-for="CardNo" />
+            </div>
+            <button type="submit" class="btn btn-primary">提交请求</button>
+        </form>
+    </div>
+</div>
+@section Scripts {
+    @{await Html.RenderPartialAsync("_ValidationScriptsPartial"); }
+}

+ 15 - 0
samples/NewWebApplicationSample/Views/LianLianPay/WapQuickPayReturn.cshtml

@@ -0,0 +1,15 @@
+@{
+    ViewData["Title"] = "WAP快捷支付-同步跳转";
+}
+<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>

+ 82 - 0
samples/NewWebApplicationSample/Views/LianLianPay/WebQuickPay.cshtml

@@ -0,0 +1,82 @@
+@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/webquickpay" />
+            </div>
+            <div class="form-group">
+                <label asp-for="UrlReturn"></label>
+                <input type="text" class="form-control" asp-for="UrlReturn" value="http://*/lianlianpay/webquickpayreturn" />
+            </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="PayType"></label>
+                <input type="text" class="form-control" asp-for="PayType" />
+            </div>
+            <div class="form-group">
+                <label asp-for="NoAgree"></label>
+                <input type="text" class="form-control" asp-for="NoAgree" />
+            </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>
+            <div class="form-group">
+                <label asp-for="IdType"></label>
+                <input type="text" class="form-control" asp-for="IdType" />
+            </div>
+            <div class="form-group">
+                <label asp-for="IdNo"></label>
+                <input type="text" class="form-control" asp-for="IdNo" />
+            </div>
+            <div class="form-group">
+                <label asp-for="AcctName"></label>
+                <input type="text" class="form-control" asp-for="AcctName" />
+            </div>
+            <div class="form-group">
+                <label asp-for="CardNo"></label>
+                <input type="text" class="form-control" asp-for="CardNo" />
+            </div>
+            <button type="submit" class="btn btn-primary">提交请求</button>
+        </form>
+    </div>
+</div>
+@section Scripts {
+    @{await Html.RenderPartialAsync("_ValidationScriptsPartial"); }
+}

+ 15 - 0
samples/NewWebApplicationSample/Views/LianLianPay/WebQuickPayReturn.cshtml

@@ -0,0 +1,15 @@
+@{
+    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">
+        @ViewData["response"]
+    </div>
+</div>

+ 57 - 0
samples/NewWebApplicationSample/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"); }
+}

+ 33 - 0
samples/NewWebApplicationSample/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"); }
+}

+ 82 - 0
samples/NewWebApplicationSample/Views/QPay/Index.cshtml

@@ -0,0 +1,82 @@
+@{
+    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-dark">
+    <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/qpaywiki/showdocument.php?pid=1&docid=185" 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/qpaywiki/showdocument.php?pid=38&docid=58" target="_blank">https://qpay.qq.com/cgi-bin/pay/qpay_unified_order.cgi</a></td>
+            <td><a asp-controller="QPay" asp-action="QRPay">立即测试</a></td>
+        </tr>
+        <tr>
+            <th scope="row">3</th>
+            <td>公众号支付-统一下单</td>
+            <td><a href="https://qpay.qq.com/qpaywiki/showdocument.php?pid=38&docid=58" 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/qpaywiki/showdocument.php?pid=38&docid=58" 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/qpaywiki/showdocument.php?pid=1&docid=5" 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/qpaywiki/showdocument.php?pid=38&docid=61" 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/qpaywiki/showdocument.php?pid=38&docid=62" 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/qpaywiki/showdocument.php?pid=38&docid=63" 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/qpaywiki/showdocument.php?pid=38&docid=64" 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>
+    </tbody>
+</table>

+ 65 - 0
samples/NewWebApplicationSample/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/NewWebApplicationSample/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/NewWebApplicationSample/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/NewWebApplicationSample/Views/QPay/QRPay.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="QRPay">
+            <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))
+                {
+                    <img src="http://pan.baidu.com/share/qrcode?w=168&h=168&url=@ViewData["qrcode"]" />
+                }
+            </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/NewWebApplicationSample/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/NewWebApplicationSample/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/NewWebApplicationSample/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/NewWebApplicationSample/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/NewWebApplicationSample/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>

+ 91 - 0
samples/NewWebApplicationSample/Views/Shared/_Layout.cshtml

@@ -0,0 +1,91 @@
+<!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://ajax.aspnetcdn.com/ajax/bootstrap/4.0.0/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" />
+        <link rel="stylesheet" href="~/css/site.min.css" asp-append-version="true" />
+    </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 @Html.IsActive(controller: "Home", action: "Index", activeClass: "col-blue")">Payment</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(controller: "Alipay")">
+                        <a class="nav-link" asp-controller="Alipay" asp-action="Index">支付宝</a>
+                    </li>
+                    <li class="nav-item @Html.IsActive(controller: "WeChatPay")">
+                        <a class="nav-link" asp-controller="WeChatPay" asp-action="Index">微信支付</a>
+                    </li>
+                    <li class="nav-item @Html.IsActive(controller: "QPay")">
+                        <a class="nav-link" asp-controller="QPay" asp-action="Index">QQ钱包</a>
+                    </li>
+                    <li class="nav-item @Html.IsActive(controller: "JDPay")">
+                        <a class="nav-link" asp-controller="JDPay" asp-action="Index">京东支付</a>
+                    </li>
+                    <li class="nav-item @Html.IsActive(controller: "LianLianPay")">
+                        <a class="nav-link" asp-controller="LianLianPay" asp-action="Index">连连支付</a>
+                    </li>
+                    <li class="nav-item @Html.IsActive(controller: "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(controller: "Home", action: "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">交流Q群:<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.js"></script>
+        <script src="~/js/site.js" asp-append-version="true"></script>
+    </environment>
+    <environment exclude="Development">
+        <script src="https://ajax.aspnetcdn.com/ajax/jQuery/jquery-3.3.1.min.js"
+                asp-fallback-src="~/lib/jquery/dist/jquery.min.js"
+                asp-fallback-test="window.jQuery"
+                crossorigin="anonymous"
+                integrity="sha384-tsQFqpEReu7ZLhBV2VZlAu7zcOV+rXbYlF2cqB8txI/8aZajjp4Bqd+V6D5IgvKT">
+        </script>
+        <script src="https://ajax.aspnetcdn.com/ajax/bootstrap/4.0.0/bootstrap.min.js"
+                asp-fallback-src="~/lib/bootstrap/dist/js/bootstrap.min.js"
+                asp-fallback-test="window.jQuery && window.jQuery.fn && window.jQuery.fn.modal"
+                crossorigin="anonymous"
+                integrity="sha384-JZR6Spejh4U02d8jOt6vLEHfe/JQGiRRSQQxSfFWpi1MquVdAyjUar5+76PVCmYl">
+        </script>
+        <script src="~/js/site.min.js" asp-append-version="true"></script>
+    </environment>
+
+    @RenderSection("Scripts", required: false)
+</body>
+</html>

+ 18 - 0
samples/NewWebApplicationSample/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://ajax.aspnetcdn.com/ajax/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="sha384-rZfj/ogBloos6wzLGpPkkOr/gpkBNLZ6b6yLy4o+ok+t/SAKlL5mvXLr0OXNi1Hp">
+    </script>
+    <script src="https://ajax.aspnetcdn.com/ajax/jquery.validation.unobtrusive/3.2.9/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="sha384-ifv0TYDWxBHzvAk2Z0n8R434FL1Rlv/Av18DXE43N/1rvHyOG4izKst0f2iSLdds">
+    </script>
+</environment>

+ 50 - 0
samples/NewWebApplicationSample/Views/UnionPay/FrontConsume62.cshtml

@@ -0,0 +1,50 @@
+@model UnionPayForm_6_2_FrontConsumeViewModel
+@{
+    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="FrontConsume62" 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/frontconsume62return" />
+            </div>
+            <div class="form-group">
+                <label asp-for="BackUrl"></label>
+                <input type="text" class="form-control" asp-for="BackUrl" value="http://*/notify/unionpay/frontconsume62" />
+            </div>
+            <button type="submit" class="btn btn-primary">提交请求</button>
+        </form>
+    </div>
+</div>
+@section Scripts {
+    @{await Html.RenderPartialAsync("_ValidationScriptsPartial"); }
+}

+ 15 - 0
samples/NewWebApplicationSample/Views/UnionPay/FrontConsume62Return.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/NewWebApplicationSample/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-dark">
+    <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/ajweb/product/newProApiShow?proId=1&apiId=63" target="_blank">Form_6_2_FrontConsume</a></td>
+            <td><a asp-controller="UnionPay" asp-action="FrontConsume62">立即测试</a></td>
+        </tr>
+    </tbody>
+</table>

+ 57 - 0
samples/NewWebApplicationSample/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/NewWebApplicationSample/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/NewWebApplicationSample/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/NewWebApplicationSample/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/NewWebApplicationSample/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/NewWebApplicationSample/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/NewWebApplicationSample/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/NewWebApplicationSample/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-dark">
+    <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="QRPay">立即测试</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/NewWebApplicationSample/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/NewWebApplicationSample/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/NewWebApplicationSample/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/NewWebApplicationSample/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/NewWebApplicationSample/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/NewWebApplicationSample/Views/WeChatPay/QRPay.cshtml

@@ -0,0 +1,60 @@
+@model WeChatPayQRPayViewModel
+@{
+    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="QRPay">
+            <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))
+                {
+                    <img src="http://pan.baidu.com/share/qrcode?w=168&h=168&url=@ViewData["qrcode"]" />
+                }
+            </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/NewWebApplicationSample/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/NewWebApplicationSample/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/NewWebApplicationSample/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/NewWebApplicationSample/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/NewWebApplicationSample/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/NewWebApplicationSample/Views/_ViewImports.cshtml

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

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

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

+ 10 - 0
samples/NewWebApplicationSample/appsettings.Development.json

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

+ 8 - 0
samples/NewWebApplicationSample/appsettings.json

@@ -0,0 +1,8 @@
+{
+  "Logging": {
+    "IncludeScopes": false,
+    "LogLevel": {
+      "Default": "Warning"
+    }
+  }
+}

+ 24 - 0
samples/NewWebApplicationSample/bundleconfig.json

@@ -0,0 +1,24 @@
+// Configure bundling and minification for the project.
+// More info at https://go.microsoft.com/fwlink/?LinkId=808241
+[
+  {
+    "outputFileName": "wwwroot/css/site.min.css",
+    // An array of relative input file paths. Globbing patterns supported
+    "inputFiles": [
+      "wwwroot/css/site.css"
+    ]
+  },
+  {
+    "outputFileName": "wwwroot/js/site.min.js",
+    "inputFiles": [
+      "wwwroot/js/site.js"
+    ],
+    // Optionally specify minification options
+    "minify": {
+      "enabled": true,
+      "renameLocals": true
+    },
+    // Optionally generate .map file
+    "sourceMap": false
+  }
+]

+ 87 - 0
samples/NewWebApplicationSample/wwwroot/css/site.css

@@ -0,0 +1,87 @@
+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
+    }
+}
+
+.col-blue {
+    color: #007bff !important;
+}
+
+.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;
+}

+ 87 - 0
samples/NewWebApplicationSample/wwwroot/css/site.min.css

@@ -0,0 +1,87 @@
+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
+    }
+}
+
+.col-blue {
+    color: #007bff !important;
+}
+
+.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;
+}

BIN
samples/NewWebApplicationSample/wwwroot/favicon.ico


BIN
samples/NewWebApplicationSample/wwwroot/images/payment.png


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