From 89180f038e36a2f957c15717aeceb6945251f674 Mon Sep 17 00:00:00 2001
From: sunpengfei <i@angelzzz.com>
Date: 星期一, 01 九月 2025 09:53:16 +0800
Subject: [PATCH] feat:开发

---
 FlexJobApi.Web.Entry/Startup.cs                                                                     |    1 
 FlexJobApi.Core/Models/UserServer/EnterpriseEmployees/Queries/GetPersonalUserElectronSignQuery.cs   |   11 +
 FlexJobApi.UserServer.Application/EnterpriseEmployees/Queries/EnterpriseEmployeeQueryHandler.cs     |    2 
 FlexJobApi.Core/Utils/AlipayUtils/AlipayOptions.cs                                                  |   25 ++++
 FlexJobApi.UserServer.Application/EnterpriseEmployees/Commands/EnterpriseEmployeesCommandHandler.cs |    1 
 FlexJobApi.Web.Entry/appsettings.json                                                               |   14 ++
 FlexJobApi.Web.Entry/AlipayCert/alipayRootCert.crt                                                  |   88 ++++++++++++++
 FlexJobApi.Web.Entry/AlipayCert/alipayCertPublicKey_RSA2.crt                                        |   43 +++++++
 FlexJobApi.Web.Entry/AlipayCert/appCertPublicKey_2021004171602214.crt                               |   23 +++
 FlexJobApi.Web.Entry/AlipayCert/CSR文件.csr                                                           |   17 ++
 FlexJobApi.Core/FlexJobApi.Core.xml                                                                 |   21 +++
 FlexJobApi.Core/Utils/AlipayUtils/AlipayUtils.cs                                                    |   72 ++++++++++++
 FlexJobApi.CommonServer.Application/LogRecords/Queries/GetTraceIdLogQueryHandler.cs                 |    9 
 FlexJobApi.Core/FlexJobApi.Core.csproj                                                              |    2 
 14 files changed, 324 insertions(+), 5 deletions(-)

diff --git a/FlexJobApi.CommonServer.Application/LogRecords/Queries/GetTraceIdLogQueryHandler.cs b/FlexJobApi.CommonServer.Application/LogRecords/Queries/GetTraceIdLogQueryHandler.cs
index 3c629e7..39c2ced 100644
--- a/FlexJobApi.CommonServer.Application/LogRecords/Queries/GetTraceIdLogQueryHandler.cs
+++ b/FlexJobApi.CommonServer.Application/LogRecords/Queries/GetTraceIdLogQueryHandler.cs
@@ -50,10 +50,11 @@
                 .Where(it => it.TraceId == request.TraceId)
                 .ProjectToType<GetDbAuditLogsQueryResultItem>()
                 .ToListAsync();
