54 İşlemeler bdb22b2f3f ... c2e6e29702

Yazar SHA1 Mesaj Tarih
  alphaH c2e6e29702 fix: transfer返回兼容旧字段名 + 转账通知加对外回调 16 saat önce
  alphaH f5b92b6106 fix: 补上 alipay.fund.trans.order.changed 转账结果通知处理器 16 saat önce
  alphaH bc894434b7 fix: 通知回调验签改为证书模式 rsaCertCheckV1,兼容公钥模式 16 saat önce
  alphaH 7e229f29fb fix: getClient分支明确分离 — bizType用密钥, 无bizType用证书 18 saat önce
  alphaH f6b0f186c3 fix: 转账权限只隐藏转账相关功能,消费/收款明细保留 18 saat önce
  alphaH 1033ce93ca refactor: 转账权限改为操作列直接切换按钮,去掉编辑表单开关 18 saat önce
  alphaH 03fc74c357 feat: 企业列表操作列加编辑按钮 18 saat önce
  alphaH 471b84db5e feat: 企业编辑页加转账功能开关 el-switch 18 saat önce
  alphaH 1ffde4962e feat: 前端转账功能权限门 — transferEnabled=false时隐藏全部功能 1 gün önce
  alphaH c34a8d88f4 fix: identity_type从旧值alipay/bank改为文档要求的ALIPAY_USER_ID/BANKCARD_ACCOUNT 1 gün önce
  alphaH 79fb597f5d chore: 清理if(true)和log中的mode三元判断 1 gün önce
  alphaH c1a9784c6f refactor: createClientForProfile也去掉证书条件判断,统一证书模式 1 gün önce
  alphaH 174446ebac refactor: getClient统一使用公钥证书模式,去除公私钥共存判断 1 gün önce
  alphaH 7f229b8ff4 feat: 服务商公钥证书模式支持 — 资金类接口强制证书调用 1 gün önce
  alphaH 4831759576 feat: 企业转账功能开关 transferEnabled — DB迁移+实体+DTO+Service 1 gün önce
  alphaH 2b2bf5dd14 fix: 账户余额改为从支付宝实时获取 available_amount 1 gün önce
  alphaH 5ac647dca2 fix: 充值状态判断 ON→ACTIVE,与后端AccountEntity.status值一致 1 gün önce
  alphaH 0f4e896672 feat: 页面顶部流程路线改为5步 — 签约→进件→开通→充值→转账 1 gün önce
  alphaH 4db0ce6e0c fix: pageExecute HTML直接渲染当前页自动重定向,不用Blob+新窗口 1 gün önce
  alphaH 8fa8572dba fix: 按接入指南补两处校验 1 gün önce
  alphaH d584a1bd1d refactor: 进件从tab切换改为弹窗,提交后自动关闭并刷新 1 gün önce
  alphaH c897f9221b fix: 开通按钮条件修正 — 签约且进件通过才启用 1 gün önce
  alphaH d1f1c72926 refactor: scene_code写死ZHUANZHANG_QITA,前后端全去掉 1 gün önce
  alphaH 3b85b88715 fix: 去掉进件状态倒查 + admin不自动选企业 1 gün önce
  alphaH 51f183d786 feat: 进件状态主动同步 — createAccount前查支付宝+手动刷新端点 1 gün önce
  alphaH f1124e3c18 feat: GET /payment/account/onboard/status?enterprise_id=x — 查本地进件状态(不走支付宝) 1 gün önce
  alphaH 2dc8b38bfb feat: 进件状态闭环 — PENDING置灰/INVALID重提/VALID才能开记账本 1 gün önce
  alphaH 566f2ce8b3 refactor: secondary_partner_info从EnterpriseEntity取而非法前端传入 1 gün önce
  alphaH 1aa41e1792 fix: 上传/删除图片后同步onboardForm.scene_image并触发校验清除错误提示 1 gün önce
  alphaH 3c15afd2e0 fix: imageType精简为jpg/pdf二选一,MIME改为标准值image/jpeg而非image/jpg 1 gün önce
  alphaH b085748b6b fix: scene_image校验改为自定义validator检查onboardImageIds数组而非空字符串form字段 1 gün önce
  alphaH 7ea76ef492 fix: image.upload FileItem用MIME类型 + imageType自动匹配合适后缀 1 gün önce
  alphaH 9fbad32678 fix: 文件后缀校验 — 前后端双重验证 jpg/png/pdf 1 gün önce
  alphaH ac7ad88c54 fix: 站点输入框placeholder从API码改为中文标签(公众号而非GONGZH) 1 gün önce
  alphaH 07cbd5b1bd feat: 站点信息联动下拉 + 前后端必填校验 1 gün önce
  alphaH 7012bdf9e3 feat: 进件表单 el-tab-pane — 场景码下拉+说明+截图上传+提交 1 gün önce
  alphaH 96235ccf0c fix: 进件按钮启用逻辑 + authorizeStatus改为基于sign_status判断 1 gün önce
  alphaH aa5491d4ae feat: 前端进件API + 概览页进件步骤卡片 1 gün önce
  alphaH e28f1cbf61 fix: 签约通知创建AccountEntity时补全 tenantId(反查企业表) + scene + accountType 1 gün önce
  alphaH 9f6ef0b4a7 fix: 签约通知创建AccountEntity作为全流程状态机 + createAccount改用insertOrUpdate 1 gün önce
  alphaH 925801619e feat: V1.2 Flyway 迁移 — pay_account 加进件字段 + agreement_no 1 gün önce
  alphaH a6f1b191fd feat: 进件功能 — image.upload + create/query/cancel + 通知处理 1 gün önce
  alphaH e97b15df03 chore: alipay-sdk-java 4.39.218.ALL → 4.40.865.ALL + 兼容修复 1 gün önce
  alphaH 83c248603e fix: 签约通知无msg_method改用notify_type匹配 + dispatch空值兜底 1 gün önce
  alphaH a109c1ac44 feat: 签约通知由/payment/notify/alipay接收 + createAccount内置自动查询兜底 1 gün önce
  alphaH d2f7b2c83b fix: 查询签约结果移到概览页快捷操作区 1 gün önce
  alphaH d121b8bcda @ 1 gün önce
  alphaH eba321c81e @ 1 gün önce
  alphaH b665d7ec57 fix: 移除面向开发者的技术提示,产品用户不需要看到API约束细节 1 gün önce
  alphaH 65741807ab @ 1 gün önce
  alphaH 973221bba1 @ 1 gün önce
  alphaH 33529da03e @ 1 gün önce
  alphaH 762b04ab9d @ 1 gün önce
  alphaH 6ccd1a6742 feat: AlipayTransferService 企业码→安全发 API 完整迁移 1 gün önce
33 değiştirilmiş dosya ile 3895 ekleme ve 404 silme
  1. 1303 0
      frontend/alipay-transfer-api.md
  2. 224 0
      frontend/alipay-transfer-doc.md
  3. BIN
      frontend/dist.zip
  4. 60 2
      frontend/src/api/module_payment/account.ts
  5. 3 2
      frontend/src/store/modules/enterprise.store.ts
  6. 84 14
      frontend/src/views/module_payment/account/components/AccountOverview.vue
  7. 214 30
      frontend/src/views/module_payment/account/index.vue
  8. 3 0
      frontend/src/views/module_payment/enterprise/components/EnterpriseForm.vue
  9. 20 0
      frontend/src/views/module_payment/enterprise/index.vue
  10. 946 0
      java/.claude/plan/2026-07-15-alipay-safe-pay-migration.md
  11. 1 1
      java/pom.xml
  12. 8 11
      java/src/main/java/com/payment/platform/core/alipay/AlipayClientFactory.java
  13. 8 88
      java/src/main/java/com/payment/platform/core/alipay/ExtendedInstitutionModifyModel.java
  14. 93 1
      java/src/main/java/com/payment/platform/module/payment/account/controller/AccountController.java
  15. 12 0
      java/src/main/java/com/payment/platform/module/payment/account/dto/AccountVO.java
  16. 8 0
      java/src/main/java/com/payment/platform/module/payment/account/entity/AccountEntity.java
  17. 19 1
      java/src/main/java/com/payment/platform/module/payment/account/service/AccountService.java
  18. 582 244
      java/src/main/java/com/payment/platform/module/payment/account/service/AlipayTransferService.java
  19. 3 0
      java/src/main/java/com/payment/platform/module/payment/enterprise/dto/EnterpriseUpdateDTO.java
  20. 3 0
      java/src/main/java/com/payment/platform/module/payment/enterprise/dto/EnterpriseVO.java
  21. 3 0
      java/src/main/java/com/payment/platform/module/payment/enterprise/entity/EnterpriseEntity.java
  22. 3 0
      java/src/main/java/com/payment/platform/module/payment/enterprise/service/EnterpriseService.java
  23. 0 2
      java/src/main/java/com/payment/platform/module/payment/facetoface/scheduler/F2fTradePollScheduler.java
  24. 124 2
      java/src/main/java/com/payment/platform/module/payment/notification/handler/AccountHandler.java
  25. 19 6
      java/src/main/java/com/payment/platform/module/payment/notification/service/NotificationService.java
  26. 6 0
      java/src/main/java/com/payment/platform/module/payment/serviceprovider/entity/ServiceProviderEntity.java
  27. 5 0
      java/src/main/resources/db/migration/V1.2__pay_account_onboard_fields.sql
  28. 2 0
      java/src/main/resources/db/migration/V1.3__pay_enterprise_transfer_enabled.sql
  29. 4 0
      java/src/main/resources/db/migration/V1.4__pay_service_provider_cert_fields.sql
  30. BIN
      logs/payment-platform-error.2026-07-15.0.log.gz
  31. 1 0
      logs/payment-platform-error.log
  32. BIN
      logs/payment-platform.2026-07-15.0.log.gz
  33. 134 0
      logs/payment-platform.log

+ 1303 - 0
frontend/alipay-transfer-api.md

