切换主题
登记簿分账
接口说明
登记簿转账 属于虚拟银行接口。调用方需按公共参数组装请求并完成签名;响应包含 sign 时,应先验签再解析 bizData。最终到账以结算状态为主
| 接口名称 | 登记簿转账 |
|---|---|
| 请求方式 | POST |
| 正式地址 | https://pay.rscygroup.com/api/open/virtualBank/division/pay |
| 沙箱地址 | https://pay-test.rscygroup.com/api/open/virtualBank/division/pay |
| 签名方式 | MD5 ,按签名规则说明生成或校验 sign |
| 结果判定 | 先判断公共返回 code,成功后验签并解析 bizData;最终业务状态以业务字段、查询接口或异步通知为准 |
流程图
处理要点:
请求前先将业务字段组装为 bizData JSON 字符串,再和公共参数一起参与签名。
响应或通知包含 sign 时,应先按签名规则验签,再解析 bizData。
code=000000 表示接口请求处理成功,不等同于所有异步业务流程最终完成。
请求参数
应用场景
虚拟银行的资金可以通过接口转账给其他记账薄,调用当前接口完成转账
批次金额和笔数必须和明细数据之和保持一致
每个批次订单明细不超过20笔
每个订单明细单笔转账最大金额 不超过5W
| 字段名 | 变量名 | 必填 | 类型 | 示例值 | 描述 |
|---|---|---|---|---|---|
| 外部批次号 | outBatchNo | 是 | String | AT12123123 | 接口外部批次号最大长度不超过32位 |
| 付款方账号 | payerAcctNo | 是 | String | RX123123123 | 付款方账号调用开户接口后会返回(字段 accountNo) |
| 批次笔数 | num | 是 | Long | 2 | 批次笔数 |
| 批次金额 | amount | 是 | Long | 200 | 批次金额(单位分,保留整数)示例:100 表示 1元 |
| 货币类型 | currency | 是 | String | CNY | 货币类型 固定值 CNY |
| - | - | - | - | - | 字符长度不超过100,一个中文占用3个字符 |
| 客户端ip | clientIp | 是 | String | <IP_ADDRESS> | 客户端ip ipv4 |
| - | - | - | - | - | 开通用户后台的时候需要先配置好支付密码 配置路径:账号中心-系统配置-安全管理 |
| 订单明细 | orderList | 是 | String | - | 批次订单明细子订单信息 |
| 付款方式 | payMethod | 否 | Number | 1 | 付款方式 固定值 11:直接支付 |
| 扩展参数 | extParam | 否 | String | - | 扩展参数 |
| 备注 | remark | 否 | String | - | 备注 |
| 异步通知地址 | notifyUrl | 否 | String | https://ww.a.com | 异步通知地址,转账成功后会给异步通知地址推送,不传则不推送 |
| 字段名 | 变量名 | 必填 | 类型 | 示例值 | 描述 |
|---|---|---|---|---|---|
| 外部订单号 | outOrderNo | 是 | String | A123123 | 外部订单号长度不超过32位 |
| 订单标题 | body | 是 | String | 测试订单 | 订单标题 |
| 金额 | amount | 是 | String | 金额 | 金额(单位分,保留整数)示例:100 表示 1元 |
| 收款方账号 | payeeAcctNo | 是 | String | 1AAC1231 | 收款方账号 (登记簿信息查询接口返回字段 accountNo) |
| 扩展参数 | extParam | 否 | String | 扩展参数 | 扩展参数 |
| - | - | - | - | - | 字符长度不超过32,一个中文占用3个字符 |
响应参数
| 字段名 | 变量名 | 必填 | 类型 | 示例值 | 描述 |
|---|---|---|---|---|---|
| 外部批次号 | outBatchNo | 是 | String | AT12123123 | 接口外部批次号最大长度不超过32位 |
| 平台批次号 | batchNo | 是 | Stirng | S1 | <DEMO_ID> |
| 转账状态 | state | 是 | String | INIT | 状态INIT:初始化PROCESSING:处理中SUCCESS:成功PART_SUCCESS:部分成功CLOSE:关闭FAIL:失败 |
| 订单明细 | orderList | 是 | String | - | 子订单明细 |
| 商户扩展参数 | extParam | 否 | Stirng | - | 商户扩展参数原样返回 |
| 描述 | note | 否 | String | 描述 | 当有报错返回时候会返回报错信息 |
| 字段名 | 变量名 | 必填 | 类型 | 示例值 | 描述 |
|---|---|---|---|---|---|
| 外部订单号 | outOrderNo | 是 | String | A123123 | 外部订单号长度不超过32位 |
| 平台订单号 | orderNo | 是 | String | 12312331 | 平台订单号 |
| 订单标题 | body | 是 | String | 测试订单 | 订单标题 |
| 金额 | amount | 是 | Long | 100 | 金额(单位分,保留整数)示例:100 表示 1元 |
| - | - | - | - | - | 入账金额(单位分,保留整数)示例:100 表示 1元 |
| 手续费 | mchFee | 是 | Long | 100 | 手续费(单位分,保留整数)示例:100 表示 1元 |
| - | - | - | - | - | 续费扣费方式ORDER- 订单内扣;ACCOUNT - 外扣 |
| 付款方账号 | payerAcctNo | 是 | String | 1AAC1231 | 付款方账号 (调用开户接口获取) |
| 收款方账号 | payeeAcctNo | 是 | String | 1AAC1231 | 收款方账号 (调用开户接口获取) |
| - | - | - | - | - | INIT:初始化PROCESSING:处理中SUCCESS:成功CLOSE:关闭FAIL:失败 |
| - | - | - | - | - | 针对结算失败的订单可以根据结算失败内容调用订单重新结算接口发起重新发起结算 |
| 结算备注 | settleRemark | 否 | String | 对方行账户状态异常[SPS] | 结算备注 |
| 扩展参数 | extParam | 否 | String | 扩展参数 | 扩展参数 |
| 描述 | note | 否 | String | 描述 | 当有报错返回时候会返回报错信息 |
请求示例
以下示例默认使用 MD5 作为演示模式。签名时先将公共参数按字段名升序排序并拼接为 key=value&key=value,再在原串末尾追加 &appSecret=... 后计算 MD5;生成 sign 后,实际请求体中不要传 appSecret。本页请求示例依赖签名规则说明中的公共签名实现。
bash
curl -X POST "https://pay.rscygroup.com/api/open/virtualBank/division/pay" \
-H "Content-Type: application/json" \
-d '{
"apiKey": "<CONFIGURED_VALUE>",
"bizData": "{\"outBatchNo\":\"BT2604200CLVWV0C12312\",\"payerAcctNo\":\"123456\",\"num\":1,\"amount\":100,\"currency\":\"CNY\",\"body\":\"测试\",\"clientIp\":\"<IP_ADDRESS>\",\"extParam\":\"12\",\"remark\":\"测试\",\"orderList\":\"[{\\\"outOrderNo\\\":\\\"Item<DEMO_ID>\\\",\\\"amount\\\":100,\\\"payeeAcctNo\\\":\\\"123123122\\\",\\\"body\\\":\\\"测试\\\"}]\"}",
"sign": "<按签名规则生成>",
"signType": "MD5",
"reqId": "PAY<DEMO_ID>",
"reqTime": "<DEMO_ID>",
"version": "1.0"
}'bash
curl -X POST "https://pay-test.rscygroup.com/api/open/virtualBank/division/pay" \
-H "Content-Type: application/json" \
-d '{
"apiKey": "<CONFIGURED_VALUE>",
"bizData": "{\"outBatchNo\":\"BT2604200CLVWV0C12312\",\"payerAcctNo\":\"123456\",\"num\":1,\"amount\":100,\"currency\":\"CNY\",\"body\":\"测试\",\"clientIp\":\"<IP_ADDRESS>\",\"extParam\":\"12\",\"remark\":\"测试\",\"orderList\":\"[{\\\"outOrderNo\\\":\\\"Item<DEMO_ID>\\\",\\\"amount\\\":100,\\\"payeeAcctNo\\\":\\\"123123122\\\",\\\"body\\\":\\\"测试\\\"}]\"}",
"sign": "<按签名规则生成>",
"signType": "MD5",
"reqId": "PAY<DEMO_ID>",
"reqTime": "<DEMO_ID>",
"version": "1.0"
}'复用签名规则说明中的 genSign / verifySign 通用方法。
java
Map<String, Object> biz = new LinkedHashMap<>();
biz.put("outBatchNo", "BT2604200CLVWV0C12312");
biz.put("payerAcctNo", "123456");
biz.put("num", 1);
biz.put("amount", 100);
biz.put("currency", "CNY");
biz.put("body", "测试");
biz.put("clientIp", "<IP_ADDRESS>");
biz.put("extParam", "12");
biz.put("remark", "测试");
biz.put("orderList", "[{\"outOrderNo\":\"Item<DEMO_ID>\",\"amount\":100,\"payeeAcctNo\":\"123123122\",\"body\":\"测试\"}]");
Map<String, String> req = new LinkedHashMap<>();
req.put("apiKey", "<API_KEY>");
req.put("bizData", mapper.writeValueAsString(biz));
req.put("reqId", "PAY" + System.currentTimeMillis());
req.put("reqTime", "<DEMO_ID>");
req.put("signType", "MD5");
req.put("version", "1.0");
req.put("sign", SignDemo.genSign(req, "MD5"));PHP 示例中的 SignDemo 类不在本页定义,推荐来自统一签名类实例。
php
<?php
require_once __DIR__ . '/SignDemo.php';
$demo = new SignDemo();
$biz = [
'outBatchNo' => 'BT2604200CLVWV0C12312',
'payerAcctNo' => '123456',
'num' => 1,
'amount' => 100,
'currency' => 'CNY',
'body' => '测试',
'clientIp' => '<IP_ADDRESS>',
'extParam' => '12',
'remark' => '测试',
'orderList' => '[{"outOrderNo":"Item<DEMO_ID>","amount":100,"payeeAcctNo":"123123122","body":"测试"}]',
];
$req = [
'apiKey' => '<API_KEY>',
'bizData' => json_encode($biz, JSON_UNESCAPED_UNICODE),
'reqId' => 'PAY' . time(),
'reqTime' => '<DEMO_ID>',
'signType' => 'MD5',
'version' => '1.0',
];
$req['sign'] = $demo->genSign($req);python
biz = {
'outBatchNo': 'BT2604200CLVWV0C12312',
'payerAcctNo': '123456',
'num': 1,
'amount': 100,
'currency': 'CNY',
'body': '测试',
'clientIp': '<IP_ADDRESS>',
'extParam': '12',
'remark': '测试',
'orderList': '[{"outOrderNo":"Item<DEMO_ID>","amount":100,"payeeAcctNo":"123123122","body":"测试"}]',
}
req = {
'apiKey': '<API_KEY>',
'bizData': json.dumps(biz, ensure_ascii=False),
'reqId': f'PAY{int(time.time())}',
'reqTime': '<DEMO_ID>',
'signType': 'MD5',
'version': '1.0',
}
req['sign'] = gen_sign(req, 'MD5')javascript
const biz = {
"outBatchNo": "BT2604200CLVWV0C12312",
"payerAcctNo": "123456",
"num": 1,
"amount": 100,
"currency": "CNY",
"body": "测试",
"clientIp": "<IP_ADDRESS>",
"extParam": "12",
"remark": "测试",
"orderList": "[{\"outOrderNo\":\"Item<DEMO_ID>\",\"amount\":100,\"payeeAcctNo\":\"123123122\",\"body\":\"测试\"}]",
};
const req = {
apiKey: '<CONFIGURED_VALUE>',
bizData: JSON.stringify(biz),
reqId: 'PAY' + Date.now(),
reqTime: '<DEMO_ID>',
signType: 'MD5',
version: '1.0',
};
req.sign = genSign(req, 'MD5');json
{
"reqId": "<DEMO_ID>",
"reqTime": "<DEMO_ID>",
"version": "1.0",
"signType": "MD5",
"apiKey": "<DEMO_ID>",
"bizData": "{\"outBatchNo\":\"BT2604200CLVWV0C12312\",\"payerAcctNo\":\"123456\",\"num\":1,\"amount\":100,\"currency\":\"CNY\",\"body\":\"测试\",\"clientIp\":\"<IP_ADDRESS>\",\"extParam\":\"12\",\"remark\":\"测试\",\"orderList\":\"[{\\\"outOrderNo\\\":\\\"Item<DEMO_ID>\\\",\\\"amount\\\":100,\\\"payeeAcctNo\\\":\\\"123123122\\\",\\\"body\\\":\\\"测试\\\"}]\"}",
"sign": "<SIGNATURE>"
}响应示例
json
{
"code": "000000",
"msg": "请求成功",
"timestamp": "<DEMO_ID>",
"sign": "<SIGNATURE>",
"signType": "MD5",
"bizData": "{\"batchNo\":\"<DEMO_ID>\",\"extParam\":\"12\",\"orderList\":\"[{\\\"amount\\\":100,\\\"body\\\":\\\"测试\\\",\\\"feeType\\\":\\\"ACCOUNT\\\",\\\"mchFee\\\":0,\\\"note\\\":\\\"00\\\",\\\"orderNo\\\":\\\"1231231\\\",\\\"outOrderNo\\\":\\\"1231212123\\\",\\\"payeeAcctNo\\\":\\\"546461264\\\",\\\"payerAcctNo\\\":\\\"<DEMO_ID>\\\",\\\"realAmount\\\":100,\\\"state\\\":\\\"SUCCESS\\\"}]\",\"outBatchNo\":\"BT2604200E73OJ7D8BCF\",\"state\":\"SUCCESS\"}"
}结果判定口径
公共状态:code=000000 表示接口请求处理成功;非 000000 时按 msg 排查签名、参数或业务校验问题。
业务状态:如响应 bizData 内存在 state、status、result、batchNo、orderNo、reqNo 等字段,应以对应业务字段作为后续处理依据。
验签顺序:响应或通知中返回 sign 时,先验签再解析和入库 bizData。
异步场景:同步成功通常只代表请求受理,最终结果以回调通知或查询接口为准。
错误处理
签名失败:核对 apiKey、signType、密钥、参数排序、bizData 字符串化方式和字符编码。
参数错误:按本页请求参数表检查必填项、枚举值、金额单位、时间格式和单号唯一性。
业务失败:读取 code、msg 和 bizData 内业务字段,按接口语义修正后再重试。
网络超时或响应未知:不要直接判定业务失败,使用查询接口或平台后台核实后再处理。
接入注意事项
reqId 应保证每次请求唯一,便于排查和幂等处理。
bizData 必须作为 JSON 字符串参与签名;实际请求体中不要传 appSecret。
生产环境与沙箱环境的应用、密钥和数据通常相互隔离,联调时请确认使用对应环境配置。
金额字段如无特殊说明,按源文档口径以“分”为单位。
字段枚举、状态流转和条件必填规则以本页参数说明为准;源文档未说明的场景请联系平台确认。
