Kaynağa Gözat

feat: AlipayTransferService 企业码→安全发 API 完整迁移

5个核心接口迁移:
- authorizeApply: alipay.user.agreement.page.sign (pageExecute)
- createAccount: alipay.fund.accountbook.create (新增 agreement_no 参数)
- deposit: alipay.fund.trans.page.pay (pageExecute)
- transfer: alipay.fund.trans.uni.transfer (Participant + payer_info)
- queryAccounts: alipay.fund.accountbook.query

其他:
- 新增 queryTransferStatus: alipay.fund.trans.common.query
- retryDealingTransfers/transferSyncAllService 改用新查询API
- AccountEntity 新增 agreementNo 字段
- withdraw 标记 @Deprecated (反射保留旧实现)
- AccountController create 接口增加 agreement_no 参数

SDK 4.39.218.ALL 已有全部新 API 类,无需升级。
alphaH 1 gün önce
ebeveyn
işleme
6ccd1a6742

+ 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]

+ 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 |

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

@@ -111,7 +111,9 @@ public class AccountController {
     @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')")

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

@@ -21,5 +21,7 @@ public class AccountEntity extends PaymentEnterpriseBaseEntity {
     private String scene;
     private String signStatus;
     private OffsetDateTime signTime;
+    /** 签约协议号 — 安全发模式通过 alipay.user.agreement.page.sign 获取 */
+    private String agreementNo;
     private String remark;
 }

+ 334 - 345
java/src/main/java/com/payment/platform/module/payment/account/service/AlipayTransferService.java

@@ -1,15 +1,28 @@
 package com.payment.platform.module.payment.account.service;
 
 import com.alipay.api.AlipayApiException;
-import com.alipay.api.domain.AlipayCommerceEcTransAccountCreateModel;
-import com.alipay.api.domain.AlipayCommerceEcTransAccountDepositModel;
-import com.alipay.api.domain.AlipayCommerceEcTransAccountQueryModel;
-import com.alipay.api.domain.AlipayCommerceEcTransAccountTransferModel;
-import com.alipay.api.domain.AlipayCommerceEcTransAccountWithdrawModel;
-import com.alipay.api.domain.AlipayCommerceEcTransAuthorizeApplyModel;
-import com.alipay.api.domain.TransParticipant;
-import com.alipay.api.request.*;
-import com.alipay.api.response.*;
+import com.alipay.api.AlipayClient;
+import com.alipay.api.domain.AccessParams;
+import com.alipay.api.domain.AlipayFundAccountbookCreateModel;
+import com.alipay.api.domain.AlipayFundAccountbookQueryModel;
+import com.alipay.api.domain.AlipayFundTransCommonQueryModel;
+import com.alipay.api.domain.AlipayFundTransPagePayModel;
+import com.alipay.api.domain.AlipayFundTransUniTransferModel;
+import com.alipay.api.domain.AlipayUserAgreementPageSignModel;
+import com.alipay.api.domain.BankcardExtInfo;
+import com.alipay.api.domain.Participant;
+import com.alipay.api.request.AlipayFundAccountbookCreateRequest;
+import com.alipay.api.request.AlipayFundAccountbookQueryRequest;
+import com.alipay.api.request.AlipayFundTransCommonQueryRequest;
+import com.alipay.api.request.AlipayFundTransPagePayRequest;
+import com.alipay.api.request.AlipayFundTransUniTransferRequest;
+import com.alipay.api.request.AlipayUserAgreementPageSignRequest;
+import com.alipay.api.response.AlipayFundAccountbookCreateResponse;
+import com.alipay.api.response.AlipayFundAccountbookQueryResponse;
+import com.alipay.api.response.AlipayFundTransCommonQueryResponse;
+import com.alipay.api.response.AlipayFundTransPagePayResponse;
+import com.alipay.api.response.AlipayFundTransUniTransferResponse;
+import com.alipay.api.response.AlipayUserAgreementPageSignResponse;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.payment.platform.common.exception.BusinessException;
 import com.payment.platform.common.utils.RedisLockUtil;
@@ -37,7 +50,9 @@ import java.time.OffsetDateTime;
 import java.util.*;
 
 /**
- * 支付宝转账服务 — 对应 Python AccountService 中的 Alipay 调用部分
+ * 支付宝安全发转账服务 — 迁移到安全发-服务商模式 API
+ * <p>
+ * 旧 API (alipay.commerce.ec.trans.*) -> 新 API (alipay.fund.* / alipay.user.agreement.*)
  */
 @Slf4j
 @Service
@@ -53,139 +68,174 @@ public class AlipayTransferService {
     private final ObjectMapper objectMapper;
     private final RedisLockUtil redisLockUtil;
 
-    // 自注入用于独立事务(对应 Python 的 async with async_db_session())
-    // @Lazy 避免构造期间的循环依赖
     @org.springframework.beans.factory.annotation.Autowired
     @org.springframework.context.annotation.Lazy
     private AlipayTransferService self;
 
-    // 用于重试任务回调通知 — 对应 Python retry_dealing_transfers 中调用 OpenTransferService.open_return_service
     @org.springframework.beans.factory.annotation.Autowired
     @org.springframework.context.annotation.Lazy
     private com.payment.platform.module.payment.openapi.service.OpenapiService openapiService;
 
+    // ---- 安全发常量 ----
+    private static final String PRODUCT_CODE = "SINGLE_TRANSFER_NO_PWD";
+    private static final String BIZ_SCENE_TRANSFER = "ENTRUST_TRANSFER";
+    private static final String BIZ_SCENE_ALLOCATION = "DIRECT_ALLOCATION";
+    private static final String SCENE_CODE_ACCOUNT_BOOK = "SATF_FUND_BOOK";
+
     private static final Map<String, String> TRANSFER_ERROR_HINTS = new LinkedHashMap<>();
 
     static {
         TRANSFER_ERROR_HINTS.put("SYSTEM_ERROR", "系统繁忙,请稍后重试");
         TRANSFER_ERROR_HINTS.put("INVALID_PARAMETER", "请求参数有误,请检查后重试");
-        TRANSFER_ERROR_HINTS.put("AMOUNT_LESS_THAN_ONE_CENT", "转账金额不能低于 0.01 元");
         TRANSFER_ERROR_HINTS.put("BALANCE_IS_NOT_ENOUGH", "企业余额不足,建议充值");
         TRANSFER_ERROR_HINTS.put("BANK_RESPONSE_ERROR", "银行处理失败:账户异常");
         TRANSFER_ERROR_HINTS.put("CARD_BIN_ERROR", "收款银行账号不正确,请确认");
-        TRANSFER_ERROR_HINTS.put("DUPLICATE_DIFFERENT_REQUEST", "重复请求但参数不一致,请检查");
         TRANSFER_ERROR_HINTS.put("EXCEED_LIMIT_SM_MIN_AMOUNT", "转账金额不能低于 0.1 元");
-        TRANSFER_ERROR_HINTS.put("EXCEED_LIMIT_DM_MAX_AMOUNT", "超出单日转账限额,请明天再试或联系管理员提升限额");
-        TRANSFER_ERROR_HINTS.put("INVALID_ACCOUNT_BOOK", "资金专户不存在,请检查专户号");
+        TRANSFER_ERROR_HINTS.put("EXCEED_LIMIT_DM_MAX_AMOUNT", "超出单日转账限额");
         TRANSFER_ERROR_HINTS.put("INVALID_CARDNO", "无效的收款银行卡号");
-        TRANSFER_ERROR_HINTS.put("INVALID_IDENTITY_TYPE", "收款方身份类型不匹配");
         TRANSFER_ERROR_HINTS.put("NO_AGREEMENT", "无转账权限,请联系管理员");
-        TRANSFER_ERROR_HINTS.put("PAYEE_CARD_INFO_ERROR", "收款方账号或银行卡信息有误,请核实");
+        TRANSFER_ERROR_HINTS.put("PAYEE_CARD_INFO_ERROR", "收款方账号或银行卡信息有误");
         TRANSFER_ERROR_HINTS.put("PAYEE_NOT_EXIST", "收款账号不存在或姓名有误");
         TRANSFER_ERROR_HINTS.put("PAYER_BALANCE_NOT_ENOUGH", "付款方余额不足,建议充值");
         TRANSFER_ERROR_HINTS.put("REQUEST_PROCESSING", "系统处理中,请稍后重试");
-        TRANSFER_ERROR_HINTS.put("TRANS_AUTH_NO_EXIST", "转账授权协议不存在,请先签约");
     }
 
-    /** 对应 Python authorize_apply_service */
+    // ==================== 1. 签约(页面跳转) ====================
+
+    /**
+     * alipay.user.agreement.page.sign — 页面跳转接口
+     * 必填: personal_product_code, product_code, sign_scene, access_params
+     */
     public Map<String, String> authorizeApply(String enterpriseId) {
         try {
-            AlipayCommerceEcTransAuthorizeApplyModel model = new AlipayCommerceEcTransAuthorizeApplyModel();
-            model.setEnterpriseId(enterpriseId);
-
-            AlipayCommerceEcTransAuthorizeApplyRequest request = new AlipayCommerceEcTransAuthorizeApplyRequest();
+            AlipayUserAgreementPageSignModel model = new AlipayUserAgreementPageSignModel();
+            model.setPersonalProductCode("GENERAL_WITHHOLDING_P");
+            model.setProductCode("GENERAL_WITHHOLDING");
+            model.setSignScene("DEFAULT|DEFAULT");
+            model.setExternalAgreementNo(enterpriseId + "_" + System.currentTimeMillis());
+            AccessParams accessParams = new AccessParams();
+            accessParams.setChannel("ALIPAYAPP");
+            model.setAccessParams(accessParams);
+
+            AlipayUserAgreementPageSignRequest request = new AlipayUserAgreementPageSignRequest();
             request.setBizModel(model);
 
-            AlipayCommerceEcTransAuthorizeApplyResponse response =
-                    alipayClientFactory.getClient(enterpriseId).execute(request);
+            AlipayUserAgreementPageSignResponse response =
+                    alipayClientFactory.getClient(enterpriseId).pageExecute(request);
 
-            if (!response.isSuccess())
-                throw new BusinessException(400, "申请转账授权失败: " + response.getMsg());
+            if (response == null)
+                throw new BusinessException(400, "申请签约失败: 无响应");
 
-            return Map.of("sign_url", response.getSignUrl() != null ? response.getSignUrl() : "");
+            String body = response.getBody();
+            return Map.of("sign_url", body != null ? body : "");
         } catch (AlipayApiException e) {
-            throw new BusinessException(400, "申请转账授权失败: " + e.getMessage());
+            throw new BusinessException(400, "申请签约失败: " + e.getMessage());
         }
     }
 
-    /** 对应 Python create_account_service */
+    // ==================== 2. 开通记账本 ====================
+
+    /**
+     * alipay.fund.accountbook.create
+     * 必填: merchant_user_id, merchant_user_type, scene_code
+     * 选填: ext_info (含 agreement_no)
+     */
     @Transactional
-    public Map<String, String> createAccount(String enterpriseId) {
+    public Map<String, String> createAccount(String enterpriseId, String agreementNo) {
         try {
-            AlipayCommerceEcTransAccountCreateModel model = new AlipayCommerceEcTransAccountCreateModel();
-            model.setEnterpriseId(enterpriseId);
-            model.setAccountType("ALL");
-            model.setScene("B2B_TRANS");
+            AlipayFundAccountbookCreateModel model = new AlipayFundAccountbookCreateModel();
+            model.setMerchantUserId(enterpriseId);
+            model.setMerchantUserType("BUSINESS_ORGANIZATION");
+            model.setSceneCode(SCENE_CODE_ACCOUNT_BOOK);
+
+            if (agreementNo != null && !agreementNo.isBlank()) {
+                Map<String, String> extInfo = new LinkedHashMap<>();
+                extInfo.put("agreement_no", agreementNo);
+                try { model.setExtInfo(objectMapper.writeValueAsString(extInfo)); }
+                catch (Exception ignored) {}
+            }
 
-            AlipayCommerceEcTransAccountCreateRequest request = new AlipayCommerceEcTransAccountCreateRequest();
+            AlipayFundAccountbookCreateRequest request = new AlipayFundAccountbookCreateRequest();
             request.setBizModel(model);
 
-            AlipayCommerceEcTransAccountCreateResponse response =
+            AlipayFundAccountbookCreateResponse response =
                     alipayClientFactory.getClient(enterpriseId).execute(request);
 
             if (!response.isSuccess())
-                throw new BusinessException(400, "开通资金专户失败: " + response.getMsg());
+                throw new BusinessException(400, "开通资金记账本失败: " + response.getMsg());
 
             AccountEntity account = new AccountEntity();
             account.setEnterpriseId(enterpriseId);
             account.setAccountBookId(response.getAccountBookId());
-            account.setAccountType(model.getAccountType());
-            account.setScene(model.getScene());
+            account.setAccountType("ALL");
+            account.setScene("B2B_TRANS");
             account.setStatus("ACTIVE");
-            account.setSignStatus("PENDING");
+            account.setSignStatus(agreementNo != null ? "SIGNED" : "PENDING");
+            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());
+            throw new BusinessException(400, "开通资金记账本失败: " + e.getMessage());
         }
     }
 
-    /** 对应 Python deposit_service — 充值并保存记录到 DB */
+    // ==================== 3. 充值(页面跳转) ====================
+
+    /**
+     * alipay.fund.trans.page.pay — 页面跳转接口
+     * 必填: out_biz_no, trans_amount, product_code, biz_scene, payee_info
+     */
     @Transactional
     public Map<String, String> deposit(String enterpriseId, String accountBookId, BigDecimal amount, String remark) {
         try {
-            AlipayCommerceEcTransAccountDepositModel model = new AlipayCommerceEcTransAccountDepositModel();
-            model.setEnterpriseId(enterpriseId);
-            model.setAccountBookId(accountBookId);
-            model.setAmount(amount.toPlainString());
+            AlipayFundTransPagePayModel model = new AlipayFundTransPagePayModel();
             model.setOutBizNo(SnowflakeIdGenerator.nextIdStr());
+            model.setTransAmount(amount.toPlainString());
+            model.setProductCode(PRODUCT_CODE);
+            model.setBizScene(BIZ_SCENE_ALLOCATION);
 
-            AlipayCommerceEcTransAccountDepositRequest request = new AlipayCommerceEcTransAccountDepositRequest();
+            Participant payee = new Participant();
+            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);
 
-            AlipayCommerceEcTransAccountDepositResponse response =
-                    alipayClientFactory.getClient(enterpriseId).execute(request);
+            AlipayFundTransPagePayResponse response =
+                    alipayClientFactory.getClient(enterpriseId).pageExecute(request);
 
-            if (!response.isSuccess())
-                throw new BusinessException(400, "充值失败: " + response.getMsg());
+            if (response == null || response.getBody() == null)
+                throw new BusinessException(400, "充值页面生成失败: 无响应");
 
-            // 保存充值记录(对应 Python deposit_service L308-318)
             DepositEntity deposit = new DepositEntity();
             deposit.setEnterpriseId(enterpriseId);
             deposit.setOutBizNo(model.getOutBizNo());
             deposit.setAccountBookId(accountBookId);
             deposit.setAmount(amount);
-            deposit.setUrl(response.getUrl());
+            deposit.setUrl(response.getBody());
             deposit.setStatus("DEALING");
             deposit.setRemark(remark);
             depositMapper.insert(deposit);
 
-            return Map.of("url", response.getUrl() != null ? response.getUrl() : "");
+            return Map.of("url", response.getBody());
         } catch (AlipayApiException e) {
             throw new BusinessException(400, "充值失败: " + e.getMessage());
         }
     }
 
+    // ==================== 4. 转账 ====================
+
     /**
-     * 对应 Python transfer_service — 资金专户转账,完整逻辑
-     *
-     * 关键差异说明:
-     * - Python FAIL 分支使用独立 DB session 写入失败记录,
-     *   本方法将 FAIL 写入拆分到 internalSaveFailedTransfer(),
-     *   该子方法用 REQUIRES_NEW 独立事务保证失败记录不被外层回滚吞掉。
+     * alipay.fund.trans.uni.transfer
+     * 必填: out_biz_no, trans_amount, biz_scene, product_code, payee_info, payer_info
+     * 选填: order_title, remark, business_params
      */
+    @SuppressWarnings("unchecked")
     @Transactional
     public Map<String, Object> transfer(TransferCreateDTO dto) {
         String accountBookId = dto.getAccountBookId();
@@ -196,86 +246,103 @@ public class AlipayTransferService {
         Map<String, Object> payeeInfo = dto.getPayeeInfo();
         Map<String, Object> extInfo = dto.getExtInfo();
 
-        // 检查资金专户(对应 Python account/service.py L351-358)
         AccountEntity account = accountMapper.selectOne(
                 new com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper<AccountEntity>()
                         .eq(AccountEntity::getAccountBookId, accountBookId));
-        if (account == null) throw new BusinessException(400, "资金账户不存在");
+        if (account == null) throw new BusinessException(400, "资金记账本不存在");
 
-        // 租户范围校验 — 对应 Python L355-356: if account.tenant_id != auth.tenant_id
-        // dto.getTenantId() 为 null 时跳过(admin 端点未注入租户ID,保持向前兼容)
-        if (dto.getTenantId() != null && !dto.getTenantId().equals(account.getTenantId())) {
+        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 com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper<EnterpriseEntity>()
                             .eq(EnterpriseEntity::getEnterpriseId, account.getEnterpriseId()));
-            if (ent == null) throw new BusinessException(400, "资金账户所属企业不存在");
+            if (ent == null) throw new BusinessException(400, "记账本所属企业不存在");
             if (ent.getName() != null) orderTitle = "来自" + ent.getName() + "转账";
         }
 
         try {
-            AlipayCommerceEcTransAccountTransferModel model = new AlipayCommerceEcTransAccountTransferModel();
-            model.setEnterpriseId(account.getEnterpriseId());
-            model.setAccountBookId(account.getAccountBookId());
+            AlipayFundTransUniTransferModel model = new AlipayFundTransUniTransferModel();
             model.setOutBizNo(SnowflakeIdGenerator.nextIdStr());
-            model.setAmount(amount.toPlainString());
+            model.setTransAmount(amount.toPlainString());
+            model.setBizScene(BIZ_SCENE_TRANSFER);
+            model.setProductCode(PRODUCT_CODE);
             model.setOrderTitle(orderTitle);
+            if (remark != null && !remark.isBlank()) model.setRemark(remark);
+
+            // 必填: 付款方(记账本)
+            Participant payer = new Participant();
+            payer.setIdentityType("ACCOUNT_BOOK_ID");
+            payer.setIdentity(account.getAccountBookId());
+            if (account.getAgreementNo() != null && !account.getAgreementNo().isBlank()) {
+                Map<String, String> payerExt = new LinkedHashMap<>();
+                payerExt.put("agreement_no", account.getAgreementNo());
+                try { payer.setExtInfo(objectMapper.writeValueAsString(payerExt)); }
+                catch (Exception ignored) {}
+            }
+            model.setPayerInfo(payer);
 
-            TransParticipant payee = new TransParticipant();
+            // 必填: 收款方
+            Participant payee = new Participant();
             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) { /* SDK 类不存在则跳过 */ }
+                BankcardExtInfo bce = new BankcardExtInfo();
+                Class<?> bceClass = bce.getClass();
+                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.setBankcardExtInfo(bce);
             }
-
             model.setPayeeInfo(payee);
-            if (remark != null && !remark.isBlank()) model.setRemark(remark);
 
-            AlipayCommerceEcTransAccountTransferRequest request = new AlipayCommerceEcTransAccountTransferRequest();
+            // 选填: 转账场景信息(通过 businessParams JSON 透传)
+            if (extInfo != null && (extInfo.containsKey("transfer_scene_name")
+                    || extInfo.containsKey("transfer_scene_report_infos"))) {
+                try {
+                    Map<String, Object> bizParams = new LinkedHashMap<>();
+                    if (extInfo.containsKey("transfer_scene_name"))
+                        bizParams.put("transfer_scene_name", extInfo.get("transfer_scene_name"));
+                    if (extInfo.containsKey("transfer_scene_report_infos"))
+                        bizParams.put("transfer_scene_report_infos", extInfo.get("transfer_scene_report_infos"));
+                    model.setBusinessParams(objectMapper.writeValueAsString(bizParams));
+                } catch (Exception ignored) {}
+            }
+
+            AlipayFundTransUniTransferRequest request = new AlipayFundTransUniTransferRequest();
             request.setBizModel(model);
 
-            AlipayCommerceEcTransAccountTransferResponse response =
+            AlipayFundTransUniTransferResponse response =
                     alipayClientFactory.getClient(enterpriseId).execute(request);
 
             String subCode = response.getSubCode() != null ? response.getSubCode() : "";
             String subMsg = response.getSubMsg() != null ? response.getSubMsg() : "";
 
-            // 构建转账记录
             TransferEntity transfer = new TransferEntity();
-            transfer.setEnterpriseId(model.getEnterpriseId());
+            transfer.setEnterpriseId(account.getEnterpriseId());
             transfer.setOutBizNo(model.getOutBizNo());
-            transfer.setAccountBookId(model.getAccountBookId());
-            transfer.setAmount(new BigDecimal(model.getAmount()));
+            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.getOrderNo());
-            transfer.setFundOrderId(response.getFundOrderId());
+            transfer.setOrderNo(response.getOrderId());
+            transfer.setFundOrderId(response.getPayFundOrderId());
             transfer.setRemark(remark != null ? remark : "");
             if (extInfo != null) transfer.setExtInfo(toJson(extInfo));
 
             if (!response.isSuccess()) {
-                // 构建友好提示(对应 Python L426-433)
                 String hint = TRANSFER_ERROR_HINTS.get(subCode);
                 if (hint == null) {
                     for (var entry : TRANSFER_ERROR_HINTS.entrySet()) {
@@ -284,18 +351,14 @@ public class AlipayTransferService {
                 }
                 if (hint == null) hint = !subMsg.isEmpty() ? subMsg : response.getMsg();
 
-                log.error("支付宝转账失败: code={}, msg={}, sub_code={}, sub_msg={}", response.getCode(), response.getMsg(), subCode, subMsg);
+                log.error("支付宝转账失败: code={}, msg={}, sub_code={}, sub_msg={}",
+                        response.getCode(), response.getMsg(), subCode, subMsg);
 
-                // 独立事务写入失败记录(对应 Python L438-447)
-                // Python: async with async_db_session() as _session: async with _session.begin():
-                // 这里在 FAIL 时不调用 insert(当前事务会回滚),而是通过 self 代理调用独立事务方法
                 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));
@@ -305,118 +368,95 @@ public class AlipayTransferService {
 
             Map<String, Object> result = new LinkedHashMap<>();
             result.put("status", response.getStatus());
-            result.put("order_no", response.getOrderNo());
-            result.put("fund_order_id", response.getFundOrderId());
+            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());
         }
     }
 