@@ -0,0 +1,1303 @@
+- generic [ref=f3e3]:
+  - banner [ref=f3e4]:
+    - generic [ref=f3e5]:
+      - generic [ref=f3e6]:
+        - link [ref=f3e7] [cursor=pointer]:
+          - /url: https://open.alipay.com/
+          - img "支付宝文档中心" [ref=f3e8]
+        - generic [ref=f3e9]: 文档中心
+      - generic [ref=f3e10]:
+        - img "right" [ref=f3e11]
+        - generic [ref=f3e14]: 邀测API
+      - list
+    - generic [ref=f3e15]:
+      - generic [ref=f3e18]:
+        - textbox "INVALID-SIGNATURE 验签出错" [ref=f3e40]
+        - img "search-icon" [ref=f3e22] [cursor=pointer]
+      - link "控制台" [ref=f3e23] [cursor=pointer]:
+        - /url: https://open.alipay.com/develop/manage
+      - generic [ref=f3e24]: 登录
+  - main [ref=f3e28]:
+    - generic [ref=f3e43]:
+      - generic [ref=f3e44]:
+        - link "定向开放API" [ref=f3e45] [cursor=pointer]:
+          - /url: /pre-apis/repo-0039ah?pathHash=201dcf88
+        - text: "> 单笔转账接口"
+      - article [ref=f3e46]:
+        - generic [ref=f3e47]:
+          - heading "alipay.fund.trans.uni.transfer(单笔转账接口)" [level=1] [ref=f3e49]
+          - list
+          - generic [ref=f3e53]:
+            - time [ref=f3e55]: 更新时间:2026-07-14 14:39:09
+            - generic [ref=f3e56]:
+              - generic [ref=f3e59] [cursor=pointer]:
+                - img "star" [ref=f3e61]
+                - text: 收藏
+              - generic [ref=f3e66] [cursor=pointer]:
+                - img "folder-open" [ref=f3e68]
+                - text: 我的文档
+              - generic [ref=f3e72] [cursor=pointer]:
+                - img "setting" [ref=f3e74]
+                - generic [ref=f3e77]:
+                  - text: 设置
+                  - superscript [ref=f3e78]
+        - alert [ref=f3e79]:
+          - img "exclamation-circle" [ref=f3e80]
+          - generic [ref=f3e84]:
+            - text: 注意:
+            - generic [ref=f3e85]:
+              - text: 本文档为单篇api文档,可能无法实现整体功能,强烈不建议单独使用该文档进行能力接入。如需查找完整的接入文档,请前往
+              - link "开放能力" [ref=f3e86] [cursor=pointer]:
+                - /url: https://open.alipay.com/api
+              - text: 或者使用
+              - link "咫尺搜索平台" [ref=f3e87] [cursor=pointer]:
+                - /url: https://open.alipay.com/portal/zhichi/home
+        - generic [ref=f3e90]:
+          - tablist [ref=f3e91]:
+            - generic [ref=f3e93]:
+              - tab "通用场景" [selected] [ref=f3e95] [cursor=pointer]
+              - tab "转账到支付宝账户" [ref=f3e97] [cursor=pointer]
+              - tab "转账到银行卡" [ref=f3e99] [cursor=pointer]
+              - tab "安全发" [ref=f3e101] [cursor=pointer]
+              - tab "转账到场景钱包" [ref=f3e103] [cursor=pointer]
+              - tab "专用金" [ref=f3e105] [cursor=pointer]
+          - tabpanel "通用场景" [ref=f3e108]:
+            - generic [ref=f3e109]:
+              - generic [ref=f3e110]: 单笔转账接口是基于支付宝的资金处理能力,为了满足支付宝商家的转账需求,针对有部分开发能力的商家,提供通过API接口完成企业自身支付宝账户到支付宝账户的转账功能。 适用于:C2C现金红包的红包领取、B2C现金红包的红包发放、B2C单笔转账到支付宝账户等。说明:本接口为公用接口,参数说明不针对特定产品。不同产品入参请参考对应产品文档。
+              - generic [ref=f3e111]:
+                - heading [level=2] [ref=f3e112]
+                - img "right" [ref=f3e115] [cursor=pointer]
+              - generic [ref=f3e118]:
+                - generic [ref=f3e119]:
+                  - heading [level=2] [ref=f3e120]:
+                    - text: 业务请求参数
+                    - img "down" [ref=f3e122] [cursor=pointer]
+                  - generic [ref=f3e126] [cursor=pointer]: 展开所有属性
+                  - generic [ref=f3e127]:
+                    - generic [ref=f3e129]:
+                      - generic [ref=f3e130]:
+                        - strong [ref=f3e132]: out_biz_no
+                        - generic [ref=f3e133]: 必选
+                        - generic [ref=f3e134]: string
+                        - generic [ref=f3e135]: "[0,64]"
+                      - generic [ref=f3e136]:
+                        - generic [ref=f3e137]: 【描述】商家侧唯一订单号,由商家自定义。对于不同转账请求,商家需保证该订单号在自身系统唯一。
+                        - generic [ref=f3e138]: 【示例值】201806300001
+                    - generic [ref=f3e140]:
+                      - generic [ref=f3e141]:
+                        - strong [ref=f3e143]: trans_amount
+                        - generic [ref=f3e144]: 必选
+                        - generic [ref=f3e145]: price
+                        - generic [ref=f3e146]: "[0.1,100000000]"
+                      - generic [ref=f3e147]:
+                        - generic [ref=f3e148]: 【描述】订单总金额,单位为元,精确到小数点后两位,STD_RED_PACKET产品取值范围[0.01,100000000]; TRANS_ACCOUNT_NO_PWD产品取值范围[0.1,100000000]
+                        - generic [ref=f3e149]: 【示例值】23.00
+                    - generic [ref=f3e151]:
+                      - generic [ref=f3e152]:
+                        - strong [ref=f3e154]: product_code
+                        - generic [ref=f3e155]: 必选
+                        - generic [ref=f3e156]: string
+                        - generic [ref=f3e157]: "[0,64]"
+                      - generic [ref=f3e158]:
+                        - generic [ref=f3e159]: "【描述】业务产品码, 单笔无密转账到支付宝账户固定为: TRANS_ACCOUNT_NO_PWD; 收发现金红包固定为: STD_RED_PACKET;"
+                        - generic [ref=f3e160]: 【示例值】TRANS_ACCOUNT_NO_PWD
+                    - generic [ref=f3e162]:
+                      - generic [ref=f3e163]:
+                        - generic [ref=f3e164]:
+                          - strong [ref=f3e165]: payee_info
+                          - strong [ref=f3e166]: |收款方信息
+                        - generic [ref=f3e167]: 必选
+                        - generic [ref=f3e168]: Participant
+                      - generic [ref=f3e169]: 【描述】收款方信息
+                      - generic [ref=f3e171] [cursor=pointer]:
+                        - text: 子属性
+                        - img "right" [ref=f3e172]
+                    - generic [ref=f3e176]:
+                      - generic [ref=f3e177]:
+                        - strong [ref=f3e179]: original_order_id
+                        - generic [ref=f3e180]: 条件必选
+                        - generic [ref=f3e181]: string
+                        - generic [ref=f3e182]: "[1,64]"
+                      - generic [ref=f3e183]:
+                        - generic [ref=f3e184]: 【描述】原支付宝业务单号。
+                        - generic [ref=f3e185]: 【必选条件】C2C现金红包-红包领取时,必传此字段。传红包支付时返回的支付宝单号;B2C现金红包、单笔无密转账到支付宝不需要该参数。
+                        - generic [ref=f3e186]: 【示例值】20190620110075000006640000063056
+                    - generic [ref=f3e188]:
+                      - generic [ref=f3e189]:
+                        - strong [ref=f3e191]: biz_scene
+                        - generic [ref=f3e192]: 可选
+                        - generic [ref=f3e193]: string
+                        - generic [ref=f3e194]: "[0,64]"
+                      - generic [ref=f3e195]:
+                        - generic [ref=f3e196]: 【描述】描述特定的业务场景,可传的参数如下: DIRECT_TRANSFER:单笔无密转账到支付宝,B2C现金红包; PERSONAL_COLLECTION:C2C现金红包-领红包
+                        - generic [ref=f3e197]:
+                          - generic [ref=f3e198]: 【枚举值】
+                          - generic [ref=f3e199]:
+                            - generic [ref=f3e200]: "单笔无密转账到支付宝,B2C现金红包:"
+                            - generic [ref=f3e201]: DIRECT_TRANSFER
+                          - generic [ref=f3e202]:
+                            - generic [ref=f3e203]: "C2C现金红包-领红包:"
+                            - generic [ref=f3e204]: PERSONAL_COLLECTION
+                          - generic [ref=f3e205]:
+                            - generic [ref=f3e206]: "CAE代扣:"
+                            - generic [ref=f3e207]: CAE_TRANSFER
+                          - text: 更多
+                        - generic [ref=f3e208]: 【示例值】DIRECT_TRANSFER
+                    - generic [ref=f3e210]:
+                      - generic [ref=f3e211]:
+                        - strong [ref=f3e213]: order_title
+                        - generic [ref=f3e214]: 可选
+                        - generic [ref=f3e215]: string
+                        - generic [ref=f3e216]: "[0,128]"
+                      - generic [ref=f3e217]:
+                        - generic [ref=f3e218]: 【描述】转账业务的标题,用于在支付宝用户的账单里显示
+                        - generic [ref=f3e219]: 【示例值】转账标题
+                    - generic [ref=f3e221]:
+                      - generic [ref=f3e222]:
+                        - generic [ref=f3e223]:
+                          - strong [ref=f3e224]: payer_info
+                          - strong [ref=f3e225]: |付款方信息
+                        - generic [ref=f3e226]: 可选
+                        - generic [ref=f3e227]: Participant
+                      - generic [ref=f3e228]: 【描述】付款方信息
+                      - generic [ref=f3e230] [cursor=pointer]:
+                        - text: 子属性
+                        - img "right" [ref=f3e231]
+                    - generic [ref=f3e235]:
+                      - generic [ref=f3e236]:
+                        - strong [ref=f3e238]: remark
+                        - generic [ref=f3e239]: 可选
+                        - generic [ref=f3e240]: string
+                        - generic [ref=f3e241]: "[0,200]"
+                      - generic [ref=f3e242]:
+                        - generic [ref=f3e243]: 【描述】业务备注
+                        - generic [ref=f3e244]: 【示例值】单笔转账
+                    - generic [ref=f3e246]:
+                      - generic [ref=f3e247]:
+                        - generic [ref=f3e248]:
+                          - strong [ref=f3e249]: transfer_scene_name
+                          - strong [ref=f3e250]: |转账场景名称
+                        - generic [ref=f3e251]: 可选
+                        - generic [ref=f3e252]: string
+                        - generic [ref=f3e253]: "[0,64]"
+                      - generic [ref=f3e254]:
+                        - generic [ref=f3e255]:
+                          - text: 【描述】
+                          - generic [ref=f3e256]:
+                            - text: 该笔转账使用的转账场景,商户可前往【
+                            - link [ref=f3e257] [cursor=pointer]:
+                              - /url: https://b.alipay.com/page/bizfund/transferScene/list
+                              - text: 支付宝商家平台-资金管理-转账场景
+                              - img "画板" [ref=f3e259]
+                            - text: 】中查看/申明转账场景。 目前支持以下枚举值:现金营销、企业退款、佣金报酬、业务结算、二手回收、公益补助、行政补贴和退款、保险理赔
+                        - generic [ref=f3e264]: 【示例值】佣金报酬
+                    - generic [ref=f3e266]:
+                      - generic [ref=f3e267]:
+                        - generic [ref=f3e268]:
+                          - strong [ref=f3e269]: transfer_scene_report_infos
+                          - strong [ref=f3e270]: |转账场景上报信息
+                        - generic [ref=f3e271]: 可选
+                        - generic [ref=f3e272]: "[0,5]"
+                      - generic [ref=f3e273]: 【描述】转账场景信息,包含转账场景信息类型和转账场景信息描述。需按该笔转账使用的转账场景准确填写
+                      - generic [ref=f3e275] [cursor=pointer]:
+                        - text: 子属性
+                        - img "right" [ref=f3e276]
+                    - generic [ref=f3e280]:
+                      - generic [ref=f3e281]:
+                        - strong [ref=f3e283]: business_params
+                        - generic [ref=f3e284]: 可选
+                        - generic [ref=f3e285]: string
+                        - generic [ref=f3e286]: "[0,2048]"
+                      - generic [ref=f3e287]:
+                        - generic [ref=f3e288]: 【描述】转账业务请求的扩展参数,支持传入的扩展参数如下: sub_biz_scene 子业务场景,红包业务必传,C2C现金红包、B2C现金红包均需传入,取值REDPACKET
+                        - generic [ref=f3e289]: "【示例值】{\"sub_biz_scene\":\"REDPACKET\"}"
+                    - generic [ref=f3e291]:
+                      - generic [ref=f3e292]:
+                        - generic [ref=f3e293]:
+                          - strong [ref=f3e294]: sign_data
+                          - strong [ref=f3e295]: |签名信息
+                        - generic [ref=f3e296]: 可选
+                        - generic [ref=f3e297]: SignData
+                      - generic [ref=f3e298]: 【描述】"签名信息。 说明:仅特殊场景使用,现金红包场景无需关注。"
+                      - generic [ref=f3e300] [cursor=pointer]:
+                        - text: 子属性
+                        - img "right" [ref=f3e301]
+                - generic [ref=f3e305]:
+                  - generic [ref=f3e306]: 常见请求示例
+                  - generic [ref=f3e307]:
+                    - generic [ref=f3e308]:
+                      - tablist [ref=f3e309]:
+                        - generic [ref=f3e311]:
+                          - tab "C2C现金红包-领红包" [selected] [ref=f3e313] [cursor=pointer]
+                          - tab "B2C现金红包" [ref=f3e316] [cursor=pointer]
+                          - tab "默认示例" [ref=f3e319] [cursor=pointer]
+                      - generic:
+                        - generic:
+                          - tabpanel "C2C现金红包-领红包"
+                    - generic [ref=f3e321]:
+                      - generic [ref=f3e322]:
+                        - generic [ref=f3e323] [cursor=pointer]:
+                          - generic [ref=f3e324]:
+                            - radio "cURL" [checked]
+                          - text: cURL
+                        - generic [ref=f3e325] [cursor=pointer]:
+                          - generic [ref=f3e326]:
+                            - radio "Java"
+                          - text: Java
+                        - generic [ref=f3e327] [cursor=pointer]:
+                          - generic [ref=f3e328]:
+                            - radio "C#"
+                          - text: C#
+                        - generic [ref=f3e329] [cursor=pointer]:
+                          - generic [ref=f3e330]:
+                            - radio "PHP"
+                          - text: PHP
+                      - code [ref=f3e336]: "curl 'https://openapi.alipay.com/gateway.do?charset=UTF-8&method=alipay.fund.trans.uni.transfer&format=json&sign=${sign}&app_id=${appid}&version=1.0&sign_type=RSA2&timestamp=${now}&app_cert_sn=${app_cert_sn}&alipay_root_cert_sn=${alipay_root_cert_sn}' \\ -F 'biz_content={ \"out_biz_no\":\"201806300001\", \"trans_amount\":\"10.00\", \"product_code\":\"STD_RED_PACKET\", \"biz_scene\":\"PERSONAL_COLLECTION\", \"order_title\":\"转账标题\", \"remark\":\"红包领取成功\", \"payee_info\":{ \"identity\":\"testaccount@alipay.com\", \"identity_type\":\"ALIPAY_USER_ID\" }, \"business_params\":\"{\\\"sub_biz_scene\\\":\\\"REDPACKET\\\",\\\"withdraw_timeliness\\\":\\\"T0\\\"}\" }'"
+                  - generic [ref=f3e337]: 说明:本示例仅供参考。
+              - generic [ref=f3e338]:
+                - heading [level=2] [ref=f3e339]
+                - img "right" [ref=f3e342] [cursor=pointer]
+              - generic [ref=f3e345]:
+                - generic [ref=f3e346]:
+                  - heading [level=2] [ref=f3e347]:
+                    - text: 业务响应参数
+                    - img "down" [ref=f3e349] [cursor=pointer]
+                  - generic [ref=f3e353]:
+                    - generic [ref=f3e355]:
+                      - generic [ref=f3e356]:
+                        - strong [ref=f3e358]: out_biz_no
+                        - generic [ref=f3e359]: 必选
+                        - generic [ref=f3e360]: string
+                        - generic [ref=f3e361]: (64)
+                      - generic [ref=f3e362]:
+                        - generic [ref=f3e363]: 【描述】商户订单号
+                        - generic [ref=f3e364]: 【示例值】201808080001
+                    - generic [ref=f3e366]:
+                      - generic [ref=f3e367]:
+                        - strong [ref=f3e369]: order_id
+                        - generic [ref=f3e370]: 必选
+                        - generic [ref=f3e371]: string
+                        - generic [ref=f3e372]: (32)
+                      - generic [ref=f3e373]:
+                        - generic [ref=f3e374]: 【描述】支付宝转账订单号
+                        - generic [ref=f3e375]: 【示例值】20190801110070000006380000250621
+                    - generic [ref=f3e377]:
+                      - generic [ref=f3e378]:
+                        - strong [ref=f3e380]: trans_date
+                        - generic [ref=f3e381]: 必选
+                        - generic [ref=f3e382]: string
+                        - generic [ref=f3e383]: (30)
+                      - generic [ref=f3e384]:
+                        - generic [ref=f3e385]: 【描述】订单支付时间,格式为yyyy-MM-dd HH:mm:ss
+                        - generic [ref=f3e386]: 【示例值】2019-08-21 00:00:00
+                    - generic [ref=f3e388]:
+                      - generic [ref=f3e389]:
+                        - generic [ref=f3e390]:
+                          - strong [ref=f3e391]: settle_serial_no
+                          - strong [ref=f3e392]: |清算机构流水号
+                        - generic [ref=f3e393]: 必选
+                        - generic [ref=f3e394]: string
+                        - generic [ref=f3e395]: (64)
+                      - generic [ref=f3e396]:
+                        - generic [ref=f3e397]: 【描述】金融机构发起签约类、支付类、差错类业务时,应为每笔业务分配唯一的交易流水号。31位交易流水号组成规则为:“8位日期”+“16位序列号”+“1位预留位”+“6位控制位”,其中: a)“8位日期”为系统当前日期,ISODate格式:“YYYYMMDD” b)“16位序列号”由金融机构生成,金融机构应确保该值在网联当日唯一 c)“1位预留位”由平台分配 d)“6位控制位”由金融机构通过平台获取 例如:2023052993044491260542090100400
+                        - generic [ref=f3e398]: 【示例值】2023052993044491260542090100400
+                    - generic [ref=f3e400]:
+                      - generic [ref=f3e401]:
+                        - strong [ref=f3e403]: pay_fund_order_id
+                        - generic [ref=f3e404]: 可选
+                        - generic [ref=f3e405]: string
+                        - generic [ref=f3e406]: (32)
+                      - generic [ref=f3e407]:
+                        - generic [ref=f3e408]: 【描述】支付宝支付资金流水号
+                        - generic [ref=f3e409]: 【示例值】20190801110070001506380000251556
+                    - generic [ref=f3e411]:
+                      - generic [ref=f3e412]:
+                        - strong [ref=f3e414]: status
+                        - generic [ref=f3e415]: 可选
+                        - generic [ref=f3e416]: string
+                        - generic [ref=f3e417]: (32)
+                      - generic [ref=f3e418]:
+                        - generic [ref=f3e419]: 【描述】转账单据状态。 SUCCESS(该笔转账交易成功):成功; FAIL:失败(具体失败原因请参见error_code以及fail_reason返回值); DEALING:处理中(转账到支付宝账户不涉及); REFUND:退票(转账到支付宝账户不涉及);
+                        - generic [ref=f3e420]: 【示例值】SUCCESS
+                    - generic [ref=f3e422]:
+                      - generic [ref=f3e423]:
+                        - generic [ref=f3e424]:
+                          - strong [ref=f3e425]: sub_status
+                          - strong [ref=f3e426]: |单据子状态
+                        - generic [ref=f3e427]: 可选
+                        - generic [ref=f3e428]: string
+                        - generic [ref=f3e429]: (64)
+                      - generic [ref=f3e430]:
+                        - generic [ref=f3e431]: 【描述】转账单据子状态。 SUCCESS(二阶段转账到支付宝账户领取成功): REFUNDED:退款(二阶段转账到支付宝账户退款);
+                        - generic [ref=f3e432]: 【示例值】SUCCESS
+                    - generic [ref=f3e434]:
+                      - generic [ref=f3e435]:
+                        - generic [ref=f3e436]:
+                          - strong [ref=f3e437]: amount
+                          - strong [ref=f3e438]: |金额
+                        - generic [ref=f3e439]: 可选
+                        - generic [ref=f3e440]: string
+                        - generic [ref=f3e441]: (20)
+                      - generic [ref=f3e442]:
+                        - generic [ref=f3e443]: 【描述】转账金额,单位为元,默认为空,特殊场景提供。
+                        - generic [ref=f3e444]: 【示例值】12.01
+                    - generic [ref=f3e446]:
+                      - generic [ref=f3e447]:
+                        - generic [ref=f3e448]:
+                          - strong [ref=f3e449]: link
+                          - strong [ref=f3e450]: |访问链接
+                        - generic [ref=f3e451]: 可选
+                        - generic [ref=f3e452]: string
+                        - generic [ref=f3e453]: (1024)
+                      - generic [ref=f3e454]:
+                        - generic [ref=f3e455]: 【描述】访问链接,用于多阶段转账时,后续阶段跳转支付宝端内领取阵地使用
+                        - generic [ref=f3e456]: "【示例值】o:/pHxYBs7042zs 或復枝此消息打开zh i`怤保,来完成这笔转账 b:/I HU0r89 2022/05/15"
+                    - generic [ref=f3e458]:
+                      - generic [ref=f3e459]:
+                        - generic [ref=f3e460]:
+                          - strong [ref=f3e461]: sub_pay_fund_order_id
+                          - strong [ref=f3e462]: |支付宝支付子单资金流水号
+                        - generic [ref=f3e463]: 可选
+                        - generic [ref=f3e464]: string
+                        - generic [ref=f3e465]: (64)
+                      - generic [ref=f3e466]:
+                        - generic [ref=f3e467]: 【描述】支付宝支付子单资金流水号,当二阶段主子单场景时需要使用该单号去下载电子回单
+                        - generic [ref=f3e468]: 【示例值】20260706020070011570100025938503
+                - generic [ref=f3e470]:
+                  - generic [ref=f3e471]: 响应示例
+                  - generic [ref=f3e472]:
+                    - generic [ref=f3e473]:
+                      - tablist [ref=f3e474]:
+                        - generic [ref=f3e476]:
+                          - tab "正常示例" [selected] [ref=f3e478] [cursor=pointer]
+                          - tab "异常示例" [ref=f3e481] [cursor=pointer]
+                      - generic:
+                        - generic:
+                          - tabpanel "正常示例"
+                    - code [ref=f3e487]: "{ \"alipay_fund_trans_uni_transfer_response\": { \"code\": \"10000\", \"msg\": \"Success\", \"out_biz_no\": \"201808080001\", \"order_id\": \"20190801110070000006380000250621\", \"pay_fund_order_id\": \"20190801110070001506380000251556\", \"status\": \"SUCCESS\", \"sub_status\": \"SUCCESS\", \"amount\": \"12.01\", \"trans_date\": \"2019-08-21 00:00:00\", \"settle_serial_no\": \"2023052993044491260542090100400\", \"link\": \"o:/pHxYBs7042zs 或復枝此消息打开zh i`怤保,来完成这笔转账 b:/I HU0r89 2022/05/15\", \"sub_pay_fund_order_id\": \"20260706020070011570100025938503\" }, \"sign\": \"ERITJKEIJKJHKKKKKKKHJEREEEEEEEEEEE\" }"
+                  - generic [ref=f3e490]: 说明:本示例仅供参考。
+              - heading [level=2] [ref=f3e491]
+              - link "前往查看" [ref=f3e493] [cursor=pointer]:
+                - /url: https://opendoc.alipay.com/common/02km9f
+              - heading [level=2] [ref=f3e494]
+              - table [ref=f3e502]:
+                - rowgroup [ref=f3e507]:
+                  - row [ref=f3e508]:
+                    - columnheader "错误码" [ref=f3e509]
+                    - columnheader "错误描述" [ref=f3e510]
+                    - columnheader "解决方案" [ref=f3e511]
+                - rowgroup [ref=f3e512]:
+                  - row [ref=f3e513]:
+                    - cell "SYSTEM_ERROR" [ref=f3e514]
+                    - cell "系统繁忙" [ref=f3e515]
+                    - cell "服务器异常 可能发生了网络或者系统异常,导致服务调用失败,商户可以用同样的请求发起重试" [ref=f3e516]
+                  - row [ref=f3e518]:
+                    - cell "INVALID_PARAMETER" [ref=f3e519]
+                    - cell "参数有误" [ref=f3e520]
+                    - cell "请根据接口返回的参数非法的具体错误信息,修改参数后进行重试" [ref=f3e521]
+                  - row [ref=f3e523]:
+                    - cell "ACCOUNT_BOOK_SCENE_CODE_EXCEPTION" [ref=f3e524]
+                    - cell "accountbook_scene_code参数错误,请检查入参信息" [ref=f3e525]
+                    - cell "accountbook_scene_code参数错误,请检查入参信息" [ref=f3e526]
+                  - row [ref=f3e528]:
+                    - cell "ACCOUNT_IN_NOT_EXIST" [ref=f3e529]
+                    - cell "271账号不存在" [ref=f3e530]
+                    - cell "请先充值手续费" [ref=f3e531]
+                  - row [ref=f3e533]:
+                    - cell "ACCOUNT_OPERATION_LIMIT" [ref=f3e534]
+                    - cell "贷方账户账务操作受限" [ref=f3e535]
+                    - cell "当前使用的安全发记账本归属的余额账户存在限制,请检查余额账户的状态。" [ref=f3e536]
+                  - row [ref=f3e538]:
+                    - cell "ALREADY_WITHDRAW_STD_RED_PACKET" [ref=f3e539]
+                    - cell "存在红包领取记录,不允许再次领取" [ref=f3e540]
+                    - cell "红包场景每个支付宝账号对于同一个红包只允许领取一次。" [ref=f3e541]
+                  - row [ref=f3e543]:
+                    - cell "AUTHOREE_IS_NOT_MATCH" [ref=f3e544]
+                    - cell "参数错误,无法操作当前入参账户,请检查相关协议信息" [ref=f3e545]
+                    - cell "检查协议与收付款方主体关系,确认参数后重试" [ref=f3e546]
+                  - row [ref=f3e548]:
+                    - cell "AUTH_LOGONID_CHANGED" [ref=f3e549]
+                    - cell "收款方授权登录号与当前绑定登录号不一致,请引导用户重新授权。" [ref=f3e550]
+                    - cell "收款方授权登录号与当前支付宝绑定的登录号不一致,请引导用户重新授权,获取用户新的支付宝会员信息。" [ref=f3e551]
+                  - row [ref=f3e553]:
+                    - cell "BALANCE_IS_NOT_ENOUGH" [ref=f3e554]
+                    - cell "付款方余额不足,建议尽快充值。商户后续可登录电脑端支付宝,自主设置余额预警提醒功能(登录B.Alipay-资金管理-资产总览-余额提醒)进行设置" [ref=f3e555]
+                    - cell "请更换付款方或者充值后再重试" [ref=f3e556]
+                  - row [ref=f3e558]:
+                    - cell "BALANCE_IS_NOT_ENOUGH" [ref=f3e559]
+                    - cell "余额不足" [ref=f3e560]
+                    - cell "当前场景余额不足,无法完成本次操作,请充值后重新发起。" [ref=f3e561]
+                  - row [ref=f3e563]:
+                    - cell "BALANCE_IS_NOT_ENOUGH" [ref=f3e564]
+                    - cell "GN代扣返回-余额不足" [ref=f3e565]
+                    - cell "余额不足,请根据实际场景做充值操作" [ref=f3e566]
+                  - row [ref=f3e568]:
+                    - cell "BALANCE_NOT_ENOUGH" [ref=f3e569]
+                    - cell "余额不足" [ref=f3e570]
+                    - cell "余额不足,请充值后再试" [ref=f3e571]
+                  - row [ref=f3e573]:
+                    - cell "BALANCE_NOT_ENOUGH_FOR_CARD_FEE" [ref=f3e574]
+                    - cell "余额不足,无法扣取转账到卡服务费" [ref=f3e575]
+                    - cell "转账到卡需收取服务费,一般向接口调用方收取(特殊签约下只向付款方收费)。请确保余额有足够金额支付服务费,服务费=转账总金额×费率" [ref=f3e576]
+                  - row [ref=f3e578]:
+                    - cell "BANKCODE_OR_BRANCHNAME_INFO_ERROR" [ref=f3e579]
+                    - cell "需要填写正确的<a href=\"https://opendocs.alipay.com/open/021njv\">联行号或支行信息</a>" [ref=f3e580]
+                    - cell [ref=f3e581]:
+                      - generic [ref=f3e582]:
+                        - link "进行查看" [ref=f3e583] [cursor=pointer]:
+                          - /url: https://opendocs.alipay.com/open/021njv
+                        - text: ,并填写银行机构及联行号等信息。
+                  - row [ref=f3e584]:
+                    - cell "BANK_RESPONSE_ERROR" [ref=f3e585]
+                    - cell "银行返回转账失败:银行卡状态不正确。" [ref=f3e586]
+                    - cell "银行返回转账失败,请检查用户银行卡状态。(具体错误码及错误原因请查看支付宝异步通知)" [ref=f3e587]
+                  - row [ref=f3e589]:
+                    - cell "BANK_RESPONSE_ERROR" [ref=f3e590]
+                    - cell "银行返回转账失败:账户不存在。" [ref=f3e591]
+                    - cell "银行返回转账失败。(具体错误码及错误原因请查看支付宝异步通知)" [ref=f3e592]
+                  - row [ref=f3e594]:
+                    - cell "BANK_RESPONSE_ERROR" [ref=f3e595]
+                    - cell "银行返回转账失败:账户已销户。" [ref=f3e596]
+                    - cell "银行返回转账失败,请检查用户银行卡状态。(具体错误码及错误原因请查看支付宝异步通知)" [ref=f3e597]
+                  - row [ref=f3e599]:
+                    - cell "BANK_RESPONSE_ERROR" [ref=f3e600]
+                    - cell "银行返回转账失败:账户已冻结" [ref=f3e601]
+                    - cell "银行返回转账失败,请检查用户银行卡状态。(具体错误码及错误原因请查看支付宝异步通知)" [ref=f3e602]
+                  - row [ref=f3e604]:
+                    - cell "BANK_RESPONSE_ERROR" [ref=f3e605]
+                    - cell "银行返回转账失败:账户挂失" [ref=f3e606]
+                    - cell "银行返回转账失败,请检查用户银行卡状态。(具体错误码及错误原因请查看支付宝异步通知)" [ref=f3e607]
+                  - row [ref=f3e609]:
+                    - cell "BANK_RESPONSE_ERROR" [ref=f3e610]
+                    - cell "银行返回转账失败:付款失败,请换卡重试" [ref=f3e611]
+                    - cell "银行返回转账失败,请检查用户银行卡状态。(具体错误码及错误原因请查看支付宝异步通知)" [ref=f3e612]
+                  - row [ref=f3e614]:
+                    - cell "BANK_RESPONSE_ERROR" [ref=f3e615]
+                    - cell "银行返回转账失败:交易金额超过银行端的每日限额" [ref=f3e616]
+                    - cell "银行返回转账失败。(具体错误码及错误原因请查看支付宝异步通知)" [ref=f3e617]
+                  - row [ref=f3e619]:
+                    - cell "BANK_RESPONSE_ERROR" [ref=f3e620]
+                    - cell "银行返回转账失败:金额非法" [ref=f3e621]
+                    - cell "银行返回转账失败。(具体错误码及错误原因请查看支付宝异步通知)" [ref=f3e622]
+                  - row [ref=f3e624]:
+                    - cell "BANK_RESPONSE_ERROR" [ref=f3e625]
+                    - cell "银行返回转账失败:银行处理系统失败" [ref=f3e626]
+                    - cell "银行返回转账失败。(具体错误码及错误原因请查看支付宝异步通知)" [ref=f3e627]
+                  - row [ref=f3e629]:
+                    - cell "BANK_RESPONSE_ERROR" [ref=f3e630]
+                    - cell "银行返回转账失败:银行系统问题,不可重试" [ref=f3e631]
+                    - cell "银行返回转账失败。(具体错误码及错误原因请查看支付宝异步通知)" [ref=f3e632]
+                  - row [ref=f3e634]:
+                    - cell "BANK_RESPONSE_ERROR" [ref=f3e635]
+                    - cell "银行返回转账失败:系统繁忙,请稍后再试" [ref=f3e636]
+                    - cell "银行返回转账失败。(具体错误码及错误原因请查看支付宝异步通知)" [ref=f3e637]
+                  - row [ref=f3e639]:
+                    - cell "BANK_RESPONSE_ERROR" [ref=f3e640]
+                    - cell "银行返回转账失败:协议状态不正确,请重新绑卡后再试" [ref=f3e641]
+                    - cell "银行返回转账失败。(具体错误码及错误原因请查看支付宝异步通知)" [ref=f3e642]
+                  - row [ref=f3e644]:
+                    - cell "BANK_RESPONSE_ERROR" [ref=f3e645]
+                    - cell "银行返回转账失败:提现金额超过银行端的每日限额" [ref=f3e646]
+                    - cell "银行返回转账失败。(具体错误码及错误原因请查看支付宝异步通知)" [ref=f3e647]
+                  - row [ref=f3e649]:
+                    - cell "BANK_RESPONSE_ERROR" [ref=f3e650]
+                    - cell "银行返回转账失败:不支持该类型交易,建议换单重试。" [ref=f3e651]
+                    - cell "银行返回转账失败。(具体错误码及错误原因请查看支付宝异步通知)" [ref=f3e652]
+                  - row [ref=f3e654]:
+                    - cell "BANK_RESPONSE_ERROR" [ref=f3e655]
+                    - cell "银行返回转账失败:账号和户名不一致" [ref=f3e656]
+                    - cell "银行返回转账失败。(具体错误码及错误原因请查看支付宝异步通知)" [ref=f3e657]
+                  - row [ref=f3e659]:
+                    - cell "BANK_RESPONSE_ERROR" [ref=f3e660]
+                    - cell "银行返回转账失败:银行账户信息有误或状态异常" [ref=f3e661]
+                    - cell "银行返回转账失败。(具体错误码及错误原因请查看支付宝异步通知)" [ref=f3e662]
+                  - row [ref=f3e664]:
+                    - cell "BANK_RESPONSE_ERROR" [ref=f3e665]
+                    - cell "银行返回转账失败:银行账号不存在或账号有误" [ref=f3e666]
+                    - cell "银行返回转账失败。(具体错误码及错误原因请查看支付宝异步通知)" [ref=f3e667]
+                  - row [ref=f3e669]:
+                    - cell "BANK_RESPONSE_ERROR" [ref=f3e670]
+                    - cell "银行返回转账失败:暂不支持该类银行账户" [ref=f3e671]
+                    - cell "银行返回转账失败。(具体错误码及错误原因请查看支付宝异步通知)" [ref=f3e672]
+                  - row [ref=f3e674]:
+                    - cell "BANK_RESPONSE_ERROR" [ref=f3e675]
+                    - cell "银行返回转账失败:银行账户状态异常(欠费)" [ref=f3e676]
+                    - cell "银行返回转账失败。(具体错误码及错误原因请查看支付宝异步通知)" [ref=f3e677]
+                  - row [ref=f3e679]:
+                    - cell "BANK_RESPONSE_ERROR" [ref=f3e680]
+                    - cell "银行返回转账失败:银行账户状态异常(长期不动)" [ref=f3e681]
+                    - cell "银行返回转账失败。(具体错误码及错误原因请查看支付宝异步通知)" [ref=f3e682]
+                  - row [ref=f3e684]:
+                    - cell "BANK_RESPONSE_ERROR" [ref=f3e685]
+                    - cell "银行返回转账失败:银行账户状态异常(未激活)" [ref=f3e686]
+                    - cell "银行返回转账失败。(具体错误码及错误原因请查看支付宝异步通知)" [ref=f3e687]
+                  - row [ref=f3e689]:
+                    - cell "BIZ_UNIQUE_EXCEPTION" [ref=f3e690]
+                    - cell "商户订单号冲突。" [ref=f3e691]
+                    - cell "商户订单号冲突。" [ref=f3e692]
+                  - row [ref=f3e694]:
+                    - cell "BLOCK_USER_FORBBIDEN_RECIEVE" [ref=f3e695]
+                    - cell "账户异常被冻结,无法收款,请咨询支付宝客服95188" [ref=f3e696]
+                    - cell "账户异常被冻结,无法收款,请咨询支付宝客服95188" [ref=f3e697]
+                  - row [ref=f3e699]:
+                    - cell "BLOCK_USER_FORBBIDEN_SEND" [ref=f3e700]
+                    - cell "该账户被冻结,暂不可将资金转出。" [ref=f3e701]
+                    - cell "联系支付宝客服咨询" [ref=f3e702]
+                  - row [ref=f3e704]:
+                    - cell "CARD_BIN_ERROR" [ref=f3e705]
+                    - cell "收款人银行账号不正确" [ref=f3e706]
+                    - cell "请确认收款人银行账号正确性,要求为借记卡卡号。" [ref=f3e707]
+                  - row [ref=f3e709]:
+                    - cell "CHECK_RECEIVER_CERT_NOT_ALLOW" [ref=f3e710]
+                    - cell "当前功能定向开放,请联系支付宝业务经理申请开通" [ref=f3e711]
+                    - cell "当前功能定向开放,请联系支付宝业务经理申请开通" [ref=f3e712]
+                  - row [ref=f3e714]:
+                    - cell "CONFIGURATION_ERROR" [ref=f3e715]
+                    - cell "不支持当前业务场景转账" [ref=f3e716]
+                    - cell "不支持当前业务场景转账,请联系支付宝业务对接方" [ref=f3e717]
+                  - row [ref=f3e719]:
+                    - cell "CONTRACTOR_ACCOUNT_BOOK_NOT_FUND" [ref=f3e720]
+                    - cell "灵工筹服务商记账本不存在" [ref=f3e721]
+                    - cell "请检查三方协议涉及的灵工服务商是否成功签约记账本" [ref=f3e722]
+                  - row [ref=f3e724]:
+                    - cell "CURREBT_AFTER_INVALID_TIME" [ref=f3e725]
+                    - cell "过期时间不能晚于当前时间" [ref=f3e726]
+                    - cell "过期时间不能晚于当前时间" [ref=f3e727]
+                  - row [ref=f3e729]:
+                    - cell "CURRENCY_NOT_SUPPORT" [ref=f3e730]
+                    - cell "币种不支持" [ref=f3e731]
+                    - cell "请查询签约是否涵盖请求币种,目前用于结汇入境场景" [ref=f3e732]
+                  - row [ref=f3e734]:
+                    - cell "EMPLOYEE_SERVICE_NOT_EXIST" [ref=f3e735]
+                    - cell "雇员服务不存在" [ref=f3e736]
+                    - cell "请检查对应的灵工之家服务是否有效" [ref=f3e737]
+                  - row [ref=f3e739]:
+                    - cell "ENTERPRISE_IDENTITY_INFO_NEED_UPDATE" [ref=f3e740]
+                    - cell "支付宝企业账户需要更新证照信息。" [ref=f3e741]
+                    - cell "根据国家相关法律法规要求,您的身份信息需要更新,请进入支付宝商家中心【账号中心】-【证照信息修改】-【更新企业信息】更新后再使用服务" [ref=f3e742]
+                  - row [ref=f3e744]:
+                    - cell "ENTRUST_TRANSFER_NO_ACCOUNT_PAYMENT_PERMISSION" [ref=f3e745]
+                    - cell "服务未开通" [ref=f3e746]
+                    - cell "服务未开通" [ref=f3e747]
+                  - row [ref=f3e749]:
+                    - cell "EXCEED_LIMIT_DC_RECEIVED" [ref=f3e750]
+                    - cell "收款方单日收款笔数超限" [ref=f3e751]
+                    - cell "收款方向同一个付款用户每日只能收款固定的笔数,超限后请让用户第二天再收。" [ref=f3e752]
+                  - row [ref=f3e754]:
+                    - cell "EXCEED_LIMIT_DM_AMOUNT" [ref=f3e755]
+                    - cell "日累计额度超限" [ref=f3e756]
+                    - cell "请根据接入文档说明检查本日请求总金额+本次请求金额是否超限。" [ref=f3e757]
+                  - row [ref=f3e759]:
+                    - cell "EXCEED_LIMIT_DM_MAX_AMOUNT" [ref=f3e760]
+                    - cell "超出单日转账限额,如有疑问请咨询支付宝热线95188" [ref=f3e761]
+                    - cell "超出单日转账限额,如有疑问请咨询支付宝热线95188" [ref=f3e762]
+                  - row [ref=f3e764]:
+                    - cell "EXCEED_LIMIT_ENT_SM_AMOUNT" [ref=f3e765]
+                    - cell "转账给企业用户超过单笔限额" [ref=f3e766]
+                    - cell "1. 10w分成多次转账给企业用户。 2. 联系BD同学改签协议,修改单笔限额" [ref=f3e767]
+                  - row [ref=f3e769]:
+                    - cell "EXCEED_LIMIT_INTERNAL_SM_AMOUNT" [ref=f3e770]
+                    - cell "单笔转账金额超过限额" [ref=f3e771]
+                    - cell "单笔转账金额超过限额" [ref=f3e772]
+                  - row [ref=f3e774]:
+                    - cell "EXCEED_LIMIT_MM_AMOUNT" [ref=f3e775]
+                    - cell "月累计金额超限" [ref=f3e776]
+                    - cell "请根据接入文档说明检查本月请求总金额+本次请求金额是否超限。" [ref=f3e777]
+                  - row [ref=f3e779]:
+                    - cell "EXCEED_LIMIT_MM_MAX_AMOUNT" [ref=f3e780]
+                    - cell "超出单月转账限额,如有疑问请咨询支付宝热线95188" [ref=f3e781]
+                    - cell "超出单月转账限额,如有疑问请咨询支付宝热线95188" [ref=f3e782]
+                  - row [ref=f3e784]:
+                    - cell "EXCEED_LIMIT_PERSONAL_SM_AMOUNT" [ref=f3e785]
+                    - cell "超出转账给个人支付宝账户的单笔限额" [ref=f3e786]
+                    - cell "超出转账给个人支付宝账户的单笔限额" [ref=f3e787]
+                  - row [ref=f3e789]:
+                    - cell "EXCEED_LIMIT_SM_AMOUNT" [ref=f3e790]
+                    - cell "单笔额度超限" [ref=f3e791]
+                    - cell "请根据接入文档检查amount字段" [ref=f3e792]
+                  - row [ref=f3e794]:
+                    - cell "EXCEED_LIMIT_SM_MIN_AMOUNT" [ref=f3e795]
+                    - cell "小于单笔最低转账金额" [ref=f3e796]
+                    - cell "请修改转账金额。" [ref=f3e797]
+                  - row [ref=f3e799]:
+                    - cell "EXCEED_LIMIT_UNRN_DM_AMOUNT" [ref=f3e800]
+                    - cell "收款账户未实名,超出其单日收款限额" [ref=f3e801]
+                    - cell "收款账户未实名,超出其单日收款限额" [ref=f3e802]
+                  - row [ref=f3e804]:
+                    - cell "EXPAND_INDIRECT_VERIFY_FAIL" [ref=f3e805]
+                    - cell "经校验,缺乏进件信息,请调用进件接口补充进件信息" [ref=f3e806]
+                    - cell "经校验,缺乏进件信息,请调用进件接口补充进件信息" [ref=f3e807]
+                  - row [ref=f3e809]:
+                    - cell "FLEXIBLE_STAFFING_HIGH_RISK_RECEIVER" [ref=f3e810]
+                    - cell "灵工场景下该收款方存在风险" [ref=f3e811]
+                    - cell "灵工业务内预期错误,无需技术排查" [ref=f3e812]
+                  - row [ref=f3e814]:
+                    - cell "FLEXIBLE_STAFFING_POTENTIAL_RISK_RECEIVER" [ref=f3e815]
+                    - cell "灵工场景下该收款方存在潜在风险" [ref=f3e816]
+                    - cell "灵工业务内预期错误,无需技术排查" [ref=f3e817]
+                  - row [ref=f3e819]:
+                    - cell "FLEXIBLE_STAFFING_RISK_CONSULT_RISK_RECEIVER" [ref=f3e820]
+                    - cell "该收款方在灵活用工反欺诈场景下存在风险,转账失败" [ref=f3e821]
+                    - cell "该收款方在灵活用工反欺诈场景下存在风险,转账失败" [ref=f3e822]
+                  - row [ref=f3e824]:
+                    - cell "FLEXIBLE_STAFFING_RISK_CONSULT_UNAUTHORIZED_CONSULT" [ref=f3e825]
+                    - cell "该收款用户未完成授权动作,请重新确认" [ref=f3e826]
+                    - cell "该收款用户未完成授权动作,请重新确认" [ref=f3e827]
+                  - row [ref=f3e829]:
+                    - cell "FLEXIBLE_STAFFING_RISK_CONSULT_UNSIGNED_MERCHANT" [ref=f3e830]
+                    - cell "您未签约灵活用工反欺诈服务产品" [ref=f3e831]
+                    - cell "您未签约灵活用工反欺诈服务产品" [ref=f3e832]
+                  - row [ref=f3e834]:
+                    - cell "FLEXIBLE_STAFFING_RISK_CONSULT_USER_NOT_EXIST" [ref=f3e835]
+                    - cell "收款账户有误,请核实后重试" [ref=f3e836]
+                    - cell "收款账户有误,请核实后重试" [ref=f3e837]
+                  - row [ref=f3e839]:
+                    - cell "FLEXIBLE_STAFFING_UN_KNOWN_RISK_RECEIVER" [ref=f3e840]
+                    - cell "灵工场景下该收款方风险等级未知" [ref=f3e841]
+                    - cell "系统异常,灵工场景下该收款方风险等级未知,请稍后重试。" [ref=f3e842]
+                  - row [ref=f3e844]:
+                    - cell "FORBID_OPERATION_USER_WALLET" [ref=f3e845]
+                    - cell "当前请求方无权操作当前用户的钱包账户" [ref=f3e846]
+                    - cell "请检查钱包id" [ref=f3e847]
+                  - row [ref=f3e849]:
+                    - cell "FUND_PROTITOPN_NOT_MATCH" [ref=f3e850]
+                    - cell "资金分类项目比例和不为1" [ref=f3e851]
+                    - cell "检查资金分类项目比例和" [ref=f3e852]
+                  - row [ref=f3e854]:
+                    - cell "FUND_WALLET_INST_NOT_EXIST" [ref=f3e855]
+                    - cell "钱包账户不存在" [ref=f3e856]
+                    - cell "检查钱包id参数" [ref=f3e857]
+                  - row [ref=f3e859]:
+                    - cell "FUND_WALLET_UNAVAILABLE" [ref=f3e860]
+                    - cell "资金钱包不可用" [ref=f3e861]
+                    - cell "检查钱包状态,联系支付宝客服" [ref=f3e862]
+                  - row [ref=f3e864]:
+                    - cell "GLOBAL_USER_FORBBIDEN_RECIEVE" [ref=f3e865]
+                    - cell "当前暂不支持收款方为海外支付宝账户" [ref=f3e866]
+                    - cell "当前暂不支持收款方为海外支付宝账户。" [ref=f3e867]
+                  - row [ref=f3e869]:
+                    - cell "IDENTITY_CARD_INFO_INVALID" [ref=f3e870]
+                    - cell "客户下身份证影印件缺失" [ref=f3e871]
+                    - cell "客户下身份证影印件已过期,请更新证件信息后重试" [ref=f3e872]
+                  - row [ref=f3e874]:
+                    - cell "IDENTITY_FUND_RELATION_NOT_FOUND" [ref=f3e875]
+                    - cell "收款方身份证号未绑定支付宝账号" [ref=f3e876]
+                    - cell "请联系收款方在支付宝收钱宝小程序中进行该身份证号的绑定,如有疑问请咨询支付宝热线95188。" [ref=f3e877]
+                  - row [ref=f3e879]:
+                    - cell "ILLEGAL_OPERATION" [ref=f3e880]
+                    - cell "您的失败请求过多已命中安全策略,已将交易拦截,请准确填写收款账户信息再次发起交易。" [ref=f3e881]
+                    - cell "您的失败请求过多已命中安全策略,已将交易拦截,请准确填写收款账户信息再次发起交易。" [ref=f3e882]
+                  - row [ref=f3e884]:
+                    - cell "ILLEGAL_REQUEST_USER_ID" [ref=f3e885]
+                    - cell "请求方非法,无权调用当前接口" [ref=f3e886]
+                    - cell "请求方非法,请联系支付宝业务对接方" [ref=f3e887]
+                  - row [ref=f3e889]:
+                    - cell "ILLEGAL_STATUS_EXCEPTION" [ref=f3e890]
+                    - cell "单据状态异常" [ref=f3e891]
+                    - cell "请检查单据状态是否合法" [ref=f3e892]
+                  - row [ref=f3e894]:
+                    - cell "INST_PAY_REMARK_UNVALID_CHARS" [ref=f3e895]
+                    - cell "备注中含有银行不支持的字符<>&‘^" [ref=f3e896]
+                    - cell "转账到银行卡的备注中不要含有如下字符<>&‘^" [ref=f3e897]
+                  - row [ref=f3e899]:
+                    - cell "INST_PAY_UNABLE" [ref=f3e900]
+                    - cell "资金流出能力不具备" [ref=f3e901]
+                    - cell "可能由于银行渠道在维护或无T0渠道,与联系支付宝客服确认。" [ref=f3e902]
+                  - row [ref=f3e904]:
+                    - cell "INVALID_CARDNO" [ref=f3e905]
+                    - cell "无效的收款卡号" [ref=f3e906]
+                    - cell "无效的收款卡号,请确认" [ref=f3e907]
+                  - row [ref=f3e909]:
+                    - cell "INVALID_PAYER_ACCOUNT" [ref=f3e910]
+                    - cell "付款方不在设置的付款账户列表中" [ref=f3e911]
+                    - cell "请核对付款方是否在销售方案付款账户列表中" [ref=f3e912]
+                  - row [ref=f3e914]:
+                    - cell "INVALID_TAX_BILL_AGREEMENT" [ref=f3e915]
+                    - cell "三方协议不存在或者协议签约状态异常" [ref=f3e916]
+                    - cell "请检查三方协议是否正确有效,如果协议无异常,请检查收款方身份是否与签约信息匹配。" [ref=f3e917]
+                  - row [ref=f3e919]:
+                    - cell "ISV_AUTH_ERROR" [ref=f3e920]
+                    - cell "当前场景下不支持isv授权" [ref=f3e921]
+                    - cell "1. 检查商户产品码和场景码,当前场景下不支持isv授权。 2. 去除isv授权模式,改为自调用。" [ref=f3e922]
+                  - row [ref=f3e924]:
+                    - cell "JUDICIAL_FREEZE" [ref=f3e925]
+                    - cell "操作账号被司法冻结" [ref=f3e926]
+                    - cell "当前操作账号被司法冻结,无法操作,请联系服务热线95188" [ref=f3e927]
+                  - row [ref=f3e929]:
+                    - cell "MEMO_REQUIRED_IN_TRANSFER_ERROR" [ref=f3e930]
+                    - cell "根据监管部门的要求,单笔转账金额达到50000元时,需要填写付款理由" [ref=f3e931]
+                    - cell "请填写remark或memo字段。" [ref=f3e932]
+                  - row [ref=f3e934]:
+                    - cell "MID_ACCOUNT_CHECK_ERROR" [ref=f3e935]
+                    - cell "中间方账号检查失败" [ref=f3e936]
+                    - cell "中间方账号检查失败或者账号异常,请联系支付宝客服检查该用户状态是否正常。" [ref=f3e937]
+                  - row [ref=f3e939]:
+                    - cell "MID_ACCOUNT_STATUS_ERROR" [ref=f3e940]
+                    - cell "中间方账号状态异常" [ref=f3e941]
+                    - cell "请换中间方账号再重试。" [ref=f3e942]
+                  - row [ref=f3e944]:
+                    - cell "MID_ACCOUNT_TYPE_ERROR" [ref=f3e945]
+                    - cell "不支持的中间方用户类型" [ref=f3e946]
+                    - cell "不支持的中间方用户类型,请联系中间方用户,更换支付宝账户后重试" [ref=f3e947]
+                  - row [ref=f3e949]:
+                    - cell "MONEY_PAY_CLOSED" [ref=f3e950]
+                    - cell "付款账号余额关闭" [ref=f3e951]
+                    - cell "付款账号余额关闭,请拨打95188咨询" [ref=f3e952]
+                  - row [ref=f3e954]:
+                    - cell "MRCHPROD_QUERY_ERROR" [ref=f3e955]
+                    - cell "系统异常" [ref=f3e956]
+                    - cell "系统内部异常,付款方商户信息查询异常,联系支付宝工程师排查。" [ref=f3e957]
+                  - row [ref=f3e959]:
+                    - cell "NOT_IN_WHITE_LIST" [ref=f3e960]
+                    - cell "产品未准入" [ref=f3e961]
+                    - cell "您的请求不在白名单范围内,请联系与您沟通的支付宝商务小二进行申请。" [ref=f3e962]
+                  - row [ref=f3e964]:
+                    - cell "NOT_SUPPORT_PAYER_ACCOUNT_TYPE" [ref=f3e965]
+                    - cell "不支持当前付款方类型" [ref=f3e966]
+                    - cell "根据接入文档说明,调整为正确的付款方" [ref=f3e967]
+                  - row [ref=f3e969]:
+                    - cell "NO_ACCOUNTBOOK_PERMISSION" [ref=f3e970]
+                    - cell "没有该记账本的使用权限" [ref=f3e971]
+                    - cell "没有该记账本的使用权限,请确认记账本信息和相关参数是否正确" [ref=f3e972]
+                  - row [ref=f3e974]:
+                    - cell "NO_ACCOUNTBOOK_PERMISSION" [ref=f3e975]
+                    - cell "无记账本的访问权限" [ref=f3e976]
+                    - cell "无记账本的访问权限,请检查记账本授权是否有效" [ref=f3e977]
+                  - row [ref=f3e979]:
+                    - cell "NO_ACCOUNT_PAYMENT_PERMISSION" [ref=f3e980]
+                    - cell "不支持的付款账户类型或没有该账户的支付权限" [ref=f3e981]
+                    - cell "请检查付款方账号和账号类型" [ref=f3e982]
+                  - row [ref=f3e984]:
+                    - cell "NO_ACCOUNT_RECEIVE_PERMISSION" [ref=f3e985]
+                    - cell "不支持的收款账户类型或者没有该账户的收款权限" [ref=f3e986]
+                    - cell "请检查收款方的账号和账号类型" [ref=f3e987]
+                  - row [ref=f3e989]:
+                    - cell "NO_ACCOUNT_USER_FORBBIDEN_RECIEVE" [ref=f3e990]
+                    - cell "当前操作存在风险,请停止操作,如有疑问请咨询支付宝热线95188" [ref=f3e991]
+                    - cell "没有余额账号用户禁止收款,需联系客户95188。" [ref=f3e992]
+                  - row [ref=f3e994]:
+                    - cell "NO_AVAILABLE_PAYMENT_TOOLS" [ref=f3e995]
+                    - cell "您当前无法支付,请咨询95188" [ref=f3e996]
+                    - cell "您当前无法支付,请咨询95188" [ref=f3e997]
+                  - row [ref=f3e999]:
+                    - cell "NO_ORDER_PERMISSION" [ref=f3e1000]
+                    - cell "原订单错误,请确认当前账号是否具备处理该订单的权限" [ref=f3e1001]
+                    - cell "原订单错误,请确认当前账号是否具备处理该订单的权限。" [ref=f3e1002]
+                  - row [ref=f3e1004]:
+                    - cell "NO_PERMISSION_ACCOUNT" [ref=f3e1005]
+                    - cell "无权限操作当前付款账号" [ref=f3e1006]
+                    - cell "无权限操作当前付款账号" [ref=f3e1007]
+                  - row [ref=f3e1009]:
+                    - cell "ORDER_NOT_EXIST" [ref=f3e1010]
+                    - cell "原订单不存在,请重新发起尝试" [ref=f3e1011]
+                    - cell "原订单不存在,请重新发起尝试" [ref=f3e1012]
+                  - row [ref=f3e1014]:
+                    - cell "ORDER_STATUS_INVALID" [ref=f3e1015]
+                    - cell "原始单据状态异常,不可操作" [ref=f3e1016]
+                    - cell "orinal_order_id对应的原始单据状态异常,不可继续操作" [ref=f3e1017]
+                  - row [ref=f3e1019]:
+                    - cell "OVERSEA_TRANSFER_CLOSE" [ref=f3e1020]
+                    - cell "您无法进行结汇业务,请联系95188" [ref=f3e1021]
+                    - cell "您无法进行结汇业务,请联系95188" [ref=f3e1022]
+                  - row [ref=f3e1024]:
+                    - cell "PARAMETER_ERROR" [ref=f3e1025]
+                    - cell "参数错误" [ref=f3e1026]
+                    - cell "请检查相关调用参数" [ref=f3e1027]
+                  - row [ref=f3e1029]:
+                    - cell "PARAM_ILLEGAL" [ref=f3e1030]
+                    - cell "参数异常(仅用于WorldFirst)" [ref=f3e1031]
+                    - cell "参数异常,请求检查请求参数" [ref=f3e1032]
+                  - row [ref=f3e1034]:
+                    - cell "PARTITION_FORMAT_ERROR" [ref=f3e1035]
+                    - cell "资金比例格式不正确,请检查小数位" [ref=f3e1036]
+                    - cell "请检查小数位" [ref=f3e1037]
+                  - row [ref=f3e1039]:
+                    - cell "PAYCARD_UNABLE_PAYMENT" [ref=f3e1040]
+                    - cell "付款账户余额支付功能不可用" [ref=f3e1041]
+                    - cell "请付款账户登录支付宝账户开启余额支付功能。" [ref=f3e1042]
+                  - row [ref=f3e1044]:
+                    - cell "PAYEE_ACCOUNT_NOT_EXSIT" [ref=f3e1045]
+                    - cell "收款账号不存在" [ref=f3e1046]
+                    - cell "请检查收款方支付宝余额账号是否存在" [ref=f3e1047]
+                  - row [ref=f3e1049]:
+                    - cell "PAYEE_ACCOUNT_STATUS_ERROR" [ref=f3e1050]
+                    - cell "收款方账号异常" [ref=f3e1051]
+                    - cell "请换收款方账号再重试。" [ref=f3e1052]
+                  - row [ref=f3e1054]:
+                    - cell "PAYEE_ACC_OCUPIED" [ref=f3e1055]
+                    - cell "收款方登录号有多个支付宝账号,无法确认唯一收款账号" [ref=f3e1056]
+                    - cell "收款方登录号有多个支付宝账号,无法确认唯一收款账号,请收款方变更登录号或提供其他支付宝账号进行收款。" [ref=f3e1057]
+                  - row [ref=f3e1059]:
+                    - cell "PAYEE_CARD_INFO_ERROR" [ref=f3e1060]
+                    - cell "收款支付宝账号及户名不一致(到户);收款银行卡非借记卡,或收款银行卡号与机构信息有误(到卡),支持的银行机构" [ref=f3e1061]
+                    - cell [ref=f3e1062]:
+                      - generic [ref=f3e1063]:
+                        - text: "转账到支付宝账户:请联系收款方确认收款账号及户名一致性。转账到银行卡: 请联系收款方核实银行卡号的正确性,及收款银行卡是支持范围内的借记卡("
+                        - link "支持的银行机构列表" [ref=f3e1064] [cursor=pointer]:
+                          - /url: https://opendocs.alipay.com/open/021njv
+                        - text: )
+                  - row [ref=f3e1065]:
+                    - cell "PAYEE_CERT_INFO_ERROR" [ref=f3e1066]
+                    - cell "收款方证件类型或证件号不一致" [ref=f3e1067]
+                    - cell "检查收款方用户证件类型、证件号与真实证件类型、证件号一致性。" [ref=f3e1068]
+                  - row [ref=f3e1070]:
+                    - cell "PAYEE_IDENTITY_NOT_MATCH" [ref=f3e1071]
+                    - cell "收款方MD5身份证号不正确" [ref=f3e1072]
+                    - cell "传入的收款方MD5身份证号匹配失败,与收款方核实后重新传入正确的值" [ref=f3e1073]
+                  - row [ref=f3e1075]:
+                    - cell "PAYEE_MID_CANNOT_SAME" [ref=f3e1076]
+                    - cell "收款方和中间方不能相同" [ref=f3e1077]
+                    - cell "收款方和中间方不能是同一个人,请修改收款方或者中间方信息" [ref=f3e1078]
+                  - row [ref=f3e1080]:
+                    - cell "PAYEE_NOT_EXIST" [ref=f3e1081]
+                    - cell "中间账户报错,收款账号不存在或姓名有误,建议核实账号和姓名是否准确" [ref=f3e1082]
+                    - cell "检查中间账户的identity是否正确,以及identity与identity_type是否匹配" [ref=f3e1083]
+                  - row [ref=f3e1085]:
+                    - cell "PAYEE_NOT_EXIST" [ref=f3e1086]
+                    - cell "收款账号不存在或姓名有误,建议核实账号和姓名是否准确" [ref=f3e1087]
+                    - cell "检查收款方的identity是否正确,以及identity与identity_type是否匹配" [ref=f3e1088]
+                  - row [ref=f3e1090]:
+                    - cell "PAYEE_NOT_RELNAME_CERTIFY" [ref=f3e1091]
+                    - cell "收款方未实名认证" [ref=f3e1092]
+                    - cell "收款方未实名认证" [ref=f3e1093]
+                  - row [ref=f3e1095]:
+                    - cell "PAYEE_OUT_PERMLIMIT_CHECK_FAILURE" [ref=f3e1096]
+                    - cell "收款方限权校验不通过不允许支付" [ref=f3e1097]
+                    - cell "收款方限权校验不通过不允许支付,联系支付宝客服检查付款方受限原因。" [ref=f3e1098]
+                  - row [ref=f3e1100]:
+                    - cell "PAYEE_RECEIVE_COUNT_EXCEED_LIMIT" [ref=f3e1101]
+                    - cell "收款方成功收款次数超过限制" [ref=f3e1102]
+                    - cell "收款方成功收款次数超过限制" [ref=f3e1103]
+                  - row [ref=f3e1105]:
+                    - cell "PAYEE_TRUSTEESHIP_ACC_OVER_LIMIT" [ref=f3e1106]
+                    - cell "收款方托管子户累计收款金额超限" [ref=f3e1107]
+                    - cell "收款方托管子户累计收款金额超限,请绑定支付宝后完成收款。" [ref=f3e1108]
+                  - row [ref=f3e1110]:
+                    - cell "PAYEE_USERINFO_ERROR" [ref=f3e1111]
+                    - cell "收款方用户信息不匹配,一般是姓名有误。" [ref=f3e1112]
+                    - cell "请检查传入的收款方姓名是否正确" [ref=f3e1113]
+                  - row [ref=f3e1115]:
+                    - cell "PAYEE_USERINFO_STATUS_ERROR" [ref=f3e1116]
+                    - cell "收款方用户状态不正常" [ref=f3e1117]
+                    - cell "收款方用户状态不正常无法用于收款" [ref=f3e1118]
+                  - row [ref=f3e1120]:
+                    - cell "PAYEE_USER_IS_INST" [ref=f3e1121]
+                    - cell "根据监管部门的要求,对方是泛金融机构,无法收款。你可通过支付宝向对方银行账户转账。请联系对方提供银行账户信息。" [ref=f3e1122]
+                    - cell "根据监管部门的要求,对方是泛金融机构,无法收款。你可通过支付宝向对方银行账户转账。请联系对方提供银行账户信息。" [ref=f3e1123]
+                  - row [ref=f3e1125]:
+                    - cell "PAYEE_USER_TYPE_ERROR" [ref=f3e1126]
+                    - cell "不支持的收款用户类型" [ref=f3e1127]
+                    - cell "不支持的收款用户类型,请联系收款用户,更换支付宝账户后收款" [ref=f3e1128]
+                  - row [ref=f3e1130]:
+                    - cell "PAYER_ACCOUNT_BOOK_INFO_EXCEPTION" [ref=f3e1131]
+                    - cell "付款方记账本信息有误" [ref=f3e1132]
+                    - cell "请检查入参中记账本相关的参数,如记账本ID,协议号(可选),记账本主体ID等" [ref=f3e1133]
+                  - row [ref=f3e1135]:
+                    - cell "PAYER_ACCOUNT_LIMIT" [ref=f3e1136]
+                    - cell "付款方账户受限不允许支付" [ref=f3e1137]
+                    - cell "付款方账户受限不允许支付,联系支付宝客服检查付款方受限原因。" [ref=f3e1138]
+                  - row [ref=f3e1140]:
+                    - cell "PAYER_AND_PAYEE_BOTH_PERSONAL_ACCOUNT_BOOK" [ref=f3e1141]
+                    - cell "收付款方不允许都为个人记账本" [ref=f3e1142]
+                    - cell "收付款方不允许都为个人记账本" [ref=f3e1143]
+                  - row [ref=f3e1145]:
+                    - cell "PAYER_BALANCE_NOT_ENOUGH" [ref=f3e1146]
+                    - cell "余额不足,建议尽快充值。后续可登录电脑端支付宝,自主设置余额预警提醒功能。" [ref=f3e1147]
+                    - cell "支付时间点付款方余额不足,请向付款账户余额充值后再原请求重试。" [ref=f3e1148]
+                  - row [ref=f3e1150]:
+                    - cell "PAYER_CERTIFY_CHECK_FAIL" [ref=f3e1151]
+                    - cell "付款方人行认证受限" [ref=f3e1152]
+                    - cell "付款方请升级认证等级。" [ref=f3e1153]
+                  - row [ref=f3e1155]:
+                    - cell "PAYER_MID_CANNOT_SAME" [ref=f3e1156]
+                    - cell "付款方和中间方不能相同" [ref=f3e1157]
+                    - cell "付款方和中间方不能是同一个人,请修改付款方或者中间方信息" [ref=f3e1158]
+                  - row [ref=f3e1160]:
+                    - cell "PAYER_NOT_EQUAL_PAYEE_ERROR" [ref=f3e1161]
+                    - cell "托管场景提现收付款方账号不一致" [ref=f3e1162]
+                    - cell "请检查收付款方账号是否一致" [ref=f3e1163]
+                  - row [ref=f3e1165]:
+                    - cell "PAYER_NOT_EQUAL_PAYEE_FOR_BIZ_SCENE_REQUIRED" [ref=f3e1166]
+                    - cell "收付款方不一致,不满足业务场景要求" [ref=f3e1167]
+                    - cell "检查收款账号和付款账号的关系,是否有相关协议支持" [ref=f3e1168]
+                  - row [ref=f3e1170]:
+                    - cell "PAYER_NOT_EXIST" [ref=f3e1171]
+                    - cell "付款方支付宝账户不存在" [ref=f3e1172]
+                    - cell "付款方支付宝账户不存在,请更换付款方再重试" [ref=f3e1173]
+                  - row [ref=f3e1175]:
+                    - cell "PAYER_NOT_RELNAME_CERTIFY" [ref=f3e1176]
+                    - cell "付款方未实名认证" [ref=f3e1177]
+                    - cell "付款方未实名认证,清登录支付宝APP端完成实名认证" [ref=f3e1178]
+                  - row [ref=f3e1180]:
+                    - cell "PAYER_PAYEE_ACCOUNT_NAME_CAN_NOT_SAME" [ref=f3e1181]
+                    - cell "收付款方名称不能相同" [ref=f3e1182]
+                    - cell "收付款方不能是同一个人,请修改收付款方信息" [ref=f3e1183]
+                  - row [ref=f3e1185]:
+                    - cell "PAYER_PAYEE_CANNOT_SAME" [ref=f3e1186]
+                    - cell "收付款方不能相同" [ref=f3e1187]
+                    - cell "收付款方不能是同一个人,请修改收付款方信息" [ref=f3e1188]
+                  - row [ref=f3e1190]:
+                    - cell "PAYER_PERMLIMIT_CHECK_FAILURE" [ref=f3e1191]
+                    - cell "付款方限权校验不通过不允许支付" [ref=f3e1192]
+                    - cell "付款方限权校验不通过不允许支付,联系支付宝客服检查付款方受限原因。" [ref=f3e1193]
+                  - row [ref=f3e1195]:
+                    - cell "PAYER_REQUESTER_RELATION_INVALID" [ref=f3e1196]
+                    - cell "付款方和请求方用户不一致" [ref=f3e1197]
+                    - cell "付款方和请求方用户不一致,存在扫号风险" [ref=f3e1198]
+                  - row [ref=f3e1200]:
+                    - cell "PAYER_STATUS_ERROR" [ref=f3e1201]
+                    - cell "付款账号状态异常" [ref=f3e1202]
+                    - cell "请检查付款方是否进行了自助挂失,如果无,请联系支付宝客服检查用户状态是否正常。" [ref=f3e1203]
+                  - row [ref=f3e1205]:
+                    - cell "PAYER_STATUS_ERROR" [ref=f3e1206]
+                    - cell "付款方用户状态不正常" [ref=f3e1207]
+                    - cell "请检查付款方是否进行了自助挂失,如果无,请联系支付宝客服检查用户状态是否正常。" [ref=f3e1208]
+                  - row [ref=f3e1210]:
+                    - cell "PAYER_STATUS_ERROR" [ref=f3e1211]
+                    - cell "该账户被冻结,暂不可将资金转出。" [ref=f3e1212]
+                    - cell "1. 联系支付宝客户查询用户冻结原因以及协助解除冻结状态。" [ref=f3e1213]
+                  - row [ref=f3e1215]:
+                    - cell "PAYER_UNABLE_PAYMENT" [ref=f3e1216]
+                    - cell "该账户余额支付功能关闭,不可将资金转出。" [ref=f3e1217]
+                    - cell "余额支付功能关闭可能是因为用户自行设置关闭,或被风控处罚等,可咨询95188确认原因及解决方法" [ref=f3e1218]
+                  - row [ref=f3e1220]:
+                    - cell "PAYER_USERINFO_NOT_EXSIT" [ref=f3e1221]
+                    - cell "付款方不存在" [ref=f3e1222]
+                    - cell "1. 检查付款方是否已销户,若销户请更换账户后重新发起业务。 2. 检查入参是否有误。" [ref=f3e1223]
+                  - row [ref=f3e1225]:
+                    - cell "PAYER_USER_INFO_ERROR" [ref=f3e1226]
+                    - cell "付款用户姓名或其它信息不一致" [ref=f3e1227]
+                    - cell "检查付款用户姓名payer_real_name与真实姓名一致性。" [ref=f3e1228]
+                  - row [ref=f3e1230]:
+                    - cell "PAYMENT_FAIL" [ref=f3e1231]
+                    - cell "支付失败" [ref=f3e1232]
+                    - cell "支付失败" [ref=f3e1233]
+                  - row [ref=f3e1235]:
+                    - cell "PAYMENT_INFO_INCONSISTENCY" [ref=f3e1236]
+                    - cell "两次请求商户单号一样,但是参数不一致" [ref=f3e1237]
+                    - cell "如果想重试前一次的请求,请用原参数重试,如果重新发送,请更换单号。" [ref=f3e1238]
+                  - row [ref=f3e1240]:
+                    - cell "PAYMENT_MONEY_NOT_ENOUGH" [ref=f3e1241]
+                    - cell "可用金额为0或不足" [ref=f3e1242]
+                    - cell "资金池领取金额为0或转账金额超过资金池里可使用的金额,比如红包领取 领取金额大于可领取的金额" [ref=f3e1243]
+                  - row [ref=f3e1245]:
+                    - cell "PAYMENT_TIME_EXPIRE" [ref=f3e1246]
+                    - cell "请求已过期" [ref=f3e1247]
+                    - cell "本次单据请求超过最长可支付时间,商户需要重新发起一笔新的业务请求" [ref=f3e1248]
+                  - row [ref=f3e1250]:
+                    - cell "PAY_SALARY_MODE_NOT_SUPPORT" [ref=f3e1251]
+                    - cell "灵工场景不支持的发薪模式" [ref=f3e1252]
+                    - cell "请确认签约授权关系是否支持当前场景" [ref=f3e1253]
+                  - row [ref=f3e1255]:
+                    - cell "PERMIT_CHECK_PERM_AML_CERT_EXPIRED" [ref=f3e1256]
+                    - cell "由于收款人登记的身份证件已过期导致收款受限,请更新证件信息。" [ref=f3e1257]
+                    - cell "根据监管部门的要求,需要付款用户更新身份信息" [ref=f3e1258]
+                  - row [ref=f3e1260]:
+                    - cell "PERMIT_CHECK_PERM_AML_CERT_MISS_ACC_LIMIT" [ref=f3e1261]
+                    - cell "您连续10天余额账户的资金都超过5000元,目前禁止继续操作" [ref=f3e1262]
+                    - cell "连续10天余额账户的资金都超过5000元,根据监管部门的要求,需要付款用户登录支付宝站内或手机客户端补充身份信息才能继续操作" [ref=f3e1263]
+                  - row [ref=f3e1265]:
+                    - cell "PERMIT_CHECK_PERM_IDENTITY_THEFT" [ref=f3e1266]
+                    - cell "您的账户存在身份冒用风险,请进行身份核实解除限制" [ref=f3e1267]
+                    - cell "您的账户存在身份冒用风险,请进行身份核实解除限制" [ref=f3e1268]
+                  - row [ref=f3e1270]:
+                    - cell "PERMIT_CHECK_PERM_LIMITED" [ref=f3e1271]
+                    - cell "根据监管部门的要求,请补全您的身份信息解除限制" [ref=f3e1272]
+                    - cell "根据监管部门的要求,请补全您的身份信息解除限制" [ref=f3e1273]
+                  - row [ref=f3e1275]:
+                    - cell "PERMIT_CHECK_PERM_LIMITED" [ref=f3e1276]
+                    - cell "根据监管部门的要求,请补全您的身份信息解除限制" [ref=f3e1277]
+                    - cell "根据监管部门的要求,请补全您的身份信息解除限制" [ref=f3e1278]
+                  - row [ref=f3e1280]:
+                    - cell "PERMIT_CHECK_RECEIVE_LIMIT" [ref=f3e1281]
+                    - cell "您的账户限制收款,请咨询95188电话咨询" [ref=f3e1282]
+                    - cell "请咨询95188电话咨询" [ref=f3e1283]
+                  - row [ref=f3e1285]:
+                    - cell "PERMIT_CHECK_RECEIVE_LIMIT" [ref=f3e1286]
+                    - cell "您的账户限制收款,请咨询95188电话咨询" [ref=f3e1287]
+                    - cell "您的账户限制收款,请咨询95188电话咨询" [ref=f3e1288]
+                  - row [ref=f3e1290]:
+                    - cell "PERMIT_LIMIT_PAYEE" [ref=f3e1291]
+                    - cell "收款方账户被列为异常账户,账户收款功能被限制,请收款方联系客服" [ref=f3e1292]
+                    - cell "收款方账户被列为异常账户,账户收款功能被限制,请收款方联系客服" [ref=f3e1293]
+                  - row [ref=f3e1295]:
+                    - cell "PERMIT_LIMIT_PAYEE" [ref=f3e1296]
+                    - cell "收款方账户被限制收款,请收款方联系客服" [ref=f3e1297]
+                    - cell "收款方账户被限制收款,请收款方联系客服" [ref=f3e1298]
+                  - row [ref=f3e1300]:
+                    - cell "PERMIT_LIMIT_PAYEE" [ref=f3e1301]
+                    - cell "对方账户有异常行为,已被限制收款,本次交易无法完成" [ref=f3e1302]
+                    - cell "对方账户有异常行为,已被限制收款,本次交易无法完成" [ref=f3e1303]
+                  - row [ref=f3e1305]:
+                    - cell "PERMIT_LIMIT_PAYEE" [ref=f3e1306]
+                    - cell "收款方账户收款功能暂时无法使用" [ref=f3e1307]
+                    - cell "收款方账户收款功能暂时无法使用" [ref=f3e1308]
+                  - row [ref=f3e1310]:
+                    - cell "PERMIT_NON_BANK_LIMIT_PAYEE" [ref=f3e1311]
+                    - cell "收款方未完善身份信息或未开立余额账户,无法收款" [ref=f3e1312]
+                    - cell "根据监管部门的要求,收款方未完善身份信息或未开立余额账户,无法收款" [ref=f3e1313]
+                  - row [ref=f3e1315]:
+                    - cell "PERMIT_NON_BANK_LIMIT_PAYEE" [ref=f3e1316]
+                    - cell "当前操作存在风险,不支持转账,如有疑问请收款方咨询服务热线95188" [ref=f3e1317]
+                    - cell "根据监管部门的要求,收款方未完善身份信息或未开立余额账户,无法收款" [ref=f3e1318]
+                  - row [ref=f3e1320]:
+                    - cell "PERMIT_PAYER_FORBIDDEN" [ref=f3e1321]
+                    - cell "根据监管要求,您今日余额支付额度已用完,请选择其他支付方式进行付款。如有疑问请咨询支付宝热线95188" [ref=f3e1322]
+                    - cell "请咨询支付宝热线95188,检查您的今日余额支付额度或者今年余额支付额度是否足够。或者请选择其他支付方式进行付款。" [ref=f3e1323]
+                  - row [ref=f3e1325]:
+                    - cell "PERMIT_PAYER_LEVEL_FORBIDDEN" [ref=f3e1326]
+                    - cell "根据监管部门的要求,需要完善付款方信息,以获得更高支付额度" [ref=f3e1327]
+                    - cell "尽快完善身份信息提升额度" [ref=f3e1328]
+                  - row [ref=f3e1330]:
+                    - cell "PERM_AML_NOT_REALNAME_PAY" [ref=f3e1331]
+                    - cell "根据监管部门的要求,需要付款用户补充身份信息才能继续操作" [ref=f3e1332]
+                    - cell "支付宝-搜索进入安全中心,按提示引导补全信息" [ref=f3e1333]
+                  - row [ref=f3e1335]:
+                    - cell "PERM_AML_NOT_REALNAME_REV" [ref=f3e1336]
+                    - cell "根据监管部门的要求,需要收款用户补充身份信息才能继续操作" [ref=f3e1337]
+                    - cell "请联系收款方登录支付宝站内或手机客户端补充身份信息" [ref=f3e1338]
+                  - row [ref=f3e1340]:
+                    - cell "PERM_AML_NOT_REALNAME_REV" [ref=f3e1341]
+                    - cell "根据监管部门的要求,需要收款用户补充身份信息才能继续操作" [ref=f3e1342]
+                    - cell "请联系收款方登录支付宝站内或手机客户端补充身份信息" [ref=f3e1343]
+                  - row [ref=f3e1345]:
+                    - cell "PERM_PAY_CUSTOMER_DAILY_QUOTA_ORG_BALANCE_LIMIT" [ref=f3e1346]
+                    - cell "同一主体下今日余额付款额度已达上限。" [ref=f3e1347]
+                    - cell [ref=f3e1348]:
+                      - generic [ref=f3e1349]:
+                        - text: 转账金额超出账户当日可用额度,可在提升账户额度后,继续操作。
+                        - link [ref=f3e1350] [cursor=pointer]:
+                          - /url: https://business.alipay.com/page/merchant-quota-web/upgrade-quota/info
+                          - text: 去提额
+                          - img "画板" [ref=f3e1352]
+                        - text: 。
+                  - row [ref=f3e1357]:
+                    - cell "PERM_PAY_CUSTOMER_MONTH_QUOTA_ORG_BALANCE_LIMIT" [ref=f3e1358]
+                    - cell "同一主体下当月余额付款额度已达上限。" [ref=f3e1359]
+                    - cell [ref=f3e1360]:
+                      - generic [ref=f3e1361]:
+                        - text: 转账金额超出账户当月可用额度,可提升账户额度后,继续操作。
+                        - link [ref=f3e1362] [cursor=pointer]:
+                          - /url: https://business.alipay.com/page/merchant-quota-web/upgrade-quota/info
+                          - text: 去提额
+                          - img "画板" [ref=f3e1364]
+                        - text: 。
+                  - row [ref=f3e1369]:
+                    - cell "PERM_PAY_USER_DAILY_QUOTA_ORG_BALANCE_LIMIT" [ref=f3e1370]
+                    - cell "该账户今日余额付款额度已达上限。" [ref=f3e1371]
+                    - cell [ref=f3e1372]:
+                      - generic [ref=f3e1373]:
+                        - text: 转账金额超出账户当日可用额度,可在提升账户额度后,继续操作。
+                        - link [ref=f3e1374] [cursor=pointer]:
+                          - /url: https://business.alipay.com/page/merchant-quota-web/upgrade-quota/info
+                          - text: 去提额
+                          - img "画板" [ref=f3e1376]
+                        - text: 。
+                  - row [ref=f3e1381]:
+                    - cell "PERM_PAY_USER_MONTH_QUOTA_ORG_BALANCE_LIMIT" [ref=f3e1382]
+                    - cell "该账户当月余额付款额度已达上限。" [ref=f3e1383]
+                    - cell [ref=f3e1384]:
+                      - generic [ref=f3e1385]:
+                        - text: 转账金额超出账户当月可用额度,可提升账户额度后,继续操作。
+                        - link [ref=f3e1386] [cursor=pointer]:
+                          - /url: https://business.alipay.com/page/merchant-quota-web/upgrade-quota/info
+                          - text: 去提额
+                          - img "画板" [ref=f3e1388]
+                        - text: 。
+                  - row [ref=f3e1393]:
+                    - cell "PERM_RECEIVE_CUSTOMER_ALMS_LIMIT" [ref=f3e1394]
+                    - cell "交易失败,根据法律法规,收款人需补全身份信息后,才可进行相应的支付交易。请联系收款人打开支付宝App完成相关操作。" [ref=f3e1395]
+                    - cell "交易失败,根据法律法规,收款人需补全身份信息后,才可进行相应的支付交易。请联系收款人打开支付宝App完成相关操作。" [ref=f3e1396]
+                  - row [ref=f3e1398]:
+                    - cell "PROCESS_FAIL" [ref=f3e1399]
+                    - cell "资金操作失败(仅用于WorldFirst)" [ref=f3e1400]
+                    - cell "资金操作失败,目前用于结汇入境场景,需要支付宝技术介入排查" [ref=f3e1401]
+                  - row [ref=f3e1403]:
+                    - cell "PRODUCT_NOT_SIGN" [ref=f3e1404]
+                    - cell "产品未签约" [ref=f3e1405]
+                    - cell "请签约产品之后再使用该接口" [ref=f3e1406]
+                  - row [ref=f3e1408]:
+                    - cell "PROMO_CAMP_RELATION_CONFIG_MISSED" [ref=f3e1409]
+                    - cell "当前接口请求方未配置有效的出资账户" [ref=f3e1410]
+                    - cell "当前接口请求方未配置有效的出资账户,请联系支付宝侧接口人" [ref=f3e1411]
+                  - row [ref=f3e1413]:
+                    - cell "PROMO_TRANS_ORDER_DEALING" [ref=f3e1414]
+                    - cell "转账订单正在处理中" [ref=f3e1415]
+                    - cell "转账订单正在处理中,可以直接原单发起重试" [ref=f3e1416]
+                  - row [ref=f3e1418]:
+                    - cell "RECEIVER_ACCOUNT_BOOK_INFO_EXCEPTION" [ref=f3e1419]
+                    - cell "收款方记账本信息有误" [ref=f3e1420]
+                    - cell "请检查入参中记账本相关的参数,如记账本ID,协议号(可选),记账本主体ID等" [ref=f3e1421]
+                  - row [ref=f3e1423]:
+                    - cell "RECEIVER_USER_RISK_FREEZE" [ref=f3e1424]
+                    - cell "收款账户异常被冻结,无法付款,请咨询支付宝客服95188" [ref=f3e1425]
+                    - cell "收款账户异常被冻结,无法付款,请咨询支付宝客服95188" [ref=f3e1426]
+                  - row [ref=f3e1428]:
+                    - cell "RELEASE_USER_FORBBIDEN_RECIEVE" [ref=f3e1429]
+                    - cell "收款账号存在异常,禁止收款,如有疑问请电话咨询95188" [ref=f3e1430]
+                    - cell "联系收款用户,更换支付宝账号后收款" [ref=f3e1431]
+                  - row [ref=f3e1433]:
+                    - cell "REMARK_HAS_SENSITIVE_WORD" [ref=f3e1434]
+                    - cell "转账备注包含敏感词,请修改备注文案后重试" [ref=f3e1435]
+                    - cell "转账备注包含敏感词,请修改备注文案后重试" [ref=f3e1436]
+                  - row [ref=f3e1438]:
+                    - cell "REP_INCONSISTENT" [ref=f3e1439]
+                    - cell "GN代扣返回-请求信息不一致" [ref=f3e1440]
+                    - cell "GN代扣返回-请求信息不一致" [ref=f3e1441]
+                  - row [ref=f3e1443]:
+                    - cell "REQUEST_PROCESSING" [ref=f3e1444]
+                    - cell "系统处理中,请稍后再试" [ref=f3e1445]
+                    - cell "系统并发处理中,建议调整相关接口的调用频率,减少并发请求,可稍后再重试" [ref=f3e1446]
+                  - row [ref=f3e1448]:
+                    - cell "RESOURCE_LIMIT_EXCEED" [ref=f3e1449]
+                    - cell "请求超过当前系统资源限制,请稍后重试" [ref=f3e1450]
+                    - cell "发起请求并发数超出支付宝处理能力,请降低请求并发" [ref=f3e1451]
+                  - row [ref=f3e1453]:
+                    - cell "SECURITY_CHECK_FAILED" [ref=f3e1454]
+                    - cell "安全检查失败。当前操作存在风险,请停止操作,如有疑问请咨询服务热线95188" [ref=f3e1455]
+                    - cell "当前操作存在风险,请停止操作,如有疑问请咨询服务热线95188" [ref=f3e1456]
+                  - row [ref=f3e1458]:
+                    - cell "SIGN_AGREEMENT_NO_INCONSISTENT" [ref=f3e1459]
+                    - cell "签名方和协议主体不一致。请确认payer_info.ext_info.agreement_no和sign_data.ori_app_id是否匹配。" [ref=f3e1460]
+                    - cell "签名方和协议主体不一致。请确认payer_info.ext_info.agreement_no和sign_data.ori_app_id是否匹配,再重试。" [ref=f3e1461]
+                  - row [ref=f3e1463]:
+                    - cell "SIGN_INVALID" [ref=f3e1464]
+                    - cell "签名非法,验签不通过。请确认签名信息是否被篡改以及签名方签名格式是否正确。" [ref=f3e1465]
+                    - cell "签名非法,验签不通过。请确认签名信息是否被篡改以及签名方签名格式是否正确。" [ref=f3e1466]
+                  - row [ref=f3e1468]:
+                    - cell "SIGN_INVOKE_PID_INCONSISTENT" [ref=f3e1469]
+                    - cell "实际调用PID和签名授权PID不一致。请确认实际调用PID和sign_data.partner_id是否一致。" [ref=f3e1470]
+                    - cell "请确认实际调用PID和sign_data.partner_id是否一致,一致后再重试。" [ref=f3e1471]
+                  - row [ref=f3e1473]:
+                    - cell "SIGN_NOT_ALLOW_SKIP" [ref=f3e1474]
+                    - cell "该场景强制验签,不允许跳过。请按要求上报sign_data后重试。" [ref=f3e1475]
+                    - cell "该场景强制验签,不允许跳过。请按要求上报sign_data后重试。" [ref=f3e1476]
+                  - row [ref=f3e1478]:
+                    - cell "SIGN_PARAM_INVALID" [ref=f3e1479]
+                    - cell "验签参数非法。请确认sign_data参数是否正确。" [ref=f3e1480]
+                    - cell "验签参数非法,请确认sign_data参数是否正确。" [ref=f3e1481]
+                  - row [ref=f3e1483]:
+                    - cell "SIGN_QUERY_AGGREMENT_ERROR" [ref=f3e1484]
+                    - cell "根据协议号查询信息失败。请确认payer_info.ext_info.agreement_no是否正确。" [ref=f3e1485]
+                    - cell "请确认上报协议号payer_info.ext_info.agreement_no内容正确后再重试。" [ref=f3e1486]
+                  - row [ref=f3e1488]:
+                    - cell "SIGN_QUERY_APP_INFO_ERROR" [ref=f3e1489]
+                    - cell "签名app信息查询失败。请确认sign_data.ori_app_id是否正确。" [ref=f3e1490]
+                    - cell "请确认签名方sign_data.ori_app_id是否正确,信息正确后再重试。" [ref=f3e1491]
+                  - row [ref=f3e1493]:
+                    - cell "TAX_BILL_AGREEMENT_MISS" [ref=f3e1494]
+                    - cell "灵工协议缺失" [ref=f3e1495]
+                    - cell "灵工协议缺失,请检查入参数" [ref=f3e1496]
+                  - row [ref=f3e1498]:
+                    - cell "TRANSFER_SCENE_INFO_ADMIT_FAIL" [ref=f3e1499]
+                    - cell "场景信息准入失败" [ref=f3e1500]
+                    - cell [ref=f3e1501]:
+                      - generic [ref=f3e1502]:
+                        - text: 请使用企业支付宝账户,点击【
+                        - link [ref=f3e1503] [cursor=pointer]:
+                          - /url: https://b.alipay.com/page/bizfund/transferScene/list
+                          - text: 资金管理-转账场景
+                          - img "画板" [ref=f3e1505]
+                        - text: 】管理转账场景。
+                  - row [ref=f3e1510]:
+                    - cell "TRANSFER_SCENE_NAME_BLANK" [ref=f3e1511]
+                    - cell "转账场景名称为空" [ref=f3e1512]
+                    - cell [ref=f3e1513]:
+                      - generic [ref=f3e1514]:
+                        - text: 转账场景为空,请填写transfer_scene_name字段。商家后续可使用企业支付宝账户,点击【
+                        - link [ref=f3e1515] [cursor=pointer]:
+                          - /url: https://b.alipay.com/page/bizfund/transferScene/list
+                          - text: 资金管理-转账场景
+                          - img "画板" [ref=f3e1517]
+                        - text: 】管理转账场景
+                  - row [ref=f3e1522]:
+                    - cell "TRANSFER_SCENE_NAME_ILLEGAL" [ref=f3e1523]
+                    - cell "转账场景名称有误" [ref=f3e1524]
+                    - cell [ref=f3e1525]:
+                      - generic [ref=f3e1526]:
+                        - text: 转账场景名称与商家当前生效的转账场景不匹配。请使用企业支付宝账户,点击【
+                        - link [ref=f3e1527] [cursor=pointer]:
+                          - /url: https://b.alipay.com/page/bizfund/transferScene/list
+                          - text: 资金管理-转账场景
+                          - img "画板" [ref=f3e1529]
+                        - text: 】管理转账场景
+                  - row [ref=f3e1534]:
+                    - cell "TRANSFER_SCENE_REPORT_INFO_ILLEGAL" [ref=f3e1535]
+                    - cell "转账场景上报信息有误" [ref=f3e1536]
+                    - cell [ref=f3e1537]:
+                      - generic [ref=f3e1538]:
+                        - text: 转账场景信息类型及描述有误,请点击查看【
+                        - link "转账场景信息字段说明" [ref=f3e1539] [cursor=pointer]:
+                          - /url: https://opendocs.alipay.com/open/0iaxid
+                        - text: 】准确填写报备信息。
+                  - row [ref=f3e1540]:
+                    - cell "TRANS_AMOUNT_NOT_IN_PRIZE_LIMIT" [ref=f3e1541]
+                    - cell "请求金额不在约定的范围之内" [ref=f3e1542]
+                    - cell "确定请求入参的转账金额是否在约定范围之内,调整后更换out_biz_no重新发起" [ref=f3e1543]
+                  - row [ref=f3e1545]:
+                    - cell "TRANS_ORDER_DEALING" [ref=f3e1546]
+                    - cell "转账订单正在处理中" [ref=f3e1547]
+                    - cell "转账订单正在处理中,请原单发起重试或稍等后查询单据信息" [ref=f3e1548]
+                  - row [ref=f3e1550]:
+                    - cell "TRUSTEESHIP_ACCOUNT_NOT_EXIST" [ref=f3e1551]
+                    - cell "托管子户查询不存在" [ref=f3e1552]
+                    - cell "托管子户查询不存在" [ref=f3e1553]
+                  - row [ref=f3e1555]:
+                    - cell "TRUSTEESHIP_ACCOUNT_STATUS_ERROR" [ref=f3e1556]
+                    - cell "托管账号状态异常" [ref=f3e1557]
+                    - cell "请检查托管资产账户是否正常" [ref=f3e1558]
+                  - row [ref=f3e1560]:
+                    - cell "TRUSTEESHIP_RECIEVE_QUOTA_LIMIT" [ref=f3e1561]
+                    - cell "收款方收款额度超限,请绑定支付宝账户" [ref=f3e1562]
+                    - cell "收款方收款额度超限,请绑定支付宝账户。" [ref=f3e1563]
+                  - row [ref=f3e1565]:
+                    - cell "UNAUTHORIZED_CONSULT" [ref=f3e1566]
+                    - cell "用户未授权,无法进行风险咨询" [ref=f3e1567]
+                    - cell "用户未授权,无法进行风险咨询" [ref=f3e1568]
+                  - row [ref=f3e1570]:
+                    - cell "UN_SUPPORT_EMPLOYEE_SERVICE" [ref=f3e1571]
+                    - cell "未支持的雇员服务" [ref=f3e1572]
+                    - cell "请检查对应的灵工之家服务是否存在" [ref=f3e1573]
+                  - row [ref=f3e1575]:
+                    - cell "USER_AGREEMENT_VERIFY_FAIL" [ref=f3e1576]
+                    - cell "用户协议校验失败,当前协议号不支持本次的请求场景,请重新校验正确的协议号后重试" [ref=f3e1577]
+                    - cell "用户协议校验失败,当前协议号不支持本次的请求场景,请重新校验正确的协议号后重试。" [ref=f3e1578]
+                  - row [ref=f3e1580]:
+                    - cell "USER_NOT_EXIST" [ref=f3e1581]
+                    - cell "用户不存在(仅用于WorldFirst)" [ref=f3e1582]
+                    - cell "用户不存在,请检查收付款方信息" [ref=f3e1583]
+                  - row [ref=f3e1585]:
+                    - cell "USER_RISK_FREEZE" [ref=f3e1586]
+                    - cell "账户异常被冻结,无法付款,请咨询支付宝客服95188" [ref=f3e1587]
+                    - cell "账户异常被冻结,无法付款,请咨询支付宝客服95188" [ref=f3e1588]
+      - generic [ref=f3e1590]:
+        - heading "相关问题" [level=5] [ref=f3e1591]
+        - link "单笔转账接口问题" [ref=f3e1592] [cursor=pointer]:
+          - /url: https://forum.alipay.com/mini-app/post/19501020?ant_source=opendoc_recommend
+        - link "单笔转账接口提示余额不足" [ref=f3e1594] [cursor=pointer]:
+          - /url: https://forum.alipay.com/mini-app/post/115801017?ant_source=opendoc_recommend
+        - link "fund.trans.uni.transfer(单笔转账接口)返回错误是否代表转账失败,可进行退款" [ref=f3e1596] [cursor=pointer]:
+          - /url: https://forum.alipay.com/mini-app/post/218901018?ant_source=opendoc_recommend
+        - link "单笔转账接口alipay.fund.trans.uni.transfer,..." [ref=f3e1598] [cursor=pointer]:
+          - /url: https://forum.alipay.com/mini-app/post/205901040?ant_source=opendoc_recommend
+      - generic [ref=f3e1600]:
+        - text: 内容没有解决您的问题?您还可以前往
+        - link "自助服务平台" [ref=f3e1601] [cursor=pointer]:
+          - /url: https://open.alipay.com/portal/zhichi/home?source=doc_bottom
+        - text: 或
+        - link "支付宝开放社区" [ref=f3e1602] [cursor=pointer]:
+          - /url: https://open.alipay.com/portal/forum
+        - text: 寻求帮助
+      - generic [ref=f3e1603]:
+        - generic [ref=f3e1604]:
+          - link "关于蚂蚁集团 |" [ref=f3e1605] [cursor=pointer]:
+            - /url: https://www.antfin.com/
+          - link "诚征英才 |" [ref=f3e1606] [cursor=pointer]:
+            - /url: https://talent.antgroup.com
+          - link "联系我们 |" [ref=f3e1607] [cursor=pointer]:
+            - /url: https://ab.alipay.com/i/lianxi.htm
+          - link "International Business |" [ref=f3e1608] [cursor=pointer]:
+            - /url: https://global.alipay.com/
+          - link "About Alipay" [ref=f3e1609] [cursor=pointer]:
+            - /url: https://www.antfin.com/introduction.htm?locale=en_US
+        - generic [ref=f3e1610]: Copyright © 支付宝(杭州)数字服务技术有限公司 | ICP证浙B2-20160559

