Bladeren bron

示例迁移至 https://github.com/essensoft/paylinks-samples

Roc 8 maanden geleden
bovenliggende
commit
93f566db2b
100 gewijzigde bestanden met toevoegingen van 9 en 5246 verwijderingen
  1. 0 9
      Paylinks.sln
  2. 9 45
      README.md
  3. 0 23
      samples/Essensoft.Paylinks.Sample.Web/Essensoft.Paylinks.Sample.Web.csproj
  4. 0 22
      samples/Essensoft.Paylinks.Sample.Web/Extensions/HtmlHelpersExtensions.cs
  5. 0 20
      samples/Essensoft.Paylinks.Sample.Web/Pages/Alipay/Index.cshtml
  6. 0 10
      samples/Essensoft.Paylinks.Sample.Web/Pages/Alipay/Index.cshtml.cs
  7. 0 57
      samples/Essensoft.Paylinks.Sample.Web/Pages/Alipay/Payments/App.cshtml
  8. 0 34
      samples/Essensoft.Paylinks.Sample.Web/Pages/Alipay/Payments/App.cshtml.cs
  9. 0 49
      samples/Essensoft.Paylinks.Sample.Web/Pages/Alipay/Payments/BillDownloadUrlQuery.cshtml
  10. 0 32
      samples/Essensoft.Paylinks.Sample.Web/Pages/Alipay/Payments/BillDownloadUrlQuery.cshtml.cs
  11. 0 49
      samples/Essensoft.Paylinks.Sample.Web/Pages/Alipay/Payments/Cancel.cshtml
  12. 0 28
      samples/Essensoft.Paylinks.Sample.Web/Pages/Alipay/Payments/Cancel.cshtml.cs
  13. 0 53
      samples/Essensoft.Paylinks.Sample.Web/Pages/Alipay/Payments/Close.cshtml
  14. 0 32
      samples/Essensoft.Paylinks.Sample.Web/Pages/Alipay/Payments/Close.cshtml.cs
  15. 0 69
      samples/Essensoft.Paylinks.Sample.Web/Pages/Alipay/Payments/Create.cshtml
  16. 0 35
      samples/Essensoft.Paylinks.Sample.Web/Pages/Alipay/Payments/Create.cshtml.cs
  17. 0 364
      samples/Essensoft.Paylinks.Sample.Web/Pages/Alipay/Payments/Index.cshtml
  18. 0 10
      samples/Essensoft.Paylinks.Sample.Web/Pages/Alipay/Payments/Index.cshtml.cs
  19. 0 5
      samples/Essensoft.Paylinks.Sample.Web/Pages/Alipay/Payments/Notify/TradeResult.cshtml
  20. 0 37
      samples/Essensoft.Paylinks.Sample.Web/Pages/Alipay/Payments/Notify/TradeResult.cshtml.cs
  21. 0 65
      samples/Essensoft.Paylinks.Sample.Web/Pages/Alipay/Payments/Pay.cshtml
  22. 0 36
      samples/Essensoft.Paylinks.Sample.Web/Pages/Alipay/Payments/Pay.cshtml.cs
  23. 0 68
      samples/Essensoft.Paylinks.Sample.Web/Pages/Alipay/Payments/PreCreate.cshtml
  24. 0 36
      samples/Essensoft.Paylinks.Sample.Web/Pages/Alipay/Payments/PreCreate.cshtml.cs
  25. 0 49
      samples/Essensoft.Paylinks.Sample.Web/Pages/Alipay/Payments/Query.cshtml
  26. 0 28
      samples/Essensoft.Paylinks.Sample.Web/Pages/Alipay/Payments/Query.cshtml.cs
  27. 0 61
      samples/Essensoft.Paylinks.Sample.Web/Pages/Alipay/Payments/Refund.cshtml
  28. 0 33
      samples/Essensoft.Paylinks.Sample.Web/Pages/Alipay/Payments/Refund.cshtml.cs
  29. 0 53
      samples/Essensoft.Paylinks.Sample.Web/Pages/Alipay/Payments/RefundQuery.cshtml
  30. 0 28
      samples/Essensoft.Paylinks.Sample.Web/Pages/Alipay/Payments/RefundQuery.cshtml.cs
  31. 0 62
      samples/Essensoft.Paylinks.Sample.Web/Pages/Alipay/Payments/Wap.cshtml
  32. 0 46
      samples/Essensoft.Paylinks.Sample.Web/Pages/Alipay/Payments/Wap.cshtml.cs
  33. 0 62
      samples/Essensoft.Paylinks.Sample.Web/Pages/Alipay/Payments/Web.cshtml
  34. 0 46
      samples/Essensoft.Paylinks.Sample.Web/Pages/Alipay/Payments/Web.cshtml.cs
  35. 0 45
      samples/Essensoft.Paylinks.Sample.Web/Pages/Alipay/SecurityTools/ConvertCertPrivateKey.cshtml
  36. 0 29
      samples/Essensoft.Paylinks.Sample.Web/Pages/Alipay/SecurityTools/ConvertCertPrivateKey.cshtml.cs
  37. 0 45
      samples/Essensoft.Paylinks.Sample.Web/Pages/Alipay/SecurityTools/GetCertPublicKey.cshtml
  38. 0 29
      samples/Essensoft.Paylinks.Sample.Web/Pages/Alipay/SecurityTools/GetCertPublicKey.cshtml.cs
  39. 0 45
      samples/Essensoft.Paylinks.Sample.Web/Pages/Alipay/SecurityTools/GetCertSN.cshtml
  40. 0 29
      samples/Essensoft.Paylinks.Sample.Web/Pages/Alipay/SecurityTools/GetCertSN.cshtml.cs
  41. 0 45
      samples/Essensoft.Paylinks.Sample.Web/Pages/Alipay/SecurityTools/GetRootCertSN.cshtml
  42. 0 29
      samples/Essensoft.Paylinks.Sample.Web/Pages/Alipay/SecurityTools/GetRootCertSN.cshtml.cs
  43. 0 24
      samples/Essensoft.Paylinks.Sample.Web/Pages/Alipay/SecurityTools/Index.cshtml
  44. 0 10
      samples/Essensoft.Paylinks.Sample.Web/Pages/Alipay/SecurityTools/Index.cshtml.cs
  45. 0 26
      samples/Essensoft.Paylinks.Sample.Web/Pages/Error.cshtml
  46. 0 26
      samples/Essensoft.Paylinks.Sample.Web/Pages/Error.cshtml.cs
  47. 0 14
      samples/Essensoft.Paylinks.Sample.Web/Pages/Index.cshtml
  48. 0 10
      samples/Essensoft.Paylinks.Sample.Web/Pages/Index.cshtml.cs
  49. 0 114
      samples/Essensoft.Paylinks.Sample.Web/Pages/Shared/_Layout.cshtml
  50. 0 2
      samples/Essensoft.Paylinks.Sample.Web/Pages/Shared/_Layout.cshtml.css
  51. 0 2
      samples/Essensoft.Paylinks.Sample.Web/Pages/Shared/_ValidationScriptsPartial.cshtml
  52. 0 20
      samples/Essensoft.Paylinks.Sample.Web/Pages/WeChatPay/Index.cshtml
  53. 0 10
      samples/Essensoft.Paylinks.Sample.Web/Pages/WeChatPay/Index.cshtml.cs
  54. 0 65
      samples/Essensoft.Paylinks.Sample.Web/Pages/WeChatPay/Payments/AbnormalRefund.cshtml
  55. 0 31
      samples/Essensoft.Paylinks.Sample.Web/Pages/WeChatPay/Payments/AbnormalRefund.cshtml.cs
  56. 0 72
      samples/Essensoft.Paylinks.Sample.Web/Pages/WeChatPay/Payments/AppPrepay.cshtml
  57. 0 46
      samples/Essensoft.Paylinks.Sample.Web/Pages/WeChatPay/Payments/AppPrepay.cshtml.cs
  58. 0 49
      samples/Essensoft.Paylinks.Sample.Web/Pages/WeChatPay/Payments/Close.cshtml
  59. 0 32
      samples/Essensoft.Paylinks.Sample.Web/Pages/WeChatPay/Payments/Close.cshtml.cs
  60. 0 69
      samples/Essensoft.Paylinks.Sample.Web/Pages/WeChatPay/Payments/CodePay.cshtml
  61. 0 39
      samples/Essensoft.Paylinks.Sample.Web/Pages/WeChatPay/Payments/CodePay.cshtml.cs
  62. 0 45
      samples/Essensoft.Paylinks.Sample.Web/Pages/WeChatPay/Payments/DownloadBill.cshtml
  63. 0 26
      samples/Essensoft.Paylinks.Sample.Web/Pages/WeChatPay/Payments/DownloadBill.cshtml.cs
  64. 0 45
      samples/Essensoft.Paylinks.Sample.Web/Pages/WeChatPay/Payments/FundFlowBill.cshtml
  65. 0 29
      samples/Essensoft.Paylinks.Sample.Web/Pages/WeChatPay/Payments/FundFlowBill.cshtml.cs
  66. 0 80
      samples/Essensoft.Paylinks.Sample.Web/Pages/WeChatPay/Payments/H5Prepay.cshtml
  67. 0 39
      samples/Essensoft.Paylinks.Sample.Web/Pages/WeChatPay/Payments/H5Prepay.cshtml.cs
  68. 0 1140
      samples/Essensoft.Paylinks.Sample.Web/Pages/WeChatPay/Payments/Index.cshtml
  69. 0 10
      samples/Essensoft.Paylinks.Sample.Web/Pages/WeChatPay/Payments/Index.cshtml.cs
  70. 0 76
      samples/Essensoft.Paylinks.Sample.Web/Pages/WeChatPay/Payments/JsapiPrepay.cshtml
  71. 0 47
      samples/Essensoft.Paylinks.Sample.Web/Pages/WeChatPay/Payments/JsapiPrepay.cshtml.cs
  72. 0 76
      samples/Essensoft.Paylinks.Sample.Web/Pages/WeChatPay/Payments/NativePrepay.cshtml
  73. 0 39
      samples/Essensoft.Paylinks.Sample.Web/Pages/WeChatPay/Payments/NativePrepay.cshtml.cs
  74. 0 5
      samples/Essensoft.Paylinks.Sample.Web/Pages/WeChatPay/Payments/Notify/RefundResult.cshtml
  75. 0 57
      samples/Essensoft.Paylinks.Sample.Web/Pages/WeChatPay/Payments/Notify/RefundResult.cshtml.cs
  76. 0 5
      samples/Essensoft.Paylinks.Sample.Web/Pages/WeChatPay/Payments/Notify/TransactionSuccess.cshtml
  77. 0 38
      samples/Essensoft.Paylinks.Sample.Web/Pages/WeChatPay/Payments/Notify/TransactionSuccess.cshtml.cs
  78. 0 49
      samples/Essensoft.Paylinks.Sample.Web/Pages/WeChatPay/Payments/QueryByOutTradeNo.cshtml
  79. 0 32
      samples/Essensoft.Paylinks.Sample.Web/Pages/WeChatPay/Payments/QueryByOutTradeNo.cshtml.cs
  80. 0 49
      samples/Essensoft.Paylinks.Sample.Web/Pages/WeChatPay/Payments/QueryByTransactionId.cshtml
  81. 0 32
      samples/Essensoft.Paylinks.Sample.Web/Pages/WeChatPay/Payments/QueryByTransactionId.cshtml.cs
  82. 0 69
      samples/Essensoft.Paylinks.Sample.Web/Pages/WeChatPay/Payments/Refund.cshtml
  83. 0 35
      samples/Essensoft.Paylinks.Sample.Web/Pages/WeChatPay/Payments/Refund.cshtml.cs
  84. 0 45
      samples/Essensoft.Paylinks.Sample.Web/Pages/WeChatPay/Payments/RefundQueryByOutRefundNo.cshtml
  85. 0 26
      samples/Essensoft.Paylinks.Sample.Web/Pages/WeChatPay/Payments/RefundQueryByOutRefundNo.cshtml.cs
  86. 0 53
      samples/Essensoft.Paylinks.Sample.Web/Pages/WeChatPay/Payments/Reverse.cshtml
  87. 0 36
      samples/Essensoft.Paylinks.Sample.Web/Pages/WeChatPay/Payments/Reverse.cshtml.cs
  88. 0 45
      samples/Essensoft.Paylinks.Sample.Web/Pages/WeChatPay/Payments/TradeBill.cshtml
  89. 0 29
      samples/Essensoft.Paylinks.Sample.Web/Pages/WeChatPay/Payments/TradeBill.cshtml.cs
  90. 0 45
      samples/Essensoft.Paylinks.Sample.Web/Pages/WeChatPay/SecurityTools/ConvertCertPrivateKey.cshtml
  91. 0 29
      samples/Essensoft.Paylinks.Sample.Web/Pages/WeChatPay/SecurityTools/ConvertCertPrivateKey.cshtml.cs
  92. 0 21
      samples/Essensoft.Paylinks.Sample.Web/Pages/WeChatPay/SecurityTools/Index.cshtml
  93. 0 10
      samples/Essensoft.Paylinks.Sample.Web/Pages/WeChatPay/SecurityTools/Index.cshtml.cs
  94. 0 6
      samples/Essensoft.Paylinks.Sample.Web/Pages/_ViewImports.cshtml
  95. 0 3
      samples/Essensoft.Paylinks.Sample.Web/Pages/_ViewStart.cshtml
  96. 0 20
      samples/Essensoft.Paylinks.Sample.Web/PaylinksOptions.cs
  97. 0 38
      samples/Essensoft.Paylinks.Sample.Web/Program.cs
  98. 0 12
      samples/Essensoft.Paylinks.Sample.Web/Properties/launchSettings.json
  99. 0 183
      samples/Essensoft.Paylinks.Sample.Web/Services/WeChatPayBackgroundService.cs
  100. 0 9
      samples/Essensoft.Paylinks.Sample.Web/appsettings.Development.json

+ 0 - 9
Paylinks.sln

@@ -37,10 +37,6 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Essensoft.Paylinks.Alipay.M
 EndProject
 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Essensoft.Paylinks.Alipay.Payments", "src\Essensoft.Paylinks.Alipay.Payments\Essensoft.Paylinks.Alipay.Payments.csproj", "{6ABD7368-BEDC-4357-85CB-35168553D9A2}"
 EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "samples", "samples", "{45CFA2CF-2657-44D8-BE32-694318537385}"
-EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Essensoft.Paylinks.Sample.Web", "samples\Essensoft.Paylinks.Sample.Web\Essensoft.Paylinks.Sample.Web.csproj", "{6CF2DF33-5C3C-4ABF-8A92-8E45C3ACAFB7}"
-EndProject
 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "test", "test", "{7C8578D4-64B9-46BC-B1B0-1452D925711B}"
 EndProject
 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Essensoft.Paylinks.Security.Tests", "test\Essensoft.Paylinks.Security.Tests\Essensoft.Paylinks.Security.Tests.csproj", "{0109448B-BB12-48CB-8820-B1670899DDA7}"
@@ -95,10 +91,6 @@ Global
 		{6ABD7368-BEDC-4357-85CB-35168553D9A2}.Debug|Any CPU.Build.0 = Debug|Any CPU
 		{6ABD7368-BEDC-4357-85CB-35168553D9A2}.Release|Any CPU.ActiveCfg = Release|Any CPU
 		{6ABD7368-BEDC-4357-85CB-35168553D9A2}.Release|Any CPU.Build.0 = Release|Any CPU
