瀏覽代碼

refactor: getClient统一使用公钥证书模式,去除公私钥共存判断

alphaH 1 天之前
父節點
當前提交
174446ebac

+ 5 - 9
java/src/main/java/com/payment/platform/core/alipay/AlipayClientFactory.java

@@ -234,17 +234,13 @@ public class AlipayClientFactory {
         AlipayConfig config = buildSdkConfig(
                 sp.getAppId(), sp.getAppPrivateKey(), sp.getAlipayPublicKey(),
                 sp.getServerUrl(), sp.getFormat(), sp.getCharset(), sp.getSignType());
-        // 证书模式: 资金类接口必须使用公钥证书(接入指南要求)
-        if (sp.getAppCertContent() != null && !sp.getAppCertContent().isBlank()) {
-            config.setAppCertContent(sp.getAppCertContent());
-            config.setAlipayPublicCertContent(sp.getAlipayPublicCertContent());
-            config.setRootCertContent(sp.getRootCertContent());
-        }
+        // 资金类接口统一使用公钥证书模式
+        config.setAppCertContent(sp.getAppCertContent());
+        config.setAlipayPublicCertContent(sp.getAlipayPublicCertContent());
+        config.setRootCertContent(sp.getRootCertContent());
         try {
             AlipayClient client = new DefaultAlipayClient(config);
-            log.info("服务商[{}]客户端创建成功, appId={}, name={}, mode={}",
-                    providerId, sp.getAppId(), sp.getName(),
-                    sp.getAppCertContent() != null ? "cert" : "key");
+            log.info("服务商[{}]客户端创建成功, appId={}, name={}, mode=cert", providerId, sp.getAppId(), sp.getName());
             return client;
         } catch (AlipayApiException e) {
             log.error("服务商[{}]客户端创建失败", providerId, e);

+ 208 - 0
logs/payment-platform-error.log

@@ -1622,3 +1622,211 @@ Caused by: org.postgresql.util.PSQLException: ERROR: column "transfer_enabled" d
 2026-07-15 17:02:55.903 [tomcat-handler-9] ERROR sdk.biz.err - ErrorScene^_^40004^_^INVALID_PARAMETER^_^null^_^Windows 10^_^2026-07-15 17:02:55^_^ProtocalMustParams:charset=UTF-8&method=alipay.fund.accountbook.query&sign=nVv95PwrLBqh4OAMSzrOScgjqrSFa760eMQSSvNu5epAAdk2uyGkweZNeLnDJgGNWHHbsSpEZ8+VetmwKBZBgMNhJmtZ/RgVA2sorAWUDMTmM86xLNkPEOrlhLEnKthwx8A0AqLrsBoqhefnlSo4nEzbsGBgp6RXJYw/twpcyPzQoBHWPp3aQlwoXE/nMzV+Si3Txk2r1qNIPX7uKKayd/zJbwB+FcW93p8oHhk1iJum8Mi+sQfNwgAH9RZhM6j+SRto4vb0QsyfFYF/Qwez8TJGH8Zu599GPfITkoHFrNC78SgRAsM+ERKPgCymhV7TgfKY8LvkZ9/3+LNu+Rhy5w==&version=1.0&app_id=2021006160682088&sign_type=RSA2&timestamp=2026-07-15 17:02:55^_^ProtocalOptParams:alipay_sdk=alipay-sdk-java-4.40.865.ALL&format=JSON^_^ApplicationParams:traceId=0b426f4c17841061762485770e2f14&biz_content={"account_book_id":"123","ext_info":"{\"agreement_no\":\"20265515324430130114\"}","scene_code":"SATF_FUND_BOOK"}^_^Body:{"alipay_fund_accountbook_query_response":{"msg":"Business Failed","code":"40004","sub_msg":"参数有误用户不存在,userId=123","sub_code":"INVALID_PARAMETER"},"sign":"UYgE32xozKDtAruYowEdJFNYe+VlMzscde7LCiU6odG6UVBGAM8i0UbLmiBuIkhMAzwR4bqedYJGEha7KwZ6qZwGRLtFJknZINrupt8+0kKA3ofQzhP1NX2HlLKHapd6T8NLe9Q1znn/eC3EBEAXQrz54nrB9mMwpKmKzGa6RbwJGHFfM7uZuB1LEu5jqkarNpIMS/yFWl6vN7iQWRrcryez/7ySvk5b9Fp4YniNeZwComAiisq+wjvyNAc6PNd4Ikco9KqHs8+LpANClMNLlu8c++/WSZSZ6HwxB6GwTk0DVJ02kgPpkyJclAihRYJ+6U8LfPz8nMpRfYPygk4dWA=="}^_^10ms,251ms,10ms^_^trace_id:0b426f4c17841061762485770e2f14
 2026-07-15 17:02:56.550 [tomcat-handler-11] ERROR sdk.biz.err - ErrorScene^_^40004^_^INVALID_PARAMETER^_^null^_^Windows 10^_^2026-07-15 17:02:56^_^ProtocalMustParams:charset=UTF-8&method=alipay.fund.accountbook.query&sign=Iz96CRuxwXa3k3MYqN1Wf8eBwVdfIS0vhobxmVctf47vr89U8mtMaSIY97+ktwY+bIx2vrh6prlnqhmVT2IOAgTYTqtcTZvoM8lmKS2Cag346mbF7wgKi4u26UG7ax0Cn5e8oBxpRrukBbQwlsxs18RuW6CDAaHSaQsFU3b8awVZcYmn9Qk2tzyiaZBZIrjPf+LWP2s6ypKvKqF1MOHNjafZBqDMaw6ZXLLVErY7MMSRN4yzzpE7osOMqdaiaHDmK6DC76bdWzm3fuO+EiTKRy+JJ3fwv28OoBqz+LsR3Lel8nQqFPCuC3gkQ7JHspNn2SCKXQ+40Uav2eXexPp6XA==&version=1.0&app_id=2021006160682088&sign_type=RSA2&timestamp=2026-07-15 17:02:56^_^ProtocalOptParams:alipay_sdk=alipay-sdk-java-4.40.865.ALL&format=JSON^_^ApplicationParams:traceId=0b426f4c17841061769565823e2f14&biz_content={"account_book_id":"123","ext_info":"{\"agreement_no\":\"20265515324430130114\"}","scene_code":"SATF_FUND_BOOK"}^_^Body:{"alipay_fund_accountbook_query_response":{"msg":"Business Failed","code":"40004","sub_msg":"参数有误用户不存在,userId=123","sub_code":"INVALID_PARAMETER"},"sign":"UYgE32xozKDtAruYowEdJFNYe+VlMzscde7LCiU6odG6UVBGAM8i0UbLmiBuIkhMAzwR4bqedYJGEha7KwZ6qZwGRLtFJknZINrupt8+0kKA3ofQzhP1NX2HlLKHapd6T8NLe9Q1znn/eC3EBEAXQrz54nrB9mMwpKmKzGa6RbwJGHFfM7uZuB1LEu5jqkarNpIMS/yFWl6vN7iQWRrcryez/7ySvk5b9Fp4YniNeZwComAiisq+wjvyNAc6PNd4Ikco9KqHs8+LpANClMNLlu8c++/WSZSZ6HwxB6GwTk0DVJ02kgPpkyJclAihRYJ+6U8LfPz8nMpRfYPygk4dWA=="}^_^10ms,137ms,9ms^_^trace_id:0b426f4c17841061769565823e2f14
 2026-07-15 17:03:51.541 [tomcat-handler-15] ERROR sdk.biz.err - ErrorScene^_^40004^_^INVALID_PARAMETER^_^null^_^Windows 10^_^2026-07-15 17:03:51^_^ProtocalMustParams:charset=UTF-8&method=alipay.fund.accountbook.query&sign=GK2uAGCJ5zleyZ89r6QLv2XrEpxjtOLt7MYncQZ8A3igXp72SAKOzkpUeYgqZ6u+9AZm2FugPHzi/hSYGqDbMxBcU8601p0fPxRTKdb7bkS4XJakDE5aoxLw/Se3EYi4WrNQDUE8xTC4PYSIT1uLHS9t60o80YlvrilQg06fByWZqT1F+VGC6atdLNr1zrg4FrUTDeipPymnI+pN2XxWZS2FgqIxf6G6/vmsaksBnmCYdNEyzbA2abt56PMBl0g26aSiAwCVst/iFLleEEmuSnuh+ZJ5bMKOm+f8+mmu7AWeBADr4d0SNz9SI5ZSjDnP9Nl0zCactQiBVit2yjfb2w==&version=1.0&app_id=2021006160682088&sign_type=RSA2&timestamp=2026-07-15 17:03:51^_^ProtocalOptParams:alipay_sdk=alipay-sdk-java-4.40.865.ALL&format=JSON^_^ApplicationParams:traceId=0b216cd117841062319125341eea7a&biz_content={"account_book_id":"123","ext_info":"{\"agreement_no\":\"20265515324430130114\"}","scene_code":"SATF_FUND_BOOK"}^_^Body:{"alipay_fund_accountbook_query_response":{"msg":"Business Failed","code":"40004","sub_msg":"参数有误用户不存在,userId=123","sub_code":"INVALID_PARAMETER"},"sign":"UYgE32xozKDtAruYowEdJFNYe+VlMzscde7LCiU6odG6UVBGAM8i0UbLmiBuIkhMAzwR4bqedYJGEha7KwZ6qZwGRLtFJknZINrupt8+0kKA3ofQzhP1NX2HlLKHapd6T8NLe9Q1znn/eC3EBEAXQrz54nrB9mMwpKmKzGa6RbwJGHFfM7uZuB1LEu5jqkarNpIMS/yFWl6vN7iQWRrcryez/7ySvk5b9Fp4YniNeZwComAiisq+wjvyNAc6PNd4Ikco9KqHs8+LpANClMNLlu8c++/WSZSZ6HwxB6GwTk0DVJ02kgPpkyJclAihRYJ+6U8LfPz8nMpRfYPygk4dWA=="}^_^9ms,243ms,9ms^_^trace_id:0b216cd117841062319125341eea7a
+2026-07-15 17:08:35.850 [tomcat-handler-4] ERROR sdk.biz.err - ErrorScene^_^40002^_^isv.missing-app-cert-sn^_^null^_^Windows 10^_^2026-07-15 17:08:35^_^ProtocalMustParams:charset=UTF-8&method=alipay.fund.trans.uni.transfer&sign=J4X/RgwHDqOMwvcu1dc4mRKT5Yc3G/imlmpcRUXjDrilEsiSOYQuBufklmH4sJAHtIOfEjmOQAhS62sBgShhpwEaOrnT+ceoX9mq/kgeB0VVjhL2w9XsrUu41yyxKqK715URjjDYBQllRSwKYUa0gbtJdOiptknICn+BWgSVJenBtfLWph6Mu9wUdCLpZpJCNTwTZojrC98ud8D9TUxj/2CyXtguPiYP4+yXP2OdLzotMg8ymwaibrWgkuEj1lMjcE4jn6tJJgMJS+i2X3vsa08+MojE5eJ4R4LJfUEz5UIwhrYsdtdXTNDcxEru9x7t5oZgy+Spc7QDIs24gCtqQA==&version=1.0&app_id=2021006160682088&sign_type=RSA2&timestamp=2026-07-15 17:08:35^_^ProtocalOptParams:alipay_sdk=alipay-sdk-java-4.40.865.ALL&format=JSON^_^ApplicationParams:traceId=21d7001617841065162606634eb19a&biz_content={"biz_scene":"ENTRUST_TRANSFER","order_title":"测试","out_biz_no":"1274816966430822400","payee_info":{"identity":"13574819605","identity_type":"alipay","name":"黄昊"},"payer_info":{"ext_info":"{\"agreement_no\":\"20265515324430130114\"}","identity":"123","identity_type":"ACCOUNT_BOOK_ID"},"product_code":"SINGLE_TRANSFER_NO_PWD","trans_amount":"1"}^_^Body:{"alipay_fund_trans_uni_transfer_response":{"code":"40002","msg":"Invalid Arguments","sub_code":"isv.missing-app-cert-sn","sub_msg":"缺少应用公钥证书序列号,解决方案:https://open.alipay.com/api/errCheck?traceId=21d7001617841065162606634eb19a&source=openapi"},"sign":"et3d+Zg4NprOhmsXD/iAtBDZSGNdEekrtIUl+Rumpsm/64j4nxXGHfs5PBoGnw0UCG/UYfQpigF/W1eFF2p38rkQS5NVWvbSP12GudzbT2+ovn8Y56JxG3gAqLjenDO9CgLttpI5MFwoEj4kI0L7NnZsTNuf8RAsmCstNWpVURoiPrA9M1hD/zrarek1xN8woCqhdGDq8nRv40ggEPi8oKOOk1ehGODjJW+GhH3gSFv15RUlAOeNC2sxXSa5NAWLfxXtpEOJBJEtdK+S1mfJZ4w0u5E4LWg1ad/pXWKB7EbItE4zoSARth6B8A61Dz1Cz9STxNcajC6q7UgTQPIKcw=="}^_^30ms,344ms,18ms^_^trace_id:21d7001617841065162606634eb19a
+2026-07-15 17:08:35.851 [tomcat-handler-4] ERROR c.p.p.m.p.a.s.AlipayTransferService - 支付宝转账失败: code=40002, msg=Invalid Arguments, sub_code=isv.missing-app-cert-sn, sub_msg=缺少应用公钥证书序列号,解决方案:https://open.alipay.com/api/errCheck?traceId=21d7001617841065162606634eb19a&source=openapi
+2026-07-15 17:08:36.106 [tomcat-handler-4] ERROR c.p.p.c.e.GlobalExceptionHandler - 系统异常 [/api/v1/payment/account/transfer]
+org.springframework.jdbc.BadSqlGrammarException: 
+### Error updating database.  Cause: org.postgresql.util.PSQLException: ERROR: column "payee_info" is of type json but expression is of type character varying
+  建议:You will need to rewrite or cast the expression.
+  位置:243
+### The error may exist in com/payment/platform/module/payment/account/mapper/TransferMapper.java (best guess)
+### The error may involve com.payment.platform.module.payment.account.mapper.TransferMapper.insert-Inline
+### The error occurred while setting parameters
+### SQL: INSERT INTO pay_transfer (id, status, out_biz_no, account_book_id, amount, order_title, payee_info, payee_type, error_code, error_msg, remark, retry_count, enterprise_id, tenant_id, created_time, updated_time) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
+### Cause: org.postgresql.util.PSQLException: ERROR: column "payee_info" is of type json but expression is of type character varying
+  建议:You will need to rewrite or cast the expression.
+  位置:243
+; bad SQL grammar []
+	at org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator.doTranslate(SQLErrorCodeSQLExceptionTranslator.java:246)
+	at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:107)
+	at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:92)
+	at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:439)
+	at jdk.proxy2/jdk.proxy2.$Proxy95.insert(Unknown Source)
+	at org.mybatis.spring.SqlSessionTemplate.insert(SqlSessionTemplate.java:272)
+	at com.baomidou.mybatisplus.core.override.MybatisMapperMethod.execute(MybatisMapperMethod.java:59)
+	at com.baomidou.mybatisplus.core.override.MybatisMapperProxy$PlainMethodInvoker.invoke(MybatisMapperProxy.java:152)
+	at com.baomidou.mybatisplus.core.override.MybatisMapperProxy.invoke(MybatisMapperProxy.java:89)
+	at jdk.proxy2/jdk.proxy2.$Proxy134.insert(Unknown Source)
+	at com.payment.platform.module.payment.account.service.AlipayTransferService.insertFailedTransfer(AlipayTransferService.java:809)
+	at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
+	at java.base/java.lang.reflect.Method.invoke(Method.java:580)
+	at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:354)
+	at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:196)
+	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)
+	at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:768)
+	at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:123)
+	at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:392)
+	at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:119)
+	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184)
+	at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:768)
+	at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:720)
+	at com.payment.platform.module.payment.account.service.AlipayTransferService$$SpringCGLIB$$1.insertFailedTransfer(<generated>)
+	at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
+	at java.base/java.lang.reflect.Method.invoke(Method.java:580)
+	at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:354)
+	at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:716)
+	at com.payment.platform.module.payment.account.service.AlipayTransferService$$SpringCGLIB$$0.insertFailedTransfer(<generated>)
+	at com.payment.platform.module.payment.account.service.AlipayTransferService.transfer(AlipayTransferService.java:606)
+	at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
+	at java.base/java.lang.reflect.Method.invoke(Method.java:580)
+	at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:354)
+	at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:196)
+	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)
+	at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:768)
+	at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:123)
+	at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:392)
+	at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:119)
+	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184)
+	at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:768)
+	at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:720)
+	at com.payment.platform.module.payment.account.service.AlipayTransferService$$SpringCGLIB$$1.transfer(<generated>)
+	at com.payment.platform.module.payment.account.controller.AccountController.transfer(AccountController.java:222)
+	at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
+	at java.base/java.lang.reflect.Method.invoke(Method.java:580)
+	at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:354)
+	at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:196)
+	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)
+	at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:768)
+	at org.springframework.security.authorization.method.AuthorizationManagerBeforeMethodInterceptor.invoke(AuthorizationManagerBeforeMethodInterceptor.java:198)
+	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184)
+	at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:768)
+	at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:720)
+	at com.payment.platform.module.payment.account.controller.AccountController$$SpringCGLIB$$0.transfer(<generated>)
+	at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
+	at java.base/java.lang.reflect.Method.invoke(Method.java:580)
+	at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:255)
+	at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:188)
+	at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:118)
+	at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:926)
+	at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:831)
+	at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)
+	at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1089)
+	at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:979)
+	at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1014)
+	at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:914)
+	at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:590)
+	at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:885)
+	at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:658)
+	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:206)
+	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:150)
+	at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)
+	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:175)
+	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:150)
+	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:101)
+	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:175)
+	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:150)
+	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:110)
+	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:175)
+	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:150)
+	at com.payment.platform.core.log.RequestCachingFilter.doFilter(RequestCachingFilter.java:28)
+	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:175)
+	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:150)
+	at org.springframework.web.filter.CompositeFilter$VirtualFilterChain.doFilter(CompositeFilter.java:108)
+	at org.springframework.security.web.FilterChainProxy.lambda$doFilterInternal$3(FilterChainProxy.java:231)
+	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:365)
+	at org.springframework.security.web.access.intercept.AuthorizationFilter.doFilter(AuthorizationFilter.java:100)
+	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:374)
+	at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:126)
+	at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:120)
+	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:374)
+	at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:131)
+	at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:85)
+	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:374)
+	at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:100)
+	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:374)
+	at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:179)
+	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:374)
+	at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:63)
+	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:374)
+	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:101)
+	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:374)
+	at com.payment.platform.core.security.JwtAuthFilter.doFilterInternal(JwtAuthFilter.java:181)
+	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
+	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:374)
+	at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:107)
+	at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:93)
+	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:374)
+	at org.springframework.web.filter.CorsFilter.doFilterInternal(CorsFilter.java:91)
+	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
+	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:374)
+	at org.springframework.security.web.header.HeaderWriterFilter.doHeadersAfter(HeaderWriterFilter.java:90)
+	at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:75)
+	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
+	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:374)
+	at org.springframework.security.web.context.SecurityContextHolderFilter.doFilter(SecurityContextHolderFilter.java:82)
+	at org.springframework.security.web.context.SecurityContextHolderFilter.doFilter(SecurityContextHolderFilter.java:69)
+	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:374)
+	at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:62)
+	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
+	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:374)
+	at org.springframework.security.web.session.DisableEncodeUrlFilter.doFilterInternal(DisableEncodeUrlFilter.java:42)
+	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
+	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:374)
+	at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:233)
+	at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:191)
+	at org.springframework.web.filter.CompositeFilter$VirtualFilterChain.doFilter(CompositeFilter.java:113)
+	at org.springframework.web.servlet.handler.HandlerMappingIntrospector.lambda$createCacheFilter$3(HandlerMappingIntrospector.java:195)
+	at org.springframework.web.filter.CompositeFilter$VirtualFilterChain.doFilter(CompositeFilter.java:113)
+	at org.springframework.web.filter.CompositeFilter.doFilter(CompositeFilter.java:74)
+	at org.springframework.security.config.annotation.web.configuration.WebMvcSecurityConfiguration$CompositeFilterChainProxy.doFilter(WebMvcSecurityConfiguration.java:230)
+	at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:352)
+	at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:268)
+	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:175)
+	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:150)
+	at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)
+	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
+	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:175)
+	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:150)
+	at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)
+	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
+	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:175)
+	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:150)
+	at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)
+	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
+	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:175)
+	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:150)
+	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:167)
+	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90)
+	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:482)
+	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:115)
+	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93)
+	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)
+	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:344)
+	at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:391)
+	at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63)
+	at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:896)
+	at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1736)
+	at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52)
+	at java.base/java.lang.VirtualThread.run(VirtualThread.java:329)
+Caused by: org.postgresql.util.PSQLException: ERROR: column "payee_info" is of type json but expression is of type character varying
+  建议:You will need to rewrite or cast the expression.
+  位置:243
+	at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2713)
+	at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:2401)
+	at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:368)
+	at org.postgresql.jdbc.PgStatement.executeInternal(PgStatement.java:498)
+	at org.postgresql.jdbc.PgStatement.execute(PgStatement.java:415)
+	at org.postgresql.jdbc.PgPreparedStatement.executeWithFlags(PgPreparedStatement.java:190)
+	at org.postgresql.jdbc.PgPreparedStatement.execute(PgPreparedStatement.java:177)
+	at com.alibaba.druid.pool.DruidPooledPreparedStatement.execute(DruidPooledPreparedStatement.java:483)
+	at org.apache.ibatis.executor.statement.PreparedStatementHandler.update(PreparedStatementHandler.java:48)
+	at org.apache.ibatis.executor.statement.RoutingStatementHandler.update(RoutingStatementHandler.java:75)
+	at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
+	at java.base/java.lang.reflect.Method.invoke(Method.java:580)
+	at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:61)
+	at jdk.proxy2/jdk.proxy2.$Proxy148.update(Unknown Source)
+	at org.apache.ibatis.executor.SimpleExecutor.doUpdate(SimpleExecutor.java:50)
+	at org.apache.ibatis.executor.BaseExecutor.update(BaseExecutor.java:117)
+	at org.apache.ibatis.executor.CachingExecutor.update(CachingExecutor.java:76)
+	at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
+	at java.base/java.lang.reflect.Method.invoke(Method.java:580)
+	at org.apache.ibatis.plugin.Invocation.proceed(Invocation.java:49)
+	at com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor.intercept(MybatisPlusInterceptor.java:106)
+	at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:59)
+	at jdk.proxy2/jdk.proxy2.$Proxy147.update(Unknown Source)
+	at org.apache.ibatis.session.defaults.DefaultSqlSession.update(DefaultSqlSession.java:197)
+	at org.apache.ibatis.session.defaults.DefaultSqlSession.insert(DefaultSqlSession.java:184)
+	at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
+	at java.base/java.lang.reflect.Method.invoke(Method.java:580)
+	at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:425)
+	... 157 common frames omitted