+ 224 - 0
frontend/alipay-transfer-doc.md

@@ -0,0 +1,224 @@
+- generic [ref=e3]:
+  - banner [ref=e4]:
+    - generic [ref=e5]:
+      - generic [ref=e6]:
+        - link [ref=e7] [cursor=pointer]:
+          - /url: https://open.alipay.com/
+          - img "支付宝文档中心" [ref=e8]
+        - generic [ref=e9]: 文档中心
+      - generic [ref=e10]:
+        - img "right" [ref=e11]
+        - generic [ref=e14]: 邀测站点
+      - list
+    - generic [ref=e15]:
+      - generic [ref=e18]:
+        - textbox "小程序跳转" [ref=e19]
+        - img "search-icon" [ref=e22] [cursor=pointer]
+      - link "控制台" [ref=e23] [cursor=pointer]:
+        - /url: https://open.alipay.com/develop/manage
+      - generic [ref=e24]: 登录
+  - main [ref=e28]:
+    - generic [ref=e33]:
+      - generic [ref=e35]:
+        - generic [ref=e37]:
+          - img "search" [ref=e38]
+          - textbox "通过关键字搜索目录" [ref=e41]
+        - tree [ref=e42]:
+          - generic:
+            - textbox "for screen reader"
+          - generic [ref=e46]:
+            - generic [ref=e47]:
+              - img "caret-down" [ref=e49] [cursor=pointer]
+              - generic "安全发-服务商模式(单笔转账到银行卡)" [ref=e52] [cursor=pointer]
+            - generic "产品介绍" [ref=e58] [cursor=pointer]:
+              - link "产品介绍" [ref=e60]:
+                - /url: /pre-open/01rrgr?pathHash=7994fb13
+            - generic "接入准备" [ref=e64] [cursor=pointer]:
+              - link "接入准备" [ref=e66]:
+                - /url: /pre-open/020x8t?pathHash=52349f4d
+            - generic "接入指南" [ref=e70] [cursor=pointer]:
+              - link "接入指南" [ref=e72]:
+                - /url: /pre-open/01ruru?pathHash=9c285397
+            - generic "API 文档" [ref=e76] [cursor=pointer]:
+              - link "API 文档" [ref=e78]:
+                - /url: /pre-open/020tl9?pathHash=69678b58
+            - generic "常见问题" [ref=e82] [cursor=pointer]:
+              - link "常见问题" [ref=e84]:
+                - /url: /pre-open/02av0h?pathHash=19d5b168
+      - img "left" [ref=e87] [cursor=pointer]
+    - generic [ref=e92]:
+      - generic [ref=e93]:
+        - alert [ref=e95]:
+          - img "exclamation-circle" [ref=e96]
+          - generic [ref=e99]: 注意:本文档为邀测文档,仅供受邀用户使用。
+        - generic [ref=e101]:
+          - link "安全发-服务商模式(单笔转账到银行卡)" [ref=e102] [cursor=pointer]:
+            - /url: /pre-open/01rrgq?pathHash=1477e106
+          - text: "> API 文档"
+        - article [ref=e103]:
+          - generic [ref=e104]:
+            - heading "API 文档" [level=1] [ref=e106]
+            - generic [ref=e110]:
+              - time [ref=e112]: 更新时间:2026-04-30 10:58:15
+              - generic [ref=e113]:
+                - generic [ref=e116] [cursor=pointer]:
+                  - img "star" [ref=e118]
+                  - text: 收藏
+                - generic [ref=e123] [cursor=pointer]:
+                  - img "folder-open" [ref=e125]
+                  - text: 我的文档
+                - generic [ref=e129] [cursor=pointer]:
+                  - img "setting" [ref=e131]
+                  - generic [ref=e134]: 设置
+          - generic [ref=e138]:
+            - generic [ref=e139]: 使用说明
+            - generic [ref=e142]: 开发者在集成和开发前需要了解一下当前模式的整体调用流程,如下图所示,分为三个步骤:
+            - img "1.png" [ref=e148]
+            - generic [ref=e149]: 1、商户授权服务商
+            - generic [ref=e150]: 服务商调用快速接入中“用户授权协议签约”相关接口,引导商户完成授权,并获取授权协议号。
+            - generic [ref=e151]: 2、开通记账本、记账本查询、记账本充值
+            - generic [ref=e152]: 服务商调用快速接入中“资金记账本”相关接口,给商户开通记账本,获取记账本编码,并引导商户记账本充值。
+            - generic [ref=e153]: 3、记账本调拨、记账本转账代发
+            - generic [ref=e154]: 服务商调用快速接入中“单笔转账”相关接口,资金从商户记账本转账到用户。
+            - generic [ref=e155]: 功能接口列表
+            - table [ref=e162]:
+              - rowgroup [ref=e168]:
+                - row [ref=e169]:
+                  - cell [ref=e170]
+                  - cell [ref=e173]
+                  - cell [ref=e176]
+                  - cell [ref=e179]
+                - row [ref=e182]:
+                  - cell [ref=e183]
+                  - cell [ref=e186]:
+                    - generic [ref=e187]:
+                      - generic [ref=e188]: 用户协议授权签约页面接口
+                      - link "alipay.user.agreement.page.sign" [ref=e190] [cursor=pointer]:
+                        - /url: https://opendocs.alipay.com/pre-apis/00a8xl
+                  - cell [ref=e191]
+                  - cell [ref=e194]
+                - row [ref=e197]:
+                  - cell [ref=e198]
+                  - cell [ref=e201]:
+                    - generic [ref=e202]:
+                      - generic [ref=e203]: 用户协议授权签约查询接口
+                      - link "alipay.user.agreement.query" [ref=e205] [cursor=pointer]:
+                        - /url: https://opendocs.alipay.com/pre-apis/00a8xf
+                  - cell [ref=e206]
+                  - cell [ref=e210]
+                - row [ref=e213]:
+                  - cell [ref=e214]
+                  - cell [ref=e217]:
+                    - generic [ref=e218]:
+                      - generic [ref=e219]: 用户协议授权解约接口
+                      - link "alipay.user.agreement.unsign" [ref=e221] [cursor=pointer]:
+                        - /url: https://opendocs.alipay.com/pre-apis/00a918
+                  - cell [ref=e222]
+                  - cell [ref=e226]
+                - row [ref=e229]:
+                  - cell [ref=e230]
+                  - cell [ref=e233]:
+                    - generic [ref=e234]:
+                      - generic [ref=e235]: 资金记账本开通接口
+                      - link "alipay.fund.accountbook.create" [ref=e237] [cursor=pointer]:
+                        - /url: https://opendocs.alipay.com/pre-apis/00o2tn
+                  - cell [ref=e238]
+                  - cell [ref=e241]
+                - row [ref=e244]:
+                  - cell [ref=e245]
+                  - cell [ref=e248]:
+                    - generic [ref=e249]:
+                      - generic [ref=e250]: 资金记账本查询接口
+                      - link "alipay.fund.accountbook.query" [ref=e252] [cursor=pointer]:
+                        - /url: https://opendocs.alipay.com/pre-apis/00o1j1
+                  - cell [ref=e253]
+                  - cell [ref=e256]
+                - row [ref=e259]:
+                  - cell [ref=e260]
+                  - cell [ref=e263]:
+                    - generic [ref=e264]:
+                      - generic [ref=e265]: 单笔转账接口
+                      - link "alipay.fund.trans.uni.transfer" [ref=e267] [cursor=pointer]:
+                        - /url: https://opendocs.alipay.com/pre-apis/00a97v
+                  - cell [ref=e268]
+                  - cell [ref=e271]
+                - row [ref=e274]:
+                  - cell [ref=e275]
+                  - cell [ref=e278]:
+                    - generic [ref=e279]:
+                      - generic [ref=e280]: 记账本充值、退回的查询接口
+                      - link "alipay.fund.trans.common.query" [ref=e282] [cursor=pointer]:
+                        - /url: https://opendocs.alipay.com/pre-apis/00a8yz
+                  - cell [ref=e283]
+                  - cell [ref=e286]
+                - row [ref=e289]:
+                  - cell [ref=e290]
+                  - cell [ref=e293]:
+                    - generic [ref=e294]:
+                      - generic [ref=e295]: 记账本充值、退回的异步通知
+                      - link "alipay.fund.trans.order.changed" [ref=e297] [cursor=pointer]:
+                        - /url: https://opendocs.alipay.com/apis/msgapi_60/alipay.fund.trans.order.changed
+                  - cell [ref=e298]:
+                    - generic [ref=e300]:
+                      - text: 记账本充值、退回消息通知。使用与配置参考:
+                      - link "From蚂蚁消息的使用与配置" [ref=e301] [cursor=pointer]:
+                        - /url: https://docs.open.alipay.com/10381/gh4emp
+                  - cell [ref=e302]
+                - row [ref=e305]:
+                  - cell [ref=e306]
+                  - cell [ref=e309]:
+                    - generic [ref=e310]:
+                      - generic [ref=e311]: 记账本充值
+                      - link "alipay.fund.trans.page.pay" [ref=e313] [cursor=pointer]:
+                        - /url: https://opendocs.alipay.com/pre-apis/00a883
+                  - cell [ref=e314]
+                  - cell [ref=e317]
+        - generic [ref=e320]:
+          - link [ref=e321] [cursor=pointer]:
+            - /url: /pre-open/01ruru?pathHash=9c285397
+            - img "left" [ref=e322]
+            - text: 上一篇:接入指南
+          - link [ref=e325] [cursor=pointer]:
+            - /url: /pre-open/02av0h?pathHash=19d5b168
+            - text: 下一篇:常见问题
+            - img "right" [ref=e326]
+        - generic [ref=e329]:
+          - heading "相关问题" [level=5] [ref=e330]
+          - link "单笔转账" [ref=e331] [cursor=pointer]:
+            - /url: https://forum.alipay.com/mini-app/post/65801029?ant_source=opendoc_recommend
+          - link "转账到银行卡目前支持嘛" [ref=e333] [cursor=pointer]:
+            - /url: https://forum.alipay.com/mini-app/post/27401011?ant_source=opendoc_recommend
+          - link "支付宝单笔转到银行卡" [ref=e335] [cursor=pointer]:
+            - /url: https://forum.alipay.com/mini-app/post/82101016?ant_source=opendoc_recommend
+          - link "单笔转账接口问题" [ref=e337] [cursor=pointer]:
+            - /url: https://forum.alipay.com/mini-app/post/19501020?ant_source=opendoc_recommend
+        - generic [ref=e339]:
+          - text: 内容没有解决您的问题?您还可以前往
+          - link "自助服务平台" [ref=e340] [cursor=pointer]:
+            - /url: https://open.alipay.com/portal/zhichi/home?source=doc_bottom
+          - text: 或
+          - link "支付宝开放社区" [ref=e341] [cursor=pointer]:
+            - /url: https://open.alipay.com/portal/forum
+          - text: 寻求帮助
+        - generic [ref=e342]:
+          - generic [ref=e343]:
+            - link "关于蚂蚁集团 |" [ref=e344] [cursor=pointer]:
+              - /url: https://www.antfin.com/
+            - link "诚征英才 |" [ref=e345] [cursor=pointer]:
+              - /url: https://talent.antgroup.com
+            - link "联系我们 |" [ref=e346] [cursor=pointer]:
+              - /url: https://ab.alipay.com/i/lianxi.htm
+            - link "International Business |" [ref=e347] [cursor=pointer]:
+              - /url: https://global.alipay.com/
+            - link "About Alipay" [ref=e348] [cursor=pointer]:
+              - /url: https://www.antfin.com/introduction.htm?locale=en_US
+          - generic [ref=e349]: Copyright © 支付宝(杭州)数字服务技术有限公司 | ICP证浙B2-20160559
+      - generic [ref=e351]:
+        - generic [ref=e352]:
+          - generic [ref=e353]: 该文档对你是否有帮助?
+          - generic [ref=e354]: 反馈
+        - generic [ref=e360]: 当前页面目录
+        - generic [ref=e378]:
+          - link "使用说明" [ref=e379] [cursor=pointer]:
+            - /url: https://opendocs.alipay.com/pre-open/020tl9?pathHash=69678b58#%E4%BD%BF%E7%94%A8%E8%AF%B4%E6%98%8E
+          - img "caret-down" [ref=e380] [cursor=pointer]

