Skip to content

广发 CGB

本页说明

讲什么:广发银行的 FPS API 批量出金通道、FPS 消息类型、批量处理机制 适合谁:需要了解广发对接细节的产品经理 前置阅读银行能力矩阵预计阅读:2 分钟 负责人:出金产品经理

核心要点:广发 FPS 出金采用批量提交模式——多笔出金打包成一个 batch,系统轮询获取每笔结果,最多轮询 1500 次(可达数小时)。


能力总览

能力支持情况协议/通道核心服务
入金流水
出金 FPS APIForm-URLEncoded HTTP POST(XML payload)cgb_fps_service (Go)
FPS 入金FPS 收款
eDDA/eDDI
银证 BST

广发是唯一支持 FPS API 批量出金的银行——可以一次提交多笔出金,由银行批量处理。


出金:FPS API

出金方法

维度说明
方法码TRANSFER_METHOD_CGB_FPS_API = 'cgb_fps_api'
分类电子银行方法(allEBankMethod
中文名FPS API(广发)

FPS 消息类型

广发 FPS 通过 4 种消息类型完成出金生命周期:

消息类型用途方向
2063单笔出金请求moomoo → 广发
2064批量出金请求moomoo → 广发
2065单笔出金查询moomoo → 广发
2066批量出金查询moomoo → 广发

单笔出金(2063)

参数说明示例
Remote Type地区01=香港, 02=澳门
Remit Currency汇款币种HKD/CNY/MOP
Payee Account Type收款账号类型BBAN/SVID/MOBN/AIIN/EMAL
Transaction Status交易状态0=成功, 1=失败, 2=处理中

批量出金(2064)

广发独有的批量能力,一次最多提交 2000 笔出金:

参数说明
Customer Batch No批次号(20 位)
All Count总笔数(最大 2000)
Records多条 Fps2064Record
Batch Status1=失败, 2=处理中

批量出金数据流

状态码映射

不同消息类型的状态码含义不同,需要注意区分:

状态码2063(单笔请求)2065(单笔查询)2066(批量查询)
0成功处理中失败
1失败成功成功
2处理中失败处理中

注意

2063 和 2065/2066 的状态码含义是反的——2063 中 0=成功,但 2065 中 0=处理中。开发时务必区分请求类型。

错误处理

批量查询(2066)返回每笔的详细信息:

  • Success Count:成功笔数
  • Fail Count:失败笔数
  • 每笔失败会附带错误原因码和错误描述
  • 区分付款方错误(Error Type=0)和收款方错误(Error Type=1)

渠道接口详情

渠道接口概览

维度说明
协议类型Form-URLEncoded HTTP POST(XML payload)
认证方式SM2 国密签名
数据格式XML (UTF-8)
端口9091 (HTTPS)
超时30 秒
核心服务cgb_fps_service(Go)

SM2 签名配置

广发使用国密 SM2 算法进行请求签名,涉及以下密钥:

密钥路径格式
富途私钥conf/keys/futu.pvkPKCS#8
富途公钥conf/keys/futu.puk
银行公钥conf/keys/gfs.tst.puk
用户 ID16 字节字符串"1234567812345678"

签名流程:使用富途私钥对请求 XML 做 SM2 签名,签名结果 Base64 编码后放入 SIGN 块;银行响应使用银行公钥验签。


接口 1:2063 单笔出金(FPS Single Payment)

请求 COMMHEAD(公共报文头):

字段描述示例
TRANCODE交易码"2063"
CIFMASTER客户主号"1000001287"
ENTSEQNO流水号(≤20 位)财务唯一序号
ENTUSERID用户 ID"100001"
TRANDATE交易日期"YYYYMMDD"
TRANTIME交易时间"HHMMSS"

请求 BODY:

字段类型必填描述
REMITTYPEstring汇款类型。取值 "01"=香港, "02"=澳门
PAYACCstring付款账号。如 "3597601080012948"
REMITCURstring币种。取值 香港: "HKD" / "CNY", 澳门: "HKD" / "MOP"
REMITAMOUNTdecimal(16,2)金额。如 "1000.00"
PAYEEACTYPEstring收款方账号类型。取值 "BBAN" / "SVID" / "MOBN" / "AIIN" / "EMAL"
BENEFCORPACCTstring收款方账号/ID。根据 PAYEEACTYPE 填写对应格式
PAYEEBANKstring收款银行代码。取值 "359"=内部 HK,或 FPS 银行代码
BENEFCORPNAMEstring(≤140)收款方姓名
PAYPURSstring付款用途。取值 "CXBSNS"=商业, "CXSALA"=薪资, "CXMRCH"=商户, "CXPSNL"=个人
REMITMEMOstring备注。≤34 中文字符 / 102 英文字符
MEMOstring注释。≤50 中文字符 / 150 英文字符

SIGN 块:

字段描述
CSTID客户 ID(16 字节)
SIGNVALUEBase64 编码的 SM2 签名

响应:

字段描述
RETCODE通信码:"000"=成功
ERRORCODE业务码:"0000"=成功
ERRORMESSAGE错误描述
TRACENO银行追踪号
TRANSTATUS"0"=成功, "1"=失败, "2"=处理中

接口 2:2064 批量出金(FPS Batch Payment)

在 2063 单笔基础上增加以下批量特有字段:

字段描述
CUSTOMERBATCHNO批次号(≤20 位,全局唯一
ALLCOUNT总笔数(≤2000)
ALLAMOUNT总金额(decimal 精确计算,不可有浮点误差)
RECORD.CUSTOMERSALARYSEQ明细序号(20 字符,批次内唯一

每条 RECORD 包含与 2063 单笔相同的 PAYEEACTYPEBENEFCORPACCTREMITAMOUNT 等字段。

批量金额校验

ALLAMOUNT 必须严格等于所有明细 REMITAMOUNT 之和。系统使用 decimal 类型精确计算,避免浮点误差导致银行拒绝整批。


接口 3:2065 单笔查询

字段描述
ORIGENTSEQNO原始流水号(= 2063 请求中的 ENTSEQNO
STARTRANSDATE查询开始日期
ENDTRANSDATE查询结束日期

响应 TRANSTATUS"0"=处理中, "1"=成功, "2"=失败

状态码含义不同

注意 2065 查询的状态码与 2063 请求的状态码含义完全相反:2063 中 "0"=成功,2065 中 "0"=处理中。开发和排查时务必区分请求类型。


接口 4:2066 批量查询

字段描述
CUSTOMERBATCHNO批次号(= 2064 请求中的批次号)
BATCHSTATUS"0"=失败, "1"=完成, "2"=处理中
SUCCESSCOUNT成功笔数
FAILCOUNT失败笔数

每笔明细的 TRANSTATUS 含义与 2065 一致("0"=处理中, "1"=成功, "2"=失败)。

2066 双层状态

2066 响应包含两层状态:BATCHSTATUS(批次级:0=失败, 1=成功, 2=处理中)和 TRANSTATUS(明细级:0=处理中, 1=成功, 2=失败)。明细级状态与 2065 含义一致,与批次级含义相反。


幂等性规则

广发对重复请求有严格的幂等性校验:

场景行为影响范围
重复 CUSTOMERBATCHNO整批拒绝整个批次
批次内重复 CUSTOMERSALARYSEQ仅该条失败单笔明细
历史重复 CUSTOMERSALARYSEQ该条失败单笔明细

幂等性设计建议

  • CUSTOMERBATCHNO 建议使用"日期 + 业务序号"格式确保全局唯一
  • CUSTOMERSALARYSEQ 建议使用出金订单 ID 确保跨批次也不重复
  • 重试时必须使用新的 CUSTOMERBATCHNO,不能复用旧批次号

配置

参数说明
pay_acc_hkd"3597601080012948"HKD 付款账号
pay_acc_cny"3597601080012939"CNY 付款账号
batch_max_count3单批最大笔数(银行上限 1999,保守设置)

为什么 batch_max_count 设为 3?

虽然银行支持最多 2000 笔/批,但实际运营中设为 3,原因是:出金通常需要逐笔审核和追踪,过大的批次会增加排查难度;如果某批失败需要重试,小批次影响范围更可控。


moomoo 侧适配

DBQueue 异步提交:出金服务不直接调用广发 API,而是将出金指令写入 DBQueue,由 cgb_fps_service 异步消费并提交银行。

兜底查询:系统通过 DBQueue 机制持续轮询,每 15 秒检查一次未完成交易状态,最多重试 1500 次(约 6 小时覆盖)。

状态映射(TRANSTATUS → 内部状态)

TRANSTATUS (2065/2066)含义内部状态
0处理中pending
1成功success
2失败failed

需求变更指引

变更需求改动位置说明
修改批量上限cgb_fps_service → 批量构建逻辑调整 2000 笔上限
新增收款账号类型cgb_fps_service → 2063 请求参数添加 Payee Account Type
修改查询频率cgb_fps_service → 轮询配置调整 2066 查询间隔
新增币种支持cgb_fps_service → 请求参数添加 Remit Currency 选项
修改出金审批模板Task.php$stepTemplates调整广发出金审批流程

常见客诉 Top 3

#用户反馈原因客服话术
1"FPS 出金失败"银行系统繁忙(A014)或收款信息有误"转账暂时失败,系统正在自动重试,请稍候"
2"出金状态显示未知"批量查询返回 UNKNOWN 状态"您的出金正在确认中,我们会尽快更新状态"
3"出金金额和申请不一致"批量金额汇总计算差异"请核对出金记录,如有差异请联系客服处理"

监控与告警

告警项触发条件严重度处理步骤
批量发送超时2064 批量请求无响应🔴 高系统自动降级为单笔(2063)重发,检查降级日志
签名验签失败SIGN_ERROR🔴 高检查签名密钥配置,确认未被更换
状态码误判告警2063/2065 vs 2064/2066 状态码含义不同🟡 中确认消息类型后重新判断,参考状态码含义反转

读完之后

我想...去看
看广发在各银行中的位置银行能力矩阵
了解广发出金的完整审批流程出金生命周期
对比另一家 FPS 出金银行渣打 SCB
查 FPS 消息类型的错误码统一错误码中心
这个页面有帮助吗?

内部业务文档 · 仅限 moomoo 团队使用