Просмотр исходного кода

修正 SDKExecute、PageExecute 字典排序

Roc 5 лет назад
Родитель
Сommit
8a895bc78b

+ 1 - 10
payment.sln

@@ -21,11 +21,7 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Essensoft.AspNetCore.Paymen
 EndProject
 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Essensoft.AspNetCore.Payment.WeChatPay", "src\Essensoft.AspNetCore.Payment.WeChatPay\Essensoft.AspNetCore.Payment.WeChatPay.csproj", "{66655C56-A98C-4F67-9F41-FECF0AFFA28E}"
 EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "2-tests", "2-tests", "{E3CAF00B-E29E-40E9-BF9F-16C240C1A976}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Essensoft.AspNetCore.Payment.Alipay.Tests", "tests\Essensoft.AspNetCore.Payment.Alipay.Tests\Essensoft.AspNetCore.Payment.Alipay.Tests.csproj", "{F2CAC167-4915-4843-BE3B-3992ACB51D3B}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "3-samples", "3-samples", "{DD8CC860-F3E3-40F4-8A8F-20BF66EA051C}"
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "2-samples", "2-samples", "{DD8CC860-F3E3-40F4-8A8F-20BF66EA051C}"
 EndProject
 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WebApplicationSample", "samples\WebApplicationSample\WebApplicationSample.csproj", "{6C90BFFA-2F73-4961-922A-588B589C444C}"
 EndProject
@@ -47,10 +43,6 @@ Global
 		{66655C56-A98C-4F67-9F41-FECF0AFFA28E}.Debug|Any CPU.Build.0 = Debug|Any CPU
 		{66655C56-A98C-4F67-9F41-FECF0AFFA28E}.Release|Any CPU.ActiveCfg = Release|Any CPU
 		{66655C56-A98C-4F67-9F41-FECF0AFFA28E}.Release|Any CPU.Build.0 = Release|Any CPU
-		{F2CAC167-4915-4843-BE3B-3992ACB51D3B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
-		{F2CAC167-4915-4843-BE3B-3992ACB51D3B}.Debug|Any CPU.Build.0 = Debug|Any CPU
-		{F2CAC167-4915-4843-BE3B-3992ACB51D3B}.Release|Any CPU.ActiveCfg = Release|Any CPU
-		{F2CAC167-4915-4843-BE3B-3992ACB51D3B}.Release|Any CPU.Build.0 = Release|Any CPU
 		{6C90BFFA-2F73-4961-922A-588B589C444C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
 		{6C90BFFA-2F73-4961-922A-588B589C444C}.Debug|Any CPU.Build.0 = Debug|Any CPU
 		{6C90BFFA-2F73-4961-922A-588B589C444C}.Release|Any CPU.ActiveCfg = Release|Any CPU
@@ -63,7 +55,6 @@ Global
 		{167FAA95-300E-49D5-A29B-EFCFF90A0584} = {D3871E61-CA47-4BD0-8BF9-B64A42B2200D}
 		{3578E08D-A08E-4C4A-A5DE-8D31C21F7D66} = {D3871E61-CA47-4BD0-8BF9-B64A42B2200D}
 		{66655C56-A98C-4F67-9F41-FECF0AFFA28E} = {D3871E61-CA47-4BD0-8BF9-B64A42B2200D}
-		{F2CAC167-4915-4843-BE3B-3992ACB51D3B} = {E3CAF00B-E29E-40E9-BF9F-16C240C1A976}
 		{6C90BFFA-2F73-4961-922A-588B589C444C} = {DD8CC860-F3E3-40F4-8A8F-20BF66EA051C}
 	EndGlobalSection
 	GlobalSection(ExtensibilityGlobals) = postSolution

+ 14 - 5
src/Essensoft.AspNetCore.Payment.Alipay/AlipayClient.cs

@@ -87,7 +87,11 @@ namespace Essensoft.AspNetCore.Payment.Alipay
                 { AlipayConstants.APP_CERT_SN, options.AppCertSN }
             };
 
-            // 序列化BizModel
+            //字典排序
+            var sortedTxtParams = new SortedDictionary<string, string>(txtParams, StringComparer.Ordinal);
+            txtParams = new AlipayDictionary(sortedTxtParams);
+
+           // 序列化BizModel
             txtParams = SerializeBizModel(txtParams, request);
 
             // 添加签名参数
@@ -277,7 +281,7 @@ namespace Essensoft.AspNetCore.Payment.Alipay
             return rsp;
         }
 
