切换主题
登记簿信息变更
概述
本接口用于对指定开户业务记录发起登记簿资料变更。定位参数为开户业务记录 ID recordId,不使用 accountNo 推断来源记录。本文示例统一采用字符串形式传输 64 位 ID。
接口说明
登记簿信息变更 属于虚拟银行接口。调用方需按公共参数组装请求并完成签名;响应包含 sign 时,应先验签再解析 bizData。
| 接口名称 | 登记簿信息变更 |
|---|---|
| 请求方式 | POST |
| 正式地址 | https://pay.rscygroup.com/api/open/virtualBank/acct/changeApply |
| 沙箱地址 | https://pay-test.rscygroup.com/api/open/virtualBank/acct/changeApply |
| 签名方式 | MD5 ,按签名规则说明生成或校验 sign |
| 结果判定 | 先判断公共返回 code,成功后验签并解析 bizData;最终业务状态以业务字段、查询接口或异步通知为准 |
流程图
处理要点:
请求前先将业务字段组装为 bizData JSON 字符串,再和公共参数一起参与签名。
响应或通知包含 sign 时,应先按签名规则验签,再解析 bizData。
code=000000 表示接口请求处理成功,不等同于所有异步业务流程最终完成。
请求参数
用于对已经开户成功的指定业务记录发起资料变更。一个 accountNo 可能关联多条开户业务记录,因此本接口必须传入开户业务记录 ID recordId,系统据此确定账户、账户角色、通道和原始开户资料;不再使用 accountNo 定位变更来源。
本接口仅创建变更申请并返回待签约状态(state=5)。调用方随后需调用“变更确认”接口提交短信验证码,并通过“查询变更结果”接口或异步通知获取最终结果。
| 字段名 | 变量名 | 必填 | 类型 | 示例值 | 描述 |
|---|---|---|---|---|---|
| 开户业务记录 ID | recordId | 是 | String(19) | <DEMO_ID> | 本次要变更的开户业务记录 ID,即 VirtualBusinessRecord.id。必须是当前调用方名下、状态成功且支持变更的开户记录。建议按字符串传输,避免 JavaScript 丢失 64 位整数精度。 |
| 外部请求号 | outReqNo | 是 | String(32) | CHG<DEMO_ID> | 调用方生成的唯一请求号,不能与历史业务请求重复。 |
| 变更资料 | subjectInfo | 是 | Object | - | 本次变更字段。未传字段从 recordId 对应的开户资料继承;条件必填规则见下文。 |
填写原则:entPerFlag 必须与原开户记录一致,账户主体类型不允许变更。未发生变化的字段可以不传,系统会从指定开户记录的完整资料中继承。
| 场景 | 控制字段 | 条件必填说明 |
|---|---|---|
| 对公 | entPerFlag=E | modifyType 必填。支持 1-工商、2-法人、3-经办人、4-绑定账户、5-协议补签;多项使用英文竖线分隔,例如 1|2。 |
| 对公工商变更 | modifyType 含 1 | licenseImg、idCard1Img、idCard2Img、licenseName、licenseEffectBegin、licenseEffectEnd 必填。 |
| 对公法人变更 | modifyType 含 2 | licenseImg、idCard1Img、idCard2Img、idCardName、idCardNo、idCardEffectBegin、idCardEffectEnd、idCardPhone 必填。 |
| 对公经办人变更 | modifyType 含 3 | licenseImg、法人身份证正反面、agentUseCorpInfoFlag 必填;不复用法人信息时,还需提交经办人姓名、证件号、有效期、手机号及身份证正反面。 |
| 对公绑定账户变更 | modifyType 含 4 | settAccountNo、settAccountType、settAccountName、settAccountBankBranchCode、settAccountBankBranchName 必填;绑定对私账户时 settAccountPhone 必填。 |
| 对私 | entPerFlag=P | settAccountPhone 必填,且至少提交一项变更信息。涉及证件有效期时,开始日期、结束日期及身份证正反面必须同时提交;涉及绑定账户时,账号和户名必须同时提交。 |
| 字段名 | 变量名 | 必填 | 类型 | 示例值 | 描述 |
|---|---|---|---|---|---|
| 主体类型 | entPerFlag | 是 | String | P | E - 企业P - 个人 |
| 对公变更业务类型 | modifyType | 否 | - | 4 | 对公必传:1-工商信息变更,2-法人信息变更,3-经办人信息变更,4-绑定账户信息变更,5-协议补签;多个使用英文竖线分隔,例如 1|2。 |
| 电子记账簿类型 | eleAcctType | 是 | String | 1 | 1 - 基本户 |
| 法人/个人姓名 | idCardName | 否 | String | 张三 | 主体为企业时,modifyType 包含 2,法人信息变更,必填 |
| 法人/个人身份证号 | idCardNo | 否 | String | <ID_NUMBER> | 主体为企业时,modifyType 包含 2,法人信息变更,必填 |
| 法人/个人手机号 | idCardPhone | 否 | String | <MOBILE> | 主体为企业时,modifyType 包含 2,法人信息变更,必填 |
| 法人/个人身份证人像面图片链接 | idCard1Img | 否 | String | - | 必须外部可以访问主体为企业时,modifyType 包含 1,2,必填 |
| 法人/个人身份证国徽面图片链接 | idCard2Img | 否 | String | - | 必须外部可以访问主体为企业时,modifyType 包含 1,2,必填 |
| 身份证有效期开始时间 | idCardEffectBegin | 否 | String | 2020-05-20 | 格式 yyyy-MM-dd;主体为企业时,modifyType 包含 2,法人信息变更,必填 |
| 身份证有效期戒指时间 | idCardEffectEnd | 否 | - | - | 格式 yyyy-MM-dd;长期填 “长期”主体为企业时,modifyType 包含 2,法人信息变更,必填 |
| 身份证上的地址 | address | 是 | String | - | - |
| 绑定账户类型 | settAccountType | 否 | String | E | 主体为企业时,必填绑定账户类型;E - 对公P - 对私(个体户可选)modifyType 包含 4,绑定账户信息变更,必填 |
| 绑定账户号 | settAccountNo | 否 | String | 6217******** | 绑定银行账户;个人银行卡卡号或对公开户许可证账号modifyType 包含 4,绑定账户信息变更,必填 |
| 绑定账户名称 | settAccountName | 否 | String | 1AAC1231 | 绑定账户名称;个人姓名或对公营业执照名称modifyType 包含 4,绑定账户信息变更,必填 |
| 开户支行行号 | settAccountBankBranchCode | 否 | String | <DEMO_ID> | 开户支行行号modifyType 包含 4,绑定账户信息变更,账户类型为对公账户时,必填 |
| 开户支行行名 | settAccountBankBranchName | 否 | String | xxxxx支行 | 开户支行名称modifyType 包含 4,绑定账户信息变更,账户类型为对公账户时,必填 |
| 银行卡预留手机号 | settAccountPhone | 否 | String | <MOBILE> | 主体为个人时,必填 |
| 绑定账户行内外标识 | bindAcctInnerFlag | 否 | String | 0 | 0 - 行外,不是渤海银行;1 - 行内,是渤海银行;modifyType 包含 4,绑定账户信息变更,必填 |
| 职业编码 | profession | 否 | String | 29900 | 对私必填https://doc.weixin.qq.com/sheet/e3_ARYACwaiAB0CNRlsNdSJLQVijcdHo?scode=AIcABwchAAkf6gPXlxARYACwaiAB0&tab=BB08J2 |
| 企业类型 | entType | 否 | String | - | 主体为企业时,必填01 - 企业法人02 - 非法人企业03 - 有字号个体工商户 |
| 营业执照号 | licenseNo | 否 | String | 9142010XXXX | 主体为企业时,modifyType 包含 1,工商信息变更,必填 |
| 营业执照名称 | licenseName | 否 | String | 张三科技 | 主体为企业时,modifyType 包含 1,工商信息变更,必填 |
| 营业执照有效期开始时间 | licenseEffectBegin | 否 | String | 2025-11-11 | 主体为企业时,modifyType 包含 1,工商信息变更,必填 |
| 营业执照有效期截止时间 | licenseEffectEnd | 否 | String | 长期 | 主体为企业时,modifyType 包含 1,工商信息变更,必填 |
| 营业执照地址 | licenseAddress | 否 | String | - | 主体为企业时,modifyType 包含 1,工商信息变更,必填 |
| 营业执照图片链接 | licenseImg | 否 | String | - | 必须外部可以访问主体为企业时,modifyType 包含 1,2,必填 |
| 注册资金 | regCapital | 否 | String | - | - |
| 注册资金币种 | regCapCurr | 否 | String | CNY | - |
| 行业分类 | industryTpCd | 否 | String | B101 | 门类编码+后面对应的小类或者中类编码 |
| 是否用法人信息填充经办人 | agentUseCorpInfoFlag | 否 | String | 1 | 主体为企业时,必填默认填 1 |
| 是否用法人信息填充实际控制人 | ctlUseCorpInfoFlag | 否 | String | 1 | 主体为企业时,必填默认填 1 |
| 受益所有人信息 | befUseCorpInfoFlag | 否 | String | 1 | 主体为企业时,必填默认填 1 |
响应参数
| 字段名 | 变量名 | 必填 | 类型 | 示例值 | 描述 |
|---|---|---|---|---|---|
| 请求单号 | reqNo | 是 | String | REQ<DEMO_ID> | - |
| 外部请求单号 | outReqNo | 是 | String | <SIGNATURE> | 同请求传过来的单号 |
| 状态 | state | 是 | Number | - | 5-待签约。需继续调用变更确认接口;最终结果通过变更结果查询接口或异步通知获取。 |
请求示例
以下示例默认使用 MD5 作为演示模式。签名时先将公共参数按字段名升序排序并拼接为 key=value&key=value,再在原串末尾追加 &appSecret=... 后计算 MD5;生成 sign 后,实际请求体中不要传 appSecret。本页请求示例依赖签名规则说明中的公共签名实现。
bash
curl -X POST "https://pay.rscygroup.com/api/open/virtualBank/acct/changeApply" \
-H "Content-Type: application/json" \
-d '{
"apiKey": "<CONFIGURED_VALUE>",
"bizData": "{\"recordId\":\"<DEMO_ID>\",\"outReqNo\":\"CHG<DEMO_ID>\",\"subjectInfo\":{\"entPerFlag\":\"E\",\"modifyType\":\"4\",\"settAccountNo\":\"<DEMO_ID>\",\"settAccountName\":\"示例企业\",\"settAccountType\":\"E\",\"settAccountBankBranchCode\":\"<DEMO_ID>\",\"settAccountBankBranchName\":\"中国工商银行北京分行\"}}",
"sign": "<按签名规则生成>",
"signType": "MD5",
"reqId": "CHANGEAPPLY<DEMO_ID>",
"reqTime": "<DEMO_ID>",
"version": "1.0"
}'bash
curl -X POST "https://pay-test.rscygroup.com/api/open/virtualBank/acct/changeApply" \
-H "Content-Type: application/json" \
-d '{
"apiKey": "<CONFIGURED_VALUE>",
"bizData": "{\"recordId\":\"<DEMO_ID>\",\"outReqNo\":\"CHG<DEMO_ID>\",\"subjectInfo\":{\"entPerFlag\":\"E\",\"modifyType\":\"4\",\"settAccountNo\":\"<DEMO_ID>\",\"settAccountName\":\"示例企业\",\"settAccountType\":\"E\",\"settAccountBankBranchCode\":\"<DEMO_ID>\",\"settAccountBankBranchName\":\"中国工商银行北京分行\"}}",
"sign": "<按签名规则生成>",
"signType": "MD5",
"reqId": "CHANGEAPPLY<DEMO_ID>",
"reqTime": "<DEMO_ID>",
"version": "1.0"
}'复用签名规则说明中的 genSign / verifySign 通用方法。
java
Map<String, Object> subjectInfo = new LinkedHashMap<>();
subjectInfo.put("entPerFlag", "E");
subjectInfo.put("modifyType", "4");
subjectInfo.put("settAccountNo", "<DEMO_ID>");
subjectInfo.put("settAccountName", "示例企业");
subjectInfo.put("settAccountType", "E");
subjectInfo.put("settAccountBankBranchCode", "<DEMO_ID>");
subjectInfo.put("settAccountBankBranchName", "中国工商银行北京分行");
Map<String, Object> biz = new LinkedHashMap<>();
biz.put("recordId", "<DEMO_ID>");
biz.put("outReqNo", "CHG<DEMO_ID>");
biz.put("subjectInfo", subjectInfo);
Map<String, String> req = new LinkedHashMap<>();
req.put("apiKey", "<API_KEY>");
req.put("bizData", mapper.writeValueAsString(biz));
req.put("reqId", "CHANGEAPPLY" + 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 = [
'recordId' => '<DEMO_ID>',
'outReqNo' => 'CHG<DEMO_ID>',
'subjectInfo' => [
'entPerFlag' => 'E',
'modifyType' => '4',
'settAccountNo' => '<DEMO_ID>',
'settAccountName' => '示例企业',
'settAccountType' => 'E',
'settAccountBankBranchCode' => '<DEMO_ID>',
'settAccountBankBranchName' => '中国工商银行北京分行',
],
];
$req = [
'apiKey' => '<API_KEY>',
'bizData' => json_encode($biz, JSON_UNESCAPED_UNICODE),
'reqId' => 'CHANGEAPPLY' . time(),
'reqTime' => '<DEMO_ID>',
'signType' => 'MD5',
'version' => '1.0',
];
$req['sign'] = $demo->genSign($req);python
biz = {
"recordId": "<DEMO_ID>",
"outReqNo": "CHG<DEMO_ID>",
"subjectInfo": {
"entPerFlag": "E",
"modifyType": "4",
"settAccountNo": "<DEMO_ID>",
"settAccountName": "示例企业",
"settAccountType": "E",
"settAccountBankBranchCode": "<DEMO_ID>",
"settAccountBankBranchName": "中国工商银行北京分行",
},
}
req = {
"apiKey": "<CONFIGURED_VALUE>",
"bizData": json.dumps(biz, ensure_ascii=False, separators=(",", ":")),
"reqId": f"CHANGEAPPLY{int(time.time())}",
"reqTime": "<DEMO_ID>",
"signType": "MD5",
"version": "1.0",
}
req["sign"] = gen_sign(req, "MD5")javascript
const biz = {
recordId: "<DEMO_ID>",
outReqNo: "CHG<DEMO_ID>",
subjectInfo: {
entPerFlag: "E",
modifyType: "4",
settAccountNo: "<DEMO_ID>",
settAccountName: "示例企业",
settAccountType: "E",
settAccountBankBranchCode: "<DEMO_ID>",
settAccountBankBranchName: "中国工商银行北京分行",
},
};
const req = {
apiKey: "<CONFIGURED_VALUE>",
bizData: JSON.stringify(biz),
reqId: "CHANGEAPPLY" + Date.now(),
reqTime: "<DEMO_ID>",
signType: "MD5",
version: "1.0",
};
req.sign = genSign(req, "MD5");json
{
"apiKey": "<API_KEY>",
"bizData": "{\"recordId\":\"<DEMO_ID>\",\"outReqNo\":\"CHG<DEMO_ID>\",\"subjectInfo\":{\"entPerFlag\":\"E\",\"modifyType\":\"4\",\"settAccountNo\":\"<DEMO_ID>\",\"settAccountName\":\"示例企业\",\"settAccountType\":\"E\",\"settAccountBankBranchCode\":\"<DEMO_ID>\",\"settAccountBankBranchName\":\"中国工商银行北京分行\"}}",
"sign": "<SIGNATURE>",
"signType": "MD5",
"reqId": "CHANGEAPPLY<DEMO_ID>",
"reqTime": "<DEMO_ID>",
"version": "1.0"
}响应示例
json
{
"code": "000000",
"msg": "请求成功",
"timestamp": "<DEMO_ID>",
"sign": "<SIGNATURE>",
"signType": "MD5",
"bizData": "{\"reqNo\":\"REQ<DEMO_ID>\",\"outReqNo\":\"CHG<DEMO_ID>\",\"state\":5}"
}结果判定口径
公共状态:code=000000 表示接口请求处理成功;非 000000 时按 msg 排查签名、参数或业务校验问题。
业务状态:如响应 bizData 内存在 state、status、result、batchNo、orderNo、reqNo 等字段,应以对应业务字段作为后续处理依据。
验签顺序:响应或通知中返回 sign 时,先验签再解析和入库 bizData。
异步场景:同步成功通常只代表请求受理,最终结果以回调通知或查询接口为准。
错误处理
签名失败:核对 apiKey、signType、密钥、参数排序、bizData 字符串化方式和字符编码。
参数错误:重点检查 recordId 是否为当前调用方名下成功的开户业务记录、outReqNo 是否唯一,以及 subjectInfo 的条件必填字段和枚举值。
业务失败:读取 code、msg 和 bizData 内业务字段,按接口语义修正后再重试。
网络超时或响应未知:不要直接判定业务失败,使用查询接口或平台后台核实后再处理。
接入注意事项
reqId 应保证每次请求唯一,便于排查和幂等处理。
bizData 必须作为 JSON 字符串参与签名;实际请求体中不要传 appSecret。
生产环境与沙箱环境的应用、密钥和数据通常相互隔离,联调时请确认使用对应环境配置。
recordId 可从开户申请、开户确认、开户结果查询的 bizData 或开户异步通知中取得。该值是开户业务记录 ID,不是平台账户号,也不是本次变更生成的 reqNo。
字段枚举、状态流转和条件必填规则以本页参数说明为准;源文档未说明的场景请联系平台确认。