+ 236 - 0
logs/payment-platform.log

@@ -2766,3 +2766,239 @@ Caused by: org.postgresql.util.PSQLException: ERROR: column "transfer_enabled" d
 2026-07-15 17:03:51.541 [tomcat-handler-15] ERROR sdk.biz.err - ErrorScene^_^40004^_^INVALID_PARAMETER^_^null^_^Windows 10^_^2026-07-15 17:03:51^_^ProtocalMustParams:charset=UTF-8&method=alipay.fund.accountbook.query&sign=GK2uAGCJ5zleyZ89r6QLv2XrEpxjtOLt7MYncQZ8A3igXp72SAKOzkpUeYgqZ6u+9AZm2FugPHzi/hSYGqDbMxBcU8601p0fPxRTKdb7bkS4XJakDE5aoxLw/Se3EYi4WrNQDUE8xTC4PYSIT1uLHS9t60o80YlvrilQg06fByWZqT1F+VGC6atdLNr1zrg4FrUTDeipPymnI+pN2XxWZS2FgqIxf6G6/vmsaksBnmCYdNEyzbA2abt56PMBl0g26aSiAwCVst/iFLleEEmuSnuh+ZJ5bMKOm+f8+mmu7AWeBADr4d0SNz9SI5ZSjDnP9Nl0zCactQiBVit2yjfb2w==&version=1.0&app_id=2021006160682088&sign_type=RSA2&timestamp=2026-07-15 17:03:51^_^ProtocalOptParams:alipay_sdk=alipay-sdk-java-4.40.865.ALL&format=JSON^_^ApplicationParams:traceId=0b216cd117841062319125341eea7a&biz_content={"account_book_id":"123","ext_info":"{\"agreement_no\":\"20265515324430130114\"}","scene_code":"SATF_FUND_BOOK"}^_^Body:{"alipay_fund_accountbook_query_response":{"msg":"Business Failed","code":"40004","sub_msg":"参数有误用户不存在,userId=123","sub_code":"INVALID_PARAMETER"},"sign":"UYgE32xozKDtAruYowEdJFNYe+VlMzscde7LCiU6odG6UVBGAM8i0UbLmiBuIkhMAzwR4bqedYJGEha7KwZ6qZwGRLtFJknZINrupt8+0kKA3ofQzhP1NX2HlLKHapd6T8NLe9Q1znn/eC3EBEAXQrz54nrB9mMwpKmKzGa6RbwJGHFfM7uZuB1LEu5jqkarNpIMS/yFWl6vN7iQWRrcryez/7ySvk5b9Fp4YniNeZwComAiisq+wjvyNAc6PNd4Ikco9KqHs8+LpANClMNLlu8c++/WSZSZ6HwxB6GwTk0DVJ02kgPpkyJclAihRYJ+6U8LfPz8nMpRfYPygk4dWA=="}^_^9ms,243ms,9ms^_^trace_id:0b216cd117841062319125341eea7a
 2026-07-15 17:05:07.154 [SpringApplicationShutdownHook] INFO  c.alibaba.druid.pool.DruidDataSource - {dataSource-1} closing ...
 2026-07-15 17:05:07.156 [SpringApplicationShutdownHook] INFO  c.alibaba.druid.pool.DruidDataSource - {dataSource-1} closed