-        private void CheckResponseSign<T>(IAlipayRequest<T> request, string body, bool isError, IAlipayParser<T> parser, AlipayOptions options) where T : AlipayResponse
+        private static void CheckResponseSign<T>(IAlipayRequest<T> request, string body, bool isError, IAlipayParser<T> parser, AlipayOptions options) where T : AlipayResponse
         {
             var signItem = parser.GetSignItem(request, body);
             if (signItem == null)
@@ -333,6 +337,11 @@ namespace Essensoft.AspNetCore.Payment.Alipay
                 throw new ArgumentNullException(nameof(options));
             }
 
+            if (string.IsNullOrEmpty(options.AppCert) || string.IsNullOrEmpty(options.AlipayPublicCert) || string.IsNullOrEmpty(options.AlipayRootCert))
+            {
+                throw new AlipayException("检测到证书相关参数未初始化,非证书模式下请改为调用ExecuteAsync。");
+            }
+
             if (string.IsNullOrEmpty(options.AppId))
             {
                 throw new AlipayException("Options.AppId 不能为空。");
@@ -537,7 +546,7 @@ namespace Essensoft.AspNetCore.Payment.Alipay
 
         #region Common Method
 
-        private ResponseParseItem ParseRespItem<T>(IAlipayRequest<T> request, string respBody, IAlipayParser<T> parser, string encryptKey, string encryptType) where T : AlipayResponse
+        private static ResponseParseItem ParseRespItem<T>(IAlipayRequest<T> request, string respBody, IAlipayParser<T> parser, string encryptKey, string encryptType) where T : AlipayResponse
         {
             string realContent;
             if (request.GetNeedEncrypt())
@@ -569,7 +578,7 @@ namespace Essensoft.AspNetCore.Payment.Alipay
             return sb.ToString();
         }
 
-        private AlipayDictionary BuildRequestParams<T>(IAlipayRequest<T> request, string accessToken, string appAuthToken, AlipayOptions options) where T : AlipayResponse
+        private static AlipayDictionary BuildRequestParams<T>(IAlipayRequest<T> request, string accessToken, string appAuthToken, AlipayOptions options) where T : AlipayResponse
         {
             var apiVersion = string.IsNullOrEmpty(request.GetApiVersion()) ? options.Version : request.GetApiVersion();
 
@@ -663,7 +672,7 @@ namespace Essensoft.AspNetCore.Payment.Alipay
             var requestParams = BuildRequestParams(request, null, appAuthToken, options);
 
             // 字典排序
-            var sortedParams = new SortedDictionary<string, string>(requestParams);
+            var sortedParams = new SortedDictionary<string, string>(requestParams, StringComparer.Ordinal);
             var sortedDic = new AlipayDictionary(sortedParams);
 
             // 参数签名

+ 1 - 1
src/Essensoft.AspNetCore.Payment.Alipay/AlipayNotifyClient.cs

@@ -118,7 +118,7 @@ namespace Essensoft.AspNetCore.Payment.Alipay
 
         #region Common Method
 
-        private void CheckNotifySign(IDictionary<string, string> dictionary, AlipayOptions options)
+        private static void CheckNotifySign(IDictionary<string, string> dictionary, AlipayOptions options)
         {
             if (dictionary == null || dictionary.Count == 0)
             {

+ 1 - 1
src/Essensoft.AspNetCore.Payment.Alipay/Parser/AlipayJsonParser.cs

@@ -151,7 +151,7 @@ namespace Essensoft.AspNetCore.Payment.Alipay.Parser
 
             var item = ParseEncryptData(request, body);
             var bodyIndexContent = body.Substring(0, item.startIndex);
-            var bodyEndexContent = body.Substring(item.endIndex);
+            var bodyEndexContent = body[item.endIndex..];
             var bizContent = AES.Decrypt(item.encryptContent, encryptKey, AlipaySignature.AES_IV, CipherMode.CBC, PaddingMode.PKCS7);
 
             return bodyIndexContent + bizContent + bodyEndexContent;

+ 1 - 1
src/Essensoft.AspNetCore.Payment.Alipay/Utility/AlipayUtility.cs

@@ -148,7 +148,7 @@ namespace Essensoft.AspNetCore.Payment.Alipay.Utility
             var pos = api.IndexOf(".");
             if (pos != -1 && api.Length > pos)
             {
-                api = api.Substring(pos + 1).Replace('.', '_');
+                api = api[(pos + 1)..].Replace('.', '_');
             }
 
             return api + AlipayConstants.RESPONSE_SUFFIX;

+ 0 - 41
tests/Essensoft.AspNetCore.Payment.Alipay.Tests/AlipayOpenAuthTokenAppResponseTests.cs

@@ -1,41 +0,0 @@
-using Essensoft.AspNetCore.Payment.Alipay.Parser;
-using Essensoft.AspNetCore.Payment.Alipay.Response;
-using Xunit;
-
-namespace Essensoft.AspNetCore.Payment.Alipay.Tests
-{
-    public class AlipayOpenAuthTokenAppResponseTests
-    {
-        [Fact]
-        public void Parse()
-        {
-            var respBody = @"{
-    ""alipay_open_auth_token_app_response"": {
-        ""code"": ""10000"",
-        ""msg"": ""Success"",
-        ""app_auth_token"": ""3947DD4AFCDF47D2B19B70B4EC2E6D95"",
-        ""app_refresh_token"": ""90AAF89CCB5848EC9F1D9F80A0ACAEFD}"",
-        ""auth_app_id"": ""2016000000000000"",
-        ""expires_in"": 31536000,
-        ""re_expires_in"": 32140800,
-        ""tokens"": [
-            {
-                ""app_auth_token"": ""3947DD4AFCDF47D2B19B70B4EC2E6D95"",
-                ""app_refresh_token"": ""90AAF89CCB5848EC9F1D9F80A0ACAEFD"",
-                ""auth_app_id"": ""2016000000000000"",
-                ""expires_in"": 31536000,
-                ""re_expires_in"": 32140800,
-                ""user_id"": ""2088100000000000""
-            }
-        ],
-        ""userid"": ""2088100000000000"",
-        ""sign"": ""PGhIW6oyPb0eZ5rdzvfk02LFQQDQ17UEgMOcDAbkf2yKrb9vvRR/44nVrtőkv4hS97hxEH9ppyqff8ltwrUtejrhisSiy6eH2v4lfzjgDkS9vp2OhSrmquorwAEhSXYKyap1GK2TRiprPFNJtfkFhcG/d838liJs4SWX2oCEtL3fOogpM4EOMayhEkV57yQPh4w2vIFsP519zvNSZ2DuNT8Td5VIGp1nwR4Tal1Rp7+Th0+7Jk6YHAMftXACiq40hN1NBr67IWBJ01+zzc6YsZecL2NQLvugu9kP2do0QB3aQ/SGXtlQShV7HdBTE3JseOCD1QONOKO7iKJRdJfzoYfg==""
-    }
-}";
-            var parser = new AlipayJsonParser<AlipayOpenAuthTokenAppResponse>();
-            var resp = parser.Parse(respBody);
-            Assert.Equal("3947DD4AFCDF47D2B19B70B4EC2E6D95", resp.AppAuthToken);
-            Assert.NotNull(resp.Tokens);
-        }
-    }
-}

+ 0 - 25
tests/Essensoft.AspNetCore.Payment.Alipay.Tests/Essensoft.AspNetCore.Payment.Alipay.Tests.csproj

@@ -1,25 +0,0 @@
-<Project Sdk="Microsoft.NET.Sdk">
-
-  <PropertyGroup>
-    <TargetFramework>net5.0</TargetFramework>
-    <IsPackable>false</IsPackable>
-  </PropertyGroup>
-
-  <ItemGroup>
-    <PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.8.0" />
-    <PackageReference Include="xunit" Version="2.4.1" />
-    <PackageReference Include="xunit.runner.visualstudio" Version="2.4.3">
-      <PrivateAssets>all</PrivateAssets>
-      <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
-    </PackageReference>
-    <PackageReference Include="coverlet.collector" Version="1.3.0">
-      <PrivateAssets>all</PrivateAssets>
-      <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
-    </PackageReference>
-  </ItemGroup>
-
-  <ItemGroup>
-    <ProjectReference Include="..\..\src\Essensoft.AspNetCore.Payment.Alipay\Essensoft.AspNetCore.Payment.Alipay.csproj" />
-  </ItemGroup>
-
-</Project>