+    // ==================== 5. 查询记账本 ====================
+
     /**
-     * 独立事务写入 FAIL 记录,对应 Python 的 async with async_db_session() 开始独立事务
-     *
-     * 注意: 必须通过 self 代理调用才能让 Spring AOP 拦截到 @Transactional(REQUIRES_NEW)
+     * alipay.fund.accountbook.query
+     * 必填: merchant_user_id, scene_code
      */
-    @Transactional(propagation = Propagation.REQUIRES_NEW)
-    public void insertFailedTransfer(TransferEntity transfer, String alipayMsg,
-                                      String subCode, String subMsg, String userRemark) {
-        transfer.setStatus("FAIL");
-        // 对应 Python: transfer_data["remark"] = f"{result.msg} ({sub_code} {sub_msg})"
-        transfer.setRemark(alipayMsg + " (" + subCode + " " + subMsg + ")");
-        transfer.setErrorCode(subCode);
-        transfer.setErrorMsg(subMsg);
-        transferMapper.insert(transfer);
-    }
-
-    /** 对应 Python withdraw_service — 提现并保存记录到 DB */
-    @Transactional
-    public Map<String, String> withdraw(String enterpriseId, String accountBookId, BigDecimal amount, String remark) {
-        // 校验企业存在(对应 Python L599-603)
-        EnterpriseEntity enterprise = enterpriseMapper.selectOne(
-                new com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper<EnterpriseEntity>()
-                        .eq(EnterpriseEntity::getEnterpriseId, enterpriseId));
-        if (enterprise == null) throw new BusinessException(400, "企业不存在");
-
+    public List<Map<String, Object>> queryAccounts(String enterpriseId) {
         try {
-            AlipayCommerceEcTransAccountWithdrawModel model = new AlipayCommerceEcTransAccountWithdrawModel();
-            model.setEnterpriseId(enterpriseId);
-            model.setAccountBookId(accountBookId);
-            model.setAmount(amount.toPlainString());
-            model.setOutBizNo(SnowflakeIdGenerator.nextIdStr());
-            if (remark != null && !remark.isBlank()) model.setRemark(remark);
+            AlipayFundAccountbookQueryModel model = new AlipayFundAccountbookQueryModel();
+            model.setMerchantUserId(enterpriseId);
+            model.setSceneCode(SCENE_CODE_ACCOUNT_BOOK);
 
-            AlipayCommerceEcTransAccountWithdrawRequest request = new AlipayCommerceEcTransAccountWithdrawRequest();
+            AlipayFundAccountbookQueryRequest request = new AlipayFundAccountbookQueryRequest();
             request.setBizModel(model);
 
-            AlipayCommerceEcTransAccountWithdrawResponse response =
+            AlipayFundAccountbookQueryResponse response =
                     alipayClientFactory.getClient(enterpriseId).execute(request);
 
             if (!response.isSuccess())
-                throw new BusinessException(400, "提现失败: " + response.getMsg());
-
-            // 保存提现记录(对应 Python L629-640)
-            WithdrawEntity withdraw = new WithdrawEntity();
-            withdraw.setEnterpriseId(enterpriseId);
-            withdraw.setOutBizNo(model.getOutBizNo());
-            withdraw.setAccountBookId(accountBookId);
-            withdraw.setAmount(amount);
-            // 专户提现到余额户是同步操作,状态直接记 SUCCESS
-            withdraw.setStatus("SUCCESS");
-            withdraw.setOrderNo(response.getOrderNo());
-            withdraw.setRemark(remark);
-            withdrawMapper.insert(withdraw);
+                throw new BusinessException(400, "查询记账本失败: " + response.getMsg());
 
-            log.info("资金专户提现发起成功: 企业: {}, 金额: {}", enterpriseId, amount);
-
-            return Map.of("enterprise_id", enterpriseId, "account_book_id", accountBookId);
+            List<Map<String, Object>> result = new ArrayList<>();
+            Map<String, Object> m = new LinkedHashMap<>();
+            m.put("account_book_id", response.getAccountBookId());
+            m.put("available_amount", response.getAvailableAmount());
+            m.put("scene", "B2B_TRANS");
+            result.add(m);
+            return result;
         } catch (AlipayApiException e) {
-            throw new BusinessException(400, "提现失败: " + e.getMessage());
+            throw new BusinessException(400, "查询记账本失败: " + e.getMessage());
         }
     }
 
-    /** 对应 Python query_account_service — 仅返回 B2B_TRANS 场景的账户 */
-    public List<Map<String, Object>> queryAccounts(String enterpriseId) {
+    // ==================== 6. 查询转账状态 ====================
+
+    /**
+     * alipay.fund.trans.common.query
+     * orderId / outBizNo 二选一必填
+     */
+    public Map<String, String> queryTransferStatus(String orderId, String outBizNo) {
         try {
-            AlipayCommerceEcTransAccountQueryModel model = new AlipayCommerceEcTransAccountQueryModel();
-            model.setEnterpriseId(enterpriseId);
+            AlipayFundTransCommonQueryModel model = new AlipayFundTransCommonQueryModel();
+            model.setProductCode(PRODUCT_CODE);
+            model.setBizScene(BIZ_SCENE_TRANSFER);
+            if (orderId != null && !orderId.isBlank()) {
+                model.setOrderId(orderId);
+            } else if (outBizNo != null && !outBizNo.isBlank()) {
+                model.setOutBizNo(outBizNo);
+            } else {
+                return Map.of("status", "UNKNOWN", "error", "order_id 和 out_biz_no 不能同时为空");
+            }
 
-            AlipayCommerceEcTransAccountQueryRequest request = new AlipayCommerceEcTransAccountQueryRequest();
+            AlipayFundTransCommonQueryRequest request = new AlipayFundTransCommonQueryRequest();
             request.setBizModel(model);
 
-            AlipayCommerceEcTransAccountQueryResponse response =
-                    alipayClientFactory.getClient(enterpriseId).execute(request);
-
-            if (!response.isSuccess())
-                throw new BusinessException(400, "查询资金专户失败: " + response.getMsg());
+            AlipayClient client = alipayClientFactory.getClient();
+            AlipayFundTransCommonQueryResponse response = client.execute(request);
 
-            List<Map<String, Object>> result = new ArrayList<>();
-            if (response.getAccountList() != null) {
-                for (var account : response.getAccountList()) {
-                    // 仅返回 B2B_TRANS 场景的账户(对应 Python L696-698)
-                    String scene;
-                    try { scene = (String) account.getClass().getMethod("getScene").invoke(account); }
-                    catch (Exception e) { continue; }
-                    if (!"B2B_TRANS".equals(scene)) continue;
-
-                    Map<String, Object> m = new LinkedHashMap<>();
-                    try {
-                        m.put("account_book_id", account.getClass().getMethod("getAccountBookId").invoke(account));
-                        m.put("scene", scene);
-                        m.put("status", account.getClass().getMethod("getStatus").invoke(account));
-                        result.add(m);
-                    } catch (Exception ignored) {}
-                }
+            if (!response.isSuccess()) {
+                log.warn("查询转账状态失败: code={}, msg={}", response.getCode(), response.getMsg());
+                return Map.of("status", "UNKNOWN", "error",
+                        response.getMsg() != null ? response.getMsg() : "unknown");
             }
+
+            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) {
-            throw new BusinessException(400, "查询资金专户失败: " + e.getMessage());
+            log.error("查询转账状态异常", e);
+            return Map.of("status", "UNKNOWN", "error", e.getMessage());
         }
     }
 
-    /** 对应 Python transfer_sync_status_service — 手动同步转账状态 */
+    // ==================== 7. 手动同步状态 ====================
+
     @Transactional
     public Map<String, Object> syncStatus(String outBizNo, String status, String errorCode, String errorMsg) {
         TransferEntity transfer = transferMapper.selectOne(
@@ -424,10 +464,8 @@ public class AlipayTransferService {
                         .eq(TransferEntity::getOutBizNo, outBizNo));
         if (transfer == null) throw new BusinessException(404, "转账记录不存在: " + outBizNo);
 
-        // 对应 Python L965-966: DEALING 且目标状态为 SUCCESS 时才允许同步
-        if (!"DEALING".equals(transfer.getStatus())) {
+        if (!"DEALING".equals(transfer.getStatus()))
             throw new BusinessException(400, "转账记录当前状态为 " + transfer.getStatus() + ",无需同步");
-        }
 
         transfer.setStatus(status);
         if (errorCode != null) transfer.setErrorCode(errorCode);
@@ -442,31 +480,85 @@ public class AlipayTransferService {
         return result;
     }
 
+    // ==================== 8. 提现(保留旧实现) ====================
 
-    // ─────────── 退避时间映射 ───────────
-    private static final int[] RETRY_INTERVALS = {5, 10, 45, 60};  // 累计: +5min, +15min, +1h, +2h
+    /** @deprecated 安全发模式暂不提供独立提现接口 */
+    @Deprecated
+    @Transactional
+    public Map<String, String> withdraw(String enterpriseId, String accountBookId, BigDecimal amount, String remark) {
+        EnterpriseEntity enterprise = enterpriseMapper.selectOne(
+                new com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper<EnterpriseEntity>()
+                        .eq(EnterpriseEntity::getEnterpriseId, enterpriseId));
+        if (enterprise == null) throw new BusinessException(400, "企业不存在");
+
+        try {
+            Class<?> modelClass = Class.forName("com.alipay.api.domain.AlipayCommerceEcTransAccountWithdrawModel");
+            Class<?> requestClass = Class.forName("com.alipay.api.request.AlipayCommerceEcTransAccountWithdrawRequest");
+            Class<?> responseClass = Class.forName("com.alipay.api.response.AlipayCommerceEcTransAccountWithdrawResponse");
+
+            Object model = modelClass.getDeclaredConstructor().newInstance();
+            modelClass.getMethod("setEnterpriseId", String.class).invoke(model, enterpriseId);
+            modelClass.getMethod("setAccountBookId", String.class).invoke(model, accountBookId);
+            modelClass.getMethod("setAmount", String.class).invoke(model, amount.toPlainString());
+            modelClass.getMethod("setOutBizNo", String.class).invoke(model, SnowflakeIdGenerator.nextIdStr());
+            if (remark != null && !remark.isBlank())
+                modelClass.getMethod("setRemark", String.class).invoke(model, remark);
+
+            Object request = requestClass.getDeclaredConstructor().newInstance();
+            requestClass.getMethod("setBizModel", modelClass).invoke(request, model);
+
+            Object response = alipayClientFactory.getClient(enterpriseId)
+                    .execute((com.alipay.api.AlipayRequest) request);
+
+            boolean isSuccess = (boolean) responseClass.getMethod("isSuccess").invoke(response);
+            if (!isSuccess)
+                throw new BusinessException(400, "提现失败: " + responseClass.getMethod("getMsg").invoke(response));
+
+            WithdrawEntity withdraw = new WithdrawEntity();
+            withdraw.setEnterpriseId(enterpriseId);
+            withdraw.setOutBizNo((String) modelClass.getMethod("getOutBizNo").invoke(model));
+            withdraw.setAccountBookId(accountBookId);
+            withdraw.setAmount(amount);
+            withdraw.setStatus("SUCCESS");
+            withdraw.setOrderNo((String) responseClass.getMethod("getOrderNo").invoke(response));
+            withdraw.setRemark(remark);
+            withdrawMapper.insert(withdraw);
 
-    // 分布式锁保证多实例不重复执行 — 对应 Python pg_try_advisory_lock(99999)
+            log.info("资金记账本提现发起成功: 企业: {}, 金额: {}", enterpriseId, amount);
+            return Map.of("enterprise_id", enterpriseId, "account_book_id", accountBookId);
+        } catch (ClassNotFoundException e) {
+            throw new BusinessException(400, "旧版提现接口已不可用,请使用 uni.transfer");
+        } catch (AlipayApiException e) {
+            throw new BusinessException(400, "提现失败: " + e.getMessage());
+        } catch (Exception e) {
+            throw new BusinessException(400, "提现失败: " + e.getMessage());
+        }
+    }
+
+    // ==================== 独立事务 FAIL 记录 ====================
+
+    @Transactional(propagation = Propagation.REQUIRES_NEW)
+    public void insertFailedTransfer(TransferEntity transfer, String alipayMsg,
+                                      String subCode, String subMsg, String userRemark) {
+        transfer.setStatus("FAIL");
+        transfer.setRemark(alipayMsg + " (" + subCode + " " + subMsg + ")");
+        transfer.setErrorCode(subCode);
+        transfer.setErrorMsg(subMsg);
+        transferMapper.insert(transfer);
+    }
+
+    // ==================== 反查重试定时任务 ====================
+
+    private static final int[] RETRY_INTERVALS = {5, 10, 45, 60};
     private static final String RETRY_LOCK_KEY = "retry:dealing_transfers";
-    private static final long RETRY_LOCK_TTL = 120; // 秒,进程崩溃后自动释放
+    private static final long RETRY_LOCK_TTL = 120;
 
-    /**
-     * 反查转账状态定时任务 — 对应 Python retry_dealing_transfers (L1128-1230)
-     *
-     * 每分钟执行一次,使用 AtomicBoolean 防重入(单实例)。
-     * 多实例部署时需替换为 PostgreSQL advisory lock (pg_try_advisory_lock)。
-     */
     @org.springframework.scheduling.annotation.Scheduled(fixedDelay = 60_000, initialDelay = 5_000)
     public void retryDealingTransfers() {
         String lockValue = redisLockUtil.lock(RETRY_LOCK_KEY, RETRY_LOCK_TTL);
-        if (lockValue == null) {
-            log.debug("[重试任务] 上一轮尚未完成或另一实例执行中,跳过");
-            return;
-        }
+        if (lockValue == null) { log.debug("[重试任务] 上一轮尚未完成,跳过"); return; }
         try {
-            int scanned = 0;
-            int processed = 0;
-
+            int scanned = 0, processed = 0;
             var now = OffsetDateTime.now();
             var dealingList = transferMapper.selectList(
                     new com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper<TransferEntity>()
@@ -476,80 +568,61 @@ public class AlipayTransferService {
                             .le(TransferEntity::getNextRetryAt, now)
                             .orderByAsc(TransferEntity::getNextRetryAt));
 
-            if (dealingList.isEmpty()) {
-                return;
-            }
+            if (dealingList.isEmpty()) return;
             scanned = dealingList.size();
             log.info("[重试任务] 扫描到 {} 条待反查记录", scanned);
 
             for (TransferEntity transfer : dealingList) {
                 String outBizNo = transfer.getOutBizNo();
-                String enterpriseId = transfer.getEnterpriseId();
                 String orderNo = transfer.getOrderNo() != null ? transfer.getOrderNo() : "";
                 int retryCount = transfer.getRetryCount() != null ? transfer.getRetryCount() : 0;
 
                 try {
-                    String syncResult = syncTransferDetail(outBizNo, enterpriseId, orderNo);
-                    if (syncResult != null) {
-                        // SUCCESS 或 FAIL 已由 syncTransferDetail 更新DB
-                        // 只更新 retryCount/nextRetryAt,避免全字段 updateById 覆盖 syncTransferDetail 写入的 status
+                    Map<String, String> status = queryTransferStatus(
+                            !orderNo.isEmpty() ? orderNo : null, outBizNo);
+                    String s = status.get("status");
+                    if ("SUCCESS".equals(s) || "FAIL".equals(s) || "REFUND".equals(s)) {
                         TransferEntity patch = new TransferEntity();
                         patch.setId(transfer.getId());
+                        patch.setStatus(s);
                         patch.setRetryCount(4);
                         patch.setNextRetryAt(null);
                         transferMapper.updateById(patch);
-                        log.info("[重试任务] out_biz_no={}, retry={}/4, result={}, 已更新",
-                                outBizNo, retryCount + 1, syncResult);
+                        log.info("[重试任务] out_biz_no={}, retry={}/4, result={}", outBizNo, retryCount + 1, s);
                         processed++;
-                        // GAP FIX 4: 回调 open_return_service — 对应 Python L1190-1193
                         try {
                             openapiService.notifyTransferResult(
-                                    orderNo != null && !orderNo.isEmpty() ? orderNo : outBizNo,
-                                    outBizNo, transfer.getTenantId());
-                        } catch (Exception ignored) {
-                            // Python 中回调失败仅忽略,不阻断主流程
-                        }
+                                    !orderNo.isEmpty() ? orderNo : outBizNo, outBizNo, transfer.getTenantId());
+                        } catch (Exception ignored) {}
                     } else {
-                        // 仍为 DEALING → 退避
                         boolean isCardTransfer = "BANK_CARD".equals(transfer.getPayeeType());
-                        int maxRetries = isCardTransfer ? 3 : 0;  // 银行卡3次,支付宝1次(不重试)
-
+                        int maxRetries = isCardTransfer ? 3 : 0;
                         if (retryCount < maxRetries) {
                             int accumulated = 0;
-                            for (int i = 0; i <= retryCount && i < RETRY_INTERVALS.length; i++) {
+                            for (int i = 0; i <= retryCount && i < RETRY_INTERVALS.length; i++)
                                 accumulated += RETRY_INTERVALS[i];
-                            }
                             transfer.setRetryCount(retryCount + 1);
                             transfer.setNextRetryAt(transfer.getCreatedTime() != null
                                     ? transfer.getCreatedTime().plusMinutes(accumulated)
                                     : OffsetDateTime.now().plusMinutes(accumulated));
-                            log.info("[重试任务] out_biz_no={}, payee_type={}, retry={}/{}, 仍DEALING, 下次={}",
-                                    outBizNo, transfer.getPayeeType(), retryCount + 1, maxRetries + 1, transfer.getNextRetryAt());
                         } else {
                             transfer.setStatus("FAIL");
                             transfer.setRetryCount(4);
                             transfer.setNextRetryAt(null);
-                            String failReason = isCardTransfer ? "反查超时判定为失败" : "支付宝转账仅重试1次仍DEALING";
-                            transfer.setErrorMsg(failReason);
-                            log.info("[重试任务] out_biz_no={}, payee_type={}, retry={}/{}次DEALING, 判FAIL: {}",
-                                    outBizNo, transfer.getPayeeType(), retryCount + 1, maxRetries + 1, failReason);
-                            // GAP FIX 4: 回调 open_return_service — 对应 Python L1213-1217
+                            transfer.setErrorMsg(isCardTransfer ? "反查超时判定为失败" : "仅重试1次仍DEALING");
                             try {
                                 openapiService.notifyTransferResult(
-                                        orderNo != null && !orderNo.isEmpty() ? orderNo : outBizNo,
-                                        outBizNo, transfer.getTenantId());
-                            } catch (Exception ignored) {
-                                // Python 中回调失败仅忽略,不阻断主流程
-                            }
+                                        !orderNo.isEmpty() ? orderNo : outBizNo, outBizNo, transfer.getTenantId());
+                            } catch (Exception ignored) {}
                         }
                         transferMapper.updateById(transfer);
                         processed++;
                     }
                 } catch (Exception e) {
-                    log.warn("[重试任务] trans.order.query 异常: out_biz_no={}, err={}", outBizNo, e.getMessage());
+                    log.warn("[重试任务] 查询异常: out_biz_no={}, err={}", outBizNo, e.getMessage());
                 }
             }
-            log.info("[重试任务] ====== 执行完成 ====== 处理 {} 条,扫描 {} 条", processed, scanned);
+            log.info("[重试任务] 完成: {} 处理/{} 扫描", processed, scanned);
         } catch (Exception e) {
             log.error("[重试任务] 执行异常", e);
         } finally {
@@ -557,134 +630,50 @@ public class AlipayTransferService {
         }
     }
 
-    /**
-     * 全量同步转账状态 — 对应 Python transfer_sync_all_service (L990-1038)
-     *
-     * 遍历所有 DEALING 记录,调用 trans.order.query 逐一同步。
-     */
+    /** 全量同步 — alipay.fund.trans.common.query */
     @Transactional
     public Map<String, Object> transferSyncAllService() {
-        var allTransfers = transferMapper.selectList(
+        var all = transferMapper.selectList(
                 new com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper<TransferEntity>()
                         .eq(TransferEntity::getStatus, "DEALING")
                         .orderByAsc(TransferEntity::getId));
 
-        int synced = 0;
-        int errors = 0;
-        java.util.List<Map<String, Object>> details = new java.util.ArrayList<>();
-
-        for (TransferEntity transfer : allTransfers) {
-            String outBizNo = transfer.getOutBizNo();
-            String eid = transfer.getEnterpriseId();
-            String orderNo = transfer.getOrderNo() != null ? transfer.getOrderNo() : "";
-            if (outBizNo == null || eid == null) continue;
+        int synced = 0, errors = 0;
+        List<Map<String, Object>> details = new ArrayList<>();
 
+        for (TransferEntity t : all) {
+            String outBizNo = t.getOutBizNo();
+            String orderNo = t.getOrderNo() != null ? t.getOrderNo() : "";
+            if (outBizNo == null) continue;
             try {
-                String newStatus = syncTransferDetail(outBizNo, eid, orderNo);
-                if (newStatus != null) {
+                Map<String, String> status = queryTransferStatus(
+                        !orderNo.isEmpty() ? orderNo : null, outBizNo);
+                String s = status.get("status");
+                if ("SUCCESS".equals(s) || "FAIL".equals(s) || "REFUND".equals(s)) {
+                    t.setStatus(s);
+                    if (status.get("pay_fund_order_id") != null)
+                        t.setFundOrderId(status.get("pay_fund_order_id"));
+                    transferMapper.updateById(t);
                     synced++;
-                    details.add(Map.of("out_biz_no", outBizNo, "old_status", transfer.getStatus(), "new_status", newStatus));
+                    details.add(Map.of("out_biz_no", outBizNo, "new_status", s));
                 } else {
-                    details.add(Map.of("out_biz_no", outBizNo, "status", transfer.getStatus(), "action", "no_change"));
+                    details.add(Map.of("out_biz_no", outBizNo, "action", "no_change"));
                 }
             } catch (Exception e) {
                 errors++;
-                details.add(Map.of("out_biz_no", outBizNo, "status", transfer.getStatus(), "error", e.getMessage()));
-                log.warn("全量同步 - 查询失败: out_biz_no={}, err={}", outBizNo, e.getMessage());
+                details.add(Map.of("out_biz_no", outBizNo, "error", e.getMessage()));
+                log.warn("全量同步失败: out_biz_no={}, err={}", outBizNo, e.getMessage());
             }
         }
-
         Map<String, Object> result = new LinkedHashMap<>();
-        result.put("total", allTransfers.size());
+        result.put("total", all.size());
         result.put("synced", synced);
         result.put("errors", errors);
         result.put("details", details);
         return result;
     }
 
-    /**
-     * 单笔查询转账状态 — 对应 Python _sync_transfer_detail (L1040-1122)
-     *
-     * 调用 alipay.commerce.ec.trans.order.query
-     * 参数: enterprise_id + out_biz_no + order_no(两个都传)
-     *
-     * @return 新状态字符串 (SUCCESS/FAIL),或 null(仍为 DEALING 或查询失败)
-     */
-    private String syncTransferDetail(String outBizNo, String enterpriseId, String orderNo) {
-        try {
-            // 动态加载,避免编译时依赖 SDK 中可能不存在的类
-            Class<?> modelClass = Class.forName("com.alipay.api.domain.AlipayCommerceEcTransOrderQueryModel");
-            Class<?> requestClass = Class.forName("com.alipay.api.request.AlipayCommerceEcTransOrderQueryRequest");
-            Class<?> responseClass = Class.forName("com.alipay.api.response.AlipayCommerceEcTransOrderQueryResponse");
-
-            Object model = modelClass.getDeclaredConstructor().newInstance();
-            modelClass.getMethod("setEnterpriseId", String.class).invoke(model, enterpriseId);
-            if (outBizNo != null && !outBizNo.isEmpty())
-                modelClass.getMethod("setOutBizNo", String.class).invoke(model, outBizNo);
-            if (orderNo != null && !orderNo.isEmpty())
-                modelClass.getMethod("setOrderNo", String.class).invoke(model, orderNo);
-
-            Object request = requestClass.getDeclaredConstructor().newInstance();
-            requestClass.getMethod("setBizModel", modelClass).invoke(request, model);
-
-            Object response = alipayClientFactory.getClient(enterpriseId).execute(
-                    (com.alipay.api.AlipayRequest) request);
-
-            if (response == null) return null;
-
-            boolean isSuccess = (boolean) responseClass.getMethod("isSuccess").invoke(response);
-            if (!isSuccess) {
-                String subCode = (String) responseClass.getMethod("getSubCode").invoke(response);
-                if ("ORDER_NOT_EXIST".equals(subCode)) return null;
-                log.warn("trans.order.query 失败: out_biz_no={}, sub_code={}", outBizNo, subCode);
-                return null;
-            }
-
-            String alipayStatus = (String) responseClass.getMethod("getStatus").invoke(response);
-            if (alipayStatus == null || "DEALING".equals(alipayStatus)) return null;
-
-            // 更新本地记录
-            TransferEntity transfer = transferMapper.selectOne(
-                    new com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper<TransferEntity>()
-                            .eq(TransferEntity::getOutBizNo, outBizNo));
-            if (transfer == null) return alipayStatus;
-
-            transfer.setStatus(alipayStatus);
-
-            try {
-                Object apiOrderNo = responseClass.getMethod("getOrderNo").invoke(response);
-                if (apiOrderNo != null) transfer.setOrderNo((String) apiOrderNo);
-            } catch (Exception ignored) {}
-            try {
-                Object apiFundOrderId = responseClass.getMethod("getPayFundOrderId").invoke(response);
-                if (apiFundOrderId != null) transfer.setFundOrderId((String) apiFundOrderId);
-            } catch (Exception ignored) {}
-            try {
-                Object apiAmount = responseClass.getMethod("getAmount").invoke(response);
-                if (apiAmount != null) transfer.setAmount(new java.math.BigDecimal(apiAmount.toString()));
-            } catch (Exception ignored) {}
-
-            if ("FAIL".equals(alipayStatus)) {
-                try {
-                    Object subMsg = responseClass.getMethod("getSubMsg").invoke(response);
-                    if (subMsg == null) subMsg = responseClass.getMethod("getMsg").invoke(response);
-                    if (subMsg != null) transfer.setRemark((String) subMsg);
-                } catch (Exception ignored) {}
-            }
-
-            transferMapper.updateById(transfer);
-            log.info("转账同步(trans.order.query): out_biz_no={}, status={}", outBizNo, alipayStatus);
-            return alipayStatus;
-
-        } catch (ClassNotFoundException e) {
-            log.warn("SDK 不支持 trans.order.query");
-            return null;
-        } catch (Exception e) {
-            log.warn("trans.order.query 异常: out_biz_no={}, err={}", outBizNo, e.getMessage());
-            return null;
-        }
-    }
-
+    // ==================== util ====================
 
     private String toJson(Object obj) {
         try { return objectMapper.writeValueAsString(obj); } catch (Exception e) { return "{}"; }