+2026-07-15 17:05:11.826 [background-preinit] INFO  o.h.validator.internal.util.Version - HV000001: Hibernate Validator 8.0.1.Final
+2026-07-15 17:05:11.889 [main] INFO  c.p.platform.PaymentApplication - Starting PaymentApplication using Java 21.0.11 with PID 37652 (D:\project2\payment-platform\java\target\classes started by 1 in D:\project2\payment-platform)
+2026-07-15 17:05:11.890 [main] INFO  c.p.platform.PaymentApplication - The following 1 profile is active: "dev"
+2026-07-15 17:05:12.789 [main] INFO  o.s.d.r.c.RepositoryConfigurationDelegate - Multiple Spring Data modules found, entering strict repository configuration mode
+2026-07-15 17:05:12.791 [main] INFO  o.s.d.r.c.RepositoryConfigurationDelegate - Bootstrapping Spring Data Redis repositories in DEFAULT mode.
+2026-07-15 17:05:12.844 [main] INFO  o.s.d.r.c.RepositoryConfigurationDelegate - Finished Spring Data repository scanning in 41 ms. Found 0 Redis repository interfaces.
+2026-07-15 17:05:13.495 [main] INFO  o.s.b.w.e.tomcat.TomcatWebServer - Tomcat initialized with port 8001 (http)
+2026-07-15 17:05:13.510 [main] INFO  o.a.coyote.http11.Http11NioProtocol - Initializing ProtocolHandler ["http-nio-8001"]
+2026-07-15 17:05:13.512 [main] INFO  o.a.catalina.core.StandardService - Starting service [Tomcat]
+2026-07-15 17:05:13.512 [main] INFO  o.a.catalina.core.StandardEngine - Starting Servlet engine: [Apache Tomcat/10.1.20]
+2026-07-15 17:05:13.607 [main] INFO  o.a.c.c.C.[.[localhost].[/api/v1] - Initializing Spring embedded WebApplicationContext
+2026-07-15 17:05:13.607 [main] INFO  o.s.b.w.s.c.ServletWebServerApplicationContext - Root WebApplicationContext: initialization completed in 1560 ms
+2026-07-15 17:05:13.659 [main] INFO  c.a.d.s.b.a.DruidDataSourceAutoConfigure - Init DruidDataSource
+2026-07-15 17:05:14.890 [main] INFO  c.alibaba.druid.pool.DruidDataSource - {dataSource-1} inited
+2026-07-15 17:05:15.597 [main] WARN  c.p.p.c.alipay.AlipayClientFactory - 支付宝默认配置不完整,将仅使用服务商/租户专属客户端
+2026-07-15 17:05:15.737 [main] INFO  c.p.platform.core.oss.OssService - OSS client initialized: bucket=hunanxiaojunzioss, endpoint=oss-cn-beijing.aliyuncs.com
+2026-07-15 17:05:16.042 [main] INFO  c.p.p.m.p.e.s.EnterpriseNameSyncScheduler - [企业名称同步] 调度器启动
+2026-07-15 17:05:16.298 [main] INFO  c.p.p.m.p.n.s.NotificationService - 已注册 7 个通知处理器: [AccountHandler, BillHandler, EmployeeHandler, EnterpriseHandler, InstitutionHandler, OrderHandler, VoucherHandler]
+2026-07-15 17:05:17.459 [main] INFO  o.s.s.web.DefaultSecurityFilterChain - Will secure any request with [org.springframework.security.web.session.DisableEncodeUrlFilter@1a18e68a, org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter@258291de, org.springframework.security.web.context.SecurityContextHolderFilter@1f596988, org.springframework.security.web.header.HeaderWriterFilter@2027d56f, org.springframework.web.filter.CorsFilter@4f63909f, org.springframework.security.web.authentication.logout.LogoutFilter@6e5df971, com.payment.platform.core.security.JwtAuthFilter@462b239f, com.payment.platform.core.security.TenantApiKeyAuthFilter@2ae08750, org.springframework.security.web.savedrequest.RequestCacheAwareFilter@1bcdd302, org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter@648f48d3, org.springframework.security.web.authentication.AnonymousAuthenticationFilter@3ae91bcc, org.springframework.security.web.session.SessionManagementFilter@64b20d9c, org.springframework.security.web.access.ExceptionTranslationFilter@240e61, org.springframework.security.web.access.intercept.AuthorizationFilter@642b71d6]
+2026-07-15 17:05:17.852 [main] INFO  o.a.coyote.http11.Http11NioProtocol - Starting ProtocolHandler ["http-nio-8001"]
+2026-07-15 17:05:17.865 [main] INFO  o.s.b.w.e.tomcat.TomcatWebServer - Tomcat started on port 8001 (http) with context path '/api/v1'
+2026-07-15 17:05:17.996 [main] INFO  c.p.platform.PaymentApplication - Started PaymentApplication in 6.702 seconds (process running for 7.268)
+2026-07-15 17:05:19.552 [main] INFO  c.p.p.core.config.AppStartupRunner - 系统配置缓存初始化完成
+2026-07-15 17:05:20.519 [main] INFO  c.p.p.core.config.AppStartupRunner - 数据字典缓存初始化完成 (10 个字典类型)
+2026-07-15 17:08:18.250 [tomcat-handler-0] INFO  o.a.c.c.C.[.[localhost].[/api/v1] - Initializing Spring DispatcherServlet 'dispatcherServlet'
+2026-07-15 17:08:18.250 [tomcat-handler-0] INFO  o.s.web.servlet.DispatcherServlet - Initializing Servlet 'dispatcherServlet'
+2026-07-15 17:08:18.252 [tomcat-handler-0] INFO  o.s.web.servlet.DispatcherServlet - Completed initialization in 2 ms
+2026-07-15 17:08:35.457 [tomcat-handler-4] INFO  c.p.p.c.alipay.AlipayClientFactory - 服务商[3]客户端创建成功, appId=2021006160682088, name=跨境服务商
+2026-07-15 17:08:35.850 [tomcat-handler-4] ERROR sdk.biz.err - ErrorScene^_^40002^_^isv.missing-app-cert-sn^_^null^_^Windows 10^_^2026-07-15 17:08:35^_^ProtocalMustParams:charset=UTF-8&method=alipay.fund.trans.uni.transfer&sign=J4X/RgwHDqOMwvcu1dc4mRKT5Yc3G/imlmpcRUXjDrilEsiSOYQuBufklmH4sJAHtIOfEjmOQAhS62sBgShhpwEaOrnT+ceoX9mq/kgeB0VVjhL2w9XsrUu41yyxKqK715URjjDYBQllRSwKYUa0gbtJdOiptknICn+BWgSVJenBtfLWph6Mu9wUdCLpZpJCNTwTZojrC98ud8D9TUxj/2CyXtguPiYP4+yXP2OdLzotMg8ymwaibrWgkuEj1lMjcE4jn6tJJgMJS+i2X3vsa08+MojE5eJ4R4LJfUEz5UIwhrYsdtdXTNDcxEru9x7t5oZgy+Spc7QDIs24gCtqQA==&version=1.0&app_id=2021006160682088&sign_type=RSA2&timestamp=2026-07-15 17:08:35^_^ProtocalOptParams:alipay_sdk=alipay-sdk-java-4.40.865.ALL&format=JSON^_^ApplicationParams:traceId=21d7001617841065162606634eb19a&biz_content={"biz_scene":"ENTRUST_TRANSFER","order_title":"测试","out_biz_no":"1274816966430822400","payee_info":{"identity":"13574819605","identity_type":"alipay","name":"黄昊"},"payer_info":{"ext_info":"{\"agreement_no\":\"20265515324430130114\"}","identity":"123","identity_type":"ACCOUNT_BOOK_ID"},"product_code":"SINGLE_TRANSFER_NO_PWD","trans_amount":"1"}^_^Body:{"alipay_fund_trans_uni_transfer_response":{"code":"40002","msg":"Invalid Arguments","sub_code":"isv.missing-app-cert-sn","sub_msg":"缺少应用公钥证书序列号,解决方案:https://open.alipay.com/api/errCheck?traceId=21d7001617841065162606634eb19a&source=openapi"},"sign":"et3d+Zg4NprOhmsXD/iAtBDZSGNdEekrtIUl+Rumpsm/64j4nxXGHfs5PBoGnw0UCG/UYfQpigF/W1eFF2p38rkQS5NVWvbSP12GudzbT2+ovn8Y56JxG3gAqLjenDO9CgLttpI5MFwoEj4kI0L7NnZsTNuf8RAsmCstNWpVURoiPrA9M1hD/zrarek1xN8woCqhdGDq8nRv40ggEPi8oKOOk1ehGODjJW+GhH3gSFv15RUlAOeNC2sxXSa5NAWLfxXtpEOJBJEtdK+S1mfJZ4w0u5E4LWg1ad/pXWKB7EbItE4zoSARth6B8A61Dz1Cz9STxNcajC6q7UgTQPIKcw=="}^_^30ms,344ms,18ms^_^trace_id:21d7001617841065162606634eb19a
+2026-07-15 17:08:35.851 [tomcat-handler-4] ERROR c.p.p.m.p.a.s.AlipayTransferService - 支付宝转账失败: code=40002, msg=Invalid Arguments, sub_code=isv.missing-app-cert-sn, sub_msg=缺少应用公钥证书序列号,解决方案:https://open.alipay.com/api/errCheck?traceId=21d7001617841065162606634eb19a&source=openapi
+2026-07-15 17:08:36.106 [tomcat-handler-4] ERROR c.p.p.c.e.GlobalExceptionHandler - 系统异常 [/api/v1/payment/account/transfer]
+org.springframework.jdbc.BadSqlGrammarException: 
+### Error updating database.  Cause: org.postgresql.util.PSQLException: ERROR: column "payee_info" is of type json but expression is of type character varying
+  建议:You will need to rewrite or cast the expression.
+  位置:243
+### The error may exist in com/payment/platform/module/payment/account/mapper/TransferMapper.java (best guess)
+### The error may involve com.payment.platform.module.payment.account.mapper.TransferMapper.insert-Inline
+### The error occurred while setting parameters
+### SQL: INSERT INTO pay_transfer (id, status, out_biz_no, account_book_id, amount, order_title, payee_info, payee_type, error_code, error_msg, remark, retry_count, enterprise_id, tenant_id, created_time, updated_time) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
+### Cause: org.postgresql.util.PSQLException: ERROR: column "payee_info" is of type json but expression is of type character varying
+  建议:You will need to rewrite or cast the expression.
+  位置:243
+; bad SQL grammar []
+	at org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator.doTranslate(SQLErrorCodeSQLExceptionTranslator.java:246)
+	at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:107)
+	at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:92)
+	at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:439)
+	at jdk.proxy2/jdk.proxy2.$Proxy95.insert(Unknown Source)
+	at org.mybatis.spring.SqlSessionTemplate.insert(SqlSessionTemplate.java:272)
+	at com.baomidou.mybatisplus.core.override.MybatisMapperMethod.execute(MybatisMapperMethod.java:59)
+	at com.baomidou.mybatisplus.core.override.MybatisMapperProxy$PlainMethodInvoker.invoke(MybatisMapperProxy.java:152)
+	at com.baomidou.mybatisplus.core.override.MybatisMapperProxy.invoke(MybatisMapperProxy.java:89)
+	at jdk.proxy2/jdk.proxy2.$Proxy134.insert(Unknown Source)
+	at com.payment.platform.module.payment.account.service.AlipayTransferService.insertFailedTransfer(AlipayTransferService.java:809)
+	at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
+	at java.base/java.lang.reflect.Method.invoke(Method.java:580)
+	at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:354)
+	at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:196)
+	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)
+	at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:768)
+	at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:123)
+	at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:392)
+	at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:119)
+	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184)
+	at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:768)
+	at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:720)
+	at com.payment.platform.module.payment.account.service.AlipayTransferService$$SpringCGLIB$$1.insertFailedTransfer(<generated>)
+	at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
+	at java.base/java.lang.reflect.Method.invoke(Method.java:580)
+	at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:354)
+	at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:716)
+	at com.payment.platform.module.payment.account.service.AlipayTransferService$$SpringCGLIB$$0.insertFailedTransfer(<generated>)
+	at com.payment.platform.module.payment.account.service.AlipayTransferService.transfer(AlipayTransferService.java:606)
+	at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
+	at java.base/java.lang.reflect.Method.invoke(Method.java:580)
+	at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:354)
+	at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:196)
+	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)
+	at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:768)
+	at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:123)
+	at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:392)
+	at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:119)
+	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184)
+	at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:768)
+	at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:720)
+	at com.payment.platform.module.payment.account.service.AlipayTransferService$$SpringCGLIB$$1.transfer(<generated>)
+	at com.payment.platform.module.payment.account.controller.AccountController.transfer(AccountController.java:222)
+	at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
+	at java.base/java.lang.reflect.Method.invoke(Method.java:580)
+	at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:354)
+	at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:196)
+	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)
+	at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:768)
+	at org.springframework.security.authorization.method.AuthorizationManagerBeforeMethodInterceptor.invoke(AuthorizationManagerBeforeMethodInterceptor.java:198)
+	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184)
+	at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:768)
+	at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:720)
+	at com.payment.platform.module.payment.account.controller.AccountController$$SpringCGLIB$$0.transfer(<generated>)
+	at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
+	at java.base/java.lang.reflect.Method.invoke(Method.java:580)
+	at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:255)
+	at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:188)
+	at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:118)
+	at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:926)
+	at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:831)
+	at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)
+	at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1089)
+	at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:979)
+	at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1014)
+	at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:914)
+	at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:590)
+	at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:885)
+	at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:658)
+	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:206)
+	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:150)
+	at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)
+	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:175)
+	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:150)
+	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:101)
+	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:175)
+	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:150)
+	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:110)
+	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:175)
+	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:150)
+	at com.payment.platform.core.log.RequestCachingFilter.doFilter(RequestCachingFilter.java:28)
+	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:175)
+	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:150)
+	at org.springframework.web.filter.CompositeFilter$VirtualFilterChain.doFilter(CompositeFilter.java:108)
+	at org.springframework.security.web.FilterChainProxy.lambda$doFilterInternal$3(FilterChainProxy.java:231)
+	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:365)
+	at org.springframework.security.web.access.intercept.AuthorizationFilter.doFilter(AuthorizationFilter.java:100)
+	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:374)
+	at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:126)
+	at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:120)
+	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:374)
+	at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:131)
+	at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:85)
+	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:374)
+	at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:100)
+	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:374)
+	at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:179)
+	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:374)
+	at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:63)
+	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:374)
+	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:101)
+	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:374)
+	at com.payment.platform.core.security.JwtAuthFilter.doFilterInternal(JwtAuthFilter.java:181)
+	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
+	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:374)
+	at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:107)
+	at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:93)
+	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:374)
+	at org.springframework.web.filter.CorsFilter.doFilterInternal(CorsFilter.java:91)
+	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
+	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:374)
+	at org.springframework.security.web.header.HeaderWriterFilter.doHeadersAfter(HeaderWriterFilter.java:90)
+	at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:75)
+	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
+	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:374)
+	at org.springframework.security.web.context.SecurityContextHolderFilter.doFilter(SecurityContextHolderFilter.java:82)
+	at org.springframework.security.web.context.SecurityContextHolderFilter.doFilter(SecurityContextHolderFilter.java:69)
+	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:374)
+	at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:62)
+	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
+	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:374)
+	at org.springframework.security.web.session.DisableEncodeUrlFilter.doFilterInternal(DisableEncodeUrlFilter.java:42)
+	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
+	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:374)
+	at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:233)
+	at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:191)
+	at org.springframework.web.filter.CompositeFilter$VirtualFilterChain.doFilter(CompositeFilter.java:113)
+	at org.springframework.web.servlet.handler.HandlerMappingIntrospector.lambda$createCacheFilter$3(HandlerMappingIntrospector.java:195)
+	at org.springframework.web.filter.CompositeFilter$VirtualFilterChain.doFilter(CompositeFilter.java:113)
+	at org.springframework.web.filter.CompositeFilter.doFilter(CompositeFilter.java:74)
+	at org.springframework.security.config.annotation.web.configuration.WebMvcSecurityConfiguration$CompositeFilterChainProxy.doFilter(WebMvcSecurityConfiguration.java:230)
+	at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:352)
+	at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:268)
+	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:175)
+	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:150)
+	at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)
+	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
+	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:175)
+	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:150)
+	at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)
+	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
+	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:175)
+	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:150)
+	at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)
+	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
+	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:175)
+	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:150)
+	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:167)
+	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90)
+	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:482)
+	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:115)
+	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93)
+	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)
+	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:344)
+	at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:391)
+	at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63)
+	at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:896)
+	at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1736)
+	at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52)
+	at java.base/java.lang.VirtualThread.run(VirtualThread.java:329)
+Caused by: org.postgresql.util.PSQLException: ERROR: column "payee_info" is of type json but expression is of type character varying
+  建议:You will need to rewrite or cast the expression.
+  位置:243
+	at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2713)
+	at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:2401)
+	at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:368)
+	at org.postgresql.jdbc.PgStatement.executeInternal(PgStatement.java:498)
+	at org.postgresql.jdbc.PgStatement.execute(PgStatement.java:415)
+	at org.postgresql.jdbc.PgPreparedStatement.executeWithFlags(PgPreparedStatement.java:190)
+	at org.postgresql.jdbc.PgPreparedStatement.execute(PgPreparedStatement.java:177)
+	at com.alibaba.druid.pool.DruidPooledPreparedStatement.execute(DruidPooledPreparedStatement.java:483)
+	at org.apache.ibatis.executor.statement.PreparedStatementHandler.update(PreparedStatementHandler.java:48)
+	at org.apache.ibatis.executor.statement.RoutingStatementHandler.update(RoutingStatementHandler.java:75)
+	at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
+	at java.base/java.lang.reflect.Method.invoke(Method.java:580)
+	at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:61)
+	at jdk.proxy2/jdk.proxy2.$Proxy148.update(Unknown Source)
+	at org.apache.ibatis.executor.SimpleExecutor.doUpdate(SimpleExecutor.java:50)
+	at org.apache.ibatis.executor.BaseExecutor.update(BaseExecutor.java:117)
+	at org.apache.ibatis.executor.CachingExecutor.update(CachingExecutor.java:76)
+	at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
+	at java.base/java.lang.reflect.Method.invoke(Method.java:580)
+	at org.apache.ibatis.plugin.Invocation.proceed(Invocation.java:49)
+	at com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor.intercept(MybatisPlusInterceptor.java:106)
+	at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:59)
+	at jdk.proxy2/jdk.proxy2.$Proxy147.update(Unknown Source)
+	at org.apache.ibatis.session.defaults.DefaultSqlSession.update(DefaultSqlSession.java:197)
+	at org.apache.ibatis.session.defaults.DefaultSqlSession.insert(DefaultSqlSession.java:184)
+	at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
+	at java.base/java.lang.reflect.Method.invoke(Method.java:580)
+	at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:425)
+	... 157 common frames omitted