-		{6CF2DF33-5C3C-4ABF-8A92-8E45C3ACAFB7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
-		{6CF2DF33-5C3C-4ABF-8A92-8E45C3ACAFB7}.Debug|Any CPU.Build.0 = Debug|Any CPU
-		{6CF2DF33-5C3C-4ABF-8A92-8E45C3ACAFB7}.Release|Any CPU.ActiveCfg = Release|Any CPU
-		{6CF2DF33-5C3C-4ABF-8A92-8E45C3ACAFB7}.Release|Any CPU.Build.0 = Release|Any CPU
 		{0109448B-BB12-48CB-8820-B1670899DDA7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
 		{0109448B-BB12-48CB-8820-B1670899DDA7}.Debug|Any CPU.Build.0 = Debug|Any CPU
 		{0109448B-BB12-48CB-8820-B1670899DDA7}.Release|Any CPU.ActiveCfg = Release|Any CPU
@@ -126,7 +118,6 @@ Global
 		{D2F94E9E-4396-4584-8E22-CB17796A2677} = {D3871E61-CA47-4BD0-8BF9-B64A42B2200D}
 		{F1465B3F-BF77-44B9-A85E-66A1B054388A} = {D3871E61-CA47-4BD0-8BF9-B64A42B2200D}
 		{6ABD7368-BEDC-4357-85CB-35168553D9A2} = {D3871E61-CA47-4BD0-8BF9-B64A42B2200D}
-		{6CF2DF33-5C3C-4ABF-8A92-8E45C3ACAFB7} = {45CFA2CF-2657-44D8-BE32-694318537385}
 		{0109448B-BB12-48CB-8820-B1670899DDA7} = {7C8578D4-64B9-46BC-B1B0-1452D925711B}
 		{1FD54CA7-5937-4118-BD75-2C64582EF553} = {7C8578D4-64B9-46BC-B1B0-1452D925711B}
 		{56F84702-19F4-464F-8F67-226E0036EE35} = {7C8578D4-64B9-46BC-B1B0-1452D925711B}

+ 9 - 45
README.md

@@ -21,50 +21,14 @@
 - [.NET 8.0](https://dotnet.microsoft.com/download/dotnet/8.0)
 - [.NET 9.0](https://dotnet.microsoft.com/download/dotnet/9.0)
 
-### 示例配置选项
-
-```json
-  "Paylinks": {
-    "Alipay": {
-      // 网关地址
-      "ServerUrl": "https://openapi.alipay.com",
-      // 应用Id
-      "AppId": "",
-      // 应用私钥
-      "AppPrivateKey": "",
-      // 应用证书序列号
-      "AppCertSN": "",
-      // 支付宝公钥
-      "AlipayPublicKey": "",
-      // 支付宝证书序列号
-      "AlipayCertSN": "",
-      // 支付宝根证书序列号
-      "AlipayRootCertSN": "",
-      // 敏感信息对称加密算法类型,推荐:AES
-      "EncryptType": "",
-      // 敏感信息对称加密算法密钥
-      "EncryptKey": ""
-    },
-    "WeChatPay": {
-      // 网关地址
-      "ServerUrl": "https://api.mch.weixin.qq.com",
-      // 应用Id
-      "AppId": "",
-      // 商户号
-      "MchId": "",
-      // 商户证书序列号
-      "MchSerialNo": "",
-      // 商户证书私钥
-      "MchPrivateKey": "",
-      // 微信支付公钥
-      "WeChatPayPublicKey": "",
-      // 微信支付公钥Id(公钥序列号)
-      "WeChatPayPublicKeyId": "",
-      // 商户APIv3密钥
-      "APIv3Key": ""
-    }
-  }
-```
+### 配置选项
+
+* [AlipayClientOptions](src/Essensoft.Paylinks.Alipay.Client/AlipayClientOptions.cs)
+* [WeChatPayClientOptions](src/Essensoft.Paylinks.WeChatPay.Client/WeChatPayClientOptions.cs)
+
+### 示例
+
+- [Razor Pages](https://github.com/essensoft/paylinks-samples/src/Essensoft.Paylinks.Razor.Pages.Samples.Web)
 
 ### 原 Paylink
 
@@ -78,6 +42,6 @@
 
 如果您在使用的过程中碰到问题,可以通过下面几个途径寻求帮助,同时我们也鼓励资深用户通过下面的途径给新人提供帮助。
 
-- 飞书交流群: [加入链接](https://applink.feishu.cn/client/message/link/open?token=AmaiieikwYAcZrEQ9XnAAAE%3D)
 - QQ交流群: 522457525 [加入链接](https://qm.qq.com/q/lOhqmDT0hG)
 - 钉钉交流群: 34090889 [加入链接](https://qr.dingtalk.com/action/joingroup?code=v1,k1,1tAeOJxsgOjngwZZD/uEhtWpOiU3B9CQK8Xs1wHdau4=&_dt_no_comment=1&origin=11)
+- 飞书交流群: [加入链接](https://applink.feishu.cn/client/message/link/open?token=AmaiieikwYAcZrEQ9XnAAAE%3D)

+ 0 - 23
samples/Essensoft.Paylinks.Sample.Web/Essensoft.Paylinks.Sample.Web.csproj

@@ -1,23 +0,0 @@
-<Project Sdk="Microsoft.NET.Sdk.Web">
-
-	<PropertyGroup>
-		<TargetFramework>net9.0</TargetFramework>
-		<Nullable>enable</Nullable>
-		<ImplicitUsings>enable</ImplicitUsings>
-	</PropertyGroup>
-
-	<ItemGroup>
-		<ProjectReference Include="..\..\src\Essensoft.Paylinks.Alipay.Client\Essensoft.Paylinks.Alipay.Client.csproj" />
-		<ProjectReference Include="..\..\src\Essensoft.Paylinks.Alipay.Mvc\Essensoft.Paylinks.Alipay.Mvc.csproj" />
-		<ProjectReference Include="..\..\src\Essensoft.Paylinks.Alipay.Payments\Essensoft.Paylinks.Alipay.Payments.csproj" />
-		<ProjectReference Include="..\..\src\Essensoft.Paylinks.WeChatPay.Client\Essensoft.Paylinks.WeChatPay.Client.csproj" />
-		<ProjectReference Include="..\..\src\Essensoft.Paylinks.WeChatPay.Mvc\Essensoft.Paylinks.WeChatPay.Mvc.csproj" />
-		<ProjectReference Include="..\..\src\Essensoft.Paylinks.WeChatPay.Certificates\Essensoft.Paylinks.WeChatPay.Certificates.csproj" />
-		<ProjectReference Include="..\..\src\Essensoft.Paylinks.WeChatPay.Payments\Essensoft.Paylinks.WeChatPay.Payments.csproj" />
-	</ItemGroup>
-
-	<ItemGroup>
-		<PackageReference Include="QRCoder" Version="1.6.0" />
-	</ItemGroup>
-
-</Project>

+ 0 - 22
samples/Essensoft.Paylinks.Sample.Web/Extensions/HtmlHelpersExtensions.cs

@@ -1,22 +0,0 @@
-// ReSharper disable CheckNamespace
-
-namespace Microsoft.AspNetCore.Mvc.Rendering;
-
-public static class HtmlHelpersExtensions
-{
-    public static string IsActive(this IHtmlHelper html, string? page, string activeClass = "active")
-    {
-        if (string.IsNullOrEmpty(page))
-        {
-            return string.Empty;
-        }
-
-        var actualPage = html.ViewContext.RouteData.Values.GetValueOrDefault("page")?.ToString();
-        if (string.IsNullOrEmpty(actualPage))
-        {
-            return string.Empty;
-        }
-
-        return actualPage.StartsWith(page, StringComparison.OrdinalIgnoreCase) ? activeClass : string.Empty;
-    }
-}

+ 0 - 20
samples/Essensoft.Paylinks.Sample.Web/Pages/Alipay/Index.cshtml

@@ -1,20 +0,0 @@
-@page
-@model IndexModel
-@{
-    ViewData["Title"] = "支付宝";
-}
-<nav aria-label="breadcrumb">
-    <ol class="breadcrumb">
-        <li class="breadcrumb-item">
-            <a asp-page="/Index">首页</a>
-        </li>
-        <li class="breadcrumb-item active" aria-current="page">@ViewData["Title"]</li>
-    </ol>
-</nav>
-<div class="mb-3">
-    <div class="list-group">
-        <a class="list-group-item list-group-item-action" asp-page="/Alipay/Payments/Index">支付产品</a>
-        <a class="list-group-item list-group-item-action" asp-page="/Alipay/SecurityTools/Index">安全工具</a>
-        <a class="list-group-item list-group-item-action">更多...</a>
-    </div>
-</div>

+ 0 - 10
samples/Essensoft.Paylinks.Sample.Web/Pages/Alipay/Index.cshtml.cs

@@ -1,10 +0,0 @@
-using Microsoft.AspNetCore.Mvc.RazorPages;
-
-namespace Essensoft.Paylinks.Sample.Web.Pages.Alipay;
-
-public class IndexModel : PageModel
-{
-    public void OnGet()
-    {
-    }
-}

+ 0 - 57
samples/Essensoft.Paylinks.Sample.Web/Pages/Alipay/Payments/App.cshtml

@@ -1,57 +0,0 @@
-@page
-@model AppModel
-@{
-    ViewData["Title"] = "alipay.trade.app.pay(app支付接口2.0)";
-}
-<nav aria-label="breadcrumb">
-    <ol class="breadcrumb">
-        <li class="breadcrumb-item">
-            <a asp-page="/Index">首页</a>
-        </li>
-        <li class="breadcrumb-item">
-            <a asp-page="/Alipay/Index">支付宝</a>
-        </li>
-        <li class="breadcrumb-item">
-            <a asp-page="/Alipay/Payments/Index">支付产品</a>
-        </li>
-        <li class="breadcrumb-item active" aria-current="page">@ViewData["Title"]</li>
-    </ol>
-</nav>
-<div class="card mb-3">
-    <div class="card-header">
-        @ViewData["Title"]
-    </div>
-    <div class="card-body">
-        <form method="post">
-            <div class="mb-3">
-                <label class="form-label" asp-for="Input.OutTradeNo"></label>
-                <input class="form-control" asp-for="Input.OutTradeNo"/>
-            </div>
-            <div class="mb-3">
-                <label class="form-label" asp-for="Input.TotalAmount"></label>
-                <input class="form-control" asp-for="Input.TotalAmount"/>
-            </div>
-            <div class="mb-3">
-                <label class="form-label" asp-for="Input.Subject"></label>
-                <input class="form-control" asp-for="Input.Subject"/>
-            </div>
-            <div class="mb-3">
-                <label class="form-label" asp-for="Input.NotifyUrl"></label>
-                <input class="form-control" asp-for="Input.NotifyUrl"/>
-            </div>
-            <button class="btn btn-primary mb-3" type="submit">提交请求</button>
-        </form>
-        <hr/>
-        @if (ViewData["response"] is string response && !string.IsNullOrEmpty(response))
-        {
-            <div class="mb-3">
-                <label class="form-label">应答</label>
-                <textarea class="form-control" rows="10">@response</textarea>
-            </div>
-        }
-    </div>
-</div>
-
-@section scripts {
-    @{ await Html.RenderPartialAsync("_ValidationScriptsPartial"); }
-}

+ 0 - 34
samples/Essensoft.Paylinks.Sample.Web/Pages/Alipay/Payments/App.cshtml.cs

@@ -1,34 +0,0 @@
-using Essensoft.Paylinks.Alipay.Client;
-using Essensoft.Paylinks.Alipay.Payments.Model;
-using Essensoft.Paylinks.Alipay.Payments.Request;
-using Microsoft.AspNetCore.Mvc;
-using Microsoft.AspNetCore.Mvc.RazorPages;
-using Microsoft.Extensions.Options;
-
-namespace Essensoft.Paylinks.Sample.Web.Pages.Alipay.Payments;
-
-public class AppModel(IAlipayClient client, IOptions<PaylinksOptions> options) : PageModel
-{
-    private readonly AlipayClientOptions _options = options.Value.Alipay;
-
-    [BindProperty]
-    public AlipayTradeAppPayBizModel Input { get; set; }
-
-    public void OnGet()
-    {
-        Input = new AlipayTradeAppPayBizModel
-        {
-            OutTradeNo = DateTimeOffset.Now.ToString("yyyyMMddHHmmssfff"),
-            TotalAmount = "0.01",
-            Subject = "App支付测试",
-            NotifyUrl = "https://www.domain.com/Alipay/Payments/Notify/TradeResult"
-        };
-    }
-
-    public async Task OnPostAsync()
-    {
-        var request = new AlipayTradeAppPayRequest();
-        request.SetBizModel(Input);
-        ViewData["response"] = await client.SdkExecuteAsync(request, _options);
-    }
-}

+ 0 - 49
samples/Essensoft.Paylinks.Sample.Web/Pages/Alipay/Payments/BillDownloadUrlQuery.cshtml

@@ -1,49 +0,0 @@
-@page
-@model BillDownloadUrlQueryModel
-@{
-    ViewData["Title"] = "查询对账单下载地址";
-}
-<nav aria-label="breadcrumb">
-    <ol class="breadcrumb">
-        <li class="breadcrumb-item">
-            <a asp-page="/Index">首页</a>
-        </li>
-        <li class="breadcrumb-item">
-            <a asp-page="/Alipay/Index">支付宝</a>
-        </li>
-        <li class="breadcrumb-item">
-            <a asp-page="/Alipay/Payments/Index">支付产品</a>
-        </li>
-        <li class="breadcrumb-item active" aria-current="page">@ViewData["Title"]</li>
-    </ol>
-</nav>
-<div class="card mb-3">
-    <div class="card-header">
-        @ViewData["Title"]
-    </div>
-    <div class="card-body">
-        <form method="post">
-            <div class="mb-3">
-                <label class="form-label" asp-for="Input.BillType"></label>
-                <input class="form-control" asp-for="Input.BillType"/>
-            </div>
-            <div class="mb-3">
-                <label class="form-label" asp-for="Input.BillDate"></label>
-                <input class="form-control" asp-for="Input.BillDate"/>
-            </div>
-            <button class="btn btn-primary mb-3" type="submit">提交请求</button>
-        </form>
-        <hr/>
-        @if (ViewData["response"] is string response && !string.IsNullOrEmpty(response))
-        {
-            <div class="mb-3">
-                <label class="form-label">应答</label>
-                <textarea class="form-control" rows="10">@response</textarea>
-            </div>
-        }
-    </div>
-</div>
-
-@section scripts {
-    @{ await Html.RenderPartialAsync("_ValidationScriptsPartial"); }
-}

+ 0 - 32
samples/Essensoft.Paylinks.Sample.Web/Pages/Alipay/Payments/BillDownloadUrlQuery.cshtml.cs

@@ -1,32 +0,0 @@
-using Essensoft.Paylinks.Alipay.Client;
-using Essensoft.Paylinks.Alipay.Payments.Model;
-using Essensoft.Paylinks.Alipay.Payments.Request;
-using Microsoft.AspNetCore.Mvc;
-using Microsoft.AspNetCore.Mvc.RazorPages;
-using Microsoft.Extensions.Options;
-
-namespace Essensoft.Paylinks.Sample.Web.Pages.Alipay.Payments;
-
-public class BillDownloadUrlQueryModel(IAlipayClient client, IOptions<PaylinksOptions> options) : PageModel
-{
-    private readonly AlipayClientOptions _options = options.Value.Alipay;
-
-    [BindProperty]
-    public AlipayDataDataServiceBillDownloadUrlQueryModel Input { get; set; }
-
-    public void OnGet()
-    {
-        Input = new AlipayDataDataServiceBillDownloadUrlQueryModel
-        {
-            BillType = "trade"
-        };
-    }
-
-    public async Task OnPostAsync()
-    {
-        var request = new AlipayDataDataServiceBillDownloadUrlQueryRequest();
-        request.SetQueryModel(Input);
-        var response = await client.ExecuteAsync(request, _options);
-        ViewData["response"] = response.Body;
-    }
-}

+ 0 - 49
samples/Essensoft.Paylinks.Sample.Web/Pages/Alipay/Payments/Cancel.cshtml

@@ -1,49 +0,0 @@
-@page
-@model CancelModel
-@{
-    ViewData["Title"] = "统一收单交易撤销";
-}
-<nav aria-label="breadcrumb">
-    <ol class="breadcrumb">
-        <li class="breadcrumb-item">
-            <a asp-page="/Index">首页</a>
-        </li>
-        <li class="breadcrumb-item">
-            <a asp-page="/Alipay/Index">支付宝</a>
-        </li>
-        <li class="breadcrumb-item">
-            <a asp-page="/Alipay/Payments/Index">支付产品</a>
-        </li>
-        <li class="breadcrumb-item active" aria-current="page">@ViewData["Title"]</li>
-    </ol>
-</nav>
-<div class="card mb-3">
-    <div class="card-header">
-        @ViewData["Title"]
-    </div>
-    <div class="card-body">
-        <form method="post">
-            <div class="mb-3">
-                <label class="form-label" asp-for="Input.TradeNo"></label>
-                <input class="form-control" asp-for="Input.TradeNo"/>
-            </div>
-            <div class="mb-3">
-                <label class="form-label" asp-for="Input.OutTradeNo"></label>
-                <input class="form-control" asp-for="Input.OutTradeNo"/>
-            </div>
-            <button class="btn btn-primary mb-3" type="submit">提交请求</button>
-        </form>
-        <hr/>
-        @if (ViewData["response"] is string response && !string.IsNullOrEmpty(response))
-        {
-            <div class="mb-3">
-                <label class="form-label">应答</label>
-                <textarea class="form-control" rows="10">@response</textarea>
-            </div>
-        }
-    </div>
-</div>
-
-@section scripts {
-    @{ await Html.RenderPartialAsync("_ValidationScriptsPartial"); }
-}

+ 0 - 28
samples/Essensoft.Paylinks.Sample.Web/Pages/Alipay/Payments/Cancel.cshtml.cs

@@ -1,28 +0,0 @@
-using Essensoft.Paylinks.Alipay.Client;
-using Essensoft.Paylinks.Alipay.Payments.Model;
-using Essensoft.Paylinks.Alipay.Payments.Request;
-using Microsoft.AspNetCore.Mvc;
-using Microsoft.AspNetCore.Mvc.RazorPages;
-using Microsoft.Extensions.Options;
-
-namespace Essensoft.Paylinks.Sample.Web.Pages.Alipay.Payments;
-
-public class CancelModel(IAlipayClient client, IOptions<PaylinksOptions> options) : PageModel
-{
-    private readonly AlipayClientOptions _options = options.Value.Alipay;
-
-    [BindProperty]
-    public AlipayTradeCancelBodyModel Input { get; set; }
-
-    public void OnGet()
-    {
-    }
-
-    public async Task OnPostAsync()
-    {
-        var request = new AlipayTradeCancelRequest();
-        request.SetBodyModel(Input);
-        var response = await client.ExecuteAsync(request, _options);
-        ViewData["response"] = response.Body;
-    }
-}

+ 0 - 53
samples/Essensoft.Paylinks.Sample.Web/Pages/Alipay/Payments/Close.cshtml

@@ -1,53 +0,0 @@
-@page
-@model CloseModel
-@{
-    ViewData["Title"] = "统一收单交易关闭";
-}
-<nav aria-label="breadcrumb">
-    <ol class="breadcrumb">
-        <li class="breadcrumb-item">
-            <a asp-page="/Index">首页</a>
-        </li>
-        <li class="breadcrumb-item">
-            <a asp-page="/Alipay/Index">支付宝</a>
-        </li>
-        <li class="breadcrumb-item">
-            <a asp-page="/Alipay/Payments/Index">支付产品</a>
-        </li>
-        <li class="breadcrumb-item active" aria-current="page">@ViewData["Title"]</li>
-    </ol>
-</nav>
-<div class="card mb-3">
-    <div class="card-header">
-        @ViewData["Title"]
-    </div>
-    <div class="card-body">
-        <form method="post">
-            <div class="mb-3">
-                <label class="form-label" asp-for="Input.TradeNo"></label>
-                <input class="form-control" asp-for="Input.TradeNo"/>
-            </div>
-            <div class="mb-3">
-                <label class="form-label" asp-for="Input.OutTradeNo"></label>
-                <input class="form-control" asp-for="Input.OutTradeNo"/>
-            </div>
-            <div class="mb-3">
-                <label class="form-label" asp-for="Input.NotifyUrl"></label>
-                <input class="form-control" asp-for="Input.NotifyUrl"/>
-            </div>
-            <button class="btn btn-primary mb-3" type="submit">提交请求</button>
-        </form>
-        <hr/>
-        @if (ViewData["response"] is string response && !string.IsNullOrEmpty(response))
-        {
-            <div class="mb-3">
-                <label class="form-label">应答</label>
-                <textarea class="form-control" rows="10">@response</textarea>
-            </div>
-        }
-    </div>
-</div>
-
-@section scripts {
-    @{ await Html.RenderPartialAsync("_ValidationScriptsPartial"); }
-}

+ 0 - 32
samples/Essensoft.Paylinks.Sample.Web/Pages/Alipay/Payments/Close.cshtml.cs

@@ -1,32 +0,0 @@
-using Essensoft.Paylinks.Alipay.Client;
-using Essensoft.Paylinks.Alipay.Payments.Model;
-using Essensoft.Paylinks.Alipay.Payments.Request;
-using Microsoft.AspNetCore.Mvc;
-using Microsoft.AspNetCore.Mvc.RazorPages;
-using Microsoft.Extensions.Options;
-
-namespace Essensoft.Paylinks.Sample.Web.Pages.Alipay.Payments;
-
-public class CloseModel(IAlipayClient client, IOptions<PaylinksOptions> options) : PageModel
-{
-    private readonly AlipayClientOptions _options = options.Value.Alipay;
-
-    [BindProperty]
-    public AlipayTradeCloseBodyModel Input { get; set; }
-
-    public void OnGet()
-    {
-        Input = new AlipayTradeCloseBodyModel
-        {
-            NotifyUrl = "https://www.domain.com/Alipay/Payments/Notify/TradeResult"
-        };
-    }
-
-    public async Task OnPostAsync()
-    {
-        var request = new AlipayTradeCloseRequest();
-        request.SetBodyModel(Input);
-        var response = await client.ExecuteAsync(request, _options);
-        ViewData["response"] = response.Body;
-    }
-}

+ 0 - 69
samples/Essensoft.Paylinks.Sample.Web/Pages/Alipay/Payments/Create.cshtml

@@ -1,69 +0,0 @@
-@page
-@model CreateModel
-@{
-    ViewData["Title"] = "统一收单交易创建";
-}
-<nav aria-label="breadcrumb">
-    <ol class="breadcrumb">
-        <li class="breadcrumb-item">
-            <a asp-page="/Index">首页</a>
-        </li>
-        <li class="breadcrumb-item">
-            <a asp-page="/Alipay/Index">支付宝</a>
-        </li>
-        <li class="breadcrumb-item">
-            <a asp-page="/Alipay/Payments/Index">支付产品</a>
-        </li>
-        <li class="breadcrumb-item active" aria-current="page">@ViewData["Title"]</li>
-    </ol>
-</nav>
-<div class="card mb-3">
-    <div class="card-header">
-        @ViewData["Title"]
-    </div>
-    <div class="card-body">
-        <form method="post">
-            <div class="mb-3">
-                <label class="form-label" asp-for="Input.OutTradeNo"></label>
-                <input class="form-control" asp-for="Input.OutTradeNo"/>
-            </div>
-            <div class="mb-3">
-                <label class="form-label" asp-for="Input.TotalAmount"></label>
-                <input class="form-control" asp-for="Input.TotalAmount"/>
-            </div>
-            <div class="mb-3">
-                <label class="form-label" asp-for="Input.BuyerId"></label>
-                <input class="form-control" asp-for="Input.BuyerId"/>
-            </div>
-            <div class="mb-3">
-                <label class="form-label" asp-for="Input.BuyerOpenId"></label>
-                <input class="form-control" asp-for="Input.BuyerOpenId"/>
-            </div>
-            <div class="mb-3">
-                <label class="form-label" asp-for="Input.BuyerLogonId"></label>
-                <input class="form-control" asp-for="Input.BuyerLogonId"/>
-            </div>
-            <div class="mb-3">
-                <label class="form-label" asp-for="Input.Subject"></label>
-                <input class="form-control" asp-for="Input.Subject"/>
-            </div>
-            <div class="mb-3">
-                <label class="form-label" asp-for="Input.NotifyUrl"></label>
-                <input class="form-control" asp-for="Input.NotifyUrl"/>
-            </div>
-            <button class="btn btn-primary mb-3" type="submit">提交请求</button>
-        </form>
-        <hr/>
-        @if (ViewData["response"] is string response && !string.IsNullOrEmpty(response))
-        {
-            <div class="mb-3">
-                <label class="form-label">应答</label>
-                <textarea class="form-control" rows="10">@response</textarea>
-            </div>
-        }
-    </div>
-</div>
-
-@section scripts {
-    @{ await Html.RenderPartialAsync("_ValidationScriptsPartial"); }
-}

+ 0 - 35
samples/Essensoft.Paylinks.Sample.Web/Pages/Alipay/Payments/Create.cshtml.cs

@@ -1,35 +0,0 @@
-using Essensoft.Paylinks.Alipay.Client;
-using Essensoft.Paylinks.Alipay.Payments.Model;
-using Essensoft.Paylinks.Alipay.Payments.Request;
-using Microsoft.AspNetCore.Mvc;
-using Microsoft.AspNetCore.Mvc.RazorPages;
-using Microsoft.Extensions.Options;
-
-namespace Essensoft.Paylinks.Sample.Web.Pages.Alipay.Payments;
-
-public class CreateModel(IAlipayClient client, IOptions<PaylinksOptions> options) : PageModel
-{
-    private readonly AlipayClientOptions _options = options.Value.Alipay;
-
-    [BindProperty]
-    public AlipayTradeCreateBodyModel Input { get; set; }
-
-    public void OnGet()
-    {
-        Input = new AlipayTradeCreateBodyModel
-        {
-            OutTradeNo = DateTimeOffset.Now.ToString("yyyyMMddHHmmssfff"),
-            TotalAmount = "0.01",
-            Subject = "扫码付款支付测试",
-            NotifyUrl = "https://www.domain.com/Alipay/Payments/Notify/TradeResult"
-        };
-    }
-
-    public async Task OnPostAsync()
-    {
-        var request = new AlipayTradeCreateRequest();
-        request.SetBodyModel(Input);
-        var response = await client.ExecuteAsync(request, _options);
-        ViewData["response"] = response.Body;
-    }
-}

+ 0 - 364
samples/Essensoft.Paylinks.Sample.Web/Pages/Alipay/Payments/Index.cshtml

@@ -1,364 +0,0 @@
-@page
-@model IndexModel
-@{
-    ViewData["Title"] = "支付产品";
-}
-<nav aria-label="breadcrumb">
-    <ol class="breadcrumb">
-        <li class="breadcrumb-item">
-            <a asp-page="/Index">首页</a>
-        </li>
-        <li class="breadcrumb-item">
-            <a asp-page="/Alipay/Index">支付宝</a>
-        </li>
-        <li class="breadcrumb-item active" aria-current="page">@ViewData["Title"]</li>
-    </ol>
-</nav>
-<div class="mb-3">
-<div class="accordion" id="accordionPayments">
-<div class="accordion-item">
-    <h2 class="accordion-header">
-        <button class="accordion-button collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#collapseF2FPay" aria-expanded="false" aria-controls="collapseF2FPay">
-            当面付
-        </button>
-    </h2>
-    <div id="collapseF2FPay" class="accordion-collapse collapse" data-bs-parent="#accordionPayments">
-        <div class="accordion-body">
-            <div class="accordion" id="accordionF2FPay">
-                <div class="accordion-item">
-                    <h2 class="accordion-header">
-                        <button class="accordion-button collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#collapseCodePay" aria-expanded="false" aria-controls="collapseCodePay">
-                            付款码支付
-                        </button>
-                    </h2>
-                    <div id="collapseCodePay" class="accordion-collapse collapse" data-bs-parent="#accordionF2FPay">
-                        <div class="accordion-body">
-                            <ul class="list-group">
-                                <li class="list-group-item d-flex justify-content-between align-items-center">
-                                    统一收单交易支付
-                                    <div class="btn-group">
-                                        <a class="btn btn-link btn-sm" href="https://opendocs.alipay.com/open-v3/08c7f9f8_alipay.trade.pay?scene=32&pathHash=cdb0ecb0" target="_blank">查看文档</a>
-                                        <a class="btn btn-link btn-sm" asp-page="/Alipay/Payments/Pay">去调试</a>
-                                    </div>
-                                </li>
-                                <li class="list-group-item d-flex justify-content-between align-items-center">
-                                    统一收单交易查询
-                                    <div class="btn-group">
-                                        <a class="btn btn-link btn-sm" href="https://opendocs.alipay.com/open-v3/cbe8826d_alipay.trade.query?scene=23&pathHash=956e67cd" target="_blank">查看文档</a>
-                                        <a class="btn btn-link btn-sm" asp-page="/Alipay/Payments/Query">去调试</a>
-                                    </div>
-                                </li>
-                                <li class="list-group-item d-flex justify-content-between align-items-center">
-                                    统一收单交易退款
-                                    <div class="btn-group">
-                                        <a class="btn btn-link btn-sm" href="https://opendocs.alipay.com/open-v3/6b16d4a2_alipay.trade.refund?scene=common&pathHash=24d0d3ca" target="_blank">查看文档</a>
-                                        <a class="btn btn-link btn-sm" asp-page="/Alipay/Payments/Refund">去调试</a>
-                                    </div>
-                                </li>
-                                <li class="list-group-item d-flex justify-content-between align-items-center">
-                                    统一收单交易退款查询
-                                    <div class="btn-group">
-                                        <a class="btn btn-link btn-sm" href="https://opendocs.alipay.com/open-v3/b9ef37bd_alipay.trade.fastpay.refund.query?scene=common&pathHash=84b7b273" target="_blank">查看文档</a>
-                                        <a class="btn btn-link btn-sm" asp-page="/Alipay/Payments/RefundQuery">去调试</a>
-                                    </div>
-                                </li>
-                                <li class="list-group-item d-flex justify-content-between align-items-center">
-                                    收单退款冲退完成通知
-                                    <div class="btn-group">
-                                        <a class="btn btn-link btn-sm" href="https://opendocs.alipay.com/open-v3/64342630_alipay.trade.refund.depositback.completed?scene=common&pathHash=6407afcc" target="_blank">查看文档</a>
-                                        <a class="btn btn-link btn-sm disabled" href="#">去调试</a>
-                                    </div>
-                                </li>
-                                <li class="list-group-item d-flex justify-content-between align-items-center">
-                                    统一收单交易撤销
-                                    <div class="btn-group">
-                                        <a class="btn btn-link btn-sm" href="https://opendocs.alipay.com/open-v3/cd7d54d2_alipay.trade.cancel?scene=common&pathHash=444c42f0" target="_blank">查看文档</a>
-                                        <a class="btn btn-link btn-sm" asp-page="/Alipay/Payments/Cancel">去调试</a>
-                                    </div>
-                                </li>
-                                <li class="list-group-item d-flex justify-content-between align-items-center">
-                                    统一收单交易关闭
-                                    <div class="btn-group">
-                                        <a class="btn btn-link btn-sm" href="https://opendocs.alipay.com/open-v3/48ea518b_alipay.trade.close?scene=common&pathHash=5bb01fc5" target="_blank">查看文档</a>
-                                        <a class="btn btn-link btn-sm" asp-page="/Alipay/Payments/Close">去调试</a>
-                                    </div>
-                                </li>
-                                <li class="list-group-item d-flex justify-content-between align-items-center">
-                                    查询对账单下载地址
-                                    <div class="btn-group">
-                                        <a class="btn btn-link btn-sm" href="https://opendocs.alipay.com/open-v3/c8d608d7_alipay.data.dataservice.bill.downloadurl.query?scene=common&pathHash=eb4624a4" target="_blank">查看文档</a>
-                                        <a class="btn btn-link btn-sm" asp-page="/Alipay/Payments/BillDownloadUrlQuery">去调试</a>
-                                    </div>
-                                </li>
-                            </ul>
-                        </div>
-                    </div>
-                </div>
-                <div class="accordion-item">
-                    <h2 class="accordion-header">
-                        <button class="accordion-button collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#collapseScanPay" aria-expanded="false" aria-controls="collapseScanPay">
-                            扫码支付
-                        </button>
-                    </h2>
-                    <div id="collapseScanPay" class="accordion-collapse collapse" data-bs-parent="#accordionF2FPay">
-                        <div class="accordion-body">
-                            <ul class="list-group">
-                                <li class="list-group-item d-flex justify-content-between align-items-center">
-                                    统一收单线下交易预创建
-                                    <div class="btn-group">
-                                        <a class="btn btn-link btn-sm" href="https://opendocs.alipay.com/open-v3/fa0c2141_alipay.trade.precreate?scene=19&pathHash=a2c4021f" target="_blank">查看文档</a>
-                                        <a class="btn btn-link btn-sm" asp-page="/Alipay/Payments/PreCreate">去调试</a>
-                                    </div>
-                                </li>
-                                <li class="list-group-item d-flex justify-content-between align-items-center">
-                                    统一收单交易创建
-                                    <div class="btn-group">
-                                        <a class="btn btn-link btn-sm" href="https://opendocs.alipay.com/open-v3/bf4eae5e_alipay.trade.create?scene=2d8d65b1350f44bfa394347f06700c4f&pathHash=e6c9a167" target="_blank">查看文档</a>
-                                        <a class="btn btn-link btn-sm" asp-page="/Alipay/Payments/Create">去调试</a>
-                                    </div>
-                                </li>
-                                <li class="list-group-item d-flex justify-content-between align-items-center">
-                                    统一收单交易查询
-                                    <div class="btn-group">
-                                        <a class="btn btn-link btn-sm" href="https://opendocs.alipay.com/open-v3/cbe8826d_alipay.trade.query?scene=23&pathHash=fe561798" target="_blank">查看文档</a>
-                                        <a class="btn btn-link btn-sm" asp-page="/Alipay/Payments/Query">去调试</a>
-                                    </div>
-                                </li>
-                                <li class="list-group-item d-flex justify-content-between align-items-center">
-                                    统一收单交易退款
-                                    <div class="btn-group">
-                                        <a class="btn btn-link btn-sm" href="https://opendocs.alipay.com/open-v3/6b16d4a2_alipay.trade.refund?scene=common&pathHash=d1f3f5f0" target="_blank">查看文档</a>
-                                        <a class="btn btn-link btn-sm" asp-page="/Alipay/Payments/Refund">去调试</a>
-                                    </div>
-                                </li>
-                                <li class="list-group-item d-flex justify-content-between align-items-center">
-                                    统一收单交易退款查询
-                                    <div class="btn-group">
-                                        <a class="btn btn-link btn-sm" href="https://opendocs.alipay.com/open-v3/b9ef37bd_alipay.trade.fastpay.refund.query?scene=common&pathHash=81e6a871" target="_blank">查看文档</a>
-                                        <a class="btn btn-link btn-sm" asp-page="/Alipay/Payments/RefundQuery">去调试</a>
-                                    </div>
-                                </li>
-                                <li class="list-group-item d-flex justify-content-between align-items-center">
-                                    收单退款冲退完成通知
-                                    <div class="btn-group">
-                                        <a class="btn btn-link btn-sm" href="https://opendocs.alipay.com/open-v3/05pf5a?scene=common&pathHash=a021a234" target="_blank">查看文档</a>
-                                        <a class="btn btn-link btn-sm disabled" href="#">去调试</a>
-                                    </div>
-                                </li>
-                                <li class="list-group-item d-flex justify-content-between align-items-center">
-                                    统一收单交易撤销
-                                    <div class="btn-group">
-                                        <a class="btn btn-link btn-sm" href="https://opendocs.alipay.com/open-v3/cd7d54d2_alipay.trade.cancel?scene=common&pathHash=3c33e48e" target="_blank">查看文档</a>
-                                        <a class="btn btn-link btn-sm" asp-page="/Alipay/Payments/Cancel">去调试</a>
-                                    </div>
-                                </li>
-                                <li class="list-group-item d-flex justify-content-between align-items-center">
-                                    统一收单交易关闭
-                                    <div class="btn-group">
-                                        <a class="btn btn-link btn-sm" href="https://opendocs.alipay.com/open-v3/48ea518b_alipay.trade.close?scene=common&pathHash=5e83149d" target="_blank">查看文档</a>
-                                        <a class="btn btn-link btn-sm" asp-page="/Alipay/Payments/Close">去调试</a>
-                                    </div>
-                                </li>
-                                <li class="list-group-item d-flex justify-content-between align-items-center">
-                                    查询对账单下载地址
-                                    <div class="btn-group">
-                                        <a class="btn btn-link btn-sm" href="https://opendocs.alipay.com/open-v3/c8d608d7_alipay.data.dataservice.bill.downloadurl.query?scene=common&pathHash=76f3d49a" target="_blank">查看文档</a>
-                                        <a class="btn btn-link btn-sm" asp-page="/Alipay/Payments/BillDownloadUrlQuery">去调试</a>
-                                    </div>
-                                </li>
-                            </ul>
-                        </div>
-                    </div>
-                </div>
-            </div>
-        </div>
-    </div>
-</div>
-<div class="accordion-item">
-    <h2 class="accordion-header">
-        <button class="accordion-button collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#collapseAppPay" aria-expanded="false" aria-controls="collapseAppPay">
-            APP支付
-        </button>
-    </h2>
-    <div id="collapseAppPay" class="accordion-collapse collapse" data-bs-parent="#accordionPayments">
-        <div class="accordion-body">
-            <ul class="list-group">
-                <li class="list-group-item d-flex justify-content-between align-items-center">
-                    alipay.trade.app.pay(app支付接口2.0)
-                    <div class="btn-group">
-                        <a class="btn btn-link btn-sm" href="https://opendocs.alipay.com/open-v3/429e4d75_alipay.trade.app.pay?scene=20&pathHash=2dfb24f8" target="_blank">查看文档</a>
-                        <a class="btn btn-link btn-sm" asp-page="/Alipay/Payments/App">去调试</a>
-                    </div>
-                </li>
-                <li class="list-group-item d-flex justify-content-between align-items-center">
-                    统一收单交易退款
-                    <div class="btn-group">
-                        <a class="btn btn-link btn-sm" href="https://opendocs.alipay.com/open-v3/da960891_alipay.trade.refund?scene=common&pathHash=846acb56" target="_blank">查看文档</a>
-                        <a class="btn btn-link btn-sm" asp-page="/Alipay/Payments/Refund">去调试</a>
-                    </div>
-                </li>
-                <li class="list-group-item d-flex justify-content-between align-items-center">
-                    收单退款冲退完成通知
-                    <div class="btn-group">
-                        <a class="btn btn-link btn-sm" href="https://opendocs.alipay.com/open-v3/fca5d17e_alipay.trade.refund.depositback.completed?scene=common&pathHash=1ad5a0e2" target="_blank">查看文档</a>
-                        <a class="btn btn-link btn-sm disabled" href="#">去调试</a>
-                    </div>
-                </li>
-                <li class="list-group-item d-flex justify-content-between align-items-center">
-                    统一收单交易关闭
-                    <div class="btn-group">
-                        <a class="btn btn-link btn-sm" href="https://opendocs.alipay.com/open-v3/06922cb4_alipay.trade.close?scene=common&pathHash=5874f81f" target="_blank">查看文档</a>
-                        <a class="btn btn-link btn-sm" asp-page="/Alipay/Payments/Close">去调试</a>
-                    </div>
-                </li>
-                <li class="list-group-item d-flex justify-content-between align-items-center">
-                    统一收单交易退款查询
-                    <div class="btn-group">
-                        <a class="btn btn-link btn-sm" href="https://opendocs.alipay.com/open-v3/b95db51d_alipay.trade.fastpay.refund.query?scene=common&pathHash=40e803a6" target="_blank">查看文档</a>
-                        <a class="btn btn-link btn-sm" asp-page="/Alipay/Payments/RefundQuery">去调试</a>
-                    </div>
-                </li>
-                <li class="list-group-item d-flex justify-content-between align-items-center">
-                    统一收单交易查询
-                    <div class="btn-group">
-                        <a class="btn btn-link btn-sm" href="https://opendocs.alipay.com/open-v3/cbe8826d_alipay.trade.query?scene=23&pathHash=956e67cd" target="_blank">查看文档</a>
-                        <a class="btn btn-link btn-sm" asp-page="/Alipay/Payments/Query">去调试</a>
-                    </div>
-                </li>
-                <li class="list-group-item d-flex justify-content-between align-items-center">
-                    查询对账单下载地址
-                    <div class="btn-group">
-                        <a class="btn btn-link btn-sm" href="https://opendocs.alipay.com/open-v3/cd439c70_alipay.trade.query?scene=23&pathHash=8b9f14fa" target="_blank">查看文档</a>
-                        <a class="btn btn-link btn-sm" asp-page="/Alipay/Payments/BillDownloadUrlQuery">去调试</a>
-                    </div>
-                </li>
-            </ul>
-        </div>
-    </div>
-</div>
-<div class="accordion-item">
-    <h2 class="accordion-header">
-        <button class="accordion-button collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#collapseWapPay" aria-expanded="false" aria-controls="collapseWapPay">
-            手机网站支付
-        </button>
-    </h2>
-    <div id="collapseWapPay" class="accordion-collapse collapse" data-bs-parent="#accordionPayments">
-        <div class="accordion-body">
-            <ul class="list-group">
-                <li class="list-group-item d-flex justify-content-between align-items-center">
-                    alipay.trade.wap.pay(手机网站支付接口2.0)
-                    <div class="btn-group">
-                        <a class="btn btn-link btn-sm" href="https://opendocs.alipay.com/open-v3/1a957be0_alipay.trade.wap.pay?scene=21&pathHash=5335df07" target="_blank">查看文档</a>
-                        <a class="btn btn-link btn-sm" asp-page="/Alipay/Payments/Wap">去调试</a>
-                    </div>
-                </li>
-                <li class="list-group-item d-flex justify-content-between align-items-center">
-                    统一收单交易退款
-                    <div class="btn-group">
-                        <a class="btn btn-link btn-sm" href="https://opendocs.alipay.com/open-v3/28d9fff7_alipay.trade.refund?scene=common&pathHash=f834ef01" target="_blank">查看文档</a>
-                        <a class="btn btn-link btn-sm" asp-page="/Alipay/Payments/Refund">去调试</a>
-                    </div>
-                </li>
-                <li class="list-group-item d-flex justify-content-between align-items-center">
-                    收单退款冲退完成通知
-                    <div class="btn-group">
-                        <a class="btn btn-link btn-sm" href="https://opendocs.alipay.com/open-v3/05w4la?scene=common&pathHash=da33cafe" target="_blank">查看文档</a>
-                        <a class="btn btn-link btn-sm disabled" href="#">去调试</a>
-                    </div>
-                </li>
-                <li class="list-group-item d-flex justify-content-between align-items-center">
-                    统一收单交易关闭
-                    <div class="btn-group">
-                        <a class="btn btn-link btn-sm" href="https://opendocs.alipay.com/open-v3/518cd726_alipay.trade.close?scene=common&pathHash=e489608b" target="_blank">查看文档</a>
-                        <a class="btn btn-link btn-sm" asp-page="/Alipay/Payments/Close">去调试</a>
-                    </div>
-                </li>
-                <li class="list-group-item d-flex justify-content-between align-items-center">
-                    统一收单交易退款查询
-                    <div class="btn-group">
-                        <a class="btn btn-link btn-sm" href="https://opendocs.alipay.com/open-v3/c8d05aa7_alipay.trade.fastpay.refund.query?scene=common&pathHash=0bb7639d" target="_blank">查看文档</a>
-                        <a class="btn btn-link btn-sm" asp-page="/Alipay/Payments/RefundQuery">去调试</a>
-                    </div>
-                </li>
-                <li class="list-group-item d-flex justify-content-between align-items-center">
-                    统一收单交易查询
-                    <div class="btn-group">
-                        <a class="btn btn-link btn-sm" href="https://opendocs.alipay.com/open-v3/34849591_alipay.trade.query?scene=common&pathHash=ffb65429" target="_blank">查看文档</a>
-                        <a class="btn btn-link btn-sm" asp-page="/Alipay/Payments/Query">去调试</a>
-                    </div>
-                </li>
-                <li class="list-group-item d-flex justify-content-between align-items-center">
-                    查询对账单下载地址
-                    <div class="btn-group">
-                        <a class="btn btn-link btn-sm" href="https://opendocs.alipay.com/open-v3/0f828127_alipay.data.dataservice.bill.downloadurl.query?scene=common&pathHash=0c48c55e" target="_blank">查看文档</a>
-                        <a class="btn btn-link btn-sm" asp-page="/Alipay/Payments/BillDownloadUrlQuery">去调试</a>
-                    </div>
-                </li>
-            </ul>
-        </div>
-    </div>
-</div>
-<div class="accordion-item">
-    <h2 class="accordion-header">
-        <button class="accordion-button collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#collapsePagePay" aria-expanded="false" aria-controls="collapsePagePay">
-            电脑网站支付
-        </button>
-    </h2>
-    <div id="collapsePagePay" class="accordion-collapse collapse" data-bs-parent="#accordionPayments">
-        <div class="accordion-body">
-            <ul class="list-group">
-                <li class="list-group-item d-flex justify-content-between align-items-center">
-                    alipay.trade.page.pay(统一收单下单并支付页面接口)
-                    <div class="btn-group">
-                        <a class="btn btn-link btn-sm" href="https://opendocs.alipay.com/open-v3/2423fad5_alipay.trade.page.pay?scene=22&pathHash=47147674" target="_blank">查看文档</a>
-                        <a class="btn btn-link btn-sm" asp-page="/Alipay/Payments/Web">去调试</a>
-                    </div>
-                </li>
-                <li class="list-group-item d-flex justify-content-between align-items-center">
-                    统一收单交易关闭
-                    <div class="btn-group">
-                        <a class="btn btn-link btn-sm" href="https://opendocs.alipay.com/open-v3/429ffb46_alipay.trade.close?scene=common&pathHash=1978534d" target="_blank">查看文档</a>
-                        <a class="btn btn-link btn-sm" asp-page="/Alipay/Payments/Close">去调试</a>
-                    </div>
-                </li>
-                <li class="list-group-item d-flex justify-content-between align-items-center">
-                    统一收单交易退款
-                    <div class="btn-group">
-                        <a class="btn btn-link btn-sm" href="https://opendocs.alipay.com/open-v3/01073208_alipay.trade.refund?scene=common&pathHash=17b803c8" target="_blank">查看文档</a>
-                        <a class="btn btn-link btn-sm" asp-page="/Alipay/Payments/Refund">去调试</a>
-                    </div>
-                </li>
-                <li class="list-group-item d-flex justify-content-between align-items-center">
-                    收单退款冲退完成通知
-                    <div class="btn-group">
-                        <a class="btn btn-link btn-sm" href="https://opendocs.alipay.com/open-v3/42a9ce75_alipay.trade.refund.depositback.completed?scene=common&pathHash=9c33d734" target="_blank">查看文档</a>
-                        <a class="btn btn-link btn-sm disabled" href="#">去调试</a>
-                    </div>
-                </li>
-                <li class="list-group-item d-flex justify-content-between align-items-center">
-                    统一收单交易查询
-                    <div class="btn-group">
-                        <a class="btn btn-link btn-sm" href="https://opendocs.alipay.com/open-v3/e9ce4f59_alipay.trade.query?scene=23&pathHash=582b62cd" target="_blank">查看文档</a>
-                        <a class="btn btn-link btn-sm" asp-page="/Alipay/Payments/Query">去调试</a>
-                    </div>
-                </li>
-                <li class="list-group-item d-flex justify-content-between align-items-center">
-                    统一收单交易退款查询
-                    <div class="btn-group">
-                        <a class="btn btn-link btn-sm" href="https://opendocs.alipay.com/open-v3/46bff59c_alipay.trade.fastpay.refund.query?scene=common&pathHash=dfc824f9" target="_blank">查看文档</a>
-                        <a class="btn btn-link btn-sm" asp-page="/Alipay/Payments/RefundQuery">去调试</a>
-                    </div>
-                </li>
-                <li class="list-group-item d-flex justify-content-between align-items-center">
-                    查询对账单下载地址
-                    <div class="btn-group">
-                        <a class="btn btn-link btn-sm" href="https://opendocs.alipay.com/open-v3/d6c4d425_alipay.data.dataservice.bill.downloadurl.query?scene=common&pathHash=871a2624" target="_blank">查看文档</a>
-                        <a class="btn btn-link btn-sm" asp-page="/Alipay/Payments/BillDownloadUrlQuery">去调试</a>
-                    </div>
-                </li>
-            </ul>
-        </div>
-    </div>
-</div>
-</div>
-</div>

+ 0 - 10
samples/Essensoft.Paylinks.Sample.Web/Pages/Alipay/Payments/Index.cshtml.cs

@@ -1,10 +0,0 @@
-using Microsoft.AspNetCore.Mvc.RazorPages;
-
-namespace Essensoft.Paylinks.Sample.Web.Pages.Alipay.Payments;
-
-public class IndexModel : PageModel
-{
-    public void OnGet()
-    {
-    }
-}

+ 0 - 5
samples/Essensoft.Paylinks.Sample.Web/Pages/Alipay/Payments/Notify/TradeResult.cshtml

@@ -1,5 +0,0 @@
-@page
-@model TradeResultModel
-@{
-    Layout = null;
-}

+ 0 - 37
samples/Essensoft.Paylinks.Sample.Web/Pages/Alipay/Payments/Notify/TradeResult.cshtml.cs

@@ -1,37 +0,0 @@
-using Essensoft.Paylinks.Alipay.Client;
-using Essensoft.Paylinks.Alipay.Core;
-using Essensoft.Paylinks.Alipay.Mvc;
-using Essensoft.Paylinks.Alipay.Mvc.Extensions;
-using Essensoft.Paylinks.Alipay.Payments.Notify;
-using Microsoft.AspNetCore.Mvc;
-using Microsoft.AspNetCore.Mvc.RazorPages;
-using Microsoft.Extensions.Options;
-
-namespace Essensoft.Paylinks.Sample.Web.Pages.Alipay.Payments.Notify;
-
-[IgnoreAntiforgeryToken]
-public class TradeResultModel(ILogger<TradeResultModel> logger, IAlipayNotifyClient client, IOptions<PaylinksOptions> options) : PageModel
-{
-    private readonly AlipayClientOptions _options = options.Value.Alipay;
-
-    /// <summary>
-    /// 支付成功通知
-    /// https://opendocs.alipay.com/open-v3/05pf4k?pathHash=01c6e762
-    /// </summary>
-    public async Task<IActionResult> OnPostAsync()
-    {
-        try
-        {
-            var parameters = await Request.GetAlipayParametersAsync();
-            var notify = await client.ExecuteAsync<AlipayTradeStatusSyncNotify>(parameters, _options);
-            // 请务必检查系统内业务状态,避免因重复通知遭受损失。
-            logger.LogInformation($"支付成功通知: TradeNo:{notify.TradeNo}, TotalAmount:{notify.TotalAmount}");
-            return AlipayNotifyResult.Success;
-        }
-        catch (AlipayException ex)
-        {
-            logger.LogError(ex.Message);
-            return AlipayNotifyResult.Fail;
-        }
-    }
-}

+ 0 - 65
samples/Essensoft.Paylinks.Sample.Web/Pages/Alipay/Payments/Pay.cshtml

@@ -1,65 +0,0 @@
-@page
-@model PayModel
-@{
-    ViewData["Title"] = "统一收单交易支付";
-}
-<nav aria-label="breadcrumb">
-    <ol class="breadcrumb">
-        <li class="breadcrumb-item">
-            <a asp-page="/Index">首页</a>
-        </li>
-        <li class="breadcrumb-item">
-            <a asp-page="/Alipay/Index">支付宝</a>
-        </li>
-        <li class="breadcrumb-item">
-            <a asp-page="/Alipay/Payments/Index">支付产品</a>
-        </li>
-        <li class="breadcrumb-item active" aria-current="page">@ViewData["Title"]</li>
-    </ol>
-</nav>
-<div class="card mb-3">
-    <div class="card-header">
-        @ViewData["Title"]
-    </div>
-    <div class="card-body">
-        <form method="post">
-            <div class="mb-3">
-                <label class="form-label" asp-for="Input.OutTradeNo"></label>
-                <input class="form-control" asp-for="Input.OutTradeNo"/>
-            </div>
-            <div class="mb-3">
-                <label class="form-label" asp-for="Input.TotalAmount"></label>
-                <input class="form-control" asp-for="Input.TotalAmount"/>
-            </div>
-            <div class="mb-3">
-                <label class="form-label" asp-for="Input.AuthCode"></label>
-                <input class="form-control" asp-for="Input.AuthCode"/>
-            </div>
-            <div class="mb-3">
-                <label class="form-label" asp-for="Input.Scene"></label>
-                <input class="form-control" asp-for="Input.Scene"/>
-            </div>
-            <div class="mb-3">
-                <label class="form-label" asp-for="Input.Subject"></label>
-                <input class="form-control" asp-for="Input.Subject"/>
-            </div>
-            <div class="mb-3">
-                <label class="form-label" asp-for="Input.NotifyUrl"></label>
-                <input class="form-control" asp-for="Input.NotifyUrl"/>
-            </div>
-            <button class="btn btn-primary mb-3" type="submit">提交请求</button>
-        </form>
-        <hr/>
-        @if (ViewData["response"] is string response && !string.IsNullOrEmpty(response))
-        {
-            <div class="mb-3">
-                <label class="form-label">应答</label>
-                <textarea class="form-control" rows="10">@response</textarea>
-            </div>
-        }
-    </div>
-</div>
-
-@section scripts {
-    @{ await Html.RenderPartialAsync("_ValidationScriptsPartial"); }
-}

+ 0 - 36
samples/Essensoft.Paylinks.Sample.Web/Pages/Alipay/Payments/Pay.cshtml.cs

@@ -1,36 +0,0 @@
-using Essensoft.Paylinks.Alipay.Client;
-using Essensoft.Paylinks.Alipay.Payments.Model;
-using Essensoft.Paylinks.Alipay.Payments.Request;
-using Microsoft.AspNetCore.Mvc;
-using Microsoft.AspNetCore.Mvc.RazorPages;
-using Microsoft.Extensions.Options;
-
-namespace Essensoft.Paylinks.Sample.Web.Pages.Alipay.Payments;
-
-public class PayModel(IAlipayClient client, IOptions<PaylinksOptions> options) : PageModel
-{
-    private readonly AlipayClientOptions _options = options.Value.Alipay;
-
-    [BindProperty]
-    public AlipayTradePayBodyModel Input { get; set; }
-
-    public void OnGet()
-    {
-        Input = new AlipayTradePayBodyModel
-        {
-            OutTradeNo = DateTimeOffset.Now.ToString("yyyyMMddHHmmssfff"),
-            TotalAmount = "0.01",
-            Subject = "付款码支付测试",
-            Scene = "bar_code",
-            NotifyUrl = "https://www.domain.com/Alipay/Payments/Notify/TradeResult"
-        };
-    }
-
-    public async Task OnPostAsync()
-    {
-        var request = new AlipayTradePayRequest();
-        request.SetBodyModel(Input);
-        var response = await client.ExecuteAsync(request, _options);
-        ViewData["response"] = response.Body;
-    }
-}

+ 0 - 68
samples/Essensoft.Paylinks.Sample.Web/Pages/Alipay/Payments/PreCreate.cshtml

@@ -1,68 +0,0 @@
-@page
-@model PreCreateModel
-@{
-    ViewData["Title"] = "统一收单线下交易预创建";
-}
-<nav aria-label="breadcrumb">
-    <ol class="breadcrumb">
-        <li class="breadcrumb-item">
-            <a asp-page="/Index">首页</a>
-        </li>
-        <li class="breadcrumb-item">
-            <a asp-page="/Alipay/Index">支付宝</a>
-        </li>
-        <li class="breadcrumb-item">
-            <a asp-page="/Alipay/Payments/Index">支付产品</a>
-        </li>
-        <li class="breadcrumb-item active" aria-current="page">@ViewData["Title"]</li>
-    </ol>
-</nav>
-<div class="card mb-3">
-    <div class="card-header">
-        @ViewData["Title"]
-    </div>
-    <div class="card-body">
-        <form method="post">
-            <div class="mb-3">
-                <label class="form-label" asp-for="Input.OutTradeNo"></label>
-                <input class="form-control" asp-for="Input.OutTradeNo"/>
-            </div>
-            <div class="mb-3">
-                <label class="form-label" asp-for="Input.TotalAmount"></label>
-                <input class="form-control" asp-for="Input.TotalAmount"/>
-            </div>
-            <div class="mb-3">
-                <label class="form-label" asp-for="Input.Subject"></label>
-                <input class="form-control" asp-for="Input.Subject"/>
-            </div>
-            <div class="mb-3">
-                <label class="form-label" asp-for="Input.NotifyUrl"></label>
-                <input class="form-control" asp-for="Input.NotifyUrl"/>
-            </div>
-            <button class="btn btn-primary mb-3" type="submit">提交请求</button>
-        </form>
-        <hr/>
-        @if (ViewData["qr_code"] is string data && !string.IsNullOrEmpty(data))
-        {
-            using var qrGenerator = new QRCodeGenerator();
-            using var qrCodeData = qrGenerator.CreateQrCode(data, QRCodeGenerator.ECCLevel.Q);
-            using var base64ByteQrCode = new Base64QRCode(qrCodeData);
-            var base64Str = base64ByteQrCode.GetGraphic(20, Color.Black, Color.White, false, Base64QRCode.ImageType.Png);
-            <div class="mb-3">
-                <label class="form-label">二维码</label>
-                <embed src="data:image/png;base64,@base64Str" class="bg-light shadow-sm rounded d-block p-3 mb-5" type="image/png" width="180" height="180" />
-            </div>
-        }
-        @if (ViewData["response"] is string response && !string.IsNullOrEmpty(response))
-        {
-            <div class="mb-3">
-                <label class="form-label">应答</label>
-                <textarea class="form-control" rows="10">@response</textarea>
-            </div>
-        }
-    </div>
-</div>
-
-@section scripts {
-    @{ await Html.RenderPartialAsync("_ValidationScriptsPartial"); }
-}

+ 0 - 36
samples/Essensoft.Paylinks.Sample.Web/Pages/Alipay/Payments/PreCreate.cshtml.cs

@@ -1,36 +0,0 @@
-using Essensoft.Paylinks.Alipay.Client;
-using Essensoft.Paylinks.Alipay.Payments.Model;
-using Essensoft.Paylinks.Alipay.Payments.Request;
-using Microsoft.AspNetCore.Mvc;
-using Microsoft.AspNetCore.Mvc.RazorPages;
-using Microsoft.Extensions.Options;
-
-namespace Essensoft.Paylinks.Sample.Web.Pages.Alipay.Payments;
-
-public class PreCreateModel(IAlipayClient client, IOptions<PaylinksOptions> options) : PageModel
-{
-    private readonly AlipayClientOptions _options = options.Value.Alipay;
-
-    [BindProperty]
-    public AlipayTradePreCreateBodyModel Input { get; set; }
-
-    public void OnGet()
-    {
-        Input = new AlipayTradePreCreateBodyModel
-        {
-            OutTradeNo = DateTimeOffset.Now.ToString("yyyyMMddHHmmssfff"),
-            TotalAmount = "0.01",
-            Subject = "扫码支付测试",
-            NotifyUrl = "https://www.domain.com/Alipay/Payments/Notify/TradeResult"
-        };
-    }
-
-    public async Task OnPostAsync()
-    {
-        var request = new AlipayTradePreCreateRequest();
-        request.SetBodyModel(Input);
-        var response = await client.ExecuteAsync(request, _options);
-        ViewData["qr_code"] = response.QrCode;
-        ViewData["response"] = response.Body;
-    }
-}

+ 0 - 49
samples/Essensoft.Paylinks.Sample.Web/Pages/Alipay/Payments/Query.cshtml

@@ -1,49 +0,0 @@
-@page
-@model QueryModel
-@{
-    ViewData["Title"] = "统一收单交易查询";
-}
-<nav aria-label="breadcrumb">
-    <ol class="breadcrumb">
-        <li class="breadcrumb-item">
-            <a asp-page="/Index">首页</a>
-        </li>
-        <li class="breadcrumb-item">
-            <a asp-page="/Alipay/Index">支付宝</a>
-        </li>
-        <li class="breadcrumb-item">
-            <a asp-page="/Alipay/Payments/Index">支付产品</a>
-        </li>
-        <li class="breadcrumb-item active" aria-current="page">@ViewData["Title"]</li>
-    </ol>
-</nav>
-<div class="card mb-3">
-    <div class="card-header">
-        @ViewData["Title"]
-    </div>
-    <div class="card-body">
-        <form method="post">
-            <div class="mb-3">
-                <label class="form-label" asp-for="Input.TradeNo"></label>
-                <input class="form-control" asp-for="Input.TradeNo"/>
-            </div>
-            <div class="mb-3">
-                <label class="form-label" asp-for="Input.OutTradeNo"></label>
-                <input class="form-control" asp-for="Input.OutTradeNo"/>
-            </div>
-            <button class="btn btn-primary mb-3" type="submit">提交请求</button>
-        </form>
-        <hr/>
-        @if (ViewData["response"] is string response && !string.IsNullOrEmpty(response))
-        {
-            <div class="mb-3">
-                <label class="form-label">应答</label>
-                <textarea class="form-control" rows="10">@response</textarea>
-            </div>
-        }
-    </div>
-</div>
-
-@section scripts {
-    @{ await Html.RenderPartialAsync("_ValidationScriptsPartial"); }
-}

+ 0 - 28
samples/Essensoft.Paylinks.Sample.Web/Pages/Alipay/Payments/Query.cshtml.cs

@@ -1,28 +0,0 @@
-using Essensoft.Paylinks.Alipay.Client;
-using Essensoft.Paylinks.Alipay.Payments.Model;
-using Essensoft.Paylinks.Alipay.Payments.Request;
-using Microsoft.AspNetCore.Mvc;
-using Microsoft.AspNetCore.Mvc.RazorPages;
-using Microsoft.Extensions.Options;
-
-namespace Essensoft.Paylinks.Sample.Web.Pages.Alipay.Payments;
-
-public class QueryModel(IAlipayClient client, IOptions<PaylinksOptions> options) : PageModel
-{
-    private readonly AlipayClientOptions _options = options.Value.Alipay;
-
-    [BindProperty]
-    public AlipayTradeQueryBodyModel Input { get; set; }
-
-    public void OnGet()
-    {
-    }
-
-    public async Task OnPostAsync()
-    {
-        var request = new AlipayTradeQueryRequest();
-        request.SetBodyModel(Input);
-        var response = await client.ExecuteAsync(request, _options);
-        ViewData["response"] = response.Body;
-    }
-}

+ 0 - 61
samples/Essensoft.Paylinks.Sample.Web/Pages/Alipay/Payments/Refund.cshtml

@@ -1,61 +0,0 @@
-@page
-@model RefundModel
-@{
-    ViewData["Title"] = "统一收单交易退款";
-}
-<nav aria-label="breadcrumb">
-    <ol class="breadcrumb">
-        <li class="breadcrumb-item">
-            <a asp-page="/Index">首页</a>
-        </li>
-        <li class="breadcrumb-item">
-            <a asp-page="/Alipay/Index">支付宝</a>
-        </li>
-        <li class="breadcrumb-item">
-            <a asp-page="/Alipay/Payments/Index">支付产品</a>
-        </li>
-        <li class="breadcrumb-item active" aria-current="page">@ViewData["Title"]</li>
-    </ol>
-</nav>
-<div class="card mb-3">
-    <div class="card-header">
-        @ViewData["Title"]
-    </div>
-    <div class="card-body">
-        <form method="post">
-            <div class="mb-3">
-                <label class="form-label" asp-for="Input.RefundAmount"></label>
-                <input class="form-control" asp-for="Input.RefundAmount"/>
-            </div>
-            <div class="mb-3">
-                <label class="form-label" asp-for="Input.TradeNo"></label>
-                <input class="form-control" asp-for="Input.TradeNo"/>
-            </div>
-            <div class="mb-3">
-                <label class="form-label" asp-for="Input.OutTradeNo"></label>
-                <input class="form-control" asp-for="Input.OutTradeNo"/>
-            </div>
-            <div class="mb-3">
-                <label class="form-label" asp-for="Input.RefundReason"></label>
-                <input class="form-control" asp-for="Input.RefundReason"/>
-            </div>
-            <div class="mb-3">
-                <label class="form-label" asp-for="Input.OutRequestNo"></label>
-                <input class="form-control" asp-for="Input.OutRequestNo"/>
-            </div>
-            <button class="btn btn-primary mb-3" type="submit">提交请求</button>
-        </form>
-        <hr/>
-        @if (ViewData["response"] is string response && !string.IsNullOrEmpty(response))
-        {
-            <div class="mb-3">
-                <label class="form-label">应答</label>
-                <textarea class="form-control" rows="10">@response</textarea>
-            </div>
-        }
-    </div>
-</div>
-
-@section scripts {
-    @{ await Html.RenderPartialAsync("_ValidationScriptsPartial"); }
-}

+ 0 - 33
samples/Essensoft.Paylinks.Sample.Web/Pages/Alipay/Payments/Refund.cshtml.cs

@@ -1,33 +0,0 @@
-using Essensoft.Paylinks.Alipay.Client;
-using Essensoft.Paylinks.Alipay.Payments.Model;
-using Essensoft.Paylinks.Alipay.Payments.Request;
-using Microsoft.AspNetCore.Mvc;
-using Microsoft.AspNetCore.Mvc.RazorPages;
-using Microsoft.Extensions.Options;
-
-namespace Essensoft.Paylinks.Sample.Web.Pages.Alipay.Payments;
-
-public class RefundModel(IAlipayClient client, IOptions<PaylinksOptions> options) : PageModel
-{
-    private readonly AlipayClientOptions _options = options.Value.Alipay;
-
-    [BindProperty]
-    public AlipayTradeRefundBodyModel Input { get; set; }
-
-    public void OnGet()
-    {
-        Input = new AlipayTradeRefundBodyModel
-        {
-            RefundAmount = "0.01",
-            OutRequestNo = DateTimeOffset.Now.ToString("yyyyMMddHHmmssfff"),
-        };
-    }
-
-    public async Task OnPostAsync()
-    {
-        var request = new AlipayTradeRefundRequest();
-        request.SetBodyModel(Input);
-        var response = await client.ExecuteAsync(request, _options);
-        ViewData["response"] = response.Body;
-    }
-}

+ 0 - 53
samples/Essensoft.Paylinks.Sample.Web/Pages/Alipay/Payments/RefundQuery.cshtml

@@ -1,53 +0,0 @@
-@page
-@model RefundQueryModel
-@{
-    ViewData["Title"] = "统一收单交易退款查询";
-}
-<nav aria-label="breadcrumb">
-    <ol class="breadcrumb">
-        <li class="breadcrumb-item">
-            <a asp-page="/Index">首页</a>
-        </li>
-        <li class="breadcrumb-item">
-            <a asp-page="/Alipay/Index">支付宝</a>
-        </li>
-        <li class="breadcrumb-item">
-            <a asp-page="/Alipay/Payments/Index">支付产品</a>
-        </li>
-        <li class="breadcrumb-item active" aria-current="page">@ViewData["Title"]</li>
-    </ol>
-</nav>
-<div class="card mb-3">
-    <div class="card-header">
-        @ViewData["Title"]
-    </div>
-    <div class="card-body">
-        <form method="post">
-            <div class="mb-3">
-                <label class="form-label" asp-for="Input.OutRequestNo"></label>
-                <input class="form-control" asp-for="Input.OutRequestNo"/>
-            </div>
-            <div class="mb-3">
-                <label class="form-label" asp-for="Input.TradeNo"></label>
-                <input class="form-control" asp-for="Input.TradeNo"/>
-            </div>
-            <div class="mb-3">
-                <label class="form-label" asp-for="Input.OutTradeNo"></label>
-                <input class="form-control" asp-for="Input.OutTradeNo"/>
-            </div>
-            <button class="btn btn-primary mb-3" type="submit">提交请求</button>
-        </form>
-        <hr/>
-        @if (ViewData["response"] is string response && !string.IsNullOrEmpty(response))
-        {
-            <div class="mb-3">
-                <label class="form-label">应答</label>
-                <textarea class="form-control" rows="10">@response</textarea>
-            </div>
-        }
-    </div>
-</div>
-
-@section scripts {
-    @{ await Html.RenderPartialAsync("_ValidationScriptsPartial"); }
-}

+ 0 - 28
samples/Essensoft.Paylinks.Sample.Web/Pages/Alipay/Payments/RefundQuery.cshtml.cs

@@ -1,28 +0,0 @@
-using Essensoft.Paylinks.Alipay.Client;
-using Essensoft.Paylinks.Alipay.Payments.Model;
-using Essensoft.Paylinks.Alipay.Payments.Request;
-using Microsoft.AspNetCore.Mvc;
-using Microsoft.AspNetCore.Mvc.RazorPages;
-using Microsoft.Extensions.Options;
-
-namespace Essensoft.Paylinks.Sample.Web.Pages.Alipay.Payments;
-
-public class RefundQueryModel(IAlipayClient client, IOptions<PaylinksOptions> options) : PageModel
-{
-    private readonly AlipayClientOptions _options = options.Value.Alipay;
-
-    [BindProperty]
-    public AlipayTradeFastPayRefundQueryBodyModel Input { get; set; }
-
-    public void OnGet()
-    {
-    }
-
-    public async Task OnPostAsync()
-    {
-        var request = new AlipayTradeFastPayRefundQueryRequest();
-        request.SetBodyModel(Input);
-        var response = await client.ExecuteAsync(request, _options);
-        ViewData["response"] = response.Body;
-    }
-}

+ 0 - 62
samples/Essensoft.Paylinks.Sample.Web/Pages/Alipay/Payments/Wap.cshtml

@@ -1,62 +0,0 @@
-@page
-@model WapModel
-@{
-    ViewData["Title"] = "alipay.trade.wap.pay(手机网站支付接口2.0)";
-}
-<nav aria-label="breadcrumb">
-    <ol class="breadcrumb">
-        <li class="breadcrumb-item">
-            <a asp-page="/Index">首页</a>
-        </li>
-        <li class="breadcrumb-item">
-            <a asp-page="/Alipay/Index">支付宝</a>
-        </li>
-        <li class="breadcrumb-item">
-            <a asp-page="/Alipay/Payments/Index">支付产品</a>
-        </li>
-        <li class="breadcrumb-item active" aria-current="page">@ViewData["Title"]</li>
-    </ol>
-</nav>
-<div class="card mb-3">
-    <div class="card-header">
-        @ViewData["Title"]
-    </div>
-    <div class="card-body">
-        <form method="post">
-            <div class="mb-3">
-                <label class="form-label" asp-for="Input.OutTradeNo"></label>
-                <input class="form-control" asp-for="Input.OutTradeNo"/>
-            </div>
-            <div class="mb-3">
-                <label class="form-label" asp-for="Input.TotalAmount"></label>
-                <input class="form-control" asp-for="Input.TotalAmount"/>
-            </div>
-            <div class="mb-3">
-                <label class="form-label" asp-for="Input.Subject"></label>
-                <input class="form-control" asp-for="Input.Subject"/>
-            </div>
-            <div class="mb-3">
-                <label class="form-label" asp-for="Input.ProductCode"></label>
-                <input class="form-control" asp-for="Input.ProductCode"/>
-            </div>
-            <div class="mb-3">
-                <label class="form-label" asp-for="Input.NotifyUrl"></label>
-                <input class="form-control" asp-for="Input.NotifyUrl"/>
-            </div>
-            <button class="btn btn-primary mb-3" type="submit">提交请求</button>
-            <button class="btn btn-primary mb-3" type="submit" asp-page-handler="Jump">提交请求(跳转页面)</button>
-        </form>
-        <hr/>
-        @if (ViewData["response"] is string response && !string.IsNullOrEmpty(response))
-        {
-            <div class="mb-3">
-                <label class="form-label">应答</label>
-                <textarea class="form-control" rows="10">@response</textarea>
-            </div>
-        }
-    </div>
-</div>
-
-@section scripts {
-    @{ await Html.RenderPartialAsync("_ValidationScriptsPartial"); }
-}

+ 0 - 46
samples/Essensoft.Paylinks.Sample.Web/Pages/Alipay/Payments/Wap.cshtml.cs

@@ -1,46 +0,0 @@
-using Essensoft.Paylinks.Alipay.Client;
-using Essensoft.Paylinks.Alipay.Payments.Model;
-using Essensoft.Paylinks.Alipay.Payments.Request;
-using Microsoft.AspNetCore.Mvc;
-using Microsoft.AspNetCore.Mvc.RazorPages;
-using Microsoft.Extensions.Options;
-
-namespace Essensoft.Paylinks.Sample.Web.Pages.Alipay.Payments;
-
-public class WapModel(IAlipayClient client, IOptions<PaylinksOptions> options) : PageModel
-{
-    private readonly AlipayClientOptions _options = options.Value.Alipay;
-
-    [BindProperty]
-    public AlipayTradeWapPayBizModel Input { get; set; }
-
-    public void OnGet()
-    {
-        Input = new AlipayTradeWapPayBizModel
-        {
-            OutTradeNo = DateTimeOffset.Now.ToString("yyyyMMddHHmmssfff"),
-            TotalAmount = "0.01",
-            Subject = "手机网站支付测试",
-            ProductCode = "QUICK_WAP_WAY",
-            NotifyUrl = "https://www.domain.com/Alipay/Payments/Notify/TradeResult"
-        };
-    }
-
-    public async Task OnPostAsync()
-    {
-        var request = new AlipayTradeWapPayRequest();
-        request.SetBizModel(Input);
-        ViewData["response"] = await client.PageExecuteAsync(request, _options);
-    }
-
-    public async Task<IActionResult> OnPostJumpAsync()
-    {
-        var request = new AlipayTradeWapPayRequest();
-        request.SetBizModel(Input);
-        return new ContentResult
-        {
-            Content = await client.PageExecuteAsync(request, _options),
-            ContentType = "text/html"
-        };
-    }
-}

+ 0 - 62
samples/Essensoft.Paylinks.Sample.Web/Pages/Alipay/Payments/Web.cshtml

@@ -1,62 +0,0 @@
-@page
-@model WebModel
-@{
-    ViewData["Title"] = "alipay.trade.page.pay(统一收单下单并支付页面接口)";
-}
-<nav aria-label="breadcrumb">
-    <ol class="breadcrumb">
-        <li class="breadcrumb-item">
-            <a asp-page="/Index">首页</a>
-        </li>
-        <li class="breadcrumb-item">
-            <a asp-page="/Alipay/Index">支付宝</a>
-        </li>
-        <li class="breadcrumb-item">
-            <a asp-page="/Alipay/Payments/Index">支付产品</a>
-        </li>
-        <li class="breadcrumb-item active" aria-current="page">@ViewData["Title"]</li>
-    </ol>
-</nav>
-<div class="card mb-3">
-    <div class="card-header">
-        @ViewData["Title"]
-    </div>
-    <div class="card-body">
-        <form method="post">
-            <div class="mb-3">
-                <label class="form-label" asp-for="Input.OutTradeNo"></label>
-                <input class="form-control" asp-for="Input.OutTradeNo"/>
-            </div>
-            <div class="mb-3">
-                <label class="form-label" asp-for="Input.TotalAmount"></label>
-                <input class="form-control" asp-for="Input.TotalAmount"/>
-            </div>
-            <div class="mb-3">
-                <label class="form-label" asp-for="Input.Subject"></label>
-                <input class="form-control" asp-for="Input.Subject"/>
-            </div>
-            <div class="mb-3">
-                <label class="form-label" asp-for="Input.ProductCode"></label>
-                <input class="form-control" asp-for="Input.ProductCode"/>
-            </div>
-            <div class="mb-3">
-                <label class="form-label" asp-for="Input.NotifyUrl"></label>
-                <input class="form-control" asp-for="Input.NotifyUrl"/>
-            </div>
-            <button class="btn btn-primary mb-3" type="submit">提交请求</button>
-            <button class="btn btn-primary mb-3" type="submit" asp-page-handler="Jump">提交请求(跳转页面)</button>
-        </form>
-        <hr/>
-        @if (ViewData["response"] is string response && !string.IsNullOrEmpty(response))
-        {
-            <div class="mb-3">
-                <label class="form-label">应答</label>
-                <textarea class="form-control" rows="10">@response</textarea>
-            </div>
-        }
-    </div>
-</div>
-
-@section scripts {
-    @{ await Html.RenderPartialAsync("_ValidationScriptsPartial"); }
-}

+ 0 - 46
samples/Essensoft.Paylinks.Sample.Web/Pages/Alipay/Payments/Web.cshtml.cs

@@ -1,46 +0,0 @@
-using Essensoft.Paylinks.Alipay.Client;
-using Essensoft.Paylinks.Alipay.Payments.Model;
-using Essensoft.Paylinks.Alipay.Payments.Request;
-using Microsoft.AspNetCore.Mvc;
-using Microsoft.AspNetCore.Mvc.RazorPages;
-using Microsoft.Extensions.Options;
-
-namespace Essensoft.Paylinks.Sample.Web.Pages.Alipay.Payments;
-
-public class WebModel(IAlipayClient client, IOptions<PaylinksOptions> options) : PageModel
-{
-    private readonly AlipayClientOptions _options = options.Value.Alipay;
-
-    [BindProperty]
-    public AlipayTradePagePayBizModel Input { get; set; }
-
-    public void OnGet()
-    {
-        Input = new AlipayTradePagePayBizModel
-        {
-            OutTradeNo = DateTimeOffset.Now.ToString("yyyyMMddHHmmssfff"),
-            TotalAmount = "0.01",
-            Subject = "电脑网站支付测试",
-            ProductCode = "FAST_INSTANT_TRADE_PAY",
-            NotifyUrl = "https://www.domain.com/Alipay/Payments/Notify/TradeResult"
-        };
-    }
-
-    public async Task OnPostAsync()
-    {
-        var request = new AlipayTradePagePayRequest();
-        request.SetBizModel(Input);
-        ViewData["response"] = await client.PageExecuteAsync(request, _options);
-    }
-
-    public async Task<IActionResult> OnPostJump()
-    {
-        var request = new AlipayTradePagePayRequest();
-        request.SetBizModel(Input);
-        return new ContentResult
-        {
-            Content = await client.PageExecuteAsync(request, _options),
-            ContentType = "text/html"
-        };
-    }
-}

+ 0 - 45
samples/Essensoft.Paylinks.Sample.Web/Pages/Alipay/SecurityTools/ConvertCertPrivateKey.cshtml

@@ -1,45 +0,0 @@
-@page
-@model ConvertCertPrivateKeyModel
-@{
-    ViewData["Title"] = "转换证书私钥 PKCS#8 => PKCS#1";
-}
-<nav aria-label="breadcrumb">
-    <ol class="breadcrumb">
-        <li class="breadcrumb-item">
-            <a asp-page="/Index">首页</a>
-        </li>
-        <li class="breadcrumb-item">
-            <a asp-page="/Alipay/Index">支付宝</a>
-        </li>
-        <li class="breadcrumb-item">
-            <a asp-page="/Alipay/SecurityTools/Index">安全工具</a>
-        </li>
-        <li class="breadcrumb-item active" aria-current="page">@ViewData["Title"]</li>
-    </ol>
-</nav>
-<div class="card mb-3">
-    <div class="card-header">
-        @ViewData["Title"]
-    </div>
-    <div class="card-body">
-        <form enctype="multipart/form-data" method="post">
-            <div class="mb-3">
-                <label class="form-label" asp-for="CertPrivateKey"></label>
-                <input class="form-control" asp-for="CertPrivateKey"/>
-            </div>
-            <button class="btn btn-primary mb-3" type="submit">提交请求</button>
-        </form>
-        <hr/>
-        @if (ViewData["response"] is string response && !string.IsNullOrEmpty(response))
-        {
-            <div class="mb-3">
-                <label class="form-label">应答</label>
-                <textarea class="form-control" rows="10">@response</textarea>
-            </div>
-        }
-    </div>
-</div>
-
-@section scripts {
-    @{ await Html.RenderPartialAsync("_ValidationScriptsPartial"); }
-}

+ 0 - 29
samples/Essensoft.Paylinks.Sample.Web/Pages/Alipay/SecurityTools/ConvertCertPrivateKey.cshtml.cs

@@ -1,29 +0,0 @@
-using Essensoft.Paylinks.Alipay.Core.Utilities;
-using Microsoft.AspNetCore.Mvc;
-using Microsoft.AspNetCore.Mvc.RazorPages;
-
-namespace Essensoft.Paylinks.Sample.Web.Pages.Alipay.SecurityTools;
-
-public class ConvertCertPrivateKeyModel : PageModel
-{
-    [BindProperty]
-    public IFormFile CertPrivateKey { get; set; }
-
-    public void OnGet()
-    {
-    }
-
-    public async Task OnPostAsync()
-    {
-        try
-        {
-            using var sr = new StreamReader(CertPrivateKey.OpenReadStream());
-            var str = await sr.ReadToEndAsync();
-            ViewData["response"] = AlipayCertUtilities.ConvertCertPrivateKey(str);
-        }
-        catch
-        {
-            ViewData["response"] = "无法获取";
-        }
-    }
-}

+ 0 - 45
samples/Essensoft.Paylinks.Sample.Web/Pages/Alipay/SecurityTools/GetCertPublicKey.cshtml

@@ -1,45 +0,0 @@
-@page
-@model GetCertPublicKeyModel
-@{
-    ViewData["Title"] = "获取证书公钥";
-}
-<nav aria-label="breadcrumb">
-    <ol class="breadcrumb">
-        <li class="breadcrumb-item">
-            <a asp-page="/Index">首页</a>
-        </li>
-        <li class="breadcrumb-item">
-            <a asp-page="/Alipay/Index">支付宝</a>
-        </li>
-        <li class="breadcrumb-item">
-            <a asp-page="/Alipay/SecurityTools/Index">安全工具</a>
-        </li>
-        <li class="breadcrumb-item active" aria-current="page">@ViewData["Title"]</li>
-    </ol>
-</nav>
-<div class="card mb-3">
-    <div class="card-header">
-        @ViewData["Title"]
-    </div>
-    <div class="card-body">
-        <form enctype="multipart/form-data" method="post">
-            <div class="mb-3">
-                <label class="form-label" asp-for="Cert"></label>
-                <input class="form-control" asp-for="Cert"/>
-            </div>
-            <button class="btn btn-primary mb-3" type="submit">提交请求</button>
-        </form>
-        <hr/>
-        @if (ViewData["response"] is string response && !string.IsNullOrEmpty(response))
-        {
-            <div class="mb-3">
-                <label class="form-label">应答</label>
-                <textarea class="form-control" rows="10">@response</textarea>
-            </div>
-        }
-    </div>
-</div>
-
-@section scripts {
-    @{ await Html.RenderPartialAsync("_ValidationScriptsPartial"); }
-}

+ 0 - 29
samples/Essensoft.Paylinks.Sample.Web/Pages/Alipay/SecurityTools/GetCertPublicKey.cshtml.cs

@@ -1,29 +0,0 @@
-using Essensoft.Paylinks.Alipay.Core.Utilities;
-using Microsoft.AspNetCore.Mvc;
-using Microsoft.AspNetCore.Mvc.RazorPages;
-
-namespace Essensoft.Paylinks.Sample.Web.Pages.Alipay.SecurityTools;
-
-public class GetCertPublicKeyModel : PageModel
-{
-    [BindProperty]
-    public IFormFile Cert { get; set; }
-
-    public void OnGet()
-    {
-    }
-
-    public async Task OnPostAsync()
-    {
-        try
-        {
-            using var sr = new StreamReader(Cert.OpenReadStream());
-            var str = await sr.ReadToEndAsync();
-            ViewData["response"] = AlipayCertUtilities.GetCertPublicKey(str);
-        }
-        catch
-        {
-            ViewData["response"] = "无法获取";
-        }
-    }
-}

+ 0 - 45
samples/Essensoft.Paylinks.Sample.Web/Pages/Alipay/SecurityTools/GetCertSN.cshtml

@@ -1,45 +0,0 @@
-@page
-@model GetCertSNModel
-@{
-    ViewData["Title"] = "获取证书序列号";
-}
-<nav aria-label="breadcrumb">
-    <ol class="breadcrumb">
-        <li class="breadcrumb-item">
-            <a asp-page="/Index">首页</a>
-        </li>
-        <li class="breadcrumb-item">
-            <a asp-page="/Alipay/Index">支付宝</a>
-        </li>
-        <li class="breadcrumb-item">
-            <a asp-page="/Alipay/SecurityTools/Index">安全工具</a>
-        </li>
-        <li class="breadcrumb-item active" aria-current="page">@ViewData["Title"]</li>
-    </ol>
-</nav>
-<div class="card mb-3">
-    <div class="card-header">
-        @ViewData["Title"]
-    </div>
-    <div class="card-body">
-        <form enctype="multipart/form-data" method="post">
-            <div class="mb-3">
-                <label class="form-label" asp-for="Cert"></label>
-                <input class="form-control" asp-for="Cert"/>
-            </div>
-            <button class="btn btn-primary mb-3" type="submit">提交请求</button>
-        </form>
-        <hr/>
-        @if (ViewData["response"] is string response && !string.IsNullOrEmpty(response))
-        {
-            <div class="mb-3">
-                <label class="form-label">应答</label>
-                <textarea class="form-control" rows="10">@response</textarea>
-            </div>
-        }
-    </div>
-</div>
-
-@section scripts {
-    @{ await Html.RenderPartialAsync("_ValidationScriptsPartial"); }
-}

+ 0 - 29
samples/Essensoft.Paylinks.Sample.Web/Pages/Alipay/SecurityTools/GetCertSN.cshtml.cs

@@ -1,29 +0,0 @@
-using Essensoft.Paylinks.Alipay.Core.Utilities;
-using Microsoft.AspNetCore.Mvc;
-using Microsoft.AspNetCore.Mvc.RazorPages;
-
-namespace Essensoft.Paylinks.Sample.Web.Pages.Alipay.SecurityTools;
-
-public class GetCertSNModel : PageModel
-{
-    [BindProperty]
-    public IFormFile Cert { get; set; }
-
-    public void OnGet()
-    {
-    }
-
-    public async Task OnPostAsync()
-    {
-        try
-        {
-            using var sr = new StreamReader(Cert.OpenReadStream());
-            var str = await sr.ReadToEndAsync();
-            ViewData["response"] = AlipayCertUtilities.GetCertSN(str);
-        }
-        catch
-        {
-            ViewData["response"] = "无法获取";
-        }
-    }
-}

+ 0 - 45
samples/Essensoft.Paylinks.Sample.Web/Pages/Alipay/SecurityTools/GetRootCertSN.cshtml

@@ -1,45 +0,0 @@
-@page
-@model GetRootCertSNModel
-@{
-    ViewData["Title"] = "获取根证书序列号";
-}
-<nav aria-label="breadcrumb">
-    <ol class="breadcrumb">
-        <li class="breadcrumb-item">
-            <a asp-page="/Index">首页</a>
-        </li>
-        <li class="breadcrumb-item">
-            <a asp-page="/Alipay/Index">支付宝</a>
-        </li>
-        <li class="breadcrumb-item">
-            <a asp-page="/Alipay/SecurityTools/Index">安全工具</a>
-        </li>
-        <li class="breadcrumb-item active" aria-current="page">@ViewData["Title"]</li>
-    </ol>
-</nav>
-<div class="card mb-3">
-    <div class="card-header">
-        @ViewData["Title"]
-    </div>
-    <div class="card-body">
-        <form enctype="multipart/form-data" method="post">
-            <div class="mb-3">
-                <label class="form-label" asp-for="RootCert"></label>
-                <input class="form-control" asp-for="RootCert"/>
-            </div>
-            <button class="btn btn-primary mb-3" type="submit">提交请求</button>
-        </form>
-        <hr/>
-        @if (ViewData["response"] is string response && !string.IsNullOrEmpty(response))
-        {
-            <div class="mb-3">
-                <label class="form-label">应答</label>
-                <textarea class="form-control" rows="10">@response</textarea>
-            </div>
-        }
-    </div>
-</div>
-
-@section scripts {
-    @{ await Html.RenderPartialAsync("_ValidationScriptsPartial"); }
-}

+ 0 - 29
samples/Essensoft.Paylinks.Sample.Web/Pages/Alipay/SecurityTools/GetRootCertSN.cshtml.cs

@@ -1,29 +0,0 @@
-using Essensoft.Paylinks.Alipay.Core.Utilities;
-using Microsoft.AspNetCore.Mvc;
-using Microsoft.AspNetCore.Mvc.RazorPages;
-
-namespace Essensoft.Paylinks.Sample.Web.Pages.Alipay.SecurityTools;
-
-public class GetRootCertSNModel : PageModel
-{
-    [BindProperty]
-    public IFormFile RootCert { get; set; }
-
-    public void OnGet()
-    {
-    }
-
-    public async Task OnPostAsync()
-    {
-        try
-        {
-            using var sr = new StreamReader(RootCert.OpenReadStream());
-            var str = await sr.ReadToEndAsync();
-            ViewData["response"] = AlipayCertUtilities.GetRootCertSN(str);
-        }
-        catch
-        {
-            ViewData["response"] = "无法获取";
-        }
-    }
-}

+ 0 - 24
samples/Essensoft.Paylinks.Sample.Web/Pages/Alipay/SecurityTools/Index.cshtml

@@ -1,24 +0,0 @@
-@page
-@model IndexModel
-@{
-    ViewData["Title"] = "安全工具";
-}
-<nav aria-label="breadcrumb">
-    <ol class="breadcrumb">
-        <li class="breadcrumb-item">
-            <a asp-page="/Index">首页</a>
-        </li>
-        <li class="breadcrumb-item">
-            <a asp-page="/Alipay/Index">支付宝</a>
-        </li>
-        <li class="breadcrumb-item active" aria-current="page">@ViewData["Title"]</li>
-    </ol>
-</nav>
-<div class="mb-3">
-    <div class="list-group">
-        <a class="list-group-item list-group-item-action" asp-page="/Alipay/SecurityTools/ConvertCertPrivateKey">转换证书私钥 PKCS#8 => PKCS#1</a>
-        <a class="list-group-item list-group-item-action" asp-page="/Alipay/SecurityTools/GetCertPublicKey">获取证书公钥</a>
-        <a class="list-group-item list-group-item-action" asp-page="/Alipay/SecurityTools/GetCertSN">获取证书序列号</a>
-        <a class="list-group-item list-group-item-action" asp-page="/Alipay/SecurityTools/GetRootCertSN">获取根证书序列号</a>
-    </div>
-</div>

+ 0 - 10
samples/Essensoft.Paylinks.Sample.Web/Pages/Alipay/SecurityTools/Index.cshtml.cs

@@ -1,10 +0,0 @@
-using Microsoft.AspNetCore.Mvc.RazorPages;
-
-namespace Essensoft.Paylinks.Sample.Web.Pages.Alipay.SecurityTools;
-
-public class IndexModel : PageModel
-{
-    public void OnGet()
-    {
-    }
-}

+ 0 - 26
samples/Essensoft.Paylinks.Sample.Web/Pages/Error.cshtml

@@ -1,26 +0,0 @@
-@page
-@model ErrorModel
-@{
-    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 the <strong>Development</strong> environment displays detailed information about the error that occurred.
-</p>
-<p>
-    <strong>The Development environment shouldn't be enabled for deployed applications.</strong>
-    It can result in displaying sensitive information from exceptions to end users.
-    For local debugging, enable the <strong>Development</strong> environment by setting the <strong>ASPNETCORE_ENVIRONMENT</strong> environment variable to <strong>Development</strong>
-    and restarting the app.
-</p>

+ 0 - 26
samples/Essensoft.Paylinks.Sample.Web/Pages/Error.cshtml.cs

@@ -1,26 +0,0 @@
-using System.Diagnostics;
-using Microsoft.AspNetCore.Mvc;
-using Microsoft.AspNetCore.Mvc.RazorPages;
-
-namespace Essensoft.Paylinks.Sample.Web.Pages;
-
-[ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)]
-[IgnoreAntiforgeryToken]
-public class ErrorModel : PageModel
-{
-    public string? RequestId { get; set; }
-
-    public bool ShowRequestId => !string.IsNullOrEmpty(RequestId);
-
-    private readonly ILogger<ErrorModel> _logger;
-
-    public ErrorModel(ILogger<ErrorModel> logger)
-    {
-        _logger = logger;
-    }
-
-    public void OnGet()
-    {
-        RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier;
-    }
-}

+ 0 - 14
samples/Essensoft.Paylinks.Sample.Web/Pages/Index.cshtml

@@ -1,14 +0,0 @@
-@page
-@model IndexModel
-@{
-    ViewData["Title"] = "主页";
-}
-<section>
-    <div class="container">
-        <div class="col-md-8 mx-auto text-center">
-            <h1 class="display-3 mb-3">Paylinks</h1>
-            <p class="lead mb-3">一套基于 现代 .NET 开发,支持跨平台、多商户的第三方支付SDK。</p>
-            <p class="text-body mb-3">为简化开发者接入第三方支付平台而设计的SDK,支持支付宝和微信支付,便于快速集成支付功能。</p>
-        </div>
-    </div>
-</section>

+ 0 - 10
samples/Essensoft.Paylinks.Sample.Web/Pages/Index.cshtml.cs

@@ -1,10 +0,0 @@
-using Microsoft.AspNetCore.Mvc.RazorPages;
-
-namespace Essensoft.Paylinks.Sample.Web.Pages;
-
-public class IndexModel : PageModel
-{
-    public void OnGet()
-    {
-    }
-}

+ 0 - 114
samples/Essensoft.Paylinks.Sample.Web/Pages/Shared/_Layout.cshtml

@@ -1,114 +0,0 @@
-<!doctype html>
-<html lang="en">
-<head>
-    <meta charset="utf-8"/>
-    <meta name="viewport" content="width=device-width, initial-scale=1.0"/>
-    <title>@ViewData["Title"] - Paylinks</title>
-    <link rel="stylesheet" href="~/lib/bootstrap/dist/css/bootstrap.min.css"/>
-    @await RenderSectionAsync("styles", false)
-    <link rel="stylesheet" href="~/css/site.css" asp-append-version="true"/>
-    <script src="~/js/color-modes.js" asp-append-version="true"></script>
-    <svg xmlns="http://www.w3.org/2000/svg" class="d-none">
-        <symbol id="check2" viewBox="0 0 16 16">
-            <path d="M13.854 3.646a.5.5 0 0 1 0 .708l-7 7a.5.5 0 0 1-.708 0l-3.5-3.5a.5.5 0 1 1 .708-.708L6.5 10.293l6.646-6.647a.5.5 0 0 1 .708 0z"></path>
-        </symbol>
-        <symbol id="sun-fill" viewBox="0 0 16 16">
-            <path d="M8 12a4 4 0 1 0 0-8 4 4 0 0 0 0 8zM8 0a.5.5 0 0 1 .5.5v2a.5.5 0 0 1-1 0v-2A.5.5 0 0 1 8 0zm0 13a.5.5 0 0 1 .5.5v2a.5.5 0 0 1-1 0v-2A.5.5 0 0 1 8 13zm8-5a.5.5 0 0 1-.5.5h-2a.5.5 0 0 1 0-1h2a.5.5 0 0 1 .5.5zM3 8a.5.5 0 0 1-.5.5h-2a.5.5 0 0 1 0-1h2A.5.5 0 0 1 3 8zm10.657-5.657a.5.5 0 0 1 0 .707l-1.414 1.415a.5.5 0 1 1-.707-.708l1.414-1.414a.5.5 0 0 1 .707 0zm-9.193 9.193a.5.5 0 0 1 0 .707L3.05 13.657a.5.5 0 0 1-.707-.707l1.414-1.414a.5.5 0 0 1 .707 0zm9.193 2.121a.5.5 0 0 1-.707 0l-1.414-1.414a.5.5 0 0 1 .707-.707l1.414 1.414a.5.5 0 0 1 0 .707zM4.464 4.465a.5.5 0 0 1-.707 0L2.343 3.05a.5.5 0 1 1 .707-.707l1.414 1.414a.5.5 0 0 1 0 .708z"></path>
-        </symbol>
-        <symbol id="moon-stars-fill" viewBox="0 0 16 16">
-            <path d="M6 .278a.768.768 0 0 1 .08.858 7.208 7.208 0 0 0-.878 3.46c0 4.021 3.278 7.277 7.318 7.277.527 0 1.04-.055 1.533-.16a.787.787 0 0 1 .81.316.733.733 0 0 1-.031.893A8.349 8.349 0 0 1 8.344 16C3.734 16 0 12.286 0 7.71 0 4.266 2.114 1.312 5.124.06A.752.752 0 0 1 6 .278z"></path>
-            <path d="M10.794 3.148a.217.217 0 0 1 .412 0l.387 1.162c.173.518.579.924 1.097 1.097l1.162.387a.217.217 0 0 1 0 .412l-1.162.387a1.734 1.734 0 0 0-1.097 1.097l-.387 1.162a.217.217 0 0 1-.412 0l-.387-1.162A1.734 1.734 0 0 0 9.31 6.593l-1.162-.387a.217.217 0 0 1 0-.412l1.162-.387a1.734 1.734 0 0 0 1.097-1.097l.387-1.162zM13.863.099a.145.145 0 0 1 .274 0l.258.774c.115.346.386.617.732.732l.774.258a.145.145 0 0 1 0 .274l-.774.258a1.156 1.156 0 0 0-.732.732l-.258.774a.145.145 0 0 1-.274 0l-.258-.774a1.156 1.156 0 0 0-.732-.732l-.774-.258a.145.145 0 0 1 0-.274l.774-.258c.346-.115.617-.386.732-.732L13.863.1z"></path>
-        </symbol>
-        <symbol id="circle-half" viewBox="0 0 16 16">
-            <path d="M8 15A7 7 0 1 0 8 1v14zm0 1A8 8 0 1 1 8 0a8 8 0 0 1 0 16z"></path>
-        </symbol>
-    </svg>
-</head>
-<body>
-<header class="navbar navbar-expand-lg shadow-sm">
-    <nav class="container flex-wrap flex-lg-nowrap">
-        <a class="navbar-brand" asp-page="/Index">Paylinks</a>
-        <button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target=".navbar-collapse" aria-controls="navbarSupportedContent"
-                aria-expanded="false" aria-label="Toggle navigation">
-            <span class="navbar-toggler-icon"></span>
-        </button>
-        <div class="navbar-collapse collapse d-lg-flex">
-            <ul class="navbar-nav col-12 col-lg-auto me-lg-auto mb-2 justify-content-center mb-md-0">
-                <li>
-                    <a class="nav-link @Html.IsActive("/Alipay/")" asp-page="/Alipay/Index">支付宝</a>
-                </li>
-                <li>
-                    <a class="nav-link @Html.IsActive("/WeChatPay/")" asp-page="/WeChatPay/Index">微信支付</a>
-                </li>
-            </ul>
-            <div class="col-12 col-lg-auto mb-3 mb-lg-0 me-lg-3">
-                <ul class="navbar-nav">
-                    <li>
-                        <a class="nav-link" href="https://paylinks.cn/sponsors" target="_blank">赞助</a>
-                    </li>
-                </ul>
-            </div>
-            <div class="dropdown text-end">
-                <button class="btn btn-link nav-link py-2 px-0 px-lg-2 dropdown-toggle d-flex align-items-center" id="bd-theme" type="button" aria-expanded="false" data-bs-toggle="dropdown" data-bs-display="static" aria-label="Toggle theme (light)">
-                    <svg class="bi my-1 theme-icon-active">
-                        <use href="#circle-half"></use>
-                    </svg>
-                    <span class="d-lg-none ms-2" id="bd-theme-text">切换主题</span>
-                </button>
-                <ul class="dropdown-menu dropdown-menu-end" aria-labelledby="bd-theme-text">
-                    <li>
-                        <button type="button" class="dropdown-item d-flex align-items-center active" data-bs-theme-value="light" aria-pressed="true">
-                            <svg class="bi me-2 opacity-50">
-                                <use href="#sun-fill"></use>
-                            </svg>
-                            浅色
-                            <svg class="bi ms-auto d-none">
-                                <use href="#check2"></use>
-                            </svg>
-                        </button>
-                    </li>
-                    <li>
-                        <button type="button" class="dropdown-item d-flex align-items-center" data-bs-theme-value="dark" aria-pressed="false">
-                            <svg class="bi me-2 opacity-50">
-                                <use href="#moon-stars-fill"></use>
-                            </svg>
-                            深色
-                            <svg class="bi ms-auto d-none">
-                                <use href="#check2"></use>
-                            </svg>
-                        </button>
-                    </li>
-                    <li>
-                        <button type="button" class="dropdown-item d-flex align-items-center" data-bs-theme-value="auto" aria-pressed="false">
-                            <svg class="bi me-2 opacity-50">
-                                <use href="#circle-half"></use>
-                            </svg>
-                            自动
-                            <svg class="bi ms-auto d-none">
-                                <use href="#check2"></use>
-                            </svg>
-                        </button>
-                    </li>
-                </ul>
-            </div>
-        </div>
-    </nav>
-</header>
-<main>
-    <div class="container pt-5">
-        @RenderBody()
-    </div>
-</main>
-<footer class="footer pt-5 pb-5">
-    <div class="container text-center">
-        <p class="text-center mb-0">
-            &copy; @DateTime.Now.Year Essensoft
-        </p>
-    </div>
-</footer>
-<script src="~/lib/jquery/dist/jquery.min.js"></script>
-<script src="~/lib/bootstrap/dist/js/bootstrap.bundle.min.js"></script>
-@await RenderSectionAsync("scripts", false)
-<script src="~/js/site.js" asp-append-version="true"></script>
-</body>
-</html>

+ 0 - 2
samples/Essensoft.Paylinks.Sample.Web/Pages/Shared/_Layout.cshtml.css

@@ -1,2 +0,0 @@
-/* Please see documentation at https://learn.microsoft.com/aspnet/core/client-side/bundling-and-minification
-for details on configuring this project to bundle and minify static web assets. */

+ 0 - 2
samples/Essensoft.Paylinks.Sample.Web/Pages/Shared/_ValidationScriptsPartial.cshtml

@@ -1,2 +0,0 @@
-<script src="~/lib/jquery-validation/dist/jquery.validate.min.js"></script>
-<script src="~/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.min.js"></script>

+ 0 - 20
samples/Essensoft.Paylinks.Sample.Web/Pages/WeChatPay/Index.cshtml

@@ -1,20 +0,0 @@
-@page
-@model IndexModel
-@{
-    ViewData["Title"] = "微信支付";
-}
-<nav aria-label="breadcrumb">
-    <ol class="breadcrumb">
-        <li class="breadcrumb-item">
-            <a asp-page="/Index">首页</a>
-        </li>
-        <li class="breadcrumb-item active" aria-current="page">@ViewData["Title"]</li>
-    </ol>
-</nav>
-<div class="mb-3">
-    <div class="list-group">
-        <a class="list-group-item list-group-item-action" asp-page="/WeChatPay/Payments/Index">支付产品</a>
-        <a class="list-group-item list-group-item-action" asp-page="/WeChatPay/SecurityTools/Index">安全工具</a>
-        <a class="list-group-item list-group-item-action">更多...</a>
-    </div>
-</div>

+ 0 - 10
samples/Essensoft.Paylinks.Sample.Web/Pages/WeChatPay/Index.cshtml.cs

@@ -1,10 +0,0 @@
-using Microsoft.AspNetCore.Mvc.RazorPages;
-
-namespace Essensoft.Paylinks.Sample.Web.Pages.WeChatPay;
-
-public class IndexModel : PageModel
-{
-    public void OnGet()
-    {
-    }
-}

+ 0 - 65
samples/Essensoft.Paylinks.Sample.Web/Pages/WeChatPay/Payments/AbnormalRefund.cshtml

@@ -1,65 +0,0 @@
-@page
-@model AbnormalRefundModel
-@{
-    ViewData["Title"] = "发起异常退款";
-}
-<nav aria-label="breadcrumb">
-    <ol class="breadcrumb">
-        <li class="breadcrumb-item">
-            <a asp-page="/Index">首页</a>
-        </li>
-        <li class="breadcrumb-item">
-            <a asp-page="/WeChatPay/Index">微信支付</a>
-        </li>
-        <li class="breadcrumb-item">
-            <a asp-page="/WeChatPay/Payments/Index">支付产品</a>
-        </li>
-        <li class="breadcrumb-item active" aria-current="page">@ViewData["Title"]</li>
-    </ol>
-</nav>
-<div class="card mb-3">
-    <div class="card-header">
-        @ViewData["Title"]
-    </div>
-    <div class="card-body">
-        <form method="post">
-            <div class="mb-3">
-                <label class="form-label" asp-for="RefundId"></label>
-                <input class="form-control" asp-for="RefundId"/>
-            </div>
-            <div class="mb-3">
-                <label class="form-label" asp-for="Input.OutRefundNo"></label>
-                <input class="form-control" asp-for="Input.OutRefundNo"/>
-            </div>
-            <div class="mb-3">
-                <label class="form-label" asp-for="Input.Type"></label>
-                <input class="form-control" asp-for="Input.Type"/>
-            </div>
-            <div class="mb-3">
-                <label class="form-label" asp-for="Input.BankType"></label>
-                <input class="form-control" asp-for="Input.BankType"/>
-            </div>
-            <div class="mb-3">
-                <label class="form-label" asp-for="Input.BankAccount"></label>
-                <input class="form-control" asp-for="Input.BankAccount"/>
-            </div>
-            <div class="mb-3">
-                <label class="form-label" asp-for="Input.RealName"></label>
-                <input class="form-control" asp-for="Input.RealName"/>
-            </div>
-            <button class="btn btn-primary mb-3" type="submit">提交请求</button>
-        </form>
-        <hr/>
-        @if (ViewData["response"] is string response && !string.IsNullOrEmpty(response))
-        {
-            <div class="mb-3">
-                <label class="form-label">应答</label>
-                <textarea class="form-control" rows="10">@response</textarea>
-            </div>
-        }
-    </div>
-</div>
-
-@section scripts {
-    @{ await Html.RenderPartialAsync("_ValidationScriptsPartial"); }
-}

+ 0 - 31
samples/Essensoft.Paylinks.Sample.Web/Pages/WeChatPay/Payments/AbnormalRefund.cshtml.cs

@@ -1,31 +0,0 @@
-using Essensoft.Paylinks.WeChatPay.Client;
-using Essensoft.Paylinks.WeChatPay.Payments.Model;
-using Essensoft.Paylinks.WeChatPay.Payments.Request;
-using Microsoft.AspNetCore.Mvc;
-using Microsoft.AspNetCore.Mvc.RazorPages;
-using Microsoft.Extensions.Options;
-
-namespace Essensoft.Paylinks.Sample.Web.Pages.WeChatPay.Payments;
-
-public class AbnormalRefundModel(IWeChatPayClient client, IOptions<PaylinksOptions> options) : PageModel
-{
-    private readonly WeChatPayClientOptions _options = options.Value.WeChatPay;
-
-    [BindProperty]
-    public string RefundId { get; set; }
-
-    [BindProperty]
-    public WeChatPayApplyAbnormalRefundByRefundIdBodyModel Input { get; set; }
-
-    public void OnGet()
-    {
-    }
-
-    public async Task OnPostAsync()
-    {
-        var request = new WeChatPayApplyAbnormalRefundByRefundIdRequest { RefundId = RefundId };
-        request.SetBodyModel(Input);
-        var response = await client.ExecuteAsync(request, _options);
-        ViewData["response"] = response.Body;
-    }
-}

+ 0 - 72
samples/Essensoft.Paylinks.Sample.Web/Pages/WeChatPay/Payments/AppPrepay.cshtml

@@ -1,72 +0,0 @@
-@page
-@model AppPrepayModel
-@{
-    ViewData["Title"] = "App下单";
-}
-<nav aria-label="breadcrumb">
-    <ol class="breadcrumb">
-        <li class="breadcrumb-item">
-            <a asp-page="/Index">首页</a>
-        </li>
-        <li class="breadcrumb-item">
-            <a asp-page="/WeChatPay/Index">微信支付</a>
-        </li>
-        <li class="breadcrumb-item">
-            <a asp-page="/WeChatPay/Payments/Index">支付产品</a>
-        </li>
-        <li class="breadcrumb-item active" aria-current="page">@ViewData["Title"]</li>
-    </ol>
-</nav>
-<div class="card mb-3">
-    <div class="card-header">
-        @ViewData["Title"]
-    </div>
-    <div class="card-body">
-        <form method="post">
-            <div class="mb-3">
-                <label class="form-label" asp-for="Input.AppId"></label>
-                <input class="form-control" asp-for="Input.AppId"/>
-            </div>
-            <div class="mb-3">
-                <label class="form-label" asp-for="Input.MchId"></label>
-                <input class="form-control" asp-for="Input.MchId"/>
-            </div>
-            <div class="mb-3">
-                <label class="form-label" asp-for="Input.Description"></label>
-                <input class="form-control" asp-for="Input.Description"/>
-            </div>
-            <div class="mb-3">
-                <label class="form-label" asp-for="Input.OutTradeNo"></label>
-                <input class="form-control" asp-for="Input.OutTradeNo"/>
-            </div>
-            <div class="mb-3">
-                <label class="form-label" asp-for="Input.NotifyUrl"></label>
-                <input class="form-control" asp-for="Input.NotifyUrl"/>
-            </div>
-            <div class="mb-3">
-                <label class="form-label" asp-for="Input.Amount.Total"></label>
-                <input class="form-control" asp-for="Input.Amount.Total"/>
-            </div>
-            <button class="btn btn-primary mb-3" type="submit">提交请求</button>
-        </form>
-        <hr/>
-        @if (ViewData["response"] is string response && !string.IsNullOrEmpty(response))
-        {
-            <div class="mb-3">
-                <label class="form-label">应答</label>
-                <textarea class="form-control" rows="10">@response</textarea>
-            </div>
-        }
-        @if (ViewData["parameter"] is string parameter && !string.IsNullOrEmpty(parameter))
-        {
-            <div class="mb-3">
-                <label class="form-label">App调起支付-请求参数</label>
-                <textarea class="form-control" rows="10">@parameter</textarea>
-            </div>
-        }
-    </div>
-</div>
-
-@section scripts {
-    @{ await Html.RenderPartialAsync("_ValidationScriptsPartial"); }
-}

+ 0 - 46
samples/Essensoft.Paylinks.Sample.Web/Pages/WeChatPay/Payments/AppPrepay.cshtml.cs

@@ -1,46 +0,0 @@
-using System.Text.Json;
-using Essensoft.Paylinks.WeChatPay.Client;
-using Essensoft.Paylinks.WeChatPay.Payments.Domain;
-using Essensoft.Paylinks.WeChatPay.Payments.Model;
-using Essensoft.Paylinks.WeChatPay.Payments.Request;
-using Microsoft.AspNetCore.Mvc;
-using Microsoft.AspNetCore.Mvc.RazorPages;
-using Microsoft.Extensions.Options;
-
-namespace Essensoft.Paylinks.Sample.Web.Pages.WeChatPay.Payments;
-
-public class AppPrepayModel(IWeChatPayClient client, IOptions<PaylinksOptions> options) : PageModel
-{
-    private readonly WeChatPayClientOptions _options = options.Value.WeChatPay;
-
-    [BindProperty]
-    public WeChatPayTransactionsAppBodyModel Input { get; set; }
-
-    public void OnGet()
-    {
-        Input = new WeChatPayTransactionsAppBodyModel
-        {
-            AppId = _options.AppId,
-            MchId = _options.MchId,
-            Description = "APP下单测试",
-            OutTradeNo = DateTimeOffset.Now.ToString("yyyyMMddHHmmssfff"),
-            NotifyUrl = "https://www.domain.com/WeChatPay/Payments/Notify/TransactionSuccess",
-            Amount = new CommReqAmountInfo { Total = 1 }
-        };
-    }
-
-    public async Task OnPostAsync()
-    {
-        var request = new WeChatPayTransactionsAppRequest();
-        request.SetBodyModel(Input);
-        var response = await client.ExecuteAsync(request, _options);
-        ViewData["response"] = response.Body;
-
-        if (response.IsSuccessful)
-        {
-            var sdkRequest = new WeChatPayAppTransferPaymentRequest { AppId = Input.AppId, PartnerId = Input.MchId, PrepayId = response.PrepayId };
-            var sdkResponse = await client.SdkExecuteAsync(sdkRequest, _options);
-            ViewData["parameter"] = JsonSerializer.Serialize(sdkResponse);
-        }
-    }
-}

+ 0 - 49
samples/Essensoft.Paylinks.Sample.Web/Pages/WeChatPay/Payments/Close.cshtml

@@ -1,49 +0,0 @@
-@page
-@model CloseModel
-@{
-    ViewData["Title"] = "关闭订单";
-}
-<nav aria-label="breadcrumb">
-    <ol class="breadcrumb">
-        <li class="breadcrumb-item">
-            <a asp-page="/Index">首页</a>
-        </li>
-        <li class="breadcrumb-item">
-            <a asp-page="/WeChatPay/Index">微信支付</a>
-        </li>
-        <li class="breadcrumb-item">
-            <a asp-page="/WeChatPay/Payments/Index">支付产品</a>
-        </li>
-        <li class="breadcrumb-item active" aria-current="page">@ViewData["Title"]</li>
-    </ol>
-</nav>
-<div class="card mb-3">
-    <div class="card-header">
-        @ViewData["Title"]
-    </div>
-    <div class="card-body">
-        <form method="post">
-            <div class="mb-3">
-                <label class="form-label" asp-for="OutTradeNo"></label>
-                <input class="form-control" asp-for="OutTradeNo"/>
-            </div>
-            <div class="mb-3">
-                <label class="form-label" asp-for="Input.MchId"></label>
-                <input class="form-control" asp-for="Input.MchId"/>
-            </div>
-            <button class="btn btn-primary mb-3" type="submit">提交请求</button>
-        </form>
-        <hr/>
-        @if (ViewData["response"] is string response && !string.IsNullOrEmpty(response))
-        {
-            <div class="mb-3">
-                <label class="form-label">应答</label>
-                <textarea class="form-control" rows="10">@response</textarea>
-            </div>
-        }
-    </div>
-</div>
-
-@section scripts {
-    @{ await Html.RenderPartialAsync("_ValidationScriptsPartial"); }
-}

+ 0 - 32
samples/Essensoft.Paylinks.Sample.Web/Pages/WeChatPay/Payments/Close.cshtml.cs

@@ -1,32 +0,0 @@
-using Essensoft.Paylinks.WeChatPay.Client;
-using Essensoft.Paylinks.WeChatPay.Payments.Model;
-using Essensoft.Paylinks.WeChatPay.Payments.Request;
-using Microsoft.AspNetCore.Mvc;
-using Microsoft.AspNetCore.Mvc.RazorPages;
-using Microsoft.Extensions.Options;
-
-namespace Essensoft.Paylinks.Sample.Web.Pages.WeChatPay.Payments;
-
-public class CloseModel(IWeChatPayClient client, IOptions<PaylinksOptions> options) : PageModel
-{
-    private readonly WeChatPayClientOptions _options = options.Value.WeChatPay;
-
-    [BindProperty]
-    public string OutTradeNo { get; set; }
-
-    [BindProperty]
-    public WeChatPayCloseByOutTradeNoBodyModel Input { get; set; }
-
-    public void OnGet()
-    {
-        Input = new WeChatPayCloseByOutTradeNoBodyModel { MchId = _options.MchId };
-    }
-
-    public async Task OnPostAsync()
-    {
-        var request = new WeChatPayCloseByOutTradeNoRequest { OutTradeNo = OutTradeNo };
-        request.SetBodyModel(Input);
-        var response = await client.ExecuteAsync(request, _options);
-        ViewData["response"] = $"{(int)response.StatusCode} {response.StatusCode}";
-    }
-}

+ 0 - 69
samples/Essensoft.Paylinks.Sample.Web/Pages/WeChatPay/Payments/CodePay.cshtml

@@ -1,69 +0,0 @@
-@page
-@model CodePayModel
-@{
-    ViewData["Title"] = "付款码支付";
-}
-<nav aria-label="breadcrumb">
-    <ol class="breadcrumb">
-        <li class="breadcrumb-item">
-            <a asp-page="/Index">首页</a>
-        </li>
-        <li class="breadcrumb-item">
-            <a asp-page="/WeChatPay/Index">微信支付</a>
-        </li>
-        <li class="breadcrumb-item">
-            <a asp-page="/WeChatPay/Payments/Index">支付产品</a>
-        </li>
-        <li class="breadcrumb-item active" aria-current="page">@ViewData["Title"]</li>
-    </ol>
-</nav>
-<div class="card mb-3">
-    <div class="card-header">
-        @ViewData["Title"]
-    </div>
-    <div class="card-body">
-        <form method="post">
-            <div class="mb-3">
-                <label class="form-label" asp-for="Input.AppId"></label>
-                <input class="form-control" asp-for="Input.AppId"/>
-            </div>
-            <div class="mb-3">
-                <label class="form-label" asp-for="Input.MchId"></label>
-                <input class="form-control" asp-for="Input.MchId"/>
-            </div>
-            <div class="mb-3">
-                <label class="form-label" asp-for="Input.OutTradeNo"></label>
-                <input class="form-control" asp-for="Input.OutTradeNo"/>
-            </div>
-            <div class="mb-3">
-                <label class="form-label" asp-for="Input.Description"></label>
-                <input class="form-control" asp-for="Input.Description"/>
-            </div>
-            <div class="mb-3">
-                <label class="form-label" asp-for="Input.Payer.AuthCode"></label>
-                <input class="form-control" asp-for="Input.Payer.AuthCode"/>
-            </div>
-            <div class="mb-3">
-                <label class="form-label" asp-for="Input.Amount.Total"></label>
-                <input class="form-control" asp-for="Input.Amount.Total"/>
-            </div>
-            <div class="mb-3">
-                <label class="form-label" asp-for="Input.SceneInfo.StoreInfo.Id"></label>
-                <input class="form-control" asp-for="Input.SceneInfo.StoreInfo.Id"/>
-            </div>
-            <button class="btn btn-primary mb-3" type="submit">提交请求</button>
-        </form>
-        <hr/>
-        @if (ViewData["response"] is string response && !string.IsNullOrEmpty(response))
-        {
-            <div class="mb-3">
-                <label class="form-label">应答</label>
-                <textarea class="form-control" rows="10">@response</textarea>
-            </div>
-        }
-    </div>
-</div>
-
-@section scripts {
-    @{ await Html.RenderPartialAsync("_ValidationScriptsPartial"); }
-}

+ 0 - 39
samples/Essensoft.Paylinks.Sample.Web/Pages/WeChatPay/Payments/CodePay.cshtml.cs

@@ -1,39 +0,0 @@
-using Essensoft.Paylinks.WeChatPay.Client;
-using Essensoft.Paylinks.WeChatPay.Payments.Domain;
-using Essensoft.Paylinks.WeChatPay.Payments.Model;
-using Essensoft.Paylinks.WeChatPay.Payments.Request;
-using Microsoft.AspNetCore.Mvc;
-using Microsoft.AspNetCore.Mvc.RazorPages;
-using Microsoft.Extensions.Options;
-
-namespace Essensoft.Paylinks.Sample.Web.Pages.WeChatPay.Payments;
-
-public class CodePayModel(IWeChatPayClient client, IOptions<PaylinksOptions> options) : PageModel
-{
-    private readonly WeChatPayClientOptions _options = options.Value.WeChatPay;
-
-    [BindProperty]
-    public WeChatPayTransactionsCodePayBodyModel Input { get; set; }
-
-    public void OnGet()
-    {
-        Input = new WeChatPayTransactionsCodePayBodyModel
-        {
-            AppId = _options.AppId,
-            MchId = _options.MchId,
-            Description = "付款码支付测试",
-            OutTradeNo = DateTimeOffset.Now.ToString("yyyyMMddHHmmssfff"),
-            Payer = new Payer { AuthCode = string.Empty },
-            Amount = new Amount { Total = 1 },
-            SceneInfo = new CodeReqSceneInfo { StoreInfo = new CodeReqStoreInfo { Id = string.Empty } }
-        };
-    }
-
-    public async Task OnPostAsync()
-    {
-        var request = new WeChatPayTransactionsCodePayRequest();
-        request.SetBodyModel(Input);
-        var response = await client.ExecuteAsync(request, _options);
-        ViewData["response"] = response.Body;
-    }
-}

+ 0 - 45
samples/Essensoft.Paylinks.Sample.Web/Pages/WeChatPay/Payments/DownloadBill.cshtml

@@ -1,45 +0,0 @@
-@page
-@model DownloadBillModel
-@{
-    ViewData["Title"] = "下载账单";
-}
-<nav aria-label="breadcrumb">
-    <ol class="breadcrumb">
-        <li class="breadcrumb-item">
-            <a asp-page="/Index">首页</a>
-        </li>
-        <li class="breadcrumb-item">
-            <a asp-page="/WeChatPay/Index">微信支付</a>
-        </li>
-        <li class="breadcrumb-item">
-            <a asp-page="/WeChatPay/Payments/Index">支付产品</a>
-        </li>
-        <li class="breadcrumb-item active" aria-current="page">@ViewData["Title"]</li>
-    </ol>
-</nav>
-<div class="card mb-3">
-    <div class="card-header">
-        @ViewData["Title"]
-    </div>
-    <div class="card-body">
-        <form method="post">
-            <div class="mb-3">
-                <label class="form-label" asp-for="DownloadUrl"></label>
-                <input class="form-control" asp-for="DownloadUrl"/>
-            </div>
-            <button class="btn btn-primary mb-3" type="submit">提交请求</button>
-        </form>
-        <hr/>
-        @if (ViewData["response"] is string response && !string.IsNullOrEmpty(response))
-        {
-            <div class="mb-3">
-                <label class="form-label">应答</label>
-                <textarea class="form-control" rows="10">@response</textarea>
-            </div>
-        }
-    </div>
-</div>
-
-@section scripts {
-    @{ await Html.RenderPartialAsync("_ValidationScriptsPartial"); }
-}

+ 0 - 26
samples/Essensoft.Paylinks.Sample.Web/Pages/WeChatPay/Payments/DownloadBill.cshtml.cs

@@ -1,26 +0,0 @@
-using Essensoft.Paylinks.WeChatPay.Client;
-using Essensoft.Paylinks.WeChatPay.Payments.Request;
-using Microsoft.AspNetCore.Mvc;
-using Microsoft.AspNetCore.Mvc.RazorPages;
-using Microsoft.Extensions.Options;
-
-namespace Essensoft.Paylinks.Sample.Web.Pages.WeChatPay.Payments;
-
-public class DownloadBillModel(IWeChatPayClient client, IOptions<PaylinksOptions> options) : PageModel
-{
-    private readonly WeChatPayClientOptions _options = options.Value.WeChatPay;
-
-    [BindProperty]
-    public string DownloadUrl { get; set; }
-
-    public void OnGet()
-    {
-    }
-
-    public async Task OnPostAsync()
-    {
-        var request = new WeChatPayDownloadBillRequest { DownloadUrl = DownloadUrl };
-        var response = await client.ExecuteAsync(request, _options);
-        ViewData["response"] = response.Body;
-    }
-}

+ 0 - 45
samples/Essensoft.Paylinks.Sample.Web/Pages/WeChatPay/Payments/FundFlowBill.cshtml

@@ -1,45 +0,0 @@
-@page
-@model GetFundFlowBillModel
-@{
-    ViewData["Title"] = "申请资金账单";
-}
-<nav aria-label="breadcrumb">
-    <ol class="breadcrumb">
-        <li class="breadcrumb-item">
-            <a asp-page="/Index">首页</a>
-        </li>
-        <li class="breadcrumb-item">
-            <a asp-page="/WeChatPay/Index">微信支付</a>
-        </li>
-        <li class="breadcrumb-item">
-            <a asp-page="/WeChatPay/Payments/Index">支付产品</a>
-        </li>
-        <li class="breadcrumb-item active" aria-current="page">@ViewData["Title"]</li>
-    </ol>
-</nav>
-<div class="card mb-3">
-    <div class="card-header">
-        @ViewData["Title"]
-    </div>
-    <div class="card-body">
-        <form method="post">
-            <div class="mb-3">
-                <label class="form-label" asp-for="Input.BillDate"></label>
-                <input class="form-control" asp-for="Input.BillDate"/>
-            </div>
-            <button class="btn btn-primary mb-3" type="submit">提交请求</button>
-        </form>
-        <hr/>
-        @if (ViewData["response"] is string response && !string.IsNullOrEmpty(response))
-        {
-            <div class="mb-3">
-                <label class="form-label">应答</label>
-                <textarea class="form-control" rows="10">@response</textarea>
-            </div>
-        }
-    </div>
-</div>
-
-@section scripts {
-    @{ await Html.RenderPartialAsync("_ValidationScriptsPartial"); }
-}

+ 0 - 29
samples/Essensoft.Paylinks.Sample.Web/Pages/WeChatPay/Payments/FundFlowBill.cshtml.cs

@@ -1,29 +0,0 @@
-using Essensoft.Paylinks.WeChatPay.Client;
-using Essensoft.Paylinks.WeChatPay.Payments.Model;
-using Essensoft.Paylinks.WeChatPay.Payments.Request;
-using Microsoft.AspNetCore.Mvc;
-using Microsoft.AspNetCore.Mvc.RazorPages;
-using Microsoft.Extensions.Options;
-
-namespace Essensoft.Paylinks.Sample.Web.Pages.WeChatPay.Payments;
-
-public class GetFundFlowBillModel(IWeChatPayClient client, IOptions<PaylinksOptions> options) : PageModel
-{
-    private readonly WeChatPayClientOptions _options = options.Value.WeChatPay;
-
-    [BindProperty]
-    public WeChatPayFundFlowBillQueryModel Input { get; set; }
-
-    public void OnGet()
-    {
-        Input = new WeChatPayFundFlowBillQueryModel { BillDate = DateTimeOffset.Now.AddDays(-1).ToString("yyyy-MM-dd") };
-    }
-
-    public async Task OnPostAsync()
-    {
-        var request = new WeChatPayFundFlowBillRequest();
-        request.SetQueryModel(Input);
-        var response = await client.ExecuteAsync(request, _options);
-        ViewData["response"] = response.Body;
-    }
-}

+ 0 - 80
samples/Essensoft.Paylinks.Sample.Web/Pages/WeChatPay/Payments/H5Prepay.cshtml

@@ -1,80 +0,0 @@
-@page
-@model H5PrepayModel
-@{
-    ViewData["Title"] = "H5下单";
-}
-<nav aria-label="breadcrumb">
-    <ol class="breadcrumb">
-        <li class="breadcrumb-item">
-            <a asp-page="/Index">首页</a>
-        </li>
-        <li class="breadcrumb-item">
-            <a asp-page="/WeChatPay/Index">微信支付</a>
-        </li>
-        <li class="breadcrumb-item">
-            <a asp-page="/WeChatPay/Payments/Index">支付产品</a>
-        </li>
-        <li class="breadcrumb-item active" aria-current="page">@ViewData["Title"]</li>
-    </ol>
-</nav>
-<div class="card mb-3">
-    <div class="card-header">
-        @ViewData["Title"]
-    </div>
-    <div class="card-body">
-        <form method="post">
-            <div class="mb-3">
-                <label class="form-label" asp-for="Input.AppId"></label>
-                <input class="form-control" asp-for="Input.AppId"/>
-            </div>
-            <div class="mb-3">
-                <label class="form-label" asp-for="Input.MchId"></label>
-                <input class="form-control" asp-for="Input.MchId"/>
-            </div>
-            <div class="mb-3">
-                <label class="form-label" asp-for="Input.Description"></label>
-                <input class="form-control" asp-for="Input.Description"/>
-            </div>
-            <div class="mb-3">
-                <label class="form-label" asp-for="Input.OutTradeNo"></label>
-                <input class="form-control" asp-for="Input.OutTradeNo"/>
-            </div>
-            <div class="mb-3">
-                <label class="form-label" asp-for="Input.NotifyUrl"></label>
-                <input class="form-control" asp-for="Input.NotifyUrl"/>
-            </div>
-            <div class="mb-3">
-                <label class="form-label" asp-for="Input.Amount.Total"></label>
-                <input class="form-control" asp-for="Input.Amount.Total"/>
-            </div>
-            <div class="mb-3">
-                <label class="form-label" asp-for="Input.SceneInfo.PayerClientIp"></label>
-                <input class="form-control" asp-for="Input.SceneInfo.PayerClientIp"/>
-            </div>
-            <div class="mb-3">
-                <label class="form-label" asp-for="Input.SceneInfo.H5Info.Type"></label>
-                <input class="form-control" asp-for="Input.SceneInfo.H5Info.Type"/>
-            </div>
-            <button class="btn btn-primary mb-3" type="submit">提交请求</button>
-        </form>
-        <hr/>
-        @if (ViewData["response"] is string response && !string.IsNullOrEmpty(response))
-        {
-            <div class="mb-3">
-                <label class="form-label">应答</label>
-                <textarea class="form-control" rows="10">@response</textarea>
-            </div>
-        }
-        @if (ViewData["parameter"] is string parameter && !string.IsNullOrEmpty(parameter))
-        {
-            <div class="mb-3">
-                <label class="form-label">App调起支付-请求参数</label>
-                <textarea class="form-control" rows="10">@parameter</textarea>
-            </div>
-        }
-    </div>
-</div>
-
-@section scripts {
-    @{ await Html.RenderPartialAsync("_ValidationScriptsPartial"); }
-}

+ 0 - 39
samples/Essensoft.Paylinks.Sample.Web/Pages/WeChatPay/Payments/H5Prepay.cshtml.cs

@@ -1,39 +0,0 @@
-using Essensoft.Paylinks.WeChatPay.Client;
-using Essensoft.Paylinks.WeChatPay.Payments.Domain;
-using Essensoft.Paylinks.WeChatPay.Payments.Model;
-using Essensoft.Paylinks.WeChatPay.Payments.Request;
-using Microsoft.AspNetCore.Mvc;
-using Microsoft.AspNetCore.Mvc.RazorPages;
-using Microsoft.Extensions.Options;
-
-namespace Essensoft.Paylinks.Sample.Web.Pages.WeChatPay.Payments;
-
-public class H5PrepayModel(IWeChatPayClient client, IOptions<PaylinksOptions> options) : PageModel
-{
-    private readonly WeChatPayClientOptions _options = options.Value.WeChatPay;
-
-    [BindProperty]
-    public WeChatPayTransactionsH5BodyModel Input { get; set; }
-
-    public void OnGet()
-    {
-        Input = new WeChatPayTransactionsH5BodyModel
-        {
-            AppId = _options.AppId,
-            MchId = _options.MchId,
-            Description = "H5下单测试",
-            OutTradeNo = DateTimeOffset.Now.ToString("yyyyMMddHHmmssfff"),
-            NotifyUrl = "https://www.domain.com/WeChatPay/Payments/Notify/TransactionSuccess",
-            Amount = new CommReqAmountInfo { Total = 1 },
-            SceneInfo = new H5ReqSceneInfo { PayerClientIp = string.Empty, H5Info = new H5Info { Type = string.Empty } }
-        };
-    }
-
-    public async Task OnPostAsync()
-    {
-        var request = new WeChatPayTransactionsH5Request();
-        request.SetBodyModel(Input);
-        var response = await client.ExecuteAsync(request, _options);
-        ViewData["response"] = response.Body;
-    }
-}

+ 0 - 1140
samples/Essensoft.Paylinks.Sample.Web/Pages/WeChatPay/Payments/Index.cshtml

@@ -1,1140 +0,0 @@
-@page
-@model IndexModel
-@{
-    ViewData["Title"] = "支付产品";
-}
-<nav aria-label="breadcrumb">
-    <ol class="breadcrumb">
-        <li class="breadcrumb-item">
-            <a asp-page="/Index">首页</a>
-        </li>
-        <li class="breadcrumb-item">
-            <a asp-page="/WeChatPay/Index">微信支付</a>
-        </li>
-        <li class="breadcrumb-item active" aria-current="page">@ViewData["Title"]</li>
-    </ol>
-</nav>
-<div class="mb-3">
-    <div class="accordion" id="accordionPayments">
-        <div class="accordion-item">
-            <h2 class="accordion-header">
-                <button class="accordion-button collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#collapseJsapiPay" aria-expanded="false" aria-controls="collapseJsapiPay">
-                    JSAPI支付
-                </button>
-            </h2>
-            <div id="collapseJsapiPay" class="accordion-collapse collapse" data-bs-parent="#accordionPayments">
-                <div class="accordion-body">
-                    <ul class="list-group">
-                        <li class="list-group-item d-flex justify-content-between align-items-center">
-                            JSAPI下单
-                            <div class="btn-group">
-                                <a class="btn btn-link btn-sm" href="https://pay.weixin.qq.com/doc/v3/merchant/4012791856" target="_blank">查看文档</a>
-                                <a class="btn btn-link btn-sm" asp-page="/WeChatPay/Payments/JsapiPrepay">去调试</a>
-                            </div>
-                        </li>
-                        <li class="list-group-item d-flex justify-content-between align-items-center">
-                            JSAPI调起支付
-                            <div class="btn-group">
-                                <a class="btn btn-link btn-sm" href="https://pay.weixin.qq.com/doc/v3/merchant/4012791857" target="_blank">查看文档</a>
-                                <a class="btn btn-link btn-sm disabled" href="#">去调试</a>
-                            </div>
-                        </li>
-                        <li class="list-group-item d-flex justify-content-between align-items-center">
-                            微信支付订单号查询订单
-                            <div class="btn-group">
-                                <a class="btn btn-link btn-sm" href="https://pay.weixin.qq.com/doc/v3/merchant/4012791858" target="_blank">查看文档</a>
-                                <a class="btn btn-link btn-sm" asp-page="/WeChatPay/Payments/QueryByTransactionId">去调试</a>
-                            </div>
-                        </li>
-                        <li class="list-group-item d-flex justify-content-between align-items-center">
-                            商户订单号查询订单
-                            <div class="btn-group">
-                                <a class="btn btn-link btn-sm" href="https://pay.weixin.qq.com/doc/v3/merchant/4012791859" target="_blank">查看文档</a>
-                                <a class="btn btn-link btn-sm" asp-page="/WeChatPay/Payments/QueryByOutTradeNo">去调试</a>
-                            </div>
-                        </li>
-                        <li class="list-group-item d-flex justify-content-between align-items-center">
-                            关闭订单
-                            <div class="btn-group">
-                                <a class="btn btn-link btn-sm" href="https://pay.weixin.qq.com/doc/v3/merchant/4012791860" target="_blank">查看文档</a>
-                                <a class="btn btn-link btn-sm" asp-page="/WeChatPay/Payments/Close">去调试</a>
-                            </div>
-                        </li>
-                        <li class="list-group-item d-flex justify-content-between align-items-center">
-                            支付成功回调通知
-                            <div class="btn-group">
-                                <a class="btn btn-link btn-sm" href="https://pay.weixin.qq.com/doc/v3/merchant/4012791861" target="_blank">查看文档</a>
-                                <a class="btn btn-link btn-sm disabled" href="#">去调试</a>
-                            </div>
-                        </li>
-                        <li class="list-group-item d-flex justify-content-between align-items-center">
-                            退款申请
-                            <div class="btn-group">
-                                <a class="btn btn-link btn-sm" href="https://pay.weixin.qq.com/doc/v3/merchant/4012791862" target="_blank">查看文档</a>
-                                <a class="btn btn-link btn-sm" asp-page="/WeChatPay/Payments/Refund">去调试</a>
-                            </div>
-                        </li>
-                        <li class="list-group-item d-flex justify-content-between align-items-center">
-                            查询单笔退款(通过商户退款单号)
-                            <div class="btn-group">
-                                <a class="btn btn-link btn-sm" href="https://pay.weixin.qq.com/doc/v3/merchant/4012791863" target="_blank">查看文档</a>
-                                <a class="btn btn-link btn-sm" asp-page="/WeChatPay/Payments/RefundQueryByOutRefundNo">去调试</a>
-                            </div>
-                        </li>
-                        <li class="list-group-item d-flex justify-content-between align-items-center">
-                            发起异常退款
-                            <div class="btn-group">
-                                <a class="btn btn-link btn-sm" href="https://pay.weixin.qq.com/doc/v3/merchant/4012791864" target="_blank">查看文档</a>
-                                <a class="btn btn-link btn-sm" asp-page="/WeChatPay/Payments/AbnormalRefund">去调试</a>
-                            </div>
-                        </li>
-                        <li class="list-group-item d-flex justify-content-between align-items-center">
-                            退款结果回调通知
-                            <div class="btn-group">
-                                <a class="btn btn-link btn-sm" href="https://pay.weixin.qq.com/doc/v3/merchant/4012791865" target="_blank">查看文档</a>
-                                <a class="btn btn-link btn-sm disabled" href="#">去调试</a>
-                            </div>
-                        </li>
-                        <li class="list-group-item d-flex justify-content-between align-items-center">
-                            申请交易账单
-                            <div class="btn-group">
-                                <a class="btn btn-link btn-sm" href="https://pay.weixin.qq.com/doc/v3/merchant/4012791866" target="_blank">查看文档</a>
-                                <a class="btn btn-link btn-sm" asp-page="/WeChatPay/Payments/TradeBill">去调试</a>
-                            </div>
-                        </li>
-                        <li class="list-group-item d-flex justify-content-between align-items-center">
-                            申请资金账单
-                            <div class="btn-group">
-                                <a class="btn btn-link btn-sm" href="https://pay.weixin.qq.com/doc/v3/merchant/4012791867" target="_blank">查看文档</a>
-                                <a class="btn btn-link btn-sm" asp-page="/WeChatPay/Payments/FundFlowBill">去调试</a>
-                            </div>
-                        </li>
-                        <li class="list-group-item d-flex justify-content-between align-items-center">
-                            下载账单
-                            <div class="btn-group">
-                                <a class="btn btn-link btn-sm" href="https://pay.weixin.qq.com/doc/v3/merchant/4012791868" target="_blank">查看文档</a>
-                                <a class="btn btn-link btn-sm" asp-page="/WeChatPay/Payments/DownloadBill">去调试</a>
-                            </div>
-                        </li>
-                    </ul>
-                </div>
-            </div>
-        </div>
-        <div class="accordion-item">
-            <h2 class="accordion-header">
-                <button class="accordion-button collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#collapseAppPay" aria-expanded="false" aria-controls="collapseAppPay">
-                    APP支付
-                </button>
-            </h2>
-            <div id="collapseAppPay" class="accordion-collapse collapse" data-bs-parent="#accordionPayments">
-                <div class="accordion-body">
-                    <ul class="list-group">
-                        <li class="list-group-item d-flex justify-content-between align-items-center">
-                            APP下单
-                            <div class="btn-group">
-                                <a class="btn btn-link btn-sm" href="https://pay.weixin.qq.com/doc/v3/merchant/4013070347" target="_blank">查看文档</a>
-                                <a class="btn btn-link btn-sm" asp-page="/WeChatPay/Payments/AppPrepay">去调试</a>
-                            </div>
-                        </li>
-                        <li class="list-group-item d-flex justify-content-between align-items-center">
-                            APP调起支付
-                            <div class="btn-group">
-                                <a class="btn btn-link btn-sm" href="https://pay.weixin.qq.com/doc/v3/merchant/4013070351" target="_blank">查看文档</a>
-                                <a class="btn btn-link btn-sm disabled" href="#">去调试</a>
-                            </div>
-                        </li>
-                        <li class="list-group-item d-flex justify-content-between align-items-center">
-                            微信支付订单号查询订单
-                            <div class="btn-group">
-                                <a class="btn btn-link btn-sm" href="https://pay.weixin.qq.com/doc/v3/merchant/4013070354" target="_blank">查看文档</a>
-                                <a class="btn btn-link btn-sm" asp-page="/WeChatPay/Payments/QueryByTransactionId">去调试</a>
-                            </div>
-                        </li>
-                        <li class="list-group-item d-flex justify-content-between align-items-center">
-                            商户订单号查询订单
-                            <div class="btn-group">
-                                <a class="btn btn-link btn-sm" href="https://pay.weixin.qq.com/doc/v3/merchant/4013070356" target="_blank">查看文档</a>
-                                <a class="btn btn-link btn-sm" asp-page="/WeChatPay/Payments/QueryByOutTradeNo">去调试</a>
-                            </div>
-                        </li>
-                        <li class="list-group-item d-flex justify-content-between align-items-center">
-                            关闭订单
-                            <div class="btn-group">
-                                <a class="btn btn-link btn-sm" href="https://pay.weixin.qq.com/doc/v3/merchant/4013070360" target="_blank">查看文档</a>
-                                <a class="btn btn-link btn-sm" asp-page="/WeChatPay/Payments/Close">去调试</a>
-                            </div>
-                        </li>
-                        <li class="list-group-item d-flex justify-content-between align-items-center">
-                            支付成功回调通知
-                            <div class="btn-group">
-                                <a class="btn btn-link btn-sm" href="https://pay.weixin.qq.com/doc/v3/merchant/4013070368" target="_blank">查看文档</a>
-                                <a class="btn btn-link btn-sm disabled" href="#">去调试</a>
-                            </div>
-                        </li>
-                        <li class="list-group-item d-flex justify-content-between align-items-center">
-                            退款申请
-                            <div class="btn-group">
-                                <a class="btn btn-link btn-sm" href="https://pay.weixin.qq.com/doc/v3/merchant/4013070371" target="_blank">查看文档</a>
-                                <a class="btn btn-link btn-sm" asp-page="/WeChatPay/Payments/Refund">去调试</a>
-                            </div>
-                        </li>
-                        <li class="list-group-item d-flex justify-content-between align-items-center">
-                            查询单笔退款(通过商户退款单号)
-                            <div class="btn-group">
-                                <a class="btn btn-link btn-sm" href="https://pay.weixin.qq.com/doc/v3/merchant/4013070374" target="_blank">查看文档</a>
-                                <a class="btn btn-link btn-sm" asp-page="/WeChatPay/Payments/RefundQueryByOutRefundNo">去调试</a>
-                            </div>
-                        </li>
-                        <li class="list-group-item d-flex justify-content-between align-items-center">
-                            发起异常退款
-                            <div class="btn-group">
-                                <a class="btn btn-link btn-sm" href="https://pay.weixin.qq.com/doc/v3/merchant/4012791864" target="_blank">查看文档</a>
-                                <a class="btn btn-link btn-sm" asp-page="/WeChatPay/Payments/AbnormalRefund">去调试</a>
-                            </div>
-                        </li>
-                        <li class="list-group-item d-flex justify-content-between align-items-center">
-                            退款结果回调通知
-                            <div class="btn-group">
-                                <a class="btn btn-link btn-sm" href="https://pay.weixin.qq.com/doc/v3/merchant/4013070388" target="_blank">查看文档</a>
-                                <a class="btn btn-link btn-sm disabled" href="#">去调试</a>
-                            </div>
-                        </li>
-                        <li class="list-group-item d-flex justify-content-between align-items-center">
-                            申请交易账单
-                            <div class="btn-group">
-                                <a class="btn btn-link btn-sm" href="https://pay.weixin.qq.com/doc/v3/merchant/4013070395" target="_blank">查看文档</a>
-                                <a class="btn btn-link btn-sm" asp-page="/WeChatPay/Payments/TradeBill">去调试</a>
-                            </div>
-                        </li>
-                        <li class="list-group-item d-flex justify-content-between align-items-center">
-                            申请资金账单
-                            <div class="btn-group">
-                                <a class="btn btn-link btn-sm" href="https://pay.weixin.qq.com/doc/v3/merchant/4013070400" target="_blank">查看文档</a>
-                                <a class="btn btn-link btn-sm" asp-page="/WeChatPay/Payments/FundFlowBill">去调试</a>
-                            </div>
-                        </li>
-                        <li class="list-group-item d-flex justify-content-between align-items-center">
-                            下载账单
-                            <div class="btn-group">
-                                <a class="btn btn-link btn-sm" href="https://pay.weixin.qq.com/doc/v3/merchant/4013070401" target="_blank">查看文档</a>
-                                <a class="btn btn-link btn-sm" asp-page="/WeChatPay/Payments/DownloadBill">去调试</a>
-                            </div>
-                        </li>
-                    </ul>
-                </div>
-            </div>
-        </div>
-        <div class="accordion-item">
-            <h2 class="accordion-header">
-                <button class="accordion-button collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#collapseH5Pay" aria-expanded="false" aria-controls="collapseH5Pay">
-                    H5支付
-                </button>
-            </h2>
-            <div id="collapseH5Pay" class="accordion-collapse collapse" data-bs-parent="#accordionPayments">
-                <div class="accordion-body">
-                    <ul class="list-group">
-                        <li class="list-group-item d-flex justify-content-between align-items-center">
-                            H5下单
-                            <div class="btn-group">
-                                <a class="btn btn-link btn-sm" href="https://pay.weixin.qq.com/doc/v3/merchant/4012791834" target="_blank">查看文档</a>
-                                <a class="btn btn-link btn-sm" asp-page="/WeChatPay/Payments/H5Prepay">去调试</a>
-                            </div>
-                        </li>
-                        <li class="list-group-item d-flex justify-content-between align-items-center">
-                            H5调起支付
-                            <div class="btn-group">
-                                <a class="btn btn-link btn-sm" href="https://pay.weixin.qq.com/doc/v3/merchant/4012791835" target="_blank">查看文档</a>
-                                <a class="btn btn-link btn-sm disabled" href="#">去调试</a>
-                            </div>
-                        </li>
-                        <li class="list-group-item d-flex justify-content-between align-items-center">
-                            微信支付订单号查询订单
-                            <div class="btn-group">
-                                <a class="btn btn-link btn-sm" href="https://pay.weixin.qq.com/doc/v3/merchant/4012791837" target="_blank">查看文档</a>
-                                <a class="btn btn-link btn-sm" asp-page="/WeChatPay/Payments/QueryByTransactionId">去调试</a>
-                            </div>
-                        </li>
-                        <li class="list-group-item d-flex justify-content-between align-items-center">
-                            商户订单号查询订单
-                            <div class="btn-group">
-                                <a class="btn btn-link btn-sm" href="https://pay.weixin.qq.com/doc/v3/merchant/4012791838" target="_blank">查看文档</a>
-                                <a class="btn btn-link btn-sm" asp-page="/WeChatPay/Payments/QueryByOutTradeNo">去调试</a>
-                            </div>
-                        </li>
-                        <li class="list-group-item d-flex justify-content-between align-items-center">
-                            关闭订单
-                            <div class="btn-group">
-                                <a class="btn btn-link btn-sm" href="https://pay.weixin.qq.com/doc/v3/merchant/4012791839" target="_blank">查看文档</a>
-                                <a class="btn btn-link btn-sm" asp-page="/WeChatPay/Payments/Close">去调试</a>
-                            </div>
-                        </li>
-                        <li class="list-group-item d-flex justify-content-between align-items-center">
-                            支付成功回调通知
-                            <div class="btn-group">
-                                <a class="btn btn-link btn-sm" href="https://pay.weixin.qq.com/doc/v3/merchant/4012791836" target="_blank">查看文档</a>
-                                <a class="btn btn-link btn-sm disabled" href="#">去调试</a>
-                            </div>
-                        </li>
-                        <li class="list-group-item d-flex justify-content-between align-items-center">
-                            退款申请
-                            <div class="btn-group">
-                                <a class="btn btn-link btn-sm" href="https://pay.weixin.qq.com/doc/v3/merchant/4012810597" target="_blank">查看文档</a>
-                                <a class="btn btn-link btn-sm" asp-page="/WeChatPay/Payments/Refund">去调试</a>
-                            </div>
-                        </li>
-                        <li class="list-group-item d-flex justify-content-between align-items-center">
-                            查询单笔退款(通过商户退款单号)
-                            <div class="btn-group">
-                                <a class="btn btn-link btn-sm" href="https://pay.weixin.qq.com/doc/v3/merchant/4012810601" target="_blank">查看文档</a>
-                                <a class="btn btn-link btn-sm" asp-page="/WeChatPay/Payments/RefundQueryByOutRefundNo">去调试</a>
-                            </div>
-                        </li>
-                        <li class="list-group-item d-flex justify-content-between align-items-center">
-                            发起异常退款
-                            <div class="btn-group">
-                                <a class="btn btn-link btn-sm" href="https://pay.weixin.qq.com/doc/v3/merchant/4012810603" target="_blank">查看文档</a>
-                                <a class="btn btn-link btn-sm" asp-page="/WeChatPay/Payments/AbnormalRefund">去调试</a>
-                            </div>
-                        </li>
-                        <li class="list-group-item d-flex justify-content-between align-items-center">
-                            退款结果回调通知
-                            <div class="btn-group">
-                                <a class="btn btn-link btn-sm" href="https://pay.weixin.qq.com/doc/v3/merchant/4012810605" target="_blank">查看文档</a>
-                                <a class="btn btn-link btn-sm disabled" href="#">去调试</a>
-                            </div>
-                        </li>
-                        <li class="list-group-item d-flex justify-content-between align-items-center">
-                            申请交易账单
-                            <div class="btn-group">
-                                <a class="btn btn-link btn-sm" href="https://pay.weixin.qq.com/doc/v3/merchant/4012810606" target="_blank">查看文档</a>
-                                <a class="btn btn-link btn-sm" asp-page="/WeChatPay/Payments/TradeBill">去调试</a>
-                            </div>
-                        </li>
-                        <li class="list-group-item d-flex justify-content-between align-items-center">
-                            申请资金账单
-                            <div class="btn-group">
-                                <a class="btn btn-link btn-sm" href="https://pay.weixin.qq.com/doc/v3/merchant/4012810609" target="_blank">查看文档</a>
-                                <a class="btn btn-link btn-sm" asp-page="/WeChatPay/Payments/FundFlowBill">去调试</a>
-                            </div>
-                        </li>
-                        <li class="list-group-item d-flex justify-content-between align-items-center">
-                            下载账单
-                            <div class="btn-group">
-                                <a class="btn btn-link btn-sm" href="https://pay.weixin.qq.com/doc/v3/merchant/4012810615" target="_blank">查看文档</a>
-                                <a class="btn btn-link btn-sm" asp-page="/WeChatPay/Payments/DownloadBill">去调试</a>
-                            </div>
-                        </li>
-                    </ul>
-                </div>
-            </div>
-        </div>
-        <div class="accordion-item">
-            <h2 class="accordion-header">
-                <button class="accordion-button collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#collapseNativePay" aria-expanded="true" aria-controls="collapseNativePay">
-                    Native支付
-                </button>
-            </h2>
-            <div id="collapseNativePay" class="accordion-collapse collapse" data-bs-parent="#accordionPayments">
-                <div class="accordion-body">
-                    <ul class="list-group">
-                        <li class="list-group-item d-flex justify-content-between align-items-center">
-                            Native下单
-                            <div class="btn-group">
-                                <a class="btn btn-link btn-sm" href="https://pay.weixin.qq.com/doc/v3/merchant/4012791877" target="_blank">查看文档</a>
-                                <a class="btn btn-link btn-sm" asp-page="/WeChatPay/Payments/NativePrepay">去调试</a>
-                            </div>
-                        </li>
-                        <li class="list-group-item d-flex justify-content-between align-items-center">
-                            Native调起支付
-                            <div class="btn-group">
-                                <a class="btn btn-link btn-sm" href="https://pay.weixin.qq.com/doc/v3/merchant/4012791878" target="_blank">查看文档</a>
-                                <a class="btn btn-link btn-sm disabled" href="#">去调试</a>
-                            </div>
-                        </li>
-                        <li class="list-group-item d-flex justify-content-between align-items-center">
-                            微信支付订单号查询订单
-                            <div class="btn-group">
-                                <a class="btn btn-link btn-sm" href="https://pay.weixin.qq.com/doc/v3/merchant/4012791879" target="_blank">查看文档</a>
-                                <a class="btn btn-link btn-sm" asp-page="/WeChatPay/Payments/QueryByTransactionId">去调试</a>
-                            </div>
-                        </li>
-                        <li class="list-group-item d-flex justify-content-between align-items-center">
-                            商户订单号查询订单
-                            <div class="btn-group">
-                                <a class="btn btn-link btn-sm" href="https://pay.weixin.qq.com/doc/v3/merchant/4012791880" target="_blank">查看文档</a>
-                                <a class="btn btn-link btn-sm" asp-page="/WeChatPay/Payments/QueryByOutTradeNo">去调试</a>
-                            </div>
-                        </li>
-                        <li class="list-group-item d-flex justify-content-between align-items-center">
-                            关闭订单
-                            <div class="btn-group">
-                                <a class="btn btn-link btn-sm" href="https://pay.weixin.qq.com/doc/v3/merchant/4012791881" target="_blank">查看文档</a>
-                                <a class="btn btn-link btn-sm" asp-page="/WeChatPay/Payments/Close">去调试</a>
-                            </div>
-                        </li>
-                        <li class="list-group-item d-flex justify-content-between align-items-center">
-                            支付成功回调通知
-                            <div class="btn-group">
-                                <a class="btn btn-link btn-sm" href="https://pay.weixin.qq.com/doc/v3/merchant/4012791882" target="_blank">查看文档</a>
-                                <a class="btn btn-link btn-sm disabled" href="#">去调试</a>
-                            </div>
-                        </li>
-                        <li class="list-group-item d-flex justify-content-between align-items-center">
-                            退款申请
-                            <div class="btn-group">
-                                <a class="btn btn-link btn-sm" href="https://pay.weixin.qq.com/doc/v3/merchant/4012791883" target="_blank">查看文档</a>
-                                <a class="btn btn-link btn-sm" asp-page="/WeChatPay/Payments/Refund">去调试</a>
-                            </div>
-                        </li>
-                        <li class="list-group-item d-flex justify-content-between align-items-center">
-                            查询单笔退款(通过商户退款单号)
-                            <div class="btn-group">
-                                <a class="btn btn-link btn-sm" href="https://pay.weixin.qq.com/doc/v3/merchant/4012791884" target="_blank">查看文档</a>
-                                <a class="btn btn-link btn-sm" asp-page="/WeChatPay/Payments/RefundQueryByOutRefundNo">去调试</a>
-                            </div>
-                        </li>
-                        <li class="list-group-item d-flex justify-content-between align-items-center">
-                            发起异常退款
-                            <div class="btn-group">
-                                <a class="btn btn-link btn-sm" href="https://pay.weixin.qq.com/doc/v3/merchant/4012791885" target="_blank">查看文档</a>
-                                <a class="btn btn-link btn-sm" asp-page="/WeChatPay/Payments/AbnormalRefund">去调试</a>
-                            </div>
-                        </li>
-                        <li class="list-group-item d-flex justify-content-between align-items-center">
-                            退款结果回调通知
-                            <div class="btn-group">
-                                <a class="btn btn-link btn-sm" href="https://pay.weixin.qq.com/doc/v3/merchant/4012791886" target="_blank">查看文档</a>
-                                <a class="btn btn-link btn-sm disabled" href="#">去调试</a>
-                            </div>
-                        </li>
-                        <li class="list-group-item d-flex justify-content-between align-items-center">
-                            申请交易账单
-                            <div class="btn-group">
-                                <a class="btn btn-link btn-sm" href="https://pay.weixin.qq.com/doc/v3/merchant/4012791887" target="_blank">查看文档</a>
-                                <a class="btn btn-link btn-sm" asp-page="/WeChatPay/Payments/TradeBill">去调试</a>
-                            </div>
-                        </li>
-                        <li class="list-group-item d-flex justify-content-between align-items-center">
-                            申请资金账单
-                            <div class="btn-group">
-                                <a class="btn btn-link btn-sm" href="https://pay.weixin.qq.com/doc/v3/merchant/4012791888" target="_blank">查看文档</a>
-                                <a class="btn btn-link btn-sm" asp-page="/WeChatPay/Payments/FundFlowBill">去调试</a>
-                            </div>
-                        </li>
-                        <li class="list-group-item d-flex justify-content-between align-items-center">
-                            下载账单
-                            <div class="btn-group">
-                                <a class="btn btn-link btn-sm" href="https://pay.weixin.qq.com/doc/v3/merchant/4012791889" target="_blank">查看文档</a>
-                                <a class="btn btn-link btn-sm" asp-page="/WeChatPay/Payments/DownloadBill">去调试</a>
-                            </div>
-                        </li>
-                    </ul>
-                </div>
-            </div>
-        </div>
-        <div class="accordion-item">
-            <h2 class="accordion-header">
-                <button class="accordion-button collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#collapseMiniProgramPay" aria-expanded="false" aria-controls="collapseMiniProgramPay">
-                    小程序支付
-                </button>
-            </h2>
-            <div id="collapseMiniProgramPay" class="accordion-collapse collapse" data-bs-parent="#accordionPayments">
-                <div class="accordion-body">
-                    <ul class="list-group">
-                        <li class="list-group-item d-flex justify-content-between align-items-center">
-                            小程序支付
-                            <div class="btn-group">
-                                <a class="btn btn-link btn-sm" href="https://pay.weixin.qq.com/doc/v3/merchant/4012791897" target="_blank">查看文档</a>
-                                <a class="btn btn-link btn-sm" asp-page="/WeChatPay/Payments/JsapiPrepay">去调试</a>
-                            </div>
-                        </li>
-                        <li class="list-group-item d-flex justify-content-between align-items-center">
-                            小程序调起支付
-                            <div class="btn-group">
-                                <a class="btn btn-link btn-sm" href="https://pay.weixin.qq.com/doc/v3/merchant/4012791898" target="_blank">查看文档</a>
-                                <a class="btn btn-link btn-sm disabled" href="#">去调试</a>
-                            </div>
-                        </li>
-                        <li class="list-group-item d-flex justify-content-between align-items-center">
-                            微信支付订单号查询订单
-                            <div class="btn-group">
-                                <a class="btn btn-link btn-sm" href="https://pay.weixin.qq.com/doc/v3/merchant/4012791899" target="_blank">查看文档</a>
-                                <a class="btn btn-link btn-sm" asp-page="/WeChatPay/Payments/QueryByTransactionId">去调试</a>
-                            </div>
-                        </li>
-                        <li class="list-group-item d-flex justify-content-between align-items-center">
-                            商户订单号查询订单
-                            <div class="btn-group">
-                                <a class="btn btn-link btn-sm" href="https://pay.weixin.qq.com/doc/v3/merchant/4012791900" target="_blank">查看文档</a>
-                                <a class="btn btn-link btn-sm" asp-page="/WeChatPay/Payments/QueryByOutTradeNo">去调试</a>
-                            </div>
-                        </li>
-                        <li class="list-group-item d-flex justify-content-between align-items-center">
-                            关闭订单
-                            <div class="btn-group">
-                                <a class="btn btn-link btn-sm" href="https://pay.weixin.qq.com/doc/v3/merchant/4012791901" target="_blank">查看文档</a>
-                                <a class="btn btn-link btn-sm" asp-page="/WeChatPay/Payments/Close">去调试</a>
-                            </div>
-                        </li>
-                        <li class="list-group-item d-flex justify-content-between align-items-center">
-                            支付成功回调通知
-                            <div class="btn-group">
-                                <a class="btn btn-link btn-sm" href="https://pay.weixin.qq.com/doc/v3/merchant/4012791902" target="_blank">查看文档</a>
-                                <a class="btn btn-link btn-sm disabled" href="#">去调试</a>
-                            </div>
-                        </li>
-                        <li class="list-group-item d-flex justify-content-between align-items-center">
-                            退款申请
-                            <div class="btn-group">
-                                <a class="btn btn-link btn-sm" href="https://pay.weixin.qq.com/doc/v3/merchant/4012791903" target="_blank">查看文档</a>
-                                <a class="btn btn-link btn-sm" asp-page="/WeChatPay/Payments/Refund">去调试</a>
-                            </div>
-                        </li>
-                        <li class="list-group-item d-flex justify-content-between align-items-center">
-                            查询单笔退款(通过商户退款单号)
-                            <div class="btn-group">
-                                <a class="btn btn-link btn-sm" href="https://pay.weixin.qq.com/doc/v3/merchant/4012791904" target="_blank">查看文档</a>
-                                <a class="btn btn-link btn-sm" asp-page="/WeChatPay/Payments/RefundQueryByOutRefundNo">去调试</a>
-                            </div>
-                        </li>
-                        <li class="list-group-item d-flex justify-content-between align-items-center">
-                            发起异常退款
-                            <div class="btn-group">
-                                <a class="btn btn-link btn-sm" href="https://pay.weixin.qq.com/doc/v3/merchant/4012791905" target="_blank">查看文档</a>
-                                <a class="btn btn-link btn-sm" asp-page="/WeChatPay/Payments/AbnormalRefund">去调试</a>
-                            </div>
-                        </li>
-                        <li class="list-group-item d-flex justify-content-between align-items-center">
-                            退款结果回调通知
-                            <div class="btn-group">
-                                <a class="btn btn-link btn-sm" href="https://pay.weixin.qq.com/doc/v3/merchant/4012791906" target="_blank">查看文档</a>
-                                <a class="btn btn-link btn-sm disabled" href="#">去调试</a>
-                            </div>
-                        </li>
-                        <li class="list-group-item d-flex justify-content-between align-items-center">
-                            申请交易账单
-                            <div class="btn-group">
-                                <a class="btn btn-link btn-sm" href="https://pay.weixin.qq.com/doc/v3/merchant/4012791907" target="_blank">查看文档</a>
-                                <a class="btn btn-link btn-sm" asp-page="/WeChatPay/Payments/TradeBill">去调试</a>
-                            </div>
-                        </li>
-                        <li class="list-group-item d-flex justify-content-between align-items-center">
-                            申请资金账单
-                            <div class="btn-group">
-                                <a class="btn btn-link btn-sm" href="https://pay.weixin.qq.com/doc/v3/merchant/4012791908" target="_blank">查看文档</a>
-                                <a class="btn btn-link btn-sm" asp-page="/WeChatPay/Payments/FundFlowBill">去调试</a>
-                            </div>
-                        </li>
-                        <li class="list-group-item d-flex justify-content-between align-items-center">
-                            下载账单
-                            <div class="btn-group">
-                                <a class="btn btn-link btn-sm" href="https://pay.weixin.qq.com/doc/v3/merchant/4012791909" target="_blank">查看文档</a>
-                                <a class="btn btn-link btn-sm" asp-page="/WeChatPay/Payments/DownloadBill">去调试</a>
-                            </div>
-                        </li>
-                    </ul>
-                </div>
-            </div>
-        </div>
-        <div class="accordion-item">
-            <h2 class="accordion-header">
-                <button class="accordion-button collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#collapseCodePay" aria-expanded="false" aria-controls="collapseCodePay">
-                    付款码支付
-                </button>
-            </h2>
-            <div id="collapseCodePay" class="accordion-collapse collapse" data-bs-parent="#accordionPayments">
-                <div class="accordion-body">
-                    <ul class="list-group">
-                        <li class="list-group-item d-flex justify-content-between align-items-center">
-                            付款码支付
-                            <div class="btn-group">
-                                <a class="btn btn-link btn-sm" href="https://pay.weixin.qq.com/doc/v3/merchant/4012382150" target="_blank">查看文档</a>
-                                <a class="btn btn-link btn-sm" asp-page="/WeChatPay/Payments/CodePay">去调试</a>
-                            </div>
-                        </li>
-                        <li class="list-group-item d-flex justify-content-between align-items-center">
-                            撤销
-                            <div class="btn-group">
-                                <a class="btn btn-link btn-sm" href="https://pay.weixin.qq.com/doc/v3/merchant/4012382161" target="_blank">查看文档</a>
-                                <a class="btn btn-link btn-sm" asp-page="/WeChatPay/Payments/Reverse">去调试</a>
-                            </div>
-                        </li>
-                    </ul>
-                </div>
-            </div>
-        </div>
-        <div class="accordion-item">
-            <h2 class="accordion-header">
-                <button class="accordion-button collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#collapseCombinePay" aria-expanded="false" aria-controls="collapseCombinePay">
-                    合单支付
-                </button>
-            </h2>
-            <div id="collapseCombinePay" class="accordion-collapse collapse" data-bs-parent="#accordionPayments">
-                <div class="accordion-body">
-                    <div class="accordion" id="accordionCombinePay">
-                        <div class="accordion-item">
-                            <h2 class="accordion-header">
-                                <button class="accordion-button collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#collapseCombineAppPay" aria-expanded="false" aria-controls="collapseAppPay">
-                                    APP合单支付
-                                </button>
-                            </h2>
-                            <div id="collapseCombineAppPay" class="accordion-collapse collapse" data-bs-parent="#accordionCombineAppPay">
-                                <div class="accordion-body">
-                                    <ul class="list-group">
-                                        <li class="list-group-item d-flex justify-content-between align-items-center">
-                                            App合单下单
-                                            <div class="btn-group">
-                                                <a class="btn btn-link btn-sm" href="https://pay.weixin.qq.com/doc/v3/merchant/4012556944" target="_blank">查看文档</a>
-                                                <a class="btn btn-link btn-sm disabled" href="#">去调试</a>
-                                            </div>
-                                        </li>
-                                        <li class="list-group-item d-flex justify-content-between align-items-center">
-                                            APP调起支付
-                                            <div class="btn-group">
-                                                <a class="btn btn-link btn-sm" href="https://pay.weixin.qq.com/doc/v3/merchant/4012266043" target="_blank">查看文档</a>
-                                                <a class="btn btn-link btn-sm disabled" href="#">去调试</a>
-                                            </div>
-                                        </li>
-                                        <li class="list-group-item d-flex justify-content-between align-items-center">
-                                            查询合单订单
-                                            <div class="btn-group">
-                                                <a class="btn btn-link btn-sm" href="https://pay.weixin.qq.com/doc/v3/merchant/4012557006" target="_blank">查看文档</a>
-                                                <a class="btn btn-link btn-sm disabled" href="#">去调试</a>
-                                            </div>
-                                        </li>
-                                        <li class="list-group-item d-flex justify-content-between align-items-center">
-                                            关闭合单订单
-                                            <div class="btn-group">
-                                                <a class="btn btn-link btn-sm" href="https://pay.weixin.qq.com/doc/v3/merchant/4012577452" target="_blank">查看文档</a>
-                                                <a class="btn btn-link btn-sm disabled" href="#">去调试</a>
-                                            </div>
-                                        </li>
-                                        <li class="list-group-item d-flex justify-content-between align-items-center">
-                                            合单订单支付成功回调通知
-                                            <div class="btn-group">
-                                                <a class="btn btn-link btn-sm" href="https://pay.weixin.qq.com/doc/v3/merchant/4012158598" target="_blank">查看文档</a>
-                                                <a class="btn btn-link btn-sm disabled" href="#">去调试</a>
-                                            </div>
-                                        </li>
-                                        <li class="list-group-item d-flex justify-content-between align-items-center">
-                                            退款申请
-                                            <div class="btn-group">
-                                                <a class="btn btn-link btn-sm" href="https://pay.weixin.qq.com/doc/v3/merchant/4012556524" target="_blank">查看文档</a>
-                                                <a class="btn btn-link btn-sm" asp-page="/WeChatPay/Payments/Refund">去调试</a>
-                                            </div>
-                                        </li>
-                                        <li class="list-group-item d-flex justify-content-between align-items-center">
-                                            查询单笔退款(通过商户退款单号)
-                                            <div class="btn-group">
-                                                <a class="btn btn-link btn-sm" href="https://pay.weixin.qq.com/doc/v3/merchant/4012556587" target="_blank">查看文档</a>
-                                                <a class="btn btn-link btn-sm" asp-page="/WeChatPay/Payments/RefundQueryByOutRefundNo">去调试</a>
-                                            </div>
-                                        </li>
-                                        <li class="list-group-item d-flex justify-content-between align-items-center">
-                                            发起异常退款
-                                            <div class="btn-group">
-                                                <a class="btn btn-link btn-sm" href="https://pay.weixin.qq.com/doc/v3/merchant/4013420988" target="_blank">查看文档</a>
-                                                <a class="btn btn-link btn-sm" asp-page="/WeChatPay/Payments/AbnormalRefund">去调试</a>
-                                            </div>
-                                        </li>
-                                        <li class="list-group-item d-flex justify-content-between align-items-center">
-                                            退款结果通知
-                                            <div class="btn-group">
-                                                <a class="btn btn-link btn-sm" href="https://pay.weixin.qq.com/doc/v3/merchant/4012085921" target="_blank">查看文档</a>
-                                                <a class="btn btn-link btn-sm disabled" href="#">去调试</a>
-                                            </div>
-                                        </li>
-                                        <li class="list-group-item d-flex justify-content-between align-items-center">
-                                            申请交易账单
-                                            <div class="btn-group">
-                                                <a class="btn btn-link btn-sm" href="https://pay.weixin.qq.com/doc/v3/merchant/4012556692" target="_blank">查看文档</a>
-                                                <a class="btn btn-link btn-sm" asp-page="/WeChatPay/Payments/TradeBill">去调试</a>
-                                            </div>
-                                        </li>
-                                        <li class="list-group-item d-flex justify-content-between align-items-center">
-                                            申请资金账单
-                                            <div class="btn-group">
-                                                <a class="btn btn-link btn-sm" href="https://pay.weixin.qq.com/doc/v3/merchant/4012556748" target="_blank">查看文档</a>
-                                                <a class="btn btn-link btn-sm" asp-page="/WeChatPay/Payments/FundFlowBill">去调试</a>
-                                            </div>
-                                        </li>
-                                        <li class="list-group-item d-flex justify-content-between align-items-center">
-                                            下载账单
-                                            <div class="btn-group">
-                                                <a class="btn btn-link btn-sm" href="https://pay.weixin.qq.com/doc/v3/merchant/4012085923" target="_blank">查看文档</a>
-                                                <a class="btn btn-link btn-sm" asp-page="/WeChatPay/Payments/DownloadBill">去调试</a>
-                                            </div>
-                                        </li>
-                                    </ul>
-                                </div>
-                            </div>
-                        </div>
-                        <div class="accordion-item">
-                            <h2 class="accordion-header">
-                                <button class="accordion-button collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#collapseCombineH5Pay" aria-expanded="false" aria-controls="collapseAppPay">
-                                    H5合单支付
-                                </button>
-                            </h2>
-                            <div id="collapseCombineH5Pay" class="accordion-collapse collapse" data-bs-parent="#accordionCombineH5Pay">
-                                <div class="accordion-body">
-                                    <ul class="list-group">
-                                        <li class="list-group-item d-flex justify-content-between align-items-center">
-                                            H5合单下单
-                                            <div class="btn-group">
-                                                <a class="btn btn-link btn-sm" href="https://pay.weixin.qq.com/doc/v3/merchant/4012556961" target="_blank">查看文档</a>
-                                                <a class="btn btn-link btn-sm disabled" href="#">去调试</a>
-                                            </div>
-                                        </li>
-                                        <li class="list-group-item d-flex justify-content-between align-items-center">
-                                            H5调起支付
-                                            <div class="btn-group">
-                                                <a class="btn btn-link btn-sm" href="https://pay.weixin.qq.com/doc/v3/merchant/4012266131" target="_blank">查看文档</a>
-                                                <a class="btn btn-link btn-sm disabled" href="#">去调试</a>
-                                            </div>
-                                        </li>
-                                        <li class="list-group-item d-flex justify-content-between align-items-center">
-                                            查询合单订单
-                                            <div class="btn-group">
-                                                <a class="btn btn-link btn-sm" href="https://pay.weixin.qq.com/doc/v3/merchant/4013421126" target="_blank">查看文档</a>
-                                                <a class="btn btn-link btn-sm disabled" href="#">去调试</a>
-                                            </div>
-                                        </li>
-                                        <li class="list-group-item d-flex justify-content-between align-items-center">
-                                            关闭合单订单
-                                            <div class="btn-group">
-                                                <a class="btn btn-link btn-sm" href="https://pay.weixin.qq.com/doc/v3/merchant/4013421130" target="_blank">查看文档</a>
-                                                <a class="btn btn-link btn-sm disabled" href="#">去调试</a>
-                                            </div>
-                                        </li>
-                                        <li class="list-group-item d-flex justify-content-between align-items-center">
-                                            合单订单支付成功回调通知
-                                            <div class="btn-group">
-                                                <a class="btn btn-link btn-sm" href="https://pay.weixin.qq.com/doc/v3/merchant/4013421143" target="_blank">查看文档</a>
-                                                <a class="btn btn-link btn-sm disabled" href="#">去调试</a>
-                                            </div>
-                                        </li>
-                                        <li class="list-group-item d-flex justify-content-between align-items-center">
-                                            退款申请
-                                            <div class="btn-group">
-                                                <a class="btn btn-link btn-sm" href="https://pay.weixin.qq.com/doc/v3/merchant/4013421148" target="_blank">查看文档</a>
-                                                <a class="btn btn-link btn-sm" asp-page="/WeChatPay/Payments/Refund">去调试</a>
-                                            </div>
-                                        </li>
-                                        <li class="list-group-item d-flex justify-content-between align-items-center">
-                                            查询单笔退款(通过商户退款单号)
-                                            <div class="btn-group">
-                                                <a class="btn btn-link btn-sm" href="https://pay.weixin.qq.com/doc/v3/merchant/4013421156" target="_blank">查看文档</a>
-                                                <a class="btn btn-link btn-sm" asp-page="/WeChatPay/Payments/RefundQueryByOutRefundNo">去调试</a>
-                                            </div>
-                                        </li>
-                                        <li class="list-group-item d-flex justify-content-between align-items-center">
-                                            发起异常退款
-                                            <div class="btn-group">
-                                                <a class="btn btn-link btn-sm" href="https://pay.weixin.qq.com/doc/v3/merchant/4013421164" target="_blank">查看文档</a>
-                                                <a class="btn btn-link btn-sm" asp-page="/WeChatPay/Payments/AbnormalRefund">去调试</a>
-                                            </div>
-                                        </li>
-                                        <li class="list-group-item d-flex justify-content-between align-items-center">
-                                            退款结果通知
-                                            <div class="btn-group">
-                                                <a class="btn btn-link btn-sm" href="https://pay.weixin.qq.com/doc/v3/merchant/4013421172" target="_blank">查看文档</a>
-                                                <a class="btn btn-link btn-sm disabled" href="#">去调试</a>
-                                            </div>
-                                        </li>
-                                        <li class="list-group-item d-flex justify-content-between align-items-center">
-                                            申请交易账单
-                                            <div class="btn-group">
-                                                <a class="btn btn-link btn-sm" href="https://pay.weixin.qq.com/doc/v3/merchant/4013421176" target="_blank">查看文档</a>
-                                                <a class="btn btn-link btn-sm" asp-page="/WeChatPay/Payments/TradeBill">去调试</a>
-                                            </div>
-                                        </li>
-                                        <li class="list-group-item d-flex justify-content-between align-items-center">
-                                            申请资金账单
-                                            <div class="btn-group">
-                                                <a class="btn btn-link btn-sm" href="https://pay.weixin.qq.com/doc/v3/merchant/4013421185" target="_blank">查看文档</a>
-                                                <a class="btn btn-link btn-sm" asp-page="/WeChatPay/Payments/FundFlowBill">去调试</a>
-                                            </div>
-                                        </li>
-                                        <li class="list-group-item d-flex justify-content-between align-items-center">
-                                            下载账单
-                                            <div class="btn-group">
-                                                <a class="btn btn-link btn-sm" href="https://pay.weixin.qq.com/doc/v3/merchant/4013421189" target="_blank">查看文档</a>
-                                                <a class="btn btn-link btn-sm" asp-page="/WeChatPay/Payments/DownloadBill">去调试</a>
-                                            </div>
-                                        </li>
-                                    </ul>
-                                </div>
-                            </div>
-                        </div>
-                        <div class="accordion-item">
-                            <h2 class="accordion-header">
-                                <button class="accordion-button collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#collapseCombineJsapiPay" aria-expanded="false" aria-controls="collapseAppPay">
-                                    JSAPI合单支付
-                                </button>
-                            </h2>
-                            <div id="collapseCombineJsapiPay" class="accordion-collapse collapse" data-bs-parent="#accordionCombineJsapiPay">
-                                <div class="accordion-body">
-                                    <ul class="list-group">
-                                        <li class="list-group-item d-flex justify-content-between align-items-center">
-                                            JSAPI合单下单
-                                            <div class="btn-group">
-                                                <a class="btn btn-link btn-sm" href="https://pay.weixin.qq.com/doc/v3/merchant/4012556926" target="_blank">查看文档</a>
-                                                <a class="btn btn-link btn-sm disabled" href="#">去调试</a>
-                                            </div>
-                                        </li>
-                                        <li class="list-group-item d-flex justify-content-between align-items-center">
-                                            JSAPI调起支付
-                                            <div class="btn-group">
-                                                <a class="btn btn-link btn-sm" href="https://pay.weixin.qq.com/doc/v3/merchant/4012266069" target="_blank">查看文档</a>
-                                                <a class="btn btn-link btn-sm disabled" href="#">去调试</a>
-                                            </div>
-                                        </li>
-                                        <li class="list-group-item d-flex justify-content-between align-items-center">
-                                            查询合单订单
-                                            <div class="btn-group">
-                                                <a class="btn btn-link btn-sm" href="https://pay.weixin.qq.com/doc/v3/merchant/4013421222" target="_blank">查看文档</a>
-                                                <a class="btn btn-link btn-sm disabled" href="#">去调试</a>
-                                            </div>
-                                        </li>
-                                        <li class="list-group-item d-flex justify-content-between align-items-center">
-                                            关闭合单订单
-                                            <div class="btn-group">
-                                                <a class="btn btn-link btn-sm" href="https://pay.weixin.qq.com/doc/v3/merchant/4013421225" target="_blank">查看文档</a>
-                                                <a class="btn btn-link btn-sm disabled" href="#">去调试</a>
-                                            </div>
-                                        </li>
-                                        <li class="list-group-item d-flex justify-content-between align-items-center">
-                                            合单订单支付成功回调通知
-                                            <div class="btn-group">
-                                                <a class="btn btn-link btn-sm" href="https://pay.weixin.qq.com/doc/v3/merchant/4013421231" target="_blank">查看文档</a>
-                                                <a class="btn btn-link btn-sm disabled" href="#">去调试</a>
-                                            </div>
-                                        </li>
-                                        <li class="list-group-item d-flex justify-content-between align-items-center">
-                                            退款申请
-                                            <div class="btn-group">
-                                                <a class="btn btn-link btn-sm" href="https://pay.weixin.qq.com/doc/v3/merchant/4013421249" target="_blank">查看文档</a>
-                                                <a class="btn btn-link btn-sm" asp-page="/WeChatPay/Payments/Refund">去调试</a>
-                                            </div>
-                                        </li>
-                                        <li class="list-group-item d-flex justify-content-between align-items-center">
-                                            查询单笔退款(通过商户退款单号)
-                                            <div class="btn-group">
-                                                <a class="btn btn-link btn-sm" href="https://pay.weixin.qq.com/doc/v3/merchant/4013421261" target="_blank">查看文档</a>
-                                                <a class="btn btn-link btn-sm" asp-page="/WeChatPay/Payments/RefundQueryByOutRefundNo">去调试</a>
-                                            </div>
-                                        </li>
-                                        <li class="list-group-item d-flex justify-content-between align-items-center">
-                                            发起异常退款
-                                            <div class="btn-group">
-                                                <a class="btn btn-link btn-sm" href="https://pay.weixin.qq.com/doc/v3/merchant/4013421269" target="_blank">查看文档</a>
-                                                <a class="btn btn-link btn-sm" asp-page="/WeChatPay/Payments/AbnormalRefund">去调试</a>
-                                            </div>
-                                        </li>
-                                        <li class="list-group-item d-flex justify-content-between align-items-center">
-                                            退款结果通知
-                                            <div class="btn-group">
-                                                <a class="btn btn-link btn-sm" href="https://pay.weixin.qq.com/doc/v3/merchant/4013421273" target="_blank">查看文档</a>
-                                                <a class="btn btn-link btn-sm disabled" href="#">去调试</a>
-                                            </div>
-                                        </li>
-                                        <li class="list-group-item d-flex justify-content-between align-items-center">
-                                            申请交易账单
-                                            <div class="btn-group">
-                                                <a class="btn btn-link btn-sm" href="https://pay.weixin.qq.com/doc/v3/merchant/4013421277" target="_blank">查看文档</a>
-                                                <a class="btn btn-link btn-sm" asp-page="/WeChatPay/Payments/TradeBill">去调试</a>
-                                            </div>
-                                        </li>
-                                        <li class="list-group-item d-flex justify-content-between align-items-center">
-                                            申请资金账单
-                                            <div class="btn-group">
-                                                <a class="btn btn-link btn-sm" href="https://pay.weixin.qq.com/doc/v3/merchant/4013421284" target="_blank">查看文档</a>
-                                                <a class="btn btn-link btn-sm" asp-page="/WeChatPay/Payments/FundFlowBill">去调试</a>
-                                            </div>
-                                        </li>
-                                        <li class="list-group-item d-flex justify-content-between align-items-center">
-                                            下载账单
-                                            <div class="btn-group">
-                                                <a class="btn btn-link btn-sm" href="https://pay.weixin.qq.com/doc/v3/merchant/4013421294" target="_blank">查看文档</a>
-                                                <a class="btn btn-link btn-sm" asp-page="/WeChatPay/Payments/DownloadBill">去调试</a>
-                                            </div>
-                                        </li>
-                                    </ul>
-                                </div>
-                            </div>
-                        </div>
-                        <div class="accordion-item">
-                            <h2 class="accordion-header">
-                                <button class="accordion-button collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#collapseCombineNativePay" aria-expanded="false" aria-controls="collapseAppPay">
-                                    Native合单支付
-                                </button>
-                            </h2>
-                            <div id="collapseCombineNativePay" class="accordion-collapse collapse" data-bs-parent="#accordionCombineNativePay">
-                                <div class="accordion-body">
-                                    <ul class="list-group">
-                                        <li class="list-group-item d-flex justify-content-between align-items-center">
-                                            Native合单下单
-                                            <div class="btn-group">
-                                                <a class="btn btn-link btn-sm" href="https://pay.weixin.qq.com/doc/v3/merchant/4012556982" target="_blank">查看文档</a>
-                                                <a class="btn btn-link btn-sm disabled" href="#">去调试</a>
-                                            </div>
-                                        </li>
-                                        <li class="list-group-item d-flex justify-content-between align-items-center">
-                                            Native调起支付
-                                            <div class="btn-group">
-                                                <a class="btn btn-link btn-sm" href="https://pay.weixin.qq.com/doc/v3/merchant/4012266088" target="_blank">查看文档</a>
-                                                <a class="btn btn-link btn-sm disabled" href="#">去调试</a>
-                                            </div>
-                                        </li>
-                                        <li class="list-group-item d-flex justify-content-between align-items-center">
-                                            查询合单订单
-                                            <div class="btn-group">
-                                                <a class="btn btn-link btn-sm" href="https://pay.weixin.qq.com/doc/v3/merchant/4013421316" target="_blank">查看文档</a>
-                                                <a class="btn btn-link btn-sm disabled" href="#">去调试</a>
-                                            </div>
-                                        </li>
-                                        <li class="list-group-item d-flex justify-content-between align-items-center">
-                                            关闭合单订单
-                                            <div class="btn-group">
-                                                <a class="btn btn-link btn-sm" href="https://pay.weixin.qq.com/doc/v3/merchant/4013421330" target="_blank">查看文档</a>
-                                                <a class="btn btn-link btn-sm disabled" href="#">去调试</a>
-                                            </div>
-                                        </li>
-                                        <li class="list-group-item d-flex justify-content-between align-items-center">
-                                            合单订单支付成功回调通知
-                                            <div class="btn-group">
-                                                <a class="btn btn-link btn-sm" href="https://pay.weixin.qq.com/doc/v3/merchant/4013421336" target="_blank">查看文档</a>
-                                                <a class="btn btn-link btn-sm disabled" href="#">去调试</a>
-                                            </div>
-                                        </li>
-                                        <li class="list-group-item d-flex justify-content-between align-items-center">
-                                            退款申请
-                                            <div class="btn-group">
-                                                <a class="btn btn-link btn-sm" href="https://pay.weixin.qq.com/doc/v3/merchant/4013421340" target="_blank">查看文档</a>
-                                                <a class="btn btn-link btn-sm" asp-page="/WeChatPay/Payments/Refund">去调试</a>
-                                            </div>
-                                        </li>
-                                        <li class="list-group-item d-flex justify-content-between align-items-center">
-                                            查询单笔退款(通过商户退款单号)
-                                            <div class="btn-group">
-                                                <a class="btn btn-link btn-sm" href="https://pay.weixin.qq.com/doc/v3/merchant/4013421346" target="_blank">查看文档</a>
-                                                <a class="btn btn-link btn-sm" asp-page="/WeChatPay/Payments/RefundQueryByOutRefundNo">去调试</a>
-                                            </div>
-                                        </li>
-                                        <li class="list-group-item d-flex justify-content-between align-items-center">
-                                            发起异常退款
-                                            <div class="btn-group">
-                                                <a class="btn btn-link btn-sm" href="https://pay.weixin.qq.com/doc/v3/merchant/4013421352" target="_blank">查看文档</a>
-                                                <a class="btn btn-link btn-sm" asp-page="/WeChatPay/Payments/AbnormalRefund">去调试</a>
-                                            </div>
-                                        </li>
-                                        <li class="list-group-item d-flex justify-content-between align-items-center">
-                                            退款结果通知
-                                            <div class="btn-group">
-                                                <a class="btn btn-link btn-sm" href="https://pay.weixin.qq.com/doc/v3/merchant/4013421356" target="_blank">查看文档</a>
-                                                <a class="btn btn-link btn-sm disabled" href="#">去调试</a>
-                                            </div>
-                                        </li>
-                                        <li class="list-group-item d-flex justify-content-between align-items-center">
-                                            申请交易账单
-                                            <div class="btn-group">
-                                                <a class="btn btn-link btn-sm" href="https://pay.weixin.qq.com/doc/v3/merchant/4013421361" target="_blank">查看文档</a>
-                                                <a class="btn btn-link btn-sm" asp-page="/WeChatPay/Payments/TradeBill">去调试</a>
-                                            </div>
-                                        </li>
-                                        <li class="list-group-item d-flex justify-content-between align-items-center">
-                                            申请资金账单
-                                            <div class="btn-group">
-                                                <a class="btn btn-link btn-sm" href="https://pay.weixin.qq.com/doc/v3/merchant/4013421365" target="_blank">查看文档</a>
-                                                <a class="btn btn-link btn-sm" asp-page="/WeChatPay/Payments/FundFlowBill">去调试</a>
-                                            </div>
-                                        </li>
-                                        <li class="list-group-item d-flex justify-content-between align-items-center">
-                                            下载账单
-                                            <div class="btn-group">
-                                                <a class="btn btn-link btn-sm" href="https://pay.weixin.qq.com/doc/v3/merchant/4013421368" target="_blank">查看文档</a>
-                                                <a class="btn btn-link btn-sm" asp-page="/WeChatPay/Payments/DownloadBill">去调试</a>
-                                            </div>
-                                        </li>
-                                    </ul>
-                                </div>
-                            </div>
-                        </div>
-                        <div class="accordion-item">
-                            <h2 class="accordion-header">
-                                <button class="accordion-button collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#collapseCombineMiniProgramPay" aria-expanded="false" aria-controls="collapseAppPay">
-                                    小程序合单支付
-                                </button>
-                            </h2>
-                            <div id="collapseCombineMiniProgramPay" class="accordion-collapse collapse" data-bs-parent="#accordionCombineMiniProgramPay">
-                                <div class="accordion-body">
-                                    <ul class="list-group">
-                                        <li class="list-group-item d-flex justify-content-between align-items-center">
-                                            小程序合单下单
-                                            <div class="btn-group">
-                                                <a class="btn btn-link btn-sm" href="https://pay.weixin.qq.com/doc/v3/merchant/4012556931" target="_blank">查看文档</a>
-                                                <a class="btn btn-link btn-sm disabled" href="#">去调试</a>
-                                            </div>
-                                        </li>
-                                        <li class="list-group-item d-flex justify-content-between align-items-center">
-                                            小程序调起支付
-                                            <div class="btn-group">
-                                                <a class="btn btn-link btn-sm" href="https://pay.weixin.qq.com/doc/v3/merchant/4012266109" target="_blank">查看文档</a>
-                                                <a class="btn btn-link btn-sm disabled" href="#">去调试</a>
-                                            </div>
-                                        </li>
-                                        <li class="list-group-item d-flex justify-content-between align-items-center">
-                                            查询合单订单
-                                            <div class="btn-group">
-                                                <a class="btn btn-link btn-sm" href="https://pay.weixin.qq.com/doc/v3/merchant/4013421401" target="_blank">查看文档</a>
-                                                <a class="btn btn-link btn-sm disabled" href="#">去调试</a>
-                                            </div>
-                                        </li>
-                                        <li class="list-group-item d-flex justify-content-between align-items-center">
-                                            关闭合单订单
-                                            <div class="btn-group">
-                                                <a class="btn btn-link btn-sm" href="https://pay.weixin.qq.com/doc/v3/merchant/4013421404" target="_blank">查看文档</a>
-                                                <a class="btn btn-link btn-sm disabled" href="#">去调试</a>
-                                            </div>
-                                        </li>
-                                        <li class="list-group-item d-flex justify-content-between align-items-center">
-                                            合单订单支付成功回调通知
-                                            <div class="btn-group">
-                                                <a class="btn btn-link btn-sm" href="https://pay.weixin.qq.com/doc/v3/merchant/4013421407" target="_blank">查看文档</a>
-                                                <a class="btn btn-link btn-sm disabled" href="#">去调试</a>
-                                            </div>
-                                        </li>
-                                        <li class="list-group-item d-flex justify-content-between align-items-center">
-                                            退款申请
-                                            <div class="btn-group">
-                                                <a class="btn btn-link btn-sm" href="https://pay.weixin.qq.com/doc/v3/merchant/4013421410" target="_blank">查看文档</a>
-                                                <a class="btn btn-link btn-sm" asp-page="/WeChatPay/Payments/Refund">去调试</a>
-                                            </div>
-                                        </li>
-                                        <li class="list-group-item d-flex justify-content-between align-items-center">
-                                            查询单笔退款(通过商户退款单号)
-                                            <div class="btn-group">
-                                                <a class="btn btn-link btn-sm" href="https://pay.weixin.qq.com/doc/v3/merchant/4013421421" target="_blank">查看文档</a>
-                                                <a class="btn btn-link btn-sm" asp-page="/WeChatPay/Payments/RefundQueryByOutRefundNo">去调试</a>
-                                            </div>
-                                        </li>
-                                        <li class="list-group-item d-flex justify-content-between align-items-center">
-                                            发起异常退款
-                                            <div class="btn-group">
-                                                <a class="btn btn-link btn-sm" href="https://pay.weixin.qq.com/doc/v3/merchant/4013421429" target="_blank">查看文档</a>
-                                                <a class="btn btn-link btn-sm" asp-page="/WeChatPay/Payments/AbnormalRefund">去调试</a>
-                                            </div>
-                                        </li>
-                                        <li class="list-group-item d-flex justify-content-between align-items-center">
-                                            退款结果通知
-                                            <div class="btn-group">
-                                                <a class="btn btn-link btn-sm" href="https://pay.weixin.qq.com/doc/v3/merchant/4013421448" target="_blank">查看文档</a>
-                                                <a class="btn btn-link btn-sm disabled" href="#">去调试</a>
-                                            </div>
-                                        </li>
-                                        <li class="list-group-item d-flex justify-content-between align-items-center">
-                                            申请交易账单
-                                            <div class="btn-group">
-                                                <a class="btn btn-link btn-sm" href="https://pay.weixin.qq.com/doc/v3/merchant/4013421450" target="_blank">查看文档</a>
-                                                <a class="btn btn-link btn-sm" asp-page="/WeChatPay/Payments/TradeBill">去调试</a>
-                                            </div>
-                                        </li>
-                                        <li class="list-group-item d-flex justify-content-between align-items-center">
-                                            申请资金账单
-                                            <div class="btn-group">
-                                                <a class="btn btn-link btn-sm" href="https://pay.weixin.qq.com/doc/v3/merchant/4013421456" target="_blank">查看文档</a>
-                                                <a class="btn btn-link btn-sm" asp-page="/WeChatPay/Payments/FundFlowBill">去调试</a>
-                                            </div>
-                                        </li>
-                                        <li class="list-group-item d-flex justify-content-between align-items-center">
-                                            下载账单
-                                            <div class="btn-group">
-                                                <a class="btn btn-link btn-sm" href="https://pay.weixin.qq.com/doc/v3/merchant/4013421461" target="_blank">查看文档</a>
-                                                <a class="btn btn-link btn-sm" asp-page="/WeChatPay/Payments/DownloadBill">去调试</a>
-                                            </div>
-                                        </li>
-                                    </ul>
-                                </div>
-                            </div>
-                        </div>
-                    </div>
-                </div>
-            </div>
-        </div>
-        <div class="accordion-item">
-            <h2 class="accordion-header">
-                <button class="accordion-button collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#collapseRefund" aria-expanded="false" aria-controls="collapseRefund">
-                    订单退款
-                </button>
-            </h2>
-            <div id="collapseRefund" class="accordion-collapse collapse" data-bs-parent="#accordionPayments">
-                <div class="accordion-body">
-                    <ul class="list-group">
-                        <li class="list-group-item d-flex justify-content-between align-items-center">
-                            退款申请
-                            <div class="btn-group">
-                                <a class="btn btn-link btn-sm" href="https://pay.weixin.qq.com/doc/v3/merchant/4013071036" target="_blank">查看文档</a>
-                                <a class="btn btn-link btn-sm" asp-page="/WeChatPay/Payments/Refund">去调试</a>
-                            </div>
-                        </li>
-                        <li class="list-group-item d-flex justify-content-between align-items-center">
-                            查询单笔退款(通过商户退款单号)
-                            <div class="btn-group">
-                                <a class="btn btn-link btn-sm" href="https://pay.weixin.qq.com/doc/v3/merchant/4013071041" target="_blank">查看文档</a>
-                                <a class="btn btn-link btn-sm" asp-page="/WeChatPay/Payments/RefundQueryByOutRefundNo">去调试</a>
-                            </div>
-                        </li>
-                        <li class="list-group-item d-flex justify-content-between align-items-center">
-                            发起异常退款
-                            <div class="btn-group">
-                                <a class="btn btn-link btn-sm" href="https://pay.weixin.qq.com/doc/v3/merchant/4013071193" target="_blank">查看文档</a>
-                                <a class="btn btn-link btn-sm" asp-page="/WeChatPay/Payments/AbnormalRefund">去调试</a>
-                            </div>
-                        </li>
-                        <li class="list-group-item d-flex justify-content-between align-items-center">
-                            退款结果通知
-                            <div class="btn-group">
-                                <a class="btn btn-link btn-sm" href="https://pay.weixin.qq.com/doc/v3/merchant/4013071196" target="_blank">查看文档</a>
-                                <a class="btn btn-link btn-sm disabled" href="#">去调试</a>
-                            </div>
-                        </li>
-                    </ul>
-                </div>
-            </div>
-        </div>
-        <div class="accordion-item">
-            <h2 class="accordion-header">
-                <button class="accordion-button collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#collapseBill" aria-expanded="false" aria-controls="collapseBill">
-                    下载账单
-                </button>
-            </h2>
-            <div id="collapseBill" class="accordion-collapse collapse" data-bs-parent="#accordionPayments">
-                <div class="accordion-body">
-                    <ul class="list-group">
-                        <li class="list-group-item d-flex justify-content-between align-items-center">
-                            申请交易账单
-                            <div class="btn-group">
-                                <a class="btn btn-link btn-sm" href="https://pay.weixin.qq.com/doc/v3/merchant/4013071227" target="_blank">查看文档</a>
-                                <a class="btn btn-link btn-sm" asp-page="/WeChatPay/Payments/TradeBill">去调试</a>
-                            </div>
-                        </li>
-                        <li class="list-group-item d-flex justify-content-between align-items-center">
-                            申请资金账单
-                            <div class="btn-group">
-                                <a class="btn btn-link btn-sm" href="https://pay.weixin.qq.com/doc/v3/merchant/4013071235" target="_blank">查看文档</a>
-                                <a class="btn btn-link btn-sm" asp-page="/WeChatPay/Payments/FundFlowBill">去调试</a>
-                            </div>
-                        </li>
-                        <li class="list-group-item d-flex justify-content-between align-items-center">
-                            下载账单
-                            <div class="btn-group">
-                                <a class="btn btn-link btn-sm" href="https://pay.weixin.qq.com/doc/v3/merchant/4013071238" target="_blank">查看文档</a>
-                                <a class="btn btn-link btn-sm" asp-page="/WeChatPay/Payments/DownloadBill">去调试</a>
-                            </div>
-                        </li>
-                    </ul>
-                </div>
-            </div>
-        </div>
-    </div>
-</div>

+ 0 - 10
samples/Essensoft.Paylinks.Sample.Web/Pages/WeChatPay/Payments/Index.cshtml.cs

@@ -1,10 +0,0 @@
-using Microsoft.AspNetCore.Mvc.RazorPages;
-
-namespace Essensoft.Paylinks.Sample.Web.Pages.WeChatPay.Payments;
-
-public class IndexModel : PageModel
-{
-    public void OnGet()
-    {
-    }
-}

+ 0 - 76
samples/Essensoft.Paylinks.Sample.Web/Pages/WeChatPay/Payments/JsapiPrepay.cshtml

@@ -1,76 +0,0 @@
-@page
-@model JsapiPrepayModel
-@{
-    ViewData["Title"] = "JSAPI下单";
-}
-<nav aria-label="breadcrumb">
-    <ol class="breadcrumb">
-        <li class="breadcrumb-item">
-            <a asp-page="/Index">首页</a>
-        </li>
-        <li class="breadcrumb-item">
-            <a asp-page="/WeChatPay/Index">微信支付</a>
-        </li>
-        <li class="breadcrumb-item">
-            <a asp-page="/WeChatPay/Payments/Index">支付产品</a>
-        </li>
-        <li class="breadcrumb-item active" aria-current="page">@ViewData["Title"]</li>
-    </ol>
-</nav>
-<div class="card mb-3">
-    <div class="card-header">
-        @ViewData["Title"]
-    </div>
-    <div class="card-body">
-        <form method="post">
-            <div class="mb-3">
-                <label class="form-label" asp-for="Input.AppId"></label>
-                <input class="form-control" asp-for="Input.AppId"/>
-            </div>
-            <div class="mb-3">
-                <label class="form-label" asp-for="Input.MchId"></label>
-                <input class="form-control" asp-for="Input.MchId"/>
-            </div>
-            <div class="mb-3">
-                <label class="form-label" asp-for="Input.Description"></label>
-                <input class="form-control" asp-for="Input.Description"/>
-            </div>
-            <div class="mb-3">
-                <label class="form-label" asp-for="Input.OutTradeNo"></label>
-                <input class="form-control" asp-for="Input.OutTradeNo"/>
-            </div>
-            <div class="mb-3">
-                <label class="form-label" asp-for="Input.NotifyUrl"></label>
-                <input class="form-control" asp-for="Input.NotifyUrl"/>
-            </div>
-            <div class="mb-3">
-                <label class="form-label" asp-for="Input.Amount.Total"></label>
-                <input class="form-control" asp-for="Input.Amount.Total"/>
-            </div>
-            <div class="mb-3">
-                <label class="form-label" asp-for="Input.Payer.OpenId"></label>
-                <input class="form-control" asp-for="Input.Payer.OpenId"/>
-            </div>
-            <button class="btn btn-primary mb-3" type="submit">提交请求</button>
-        </form>
-        <hr/>
-        @if (ViewData["response"] is string response && !string.IsNullOrEmpty(response))
-        {
-            <div class="mb-3">
-                <label class="form-label">应答</label>
-                <textarea class="form-control" rows="10">@response</textarea>
-            </div>
-        }
-        @if (ViewData["parameter"] is string parameter && !string.IsNullOrEmpty(parameter))
-        {
-            <div class="mb-3">
-                <label class="form-label">JSAPI调起支付-请求参数</label>
-                <textarea class="form-control" rows="10">@parameter</textarea>
-            </div>
-        }
-    </div>
-</div>
-
-@section scripts {
-    @{ await Html.RenderPartialAsync("_ValidationScriptsPartial"); }
-}

+ 0 - 47
samples/Essensoft.Paylinks.Sample.Web/Pages/WeChatPay/Payments/JsapiPrepay.cshtml.cs

@@ -1,47 +0,0 @@
-using System.Text.Json;
-using Essensoft.Paylinks.WeChatPay.Client;
-using Essensoft.Paylinks.WeChatPay.Payments.Domain;
-using Essensoft.Paylinks.WeChatPay.Payments.Model;
-using Essensoft.Paylinks.WeChatPay.Payments.Request;
-using Microsoft.AspNetCore.Mvc;
-using Microsoft.AspNetCore.Mvc.RazorPages;
-using Microsoft.Extensions.Options;
-
-namespace Essensoft.Paylinks.Sample.Web.Pages.WeChatPay.Payments;
-
-public class JsapiPrepayModel(IWeChatPayClient client, IOptions<PaylinksOptions> options) : PageModel
-{
-    private readonly WeChatPayClientOptions _options = options.Value.WeChatPay;
-
-    [BindProperty]
-    public WeChatPayTransactionsJsapiBodyModel Input { get; set; }
-
-    public void OnGet()
-    {
-        Input = new WeChatPayTransactionsJsapiBodyModel
-        {
-            AppId = _options.AppId,
-            MchId = _options.MchId,
-            Description = "JSAPI下单测试",
-            OutTradeNo = DateTimeOffset.Now.ToString("yyyyMMddHHmmssfff"),
-            NotifyUrl = "https://www.domain.com/WeChatPay/Payments/Notify/TransactionSuccess",
-            Amount = new CommReqAmountInfo { Total = 1 },
-            Payer = new JsapiReqPayerInfo { OpenId = string.Empty }
-        };
-    }
-
-    public async Task OnPostAsync()
-    {
-        var request = new WeChatPayTransactionsJsapiRequest();
-        request.SetBodyModel(Input);
-        var response = await client.ExecuteAsync(request, _options);
-        ViewData["response"] = response.Body;
-
-        if (response.IsSuccessful)
-        {
-            var sdkRequest = new WeChatPayJsapiTransferPaymentRequest { AppId = Input.AppId, Package = "prepay_id=" + response.PrepayId };
-            var sdkResponse = await client.SdkExecuteAsync(sdkRequest, _options);
-            ViewData["parameter"] = JsonSerializer.Serialize(sdkResponse);
-        }
-    }
-}

+ 0 - 76
samples/Essensoft.Paylinks.Sample.Web/Pages/WeChatPay/Payments/NativePrepay.cshtml

@@ -1,76 +0,0 @@
-@page
-@model NativePrepayModel
-@{
-    ViewData["Title"] = "Native下单";
-}
-<nav aria-label="breadcrumb">
-    <ol class="breadcrumb">
-        <li class="breadcrumb-item">
-            <a asp-page="/Index">首页</a>
-        </li>
-        <li class="breadcrumb-item">
-            <a asp-page="/WeChatPay/Index">微信支付</a>
-        </li>
-        <li class="breadcrumb-item">
-            <a asp-page="/WeChatPay/Payments/Index">支付产品</a>
-        </li>
-        <li class="breadcrumb-item active" aria-current="page">@ViewData["Title"]</li>
-    </ol>
-</nav>
-<div class="card mb-3">
-    <div class="card-header">
-        @ViewData["Title"]
-    </div>
-    <div class="card-body">
-        <form method="post">
-            <div class="mb-3">
-                <label class="form-label" asp-for="Input.AppId"></label>
-                <input class="form-control" asp-for="Input.AppId"/>
-            </div>
-            <div class="mb-3">
-                <label class="form-label" asp-for="Input.MchId"></label>
-                <input class="form-control" asp-for="Input.MchId"/>
-            </div>
-            <div class="mb-3">
-                <label class="form-label" asp-for="Input.Description"></label>
-                <input class="form-control" asp-for="Input.Description"/>
-            </div>
-            <div class="mb-3">
-                <label class="form-label" asp-for="Input.OutTradeNo"></label>
-                <input class="form-control" asp-for="Input.OutTradeNo"/>
-            </div>
-            <div class="mb-3">
-                <label class="form-label" asp-for="Input.NotifyUrl"></label>
-                <input class="form-control" asp-for="Input.NotifyUrl"/>
-            </div>
-            <div class="mb-3">
-                <label class="form-label" asp-for="Input.Amount.Total"></label>
-                <input class="form-control" asp-for="Input.Amount.Total"/>
-            </div>
-            <button class="btn btn-primary mb-3" type="submit">提交请求</button>
-        </form>
-        <hr/>
-        @if (ViewData["code_url"] is string data && !string.IsNullOrEmpty(data))
-        {
-            using var qrGenerator = new QRCodeGenerator();
-            using var qrCodeData = qrGenerator.CreateQrCode(data, QRCodeGenerator.ECCLevel.Q);
-            using var base64ByteQrCode = new Base64QRCode(qrCodeData);
-            var base64Str = base64ByteQrCode.GetGraphic(20, Color.Black, Color.White, false, Base64QRCode.ImageType.Png);
-            <div class="mb-3">
-                <label class="form-label">二维码</label>
-                <embed src="data:image/png;base64,@base64Str" class="bg-light shadow-sm rounded d-block p-3 mb-5" type="image/png" width="180" height="180" />
-            </div>
-        }
-        @if (ViewData["response"] is string response && !string.IsNullOrEmpty(response))
-        {
-            <div class="mb-3">
-                <label class="form-label">应答</label>
-                <textarea class="form-control" rows="10">@response</textarea>
-            </div>
-        }
-    </div>
-</div>
-
-@section scripts {
-    @{ await Html.RenderPartialAsync("_ValidationScriptsPartial"); }
-}

+ 0 - 39
samples/Essensoft.Paylinks.Sample.Web/Pages/WeChatPay/Payments/NativePrepay.cshtml.cs

@@ -1,39 +0,0 @@
-using Essensoft.Paylinks.WeChatPay.Client;
-using Essensoft.Paylinks.WeChatPay.Payments.Domain;
-using Essensoft.Paylinks.WeChatPay.Payments.Model;
-using Essensoft.Paylinks.WeChatPay.Payments.Request;
-using Microsoft.AspNetCore.Mvc;
-using Microsoft.AspNetCore.Mvc.RazorPages;
-using Microsoft.Extensions.Options;
-
-namespace Essensoft.Paylinks.Sample.Web.Pages.WeChatPay.Payments;
-
-public class NativePrepayModel(IWeChatPayClient client, IOptions<PaylinksOptions> options) : PageModel
-{
-    private readonly WeChatPayClientOptions _options = options.Value.WeChatPay;
-
-    [BindProperty]
-    public WeChatPayTransactionsNativeBodyModel Input { get; set; }
-
-    public void OnGet()
-    {
-        Input = new WeChatPayTransactionsNativeBodyModel
-        {
-            AppId = _options.AppId,
-            MchId = _options.MchId,
-            Description = "Native下单测试",
-            OutTradeNo = DateTimeOffset.Now.ToString("yyyyMMddHHmmssfff"),
-            NotifyUrl = "https://www.domain.com/WeChatPay/Payments/Notify/TransactionSuccess",
-            Amount = new CommReqAmountInfo { Total = 1 }
-        };
-    }
-
-    public async Task OnPostAsync()
-    {
-        var request = new WeChatPayTransactionsNativeRequest();
-        request.SetBodyModel(Input);
-        var response = await client.ExecuteAsync(request, _options);
-        ViewData["code_url"] = response.CodeUrl;
-        ViewData["response"] = response.Body;
-    }
-}

+ 0 - 5
samples/Essensoft.Paylinks.Sample.Web/Pages/WeChatPay/Payments/Notify/RefundResult.cshtml

@@ -1,5 +0,0 @@
-@page
-@model RefundResultModel
-@{
-    Layout = null;
-}

+ 0 - 57
samples/Essensoft.Paylinks.Sample.Web/Pages/WeChatPay/Payments/Notify/RefundResult.cshtml.cs

@@ -1,57 +0,0 @@
-using Essensoft.Paylinks.WeChatPay.Client;
-using Essensoft.Paylinks.WeChatPay.Core;
-using Essensoft.Paylinks.WeChatPay.Mvc;
-using Essensoft.Paylinks.WeChatPay.Mvc.Extensions;
-using Essensoft.Paylinks.WeChatPay.Payments.Domain;
-using Essensoft.Paylinks.WeChatPay.Payments.Notify;
-using Microsoft.AspNetCore.Mvc;
-using Microsoft.AspNetCore.Mvc.RazorPages;
-using Microsoft.Extensions.Options;
-
-namespace Essensoft.Paylinks.Sample.Web.Pages.WeChatPay.Payments.Notify;
-
-[IgnoreAntiforgeryToken]
-public class RefundResultModel(ILogger<RefundResultModel> logger, IWeChatPayNotifyClient client, IOptions<PaylinksOptions> options) : PageModel
-{
-    private readonly WeChatPayClientOptions _options = options.Value.WeChatPay;
-
-    /// <summary>
-    /// 退款结果回调通知
-    /// https://pay.weixin.qq.com/doc/v3/merchant/4012791865
-    /// </summary>
-    public async Task<IActionResult> OnPostAsync()
-    {
-        try
-        {
-            var headers = await Request.GetWeChatPayHeadersAsync();
-            var body = await Request.GetWeChatPayBodyAsync();
-            var notify = await client.ExecuteAsync<WeChatPayRefundResultNotify>(headers, body, _options);
-            // 请务必检查系统内业务状态,避免因重复通知遭受损失。
-            switch (notify.RefundStatus)
-            {
-                case WeChatPayRefundStatus.Success:
-                    {
-                        logger.LogInformation($"退款成功通知: TransactionId:{notify.TransactionId}, TotalAmount:{notify.Amount.Total}");
-                    }
-                    break;
-                case WeChatPayRefundStatus.Closed:
-                    {
-                        logger.LogInformation($"退款关闭通知: TransactionId:{notify.TransactionId}, TotalAmount:{notify.Amount.Total}");
-                    }
-                    break;
-                case WeChatPayRefundStatus.Abnormal:
-                    {
-                        logger.LogInformation($"退款异常通知: TransactionId:{notify.TransactionId}, TotalAmount:{notify.Amount.Total}");
-                    }
-                    break;
-            }
-
-            return WeChatPayNotifyResult.Success;
-        }
-        catch (WeChatPayException ex)
-        {
-            logger.LogError(ex.Message);
-            return WeChatPayNotifyResult.Fail;
-        }
-    }
-}

+ 0 - 5
samples/Essensoft.Paylinks.Sample.Web/Pages/WeChatPay/Payments/Notify/TransactionSuccess.cshtml

@@ -1,5 +0,0 @@
-@page
-@model TransactionSuccessModel
-@{
-    Layout = null;
-}

+ 0 - 38
samples/Essensoft.Paylinks.Sample.Web/Pages/WeChatPay/Payments/Notify/TransactionSuccess.cshtml.cs

@@ -1,38 +0,0 @@
-using Essensoft.Paylinks.WeChatPay.Client;
-using Essensoft.Paylinks.WeChatPay.Core;
-using Essensoft.Paylinks.WeChatPay.Mvc;
-using Essensoft.Paylinks.WeChatPay.Mvc.Extensions;
-using Essensoft.Paylinks.WeChatPay.Payments.Notify;
-using Microsoft.AspNetCore.Mvc;
-using Microsoft.AspNetCore.Mvc.RazorPages;
-using Microsoft.Extensions.Options;
-
-namespace Essensoft.Paylinks.Sample.Web.Pages.WeChatPay.Payments.Notify;
-
-[IgnoreAntiforgeryToken]
-public class TransactionSuccessModel(ILogger<TransactionSuccessModel> logger, IWeChatPayNotifyClient client, IOptions<PaylinksOptions> options) : PageModel
-{
-    private readonly WeChatPayClientOptions _options = options.Value.WeChatPay;
-
-    /// <summary>
-    /// 支付成功回调通知
-    /// https://pay.weixin.qq.com/doc/v3/merchant/4012791861
-    /// </summary>
-    public async Task<IActionResult> OnPostAsync()
-    {
-        try
-        {
-            var headers = await Request.GetWeChatPayHeadersAsync();
-            var body = await Request.GetWeChatPayBodyAsync();
-            var notify = await client.ExecuteAsync<WeChatPayTransactionSuccessNotify>(headers, body, _options);
-            // 请务必检查系统内业务状态,避免因重复通知遭受损失。
-            logger.LogInformation($"支付成功通知: TransactionId:{notify.TransactionId}, TotalAmount:{notify.Amount.Total}");
-            return WeChatPayNotifyResult.Success;
-        }
-        catch (WeChatPayException ex)
-        {
-            logger.LogError(ex.Message);
-            return WeChatPayNotifyResult.Fail;
-        }
-    }
-}

+ 0 - 49
samples/Essensoft.Paylinks.Sample.Web/Pages/WeChatPay/Payments/QueryByOutTradeNo.cshtml

@@ -1,49 +0,0 @@
-@page
-@model QueryByOutTradeNoModel
-@{
-    ViewData["Title"] = "商户订单号查询订单";
-}
-<nav aria-label="breadcrumb">
-    <ol class="breadcrumb">
-        <li class="breadcrumb-item">
-            <a asp-page="/Index">首页</a>
-        </li>
-        <li class="breadcrumb-item">
-            <a asp-page="/WeChatPay/Index">微信支付</a>
-        </li>
-        <li class="breadcrumb-item">
-            <a asp-page="/WeChatPay/Payments/Index">支付产品</a>
-        </li>
-        <li class="breadcrumb-item active" aria-current="page">@ViewData["Title"]</li>
-    </ol>
-</nav>
-<div class="card mb-3">
-    <div class="card-header">
-        @ViewData["Title"]
-    </div>
-    <div class="card-body">
-        <form method="post">
-            <div class="mb-3">
-                <label class="form-label" asp-for="OutTradeNo"></label>
-                <input class="form-control" asp-for="OutTradeNo"/>
-            </div>
-            <div class="mb-3">
-                <label class="form-label" asp-for="Input.MchId"></label>
-                <input class="form-control" asp-for="Input.MchId"/>
-            </div>
-            <button class="btn btn-primary mb-3" type="submit">提交请求</button>
-        </form>
-        <hr/>
-        @if (ViewData["response"] is string response && !string.IsNullOrEmpty(response))
-        {
-            <div class="mb-3">
-                <label class="form-label">应答</label>
-                <textarea class="form-control" rows="10">@response</textarea>
-            </div>
-        }
-    </div>
-</div>
-
-@section scripts {
-    @{ await Html.RenderPartialAsync("_ValidationScriptsPartial"); }
-}

+ 0 - 32
samples/Essensoft.Paylinks.Sample.Web/Pages/WeChatPay/Payments/QueryByOutTradeNo.cshtml.cs

@@ -1,32 +0,0 @@
-using Essensoft.Paylinks.WeChatPay.Client;
-using Essensoft.Paylinks.WeChatPay.Payments.Model;
-using Essensoft.Paylinks.WeChatPay.Payments.Request;
-using Microsoft.AspNetCore.Mvc;
-using Microsoft.AspNetCore.Mvc.RazorPages;
-using Microsoft.Extensions.Options;
-
-namespace Essensoft.Paylinks.Sample.Web.Pages.WeChatPay.Payments;
-
-public class QueryByOutTradeNoModel(IWeChatPayClient client, IOptions<PaylinksOptions> options) : PageModel
-{
-    private readonly WeChatPayClientOptions _options = options.Value.WeChatPay;
-
-    [BindProperty]
-    public string OutTradeNo { get; set; }
-
-    [BindProperty]
-    public WeChatPayQueryByOutTradeNoQueryModel Input { get; set; }
-
-    public void OnGet()
-    {
-        Input = new WeChatPayQueryByOutTradeNoQueryModel { MchId = _options.MchId };
-    }
-
-    public async Task OnPostAsync()
-    {
-        var request = new WeChatPayQueryByOutTradeNoRequest { OutTradeNo = OutTradeNo };
-        request.SetQueryModel(Input);
-        var response = await client.ExecuteAsync(request, _options);
-        ViewData["response"] = response.Body;
-    }
-}

+ 0 - 49
samples/Essensoft.Paylinks.Sample.Web/Pages/WeChatPay/Payments/QueryByTransactionId.cshtml

@@ -1,49 +0,0 @@
-@page
-@model QueryByTransactionIdModel
-@{
-    ViewData["Title"] = "微信支付订单号查询订单";
-}
-<nav aria-label="breadcrumb">
-    <ol class="breadcrumb">
-        <li class="breadcrumb-item">
-            <a asp-page="/Index">首页</a>
-        </li>
-        <li class="breadcrumb-item">
-            <a asp-page="/WeChatPay/Index">微信支付</a>
-        </li>
-        <li class="breadcrumb-item">
-            <a asp-page="/WeChatPay/Payments/Index">支付产品</a>
-        </li>
-        <li class="breadcrumb-item active" aria-current="page">@ViewData["Title"]</li>
-    </ol>
-</nav>
-<div class="card mb-3">
-    <div class="card-header">
-        @ViewData["Title"]
-    </div>
-    <div class="card-body">
-        <form method="post">
-            <div class="mb-3">
-                <label class="form-label" asp-for="TransactionId"></label>
-                <input class="form-control" asp-for="TransactionId"/>
-            </div>
-            <div class="mb-3">
-                <label class="form-label" asp-for="Input.MchId"></label>
-                <input class="form-control" asp-for="Input.MchId"/>
-            </div>
-            <button class="btn btn-primary mb-3" type="submit">提交请求</button>
-        </form>
-        <hr/>
-        @if (ViewData["response"] is string response && !string.IsNullOrEmpty(response))
-        {
-            <div class="mb-3">
-                <label class="form-label">应答</label>
-                <textarea class="form-control" rows="10">@response</textarea>
-            </div>
-        }
-    </div>
-</div>
-
-@section scripts {
-    @{ await Html.RenderPartialAsync("_ValidationScriptsPartial"); }
-}

+ 0 - 32
samples/Essensoft.Paylinks.Sample.Web/Pages/WeChatPay/Payments/QueryByTransactionId.cshtml.cs

@@ -1,32 +0,0 @@
-using Essensoft.Paylinks.WeChatPay.Client;
-using Essensoft.Paylinks.WeChatPay.Payments.Model;
-using Essensoft.Paylinks.WeChatPay.Payments.Request;
-using Microsoft.AspNetCore.Mvc;
-using Microsoft.AspNetCore.Mvc.RazorPages;
-using Microsoft.Extensions.Options;
-
-namespace Essensoft.Paylinks.Sample.Web.Pages.WeChatPay.Payments;
-
-public class QueryByTransactionIdModel(IWeChatPayClient client, IOptions<PaylinksOptions> options) : PageModel
-{
-    private readonly WeChatPayClientOptions _options = options.Value.WeChatPay;
-
-    [BindProperty]
-    public string TransactionId { get; set; }
-
-    [BindProperty]
-    public WeChatPayQueryByTransactionIdQueryModel Input { get; set; }
-
-    public void OnGet()
-    {
-        Input = new WeChatPayQueryByTransactionIdQueryModel { MchId = _options.MchId };
-    }
-
-    public async Task OnPostAsync()
-    {
-        var request = new WeChatPayQueryByTransactionIdRequest { TransactionId = TransactionId };
-        request.SetQueryModel(Input);
-        var response = await client.ExecuteAsync(request, _options);
-        ViewData["response"] = response.Body;
-    }
-}

+ 0 - 69
samples/Essensoft.Paylinks.Sample.Web/Pages/WeChatPay/Payments/Refund.cshtml

@@ -1,69 +0,0 @@
-@page
-@model RefundModel
-@{
-    ViewData["Title"] = "退款申请";
-}
-<nav aria-label="breadcrumb">
-    <ol class="breadcrumb">
-        <li class="breadcrumb-item">
-            <a asp-page="/Index">首页</a>
-        </li>
-        <li class="breadcrumb-item">
-            <a asp-page="/WeChatPay/Index">微信支付</a>
-        </li>
-        <li class="breadcrumb-item">
-            <a asp-page="/WeChatPay/Payments/Index">支付产品</a>
-        </li>
-        <li class="breadcrumb-item active" aria-current="page">@ViewData["Title"]</li>
-    </ol>
-</nav>
-<div class="card mb-3">
-    <div class="card-header">
-        @ViewData["Title"]
-    </div>
-    <div class="card-body">
-        <form method="post">
-            <div class="mb-3">
-                <label class="form-label" asp-for="Input.TransactionId"></label>
-                <input class="form-control" asp-for="Input.TransactionId"/>
-            </div>
-            <div class="mb-3">
-                <label class="form-label" asp-for="Input.OutTradeNo"></label>
-                <input class="form-control" asp-for="Input.OutTradeNo"/>
-            </div>
-            <div class="mb-3">
-                <label class="form-label" asp-for="Input.OutRefundNo"></label>
-                <input class="form-control" asp-for="Input.OutRefundNo"/>
-            </div>
-            <div class="mb-3">
-                <label class="form-label" asp-for="Input.Amount.Refund"></label>
-                <input class="form-control" asp-for="Input.Amount.Refund"/>
-            </div>
-            <div class="mb-3">
-                <label class="form-label" asp-for="Input.Amount.Total"></label>
-                <input class="form-control" asp-for="Input.Amount.Total"/>
-            </div>
-            <div class="mb-3">
-                <label class="form-label" asp-for="Input.Amount.Currency"></label>
-                <input class="form-control" asp-for="Input.Amount.Currency"/>
-            </div>
-            <div class="mb-3">
-                <label class="form-label" asp-for="Input.NotifyUrl"></label>
-                <input class="form-control" asp-for="Input.NotifyUrl"/>
-            </div>
-            <button class="btn btn-primary mb-3" type="submit">提交请求</button>
-        </form>
-        <hr/>
-        @if (ViewData["response"] is string response && !string.IsNullOrEmpty(response))
-        {
-            <div class="mb-3">
-                <label class="form-label">应答</label>
-                <textarea class="form-control" rows="10">@response</textarea>
-            </div>
-        }
-    </div>
-</div>
-
-@section scripts {
-    @{ await Html.RenderPartialAsync("_ValidationScriptsPartial"); }
-}

+ 0 - 35
samples/Essensoft.Paylinks.Sample.Web/Pages/WeChatPay/Payments/Refund.cshtml.cs

@@ -1,35 +0,0 @@
-using Essensoft.Paylinks.WeChatPay.Client;
-using Essensoft.Paylinks.WeChatPay.Payments.Domain;
-using Essensoft.Paylinks.WeChatPay.Payments.Model;
-using Essensoft.Paylinks.WeChatPay.Payments.Request;
-using Microsoft.AspNetCore.Mvc;
-using Microsoft.AspNetCore.Mvc.RazorPages;
-using Microsoft.Extensions.Options;
-
-namespace Essensoft.Paylinks.Sample.Web.Pages.WeChatPay.Payments;
-
-public class RefundModel(IWeChatPayClient client, IOptions<PaylinksOptions> options) : PageModel
-{
-    private readonly WeChatPayClientOptions _options = options.Value.WeChatPay;
-
-    [BindProperty]
-    public WeChatPayRefundBodyModel Input { get; set; }
-
-    public void OnGet()
-    {
-        Input = new WeChatPayRefundBodyModel
-        {
-            OutRefundNo = DateTimeOffset.Now.ToString("yyyyMMddHHmmssfff"),
-            Amount = new RefundAmount { Refund = 1, Total = 1, Currency = "CNY" },
-            NotifyUrl = "https://www.domain.com/WeChatPay/Payments/Notify/RefundResult"
-        };
-    }
-
-    public async Task OnPostAsync()
-    {
-        var request = new WeChatPayRefundRequest();
-        request.SetBodyModel(Input);
-        var response = await client.ExecuteAsync(request, _options);
-        ViewData["response"] = response.Body;
-    }
-}

+ 0 - 45
samples/Essensoft.Paylinks.Sample.Web/Pages/WeChatPay/Payments/RefundQueryByOutRefundNo.cshtml

@@ -1,45 +0,0 @@
-@page
-@model RefundQueryByOutRefundNoModel
-@{
-    ViewData["Title"] = "查询单笔退款(通过商户退款单号)";
-}
-<nav aria-label="breadcrumb">
-    <ol class="breadcrumb">
-        <li class="breadcrumb-item">
-            <a asp-page="/Index">首页</a>
-        </li>
-        <li class="breadcrumb-item">
-            <a asp-page="/WeChatPay/Index">微信支付</a>
-        </li>
-        <li class="breadcrumb-item">
-            <a asp-page="/WeChatPay/Payments/Index">支付产品</a>
-        </li>
-        <li class="breadcrumb-item active" aria-current="page">@ViewData["Title"]</li>
-    </ol>
-</nav>
-<div class="card mb-3">
-    <div class="card-header">
-        @ViewData["Title"]
-    </div>
-    <div class="card-body">
-        <form method="post">
-            <div class="mb-3">
-                <label class="form-label" asp-for="OutRefundNo"></label>
-                <input class="form-control" asp-for="OutRefundNo"/>
-            </div>
-            <button class="btn btn-primary mb-3" type="submit">提交请求</button>
-        </form>
-        <hr/>
-        @if (ViewData["response"] is string response && !string.IsNullOrEmpty(response))
-        {
-            <div class="mb-3">
-                <label class="form-label">应答</label>
-                <textarea class="form-control" rows="10">@response</textarea>
-            </div>
-        }
-    </div>
-</div>
-
-@section scripts {
-    @{ await Html.RenderPartialAsync("_ValidationScriptsPartial"); }
-}

+ 0 - 26
samples/Essensoft.Paylinks.Sample.Web/Pages/WeChatPay/Payments/RefundQueryByOutRefundNo.cshtml.cs

@@ -1,26 +0,0 @@
-using Essensoft.Paylinks.WeChatPay.Client;
-using Essensoft.Paylinks.WeChatPay.Payments.Request;
-using Microsoft.AspNetCore.Mvc;
-using Microsoft.AspNetCore.Mvc.RazorPages;
-using Microsoft.Extensions.Options;
-
-namespace Essensoft.Paylinks.Sample.Web.Pages.WeChatPay.Payments;
-
-public class RefundQueryByOutRefundNoModel(IWeChatPayClient client, IOptions<PaylinksOptions> options) : PageModel
-{
-    private readonly WeChatPayClientOptions _options = options.Value.WeChatPay;
-
-    [BindProperty]
-    public string OutRefundNo { get; set; }
-
-    public void OnGet()
-    {
-    }
-
-    public async Task OnPostAsync()
-    {
-        var request = new WeChatPayRefundQueryByOutRefundNoRequest { OutRefundNo = OutRefundNo };
-        var response = await client.ExecuteAsync(request, _options);
-        ViewData["response"] = response.Body;
-    }
-}

+ 0 - 53
samples/Essensoft.Paylinks.Sample.Web/Pages/WeChatPay/Payments/Reverse.cshtml

@@ -1,53 +0,0 @@
-@page
-@model ReverseModel
-@{
-    ViewData["Title"] = "撤销";
-}
-<nav aria-label="breadcrumb">
-    <ol class="breadcrumb">
-        <li class="breadcrumb-item">
-            <a asp-page="/Index">首页</a>
-        </li>
-        <li class="breadcrumb-item">
-            <a asp-page="/WeChatPay/Index">微信支付</a>
-        </li>
-        <li class="breadcrumb-item">
-            <a asp-page="/WeChatPay/Payments/Index">支付产品</a>
-        </li>
-        <li class="breadcrumb-item active" aria-current="page">@ViewData["Title"]</li>
-    </ol>
-</nav>
-<div class="card mb-3">
-    <div class="card-header">
-        @ViewData["Title"]
-    </div>
-    <div class="card-body">
-        <form method="post">
-            <div class="mb-3">
-                <label class="form-label" asp-for="OutTradeNo"></label>
-                <input class="form-control" asp-for="OutTradeNo"/>
-            </div>
-            <div class="mb-3">
-                <label class="form-label" asp-for="Input.AppId"></label>
-                <input class="form-control" asp-for="Input.AppId"/>
-            </div>
-            <div class="mb-3">
-                <label class="form-label" asp-for="Input.MchId"></label>
-                <input class="form-control" asp-for="Input.MchId"/>
-            </div>
-            <button class="btn btn-primary mb-3" type="submit">提交请求</button>
-        </form>
-        <hr/>
-        @if (ViewData["response"] is string response && !string.IsNullOrEmpty(response))
-        {
-            <div class="mb-3">
-                <label class="form-label">应答</label>
-                <textarea class="form-control" rows="10">@response</textarea>
-            </div>
-        }
-    </div>
-</div>
-
-@section scripts {
-    @{ await Html.RenderPartialAsync("_ValidationScriptsPartial"); }
-}

+ 0 - 36
samples/Essensoft.Paylinks.Sample.Web/Pages/WeChatPay/Payments/Reverse.cshtml.cs

@@ -1,36 +0,0 @@
-using Essensoft.Paylinks.WeChatPay.Client;
-using Essensoft.Paylinks.WeChatPay.Payments.Model;
-using Essensoft.Paylinks.WeChatPay.Payments.Request;
-using Microsoft.AspNetCore.Mvc;
-using Microsoft.AspNetCore.Mvc.RazorPages;
-using Microsoft.Extensions.Options;
-
-namespace Essensoft.Paylinks.Sample.Web.Pages.WeChatPay.Payments;
-
-public class ReverseModel(IWeChatPayClient client, IOptions<PaylinksOptions> options) : PageModel
-{
-    private readonly WeChatPayClientOptions _options = options.Value.WeChatPay;
-
-    [BindProperty]
-    public string OutTradeNo { get; set; }
-
-    [BindProperty]
-    public WeChatPayReverseBodyModel Input { get; set; }
-
-    public void OnGet()
-    {
-        Input = new WeChatPayReverseBodyModel
-        {
-            AppId = _options.AppId,
-            MchId = _options.MchId
-        };
-    }
-
-    public async Task OnPostAsync()
-    {
-        var request = new WeChatPayReverseRequest { OutTradeNo = OutTradeNo };
-        request.SetBodyModel(Input);
-        var response = await client.ExecuteAsync(request, _options);
-        ViewData["response"] = response.Body;
-    }
-}

+ 0 - 45
samples/Essensoft.Paylinks.Sample.Web/Pages/WeChatPay/Payments/TradeBill.cshtml

@@ -1,45 +0,0 @@
-@page
-@model GetTradeBillModel
-@{
-    ViewData["Title"] = "申请交易账单";
-}
-<nav aria-label="breadcrumb">
-    <ol class="breadcrumb">
-        <li class="breadcrumb-item">
-            <a asp-page="/Index">首页</a>
-        </li>
-        <li class="breadcrumb-item">
-            <a asp-page="/WeChatPay/Index">微信支付</a>
-        </li>
-        <li class="breadcrumb-item">
-            <a asp-page="/WeChatPay/Payments/Index">支付产品</a>
-        </li>
-        <li class="breadcrumb-item active" aria-current="page">@ViewData["Title"]</li>
-    </ol>
-</nav>
-<div class="card mb-3">
-    <div class="card-header">
-        @ViewData["Title"]
-    </div>
-    <div class="card-body">
-        <form method="post">
-            <div class="mb-3">
-                <label class="form-label" asp-for="Input.BillDate"></label>
-                <input class="form-control" asp-for="Input.BillDate"/>
-            </div>
-            <button class="btn btn-primary mb-3" type="submit">提交请求</button>
-        </form>
-        <hr/>
-        @if (ViewData["response"] is string response && !string.IsNullOrEmpty(response))
-        {
-            <div class="mb-3">
-                <label class="form-label">应答</label>
-                <textarea class="form-control" rows="10">@response</textarea>
-            </div>
-        }
-    </div>
-</div>
-
-@section scripts {
-    @{ await Html.RenderPartialAsync("_ValidationScriptsPartial"); }
-}

+ 0 - 29
samples/Essensoft.Paylinks.Sample.Web/Pages/WeChatPay/Payments/TradeBill.cshtml.cs

@@ -1,29 +0,0 @@
-using Essensoft.Paylinks.WeChatPay.Client;
-using Essensoft.Paylinks.WeChatPay.Payments.Model;
-using Essensoft.Paylinks.WeChatPay.Payments.Request;
-using Microsoft.AspNetCore.Mvc;
-using Microsoft.AspNetCore.Mvc.RazorPages;
-using Microsoft.Extensions.Options;
-
-namespace Essensoft.Paylinks.Sample.Web.Pages.WeChatPay.Payments;
-
-public class GetTradeBillModel(IWeChatPayClient client, IOptions<PaylinksOptions> options) : PageModel
-{
-    private readonly WeChatPayClientOptions _options = options.Value.WeChatPay;
-
-    [BindProperty]
-    public WeChatPayTradeBillQueryModel Input { get; set; }
-
-    public void OnGet()
-    {
-        Input = new WeChatPayTradeBillQueryModel { BillDate = DateTimeOffset.Now.AddDays(-1).ToString("yyyy-MM-dd") };
-    }
-
-    public async Task OnPostAsync()
-    {
-        var request = new WeChatPayTradeBillRequest();
-        request.SetQueryModel(Input);
-        var response = await client.ExecuteAsync(request, _options);
-        ViewData["response"] = response.Body;
-    }
-}

+ 0 - 45
samples/Essensoft.Paylinks.Sample.Web/Pages/WeChatPay/SecurityTools/ConvertCertPrivateKey.cshtml

@@ -1,45 +0,0 @@
-@page
-@model ConvertCertPrivateKeyModel
-@{
-    ViewData["Title"] = "转换证书私钥 PKCS#8 => PKCS#1";
-}
-<nav aria-label="breadcrumb">
-    <ol class="breadcrumb">
-        <li class="breadcrumb-item">
-            <a asp-page="/Index">首页</a>
-        </li>
-        <li class="breadcrumb-item">
-            <a asp-page="/WeChatPay/Index">微信支付</a>
-        </li>
-        <li class="breadcrumb-item">
-            <a asp-page="/WeChatPay/SecurityTools/Index">安全工具</a>
-        </li>
-        <li class="breadcrumb-item active" aria-current="page">@ViewData["Title"]</li>
-    </ol>
-</nav>
-<div class="card mb-3">
-    <div class="card-header">
-        @ViewData["Title"]
-    </div>
-    <div class="card-body">
-        <form enctype="multipart/form-data" method="post">
-            <div class="mb-3">
-                <label class="form-label" asp-for="CertPrivateKey"></label>
-                <input class="form-control" asp-for="CertPrivateKey"/>
-            </div>
-            <button class="btn btn-primary mb-3" type="submit">提交请求</button>
-        </form>
-        <hr/>
-        @if (ViewData["response"] is string response && !string.IsNullOrEmpty(response))
-        {
-            <div class="mb-3">
-                <label class="form-label">应答</label>
-                <textarea class="form-control" rows="10">@response</textarea>
-            </div>
-        }
-    </div>
-</div>
-
-@section scripts {
-    @{ await Html.RenderPartialAsync("_ValidationScriptsPartial"); }
-}

+ 0 - 29
samples/Essensoft.Paylinks.Sample.Web/Pages/WeChatPay/SecurityTools/ConvertCertPrivateKey.cshtml.cs

@@ -1,29 +0,0 @@
-using Essensoft.Paylinks.WeChatPay.Core.Utilities;
-using Microsoft.AspNetCore.Mvc;
-using Microsoft.AspNetCore.Mvc.RazorPages;
-
-namespace Essensoft.Paylinks.Sample.Web.Pages.WeChatPay.SecurityTools;
-
-public class ConvertCertPrivateKeyModel : PageModel
-{
-    [BindProperty]
-    public IFormFile CertPrivateKey { get; set; }
-
-    public void OnGet()
-    {
-    }
-
-    public async Task OnPostAsync()
-    {
-        try
-        {
-            using var sr = new StreamReader(CertPrivateKey.OpenReadStream());
-            var str = await sr.ReadToEndAsync();
-            ViewData["response"] = WeChatPayCertUtilities.ConvertCertPrivateKey(str);
-        }
-        catch
-        {
-            ViewData["response"] = "无法获取";
-        }
-    }
-}

+ 0 - 21
samples/Essensoft.Paylinks.Sample.Web/Pages/WeChatPay/SecurityTools/Index.cshtml

@@ -1,21 +0,0 @@
-@page
-@model IndexModel
-@{
-    ViewData["Title"] = "安全工具";
-}
-<nav aria-label="breadcrumb">
-    <ol class="breadcrumb">
-        <li class="breadcrumb-item">
-            <a asp-page="/Index">首页</a>
-        </li>
-        <li class="breadcrumb-item">
-            <a asp-page="/WeChatPay/Index">微信支付</a>
-        </li>
-        <li class="breadcrumb-item active" aria-current="page">@ViewData["Title"]</li>
-    </ol>
-</nav>
-<div class="mb-3">
-    <div class="list-group">
-        <a class="list-group-item list-group-item-action" asp-page="/WeChatPay/SecurityTools/ConvertCertPrivateKey">转换证书私钥 PKCS#8 => PKCS#1</a>
-    </div>
-</div>

+ 0 - 10
samples/Essensoft.Paylinks.Sample.Web/Pages/WeChatPay/SecurityTools/Index.cshtml.cs

@@ -1,10 +0,0 @@
-using Microsoft.AspNetCore.Mvc.RazorPages;
-
-namespace Essensoft.Paylinks.Sample.Web.Pages.WeChatPay.SecurityTools;
-
-public class IndexModel : PageModel
-{
-    public void OnGet()
-    {
-    }
-}

+ 0 - 6
samples/Essensoft.Paylinks.Sample.Web/Pages/_ViewImports.cshtml

@@ -1,6 +0,0 @@
-@using System.Drawing
-@using Essensoft.Paylinks.Sample.Web
-@using Microsoft.AspNetCore.Mvc.TagHelpers
-@using QRCoder
-@namespace Essensoft.Paylinks.Sample.Web.Pages
-@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers

+ 0 - 3
samples/Essensoft.Paylinks.Sample.Web/Pages/_ViewStart.cshtml

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

+ 0 - 20
samples/Essensoft.Paylinks.Sample.Web/PaylinksOptions.cs

@@ -1,20 +0,0 @@
-using Essensoft.Paylinks.Alipay.Client;
-using Essensoft.Paylinks.WeChatPay.Client;
-
-namespace Essensoft.Paylinks.Sample.Web;
-
-/// <summary>
-/// Paylinks 选项
-/// </summary>
-public class PaylinksOptions
-{
-    /// <summary>
-    /// Alipay 客户端选项
-    /// </summary>
-    public AlipayClientOptions Alipay { get; set; }
-
-    /// <summary>
-    /// WeChatPay 客户端选项
-    /// </summary>
-    public WeChatPayClientOptions WeChatPay { get; set; }
-}

+ 0 - 38
samples/Essensoft.Paylinks.Sample.Web/Program.cs

@@ -1,38 +0,0 @@
-using Essensoft.Paylinks.Alipay.Client.Extensions;
-using Essensoft.Paylinks.Sample.Web;
-using Essensoft.Paylinks.Sample.Web.Services;
-using Essensoft.Paylinks.WeChatPay.Client.Extensions;
-
-var builder = WebApplication.CreateBuilder(args);
-
-builder.Services.Configure<PaylinksOptions>(builder.Configuration.GetSection("Paylinks"));
-
-builder.Services.AddAlipayClient();
-
-builder.Services.AddWeChatPayClient();
-
-builder.Services.AddHostedService<WeChatPayBackgroundService>();
-
-// Add services to the container.
-builder.Services.AddRazorPages();
-
-var app = builder.Build();
-
-// Configure the HTTP request pipeline.
-if (!app.Environment.IsDevelopment())
-{
-    app.UseExceptionHandler("/Error");
-    // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
-    app.UseHsts();
-}
-
-app.UseHttpsRedirection();
-app.UseStaticFiles();
-
-app.UseRouting();
-
-app.UseAuthorization();
-
-app.MapRazorPages();
-
-app.Run();

+ 0 - 12
samples/Essensoft.Paylinks.Sample.Web/Properties/launchSettings.json

@@ -1,12 +0,0 @@
-{
-  "profiles": {
-    "Essensoft.Paylinks.Sample.Web": {
-      "commandName": "Project",
-      "launchBrowser": true,
-      "environmentVariables": {
-        "ASPNETCORE_ENVIRONMENT": "Development"
-      },
-      "applicationUrl": "https://localhost:57816/"
-    }
-  }
-}

+ 0 - 183
samples/Essensoft.Paylinks.Sample.Web/Services/WeChatPayBackgroundService.cs

@@ -1,183 +0,0 @@
-using System.Security.Cryptography.X509Certificates;
-using Essensoft.Paylinks.WeChatPay.Certificates.Extensions;
-using Essensoft.Paylinks.WeChatPay.Certificates.Request;
-using Essensoft.Paylinks.WeChatPay.Client;
-using Essensoft.Paylinks.WeChatPay.Core.Utilities;
-using Microsoft.Extensions.Options;
-
-namespace Essensoft.Paylinks.Sample.Web.Services;
-
-/// <summary>
-/// 微信支付后台服务
-/// 定时更新微信支付平台证书(12小时)。
-/// </summary>
-public class WeChatPayBackgroundService(
-    ILogger<WeChatPayBackgroundService> logger,
-    IWeChatPayClient client,
-    IWeChatPayPlatformCertificateManagerFactory certificateManagerFactory,
-    IOptions<PaylinksOptions> options) : BackgroundService
-{
-    private readonly PaylinksOptions _options = options.Value;
-
-    // 如何通过证书信任链验证平台证书?https://pay.weixin.qq.com/doc/v3/merchant/4012072597
-    // 微信支付平台证书信任链: https://wx.gtimg.com/mch/files/CertTrustChain.p7b
-    private const string WeChatPayRootCertPem = """
-        subject=/C=CN/O=Tenpay.com/OU=Tenpay.com CA Center/CN=Tenpay.com Root CA
-        issuer=/C=CN/O=iTrusChina/OU=China Trust Network/CN=iTrusChina Class 2 Enterprise CA - G3
-        -----BEGIN CERTIFICATE-----
-        MIIEcDCCA1igAwIBAgIUG9QiDlDbwEsGrTl1SYRsAcPo69IwDQYJKoZIhvcNAQEL
-        BQAwcDELMAkGA1UEBhMCQ04xEzARBgNVBAoMCmlUcnVzQ2hpbmExHDAaBgNVBAsM
-        E0NoaW5hIFRydXN0IE5ldHdvcmsxLjAsBgNVBAMMJWlUcnVzQ2hpbmEgQ2xhc3Mg
-        MiBFbnRlcnByaXNlIENBIC0gRzMwHhcNMTcwODA5MDkxNTU1WhcNMzIwODA5MDkx
-        NTU1WjBeMQswCQYDVQQGEwJDTjETMBEGA1UEChMKVGVucGF5LmNvbTEdMBsGA1UE
-        CxMUVGVucGF5LmNvbSBDQSBDZW50ZXIxGzAZBgNVBAMTElRlbnBheS5jb20gUm9v
-        dCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALvnPD6k39BdPYAH
-        +6lnWPjuHH+2pcmZUf2E8cNFQFNr+ECRZylYV2iKyItCQt3I2/7VIDZl6aR9TE7n
-        sZrtSmOXCw635QOrq2yF9LTSDotAhf3ER0+216w3age/VzGcNVQpTf6gRCHCuQIk
-        8pe/oh06JagGvX0wERa+I6NfuG58ZHQY9d6RqLXKQl0Up95v73HDsG487z8k6jcn
-        qpGngmHQxdWiWRJugqxNRUD+awv2/DUsqGOffPX4jzJ6rLSJSlQXvuniDYxmaiaD
-        cK0bUbB5aM+1zMwogoHSYxWj/6B+vgcnHQCUrwGdiQR5+F+yRWzy5bO09IzaFgeO
-        PNPLPOsCAwEAAaOCARIwggEOMBIGA1UdEwEB/wQIMAYBAf8CAQAwDgYDVR0PAQH/
-        BAQDAgEGMCAGA1UdEQQZMBekFTATMREwDwYDVQQDDAhzd2JlLTI2NjAdBgNVHQ4E
-        FgQUTFo4GLdm9oHX52HcWnzuL4tui2gwHwYDVR0jBBgwFoAUK1vVxWgI69vN5LA5
-        MqJf/8dPmEUwRgYDVR0gBD8wPTA7BgoqgRyG7xcBAQECMC0wKwYIKwYBBQUHAgEW
-        H2h0dHBzOi8vd3d3Lml0cnVzLmNvbS5jbi9jdG5jcHMwPgYDVR0fBDcwNTAzoDGg
-        L4YtaHR0cDovL3RvcGNhLml0cnVzLmNvbS5jbi9jcmwvaXRydXNjMmNhZzMuY3Js
-        MA0GCSqGSIb3DQEBCwUAA4IBAQBwZhL/eiOQmMyo1D0IR9mu1DPWl5J3XXhjc4R6
-        mFgsN/FCeVP9M4U9y2FJH6i5Ha5YCecKGw5pwhA0rjZr/6okWwo22GF+nzI/gQiz
-        6ugAKs5VjFbeiEb04Ncz4HT8FP1idK3tyCjqCUTkLNt0U3tR7wy26hgOqlT2wCZ9
-        X4MfT8dUMdt9nCZx4ujN5yZOzaLOCHmzoGDGxgKg91bbu0TG2Yzd2ylhrxxRtFH9
-        aZ/J1x5UoF7uwhTM8P92DuAldWC1/bX1kciOtQvQEZeAy+9y/1BtFxoBnmDxnqkX
-        +lirIUYTLDaL7HaLrOLECUlaxZCU/Nkwm3tmqQxtCh+XQBdd
-        -----END CERTIFICATE-----
-
-        subject=/C=CN/O=iTrusChina/OU=China Trust Network/CN=iTrusChina Class 2 Root CA - G3
-        issuer=/C=CN/O=iTrusChina/OU=China Trust Network/CN=iTrusChina Class 2 Root CA - G3
-        -----BEGIN CERTIFICATE-----
-        MIIDxTCCAq2gAwIBAgIUEMdk6dVgOEIS2cCP0Q43P90Ps5YwDQYJKoZIhvcNAQEF
-        BQAwajELMAkGA1UEBhMCQ04xEzARBgNVBAoMCmlUcnVzQ2hpbmExHDAaBgNVBAsM
-        E0NoaW5hIFRydXN0IE5ldHdvcmsxKDAmBgNVBAMMH2lUcnVzQ2hpbmEgQ2xhc3Mg
-        MiBSb290IENBIC0gRzMwHhcNMTMwNDE4MDkzNjU2WhcNMzMwNDE4MDkzNjU2WjBq
-        MQswCQYDVQQGEwJDTjETMBEGA1UECgwKaVRydXNDaGluYTEcMBoGA1UECwwTQ2hp
-        bmEgVHJ1c3QgTmV0d29yazEoMCYGA1UEAwwfaVRydXNDaGluYSBDbGFzcyAyIFJv
-        b3QgQ0EgLSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOPPShpV
-        nJbMqqCw6Bz1kehnoPst9pkr0V9idOwU2oyS47/HjJXk9Rd5a9xfwkPO88trUpz5
-        4GmmwspDXjVFu9L0eFaRuH3KMha1Ak01citbF7cQLJlS7XI+tpkTGHEY5pt3EsQg
-        wykfZl/A1jrnSkspMS997r2Gim54cwz+mTMgDRhZsKK/lbOeBPpWtcFizjXYCqhw
-        WktvQfZBYi6o4sHCshnOswi4yV1p+LuFcQ2ciYdWvULh1eZhLxHbGXyznYHi0dGN
-        z+I9H8aXxqAQfHVhbdHNzi77hCxFjOy+hHrGsyzjrd2swVQ2iUWP8BfEQqGLqM1g
-        KgWKYfcTGdbPB1MCAwEAAaNjMGEwHQYDVR0OBBYEFG/oAMxTVe7y0+408CTAK8hA
-        uTyRMB8GA1UdIwQYMBaAFG/oAMxTVe7y0+408CTAK8hAuTyRMA8GA1UdEwEB/wQF
-        MAMBAf8wDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQBLnUTfW7hp
-        emMbuUGCk7RBswzOT83bDM6824EkUnf+X0iKS95SUNGeeSWK2o/3ALJo5hi7GZr3
-        U8eLaWAcYizfO99UXMRBPw5PRR+gXGEronGUugLpxsjuynoLQu8GQAeysSXKbN1I
-        UugDo9u8igJORYA+5ms0s5sCUySqbQ2R5z/GoceyI9LdxIVa1RjVX8pYOj8JFwtn
-        DJN3ftSFvNMYwRuILKuqUYSHc2GPYiHVflDh5nDymCMOQFcFG3WsEuB+EYQPFgIU
-        1DHmdZcz7Llx8UOZXX2JupWCYzK1XhJb+r4hK5ncf/w8qGtYlmyJpxk3hr1TfUJX
-        Yf4Zr0fJsGuv
-        -----END CERTIFICATE-----
-
-        subject=/C=CN/O=iTrusChina/OU=China Trust Network/CN=iTrusChina Class 2 Enterprise CA - G3
-        issuer=/C=CN/O=iTrusChina/OU=China Trust Network/CN=iTrusChina Class 2 Root CA - G3
-        -----BEGIN CERTIFICATE-----
-        MIIEWzCCA0OgAwIBAgIUXebgKKreiIUWpld7APPGQeaeEzEwDQYJKoZIhvcNAQEF
-        BQAwajELMAkGA1UEBhMCQ04xEzARBgNVBAoMCmlUcnVzQ2hpbmExHDAaBgNVBAsM
-        E0NoaW5hIFRydXN0IE5ldHdvcmsxKDAmBgNVBAMMH2lUcnVzQ2hpbmEgQ2xhc3Mg
-        MiBSb290IENBIC0gRzMwHhcNMTMwNDE4MDk0NDE3WhcNMzMwNDE3MDk0NDE3WjBw
-        MQswCQYDVQQGEwJDTjETMBEGA1UECgwKaVRydXNDaGluYTEcMBoGA1UECwwTQ2hp
-        bmEgVHJ1c3QgTmV0d29yazEuMCwGA1UEAwwlaVRydXNDaGluYSBDbGFzcyAyIEVu
-        dGVycHJpc2UgQ0EgLSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB
-        AL2hymJqz9ASXoYSuCCNZi4/q/FWnOcnNkk0jgDTmwsXa+vr6f/c2gbRAehBu1Uh
-        1m9N/yp4Enxzf5EPh1yTTQ7042PJfh8I5x+I6A64xYN4qGPlYnl8gmP/0+fTDejJ
-        vPtM59k83rhGQsZzyp9rMiaUphHbFEr6ZWWrCg1SADP6NlP3P90wOmBviE12yGsv
-        JZF1HOaTSKuSWDGZPZq8RO+q9lfhlOHi0Ht7V+hnuxCOgN/PWhvoh0KpHhPi0OKn
-        6/RIZObZqMBqngPEUHXZfkzIQo6KEUvvWduvOC6P5hPpbAr0+xvE2WFORyRyL52W
-        8bfkc8/QzdxxCa9RVpzRuFcCAwEAAaOB8jCB7zAPBgNVHRMBAf8EBTADAQH/MA4G
-        A1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUK1vVxWgI69vN5LA5MqJf/8dPmEUwHwYD
-        VR0jBBgwFoAUb+gAzFNV7vLT7jTwJMAryEC5PJEwRgYDVR0gBD8wPTA7BgoqgRyG
-        7xcBAQECMC0wKwYIKwYBBQUHAgEWH2h0dHBzOi8vd3d3Lml0cnVzLmNvbS5jbi9j
-        dG5jcHMwRAYDVR0fBD0wOzA5oDegNYYzaHR0cDovL2ljYS1wdWJsaWMuaXRydXMu
-        Y29tLmNuL2NybC9pdHJ1c2MycmNhZzMuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQA3
-        WmfVeOre6edXZmsq1RXYAoJf/is70tRqJKato6KpOHkmGmo/+btAJ9JqKYSciOoq
-        7OkAuQugkA9BoMLZkaGhvPIYuRqQmDcpLEvVS5L5acKKlQiRmyLKXtmZmBUP0Dxd
-        SAbF9CG45abr226WQ9Yx+I5RjW0BMDZUBOHL+x8oOy3Sw5aqWznbPyNbCKFtJ0pV
-        n0rx0BtfpRdnuew0cshfNOGn05N7W5YmYD1S6gbVQt5VZL9fAXphYlM12rlSaDiB
-        NdM0hSb43laYFyH9bnMJxZDqcEQ/YwZZ0nfRfvRXx+s/8kvHmZPgmx9sGGfCx2AZ
-        RCQzBAe4s75o8F08GgkU
-        -----END CERTIFICATE-----
-
-        
-        """;
-
-    protected override async Task ExecuteAsync(CancellationToken stoppingToken)
-    {
-        var certTrustChain = new X509Certificate2Collection();
-        certTrustChain.ImportFromPem(WeChatPayRootCertPem);
-
-        while (!stoppingToken.IsCancellationRequested)
-        {
-            if (!string.IsNullOrEmpty(_options.WeChatPay.WeChatPayPublicKeyId) && !string.IsNullOrEmpty(_options.WeChatPay.WeChatPayPublicKey))
-            {
-                logger.LogInformation("微信支付后台服务取消:已配置微信支付公钥,无需下载平台证书。");
-                break;
-            }
-
-            if (string.IsNullOrEmpty(_options.WeChatPay.MchId) ||
-                string.IsNullOrEmpty(_options.WeChatPay.MchSerialNo) ||
-                string.IsNullOrEmpty(_options.WeChatPay.MchPrivateKey))
-            {
-                logger.LogWarning("微信支付后台服务取消:未配置微信支付下载平台证书关键参数。");
-                break;
-            }
-
-            try
-            {
-                var certificateManager = certificateManagerFactory.Create(_options.WeChatPay.MchId);
-
-                // 移除所有无效证书
-                certificateManager.RemoveUnavailableCertificates();
-
-                // 下载平台证书请求
-                var request = new WeChatPayCertificatesRequest();
-
-                // 无有效平台证书时,不需要验签。
-                if (!certificateManager.GetAvailableCertificates().Any())
-                {
-                    request.SetNeedVerify(false);
-                }
-
-                // 执行请求
-                var response = await client.ExecuteAsync(request, _options.WeChatPay, stoppingToken);
-                if (response.IsSuccessful)
-                {
-                    // 获取解密后的平台证书
-                    foreach (var certificate in response.GetWeChatPayDecryptedPlatformCertificates(_options.WeChatPay.APIv3Key))
-                    {
-                        // 跳过已存在的证书
-                        if (certificateManager.GetBySerialNo(certificate.SerialNo) != null)
-                        {
-                            continue;
-                        }
-
-                        // 证书信任链验证平台证书
-                        if (WeChatPayCertUtilities.VerifyCertificateChain(certTrustChain, certificate.Certificate))
-                        {
-                            certificateManager.Add(certificate);
-                            logger.LogInformation($"新增微信平台证书: {certificate.SerialNo}");
-                        }
-                    }
-                }
-                else
-                {
-                    logger.LogError(response.Body);
-                }
-            }
-            catch (Exception ex)
-            {
-                logger.LogError(ex.Message);
-            }
-
-            await Task.Delay(TimeSpan.FromHours(12), stoppingToken);
-        }
-    }
-}

+ 0 - 9
samples/Essensoft.Paylinks.Sample.Web/appsettings.Development.json

@@ -1,9 +0,0 @@
-{
-  "DetailedErrors": true,
-  "Logging": {
-    "LogLevel": {
-      "Default": "Information",
-      "Microsoft.AspNetCore": "Warning"
-    }
-  }
-}

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