-            var userIds = result.ResourceLogs.DistinctSelect(it => it.CreatedUserId.HasValue, it => it.CreatedUserId)
-                .Union(result.ExceptionLogs.DistinctSelect(it => it.CreatedUserId.HasValue, it => it.CreatedUserId))
-                .Union(result.DbAuditLogs.DistinctSelect(it => it.CreatedUserId.HasValue, it => it.CreatedUserId));
-            if (userIds.IsNullOrEmpty())
+            var userIds = result.ResourceLogs.DistinctSelect(it => it.CreatedUserId.HasValue, it => it.CreatedUserId!.Value)
+                .Union(result.ExceptionLogs.DistinctSelect(it => it.CreatedUserId.HasValue, it => it.CreatedUserId!.Value))
+                .Union(result.DbAuditLogs.DistinctSelect(it => it.CreatedUserId.HasValue, it => it.CreatedUserId!.Value))
+                .ToList();
+            if (userIds.IsNotNull())
             {
                 var users = await repUser.AsQueryable().AsNoTracking()
                    .Where(it => userIds.Contains(it.Id))
diff --git a/FlexJobApi.Core/FlexJobApi.Core.csproj b/FlexJobApi.Core/FlexJobApi.Core.csproj
index 1df082e..5656242 100644
--- a/FlexJobApi.Core/FlexJobApi.Core.csproj
+++ b/FlexJobApi.Core/FlexJobApi.Core.csproj
@@ -17,6 +17,8 @@
 	</ItemGroup>
 
 	<ItemGroup>
+		<PackageReference Include="AlipayEasySDK" Version="2.1.3" />
+		<PackageReference Include="AlipaySDKNet.Standard" Version="4.9.751" />
 		<PackageReference Include="aliyun-net-sdk-core" Version="1.5.6" />
 		<PackageReference Include="Aliyun.OSS.SDK.NetCore" Version="2.14.1" />
 		<PackageReference Include="Baidu.AI" Version="4.15.16" />
diff --git a/FlexJobApi.Core/FlexJobApi.Core.xml b/FlexJobApi.Core/FlexJobApi.Core.xml
index e84b6ff..40f14e6 100644
--- a/FlexJobApi.Core/FlexJobApi.Core.xml
+++ b/FlexJobApi.Core/FlexJobApi.Core.xml
@@ -6681,6 +6681,11 @@
             褰曠敤鐘舵��
             </summary>
         </member>
+        <member name="P:FlexJobApi.Core.GetTaskInfoQueryResult.EnterpriseEmployeeId">
+            <summary>
+            鐏靛伐Id
+            </summary>
+        </member>
         <member name="P:FlexJobApi.Core.GetTaskInfoQueryResult.ApplyButton">
             <summary>
             鎴戠殑鎶ュ悕鍒楄〃鐘舵��
@@ -8841,6 +8846,11 @@
             鍚堝悓缂栧彿
             </summary>
         </member>
+        <member name="P:FlexJobApi.Core.GetPersonalUserElectronSignQueryResult.ContractTemplateAccess">
+            <summary>
+            鍚堝悓妯℃澘閫氶亾
+            </summary>
+        </member>
         <member name="P:FlexJobApi.Core.GetPersonalUserElectronSignQueryResult.UserSignContractStatus">
             <summary>
             鐏靛伐绛剧害鐘舵��
@@ -8860,6 +8870,12 @@
             <summary>
             绛剧害鏂逛俊鎭�-鍛樺伐-璇佷欢鍙风爜
             </summary>
+        </member>
+        <member name="P:FlexJobApi.Core.GetPersonalUserElectronSignQueryResult.ContactPhoneNumber">
+            <summary>
+            绛剧害鏂逛俊鎭�-鍛樺伐-鎵嬫満鍙�
+            </summary>
+            <remarks>鑱旂郴鐢佃瘽</remarks>
         </member>
         <member name="P:FlexJobApi.Core.GetPersonalUserElectronSignQueryResult.UserSignContractTime">
             <summary>
@@ -11861,6 +11877,11 @@
             <param name="logier"></param>
             <returns></returns>
         </member>
+        <member name="T:FlexJobApi.Core.AlipayUtils">
+            <summary>
+            闃块噷鏀粯宸ュ叿
+            </summary>
+        </member>
         <member name="T:FlexJobApi.Core.AliyunOptions">
             <summary>
             闃块噷浜戦厤缃�
diff --git a/FlexJobApi.Core/Models/UserServer/EnterpriseEmployees/Queries/GetPersonalUserElectronSignQuery.cs b/FlexJobApi.Core/Models/UserServer/EnterpriseEmployees/Queries/GetPersonalUserElectronSignQuery.cs
index cf3f847..267465b 100644
--- a/FlexJobApi.Core/Models/UserServer/EnterpriseEmployees/Queries/GetPersonalUserElectronSignQuery.cs
+++ b/FlexJobApi.Core/Models/UserServer/EnterpriseEmployees/Queries/GetPersonalUserElectronSignQuery.cs
@@ -38,6 +38,11 @@
         public string ContractCode { get; set; }
 
         /// <summary>
+        /// 鍚堝悓妯℃澘閫氶亾
+        /// </summary>
+        public EnumElectronSignAccess? ContractTemplateAccess { get; set; }
+
+        /// <summary>
         /// 鐏靛伐绛剧害鐘舵��
         /// </summary>
         public EnumTaskUserSignContractStatus? UserSignContractStatus { get; set; }
@@ -60,6 +65,12 @@
         public string Identity { get; set; }
 
         /// <summary>
+        /// 绛剧害鏂逛俊鎭�-鍛樺伐-鎵嬫満鍙�
+        /// </summary>
+        /// <remarks>鑱旂郴鐢佃瘽</remarks>
+        public string ContactPhoneNumber { get; set; }
+
+        /// <summary>
         /// 绛剧害鏂逛俊鎭�-鍛樺伐-绛剧害鏃堕棿
         /// </summary>
         public DateTime? UserSignContractTime { get; set; }
diff --git a/FlexJobApi.Core/Utils/AlipayUtils/AlipayOptions.cs b/FlexJobApi.Core/Utils/AlipayUtils/AlipayOptions.cs
new file mode 100644
index 0000000..ee75137
--- /dev/null
+++ b/FlexJobApi.Core/Utils/AlipayUtils/AlipayOptions.cs
@@ -0,0 +1,25 @@
+锘縰sing Furion.ConfigurableOptions;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace FlexJobApi.Core
+{
+    public class AlipayOptions : IConfigurableOptions
+    {
+        public string ServerUrl { get; set; }
+        public string AppId { get; set; }
+        public string PrivateKey { get; set; }
+        public string Format { get; set; }
+        public string Charset { get; set; }
+        public string SignType { get; set; }
+        public string AppCertPath { get; set; }
+        public string AlipayPublicCertPath { get; set; }
+        public string RootCertContent { get; set; }
+        public string AlipayPublicKey { get; set; }
+        public string NotifyUrl { get; set; }
+        public string EncryptKey { get; set; }
+    }
+}
diff --git a/FlexJobApi.Core/Utils/AlipayUtils/AlipayUtils.cs b/FlexJobApi.Core/Utils/AlipayUtils/AlipayUtils.cs
new file mode 100644
index 0000000..d1961de
--- /dev/null
+++ b/FlexJobApi.Core/Utils/AlipayUtils/AlipayUtils.cs
@@ -0,0 +1,72 @@
+锘縰sing Aliyun.OSS;
+using Aop.Api;
+using Aop.Api.Domain;
+using Aop.Api.Request;
+using Aop.Api.Response;
+using Microsoft.Extensions.Options;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace FlexJobApi.Core
+{
+    /// <summary>
+    /// 闃块噷鏀粯宸ュ叿
+    /// </summary>
+    public class AlipayUtils
+    {
+        private readonly IOptions<AlipayOptions> options;
+        private readonly IAopClient alipayClient;
+
+        public AlipayUtils(IOptions<AlipayOptions> options)
+        {
+            alipayClient = new DefaultAopClient(new AlipayConfig
+            {
+                ServerUrl = options.Value.ServerUrl,
+                AppId = options.Value.AppId,
+                PrivateKey = options.Value.PrivateKey,
+                Format = options.Value.Format,
+                Charset = options.Value.Charset,
+                SignType = options.Value.SignType,
+                AppCertPath = options.Value.AppCertPath,
+                AlipayPublicCertPath = options.Value.AlipayPublicCertPath,
+                RootCertContent = options.Value.RootCertContent,
+                AlipayPublicKey = options.Value.AlipayPublicKey,
+                EncryptKey = options.Value.EncryptKey,
+            });
+        }
+
+        public void UserAgreementPageSign(AlipayUserAgreementPageSignModel model)
+        {
+            // 鍒濆鍖朣DK
+            // 鏋勯�犺姹傚弬鏁颁互璋冪敤鎺ュ彛
+            AlipayUserAgreementPageSignRequest request = new AlipayUserAgreementPageSignRequest();
+            model.PersonalProductCode = "FUND_SAFT_SIGN_WITHHOLDING_P";
+            model.SignScene = "INDUSTRY|SATF_ACC";
+            model.ThirdPartyType = "PARTNER";
+            model.AccessParams = new AccessParams
+            {
+                Channel = ""
+            };
+            // 璁剧疆绛剧害鏈夋晥鏃堕棿闄愬埗
+            model.EffectTime = 300;
+
+            request.SetBizModel(model);
+            //request.SetNotifyUrl();
+            AlipayUserAgreementPageSignResponse response = alipayClient.pageExecute(request, null, "GET");
+            string pageRedirectionData = response.Body;
+            Console.WriteLine(pageRedirectionData);
+
+            if (!response.IsError)
+            {
+                Console.WriteLine("璋冪敤鎴愬姛");
+            }
+            else
+            {
+                Console.WriteLine("璋冪敤澶辫触");
+            }
+        }
+    }
+}
diff --git a/FlexJobApi.UserServer.Application/EnterpriseEmployees/Commands/EnterpriseEmployeesCommandHandler.cs b/FlexJobApi.UserServer.Application/EnterpriseEmployees/Commands/EnterpriseEmployeesCommandHandler.cs
index 1836a63..6fdbf87 100644
--- a/FlexJobApi.UserServer.Application/EnterpriseEmployees/Commands/EnterpriseEmployeesCommandHandler.cs
+++ b/FlexJobApi.UserServer.Application/EnterpriseEmployees/Commands/EnterpriseEmployeesCommandHandler.cs
@@ -239,6 +239,7 @@
             entity.EnterpriseSignContractStatus = null;
             entity.EnterpriseSignContractTime = null;
             entity.ContractCode = $"{DateTime.Now:yyyyMMddHHmmss}{new Random(IDGen.NextID().GetHashCode()).Next(1000, 9999)}";
+            entity.ContractUrl = null;
             var contract = new EnterpriseEmployeeContract
             {
                 EnterpriseEmployeeId = entity.Id,
diff --git a/FlexJobApi.UserServer.Application/EnterpriseEmployees/Queries/EnterpriseEmployeeQueryHandler.cs b/FlexJobApi.UserServer.Application/EnterpriseEmployees/Queries/EnterpriseEmployeeQueryHandler.cs
index 0201ebb..073babf 100644
--- a/FlexJobApi.UserServer.Application/EnterpriseEmployees/Queries/EnterpriseEmployeeQueryHandler.cs
+++ b/FlexJobApi.UserServer.Application/EnterpriseEmployees/Queries/EnterpriseEmployeeQueryHandler.cs
@@ -65,7 +65,7 @@
             {
                 q = q.Where(it => (it.UserId.HasValue && it.User.IsReal) == request.IsReal.Value);
             }
-            if (request.UserSignContractStatus.HasValue && logier.ClientType == EnumClientType.Wxmp)
+            if (request.UserSignContractStatus.HasValue)
             {
                 if (logier.ClientType == EnumClientType.Wxmp)
                 {
diff --git "a/FlexJobApi.Web.Entry/AlipayCert/CSR\346\226\207\344\273\266.csr" "b/FlexJobApi.Web.Entry/AlipayCert/CSR\346\226\207\344\273\266.csr"
new file mode 100644
index 0000000..77a8817
--- /dev/null
+++ "b/FlexJobApi.Web.Entry/AlipayCert/CSR\346\226\207\344\273\266.csr"
@@ -0,0 +1,17 @@
+-----BEGIN CERTIFICATE REQUEST-----
+MIICsTCCAZkCAQAwbDEJMAcGA1UEBhMAMQkwBwYDVQQIEwAxCTAHBgNVBAcTADEz
+MDEGA1UECgwq5a6B5rOi5Yib6IOc5L+h5oGv5oqA5pyv5pyN5Yqh5pyJ6ZmQ5YWs
+5Y+4MQkwBwYDVQQLEwAxCTAHBgNVBAMTADCCASIwDQYJKoZIhvcNAQEBBQADggEP
+ADCCAQoCggEBAKA6zoXnrah5BNUWGjYaID/4h1VxLRmVuAPySZ8KSbPuni136V3/
+3nLssKZQ6YHPwV0lBJw2pLVMHHi1zvL3SH/IdMvMqlsGHYMwtMRC2KU66Ct3ZTYk
+oYFZFBHjF4vp9zIY6fTla6onoIAyN2BswwS2OFAFrFwnF5w/q/8SKU/JHlTLW/y6
+1Ji+Vy7wVXJ+TJCUwKHhbdfBEFzixTdfpXaWn/ZPosjNn24FwnOiJzUoBxkh2cIc
+5vbfnBqjXdY7v50DfZR8Cgg0DzJ+nKK9pbD9Z7BH6R6dr3XzRHXHFUkWQf5HbRc1
+xFKUxc58/Psytg9EWvgdBtZ0sbrPcbA9x5sCAwEAAaAAMA0GCSqGSIb3DQEBBAUA
+A4IBAQCcHGqNyh6q7iyImLTi1/VOhwyfphmwETsN/+KNjpkLZN+pUf9hcUsxRObV
+JdcYKdO/WTGGsghBINieKdXGtBlx0wyyM0MADURstr4SWBsktrwunwyyhzufuipx
+d4Wo7kC9hmtOxmJbgn/lXr6tZyTUzukWgEuU5Pxfi9DGPm58Z1fZjHdfuoboeD9n
+mgHPfd+YbuVNSa9wOilBskw35xSLXnUU8tL3PLthHElg43bnbpUOeBvSZ+5uJ9KU
+7zz/1HGOBMl7EY+wMwgpr/5WAKPoAucJU1NEOMKqSHwWfjUEtkeoq87Cij8B0zLt
++WRnGLDsL5vyunOz00uJccxhZlON
+-----END CERTIFICATE REQUEST-----
diff --git a/FlexJobApi.Web.Entry/AlipayCert/alipayCertPublicKey_RSA2.crt b/FlexJobApi.Web.Entry/AlipayCert/alipayCertPublicKey_RSA2.crt
new file mode 100644
index 0000000..a8b7118
--- /dev/null
+++ b/FlexJobApi.Web.Entry/AlipayCert/alipayCertPublicKey_RSA2.crt
@@ -0,0 +1,43 @@
+-----BEGIN CERTIFICATE-----
+MIIDuDCCAqCgAwIBAgIQICQJCUhlwAIx+IQXPEEzhzANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UE
+BhMCQ04xFjAUBgNVBAoMDUFudCBGaW5hbmNpYWwxIDAeBgNVBAsMF0NlcnRpZmljYXRpb24gQXV0
+aG9yaXR5MTkwNwYDVQQDDDBBbnQgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5IENs
+YXNzIDIgUjEwHhcNMjQwOTA5MDYxMDM3WhcNMjkwOTA4MDYxMDM3WjCBmDELMAkGA1UEBhMCQ04x
+MzAxBgNVBAoMKuWugeazouWIm+iDnOS/oeaBr+aKgOacr+acjeWKoeaciemZkOWFrOWPuDEPMA0G
+A1UECwwGQWxpcGF5MUMwQQYDVQQDDDrmlK/ku5jlrp0o5Lit5Zu9Kee9kee7nOaKgOacr+aciemZ
+kOWFrOWPuC0yMDg4MDUwNTQyMDQyMzAxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA
+h3ymDiC0//upxAEwekcap2S/soSgtxZsT+W+a/nOg1yF/IpJshpiAcj246BqihSD6q3CEjAYj80c
+MnZJG/lfir/BRz1pGyCAKVWcyISj4DR+ADfehHa6XJh7BNMUhscKvB0SeFFL4HGUA/PgpnO/mEO5
+PKai3o8UzwQu/atEja5TCDUqSogrTkLrYq+Dlmjc8UQENuWUx0PlnwnLrYpx4hIC3PjzpDSy8FCO
+maHVG1JHyv+Nxng2//szWD9l2LGx4F1qe5jsYAgfE3aP2U5ryggZAgejBTKu6kBTMslsCFJIesG4
+8OC3OGk0ZafVujUaGSrFbYQHZtUQkdiU1oVVGwIDAQABoxIwEDAOBgNVHQ8BAf8EBAMCA/gwDQYJ
+KoZIhvcNAQELBQADggEBAG/AwOEBETOShrkCIW/ViAYf/UopgL6txP7laTbAbI/xLJyy657S/ESs
+MBLTqzuRt2e5kVdZZAq/8Bs4jscEYoiTpDB0vmWXtvjYumKyINeRuIBqn2PIESrm34WrJATkvLpj
+2QRioL+rU1eXq2rYBpryFa+QNkEPb7xU7uadYvnNsBrZB8OF8QVOssbhfCbRnIv8zaaQYd9iTXPa
+7TQXwkudtamLry1x9F7J+icmoPfxa9i/yMiBm4YOD30LLBvS3YRXZCcVRxjgtv7/HQ4l4vNS0BTb
+4Qj9k9X1IyjF2IJgfW5EoA/pvPs/ZXQzOgGzz0ncBMU4YqR3wlT/U3094UY=
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIE4jCCAsqgAwIBAgIIYsSr5bKAMl8wDQYJKoZIhvcNAQELBQAwejELMAkGA1UEBhMCQ04xFjAU
+BgNVBAoMDUFudCBGaW5hbmNpYWwxIDAeBgNVBAsMF0NlcnRpZmljYXRpb24gQXV0aG9yaXR5MTEw
+LwYDVQQDDChBbnQgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5IFIxMB4XDTE4MDMy
+MjE0MzQxNVoXDTM3MTEyNjE0MzQxNVowgYIxCzAJBgNVBAYTAkNOMRYwFAYDVQQKDA1BbnQgRmlu
+YW5jaWFsMSAwHgYDVQQLDBdDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTE5MDcGA1UEAwwwQW50IEZp
+bmFuY2lhbCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBDbGFzcyAyIFIxMIIBIjANBgkqhkiG9w0B
+AQEFAAOCAQ8AMIIBCgKCAQEAsLMfYaoRoPRbmDcAfXPCmKf43pWRN5yTXa/KJWO0l+mrgQvs89bA
+NEvbDUxlkGwycwtwi5DgBuBgVhLliXu+R9CYgr2dXs8D8Hx/gsggDcyGPLmVrDOnL+dyeauheARZ
+fA3du60fwEwwbGcVIpIxPa/4n3IS/ElxQa6DNgqxh8J9Xwh7qMGl0JK9+bALuxf7B541Gr4p0WEN
+G8fhgjBV4w4ut9eQLOoa1eddOUSZcy46Z7allwowwgt7b5VFfx/P1iKJ3LzBMgkCK7GZ2kiLrL7R
+iqV+h482J7hkJD+ardoc6LnrHO/hIZymDxok+VH9fVeUdQa29IZKrIDVj65THQIDAQABo2MwYTAf
+BgNVHSMEGDAWgBRfdLQEwE8HWurlsdsio4dBspzhATAdBgNVHQ4EFgQUSqHkYINtUSAtDPnS8Xoy
+oP9p7qEwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwDQYJKoZIhvcNAQELBQADggIB
+AIQ8TzFy4bVIVb8+WhHKCkKNPcJe2EZuIcqvRoi727lZTJOfYy/JzLtckyZYfEI8J0lasZ29wkTt
+a1IjSo+a6XdhudU4ONVBrL70U8Kzntplw/6TBNbLFpp7taRALjUgbCOk4EoBMbeCL0GiYYsTS0mw
+7xdySzmGQku4GTyqutIGPQwKxSj9iSFw1FCZqr4VP4tyXzMUgc52SzagA6i7AyLedd3tbS6lnR5B
+L+W9Kx9hwT8L7WANAxQzv/jGldeuSLN8bsTxlOYlsdjmIGu/C9OWblPYGpjQQIRyvs4Cc/mNhrh+
+14EQgwuemIIFDLOgcD+iISoN8CqegelNcJndFw1PDN6LkVoiHz9p7jzsge8RKay/QW6C03KNDpWZ
+EUCgCUdfHfo8xKeR+LL1cfn24HKJmZt8L/aeRZwZ1jwePXFRVtiXELvgJuM/tJDIFj2KD337iV64
+fWcKQ/ydDVGqfDZAdcU4hQdsrPWENwPTQPfVPq2NNLMyIH9+WKx9Ed6/WzeZmIy5ZWpX1TtTolo6
+OJXQFeItMAjHxW/ZSZTok5IS3FuRhExturaInnzjYpx50a6kS34c5+c8hYq7sAtZ/CNLZmBnBCFD
+aMQqT8xFZJ5uolUaSeXxg7JFY1QsYp5RKvj4SjFwCGKJ2+hPPe9UyyltxOidNtxjaknOCeBHytOr
+-----END CERTIFICATE-----
diff --git a/FlexJobApi.Web.Entry/AlipayCert/alipayRootCert.crt b/FlexJobApi.Web.Entry/AlipayCert/alipayRootCert.crt
new file mode 100644
index 0000000..76417c5
--- /dev/null
+++ b/FlexJobApi.Web.Entry/AlipayCert/alipayRootCert.crt
@@ -0,0 +1,88 @@
+-----BEGIN CERTIFICATE-----
+MIIBszCCAVegAwIBAgIIaeL+wBcKxnswDAYIKoEcz1UBg3UFADAuMQswCQYDVQQG
+EwJDTjEOMAwGA1UECgwFTlJDQUMxDzANBgNVBAMMBlJPT1RDQTAeFw0xMjA3MTQw
+MzExNTlaFw00MjA3MDcwMzExNTlaMC4xCzAJBgNVBAYTAkNOMQ4wDAYDVQQKDAVO
+UkNBQzEPMA0GA1UEAwwGUk9PVENBMFkwEwYHKoZIzj0CAQYIKoEcz1UBgi0DQgAE
+MPCca6pmgcchsTf2UnBeL9rtp4nw+itk1Kzrmbnqo05lUwkwlWK+4OIrtFdAqnRT
+V7Q9v1htkv42TsIutzd126NdMFswHwYDVR0jBBgwFoAUTDKxl9kzG8SmBcHG5Yti
+W/CXdlgwDAYDVR0TBAUwAwEB/zALBgNVHQ8EBAMCAQYwHQYDVR0OBBYEFEwysZfZ
+MxvEpgXBxuWLYlvwl3ZYMAwGCCqBHM9VAYN1BQADSAAwRQIgG1bSLeOXp3oB8H7b
+53W+CKOPl2PknmWEq/lMhtn25HkCIQDaHDgWxWFtnCrBjH16/W3Ezn7/U/Vjo5xI
+pDoiVhsLwg==
+-----END CERTIFICATE-----
+
+-----BEGIN CERTIFICATE-----
+MIIF0zCCA7ugAwIBAgIIH8+hjWpIDREwDQYJKoZIhvcNAQELBQAwejELMAkGA1UE
+BhMCQ04xFjAUBgNVBAoMDUFudCBGaW5hbmNpYWwxIDAeBgNVBAsMF0NlcnRpZmlj
+YXRpb24gQXV0aG9yaXR5MTEwLwYDVQQDDChBbnQgRmluYW5jaWFsIENlcnRpZmlj
+YXRpb24gQXV0aG9yaXR5IFIxMB4XDTE4MDMyMTEzNDg0MFoXDTM4MDIyODEzNDg0
+MFowejELMAkGA1UEBhMCQ04xFjAUBgNVBAoMDUFudCBGaW5hbmNpYWwxIDAeBgNV
+BAsMF0NlcnRpZmljYXRpb24gQXV0aG9yaXR5MTEwLwYDVQQDDChBbnQgRmluYW5j
+aWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5IFIxMIICIjANBgkqhkiG9w0BAQEF
+AAOCAg8AMIICCgKCAgEAtytTRcBNuur5h8xuxnlKJetT65cHGemGi8oD+beHFPTk
+rUTlFt9Xn7fAVGo6QSsPb9uGLpUFGEdGmbsQ2q9cV4P89qkH04VzIPwT7AywJdt2
+xAvMs+MgHFJzOYfL1QkdOOVO7NwKxH8IvlQgFabWomWk2Ei9WfUyxFjVO1LVh0Bp
+dRBeWLMkdudx0tl3+21t1apnReFNQ5nfX29xeSxIhesaMHDZFViO/DXDNW2BcTs6
+vSWKyJ4YIIIzStumD8K1xMsoaZBMDxg4itjWFaKRgNuPiIn4kjDY3kC66Sl/6yTl
+YUz8AybbEsICZzssdZh7jcNb1VRfk79lgAprm/Ktl+mgrU1gaMGP1OE25JCbqli1
+Pbw/BpPynyP9+XulE+2mxFwTYhKAwpDIDKuYsFUXuo8t261pCovI1CXFzAQM2w7H
+DtA2nOXSW6q0jGDJ5+WauH+K8ZSvA6x4sFo4u0KNCx0ROTBpLif6GTngqo3sj+98
+SZiMNLFMQoQkjkdN5Q5g9N6CFZPVZ6QpO0JcIc7S1le/g9z5iBKnifrKxy0TQjtG
+PsDwc8ubPnRm/F82RReCoyNyx63indpgFfhN7+KxUIQ9cOwwTvemmor0A+ZQamRe
+9LMuiEfEaWUDK+6O0Gl8lO571uI5onYdN1VIgOmwFbe+D8TcuzVjIZ/zvHrAGUcC
+AwEAAaNdMFswCwYDVR0PBAQDAgEGMAwGA1UdEwQFMAMBAf8wHQYDVR0OBBYEFF90
+tATATwda6uWx2yKjh0GynOEBMB8GA1UdIwQYMBaAFF90tATATwda6uWx2yKjh0Gy
+nOEBMA0GCSqGSIb3DQEBCwUAA4ICAQCVYaOtqOLIpsrEikE5lb+UARNSFJg6tpkf
+tJ2U8QF/DejemEHx5IClQu6ajxjtu0Aie4/3UnIXop8nH/Q57l+Wyt9T7N2WPiNq
+JSlYKYbJpPF8LXbuKYG3BTFTdOVFIeRe2NUyYh/xs6bXGr4WKTXb3qBmzR02FSy3
+IODQw5Q6zpXj8prYqFHYsOvGCEc1CwJaSaYwRhTkFedJUxiyhyB5GQwoFfExCVHW
+05ZFCAVYFldCJvUzfzrWubN6wX0DD2dwultgmldOn/W/n8at52mpPNvIdbZb2F41
+T0YZeoWnCJrYXjq/32oc1cmifIHqySnyMnavi75DxPCdZsCOpSAT4j4lAQRGsfgI
+kkLPGQieMfNNkMCKh7qjwdXAVtdqhf0RVtFILH3OyEodlk1HYXqX5iE5wlaKzDop
+PKwf2Q3BErq1xChYGGVS+dEvyXc/2nIBlt7uLWKp4XFjqekKbaGaLJdjYP5b2s7N
+1dM0MXQ/f8XoXKBkJNzEiM3hfsU6DOREgMc1DIsFKxfuMwX3EkVQM1If8ghb6x5Y
+jXayv+NLbidOSzk4vl5QwngO/JYFMkoc6i9LNwEaEtR9PhnrdubxmrtM+RjfBm02
+77q3dSWFESFQ4QxYWew4pHE0DpWbWy/iMIKQ6UZ5RLvB8GEcgt8ON7BBJeMc+Dyi
+kT9qhqn+lw==
+-----END CERTIFICATE-----
+
+-----BEGIN CERTIFICATE-----
+MIICiDCCAgygAwIBAgIIQX76UsB/30owDAYIKoZIzj0EAwMFADB6MQswCQYDVQQG
+EwJDTjEWMBQGA1UECgwNQW50IEZpbmFuY2lhbDEgMB4GA1UECwwXQ2VydGlmaWNh
+dGlvbiBBdXRob3JpdHkxMTAvBgNVBAMMKEFudCBGaW5hbmNpYWwgQ2VydGlmaWNh
+dGlvbiBBdXRob3JpdHkgRTEwHhcNMTkwNDI4MTYyMDQ0WhcNNDkwNDIwMTYyMDQ0
+WjB6MQswCQYDVQQGEwJDTjEWMBQGA1UECgwNQW50IEZpbmFuY2lhbDEgMB4GA1UE
+CwwXQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxMTAvBgNVBAMMKEFudCBGaW5hbmNp
+YWwgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgRTEwdjAQBgcqhkjOPQIBBgUrgQQA
+IgNiAASCCRa94QI0vR5Up9Yr9HEupz6hSoyjySYqo7v837KnmjveUIUNiuC9pWAU
+WP3jwLX3HkzeiNdeg22a0IZPoSUCpasufiLAnfXh6NInLiWBrjLJXDSGaY7vaokt
+rpZvAdmjXTBbMAsGA1UdDwQEAwIBBjAMBgNVHRMEBTADAQH/MB0GA1UdDgQWBBRZ
+4ZTgDpksHL2qcpkFkxD2zVd16TAfBgNVHSMEGDAWgBRZ4ZTgDpksHL2qcpkFkxD2
+zVd16TAMBggqhkjOPQQDAwUAA2gAMGUCMQD4IoqT2hTUn0jt7oXLdMJ8q4vLp6sg
+wHfPiOr9gxreb+e6Oidwd2LDnC4OUqCWiF8CMAzwKs4SnDJYcMLf2vpkbuVE4dTH
+Rglz+HGcTLWsFs4KxLsq7MuU+vJTBUeDJeDjdA==
+-----END CERTIFICATE-----
+
+-----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-----
\ No newline at end of file
diff --git a/FlexJobApi.Web.Entry/AlipayCert/appCertPublicKey_2021004171602214.crt b/FlexJobApi.Web.Entry/AlipayCert/appCertPublicKey_2021004171602214.crt
new file mode 100644
index 0000000..5c51322
--- /dev/null
+++ b/FlexJobApi.Web.Entry/AlipayCert/appCertPublicKey_2021004171602214.crt
@@ -0,0 +1,23 @@
+-----BEGIN CERTIFICATE-----
+MIIEpjCCA46gAwIBAgIQICQJGZ4C8uub1cYcy9fcxjANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UE
+BhMCQ04xFjAUBgNVBAoMDUFudCBGaW5hbmNpYWwxIDAeBgNVBAsMF0NlcnRpZmljYXRpb24gQXV0
+aG9yaXR5MTkwNwYDVQQDDDBBbnQgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5IENs
+YXNzIDEgUjEwHhcNMjQwOTE5MDE1NTU0WhcNMjkwOTE4MDE1NTU0WjBuMQswCQYDVQQGEwJDTjEz
+MDEGA1UECgwq5a6B5rOi5Yib6IOc5L+h5oGv5oqA5pyv5pyN5Yqh5pyJ6ZmQ5YWs5Y+4MQ8wDQYD
+VQQLDAZBbGlwYXkxGTAXBgNVBAMMEDIwODgwNTA1NDIwNDIzMDEwggEiMA0GCSqGSIb3DQEBAQUA
+A4IBDwAwggEKAoIBAQCgOs6F562oeQTVFho2GiA/+IdVcS0ZlbgD8kmfCkmz7p4td+ld/95y7LCm
+UOmBz8FdJQScNqS1TBx4tc7y90h/yHTLzKpbBh2DMLTEQtilOugrd2U2JKGBWRQR4xeL6fcyGOn0
+5WuqJ6CAMjdgbMMEtjhQBaxcJxecP6v/EilPyR5Uy1v8utSYvlcu8FVyfkyQlMCh4W3XwRBc4sU3
+X6V2lp/2T6LIzZ9uBcJzoic1KAcZIdnCHOb235wao13WO7+dA32UfAoINA8yfpyivaWw/WewR+ke
+na9180R1xxVJFkH+R20XNcRSlMXOfPz7MrYPRFr4HQbWdLG6z3GwPcebAgMBAAGjggEpMIIBJTAf
+BgNVHSMEGDAWgBRxB+IEYRbk5fJl6zEPyeD0PJrVkTAdBgNVHQ4EFgQULdtiYUNb4gMQ6z6BVDjw
+ZeUYthwwQAYDVR0gBDkwNzA1BgdggRwBbgEBMCowKAYIKwYBBQUHAgEWHGh0dHA6Ly9jYS5hbGlw
+YXkuY29tL2Nwcy5wZGYwDgYDVR0PAQH/BAQDAgbAMC8GA1UdHwQoMCYwJKAioCCGHmh0dHA6Ly9j
+YS5hbGlwYXkuY29tL2NybDkzLmNybDBgBggrBgEFBQcBAQRUMFIwKAYIKwYBBQUHMAKGHGh0dHA6
+Ly9jYS5hbGlwYXkuY29tL2NhNi5jZXIwJgYIKwYBBQUHMAGGGmh0dHA6Ly9jYS5hbGlwYXkuY29t
+OjgzNDAvMA0GCSqGSIb3DQEBCwUAA4IBAQBzK7WLZwwHwEPZXm6VHNaO6PfLEqJDEf6zz15VPBr/
+/yUGGHXReyfK5pHTh9EaFvNJTCWH/DHaUr0sf05w2bfxY3ZWCGFf6+qS+FqOq6V3AfXDphWlNSK9
+jS5/tJc89Hr33HW4btsLwpcEqTweN16l3n5oIaJ9Zfi7zRQtPyUaVrtKAyMt8WeZ1gq1qjAAMmjG
+RHy9/LpihPemAhuKuPHpFPvksO7RAaKGlY42pg+LxdXLNECJR57rKiWKrrITDM16xJAOTBFK8caH
+MdkDrdiA6z/LsrGwiNBYb7N7t40gPdCJoVIlP0qkrzpqGg+KxwYDLmYX5LlpPdP9Tfz5y/t9
+-----END CERTIFICATE-----
\ No newline at end of file
diff --git a/FlexJobApi.Web.Entry/Startup.cs b/FlexJobApi.Web.Entry/Startup.cs
index 99bc46f..d6421ec 100644
--- a/FlexJobApi.Web.Entry/Startup.cs
+++ b/FlexJobApi.Web.Entry/Startup.cs
@@ -25,6 +25,7 @@
             services.AddHealthChecks();
 
             services.AddConfigurableOptions<WxmpOptions>();
+            services.AddConfigurableOptions<AlipayOptions>();
             services.AddConfigurableOptions<AliyunOptions>();
             services.AddConfigurableOptions<BaiduOptions>();
 
diff --git a/FlexJobApi.Web.Entry/appsettings.json b/FlexJobApi.Web.Entry/appsettings.json
index 42ac25d..ac166a8 100644
--- a/FlexJobApi.Web.Entry/appsettings.json
+++ b/FlexJobApi.Web.Entry/appsettings.json
@@ -47,6 +47,20 @@
       }
     ]
   },
+  "AliPay": {
+    "ServerUrl": "https://openapi.alipay.com/gateway.do",
+    "AppId": "2021004171602214",
+    "PrivateKey": "MIIEogIBAAKCAQEAoDrOheetqHkE1RYaNhogP/iHVXEtGZW4A/JJnwpJs+6eLXfpXf/ecuywplDpgc/BXSUEnDaktUwceLXO8vdIf8h0y8yqWwYdgzC0xELYpTroK3dlNiShgVkUEeMXi+n3Mhjp9OVrqieggDI3YGzDBLY4UAWsXCcXnD+r/xIpT8keVMtb/LrUmL5XLvBVcn5MkJTAoeFt18EQXOLFN1+ldpaf9k+iyM2fbgXCc6InNSgHGSHZwhzm9t+cGqNd1ju/nQN9lHwKCDQPMn6cor2lsP1nsEfpHp2vdfNEdccVSRZB/kdtFzXEUpTFznz8+zK2D0Ra+B0G1nSxus9xsD3HmwIDAQABAoIBACQYm2X3J1wIx1npvMXrZNCEgJhzAqH85JOfBY7alnf+jYvYs64FcmuZfsI5ACHKV9lP+ZXniXt+Rfu7mX+Kzb5bvlQbK1WOLx/a3R5JoNy4RI1mPFrSLcAh/S96ZVeTwah7jFkrRfHzM2kt5uPGHLj3BACjBo1METmV7n1r7fqXCus/Eihdo5ah8WOUPPMg8MqLadSnKVgnkzDLEa+8bagN/WgNfg9m4nW3IocEtFmKox3xV938eXpzn6KrgCduyK1Xn3d1PViRDT1QFOqhTCg17j8qDD4xZphH32Vbgq+heURmSMfecmC1u0CEpvFq3WBVxir/VOxk88gqkAzwusECgYEA+x/OjjNYaeOTFxCLtcI6EnerwgisF39rSNVAdSziWO3u8tUhzhHxB1cE5im4f9Qsd+r3Mw7Vu26YHgQn9O/A1QGoU3e0W/0Ckz5iIIJdAqBB279lNN+puYo4lIUfZha00i/R3Sj6eXrKGTwqCPRyHvJUC7biAAUgnqDAPLdPpgkCgYEAo1c3P4saxVqPnGheplud+jpEilp92dwHn9nIsaX0A/ohcYQIes+bKEZHHafn7ksDhidcjrbPMK72PP2HOJOL6D8a2w9zdyZ6jlycV5jiFHB6ywmkJ0517HWAJ6Fl3OsltDrxWHnuiyb/G/2fU1uLsO2U/b7zT9s2zXJzN53ZiYMCgYAmVku9T79eovxwl/kMLXOaICTbgWFsUOp6+vtVKB4B/4jsD3eSsxB9014PGS1ubmC/ieJlLA2bCJ42buH+tZ9VpWQiIfMp2+1Jt0tZtS0n2nlTZ9u2f7K0fZJ3sf8CIdNHBz/dqITciM9TnOi55z+I0+vawfeskxvQu6+9VSrWqQKBgD55voUMhMnVsLZnaUSCKHOsU8kDgb2Rnkzy9QOV8TaQNrh/gurOe481CkB6l4iaopdueMWRgMAjO8XqRw1Jyiqj8Ha3ezeovRm0rIwIyvh8aUs9vc7XAN3Xt5Pw9NBCFOLR5LwtryMEYHFpWcZ9bnnW9bT0k4YI1/ZO/2jXdHxXAoGAQLGrsed0HLWRjGU2rAUvA9Kny6wo+ScUas5IhoAhGMYDDQ8lFbndgnIOMjdXllT9IvmVERMTSMmP2m7+aqKNz3x0kTkg0tIQTLPsaWCjI5G4CDASUPo/jPvcd4h3euclhpuhcU9FMme3R5UhMAZy1bt+1VWPRxRB0gzWi4d7AFQ=",
+    "Format": "json",
+    "Charset": "UTF-8",
+    "SignType": "RSA2",
+    "AppCertPath": "AlipayCert/appCertPublicKey_2021004171602214.crt",
+    "AlipayPublicCertPath": "AlipayCert/alipayCertPublicKey_RSA2.crt",
+    "RootCertContent": "AlipayCert/alipayRootCert.crt",
+    "NotifyUrl": "https://testfj.81812333.com",
+    "EncryptKey": "jjy8A7hB/1Bkhg+8FtXyyg==",
+    "AlipayPublicKey": "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAoDrOheetqHkE1RYaNhogP/iHVXEtGZW4A/JJnwpJs+6eLXfpXf/ecuywplDpgc/BXSUEnDaktUwceLXO8vdIf8h0y8yqWwYdgzC0xELYpTroK3dlNiShgVkUEeMXi+n3Mhjp9OVrqieggDI3YGzDBLY4UAWsXCcXnD+r/xIpT8keVMtb/LrUmL5XLvBVcn5MkJTAoeFt18EQXOLFN1+ldpaf9k+iyM2fbgXCc6InNSgHGSHZwhzm9t+cGqNd1ju/nQN9lHwKCDQPMn6cor2lsP1nsEfpHp2vdfNEdccVSRZB/kdtFzXEUpTFznz8+zK2D0Ra+B0G1nSxus9xsD3HmwIDAQAB"
+  },
   "Aliyun": {
     "OSS": {
       "AccessKeyId": "LTAI4GAdJ88mUMMFBHHiyDmS",

--
Gitblit v1.9.1