Skip to content

登记簿分账退款

概述 ​

本文按 APP 支付接口模版整理,保留原接口字段含义,并统一补充签名说明、正式/沙箱示例、多语言请求示例和结果判定口径。

接口说明 ​

登记簿分账退款 属于虚拟银行接口。调用方需按公共参数组装请求并完成签名;响应包含 sign 时,应先验签再解析 bizData。

接口名称登记簿分账退款
请求方式POST
正式地址https://pay.rscygroup.com/api/open/virtualBank/division/refund
沙箱地址https://pay-test.rscygroup.com/api/open/virtualBank/division/refund
签名方式MD5 / RSA2,按签名规则说明生成或校验 sign
结果判定先判断公共返回 code,成功后验签并解析 bizData;最终业务状态以业务字段、查询接口或异步通知为准

流程图 ​

处理要点:

  • 请求前先将业务字段组装为 bizData JSON 字符串,再和公共参数一起参与签名。

  • 响应或通知包含 sign 时,应先按签名规则验签,再解析 bizData。

  • code=000000 表示接口请求处理成功,不等同于所有异步业务流程最终完成。

请求参数 ​

应用场景

  • 交易针对已完成付款的直接支付的订单金额退款资金按照订单信息从收款方登记薄划转至付款方登记簿

  • 仅支持按照子订单进行退款

  • 只能针对成功的订单进行退款

  • 退款需要验证码

  • 请先调用验证码接口获取验证码(验证码需要发给收款方)

字段名变量名必填类型示例值描述
外部批次号outBatchNo否StringAT12123123外部批次号(和平台批次号二选一)
平台批次号batchNo否StringRX123123123平台批次号(和外部批次号二选一)
子订单外部订单号outOrderNos是StringIT<DEMO_ID>子订单外部订单号(下单的时候传入子订单中外部订单号参数)多个用,分割
渠道扩展参数channelExtra是String-渠道扩展参数
备注remark否String测试退款备注
字段名变量名必填类型示例值描述
短信验证码smsCode是String260715短信验证码调用短信验证码接口会返回
短信流水号smsFlowNo是StringXS<DEMO_ID>短信流水号调用短信验证码接口会返回

响应参数 ​

字段名变量名必填类型示例值描述
外部批次号outBatchNo是StringAT12123123接口外部批次号最大长度不超过32位
平台批次号batchNo是StirngS1<DEMO_ID>
状态state是String-状态INIT:初始化PROCESSING:处理中WAIT_CONFIRM:待确认SUCCESS:成功PART_REFUND:部分退款成功REFUND:退款成功CLOSE:关闭FAIL:失败
订单明细orderList是String--
描述note否String描述当有报错返回时候会返回报错信息
字段名变量名必填类型示例值描述
外部订单号outOrderNo是StringA123123外部订单号长度不超过32位
订单标题body是String测试订单订单标题
金额amount是Long100金额(单位分,保留整数)示例:100 表示 1元
退款金额refundAmount是Long100退款金额(单位分,保留整数)示例:100 表示 1元
手续费扣费方式feeType是String-续费扣费方式ORDER- 订单内扣;ACCOUNT - 外扣
付款方账号payeyAcctNo是String1AAC1231付款方账号 (调用开户接口获取)
收款方账号payeeAcctNo是String1AAC1231收款方账号 (调用开户接口获取)
状态state是StringINIT状态INIT:初始化PROCESSING:处理中SUCCESS:成功REFUND:退款成功CLOSE:关闭FAIL:失败
扩展参数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/refund" \
  -H "Content-Type: application/json" \
  -d '{
    "appId": "<CONFIGURED_VALUE>",
    "bizData": "{\"outBatchNo\":\"BT2604200DD112312312\",\"outOrderNos\":\"Item<DEMO_ID>\",\"channelExtra\":\"{\\\"smsCode\\\":\\\"619930\\\",\\\"smsFlowNo\\\":\\\"<DEMO_ID>\\\"}\"}",
    "sign": "<按签名规则生成>",
    "signType": "MD5",
    "reqId": "REFUND<DEMO_ID>",
    "reqTime": "<DEMO_ID>",
    "version": "1.0"
  }'
bash
curl -X POST "https://pay-test.rscygroup.com/api/open/virtualBank/division/refund" \
  -H "Content-Type: application/json" \
  -d '{
    "appId": "<CONFIGURED_VALUE>",
    "bizData": "{\"outBatchNo\":\"BT2604200DD112312312\",\"outOrderNos\":\"Item<DEMO_ID>\",\"channelExtra\":\"{\\\"smsCode\\\":\\\"619930\\\",\\\"smsFlowNo\\\":\\\"<DEMO_ID>\\\"}\"}",
    "sign": "<按签名规则生成>",
    "signType": "MD5",
    "reqId": "REFUND<DEMO_ID>",
    "reqTime": "<DEMO_ID>",
    "version": "1.0"
  }'

复用签名规则说明中的 genSign / verifySign 通用方法。

