IBAN新增接口
说明:新增一条 IBAN 账户记录。若请求中传了 iban 则使用指定 IBAN(需校验格式和唯一性);若未传 iban 则从预生成的号码池中自动分配一个,并关联当前 api_account。
生产环境API URL:#/api/iban/add 测试环境API URL:https://ibantest.yabandpay.com/api/iban/add
Method:POST
Header:
Authorization: Bearer {api_account_token}
Content-Type: application/json
一、请求格式(统一)
| 字段 | 类型 | 描述 | 是否必填 |
|---|---|---|---|
| uid | string | API 账户唯一标识(对应 iban_api_account.uid) | 必填 |
| timestamp | integer | 请求 Unix 时间戳(秒)。服务器会比对当前时间,误差过大会被拒 | 必填 |
| nonce | string | 10 位随机字符串(用于防重放,每次请求唯一) | 必填 |
| sign | string | 签名,详见下方签名算法 | 必填 |
| data | object | 业务参数集,见下表 | 必填 |
1.1 data 对象(业务参数)
| Parameter | Type | Description | 是否必填 |
|---|---|---|---|
| request_id | string | 调用方请求编号(建议全局唯一,用于幂等和日志追踪,会在响应中原样回传) | 非必填 |
| customer_id | string | 客户唯一 ID(业务系统内的客户编号) | 必填 |
| customer_type | string | 客户类型:legal_entity 企业 / individual 个人,默认 legal_entity |
非必填 |
| holder_name | string | IBAN 持有人姓名/名称,不传则用 {customer_type}_{customer_id} 自动拼 |
非必填 |
| alternative_name | string | 别名/其他名称 | 非必填 |
| creditor_identifier | string | 债权人标识,不传则默认用 holder_name | 非必填 |
| iban | string | 指定的 NL IBAN。若传则会校验格式和唯一性;不传则从号码池自动分配 | 非必填 |
| access | integer | 访问权限:0=none 1=full 2=inbound 3=outbound,默认 1 | 非必填 |
| status | integer | 状态:0=inactive 1=active,默认 1 | 非必填 |
| remark | string | 备注 | 非必填 |
1.2 签名算法(HMAC-SHA256)
调用端计算步骤(必须严格按顺序):
- 原始请求参数(Body JSON)里移除
sign字段(role也不参与签名,若有的话)。 - 把
data对象内所有字段提升到外层,和uid / timestamp / nonce放在同一个平铺数组里。 - 对平铺后的数组按 key 做字典序
ksort()。 - 拼成
k1=v1&k2=v2&k3=v3形式的字符串。 - 用该账户的
secret_key作为密钥,用HMAC-SHA256计算签名,结果转小写就是sign。
签名公式:
sign = hash_hmac('sha256', implode('&', ksort(merge(data, {uid,timestamp,nonce})) ), secret_key)
签名示例(PHP 版本):
$secretKey = '你的账户 secret_key';
$body = [
'uid' => '900001',
'timestamp' => 1731926400,
'nonce' => 'Qe3CkH2xP8',
'data' => [
'request_id' => 'req_202411180049',
'customer_id' => 'CUST20260001',
'timezone' => 'Asia/Shanghai',
'customer_type' => 'legal_entity',
'holder_name' => 'Yabandpay B.V.',
],
];
$sign = getSignByYabandPayV3($body, $secretKey);
$body['sign'] = $sign;
二、请求示例
{
"uid": "900001",
"timestamp": 1731926400,
"nonce": "Qe3CkH2xP8",
"sign": "A1AC665F9B40F7C51212BCE080F5B987",
"data": {
"request_id": "req_202411180049",
"customer_id": "CUST20260001",
"customer_type": "legal_entity",
"holder_name": "Yabandpay B.V.",
"alternative_name": "YB HQ",
"creditor_identifier": "YABAND001",
"access": 1,
"status": 1,
"remark": "荷兰总部对公账户"
}
}
三、返回示例
成功(200)
{
"status": true,
"code": "200",
"data": {
"id": 1001,
"customer_type": "legal_entity",
"customer_id": "CUST20260001",
"holder_name": "Yabandpay B.V.",
"alternative_name": "YB HQ",
"creditor_identifier": "YABAND001",
"bic": "YABNNL22",
"iban": "NL08YABN0187654321",
"currency": "EUR",
"balance": "0.00",
"access": 1,
"access_label": "full",
"status": 1,
"status_label": "active",
"remark": "荷兰总部对公账户",
"api_account_id": 1,
"created_at": 1784851200,
"updated_at": 1784851200,
"request_id": "req_202411180049",
"response_id": "TRADE20260819XXXXXX"
},
"message": ""
}
失败示例(部分常见)
| code | 说明 |
|---|---|
| 401 | Header 缺失、Token 格式错、缺少 uid/sign/timestamp/nonce/data 等 |
| -1001 | 签名错误 |
| -1010 | API 账户不存在或未启用(中间件/账户已禁用) |
| -2001 | 账户库缓存为空或 uid 不在账户库中 |
| -3001 | 写库失败/记录不存在 |
| -3002 | 业务参数无效(customer_id/timezone 缺失等) |
| -3004 | NL IBAN Mod97 校验失败 |
| -3035 | IBAN 已存在 |
| -3036 | 来源 IP 不在白名单中 |
| -3100 | Token 与 uid 不匹配 |
| -1000 | IBAN 号码池已空,且未显式传 iban |
参数错误示例:
{
"status": false,
"code": "-3002",
"message": "The given data was invalid.",
"data": {}
}
IBAN 格式错误示例:
{
"status": false,
"code": "-3004",
"message": "invalid NL IBAN",
"data": {}
}
四、特殊说明
- 关于
verify.api.sign中间件:- 会验证 Header
Authorization: Bearer {token}是否与 uid 匹配; - 会校验 IP 白名单;
- 会重算签名并对比;
- 通过后会把
data中所有业务字段展开到 Request 顶层,并注入iban_api_user_info(账户详情数组)。
- 会验证 Header
- 关于自动分配 IBAN:
- 若不传
data.iban,接口会从iban_generated号码池中并发安全地取一条(FOR UPDATE SKIP LOCKED + 事务 + UPDATE 条件三重保险,保证不同账户不会拿到同一个); - 分配后立刻在
iban.api_account_id和iban_generated.api_account_id上都标记为当前 API 账户持有; - 号码池分配默认锁定 1800 秒(30 分钟),超时未使用会被定时任务释放。
- 若不传
- 关于 NL IBAN 格式(显式指定时):
- 校验规则:必须
NL开头,整体 Mod97-10 余数为 1; - 当前默认要求
YABN后面为01 + 8位数字(账号段总长度 10 位)。
- 校验规则:必须
- 调用方可通过
request_id做幂等:我们会在响应中原样回传,方便双方关联。