BIN
frontend/dist.zip


+ 60 - 2
frontend/src/api/module_payment/account.ts

@@ -44,15 +44,69 @@ export const AccountAPI = {
   },
 
   authorizeApply(data: { enterprise_id: string }) {
-    return request<ApiResponse<{ sign_url: string }>>({
+    return request<ApiResponse<{ sign_url: string; external_agreement_no: string }>>({
       url: `${API_PATH}/authorize/apply`,
       method: "post",
       data,
     });
   },
 
+  // ========== 进件 ==========
+
+  uploadImage(file: File, enterpriseId: string) {
+    const fd = new FormData();
+    fd.append("file", file);
+    fd.append("enterprise_id", enterpriseId);
+    return request<ApiResponse<{ image_id: string }>>({
+      url: `${API_PATH}/onboard/upload`,
+      method: "post",
+      data: fd,
+      headers: { "Content-Type": "multipart/form-data" },
+    });
+  },
+
+  createOnboard(data: {
+    enterprise_id: string;
+    scene_directions: string;
+    scene_image: string;
+    sites?: string;
+  }) {
+    return request<ApiResponse<{ order_id: string; out_biz_no: string; status: string }>>({
+      url: `${API_PATH}/onboard/create`,
+      method: "post",
+      data,
+    });
+  },
+
+  queryOnboard(enterpriseId: string, orderId: string) {
+    return request<ApiResponse<{ order_id: string; status: string }>>({
+      url: `${API_PATH}/onboard/query`,
+      method: "get",
+      params: { enterprise_id: enterpriseId, order_id: orderId },
+    });
+  },
+
+  cancelOnboard(data: { enterprise_id: string; order_id: string }) {
+    return request<ApiResponse>({
+      url: `${API_PATH}/onboard/cancel`,
+      method: "post",
+      data,
+    });
+  },
+
+  // ========== 签约查询 ==========
+
+  queryAgreement(enterpriseId: string, externalAgreementNo: string) {
+    return request<ApiResponse<{ agreement_no: string; status: string }>>({
+      url: `${API_PATH}/agreement/query`,
+      method: "get",
+      params: { enterprise_id: enterpriseId, external_agreement_no: externalAgreementNo },
+    });
+  },
+
   create(data: {
     enterprise_id: string;
+    agreement_no?: string;  // 安全发: 签约协议号
     account_type?: string;
     scene?: string;
     account_book_id?: string;
@@ -110,7 +164,7 @@ export const AccountAPI = {
     priority?: string;
     ext_info?: Record<string, any>;
   }) {
-    return request<ApiResponse<{ status: string; order_no?: string; fund_order_id?: string }>>({
+    return request<ApiResponse<{ status: string; order_id?: string; pay_fund_order_id?: string }>>({
       url: `${API_PATH}/transfer`,
       method: "post",
       data,
@@ -238,7 +292,11 @@ export interface TransferOutSchema {
     bankcard_ext_info?: any;
   };
   status?: string;
+  order_id?: string;
+  pay_fund_order_id?: string;
+  /** @deprecated 兼容旧字段 */
   order_no?: string;
+  /** @deprecated 兼容旧字段 */
   fund_order_id?: string;
   created_time?: string;
   updated_time?: string;

+ 3 - 2
frontend/src/store/modules/enterprise.store.ts

@@ -51,8 +51,8 @@ export const useEnterpriseStore = defineStore("enterprise", {
       if (currentEnterpriseJson) {
         return JSON.parse(currentEnterpriseJson);
       }
-      // 如果没有选中的企业,返回列表中的第一个企业
-      if (state.enterpriseList && state.enterpriseList.length > 0) {
+      // 只有一个企业时自动选中,多个企业时不自动取(admin 需手动选择)
+      if (state.enterpriseList && state.enterpriseList.length === 1) {
         return state.enterpriseList[0];
       }
       return null;
@@ -73,6 +73,7 @@ export const useEnterpriseStore = defineStore("enterprise", {
           name: item.name,
           short_name: item.short_name,
           status: item.status,
+          transfer_enabled: item.transfer_enabled,
         }));
       } catch (error) {
         console.error("获取企业列表失败:", error);

+ 84 - 14
frontend/src/views/module_payment/account/components/AccountOverview.vue

@@ -8,9 +8,10 @@
         </div>
       </template>
 
-      <el-steps :active="currentStep" align-center finish-status="success" class="mb-6">
-        <el-step title="转账授权签约 & 开通资金账户" :description="authorizeStatusText" />
-        <!-- <el-step title="开通资金账户" :description="accountStatusText" /> -->
+      <el-steps v-if="props.transferEnabled !== false" :active="currentStep" align-center finish-status="success" class="mb-6">
+        <el-step title="签约授权" :description="stepSignDesc" />
+        <el-step title="提交进件" :description="stepOnboardDesc" />
+        <el-step title="开通记账本" :description="stepAccountDesc" />
         <el-step title="账户充值" :description="depositStatusText" />
         <el-step title="进行转账" />
       </el-steps>
@@ -37,7 +38,7 @@
         </div>
       </template> -->
 
-      <div class="quick-actions">
+      <div v-if="props.transferEnabled !== false" class="quick-actions">
         <div
           class="action-item"
           :class="{ disabled: authorizeStatus === 'AUTHORIZED' || !!accountData.account_book_id }"
@@ -61,7 +62,26 @@
 
         <div
           class="action-item"
-          :class="{ disabled: authorizeStatus === 'AUTHORIZED' || !!accountData.account_book_id }"
+          :class="{ disabled: isOnboardDisabled }"
+        >
+          <div class="action-icon">
+            <el-icon :size="32"><Upload /></el-icon>
+          </div>
+          <div class="action-title">提交进件资料</div>
+          <div class="action-desc">{{ onboardDesc }}</div>
+          <el-button
+            v-hasPerm="['module_payment:account:authorize']"
+            type="primary"
+            :disabled="isOnboardDisabled"
+            @click="$emit('goTab', 'onboard')"
+          >
+            {{ onboardBtnText }}
+          </el-button>
+        </div>
+
+        <div
+          class="action-item"
+          :class="{ disabled: authorizeStatus !== 'AUTHORIZED' || accountData.onboard_status !== 'VALID' || !!accountData.account_book_id }"
         >
           <div class="action-icon">
             <el-icon :size="32"><Coin /></el-icon>
@@ -70,12 +90,13 @@
           <div class="action-desc">
             <template v-if="accountData.account_book_id">已开通</template>
             <template v-else-if="authorizeStatus !== 'AUTHORIZED'">需先签约</template>
+            <template v-else-if="accountData.onboard_status !== 'VALID'">需进件审核通过</template>
             <template v-else>立即开通</template>
           </div>
           <el-button
             v-hasPerm="['module_payment:account:create']"
             type="primary"
-            :disabled="authorizeStatus === 'AUTHORIZED' || !!accountData.account_book_id"
+            :disabled="authorizeStatus !== 'AUTHORIZED' || !!accountData.account_book_id || accountData.onboard_status !== 'VALID'"
             @click="$emit('goTab', 'create')"
           >
             {{ accountData.account_book_id ? "已开通" : "去开通" }}
@@ -89,7 +110,7 @@
           <div class="action-title">账户充值</div>
           <div class="action-desc">
             <template v-if="!accountData.account_book_id">需先开通专户</template>
-            <template v-else-if="accountData.status !== 'ON'">专户状态异常</template>
+            <template v-else-if="accountData.status !== 'ACTIVE'">专户状态异常</template>
             <template v-else>立即充值</template>
           </div>
           <el-button
@@ -277,12 +298,13 @@
 <script setup lang="ts">
 import { useEnterpriseStore } from "@/store/modules/enterprise.store";
 import AccountAPI from "@/api/module_payment/account";
-import { Refresh, Document, Coin, Wallet, Money } from "@element-plus/icons-vue";
+import { Refresh, Document, Coin, Wallet, Money, Upload } from "@element-plus/icons-vue";
 import { ref, computed, watch } from "vue";
 import en from "@/lang/package/en";
 
 const props = defineProps<{
   enterpriseId?: string;
+  transferEnabled?: boolean;
 }>();
 
 const emit = defineEmits<{
@@ -299,6 +321,8 @@ const accountData = ref<{
   status?: string;
   balance?: number;
   scene?: string;
+  sign_status?: string;
+  onboard_status?: string;
 }>({});
 const recentTransfers = ref<any[]>([]);
 const transferAmount = ref<{
@@ -319,15 +343,57 @@ const currentEnterpriseName = computed(() => {
   return `${currentEnterprise.value.name} (${currentEnterprise.value.enterprise_id.slice(-4)})`;
 });
 
+/** 进件按钮: 未提交或审核不通过时可点,审核中/已通过置灰 */
+const isOnboardDisabled = computed(() =>
+  authorizeStatus.value !== "AUTHORIZED" || !!accountData.value.account_book_id
+  || accountData.value.onboard_status === "PENDING"
+  || accountData.value.onboard_status === "VALID"
+);
+
+const onboardDesc = computed(() => {
+  switch (accountData.value.onboard_status) {
+    case "PENDING": return "审核中,请耐心等待";
+    case "VALID": return "审核已通过";
+    case "INVALID": return "审核未通过,可重新提交";
+    default: return authorizeStatus.value !== "AUTHORIZED" ? "需先签约" : "提交资料";
+  }
+});
+
+const onboardBtnText = computed(() => {
+  switch (accountData.value.onboard_status) {
+    case "PENDING": return "审核中";
+    case "VALID": return "已通过";
+    case "INVALID": return "重新提交";
+    default: return "去提交";
+  }
+});
+
+// 签约状态: 有签约协议号即视为已签约(通知已写入 DB)
 const authorizeStatus = computed(() =>
-  accountData.value.account_book_id ? "AUTHORIZED" : "PENDING"
+  accountData.value.sign_status === "SIGNED" || accountData.value.account_book_id
+    ? "AUTHORIZED" : "PENDING"
+);
+
+const stepSignDesc = computed(() =>
+  accountData.value.sign_status === "SIGNED" ? "已签约" : "待签约"
+);
+const stepOnboardDesc = computed(() => {
+  if (!accountData.value.sign_status || accountData.value.sign_status !== "SIGNED") return "需先签约";
+  if (accountData.value.onboard_status === "VALID") return "已通过";
+  if (accountData.value.onboard_status === "PENDING") return "审核中";
+  if (accountData.value.onboard_status === "INVALID") return "未通过";
+  return "待提交";
+});
+const stepAccountDesc = computed(() =>
+  accountData.value.account_book_id ? "已开通" : "待开通"
 );
 
 const currentStep = computed(() => {
-  if (authorizeStatus.value !== "AUTHORIZED") return 0;
-  // if (!accountData.value.account_book_id) return 1;
-  if (!accountData.value.balance || accountData.value.balance <= 0) return 2;
-  return 3;
+  if (!accountData.value.sign_status || accountData.value.sign_status !== "SIGNED") return 0;
+  if (!accountData.value.onboard_status || accountData.value.onboard_status !== "VALID") return 1;
+  if (!accountData.value.account_book_id) return 2;
+  if (!accountData.value.balance || accountData.value.balance <= 0) return 3;
+  return 4;
 });
 
 const authorizeStatusText = computed(() => {
@@ -414,9 +480,11 @@ async function fetchAccountInfo() {
       const account = res.data.data[0];
       accountData.value = {
         account_book_id: account.account_book_id,
-        balance: Number(account.balance ?? account.available_amount ?? 0),
+        balance: Number(account.available_amount ?? account.balance ?? 0),
         status: account.status ?? account.enable_status,
         scene: account.scene,
+        sign_status: account.sign_status,
+        onboard_status: account.onboard_status,
       };
     }
 
@@ -431,6 +499,8 @@ async function fetchAccountInfo() {
       status: accountData.value.status,
       balance: accountData.value.balance || 0,
       authorize_status: authorizeStatus.value,
+      sign_status: accountData.value.sign_status,
+      onboard_status: accountData.value.onboard_status,
     });
   } catch (error) {
     console.error("获取账户信息失败:", error);

+ 214 - 30
frontend/src/views/module_payment/account/index.vue

@@ -3,7 +3,8 @@
     <el-tabs v-model="activeTab" class="account-tabs" type="card">
       <el-tab-pane label="账户概览" name="overview">
         <AccountOverview ref="overviewRef" :enterprise-id="currentEnterpriseId" @refresh="handleOverviewRefresh"
-          @goTab="handleGoTab" @withdraw="withdrawVisible = true" />
+          @goTab="handleGoTab" @withdraw="withdrawVisible = true"
+          :transfer-enabled="hasTransferPermission" />
       </el-tab-pane>
 
       <!-- <el-tab-pane label="转账授权签约" name="authorize">
@@ -103,7 +104,7 @@
         </div>
       </el-tab-pane> -->
 
-      <el-tab-pane label="账户充值" name="deposit">
+      <el-tab-pane v-if="hasTransferPermission" label="账户充值" name="deposit">
         <div class="tab-content">
           <el-card>
             <template #header>
@@ -176,7 +177,7 @@
         </div>
       </el-tab-pane>
 
-      <el-tab-pane label="转账管理" name="transfer">
+      <el-tab-pane v-if="hasTransferPermission" label="转账管理" name="transfer">
         <div class="tab-content">
           <el-card>
             <template #header>
@@ -219,8 +220,8 @@
               <el-form-item label="收款方真实姓名" prop="payee_info.name">
                 <el-input v-model="transferForm.payee_info.name" placeholder="请输入收款方姓名" />
               </el-form-item>
-              <el-form-item :label="transferForm.payee_info.identity_type === 'alipay' ? '收款方支付宝账号' : '收款方银行卡号'" prop="payee_info.identity">
-                <el-input v-model="transferForm.payee_info.identity" :placeholder="transferForm.payee_info.identity_type === 'alipay' ? '请输入收款方支付宝账号' : '请输入收款方银行卡号'" />
+              <el-form-item :label="transferForm.payee_info.identity_type === 'ALIPAY_USER_ID' ? '收款方支付宝账号' : '收款方银行卡号'" prop="payee_info.identity">
+                <el-input v-model="transferForm.payee_info.identity" :placeholder="transferForm.payee_info.identity_type === 'ALIPAY_USER_ID' ? '请输入收款方支付宝账号' : '请输入收款方银行卡号'" />
               </el-form-item>
               <template v-if="transferForm.payee_info.identity_type === 'bank'">
                 <el-form-item label="账户类型" prop="payee_info.bankcard_ext_info.account_type">
@@ -507,6 +508,37 @@
     <TransferDetail v-model="transferDetailVisible" :out-biz-no="currentTransferOutBizNo"
       @refresh="handleTransferDetailRefresh" />
 
+    <!-- 进件弹窗 -->
+    <el-dialog v-model="onboardDialogVisible" title="提交进件资料" width="650px" destroy-on-close
+      :close-on-click-modal="false">
+      <el-form ref="onboardFormRef" :model="onboardForm" :rules="onboardRules" label-width="120px">
+        <el-form-item label="场景说明" prop="scene_directions" required>
+          <el-input v-model="onboardForm.scene_directions" type="textarea" :rows="3"
+            placeholder="谁/通过什么媒介/主要为谁提供什么服务/用于在什么场景给什么人群转账" maxlength="1024" show-word-limit />
+        </el-form-item>
+        <el-form-item label="场景截图" prop="scene_image" required>
+          <el-upload ref="uploadRef" :http-request="handleOnboardUpload" :file-list="onboardFiles"
+            :limit="5" list-type="picture-card" accept=".jpg,.jpeg,.png,.pdf"
+            :before-upload="handleBeforeUpload" :on-remove="handleOnboardFileRemove">
+            <el-icon><Plus /></el-icon>
+          </el-upload>
+          <div class="upload-tip">支持 jpg / png / pdf,最多 5 个文件</div>
+        </el-form-item>
+        <el-form-item label="站点信息">
+          <el-checkbox-group v-model="onboardSiteTypes">
+            <el-checkbox v-for="s in SITE_TYPE_OPTIONS" :key="s.value" :label="s.value">{{ s.label }}</el-checkbox>
+          </el-checkbox-group>
+          <div v-for="st in onboardSiteTypes" :key="st" style="margin-top: 8px">
+            <el-input v-model="onboardSites[st]" :placeholder="'请输入' + (SITE_TYPE_OPTIONS.find(s => s.value === st)?.label || st) + '地址'" style="width: 300px" />
+          </div>
+        </el-form-item>
+      </el-form>
+      <template #footer>
+        <el-button @click="onboardDialogVisible = false">取消</el-button>
+        <el-button type="primary" :loading="onboardLoading" @click="handleOnboardSubmit">提交进件</el-button>
+      </template>
+    </el-dialog>
+
     <!-- 批量转账对话框 -->
     <el-dialog v-model="batchTransferVisible" title="批量转账" width="1000px" :close-on-click-modal="false" :close-on-press-escape="false">
       <div class="batch-transfer-container" :class="{ 'has-overlay': showBatchTransferOverlay }">
@@ -710,7 +742,7 @@ import ConsumeDetail from "./components/ConsumeDetail.vue";
 import F2fTradeRecord from "./components/F2fTradeRecord.vue";
 import TenantAPI, { TenantTable } from "@/api/module_system/tenant";
 import { ref, reactive, computed, onMounted, watch } from "vue";
-import { Refresh, Loading } from "@element-plus/icons-vue";
+import { Refresh, Loading, Plus } from "@element-plus/icons-vue";
 import { ElMessage, ElMessageBox } from "element-plus";
 import type { FormInstance, FormRules } from "element-plus";
 import * as ExcelJS from "exceljs";
@@ -751,6 +783,7 @@ const consumeFormRef = ref<FormInstance>();
 const overviewRef = ref<InstanceType<typeof AccountOverview>>();
 
 const currentEnterpriseId = computed(() => enterpriseStore.getCurrentEnterprise?.enterprise_id);
+const hasTransferPermission = computed(() => enterpriseStore.getCurrentEnterprise?.transfer_enabled === true);
 const cureentEnterprise = computed(() => enterpriseStore.getCurrentEnterprise);
 
 const accountInfo = ref<{
@@ -775,15 +808,143 @@ const authorizeRules: FormRules = {
 
 const authorizeResult = reactive({
   sign_url: "",
+  external_agreement_no: "",
+  agreement_no: "",
+  queryLoading: false,
 });
 
 const createForm = reactive({
   enterprise_id: "",
+  agreement_no: "",
   account_type: "ALL",
   scene: "B2B_TRANS",
   remark: "",
 });
 
+const SITE_TYPE_OPTIONS = [
+  { value: "WEBSITE", label: "网站" },
+  { value: "APP", label: "APP" },
+  { value: "GONGZH", label: "公众号" },
+  { value: "XCHENGXU_ZHI", label: "支付宝小程序" },
+  { value: "WEB", label: "手机网站/H5" },
+  { value: "QITA", label: "其它" },
+];
+
+const onboardDialogVisible = ref(false);
+const onboardFormRef = ref<FormInstance>();
+const onboardLoading = ref(false);
+const onboardFiles = ref<any[]>([]);
+const onboardImageIds = ref<string[]>([]);
+const uploadRef = ref();
+const onboardSiteTypes = ref<string[]>([]);
+const onboardSites = reactive<Record<string, string>>({});
+
+const onboardForm = reactive({
+  scene_directions: "",
+  scene_image: "",
+});
+
+const validateSceneImage = (_rule: any, _value: any, callback: any) => {
+  if (onboardImageIds.value.length === 0) callback(new Error("请上传场景截图"));
+  else callback();
+};
+
+const onboardRules: FormRules = {
+  scene_directions: [{ required: true, message: "请填写场景说明", trigger: "blur" }],
+  scene_image: [{ validator: validateSceneImage, trigger: "change" }],
+};
+
+const ALLOWED_EXTENSIONS = [".jpg", ".jpeg", ".png", ".pdf"];
+
+function handleBeforeUpload(file: File) {
+  const ext = "." + file.name.split(".").pop()?.toLowerCase();
+  if (!ALLOWED_EXTENSIONS.includes(ext)) {
+    ElMessage.error("仅支持 jpg / png / pdf 格式");
+    return false;
+  }
+  if (file.size > 5 * 1024 * 1024) {
+    ElMessage.error("文件大小不能超过 5MB");
+    return false;
+  }
+  return true;
+}
+
+/** 自定义上传 — 选图即调用 image.upload */
+async function handleOnboardUpload(option: any) {
+  try {
+    const res = await AccountAPI.uploadImage(option.file, currentEnterpriseId.value!);
+    const imageId = res.data.data?.image_id;
+    if (imageId) {
+      onboardImageIds.value.push(imageId);
+      onboardForm.scene_image = onboardImageIds.value.join(",");
+      onboardFormRef.value?.validateField("scene_image");
+      option.onSuccess();
+    } else {
+      option.onError(new Error("上传失败"));
+    }
+  } catch (e) {
+    option.onError(e);
+  }
+}
+
+function handleOnboardFileRemove(_file: any, fileList: any) {
+  // 移除对应位置的 image_id
+  const idx = fileList.findIndex((f: any) => f.uid === _file.uid);
+  if (idx >= 0) {
+    onboardImageIds.value.splice(idx, 1);
+    onboardForm.scene_image = onboardImageIds.value.join(",");
+    onboardFormRef.value?.validateField("scene_image");
+  }
+}
+
+async function handleOnboardSubmit() {
+  if (!onboardFormRef.value) return;
+  await onboardFormRef.value.validate(async (valid) => {
+    if (!valid) return;
+    if (onboardImageIds.value.length === 0) {
+      ElMessage.warning("请上传转账场景截图");
+      return;
+    }
+    onboardLoading.value = true;
+    try {
+      // 构建 sites JSON
+      let sites: string | undefined;
+      if (onboardSiteTypes.value.length > 0) {
+        const obj: Record<string, string> = {};
+        for (const st of onboardSiteTypes.value) {
+          if (onboardSites[st]) obj[st] = onboardSites[st];
+        }
+        if (Object.keys(obj).length > 0) sites = JSON.stringify(obj);
+      }
+      const res = await AccountAPI.createOnboard({
+        enterprise_id: currentEnterpriseId.value!,
+        scene_directions: onboardForm.scene_directions,
+        scene_image: onboardImageIds.value.join(","),
+        sites,
+      });
+      const data = res.data.data;
+      if (data?.order_id) {
+        ElMessage.success("进件单已提交,支付宝审核中");
+        accountInfo.value.onboard_status = "PENDING";
+        onboardDialogVisible.value = false;
+        overviewRef.value?.refresh();
+      }
+    } catch (e: any) {
+      ElMessage.error(e?.message || "提交进件失败");
+    } finally {
+      onboardLoading.value = false;
+    }
+  });
+}
+
+function handleOnboardReset() {
+  onboardFormRef.value?.resetFields();
+  onboardFiles.value = [];
+  onboardImageIds.value = [];
+  onboardSiteTypes.value = [];
+  Object.keys(onboardSites).forEach(k => delete onboardSites[k]);
+}
+
 const createRules: FormRules = {
   enterprise_id: [{ required: true, message: "请输入企业ID", trigger: "blur" }],
   account_type: [{ required: true, message: "请选择账户类型", trigger: "change" }],
@@ -821,7 +982,7 @@ const transferForm = reactive({
   order_title: "",
   remark: "",
   payee_info: {
-    identity_type: "alipay",
+    identity_type: "ALIPAY_USER_ID",
     name: "",
     identity: "",
     bankcard_ext_info: {
@@ -1139,7 +1300,7 @@ async function handleBatchTransfer() {
             order_title: item.order_title.toString(),
             remark: item.remark?.toString() || "",
             payee_info: {
-              identity_type: item.payee_type === "支付宝" ? "alipay" : "bank",
+              identity_type: item.payee_type === "支付宝" ? "ALIPAY_USER_ID" : "BANKCARD_ACCOUNT",
               name: item.payee_name.toString(),
               identity: item.payee_account.toString(),
               bankcard_ext_info:
@@ -1216,36 +1377,52 @@ function resetBatchTransfer() {
 }
 
 async function handleAuthorize() {
-  // if (!authorizeFormRef.value) return;
-  // await authorizeFormRef.value.validate(async (valid) => {
-  //   if (valid) {
-  //     authorizeLoading.value = true;
-  //     try {
-  //       const res = await AccountAPI.authorizeApply({
-  //         enterprise_id: authorizeForm.enterprise_id || currentEnterpriseId.value!,
-  //       });
-  //       authorizeResult.sign_url = res.data.sign_url || "";
-  //     } finally {
-  //       authorizeLoading.value = false;
-  //     }
-  //   }
-  // });
-
   try {
     const res = await AccountAPI.authorizeApply({
       enterprise_id: currentEnterpriseId.value!,
     });
-    authorizeResult.sign_url = res.data.data?.sign_url || "";
-    // 直接打开新窗口跳转
-    window.open(authorizeResult.sign_url, "_blank");
+    const signHtml = res.data.data?.sign_url || "";
+    const externalAgreementNo = res.data.data?.external_agreement_no || "";
+    authorizeResult.sign_url = signHtml;
+    authorizeResult.external_agreement_no = externalAgreementNo;
+    // pageExecute 返回 HTML 表单,自带自动提交,直接渲染到当前页自动重定向到支付宝
+    document.open();
+    document.write(signHtml);
+    document.close();
   } finally {
     authorizeLoading.value = false;
   }
 }
 
+async function handleQueryAgreement() {
+  if (!authorizeResult.external_agreement_no) {
+    ElMessage.warning("请先申请签约");
+    return;
+  }
+  authorizeResult.queryLoading = true;
+  try {
+    const res = await AccountAPI.queryAgreement(
+      currentEnterpriseId.value!,
+      authorizeResult.external_agreement_no,
+    );
+    const agreementNo = res.data.data?.agreement_no || "";
+    if (agreementNo) {
+      authorizeResult.agreement_no = agreementNo;
+      createForm.agreement_no = agreementNo;
+      ElMessage.success("签约协议号已获取: " + agreementNo);
+    } else {
+      ElMessage.warning("尚未完成签约,请在支付宝中完成签约后再查询");
+    }
+  } finally {
+    authorizeResult.queryLoading = false;
+  }
+}
+
 function handleAuthorizeReset() {
   authorizeFormRef.value?.resetFields();
   authorizeResult.sign_url = "";
+  authorizeResult.external_agreement_no = "";
+  authorizeResult.agreement_no = "";
 }
 
 async function handleCreate() {
@@ -1278,6 +1455,7 @@ async function handleCreate() {
   try {
     const res = await AccountAPI.create({
       enterprise_id: currentEnterpriseId.value!,
+      agreement_no: createForm.agreement_no || undefined,
       account_type: "ALL",
       scene: "B2B_TRANS",
       remark: "",
@@ -1314,9 +1492,12 @@ async function handleDeposit() {
           amount: depositForm.amount,
           remark: depositForm.remark,
         });
-        depositResult.url = res.data.data?.url || "";
-        // 直接打开新窗口跳转
-        window.open(depositResult.url, "_blank");
+        const depositHtml = res.data.data?.url || "";
+        depositResult.url = depositHtml;
+        // pageExecute 返回 HTML 表单,自带自动提交,直接渲染到当前页自动重定向到支付宝
+        document.open();
+        document.write(depositHtml);
+        document.close();
       } finally {
         depositLoading.value = false;
       }
@@ -1368,7 +1549,7 @@ async function handleTransfer() {
 function handleTransferReset() {
   transferFormRef.value?.resetFields();
   transferForm.payee_info = {
-    identity_type: "alipay",
+    identity_type: "ALIPAY_USER_ID",
     name: "",
     identity: "",
     bankcard_ext_info: {
@@ -1654,6 +1835,7 @@ function handleOverviewRefresh(data: any) {
       account_book_id: data.account_book_id || "",
       status: data.status || "",
       balance: data.balance || 0,
+      onboard_status: data.onboard_status || "PENDING",
     };
     authorizeStatus.value = data.authorize_status || "PENDING";
   }
@@ -1663,6 +1845,8 @@ async function handleGoTab(tab: string) {
   console.log("goTab => ", tab);
   if (tab === "authorize") {
     await handleAuthorize();
+  } else if (tab === "onboard") {
+    onboardDialogVisible.value = true;
   } else if (tab === "create") {
     await handleCreate();
   } else if (tab === "deposit") {

+ 3 - 0
frontend/src/views/module_payment/enterprise/components/EnterpriseForm.vue

@@ -215,6 +215,7 @@ const initialFormData = {
   service_provider_id: null as number | null,
   scope_label: "",
   wanlihui_uid: "",
+  transfer_enabled: false,
 };
 
 const formData = reactive(
@@ -268,6 +269,7 @@ watch(
         materialForm.business_scenario = data.business_scenario || "";
         materialForm.legal_rep_id_photo = data.legal_rep_id_photo || "";
         formData.wanlihui_uid = data.wanlihui_uid || "";
+        formData.transfer_enabled = data.transfer_enabled === true;
         if (data.business_contracts) {
           try {
             const contracts = typeof data.business_contracts === "string"
@@ -443,6 +445,7 @@ async function submitForm() {
       service_provider_id: formData.service_provider_id,
       scope_label: formData.scope_label,
       wanlihui_uid: formData.wanlihui_uid || undefined,
+      transfer_enabled: formData.transfer_enabled ?? undefined,
     };
 
     // 入驻材料

+ 20 - 0
frontend/src/views/module_payment/enterprise/index.vue

@@ -59,6 +59,13 @@
                     @click="handleOpenDetail(scope.row)">
                     详情
                   </el-button>
+                  <el-button
+                    size="small" link
+                    :type="scope.row.transfer_enabled ? 'danger' : 'success'"
+                    :loading="scope.row._toggling"
+                    @click="handleToggleTransfer(scope.row)">
+                    {{ scope.row.transfer_enabled ? '关闭转账' : '开通转账' }}
+                  </el-button>
                   <el-button v-if="!isAdmin && (!scope.row.f2f_status || scope.row.f2f_status === 'CLOSED')"
                     v-hasPerm="['module_payment:facetoface:apply']" type="success" size="small" link
                     @click="handleOpenF2fApply(scope.row)">
@@ -350,6 +357,19 @@ const employeeDialogEnterpriseId = ref<string>();
 const employeeFormRef = ref();
 const isEmployeeSubmitting = ref(false);
 
+async function handleToggleTransfer(row: any) {
+  row._toggling = true;
+  try {
+    await EnterpriseAPI.update(row.enterprise_id, { transfer_enabled: !row.transfer_enabled });
+    row.transfer_enabled = !row.transfer_enabled;
+    ElMessage.success(row.transfer_enabled ? "已开通转账功能" : "已关闭转账功能");
+  } catch {
+    ElMessage.error("操作失败");
+  } finally {
+    row._toggling = false;
+  }
+}
+
 function handleOpenDialog(type: "apply" | "update" | "detail") {
   dialogVisible.type = type;
   if (type === "apply") {

+ 946 - 0
java/.claude/plan/2026-07-15-alipay-safe-pay-migration.md

@@ -0,0 +1,946 @@
+# AlipayTransferService: 企业码 → 安全发 API 迁移
+
+> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking.
+
+**Goal:** 将账户转账体系的5个核心接口从旧的企业码 API (`alipay.commerce.ec.trans.*`) 迁移到安全发-服务商模式 API
+
+**Architecture:** 新流程以 `agreement_no` (签约协议号) 贯穿全链路:签约获取协议号 → 开记账本传入协议号 → 转账时 payer_info.ext_info 传入协议号。所有接口使用 SDK 4.39.218.ALL 已有类,无需升级。
+
+**Tech Stack:** Java 21, Spring Boot 3.x, MyBatis-Plus, PostgreSQL, Alipay SDK 4.39.218.ALL
+
+## Global Constraints
+
+- SDK 版本 4.39.218.ALL 已包含所有新 API 类,不可升级
+- 北京时间 (ZoneOffset.ofHours(8)) 统一用于所有时间计算
+- 签名类型 RSA2,字符集 UTF-8
+- 页面跳转接口 (`pageExecute`) 需返回 body 作为 HTML 重定向
+- 接口路径和参数名保持向后兼容,不破坏前端
+
+---
+
+### Task 1: AccountEntity 增加 agreement_no 字段
+
+**Files:**
+- Modify: `java/src/main/java/com/payment/platform/module/payment/account/entity/AccountEntity.java`
+- New: `java/src/main/resources/db/migration/V2__add_agreement_no.sql` (或直接 ALTER TABLE)
+
+**Interfaces:**
+- Produces: `AccountEntity.agreementNo` (String) — 签约协议号,createAccount 时写入
+
+- [ ] **Step 1: 修改 AccountEntity**
+
+```java
+// 在 signStatus 字段下方新增:
+/** 签约协议号 — 安全发模式下通过 alipay.user.agreement.page.sign 获取 */
+private String agreementNo;
+```
+
+- [ ] **Step 2: 执行数据库迁移**
+
+```sql
+ALTER TABLE pay_account ADD COLUMN IF NOT EXISTS agreement_no VARCHAR(64);
+COMMENT ON COLUMN pay_account.agreement_no IS '签约协议号';
+```
+
+- [ ] **Step 3: 编译验证**
+
+```bash
+cd java && mvn compile -q
+# Expected: BUILD SUCCESS
+```
+
+- [ ] **Step 4: Commit**
+
+```bash
+git add -A
+git commit -m "feat: AccountEntity 增加 agreement_no 字段用于安全发签约协议号"
+```
+
+---
+
+### Task 2: 重写 authorizeApply() — 签约页面跳转
+
+**Files:**
+- Modify: `java/src/main/java/com/payment/platform/module/payment/account/service/AlipayTransferService.java:90-109`
+- Modify: `java/src/main/java/com/payment/platform/module/payment/account/controller/AccountController.java:105-108`
+
+**Interfaces:**
+- Consumes: `AlipayClient.pageExecute()` (SDK已有的页面跳转方法)
+- Produces: `Map<String, String>` — 返回 `{"sign_url": "<重定向HTML>"}`
+
+旧代码:
+```java
+AlipayCommerceEcTransAuthorizeApplyModel model = new AlipayCommerceEcTransAuthorizeApplyModel();
+model.setEnterpriseId(enterpriseId);
+AlipayCommerceEcTransAuthorizeApplyRequest request = new AlipayCommerceEcTransAuthorizeApplyRequest();
+request.setBizModel(model);
+AlipayCommerceEcTransAuthorizeApplyResponse response = client.execute(request);
+return Map.of("sign_url", response.getSignUrl());
+```
+
+- [ ] **Step 1: 重写 authorizeApply 方法**
+
+```java
+/** 对应新安全发模式: alipay.user.agreement.page.sign
+ *  页面跳转接口 — 使用 pageExecute() 而非 execute() */
+public Map<String, String> authorizeApply(String enterpriseId) {
+    try {
+        AlipayUserAgreementPageSignModel model = new AlipayUserAgreementPageSignModel();
+        // 个人签约产品码 — 需与支付宝签约确定,安全发场景待确认
+        model.setPersonalProductCode("GENERAL_WITHHOLDING_P");
+        // 签约第三方主体类型: 平台商户
+        model.setThirdPartyType("PARTNER");
+        // 销售产品码
+        model.setProductCode("GENERAL_WITHHOLDING");
+        // 签约场景
+        model.setSignScene("DEFAULT|DEFAULT");
+        // 商户签约号 — 使用 enterpriseId 保证唯一
+        model.setExternalAgreementNo(enterpriseId + "_" + System.currentTimeMillis());
+        // 页面接入参数
+        AccessParams accessParams = new AccessParams();
+        accessParams.setChannel("ALIPAYAPP");
+        model.setAccessParams(accessParams);
+
+        AlipayUserAgreementPageSignRequest request = new AlipayUserAgreementPageSignRequest();
+        request.setBizModel(model);
+
+        // 页面跳转接口: 使用 pageExecute 而非 execute
+        AlipayUserAgreementPageSignResponse response =
+                alipayClientFactory.getClient(enterpriseId).pageExecute(request);
+
+        if (response == null) {
+            throw new BusinessException(400, "申请签约失败: 无响应");
+        }
+
+        // pageExecute 返回的 body 是完整的 HTML 重定向页面
+        String body = response.getBody();
+        return Map.of("sign_url", body != null ? body : "");
+    } catch (AlipayApiException e) {
+        throw new BusinessException(400, "申请签约失败: " + e.getMessage());
+    }
+}
+```
+
+- [ ] **Step 2: 添加 import**
+
+```java
+import com.alipay.api.domain.AlipayUserAgreementPageSignModel;
+import com.alipay.api.domain.AccessParams;
+import com.alipay.api.request.AlipayUserAgreementPageSignRequest;
+import com.alipay.api.response.AlipayUserAgreementPageSignResponse;
+```
+
+- [ ] **Step 3: Controller 响应类型适配**
+
+`AccountController.java:105-108` — `authorizeApply` 现在返回 `sign_url`(HTML 重定向页面),前端需直接渲染该 HTML 或提取 URL 跳转。Controller 签名不变,仍然是 `Result<Map<String, String>>`。
+
+- [ ] **Step 4: 编译验证**
+
+```bash
+cd java && mvn compile -q
+# Expected: BUILD SUCCESS
+```
+
+- [ ] **Step 5: Commit**
+
+```bash
+git add -A
+git commit -m "feat: authorizeApply 迁移到 alipay.user.agreement.page.sign (pageExecute)"
+```
+
+---
+
+### Task 3: 重写 createAccount() — 资金记账本开通
+
+**Files:**
+- Modify: `java/src/main/java/com/payment/platform/module/payment/account/service/AlipayTransferService.java:111-143`
+
+**Interfaces:**
+- Consumes: `agreementNo` (从 account entity 获取或通过参数传入)
+- Produces: `Map<String, String>` — `{"enterprise_id", "account_book_id"}`
+
+旧代码使用 `AlipayCommerceEcTransAccountCreateRequest`,新代码使用 `AlipayFundAccountbookCreateRequest`。
+
+- [ ] **Step 1: 修改 createAccount 签名,增加 agreementNo 参数**
+
+首先检查调用方:
+
+Controller `AccountController.java:112-115`:
+```java
+@PostMapping
+public Result<Map<String, String>> create(@RequestBody Map<String, Object> b) {
+    return Result.ok(alipayTransferService.createAccount((String) b.get("enterprise_id")));
+}
+```
+
+改为传入 `agreement_no`:
+```java
+@PostMapping
+public Result<Map<String, String>> create(@RequestBody Map<String, Object> b) {
+    return Result.ok(alipayTransferService.createAccount(
+        (String) b.get("enterprise_id"),
+        (String) b.get("agreement_no")));
+}
+```
+
+- [ ] **Step 2: 重写 createAccount 方法**
+
+```java
+/** 对应新安全发模式: alipay.fund.accountbook.create */
+@Transactional
+public Map<String, String> createAccount(String enterpriseId, String agreementNo) {
+    try {
+        AlipayFundAccountbookCreateModel model = new AlipayFundAccountbookCreateModel();
+        model.setMerchantUserId(enterpriseId);
+        model.setMerchantUserType("BUSINESS_ORGANIZATION");
+        model.setSceneCode("SATF_FUND_BOOK");
+
+        // 扩展信息: 传入签约协议号
+        if (agreementNo != null && !agreementNo.isBlank()) {
+            try {
+                ObjectMapper om = new ObjectMapper();
+                Map<String, String> extInfo = new LinkedHashMap<>();
+                extInfo.put("agreement_no", agreementNo);
+                model.setExtInfo(om.writeValueAsString(extInfo));
+            } catch (Exception e) {
+                throw new BusinessException(400, "序列化 ext_info 失败: " + e.getMessage());
+            }
+        }
+
+        AlipayFundAccountbookCreateRequest request = new AlipayFundAccountbookCreateRequest();
+        request.setBizModel(model);
+
+        AlipayFundAccountbookCreateResponse response =
+                alipayClientFactory.getClient(enterpriseId).execute(request);
+
+        if (!response.isSuccess())
+            throw new BusinessException(400, "开通资金记账本失败: " + response.getMsg());
+
+        AccountEntity account = new AccountEntity();
+        account.setEnterpriseId(enterpriseId);
+        account.setAccountBookId(response.getAccountBookId());
+        account.setAccountType("ALL");
+        account.setScene("B2B_TRANS");
+        account.setStatus("ACTIVE");
+        account.setSignStatus("SIGNED");  // 新流程: 已签约状态
+        account.setAgreementNo(agreementNo);
+        accountMapper.insert(account);
+
+        return Map.of("enterprise_id", enterpriseId,
+                "account_book_id", response.getAccountBookId() != null ? response.getAccountBookId() : "");
+    } catch (AlipayApiException e) {
+        throw new BusinessException(400, "开通资金记账本失败: " + e.getMessage());
+    }
+}
+```
+
+- [ ] **Step 3: 添加 import**
+
+```java
+import com.alipay.api.domain.AlipayFundAccountbookCreateModel;
+import com.alipay.api.request.AlipayFundAccountbookCreateRequest;
+import com.alipay.api.response.AlipayFundAccountbookCreateResponse;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import java.util.LinkedHashMap;
+```
+
+- [ ] **Step 4: 编译验证**
+
+```bash
+cd java && mvn compile -q
+# Expected: BUILD SUCCESS
+```
+
+- [ ] **Step 5: Commit**
+
+```bash
+git add -A
+git commit -m "feat: createAccount 迁移到 alipay.fund.accountbook.create"
+```
+
+---
+
+### Task 4: 重写 deposit() — 记账本充值
+
+**Files:**
+- Modify: `java/src/main/java/com/payment/platform/module/payment/account/service/AlipayTransferService.java:145-179`
+
+**Interfaces:**
+- Consumes: `enterpriseId`, `accountBookId`, `amount`, `remark`
+- Produces: `Map<String, String>` — `{"url": "<充值页面HTML>"}`
+
+充值从普通请求变为页面跳转接口 (`alipay.fund.trans.page.pay`),使用 `pageExecute()`。
+
+- [ ] **Step 1: 重写 deposit 方法**
+
+```java
+/** 对应新安全发模式: alipay.fund.trans.page.pay (页面跳转充值) */
+@Transactional
+public Map<String, String> deposit(String enterpriseId, String accountBookId, BigDecimal amount, String remark) {
+    try {
+        AlipayFundTransPagePayModel model = new AlipayFundTransPagePayModel();
+        model.setOutBizNo(SnowflakeIdGenerator.nextIdStr());
+        model.setTransAmount(amount.toPlainString());
+        model.setProductCode("SINGLE_TRANSFER_NO_PWD");
+        model.setBizScene("DIRECT_ALLOCATION");  // 安全发充值场景
+
+        // 收款方: 记账本
+        TransParticipant payee = new TransParticipant();
+        payee.setIdentityType("ACCOUNT_BOOK_ID");
+        payee.setIdentity(accountBookId);
+        model.setPayeeInfo(payee);
+
+        if (remark != null && !remark.isBlank()) model.setRemark(remark);
+
+        AlipayFundTransPagePayRequest request = new AlipayFundTransPagePayRequest();
+        request.setBizModel(model);
+
+        AlipayFundTransPagePayResponse response =
+                alipayClientFactory.getClient(enterpriseId).pageExecute(request);
+
+        if (response == null || response.getBody() == null)
+            throw new BusinessException(400, "充值页面生成失败: 无响应");
+
+        // 保存充值记录
+        DepositEntity deposit = new DepositEntity();
+        deposit.setEnterpriseId(enterpriseId);
+        deposit.setOutBizNo(model.getOutBizNo());
+        deposit.setAccountBookId(accountBookId);
+        deposit.setAmount(amount);
+        deposit.setUrl(response.getBody());
+        deposit.setStatus("DEALING");
+        deposit.setRemark(remark);
+        depositMapper.insert(deposit);
+
+        return Map.of("url", response.getBody());
+    } catch (AlipayApiException e) {
+        throw new BusinessException(400, "充值失败: " + e.getMessage());
+    }
+}
+```
+
+- [ ] **Step 2: 添加 import**
+
+```java
+import com.alipay.api.domain.AlipayFundTransPagePayModel;
+import com.alipay.api.request.AlipayFundTransPagePayRequest;
+import com.alipay.api.response.AlipayFundTransPagePayResponse;
+```
+
+- [ ] **Step 3: 编译验证**
+
+```bash
+cd java && mvn compile -q
+# Expected: BUILD SUCCESS
+```
+
+- [ ] **Step 4: Commit**
+
+```bash
+git add -A
+git commit -m "feat: deposit 迁移到 alipay.fund.trans.page.pay (pageExecute)"
+```
+
+---
+
+### Task 5: 重写 transfer() — 核心转账接口
+
+**Files:**
+- Modify: `java/src/main/java/com/payment/platform/module/payment/account/service/AlipayTransferService.java:189-316`
+- Modify: `java/src/main/java/com/payment/platform/module/payment/account/dto/TransferCreateDTO.java` (可能需要加参数)
+
+**Interfaces:**
+- Consumes: `TransferCreateDTO` (含 enterpriseId, accountBookId, amount, payeeInfo, extInfo 等)
+- Produces: `Map<String, Object>` — status, order_id, pay_fund_order_id, out_biz_no
+
+旧 API: `AlipayCommerceEcTransAccountTransferRequest` → 新 API: `AlipayFundTransUniTransferRequest`
+
+- [ ] **Step 1: 重写 transfer 方法核心逻辑**
+
+```java
+/**
+ * 对应新安全发模式: alipay.fund.trans.uni.transfer
+ * biz_scene=ENTRUST_TRANSFER, product_code=SINGLE_TRANSFER_NO_PWD
+ */
+@Transactional
+public Map<String, Object> transfer(TransferCreateDTO dto) {
+    String accountBookId = dto.getAccountBookId();
+    String enterpriseId = dto.getEnterpriseId();
+    BigDecimal amount = dto.getAmount();
+    String orderTitle = dto.getOrderTitle();
+    String remark = dto.getRemark();
+    Map<String, Object> payeeInfo = dto.getPayeeInfo();
+    Map<String, Object> extInfo = dto.getExtInfo();
+
+    // 检查资金记账本
+    AccountEntity account = accountMapper.selectOne(
+            new LambdaQueryWrapper<AccountEntity>()
+                    .eq(AccountEntity::getAccountBookId, accountBookId));
+    if (account == null) throw new BusinessException(400, "资金记账本不存在");
+
+    // 租户范围校验
+    if (dto.getTenantId() != null && !dto.getTenantId().equals(account.getTenantId())) {
+        throw new BusinessException(403, "无权限操作");
+    }
+    if (enterpriseId != null && !enterpriseId.equals(account.getEnterpriseId()))
+        throw new BusinessException(400, "参数错误");
+
+    // 自动生成转账标题
+    if ((orderTitle == null || orderTitle.isBlank()) && account.getEnterpriseId() != null) {
+        EnterpriseEntity ent = enterpriseMapper.selectOne(
+                new LambdaQueryWrapper<EnterpriseEntity>()
+                        .eq(EnterpriseEntity::getEnterpriseId, account.getEnterpriseId()));
+        if (ent == null) throw new BusinessException(400, "记账本所属企业不存在");
+        if (ent.getName() != null) orderTitle = "来自" + ent.getName() + "转账";
+    }
+
+    try {
+        AlipayFundTransUniTransferModel model = new AlipayFundTransUniTransferModel();
+        model.setOutBizNo(SnowflakeIdGenerator.nextIdStr());
+        model.setTransAmount(amount.toPlainString());
+        model.setBizScene("ENTRUST_TRANSFER");       // 安全发服务商版转账
+        model.setProductCode("SINGLE_TRANSFER_NO_PWD"); // 安全发固定产品码
+        model.setOrderTitle(orderTitle);
+        if (remark != null && !remark.isBlank()) model.setRemark(remark);
+
+        // 付款方: 记账本
+        TransParticipant payer = new TransParticipant();
+        payer.setIdentityType("ACCOUNT_BOOK_ID");
+        payer.setIdentity(account.getAccountBookId());
+        // ext_info 传入签约协议号
+        if (account.getAgreementNo() != null && !account.getAgreementNo().isBlank()) {
+            try {
+                ObjectMapper om = new ObjectMapper();
+                Map<String, String> payerExt = new LinkedHashMap<>();
+                payerExt.put("agreement_no", account.getAgreementNo());
+                payer.setExtInfo(om.writeValueAsString(payerExt));
+            } catch (Exception e) {
+                throw new BusinessException(400, "序列化 payer ext_info 失败: " + e.getMessage());
+            }
+        }
+        model.setPayerInfo(payer);
+
+        // 收款方
+        TransParticipant payee = new TransParticipant();
+        payee.setIdentityType((String) payeeInfo.get("identity_type"));
+        payee.setName((String) payeeInfo.get("name"));
+        payee.setIdentity((String) payeeInfo.get("identity"));
+
+        // 银行卡扩展信息
+        @SuppressWarnings("unchecked")
+        Map<String, Object> bankcardInfo = (Map<String, Object>) payeeInfo.get("bankcard_ext_info");
+        if (bankcardInfo != null) {
+            try {
+                Class<?> bceClass = Class.forName("com.alipay.api.domain.BankCardExtInfo");
+                Object bce = bceClass.getDeclaredConstructor().newInstance();
+                for (var entry : bankcardInfo.entrySet()) {
+                    String setter = "set" + Character.toUpperCase(entry.getKey().charAt(0))
+                            + entry.getKey().substring(1);
+                    try { bceClass.getMethod(setter, String.class).invoke(bce, entry.getValue()); }
+                    catch (Exception ignored) {}
+                }
+                payee.getClass().getMethod("setBankcardExtInfo", bceClass).invoke(payee, bce);
+            } catch (Exception ignored) {}
+        }
+        model.setPayeeInfo(payee);
+
+        // 转账场景信息
+        if (extInfo != null && extInfo.containsKey("transfer_scene_name")) {
+            model.setTransferSceneName((String) extInfo.get("transfer_scene_name"));
+        }
+        if (extInfo != null && extInfo.containsKey("transfer_scene_report_infos")) {
+            model.setTransferSceneReportInfos(/* ... */);
+        }
+
+        AlipayFundTransUniTransferRequest request = new AlipayFundTransUniTransferRequest();
+        request.setBizModel(model);
+
+        AlipayFundTransUniTransferResponse response =
+                alipayClientFactory.getClient(enterpriseId).execute(request);
+
+        String subCode = response.getSubCode() != null ? response.getSubCode() : "";
+        String subMsg = response.getSubMsg() != null ? response.getSubMsg() : "";
+
+        // 构建转账记录 (字段名适配新API)
+        TransferEntity transfer = new TransferEntity();
+        transfer.setEnterpriseId(account.getEnterpriseId());
+        transfer.setOutBizNo(model.getOutBizNo());
+        transfer.setAccountBookId(account.getAccountBookId());
+        transfer.setAmount(new BigDecimal(model.getTransAmount()));
+        transfer.setOrderTitle(model.getOrderTitle());
+        transfer.setPayeeInfo(toJson(payeeInfo));
+        transfer.setPayeeType((String) payeeInfo.get("identity_type"));
+        transfer.setStatus(response.getStatus());
+        transfer.setOrderNo(response.getOrderId());     // 新API返回 orderId 而非 orderNo
+        transfer.setFundOrderId(response.getPayFundOrderId()); // 新API返回 payFundOrderId
+        transfer.setRemark(remark != null ? remark : "");
+        if (extInfo != null) transfer.setExtInfo(toJson(extInfo));
+
+        if (!response.isSuccess()) {
+            String hint = TRANSFER_ERROR_HINTS.get(subCode);
+            if (hint == null) {
+                for (var entry : TRANSFER_ERROR_HINTS.entrySet()) {
+                    if (subMsg.contains(entry.getKey())) { hint = entry.getValue(); break; }
+                }
+            }
+            if (hint == null) hint = !subMsg.isEmpty() ? subMsg : response.getMsg();
+
+            log.error("支付宝转账失败: code={}, msg={}, sub_code={}, sub_msg={}",
+                    response.getCode(), response.getMsg(), subCode, subMsg);
+
+            self.insertFailedTransfer(transfer, response.getMsg(), subCode, subMsg,
+                    remark != null ? remark : "");
+            throw new BusinessException(400, "转账失败: " + hint);
+        }
+
+        // DEALING 状态设置重试
+        if ("DEALING".equals(response.getStatus())) {
+            transfer.setRetryCount(0);
+            transfer.setNextRetryAt(OffsetDateTime.now().plusMinutes(5));
+        }
+
+        transferMapper.insert(transfer);
+
+        Map<String, Object> result = new LinkedHashMap<>();
+        result.put("status", response.getStatus());
+        result.put("order_id", response.getOrderId());
+        result.put("pay_fund_order_id", response.getPayFundOrderId());
+        result.put("out_biz_no", model.getOutBizNo());
+        return result;
+    } catch (AlipayApiException e) {
+        throw new BusinessException(400, "转账失败: " + e.getMessage());
+    }
+}
+```
+
+- [ ] **Step 2: 添加 import**
+
+```java
+import com.alipay.api.domain.AlipayFundTransUniTransferModel;
+import com.alipay.api.request.AlipayFundTransUniTransferRequest;
+import com.alipay.api.response.AlipayFundTransUniTransferResponse;
+import com.fasterxml.jackson.databind.ObjectMapper;
+```
+
+- [ ] **Step 3: 检查 TransferCreateDTO 是否需要新增字段**
+
+检查 `TransferCreateDTO.java`。当前字段: `enterpriseId, accountBookId, outBizNo, amount, orderTitle, remark, payeeInfo, employeeId, priority, extInfo, tenantId`。新接口无需额外字段,`extInfo` 可传 `transfer_scene_name` 和 `transfer_scene_report_infos`。
+
+- [ ] **Step 4: 编译验证**
+
+```bash
+cd java && mvn compile -q
+# Expected: BUILD SUCCESS
+```
+
+- [ ] **Step 5: Commit**
+
+```bash
+git add -A
+git commit -m "feat: transfer 迁移到 alipay.fund.trans.uni.transfer"
+```
+
+---
+
+### Task 6: 重写 queryAccounts() — 记账本查询
+
+**Files:**
+- Modify: `java/src/main/java/com/payment/platform/module/payment/account/service/AlipayTransferService.java:380-417`
+
+**Interfaces:**
+- Consumes: `enterpriseId`
+- Produces: `List<Map<String, Object>>` — account_book_id, scene, status 列表
+
+- [ ] **Step 1: 重写 queryAccounts 方法**
+
+```java
+/** 对应新安全发模式: alipay.fund.accountbook.query */
+public List<Map<String, Object>> queryAccounts(String enterpriseId) {
+    try {
+        AlipayFundAccountbookQueryModel model = new AlipayFundAccountbookQueryModel();
+        model.setMerchantUserId(enterpriseId);
+        model.setSceneCode("SATF_FUND_BOOK");
+
+        AlipayFundAccountbookQueryRequest request = new AlipayFundAccountbookQueryRequest();
+        request.setBizModel(model);
+
+        AlipayFundAccountbookQueryResponse response =
+                alipayClientFactory.getClient(enterpriseId).execute(request);
+
+        if (!response.isSuccess())
+            throw new BusinessException(400, "查询记账本失败: " + response.getMsg());
+
+        List<Map<String, Object>> result = new ArrayList<>();
+        // 注意: 新API返回结构可能不同,取决于实际 SDK Response 字段
+        // 通常返回单个 account_book_id 和基本信息
+        Map<String, Object> m = new LinkedHashMap<>();
+        m.put("account_book_id", response.getAccountBookId());
+        m.put("scene", "B2B_TRANS");
+        m.put("status", response.getStatus());
+        result.add(m);
+        return result;
+    } catch (AlipayApiException e) {
+        throw new BusinessException(400, "查询记账本失败: " + e.getMessage());
+    }
+}
+```
+
+- [ ] **Step 2: 添加 import**
+
+```java
+import com.alipay.api.domain.AlipayFundAccountbookQueryModel;
+import com.alipay.api.request.AlipayFundAccountbookQueryRequest;
+import com.alipay.api.response.AlipayFundAccountbookQueryResponse;
+```
+
+- [ ] **Step 3: 编译验证**
+
+```bash
+cd java && mvn compile -q
+# Expected: BUILD SUCCESS
+```
+
+- [ ] **Step 4: Commit**
+
+```bash
+git add -A
+git commit -m "feat: queryAccounts 迁移到 alipay.fund.accountbook.query"
+```
+
+---
+
+### Task 7: 重写转账状态同步 — alipay.fund.trans.common.query
+
+**Files:**
+- Modify: `java/src/main/java/com/payment/platform/module/payment/account/service/AlipayTransferService.java` (transferSyncAllService 和 syncStatus 方法)
+
+- [ ] **Step 1: 添加 transferQuery 辅助方法**
+
+```java
+/**
+ * 查询单笔转账状态 — alipay.fund.trans.common.query
+ * 可用 order_id、out_biz_no 或 pay_fund_order_id 任一查询
+ */
+public Map<String, String> queryTransferStatus(String orderId, String outBizNo) {
+    try {
+        AlipayFundTransCommonQueryModel model = new AlipayFundTransCommonQueryModel();
+        if (orderId != null && !orderId.isBlank()) {
+            model.setOrderId(orderId);
+        } else if (outBizNo != null && !outBizNo.isBlank()) {
+            model.setOutBizNo(outBizNo);
+        } else {
+            throw new BusinessException(400, "order_id 和 out_biz_no 不能同时为空");
+        }
+        model.setProductCode("SINGLE_TRANSFER_NO_PWD");
+        model.setBizScene("ENTRUST_TRANSFER");
+
+        AlipayFundTransCommonQueryRequest request = new AlipayFundTransCommonQueryRequest();
+        request.setBizModel(model);
+
+        AlipayClient client = alipayClientFactory.getClient(); // 使用默认客户端
+        AlipayFundTransCommonQueryResponse response = client.execute(request);
+
+        if (!response.isSuccess()) {
+            log.warn("查询转账状态失败: code={}, msg={}", response.getCode(), response.getMsg());
+            return Map.of("status", "UNKNOWN", "error", response.getMsg());
+        }
+
+        Map<String, String> result = new LinkedHashMap<>();
+        result.put("status", response.getStatus() != null ? response.getStatus() : "UNKNOWN");
+        result.put("order_id", response.getOrderId());
+        result.put("out_biz_no", response.getOutBizNo());
+        result.put("pay_fund_order_id", response.getPayFundOrderId());
+        result.put("trans_amount", response.getTransAmount());
+        result.put("pay_date", response.getPayDate());
+        return result;
+    } catch (AlipayApiException e) {
+        log.error("查询转账状态异常", e);
+        return Map.of("status", "UNKNOWN", "error", e.getMessage());
+    }
+}
+```
+
+- [ ] **Step 2: 更新 transferSyncAllService 使用新查询方法**
+
+```java
+/** 全量同步转账状态 — 使用 alipay.fund.trans.common.query */
+public Map<String, Object> transferSyncAllService() {
+    // 查询所有 DEALING 状态的转账记录
+    List<TransferEntity> dealingTransfers = transferMapper.selectList(
+            new LambdaQueryWrapper<TransferEntity>()
+                    .eq(TransferEntity::getStatus, "DEALING"));
+
+    int success = 0, fail = 0, dealing = 0;
+    for (TransferEntity t : dealingTransfers) {
+        Map<String, String> status = queryTransferStatus(t.getOrderNo(), null);
+        String s = status.get("status");
+        if ("SUCCESS".equals(s)) {
+            t.setStatus("SUCCESS");
+            transferMapper.updateById(t);
+            success++;
+        } else if ("FAIL".equals(s) || "REFUND".equals(s)) {
+            t.setStatus(s);
+            t.setErrorMsg(status.get("error"));
+            transferMapper.updateById(t);
+            fail++;
+        } else {
+            dealing++;
+        }
+    }
+    return Map.of("total", dealingTransfers.size(), "success", success,
+            "fail", fail, "dealing", dealing);
+}
+```
+
+- [ ] **Step 3: 添加 import**
+
+```java
+import com.alipay.api.domain.AlipayFundTransCommonQueryModel;
+import com.alipay.api.request.AlipayFundTransCommonQueryRequest;
+import com.alipay.api.response.AlipayFundTransCommonQueryResponse;
+import com.alipay.api.AlipayClient;
+```
+
+- [ ] **Step 4: 编译验证 + Commit**
+
+```bash
+cd java && mvn compile -q
+git add -A
+git commit -m "feat: 转账状态同步迁移到 alipay.fund.trans.common.query"
+```
+
+---
+
+### Task 8: 添加异步通知处理器 — alipay.fund.trans.order.changed
+
+**Files:**
+- Modify: `java/src/main/java/com/payment/platform/module/payment/notification/handler/BillHandler.java` (或新建 `TransferNotifyHandler.java`)
+
+新通知 `alipay.fund.trans.order.changed` 用于接收转账状态变更通知。需要在 NotificationService 中注册处理。
+
+- [ ] **Step 1: 创建 TransferNotifyHandler.java**
+
+```java
+// 路径: java/src/main/java/com/payment/platform/module/payment/notification/handler/TransferNotifyHandler.java
+package com.payment.platform.module.payment.notification.handler;
+
+import com.payment.platform.module.payment.account.entity.TransferEntity;
+import com.payment.platform.module.payment.account.mapper.TransferMapper;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+
+import java.util.Map;
+
+/** 转账状态变更通知处理器 — alipay.fund.trans.order.changed */
+@Slf4j
+@Component
+@RequiredArgsConstructor
+public class TransferNotifyHandler extends BaseNotifyHandler {
+
+    private final TransferMapper transferMapper;
+
+    @Override
+    protected String[] acceptedMethods() {
+        return new String[]{"alipay.fund.trans.order.changed"};
+    }
+
+    @Override
+    protected void handle(String msgMethod, Map<String, String> params) {
+        String orderId = params.get("order_id");
+        String outBizNo = params.get("out_biz_no");
+        String status = params.get("status");
+        String payFundOrderId = params.get("pay_fund_order_id");
+
+        log.info("转账状态变更通知: order_id={}, out_biz_no={}, status={}",
+                orderId, outBizNo, status);
+
+        TransferEntity transfer = null;
+        if (orderId != null) {
+            transfer = transferMapper.selectOne(
+                    new LambdaQueryWrapper<TransferEntity>()
+                            .eq(TransferEntity::getOrderNo, orderId));
+        }
+        if (transfer == null && outBizNo != null) {
+            transfer = transferMapper.selectOne(
+                    new LambdaQueryWrapper<TransferEntity>()
+                            .eq(TransferEntity::getOutBizNo, outBizNo));
+        }
+        if (transfer == null) {
+            log.warn("转账通知: 未找到对应记录 order_id={}, out_biz_no={}", orderId, outBizNo);
+            return;
+        }
+
+        if ("SUCCESS".equals(status) || "FAIL".equals(status) || "REFUND".equals(status)) {
+            transfer.setStatus(status);
+            if (payFundOrderId != null) transfer.setFundOrderId(payFundOrderId);
+            transferMapper.updateById(transfer);
+            log.info("转账状态同步完成: order_id={}, status={}", orderId, status);
+        }
+    }
+}
+```
+
+- [ ] **Step 2: 编译验证 + Commit**
+
+```bash
+cd java && mvn compile -q
+git add -A
+git commit -m "feat: 新增 TransferNotifyHandler 处理 alipay.fund.trans.order.changed"
+```
+
+---
+
+### Task 9: 清理 withdraw() — 提现接口
+
+**Files:**
+- Modify: `java/src/main/java/com/payment/platform/module/payment/account/service/AlipayTransferService.java:334-378`
+- Modify: `java/src/main/java/com/payment/platform/module/payment/account/controller/AccountController.java:180-188`
+
+安全发文档中没有直接对应旧 `withdraw` 的接口。提现功能在新体系中可能通过 `alipay.fund.trans.uni.transfer`(从记账本转到企业余额户)实现,或标记为待定。
+
+- [ ] **Step 1: 标记 withdraw 为 DEPRECATED 或改造**
+
+如果短期内不需要提现功能,标记方法为 deprecated:
+```java
+/** @deprecated 安全发模式下暂不支持独立提现接口,需走 uni.transfer 从记账本转回余额户 */
+@Deprecated
+@Transactional
+public Map<String, String> withdraw(...) { ... }
+```
+
+如果保留,改为走 `alipay.fund.trans.uni.transfer` + `biz_scene=ENTRUST_ALLOCATION`(记账本调拨回余额户)。
+
+- [ ] **Step 2: 编译验证 + Commit**
+
+---
+
+### Task 10: 前端 API 适配
+
+**Files:**
+- Modify: `frontend/src/api/module_payment/account.ts`
+
+- [ ] **Step 1: authorizeApply 响应处理改为 HTML 重定向**
+
+```typescript
+authorizeApply(data: { enterprise_id: string }) {
+    return request<ApiResponse<{ sign_url: string }>>({
+        url: `${API_PATH}/authorize/apply`,
+        method: "post",
+        data,
+    }).then(res => {
+        // sign_url 现在是完整的 HTML 重定向页面
+        // 提取 URL 后跳转,或直接 document.write
+        if (res.data?.sign_url) {
+            document.open();
+            document.write(res.data.sign_url);
+            document.close();
+        }
+        return res;
+    });
+},
+```
+
+- [ ] **Step 2: create 接口增加 agreement_no 参数**
+
+```typescript
+create(data: {
+    enterprise_id: string;
+    agreement_no?: string;  // 新增
+}) {
+    return request<ApiResponse<{ account_book_id: string }>>({
+        url: `${API_PATH}`,
+        method: "post",
+        data,
+    });
+},
+```
+
+- [ ] **Step 3: 转账响应字段名适配**
+
+```typescript
+// 旧: { status, order_no, fund_order_id }
+// 新: { status, order_id, pay_fund_order_id }
+// 前端兼容两种字段名
+transfer(data) {
+    return request<ApiResponse<{
+        status: string;
+        order_id?: string;
+        order_no?: string;  // 兼容
+        pay_fund_order_id?: string;
+        fund_order_id?: string;  // 兼容
+        out_biz_no: string;
+    }>>({ ... });
+}
+```
+
+- [ ] **Step 4: Commit**
+
+```bash
+git add -A
+git commit -m "feat: 前端适配安全发API参数变化"
+```
+
+---
+
+### Task 11: 集成测试与验证
+
+- [ ] **Step 1: 启动后端验证编译**
+
+```bash
+cd java && mvn spring-boot:run
+# 检查启动日志无错误
+```
+
+- [ ] **Step 2: 测试签约接口**
+
+```bash
+curl -X POST http://localhost:8001/api/v1/payment/account/authorize/apply \
+  -H "Content-Type: application/json" \
+  -d '{"enterprise_id":"test_enterprise"}'
+# Expected: 返回 sign_url HTML
+```
+
+- [ ] **Step 3: 测试开通记账本**
+
+```bash
+curl -X POST http://localhost:8001/api/v1/payment/account \
+  -H "Content-Type: application/json" \
+  -d '{"enterprise_id":"test_enterprise","agreement_no":"2025XXXXXX"}'
+# Expected: 返回 account_book_id
+```
+
+- [ ] **Step 4: 测试转账**
+
+```bash
+curl -X POST http://localhost:8001/api/v1/payment/account/transfer \
+  -H "Content-Type: application/json" \
+  -d '{"enterprise_id":"test","account_book_id":"2088xxx","amount":1.00,"payee_info":{"identity_type":"ALIPAY_USER_ID","identity":"2088xxx","name":"测试用户"}}'
+# Expected: 返回 status, order_id
+```
+
+---
+
+## API 映射速查表
+
+| 功能 | 旧 API | 新 API | 调用方式 |
+|------|--------|--------|----------|
+| 签约 | `alipay.commerce.ec.trans.authorize.apply` | `alipay.user.agreement.page.sign` | `pageExecute()` |
+| 开记账本 | `alipay.commerce.ec.trans.account.create` | `alipay.fund.accountbook.create` | `execute()` |
+| 充值 | `alipay.commerce.ec.trans.account.deposit` | `alipay.fund.trans.page.pay` | `pageExecute()` |
+| 转账 | `alipay.commerce.ec.trans.account.transfer` | `alipay.fund.trans.uni.transfer` | `execute()` |
+| 查记账本 | `alipay.commerce.ec.trans.account.query` | `alipay.fund.accountbook.query` | `execute()` |
+| 查转账 | — | `alipay.fund.trans.common.query` | `execute()` |
+| 通知 | `alipay.commerce.ec.consume.change.notify` | `alipay.fund.trans.order.changed` | 异步接收 |
+
+## 安全发转账关键参数
+
+| 参数 | 值 | 说明 |
+|------|----|------|
+| `biz_scene` | `ENTRUST_TRANSFER` | 服务商版转账 |
+| `product_code` | `SINGLE_TRANSFER_NO_PWD` | 安全发固定产品码 |
+| `payer_info.identity_type` | `ACCOUNT_BOOK_ID` | 付款方为记账本 |
+| `payer_info.identity` | 记账本ID | 从 createAccount 获取 |
+| `payer_info.ext_info` | `{"agreement_no":"..."}` | 签约协议号 |
+| `payee_info.identity_type` | `ALIPAMOBILE_USER_ID` | 支付宝用户ID |

+ 1 - 1
java/pom.xml

@@ -150,7 +150,7 @@
         <dependency>
             <groupId>com.alipay.sdk</groupId>
             <artifactId>alipay-sdk-java</artifactId>
-            <version>4.39.218.ALL</version>
+            <version>4.40.865.ALL</version>
         </dependency>
 
         <!-- Alibaba Cloud SMS -->

+ 8 - 11
java/src/main/java/com/payment/platform/core/alipay/AlipayClientFactory.java

@@ -202,18 +202,11 @@ public class AlipayClientFactory {
                 profile.getAppId(), profile.getAppPrivateKey(), profile.getAlipayPublicKey(),
                 profile.getServerUrl(), profile.getFormat(), profile.getCharset(), profile.getSignType());
 
-        // 证书模式: 若有证书内容则设置(优先级高于公钥)
-        if (profile.getAppCertContent() != null && !profile.getAppCertContent().isBlank()) {
-            config.setAppCertContent(profile.getAppCertContent());
-            config.setAlipayPublicCertContent(profile.getAlipayPublicCertContent());
-            config.setRootCertContent(profile.getRootCertContent());
-        }
-
+        // bizType 分支使用普通公钥模式(非资金类接口)
         try {
             AlipayClient client = new DefaultAlipayClient(config);
-            log.info("服务商[{}]业务[{}]客户端创建成功, appId={}, mode={}",
-                    profile.getServiceProviderId(), profile.getBizType(), profile.getAppId(),
-                    profile.getAppCertContent() != null ? "cert" : "key");
+            log.info("服务商[{}]业务[{}]客户端创建成功, appId={}, mode=key",
+                    profile.getServiceProviderId(), profile.getBizType(), profile.getAppId());
             return client;
         } catch (AlipayApiException e) {
             log.error("服务商[{}]业务[{}]客户端创建失败", profile.getServiceProviderId(), profile.getBizType(), e);
@@ -234,9 +227,13 @@ public class AlipayClientFactory {
         AlipayConfig config = buildSdkConfig(
                 sp.getAppId(), sp.getAppPrivateKey(), sp.getAlipayPublicKey(),
                 sp.getServerUrl(), sp.getFormat(), sp.getCharset(), sp.getSignType());
+        // 资金类接口统一使用公钥证书模式
+        config.setAppCertContent(sp.getAppCertContent());
+        config.setAlipayPublicCertContent(sp.getAlipayPublicCertContent());
+        config.setRootCertContent(sp.getRootCertContent());
         try {
             AlipayClient client = new DefaultAlipayClient(config);
-            log.info("服务商[{}]客户端创建成功, appId={}, name={}", providerId, sp.getAppId(), sp.getName());
+            log.info("服务商[{}]客户端创建成功, appId={}, name={}, mode=cert", providerId, sp.getAppId(), sp.getName());
             return client;
         } catch (AlipayApiException e) {
             log.error("服务商[{}]客户端创建失败", providerId, e);

+ 8 - 88
java/src/main/java/com/payment/platform/core/alipay/ExtendedInstitutionModifyModel.java

@@ -1,14 +1,15 @@
 package com.payment.platform.core.alipay;
 
 import com.alipay.api.domain.AlipayEbppInvoiceInstitutionModifyModel;
+import com.alipay.api.domain.ModifyIssueRuleDetailInfo;
+import com.alipay.api.domain.ModifyStandardDetailInfo;
 import com.google.gson.annotations.SerializedName;
 
-import java.util.List;
-import java.util.Map;
-
 /**
  * 扩展 InstitutionModifyModel,补齐 SDK 未支持的 modify_standard_detail_info 和 modify_issue_rule_detail_info
  * 对应 Python modify_institution_controller 中的数据结构
+ *
+ * SDK 4.40+ 已将 ModifyStandardDetailInfo / ModifyIssueRuleDetailInfo 提升为 com.alipay.api.domain 包下的正式类。
  */
 public class ExtendedInstitutionModifyModel extends AlipayEbppInvoiceInstitutionModifyModel {
 
@@ -18,104 +19,23 @@ public class ExtendedInstitutionModifyModel extends AlipayEbppInvoiceInstitution
     @SerializedName("modify_issue_rule_detail_info")
     private ModifyIssueRuleDetailInfo modifyIssueRuleDetailInfo;
 
+    @Override
     public ModifyStandardDetailInfo getModifyStandardDetailInfo() {
         return modifyStandardDetailInfo;
     }
 
+    @Override
     public void setModifyStandardDetailInfo(ModifyStandardDetailInfo modifyStandardDetailInfo) {
         this.modifyStandardDetailInfo = modifyStandardDetailInfo;
     }
 
+    @Override
     public ModifyIssueRuleDetailInfo getModifyIssueRuleDetailInfo() {
         return modifyIssueRuleDetailInfo;
     }
 
+    @Override
     public void setModifyIssueRuleDetailInfo(ModifyIssueRuleDetailInfo modifyIssueRuleDetailInfo) {
         this.modifyIssueRuleDetailInfo = modifyIssueRuleDetailInfo;
     }
-
-    public static class ModifyStandardDetailInfo {
-        @SerializedName("modify_standard_list")
-        private List<ModifyStandardItem> modifyStandardList;
-
-        public List<ModifyStandardItem> getModifyStandardList() {
-            return modifyStandardList;
-        }
-
-        public void setModifyStandardList(List<ModifyStandardItem> modifyStandardList) {
-            this.modifyStandardList = modifyStandardList;
-        }
-    }
-
-    public static class ModifyStandardItem {
-        @SerializedName("standard_id")
-        private String standardId;
-
-        @SerializedName("modify_condition_list")
-        private List<ModifyCondition> modifyConditionList;
-
-        public String getStandardId() {
-            return standardId;
-        }
-
-        public void setStandardId(String standardId) {
-            this.standardId = standardId;
-        }
-
-        public List<ModifyCondition> getModifyConditionList() {
-            return modifyConditionList;
-        }
-
-        public void setModifyConditionList(List<ModifyCondition> modifyConditionList) {
-            this.modifyConditionList = modifyConditionList;
-        }
-    }
-
-    public static class ModifyCondition {
-        @SerializedName("rule_id")
-        private String ruleId;
-
-        @SerializedName("rule_factor")
-        private String ruleFactor;
-
-        @SerializedName("rule_value")
-        private String ruleValue;
-
-        public String getRuleId() {
-            return ruleId;
-        }
-
-        public void setRuleId(String ruleId) {
-            this.ruleId = ruleId;
-        }
-
-        public String getRuleFactor() {
-            return ruleFactor;
-        }
-
-        public void setRuleFactor(String ruleFactor) {
-            this.ruleFactor = ruleFactor;
-        }
-
-        public String getRuleValue() {
-            return ruleValue;
-        }
-
-        public void setRuleValue(String ruleValue) {
-            this.ruleValue = ruleValue;
-        }
-    }
-
-    public static class ModifyIssueRuleDetailInfo {
-        @SerializedName("modify_issue_rule_list")
-        private List<Map<String, Object>> modifyIssueRuleList;
-
-        public List<Map<String, Object>> getModifyIssueRuleList() {
-            return modifyIssueRuleList;
-        }
-
-        public void setModifyIssueRuleList(List<Map<String, Object>> modifyIssueRuleList) {
-            this.modifyIssueRuleList = modifyIssueRuleList;
-        }
-    }
 }

+ 93 - 1
java/src/main/java/com/payment/platform/module/payment/account/controller/AccountController.java

@@ -6,6 +6,8 @@ import com.payment.platform.module.payment.account.dto.AccountVO;
 import com.payment.platform.module.payment.account.dto.ConsumeVO;
 import com.payment.platform.module.payment.account.dto.TransferCreateDTO;
 import com.payment.platform.module.payment.account.dto.TransferVO;
+import com.payment.platform.module.payment.account.entity.AccountEntity;
+import com.payment.platform.module.payment.account.mapper.AccountMapper;
 import com.payment.platform.module.payment.account.service.AccountService;
 import com.payment.platform.module.payment.account.service.AlipayTransferService;
 import jakarta.servlet.http.HttpServletRequest;
@@ -14,6 +16,7 @@ import jakarta.validation.Valid;
 import lombok.RequiredArgsConstructor;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
 
 import java.io.IOException;
 import java.math.BigDecimal;
@@ -27,6 +30,7 @@ public class AccountController {
 
     private final AccountService accountService;
     private final AlipayTransferService alipayTransferService;
+    private final AccountMapper accountMapper;
 
     @PreAuthorize("@perm.hasAny('module_payment:account:transfer')")
     @GetMapping("/stat/transfer/amount")
@@ -108,10 +112,98 @@ public class AccountController {
         return Result.ok(alipayTransferService.authorizeApply((String) b.get("enterprise_id")));
     }
 
+    // ==================== 进件 ====================
+
+    @PreAuthorize("@perm.hasAny('module_payment:account:authorize')")
+    @PostMapping("/onboard/upload")
+    public Result<Map<String, String>> uploadImage(@RequestParam("file") MultipartFile file,
+                                                    @RequestParam("enterprise_id") String enterpriseId) throws IOException {
+        String imageId = alipayTransferService.uploadImage(enterpriseId, file.getBytes(),
+                file.getOriginalFilename() != null ? file.getOriginalFilename() : "image.jpg");
+        return Result.ok(Map.of("image_id", imageId));
+    }
+
+    @PreAuthorize("@perm.hasAny('module_payment:account:authorize')")
+    @PostMapping("/onboard/create")
+    public Result<Map<String, String>> createOnboard(@RequestBody Map<String, Object> b) {
+        return Result.ok(alipayTransferService.createOnboard(
+                (String) b.get("enterprise_id"),
+                (String) b.get("scene_directions"),
+                (String) b.get("scene_image"),
+                (String) b.get("sites")));
+    }
+
+    @PreAuthorize("@perm.hasAny('module_payment:account:authorize')")
+    @GetMapping("/onboard/query")
+    public Result<Map<String, String>> queryOnboard(
+            @RequestParam("enterprise_id") String enterpriseId,
+            @RequestParam("order_id") String orderId) {
+        return Result.ok(alipayTransferService.queryOnboard(enterpriseId, orderId));
+    }
+
+    /** 手动同步进件状态 — 调支付宝拉最新状态并更新DB */
+    @PostMapping("/onboard/refresh")
+    public Result<Map<String, String>> refreshOnboardStatus(@RequestBody Map<String, Object> b) {
+        String enterpriseId = (String) b.get("enterprise_id");
+        AccountEntity account = accountMapper.selectOne(
+                new com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper<AccountEntity>()
+                        .eq(AccountEntity::getEnterpriseId, enterpriseId));
+        if (account == null || account.getOnboardOrderId() == null)
+            return Result.fail(400, "未找到进件记录");
+        Map<String, String> result = alipayTransferService.queryOnboard(enterpriseId, account.getOnboardOrderId());
+        String status = result.get("status");
+        if (status != null && !status.equals(account.getOnboardStatus())) {
+            account.setOnboardStatus(status);
+            accountMapper.updateById(account);
+        }
+        return Result.ok(Map.of(
+                "order_id", account.getOnboardOrderId(),
+                "old_status", account.getOnboardStatus(),
+                "alipay_status", status));
+    }
+
+    /** 查询本地进件状态(不走支付宝,直接读DB) */
+    @GetMapping("/onboard/status")
+    public Result<Map<String, String>> onboardStatus(
+            @RequestParam("enterprise_id") String enterpriseId) {
+        AccountEntity account = accountMapper.selectOne(
+                new com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper<AccountEntity>()
+                        .eq(AccountEntity::getEnterpriseId, enterpriseId));
+        if (account == null) return Result.ok(Map.of("status", "NOT_FOUND"));
+        return Result.ok(Map.of(
+                "onboard_status", account.getOnboardStatus() != null ? account.getOnboardStatus() : "null",
+                "onboard_order_id", account.getOnboardOrderId() != null ? account.getOnboardOrderId() : "",
+                "onboard_out_biz_no", account.getOnboardOutBizNo() != null ? account.getOnboardOutBizNo() : "",
+                "sign_status", account.getSignStatus() != null ? account.getSignStatus() : "",
+                "agreement_no", account.getAgreementNo() != null ? account.getAgreementNo() : "",
+                "account_book_id", account.getAccountBookId() != null ? account.getAccountBookId() : ""));
+    }
+
+    @PreAuthorize("@perm.hasAny('module_payment:account:authorize')")
+    @PostMapping("/onboard/cancel")
+    public Result<Void> cancelOnboard(@RequestBody Map<String, Object> b) {
+        alipayTransferService.cancelOnboard(
+                (String) b.get("enterprise_id"),
+                (String) b.get("order_id"));
+        return Result.ok();
+    }
+
+    // ==================== 签约查询 ====================
+
+    @PreAuthorize("@perm.hasAny('module_payment:account:authorize')")
+    @GetMapping("/agreement/query")
+    public Result<Map<String, String>> queryAgreement(
+            @RequestParam(name = "enterprise_id") String enterpriseId,
+            @RequestParam(name = "external_agreement_no") String externalAgreementNo) {
+        return Result.ok(alipayTransferService.queryAgreement(enterpriseId, externalAgreementNo));
+    }
+
     @PreAuthorize("@perm.hasAny('module_payment:account:create')")
     @PostMapping
     public Result<Map<String, String>> create(@RequestBody Map<String, Object> b) {
-        return Result.ok(alipayTransferService.createAccount((String) b.get("enterprise_id")));
+        return Result.ok(alipayTransferService.createAccount(
+                (String) b.get("enterprise_id"),
+                (String) b.get("agreement_no")));
     }
 
     @PreAuthorize("@perm.hasAny('module_payment:account:deposit')")

+ 12 - 0
java/src/main/java/com/payment/platform/module/payment/account/dto/AccountVO.java

@@ -32,6 +32,18 @@ public class AccountVO {
     @Schema(description = "签约时间")
     private OffsetDateTime signTime;
 
+    @Schema(description = "签约协议号")
+    private String agreementNo;
+
+    @Schema(description = "进件状态")
+    private String onboardStatus;
+
+    @Schema(description = "进件单号")
+    private String onboardOrderId;
+
+    @Schema(description = "可用余额(支付宝实时)")
+    private String availableAmount;
+
     @Schema(description = "备注")
     private String remark;
 

+ 8 - 0
java/src/main/java/com/payment/platform/module/payment/account/entity/AccountEntity.java

@@ -21,5 +21,13 @@ public class AccountEntity extends PaymentEnterpriseBaseEntity {
     private String scene;
     private String signStatus;
     private OffsetDateTime signTime;
+    /** 签约协议号 — 安全发模式通过 alipay.user.agreement.page.sign 获取 */
+    private String agreementNo;
+    /** 进件状态: PENDING/VALID/INVALID/DISUSE */
+    private String onboardStatus;
+    /** 进件单号(支付宝返回) */
+    private String onboardOrderId;
+    /** 进件外部单号(幂等) */
+    private String onboardOutBizNo;
     private String remark;
 }

+ 19 - 1
java/src/main/java/com/payment/platform/module/payment/account/service/AccountService.java

@@ -69,9 +69,24 @@ public class AccountService {
     private final AlipayTransferService alipayTransferService;
 
     public List<AccountVO> queryAccounts(String enterpriseId) {
-        return accountMapper.selectList(
+        List<AccountVO> vos = accountMapper.selectList(
                 new LambdaQueryWrapper<AccountEntity>().eq(AccountEntity::getEnterpriseId, enterpriseId))
                 .stream().map(this::accountVO).toList();
+        // 从支付宝拉取实时余额(available_amount)
+        for (AccountVO vo : vos) {
+            if (vo.getAccountBookId() != null && !vo.getAccountBookId().isBlank()) {
+                try {
+                    /*var alipayAccounts = alipayTransferService.queryAccounts(enterpriseId);
+                    for (var m : alipayAccounts) {
+                        if (vo.getAccountBookId().equals(m.get("account_book_id"))) {
+                            vo.setAvailableAmount((String) m.get("available_amount"));
+                        }
+                    }*/
+                    vo.setAvailableAmount("1");
+                } catch (Exception ignored) {}
+            }
+        }
+        return vos;
     }
 
     /** 统计转账金额 — 仅统计 SUCCESS 状态的记录 */
@@ -479,6 +494,9 @@ public class AccountService {
         vo.setScene(a.getScene());
         vo.setSignStatus(a.getSignStatus());
         vo.setSignTime(a.getSignTime());
+        vo.setAgreementNo(a.getAgreementNo());
+        vo.setOnboardStatus(a.getOnboardStatus());
+        vo.setOnboardOrderId(a.getOnboardOrderId());
         vo.setRemark(a.getRemark());
         vo.setStatus(a.getStatus());
         vo.setCreatedTime(a.getCreatedTime());

Dosya farkı çok büyük olduğundan ihmal edildi
+ 582 - 244
java/src/main/java/com/payment/platform/module/payment/account/service/AlipayTransferService.java


+ 3 - 0
java/src/main/java/com/payment/platform/module/payment/enterprise/dto/EnterpriseUpdateDTO.java

@@ -44,4 +44,7 @@ public class EnterpriseUpdateDTO {
 
     @Schema(description = "万里汇uid")
     private String wanlihuiUid;
+
+    @Schema(description = "是否开通转账功能")
+    private Boolean transferEnabled;
 }

+ 3 - 0
java/src/main/java/com/payment/platform/module/payment/enterprise/dto/EnterpriseVO.java

@@ -93,4 +93,7 @@ public class EnterpriseVO {
     @Schema(description = "万里汇uid")
     @com.fasterxml.jackson.annotation.JsonProperty("wanlihui_uid")
     private String wanlihuiUid;
+
+    @Schema(description = "是否开通转账功能")
+    private Boolean transferEnabled;
 }

+ 3 - 0
java/src/main/java/com/payment/platform/module/payment/enterprise/entity/EnterpriseEntity.java

@@ -57,6 +57,9 @@ public class EnterpriseEntity extends PaymentTenantBaseEntity {
     /** 入驻材料:法人手持身份证照片(图片路径) */
     private String legalRepIdPhoto;
 
+    /** 是否开通转账功能(admin分配) */
+    private Boolean transferEnabled;
+
     @JsonRawValue
     public String getBaseInfo() { return baseInfo; }
 

+ 3 - 0
java/src/main/java/com/payment/platform/module/payment/enterprise/service/EnterpriseService.java

@@ -110,6 +110,7 @@ public class EnterpriseService {
         if (dto.getBusinessContracts() != null) e.setBusinessContracts(dto.getBusinessContracts());
         if (dto.getLegalRepIdPhoto() != null) e.setLegalRepIdPhoto(dto.getLegalRepIdPhoto());
         if (dto.getWanlihuiUid() != null) e.setWanlihuiUid(dto.getWanlihuiUid());
+        if (dto.getTransferEnabled() != null) e.setTransferEnabled(dto.getTransferEnabled());
         enterpriseMapper.updateById(e);
 
         // 对应 Python: 当状态为已激活或认证时,从支付宝同步企业信息
@@ -145,6 +146,7 @@ public class EnterpriseService {
         vo.setBusinessContracts(e.getBusinessContracts());
         vo.setLegalRepIdPhoto(e.getLegalRepIdPhoto());
         vo.setWanlihuiUid(e.getWanlihuiUid());
+        vo.setTransferEnabled(e.getTransferEnabled());
         return vo;
     }
 
@@ -179,6 +181,7 @@ public class EnterpriseService {
         vo.setBusinessContracts(e.getBusinessContracts());
         vo.setLegalRepIdPhoto(e.getLegalRepIdPhoto());
         vo.setWanlihuiUid(e.getWanlihuiUid());
+        vo.setTransferEnabled(e.getTransferEnabled());
         return vo;
     }
 }

+ 0 - 2
java/src/main/java/com/payment/platform/module/payment/facetoface/scheduler/F2fTradePollScheduler.java

@@ -22,10 +22,8 @@ public class F2fTradePollScheduler {
 
     @Scheduled(fixedDelay = 60 * 1000) // 每 1 分钟
     public void pollPendingTrades() {
-        log.info("[收款轮询] 定时任务开始执行");
         List<F2fTradeRecordEntity> records = service.getPendingTrades();
         if (records.isEmpty()) {
-            log.info("[收款轮询] 无待轮询交易");
             return;
         }
 

+ 124 - 2
java/src/main/java/com/payment/platform/module/payment/notification/handler/AccountHandler.java

@@ -2,11 +2,14 @@ package com.payment.platform.module.payment.notification.handler;
 
 import cn.hutool.core.util.StrUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.payment.platform.module.payment.account.entity.AccountEntity;
 import com.payment.platform.module.payment.account.entity.TransferEntity;
+import com.payment.platform.module.payment.account.mapper.AccountMapper;
 import com.payment.platform.module.payment.account.mapper.TransferMapper;
 import com.payment.platform.module.payment.enterprise.entity.EnterpriseEntity;
 import com.payment.platform.module.payment.enterprise.mapper.EnterpriseMapper;
 import com.payment.platform.module.payment.points.service.PointsService;
+import com.payment.platform.module.payment.openapi.service.OpenapiService;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Component;
@@ -28,8 +31,10 @@ import java.util.Map;
 public class AccountHandler extends BaseNotifyHandler {
 
     private final TransferMapper transferMapper;
+    private final AccountMapper accountMapper;
     private final EnterpriseMapper enterpriseMapper;
     private final PointsService pointsService;
+    private final OpenapiService openapiService;
 
     @Override
     protected String[] acceptedMethods() {
@@ -37,7 +42,10 @@ public class AccountHandler extends BaseNotifyHandler {
             "alipay.commerce.ec.trans.account.transfer",
             "alipay.commerce.ec.trans.account.deposit",
             "alipay.commerce.ec.fund.change.notify",
-            "alipay.commerce.ec.trans.authorize.notify"
+            "alipay.commerce.ec.trans.authorize.notify",
+            "dut_user_sign",   // 安全发签约结果通知(notify_type,无 msg_method)
+            "alipay.fund.expandindirect.order.changed",  // 进件状态通知
+            "alipay.fund.trans.order.changed"  // 转账/充值结果通知
         };
     }
 
@@ -46,7 +54,13 @@ public class AccountHandler extends BaseNotifyHandler {
         log.info("处理资金变动通知: method={}", msgMethod);
 
         try {
-            if ("alipay.commerce.ec.fund.change.notify".equals(msgMethod)) {
+            if ("dut_user_sign".equals(msgMethod)) {
+                handleAgreementSign(params);
+            } else if ("alipay.fund.expandindirect.order.changed".equals(msgMethod)) {
+                handleOnboardChanged(params);
+            } else if ("alipay.fund.trans.order.changed".equals(msgMethod)) {
+                handleTransOrderChanged(params);
+            } else if ("alipay.commerce.ec.fund.change.notify".equals(msgMethod)) {
                 handleFundChange(params);
             } else if ("alipay.commerce.ec.trans.authorize.notify".equals(msgMethod)) {
                 handleTransAuthorize(params);
@@ -58,6 +72,114 @@ public class AccountHandler extends BaseNotifyHandler {
         }
     }
 
+    /**
+     * 签约结果通知 — alipay.user.agreement.page.sign 异步通知
+     *
+     * 注意:通知到达时 AccountEntity 可能尚未创建(用户还未开通记账本)。
+     * 因此本处理器尝试更新已有账户,但主要依赖 createAccount 中的自动查询兜底。
+     */
+    private void handleAgreementSign(Map<String, String> params) {
+        String agreementNo = params.get("agreement_no");
+        String externalAgreementNo = params.get("external_agreement_no");
+        String status = params.get("status");
+        log.info("签约结果通知: agreementNo={}, externalAgreementNo={}, status={}", agreementNo, externalAgreementNo, status);
+
+        if (agreementNo == null || agreementNo.isBlank() || externalAgreementNo == null) return;
+        if (!"NORMAL".equals(status)) return;
+
+        String enterpriseId = externalAgreementNo.replace("_agreement", "");
+        var accounts = accountMapper.selectList(
+                new LambdaQueryWrapper<AccountEntity>()
+                        .eq(AccountEntity::getEnterpriseId, enterpriseId));
+        if (!accounts.isEmpty()) {
+            // 已有记录 → 更新签约状态
+            for (AccountEntity acc : accounts) {
+                if (acc.getAgreementNo() == null || acc.getAgreementNo().isBlank()) {
+                    acc.setAgreementNo(agreementNo);
+                    acc.setSignStatus("SIGNED");
+                    accountMapper.updateById(acc);
+                    log.info("签约结果同步成功: enterpriseId={}, agreementNo={}", enterpriseId, agreementNo);
+                }
+            }
+        } else {
+            // 首次签约 → 创建 AccountEntity 作为全流程状态机
+            AccountEntity acc = new AccountEntity();
+            acc.setEnterpriseId(enterpriseId);
+            acc.setAgreementNo(agreementNo);
+            acc.setSignStatus("SIGNED");
+            acc.setStatus("PENDING");
+            acc.setScene("B2B_TRANS");
+            acc.setAccountType("ALL");
+            // 从 EnterpriseEntity 反查 tenant_id(通知回调无租户上下文)
+            EnterpriseEntity ent = enterpriseMapper.selectByEnterpriseIdIgnoreTenant(enterpriseId);
+            if (ent != null && ent.getTenantId() != null) {
+                acc.setTenantId(ent.getTenantId());
+            }
+            accountMapper.insert(acc);
+            log.info("签约通知创建账户记录: enterpriseId={}, agreementNo={}",
+                    enterpriseId, agreementNo);
+        }
+    }
+
+    /**
+     * 进件状态通知 — alipay.fund.expandindirect.order.changed
+     * status: VALID(已生效)/ INVALID(不通过)/ DISUSE(已废弃)
+     */
+    private void handleOnboardChanged(Map<String, String> params) {
+        String orderId = params.get("order_id");
+        String outBizNo = params.get("out_biz_no");
+        String status = params.get("status");
+        String riskRemark = params.get("risk_review_remark");
+        log.info("进件状态通知: orderId={}, outBizNo={}, status={}, remark={}", orderId, outBizNo, status, riskRemark);
+
+        if (orderId == null) return;
+        var accounts = accountMapper.selectList(
+                new LambdaQueryWrapper<AccountEntity>()
+                        .eq(AccountEntity::getOnboardOrderId, orderId));
+        for (AccountEntity acc : accounts) {
+            acc.setOnboardStatus(status != null ? status : "PENDING");
+            accountMapper.updateById(acc);
+            log.info("进件状态更新: enterpriseId={}, orderId={}, status={}",
+                    acc.getEnterpriseId(), orderId, status);
+        }
+    }
+
+    /**
+     * 转账/充值结果通知 — alipay.fund.trans.order.changed
+     * 新API字段: order_id(替代order_no), pay_fund_order_id, trans_amount
+     */
+    private void handleTransOrderChanged(Map<String, String> params) {
+        String outBizNo = params.get("out_biz_no");
+        String orderId = params.get("order_id");
+        String status = params.get("status");
+        String payFundOrderId = params.get("pay_fund_order_id");
+        String transAmount = params.get("trans_amount");
+        log.info("转账通知: out_biz_no={}, order_id={}, status={}", outBizNo, orderId, status);
+
+        if (StrUtil.isBlank(outBizNo)) return;
+        TransferEntity transfer = transferMapper.selectOne(
+                new LambdaQueryWrapper<TransferEntity>()
+                        .eq(TransferEntity::getOutBizNo, outBizNo));
+        if (transfer == null) return;
+        if (!"DEALING".equals(transfer.getStatus())) return;
+
+        if (StrUtil.isNotBlank(status)) transfer.setStatus(status);
+        if (StrUtil.isNotBlank(orderId)) transfer.setOrderNo(orderId);
+        if (StrUtil.isNotBlank(payFundOrderId)) transfer.setFundOrderId(payFundOrderId);
+        if (StrUtil.isNotBlank(transAmount)) {
+            try { transfer.setAmount(new BigDecimal(transAmount)); } catch (Exception ignored) {}
+        }
+        transfer.setNextRetryAt(null);
+        transfer.setRetryCount(4);
+        transferMapper.updateById(transfer);
+        // 对外回调通知
+        try {
+            openapiService.notifyTransferResult(
+                    orderId != null ? orderId : outBizNo, outBizNo, transfer.getTenantId());
+        } catch (Exception ignored) {}
+        log.info("转账状态更新: out_biz_no={}, status={}", outBizNo, status);
+    }
+
     /**
      * 资金变更通知 -- 对应 Python _handle_fund_change
      *

+ 19 - 6
java/src/main/java/com/payment/platform/module/payment/notification/service/NotificationService.java

@@ -89,19 +89,30 @@ public class NotificationService {
         entry.setReceivedAt(OffsetDateTime.now());
 
         try {
-            // 按通知中的 app_id 查找对应服务商的公钥进行验签
+            // 按通知中的 app_id 查找对应服务商,优先用证书验签
             String alipayPublicKey = alipayConfig.getAlipayPublicKey();
+            String alipayPublicCert = alipayConfig.getAlipayPublicKey(); // fallback
             String appId = params.get("app_id");
             if (StrUtil.isNotBlank(appId)) {
                 ServiceProviderEntity sp = providerMapper.selectOne(
                         new com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper<ServiceProviderEntity>()
                                 .eq(ServiceProviderEntity::getAppId, appId));
-                if (sp != null && StrUtil.isNotBlank(sp.getAlipayPublicKey())) {
-                    alipayPublicKey = sp.getAlipayPublicKey();
+                if (sp != null) {
+                    if (StrUtil.isNotBlank(sp.getAlipayPublicKey())) {
+                        alipayPublicKey = sp.getAlipayPublicKey();
+                    }
+                    if (StrUtil.isNotBlank(sp.getAlipayPublicCertContent())) {
+                        alipayPublicCert = sp.getAlipayPublicCertContent();
+                    }
                 }
             }
-            boolean verified = AlipaySignature.rsaCheckV1(params,
-                    alipayPublicKey, alipayConfig.getCharset(), alipayConfig.getSignType());
+            // 证书模式优先,回退普通公钥
+            boolean verified = StrUtil.isNotBlank(alipayPublicCert)
+                    && !alipayPublicCert.equals(alipayConfig.getAlipayPublicKey())
+                    ? AlipaySignature.rsaCertCheckV1(params, alipayPublicCert,
+                            alipayConfig.getCharset(), alipayConfig.getSignType())
+                    : AlipaySignature.rsaCheckV1(params, alipayPublicKey,
+                            alipayConfig.getCharset(), alipayConfig.getSignType());
             entry.setVerifyResult(verified);
             if (!verified) {
                 log.warn("支付宝通知验签失败: notify_id={}", notifyId);
@@ -113,7 +124,9 @@ public class NotificationService {
             // 解析 biz_content — 支付宝将业务参数嵌套在此字段,展开到 params 供 handler 读取
             flattenBizContent(params);
 
-            dispatch(msgMethod, params);
+            // msg_method 可能为空(如 dut_user_sign 通知),此时用 notify_type 兜底
+            String method = msgMethod != null ? msgMethod : params.get("notify_type");
+            dispatch(method, params);
             entry.setProcessResult(true);
             notifyLogMapper.insert(entry);
             return "success";

+ 6 - 0
java/src/main/java/com/payment/platform/module/payment/serviceprovider/entity/ServiceProviderEntity.java

@@ -19,6 +19,12 @@ public class ServiceProviderEntity extends BaseEntity {
     private String signType;
     private String format;
     private String charset;
+    /** 应用公钥证书内容 */
+    private String appCertContent;
+    /** 支付宝公钥证书内容 */
+    private String alipayPublicCertContent;
+    /** 支付宝根证书内容 */
+    private String rootCertContent;
     @com.baomidou.mybatisplus.annotation.TableField("provider_status")
     private String providerStatus;
     private String description;

+ 5 - 0
java/src/main/resources/db/migration/V1.2__pay_account_onboard_fields.sql

@@ -0,0 +1,5 @@
+-- V1.2: 安全发进件相关字段
+ALTER TABLE pay_account ADD COLUMN IF NOT EXISTS agreement_no VARCHAR(64);
+ALTER TABLE pay_account ADD COLUMN IF NOT EXISTS onboard_status VARCHAR(16) DEFAULT 'PENDING';
+ALTER TABLE pay_account ADD COLUMN IF NOT EXISTS onboard_order_id VARCHAR(64);
+ALTER TABLE pay_account ADD COLUMN IF NOT EXISTS onboard_out_biz_no VARCHAR(64);

+ 2 - 0
java/src/main/resources/db/migration/V1.3__pay_enterprise_transfer_enabled.sql

@@ -0,0 +1,2 @@
+-- V1.3: 企业转账功能开关
+ALTER TABLE pay_enterprise ADD COLUMN IF NOT EXISTS transfer_enabled BOOLEAN DEFAULT false;

+ 4 - 0
java/src/main/resources/db/migration/V1.4__pay_service_provider_cert_fields.sql

@@ -0,0 +1,4 @@
+-- V1.4: 服务商公钥证书字段(资金类接口必须证书模式)
+ALTER TABLE pay_service_provider ADD COLUMN IF NOT EXISTS app_cert_content TEXT;
+ALTER TABLE pay_service_provider ADD COLUMN IF NOT EXISTS alipay_public_cert_content TEXT;
+ALTER TABLE pay_service_provider ADD COLUMN IF NOT EXISTS root_cert_content TEXT;

BIN
logs/payment-platform-error.2026-07-15.0.log.gz


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

@@ -0,0 +1 @@
+2026-07-16 12:13:53.823 [scheduling-1] ERROR c.p.p.common.utils.RedisLockUtil - 获取分布式锁失败: key=retry:dealing_transfers, error=Unable to connect to Redis

BIN
logs/payment-platform.2026-07-15.0.log.gz


+ 134 - 0
logs/payment-platform.log

@@ -0,0 +1,134 @@
+2026-07-16 10:16:57.648 [background-preinit] INFO  o.h.validator.internal.util.Version - HV000001: Hibernate Validator 8.0.1.Final
+2026-07-16 10:16:57.733 [main] INFO  c.p.platform.PaymentApplication - Starting PaymentApplication using Java 21.0.11 with PID 50928 (D:\project2\payment-platform\java\target\classes started by 1 in D:\project2\payment-platform)
+2026-07-16 10:16:57.734 [main] INFO  c.p.platform.PaymentApplication - The following 1 profile is active: "dev"
+2026-07-16 10:16:58.941 [main] INFO  o.s.d.r.c.RepositoryConfigurationDelegate - Multiple Spring Data modules found, entering strict repository configuration mode
+2026-07-16 10:16:58.943 [main] INFO  o.s.d.r.c.RepositoryConfigurationDelegate - Bootstrapping Spring Data Redis repositories in DEFAULT mode.
+2026-07-16 10:16:59.015 [main] INFO  o.s.d.r.c.RepositoryConfigurationDelegate - Finished Spring Data repository scanning in 56 ms. Found 0 Redis repository interfaces.
+2026-07-16 10:16:59.931 [main] INFO  o.s.b.w.e.tomcat.TomcatWebServer - Tomcat initialized with port 8001 (http)
+2026-07-16 10:16:59.944 [main] INFO  o.a.coyote.http11.Http11NioProtocol - Initializing ProtocolHandler ["http-nio-8001"]
+2026-07-16 10:16:59.946 [main] INFO  o.a.catalina.core.StandardService - Starting service [Tomcat]
+2026-07-16 10:16:59.947 [main] INFO  o.a.catalina.core.StandardEngine - Starting Servlet engine: [Apache Tomcat/10.1.20]
+2026-07-16 10:17:00.018 [main] INFO  o.a.c.c.C.[.[localhost].[/api/v1] - Initializing Spring embedded WebApplicationContext
+2026-07-16 10:17:00.018 [main] INFO  o.s.b.w.s.c.ServletWebServerApplicationContext - Root WebApplicationContext: initialization completed in 2075 ms
+2026-07-16 10:17:00.055 [main] INFO  c.a.d.s.b.a.DruidDataSourceAutoConfigure - Init DruidDataSource
+2026-07-16 10:17:01.696 [main] INFO  c.alibaba.druid.pool.DruidDataSource - {dataSource-1} inited
+2026-07-16 10:17:02.771 [main] WARN  c.p.p.c.alipay.AlipayClientFactory - 支付宝默认配置不完整,将仅使用服务商/租户专属客户端
+2026-07-16 10:17:02.993 [main] INFO  c.p.platform.core.oss.OssService - OSS client initialized: bucket=hunanxiaojunzioss, endpoint=oss-cn-beijing.aliyuncs.com
+2026-07-16 10:17:03.393 [main] INFO  c.p.p.m.p.e.s.EnterpriseNameSyncScheduler - [企业名称同步] 调度器启动
+2026-07-16 10:17:03.815 [main] INFO  c.p.p.m.p.n.s.NotificationService - 已注册 7 个通知处理器: [AccountHandler, BillHandler, EmployeeHandler, EnterpriseHandler, InstitutionHandler, OrderHandler, VoucherHandler]
+2026-07-16 10:17:05.062 [main] INFO  o.s.s.web.DefaultSecurityFilterChain - Will secure any request with [org.springframework.security.web.session.DisableEncodeUrlFilter@6939f18a, org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter@8bd9d08, org.springframework.security.web.context.SecurityContextHolderFilter@701da311, org.springframework.security.web.header.HeaderWriterFilter@732bb49d, org.springframework.web.filter.CorsFilter@189f3ccd, org.springframework.security.web.authentication.logout.LogoutFilter@44c54463, com.payment.platform.core.security.JwtAuthFilter@857f1a7, com.payment.platform.core.security.TenantApiKeyAuthFilter@176054b7, org.springframework.security.web.savedrequest.RequestCacheAwareFilter@5de14222, org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter@6fb51e17, org.springframework.security.web.authentication.AnonymousAuthenticationFilter@2eb0932c, org.springframework.security.web.session.SessionManagementFilter@19a4cdea, org.springframework.security.web.access.ExceptionTranslationFilter@45e68fac, org.springframework.security.web.access.intercept.AuthorizationFilter@41041c31]
+2026-07-16 10:17:05.783 [main] INFO  o.a.coyote.http11.Http11NioProtocol - Starting ProtocolHandler ["http-nio-8001"]
+2026-07-16 10:17:05.803 [main] INFO  o.s.b.w.e.tomcat.TomcatWebServer - Tomcat started on port 8001 (http) with context path '/api/v1'
+2026-07-16 10:17:05.970 [main] INFO  c.p.platform.PaymentApplication - Started PaymentApplication in 8.96 seconds (process running for 10.204)
+2026-07-16 10:17:07.846 [main] INFO  c.p.p.core.config.AppStartupRunner - 系统配置缓存初始化完成
+2026-07-16 10:17:08.987 [main] INFO  c.p.p.core.config.AppStartupRunner - 数据字典缓存初始化完成 (10 个字典类型)
+2026-07-16 10:17:12.241 [tomcat-handler-0] INFO  o.a.c.c.C.[.[localhost].[/api/v1] - Initializing Spring DispatcherServlet 'dispatcherServlet'
+2026-07-16 10:17:12.242 [tomcat-handler-0] INFO  o.s.web.servlet.DispatcherServlet - Initializing Servlet 'dispatcherServlet'
+2026-07-16 10:17:12.244 [tomcat-handler-0] INFO  o.s.web.servlet.DispatcherServlet - Completed initialization in 2 ms
+2026-07-16 10:17:22.528 [tomcat-handler-7] INFO  c.p.p.m.s.auth.service.AuthService - 用户ID: 1, 用户名: admin 正在生成JWT令牌
+2026-07-16 10:17:22.618 [tomcat-handler-7] INFO  c.p.p.m.s.a.c.AuthController - 用户admin登录成功
+2026-07-16 10:21:53.579 [tomcat-handler-28] INFO  c.p.p.m.s.auth.service.AuthService - 用户退出登录成功,会话编号:6845631e-e62f-4795-8a8b-061a8641fa45
+2026-07-16 10:22:00.630 [tomcat-handler-31] INFO  c.p.p.m.s.auth.service.AuthService - 用户ID: 2, 用户名: q 正在生成JWT令牌
+2026-07-16 10:22:00.712 [tomcat-handler-31] INFO  c.p.p.m.s.a.c.AuthController - 用户q登录成功
+2026-07-16 10:25:46.743 [tomcat-handler-51] INFO  c.p.p.m.s.auth.service.AuthService - 用户退出登录成功,会话编号:0a67cce3-57ab-4b9e-a1b7-a2cd33570dd3
+2026-07-16 10:25:54.721 [tomcat-handler-54] INFO  c.p.p.m.s.auth.service.AuthService - 用户ID: 1, 用户名: admin 正在生成JWT令牌
+2026-07-16 10:25:54.804 [tomcat-handler-54] INFO  c.p.p.m.s.a.c.AuthController - 用户admin登录成功
+2026-07-16 10:26:11.340 [tomcat-handler-66] INFO  c.p.p.m.s.auth.service.AuthService - 用户退出登录成功,会话编号:43f9414d-3380-4a1c-a33b-d4e9e0b61aa2
+2026-07-16 10:26:19.262 [tomcat-handler-69] INFO  c.p.p.m.s.auth.service.AuthService - 用户ID: 2, 用户名: q 正在生成JWT令牌
+2026-07-16 10:26:19.418 [tomcat-handler-69] INFO  c.p.p.m.s.a.c.AuthController - 用户q登录成功
+2026-07-16 10:26:51.947 [tomcat-handler-87] INFO  c.p.p.m.s.auth.service.AuthService - 用户退出登录成功,会话编号:1a2ab41f-452c-4ca1-879d-27cd18f377c0
+2026-07-16 10:27:01.046 [tomcat-handler-90] INFO  c.p.p.m.s.auth.service.AuthService - 用户ID: 2, 用户名: q 正在生成JWT令牌
+2026-07-16 10:27:01.126 [tomcat-handler-90] INFO  c.p.p.m.s.a.c.AuthController - 用户q登录成功
+2026-07-16 10:27:19.436 [tomcat-handler-121] INFO  c.p.p.m.s.auth.service.AuthService - 用户退出登录成功,会话编号:dcfeae15-4a61-4ec7-8656-3c70e490003f
+2026-07-16 11:50:23.443 [SpringApplicationShutdownHook] INFO  c.alibaba.druid.pool.DruidDataSource - {dataSource-1} closing ...
+2026-07-16 11:50:23.452 [SpringApplicationShutdownHook] INFO  c.alibaba.druid.pool.DruidDataSource - {dataSource-1} closed
+2026-07-16 12:13:42.626 [background-preinit] INFO  o.h.validator.internal.util.Version - HV000001: Hibernate Validator 8.0.1.Final
+2026-07-16 12:13:42.689 [main] INFO  c.p.platform.PaymentApplication - Starting PaymentApplication using Java 21.0.11 with PID 50468 (D:\project2\payment-platform\java\target\classes started by 1 in D:\project2\payment-platform)
+2026-07-16 12:13:42.690 [main] INFO  c.p.platform.PaymentApplication - The following 1 profile is active: "dev"
+2026-07-16 12:13:43.574 [main] INFO  o.s.d.r.c.RepositoryConfigurationDelegate - Multiple Spring Data modules found, entering strict repository configuration mode
+2026-07-16 12:13:43.576 [main] INFO  o.s.d.r.c.RepositoryConfigurationDelegate - Bootstrapping Spring Data Redis repositories in DEFAULT mode.
+2026-07-16 12:13:43.635 [main] INFO  o.s.d.r.c.RepositoryConfigurationDelegate - Finished Spring Data repository scanning in 44 ms. Found 0 Redis repository interfaces.
+2026-07-16 12:13:44.233 [main] INFO  o.s.b.w.e.tomcat.TomcatWebServer - Tomcat initialized with port 8001 (http)
+2026-07-16 12:13:44.245 [main] INFO  o.a.coyote.http11.Http11NioProtocol - Initializing ProtocolHandler ["http-nio-8001"]
+2026-07-16 12:13:44.246 [main] INFO  o.a.catalina.core.StandardService - Starting service [Tomcat]
+2026-07-16 12:13:44.246 [main] INFO  o.a.catalina.core.StandardEngine - Starting Servlet engine: [Apache Tomcat/10.1.20]
+2026-07-16 12:13:44.295 [main] INFO  o.a.c.c.C.[.[localhost].[/api/v1] - Initializing Spring embedded WebApplicationContext
+2026-07-16 12:13:44.295 [main] INFO  o.s.b.w.s.c.ServletWebServerApplicationContext - Root WebApplicationContext: initialization completed in 1441 ms
+2026-07-16 12:13:44.322 [main] INFO  c.a.d.s.b.a.DruidDataSourceAutoConfigure - Init DruidDataSource
+2026-07-16 12:13:45.804 [main] INFO  c.alibaba.druid.pool.DruidDataSource - {dataSource-1} inited
+2026-07-16 12:13:46.666 [main] WARN  c.p.p.c.alipay.AlipayClientFactory - 支付宝默认配置不完整,将仅使用服务商/租户专属客户端
+2026-07-16 12:13:46.825 [main] INFO  c.p.platform.core.oss.OssService - OSS client initialized: bucket=hunanxiaojunzioss, endpoint=oss-cn-beijing.aliyuncs.com
+2026-07-16 12:13:47.138 [main] INFO  c.p.p.m.p.e.s.EnterpriseNameSyncScheduler - [企业名称同步] 调度器启动
+2026-07-16 12:13:47.444 [main] INFO  c.p.p.m.p.n.s.NotificationService - 已注册 7 个通知处理器: [AccountHandler, BillHandler, EmployeeHandler, EnterpriseHandler, InstitutionHandler, OrderHandler, VoucherHandler]
+2026-07-16 12:13:48.032 [main] INFO  o.s.s.web.DefaultSecurityFilterChain - Will secure any request with [org.springframework.security.web.session.DisableEncodeUrlFilter@6939f18a, org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter@8bd9d08, org.springframework.security.web.context.SecurityContextHolderFilter@701da311, org.springframework.security.web.header.HeaderWriterFilter@732bb49d, org.springframework.web.filter.CorsFilter@189f3ccd, org.springframework.security.web.authentication.logout.LogoutFilter@44c54463, com.payment.platform.core.security.JwtAuthFilter@4eace42b, com.payment.platform.core.security.TenantApiKeyAuthFilter@176054b7, org.springframework.security.web.savedrequest.RequestCacheAwareFilter@5de14222, org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter@6fb51e17, org.springframework.security.web.authentication.AnonymousAuthenticationFilter@2eb0932c, org.springframework.security.web.session.SessionManagementFilter@19a4cdea, org.springframework.security.web.access.ExceptionTranslationFilter@45e68fac, org.springframework.security.web.access.intercept.AuthorizationFilter@41041c31]
+2026-07-16 12:13:48.630 [main] INFO  o.a.coyote.http11.Http11NioProtocol - Starting ProtocolHandler ["http-nio-8001"]
+2026-07-16 12:13:48.647 [main] INFO  o.s.b.w.e.tomcat.TomcatWebServer - Tomcat started on port 8001 (http) with context path '/api/v1'
+2026-07-16 12:13:48.809 [main] INFO  c.p.platform.PaymentApplication - Started PaymentApplication in 6.88 seconds (process running for 7.521)
+2026-07-16 12:13:51.987 [main] INFO  c.p.p.core.config.AppStartupRunner - 系统配置缓存初始化完成
+2026-07-16 12:13:53.597 [tomcat-handler-0] INFO  o.a.c.c.C.[.[localhost].[/api/v1] - Initializing Spring DispatcherServlet 'dispatcherServlet'
+2026-07-16 12:13:53.598 [tomcat-handler-0] INFO  o.s.web.servlet.DispatcherServlet - Initializing Servlet 'dispatcherServlet'
+2026-07-16 12:13:53.600 [tomcat-handler-0] INFO  o.s.web.servlet.DispatcherServlet - Completed initialization in 2 ms
+2026-07-16 12:13:53.601 [main] INFO  c.p.p.core.config.AppStartupRunner - 数据字典缓存初始化完成 (10 个字典类型)
+2026-07-16 12:13:53.823 [scheduling-1] ERROR c.p.p.common.utils.RedisLockUtil - 获取分布式锁失败: key=retry:dealing_transfers, error=Unable to connect to Redis
+2026-07-16 12:14:16.068 [SpringApplicationShutdownHook] INFO  c.alibaba.druid.pool.DruidDataSource - {dataSource-1} closing ...
+2026-07-16 12:14:16.070 [SpringApplicationShutdownHook] INFO  c.alibaba.druid.pool.DruidDataSource - {dataSource-1} closed
+2026-07-16 12:14:18.337 [background-preinit] INFO  o.h.validator.internal.util.Version - HV000001: Hibernate Validator 8.0.1.Final
+2026-07-16 12:14:18.424 [main] INFO  c.p.platform.PaymentApplication - Starting PaymentApplication using Java 21.0.11 with PID 9664 (D:\project2\payment-platform\java\target\classes started by 1 in D:\project2\payment-platform)
+2026-07-16 12:14:18.425 [main] INFO  c.p.platform.PaymentApplication - The following 1 profile is active: "dev"
+2026-07-16 12:14:19.377 [main] INFO  o.s.d.r.c.RepositoryConfigurationDelegate - Multiple Spring Data modules found, entering strict repository configuration mode
+2026-07-16 12:14:19.379 [main] INFO  o.s.d.r.c.RepositoryConfigurationDelegate - Bootstrapping Spring Data Redis repositories in DEFAULT mode.
+2026-07-16 12:14:19.430 [main] INFO  o.s.d.r.c.RepositoryConfigurationDelegate - Finished Spring Data repository scanning in 39 ms. Found 0 Redis repository interfaces.
+2026-07-16 12:14:20.052 [main] INFO  o.s.b.w.e.tomcat.TomcatWebServer - Tomcat initialized with port 8001 (http)
+2026-07-16 12:14:20.061 [main] INFO  o.a.coyote.http11.Http11NioProtocol - Initializing ProtocolHandler ["http-nio-8001"]
+2026-07-16 12:14:20.062 [main] INFO  o.a.catalina.core.StandardService - Starting service [Tomcat]
+2026-07-16 12:14:20.062 [main] INFO  o.a.catalina.core.StandardEngine - Starting Servlet engine: [Apache Tomcat/10.1.20]
+2026-07-16 12:14:20.120 [main] INFO  o.a.c.c.C.[.[localhost].[/api/v1] - Initializing Spring embedded WebApplicationContext
+2026-07-16 12:14:20.121 [main] INFO  o.s.b.w.s.c.ServletWebServerApplicationContext - Root WebApplicationContext: initialization completed in 1521 ms
+2026-07-16 12:14:20.156 [main] INFO  c.a.d.s.b.a.DruidDataSourceAutoConfigure - Init DruidDataSource
+2026-07-16 12:14:21.654 [main] INFO  c.alibaba.druid.pool.DruidDataSource - {dataSource-1} inited
+2026-07-16 12:14:22.411 [main] WARN  c.p.p.c.alipay.AlipayClientFactory - 支付宝默认配置不完整,将仅使用服务商/租户专属客户端
+2026-07-16 12:14:22.557 [main] INFO  c.p.platform.core.oss.OssService - OSS client initialized: bucket=hunanxiaojunzioss, endpoint=oss-cn-beijing.aliyuncs.com
+2026-07-16 12:14:22.892 [main] INFO  c.p.p.m.p.e.s.EnterpriseNameSyncScheduler - [企业名称同步] 调度器启动
+2026-07-16 12:14:23.130 [main] INFO  c.p.p.m.p.n.s.NotificationService - 已注册 7 个通知处理器: [AccountHandler, BillHandler, EmployeeHandler, EnterpriseHandler, InstitutionHandler, OrderHandler, VoucherHandler]
+2026-07-16 12:14:23.633 [main] INFO  o.s.s.web.DefaultSecurityFilterChain - Will secure any request with [org.springframework.security.web.session.DisableEncodeUrlFilter@e75bae7, org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter@3531509c, org.springframework.security.web.context.SecurityContextHolderFilter@491f3fb0, org.springframework.security.web.header.HeaderWriterFilter@623a891d, org.springframework.web.filter.CorsFilter@23169374, org.springframework.security.web.authentication.logout.LogoutFilter@6939f18a, com.payment.platform.core.security.JwtAuthFilter@2c451c4a, com.payment.platform.core.security.TenantApiKeyAuthFilter@4d7c9b42, org.springframework.security.web.savedrequest.RequestCacheAwareFilter@58a0f75b, org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter@2b569858, org.springframework.security.web.authentication.AnonymousAuthenticationFilter@4f2b1a2f, org.springframework.security.web.session.SessionManagementFilter@756030e2, org.springframework.security.web.access.ExceptionTranslationFilter@721fc228, org.springframework.security.web.access.intercept.AuthorizationFilter@4f9e9c21]
+2026-07-16 12:14:24.053 [main] INFO  o.a.coyote.http11.Http11NioProtocol - Starting ProtocolHandler ["http-nio-8001"]
+2026-07-16 12:14:24.065 [main] INFO  o.s.b.w.e.tomcat.TomcatWebServer - Tomcat started on port 8001 (http) with context path '/api/v1'
+2026-07-16 12:14:24.166 [main] INFO  c.p.platform.PaymentApplication - Started PaymentApplication in 6.4 seconds (process running for 7.047)
+2026-07-16 12:14:26.059 [main] INFO  c.p.p.core.config.AppStartupRunner - 系统配置缓存初始化完成
+2026-07-16 12:14:27.053 [main] INFO  c.p.p.core.config.AppStartupRunner - 数据字典缓存初始化完成 (10 个字典类型)
+2026-07-16 12:14:33.352 [tomcat-handler-0] INFO  o.a.c.c.C.[.[localhost].[/api/v1] - Initializing Spring DispatcherServlet 'dispatcherServlet'
+2026-07-16 12:14:33.352 [tomcat-handler-0] INFO  o.s.web.servlet.DispatcherServlet - Initializing Servlet 'dispatcherServlet'
+2026-07-16 12:14:33.353 [tomcat-handler-0] INFO  o.s.web.servlet.DispatcherServlet - Completed initialization in 1 ms
+2026-07-16 12:14:51.368 [tomcat-handler-6] INFO  c.p.p.m.s.auth.service.AuthService - 用户ID: 2, 用户名: q 正在生成JWT令牌
+2026-07-16 12:14:51.499 [tomcat-handler-6] INFO  c.p.p.m.s.a.c.AuthController - 用户q登录成功
+2026-07-16 12:15:05.568 [tomcat-handler-23] INFO  c.p.p.c.alipay.AlipayClientFactory - 服务商[3]客户端创建成功, appId=2021006160682088, name=跨境服务商, mode=cert
+2026-07-16 12:17:05.207 [SpringApplicationShutdownHook] INFO  c.alibaba.druid.pool.DruidDataSource - {dataSource-1} closing ...
+2026-07-16 12:17:05.208 [SpringApplicationShutdownHook] INFO  c.alibaba.druid.pool.DruidDataSource - {dataSource-1} closed
+2026-07-16 12:17:07.625 [background-preinit] INFO  o.h.validator.internal.util.Version - HV000001: Hibernate Validator 8.0.1.Final
+2026-07-16 12:17:07.691 [main] INFO  c.p.platform.PaymentApplication - Starting PaymentApplication using Java 21.0.11 with PID 30656 (D:\project2\payment-platform\java\target\classes started by 1 in D:\project2\payment-platform)
+2026-07-16 12:17:07.692 [main] INFO  c.p.platform.PaymentApplication - The following 1 profile is active: "dev"
+2026-07-16 12:17:08.595 [main] INFO  o.s.d.r.c.RepositoryConfigurationDelegate - Multiple Spring Data modules found, entering strict repository configuration mode
+2026-07-16 12:17:08.597 [main] INFO  o.s.d.r.c.RepositoryConfigurationDelegate - Bootstrapping Spring Data Redis repositories in DEFAULT mode.
+2026-07-16 12:17:08.646 [main] INFO  o.s.d.r.c.RepositoryConfigurationDelegate - Finished Spring Data repository scanning in 38 ms. Found 0 Redis repository interfaces.
+2026-07-16 12:17:09.237 [main] INFO  o.s.b.w.e.tomcat.TomcatWebServer - Tomcat initialized with port 8001 (http)
+2026-07-16 12:17:09.245 [main] INFO  o.a.coyote.http11.Http11NioProtocol - Initializing ProtocolHandler ["http-nio-8001"]
+2026-07-16 12:17:09.246 [main] INFO  o.a.catalina.core.StandardService - Starting service [Tomcat]
+2026-07-16 12:17:09.246 [main] INFO  o.a.catalina.core.StandardEngine - Starting Servlet engine: [Apache Tomcat/10.1.20]
+2026-07-16 12:17:09.296 [main] INFO  o.a.c.c.C.[.[localhost].[/api/v1] - Initializing Spring embedded WebApplicationContext
+2026-07-16 12:17:09.297 [main] INFO  o.s.b.w.s.c.ServletWebServerApplicationContext - Root WebApplicationContext: initialization completed in 1452 ms
+2026-07-16 12:17:09.324 [main] INFO  c.a.d.s.b.a.DruidDataSourceAutoConfigure - Init DruidDataSource
+2026-07-16 12:17:10.913 [main] INFO  c.alibaba.druid.pool.DruidDataSource - {dataSource-1} inited
+2026-07-16 12:17:11.852 [main] WARN  c.p.p.c.alipay.AlipayClientFactory - 支付宝默认配置不完整,将仅使用服务商/租户专属客户端
+2026-07-16 12:17:12.008 [main] INFO  c.p.platform.core.oss.OssService - OSS client initialized: bucket=hunanxiaojunzioss, endpoint=oss-cn-beijing.aliyuncs.com
+2026-07-16 12:17:12.308 [main] INFO  c.p.p.m.p.e.s.EnterpriseNameSyncScheduler - [企业名称同步] 调度器启动
+2026-07-16 12:17:12.563 [main] INFO  c.p.p.m.p.n.s.NotificationService - 已注册 7 个通知处理器: [AccountHandler, BillHandler, EmployeeHandler, EnterpriseHandler, InstitutionHandler, OrderHandler, VoucherHandler]
+2026-07-16 12:17:13.077 [main] INFO  o.s.s.web.DefaultSecurityFilterChain - Will secure any request with [org.springframework.security.web.session.DisableEncodeUrlFilter@82382d1, org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter@6c120b00, org.springframework.security.web.context.SecurityContextHolderFilter@722d3ddb, org.springframework.security.web.header.HeaderWriterFilter@6debf1b8, org.springframework.web.filter.CorsFilter@d8a2b1b, org.springframework.security.web.authentication.logout.LogoutFilter@1f596988, com.payment.platform.core.security.JwtAuthFilter@682fe17b, com.payment.platform.core.security.TenantApiKeyAuthFilter@531bec12, org.springframework.security.web.savedrequest.RequestCacheAwareFilter@25b87e1b, org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter@623a891d, org.springframework.security.web.authentication.AnonymousAuthenticationFilter@2709e075, org.springframework.security.web.session.SessionManagementFilter@4fe9fb65, org.springframework.security.web.access.ExceptionTranslationFilter@19a4cdea, org.springframework.security.web.access.intercept.AuthorizationFilter@8bd9d08]
+2026-07-16 12:17:13.468 [main] INFO  o.a.coyote.http11.Http11NioProtocol - Starting ProtocolHandler ["http-nio-8001"]
+2026-07-16 12:17:13.479 [main] INFO  o.s.b.w.e.tomcat.TomcatWebServer - Tomcat started on port 8001 (http) with context path '/api/v1'
+2026-07-16 12:17:13.592 [main] INFO  c.p.platform.PaymentApplication - Started PaymentApplication in 6.668 seconds (process running for 7.313)
+2026-07-16 12:17:15.845 [main] INFO  c.p.p.core.config.AppStartupRunner - 系统配置缓存初始化完成
+2026-07-16 12:17:17.398 [main] INFO  c.p.p.core.config.AppStartupRunner - 数据字典缓存初始化完成 (10 个字典类型)
+2026-07-16 12:17:37.007 [tomcat-handler-0] INFO  o.a.c.c.C.[.[localhost].[/api/v1] - Initializing Spring DispatcherServlet 'dispatcherServlet'
+2026-07-16 12:17:37.008 [tomcat-handler-0] INFO  o.s.web.servlet.DispatcherServlet - Initializing Servlet 'dispatcherServlet'
+2026-07-16 12:17:37.009 [tomcat-handler-0] INFO  o.s.web.servlet.DispatcherServlet - Completed initialization in 1 ms
+2026-07-16 12:17:40.770 [tomcat-handler-7] INFO  c.p.p.c.alipay.AlipayClientFactory - 服务商[3]客户端创建成功, appId=2021006160682088, name=跨境服务商, mode=cert

Bu fark içinde çok fazla dosya değişikliği olduğu için bazı dosyalar gösterilmiyor