java
Map<String, Object> biz = new LinkedHashMap<>();
biz.put("outBatchNo", "BT2604200DD112312312");
biz.put("outOrderNos", "Item<DEMO_ID>");
biz.put("channelExtra", "{\"smsCode\":\"619930\",\"smsFlowNo\":\"<DEMO_ID>\"}");

Map<String, String> req = new LinkedHashMap<>();
req.put("appId", "<API_KEY>");
req.put("bizData", mapper.writeValueAsString(biz));
req.put("reqId", "REFUND" + 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' => 'BT2604200DD112312312',
    'outOrderNos' => 'Item<DEMO_ID>',
    'channelExtra' => '{"smsCode":"619930","smsFlowNo":"<DEMO_ID>"}',
];

$req = [
    'appId' => '<API_KEY>',
    'bizData' => json_encode($biz, JSON_UNESCAPED_UNICODE),
    'reqId' => 'REFUND' . time(),
    'reqTime' => '<DEMO_ID>',
    'signType' => 'MD5',
    'version' => '1.0',
];
$req['sign'] = $demo->genSign($req);
python
biz = {
    'outBatchNo': 'BT2604200DD112312312',
    'outOrderNos': 'Item<DEMO_ID>',
    'channelExtra': '{"smsCode":"619930","smsFlowNo":"<DEMO_ID>"}',
}
req = {
    'appId': '<API_KEY>',
    'bizData': json.dumps(biz, ensure_ascii=False),
    'reqId': f'REFUND{int(time.time())}',
    'reqTime': '<DEMO_ID>',
    'signType': 'MD5',
    'version': '1.0',
}
req['sign'] = gen_sign(req, 'MD5')
javascript
const biz = {
  "outBatchNo": "BT2604200DD112312312",
  "outOrderNos": "Item<DEMO_ID>",
  "channelExtra": "{\"smsCode\":\"619930\",\"smsFlowNo\":\"<DEMO_ID>\"}",
};
const req = {
  appId: '<CONFIGURED_VALUE>',
  bizData: JSON.stringify(biz),
  reqId: 'REFUND' + 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",
  "appId": "<DEMO_ID>",
  "bizData": "{\"outBatchNo\":\"BT2604200DD112312312\",\"outOrderNos\":\"Item<DEMO_ID>\",\"channelExtra\":\"{\\\"smsCode\\\":\\\"619930\\\",\\\"smsFlowNo\\\":\\\"<DEMO_ID>\\\"}\"}",
  "sign": "<SIGNATURE>"
}

响应示例 ​

json
{
  "code": "000000",
  "msg": "请求成功",
  "timestamp": "<DEMO_ID>",
  "sign": "<SIGNATURE>",
  "signType": "MD5",
  "bizData": "{\"batchNo\":\"BH<DEMO_ID>\",\"extParam\":\"12\",\"orderList\":\"[{\\\"amount\\\":100,\\\"body\\\":\\\"测试\\\",\\\"feeType\\\":\\\"ACCOUNT\\\",\\\"mchFee\\\":0,\\\"note\\\":\\\"00\\\",\\\"orderNo\\\":\\\"BHI<DEMO_ID>\\\",\\\"outOrderNo\\\":\\\"Item<DEMO_ID>\\\",\\\"payeeAcctNo\\\":\\\"VC970063\\\",\\\"payerAcctNo\\\":\\\"VC960879\\\",\\\"realAmount\\\":100,\\\"state\\\":\\\"REFUND\\\"}]\",\"outBatchNo\":\"BT2604200DD1J8764330\",\"state\":\"REFUND\"}"
}

结果判定口径 ​

  • 公共状态:code=000000 表示接口请求处理成功;非 000000 时按 msg 排查签名、参数或业务校验问题。

  • 业务状态:如响应 bizData 内存在 state、status、result、batchNo、orderNo、reqNo 等字段,应以对应业务字段作为后续处理依据。

  • 验签顺序:响应或通知中返回 sign 时,先验签再解析和入库 bizData。

  • 异步场景:同步成功通常只代表请求受理,最终结果以回调通知或查询接口为准。

错误处理 ​

  • 签名失败:核对 appId、signType、密钥、参数排序、bizData 字符串化方式和字符编码。

  • 参数错误:按本页请求参数表检查必填项、枚举值、金额单位、时间格式和单号唯一性。

  • 业务失败:读取 code、msg 和 bizData 内业务字段,按接口语义修正后再重试。

  • 网络超时或响应未知:不要直接判定业务失败,使用查询接口或平台后台核实后再处理。

接入注意事项 ​

  • reqId 应保证每次请求唯一,便于排查和幂等处理。

  • bizData 必须作为 JSON 字符串参与签名;实际请求体中不要传 appSecret。

  • 生产环境与沙箱环境的应用、密钥和数据通常相互隔离,联调时请确认使用对应环境配置。

  • 金额字段如无特殊说明,按源文档口径以“分”为单位。

  • 字段枚举、状态流转和条件必填规则以本页参数说明为准;源文档未说明的场景请联系平台确认。