01
三类主体一次覆盖
个体工商户与企业走标准入网通道;小微走独立通道,必填项更少,适用于个人经营者。
etpsAttr: 个体 / 企业 / 小微 ↗一次对接,完成个体工商户、企业、小微三类主体的商户入网;开通收款能力后,用同一套签名完成支付下单、结果通知、订单及账户余额查询。
平台提供商户进件、聚合支付、支付与资金结果通知、订单与资金查询、余额分账、结算方向配置及自助结算。退款、资金账户余额提现及对账文件暂未开放,查看能力边界。
{
"app_id": "ak_********",
"timestamp": "1786777149",
"nonce": "dev_e57c46f3ec3e",
"channel": "yibao",
"merchantNo": "你的商户号",
"orderAmount": "0.01",
"payWay": "USER_SCAN",
"sign": "按签名规则计算"
}
{
"code": 1,
"msg": "success",
"time": "1786777149",
"data": {
"response_arr": "二维码内容",
"pay_way": "USER_SCAN",
"order_id": "示例订单号"
}
}
// 剔除 sign 和空值,按键名 ASCII 升序拼接
app_id=ak_********&channel=yibao&merchantNo=你的商户号&nonce=dev_e57c46f3ec3e&orderAmount=0.01&payWay=USER_SCAN×tamp=1786777149
缺省使用 HMAC-SHA256。正式调用需使用当前时间和有效凭据。
Capability
从准备商户资料、提交入网申请,到开通支付并确认交易结果,按照下方步骤完成接入。
01
个体工商户与企业走标准入网通道;小微走独立通道,必填项更少,适用于个人经营者。
etpsAttr: 个体 / 企业 / 小微 ↗02
地区编码、行业类目(MCC)、银行与支行查询接口直接可用,无需自行维护与同步字典。
地区 · MCC · 银行 · 支行 ↗03
进件进度、商户状态、资料变更进度均可主动查询,便于在你方系统内展示并驱动后续流程。
registerQry / merchantStatusQry ↗04
审核完成后异步推送至进件时指定的回调地址;同时保留查询接口,作为回调丢失时的兜底。
callbackurl + 主动查询兜底 ↗05
商户状态为「成功」后,用同一个 merchantNo 调下单接口即可收款,支持扫码、公众号、生活号、小程序、微信 SDK 和支付宝 H5 支付。
06
下单时选择自动处理商户余款,或保留余款待后续处理。使用前请确认应用已开通的能力范围。
prePay · 下单参数说明 ↗Integration
无需 SDK,标准 HTTP + 签名即可完成对接。已有签名逻辑的项目,通常只增加一个签名函数与数个请求。
提交接入申请,平台下发 app_id 与密钥:HMAC-SHA256 轨使用共享密钥;RSA2 轨需登记你方公钥。
剔除 sign 与空值,按键名 ASCII 升序拼成 k=v&k=v,再用密钥加签。请求须携带 timestamp 与 nonce。
提交主体资料,etpsAttr 区分:1 个体、2 企业、3 小微。审核结果推送至回调地址,也可主动查询进度。
商户开通收款能力后,使用 prePay 获取二维码或支付调起参数,并通过通知或订单查询确认交易结果。
Authentication
所有开放接口(含 upload)均需请求签名。以下公共参数与业务参数平铺提交;建议复用公共客户端。
01 · 公共请求参数
| 参数 | 类型 | 必填 / 位置 | 说明 |
|---|---|---|---|
app_id | string | 是 | 应用标识;应用须启用并满足本接口 scope 与来源 IP 白名单。 |
sign_type | string | 否 | 本次签名算法;须与应用开通的签名方式一致。 取值:HMAC-SHA256 / RSA2。 默认:"HMAC-SHA256"。 |
timestamp | string | 是 | 每次请求生成当前秒级时间戳,允许偏差 ±300 秒;兼容毫秒时间戳。 |
nonce | string | 是 | 每次请求生成新的随机串,同一应用 600 秒内不可重复。 |
sign | string | 是 | 对全部公共参数、业务参数和 URL 查询参数签名;剔除 sign 自身及空字符串/null。数组转未转义中文和斜杠的 JSON;保留值内的空格与引号。 |
公共参数与业务参数平铺在同一层。channel 是部分接口的业务字段,不是每个接口都必填;不需要用户 token,app_secret 和私钥始终留在你方服务器。
应用须具备接口调用权限。scope 使用小写接口标识,例如 open.ping/index、open.merchant/prepay;授权范围内的接口方可调用。
02 · 每次调用的固定流程
选择具体接口与业务参数 → 生成当前 timestamp 和全新 nonce → 合并公共参数与业务参数 → 计算 sign → 提交请求 → 同时检查 HTTP 状态码和 code。Ping 是联调自检,无需在每次业务请求前调用。
03 · 公共响应结构
{
"code": 1,
"msg": "提示信息",
"time": "秒级时间戳字符串",
"data": {}
}
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
code | integer | 是 | 1 成功,0 失败。HTTP 状态码需独立判断。 取值:0 / 1。 |
msg | string | 是 | 本次处理提示或失败原因;当前没有统一的细分业务错误码。 |
time | string | 是 | Unix 秒级时间戳,以字符串返回。 |
data | 按接口约定 | 是 | 业务数据,类型由具体接口定义;可能为对象、数组、字符串或 null。 |
data 的内容和类型由各接口单独定义,可能是对象、数组、字符串或 null。请先检查 code,再按对应接口说明处理 data。
04 · HTTP 与业务结果
| HTTP | code | 含义 |
|---|---|---|
| 200 | 1 | 本次接口处理成功;申请受理不等于业务最终完成。 |
| 200 | 0 | 业务处理失败,请检查 msg 与 data。 |
| 401 | 0 | 公共参数、凭证、签名、IP、scope、时间戳或 nonce 校验失败。 |
| 503 | 0 | 服务暂不可用,请稍后重试;本次请求未受理。 |
05 · 复用公共客户端
下载 PHP 客户端并在你方服务器保存为 OpenApiClient.php。之后每个接口只需更换路径和业务参数;签名、时间戳、nonce、JSON 提交与响应解析统一处理。
下载公共 PHP 客户端 ↗ · 下载开放平台 OpenAPI 规范 ↗
<?php
require __DIR__ . '/OpenApiClient.php';
$client = new OpenApiClient('https://你的域名', '你的 app_id', '你的 app_secret');
$result = $client->request('/api/open.ping/index', ['echo' => 'hello']);
$httpStatus = $result['http_status'];
$body = $result['body'];
// 先检查 HTTP,再检查 $body['code'];业务结果在 $body['data']。
文件上传使用 multipart,文件内容不参与签名;地区查询的筛选值位于 URL,使用公共客户端的第三个 query 参数提交。
01
取本次请求的全部参数(公共 + 业务),按下面四步加工。两端任何一步不一致,都会落到「签名校验失败」。
① 剔除 sign 本身,以及值为 "" 或 null 的参数;0 是有效值,必须保留。
② 数组 / 对象值先序列化为 JSON 字符串(中文不转义、斜杠不转义),再参与拼接。
③ 全部键名按 ASCII 升序排列。
④ 拼成 k1=v1&k2=v2,字段之间用 & 连接,不做 URL 编码。
参与签名的是传输解码后的原始参数值,空格、引号和换行均保留;签名前不要裁剪空格、去除标签或做 HTML 转义。
app_id=ak_1f2e3d4c5b6a&channel=yibao&merchant={"mchName":"河南某某商贸有限公司","etpsAttr":"2"}&nonce=9f3c1a2b4d5e6f70&sign_type=HMAC-SHA256×tamp=1786777149
签名串里的键序由 ASCII 升序决定,与你发送 JSON 时的书写顺序无关;但嵌套对象内部的键序会影响 JSON 字符串本身,建议固定字段顺序生成。
02
HMAC-SHA256 用 app_secret 加签,适合快速对接;RSA2(SHA256withRSA)用你的私钥加签、平台用你登记的公钥验签,适合需要抗抵赖的正式接入。
function buildSignString(array $params): string
{
unset($params['sign']); // ① 剔除 sign
$filtered = [];
foreach ($params as $k => $v) {
if ($v === '' || $v === null) {
continue; // ① 空值不参与签名(0 参与)
}
if (is_array($v)) { // ② 数组 / 对象转 JSON
$v = json_encode($v, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
}
$filtered[$k] = (string)$v;
}
ksort($filtered); // ③ 键名 ASCII 升序
$pairs = [];
foreach ($filtered as $k => $v) {
$pairs[] = $k . '=' . $v; // ④ k=v 拼接,不做 URL 编码
}
return implode('&', $pairs);
}
function sign(array $params, string $appSecret): array
{
$params['timestamp'] = (string)time();
$params['nonce'] = bin2hex(random_bytes(16));
$params['sign'] = base64_encode(
hash_hmac('sha256', buildSignString($params), $appSecret, true)
);
return $params;
}
// 私钥只放在你方服务器上,不随请求发送 $params['sign_type'] = 'RSA2'; $params['timestamp'] = (string)time(); $params['nonce'] = bin2hex(random_bytes(16)); $signStr = buildSignString($params); $key = openssl_pkey_get_private($yourPrivateKeyPem); openssl_sign($signStr, $signature, $key, OPENSSL_ALGO_SHA256); $params['sign'] = base64_encode($signature);
两条轨的差别只在最后一步算法,待签名串完全一致。切换签名方式后,记得同步更新 sign_type,否则会被判定为「不支持的签名方式」。
03
签名逻辑写完后,先用 ping 打通链路,再进入业务接口联调。
<?php
$appSecret = '替换为你的 app_secret';
$params = [
'app_id' => '替换为你的 app_id',
'sign_type' => 'HMAC-SHA256',
'timestamp' => (string)time(),
'nonce' => bin2hex(random_bytes(16)),
'echo' => ' A&B 中文 ', // 原文参与签名,也会原样返回
];
ksort($params);
$pairs = [];
foreach ($params as $key => $value) {
$pairs[] = $key . '=' . $value;
}
$params['sign'] = base64_encode(
hash_hmac('sha256', implode('&', $pairs), $appSecret, true)
);
$ch = curl_init('https://你的域名/api/open.ping/index');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CONNECTTIMEOUT => 5,
CURLOPT_TIMEOUT => 15,
CURLOPT_HTTPHEADER => ['Content-Type: application/json'],
CURLOPT_POSTFIELDS => json_encode($params, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES),
]);
$body = curl_exec($ch);
if ($body === false) {
throw new RuntimeException(curl_error($ch));
}
$httpStatus = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
echo 'HTTP ' . $httpStatus . PHP_EOL . $body;
在服务端 PHP 中运行,替换域名与应用凭证;不要把 app_secret 放进浏览器代码。示例每次生成当前时间戳和新 nonce,echo 也参与签名。
04
请核对公共参数类型、应用凭据、接口权限、时间戳、nonce 及签名。鉴权失败返回 HTTP 401,服务暂不可用返回 HTTP 503;响应体均为 { code: 0, msg, time, data: null }。
| 返回 msg | 可能原因 | HTTP |
|---|---|---|
| 公共参数 XXX 类型不正确 | 公共参数误传了数组或对象,应按参数表提交标量值 | 401 |
| app_id 不能为空 | 未传 app_id,或传了空串 | 401 |
| 应用不存在或已禁用 | app_id 拼错,或该应用已被停用 | 401 |
| IP 不在白名单内 | 服务器出口 IP 与登记的白名单不一致(含 NAT 出口变化) | 401 |
| 该接口未授权 | 所调接口不在该应用的 scope 授权范围内 | 401 |
| 不支持的签名方式: XXX | sign_type 与开通的签名方式不一致 | 401 |
| 缺少签名 sign | 参数中没有 sign 字段 | 401 |
| timestamp 过期或非法 | 服务器时间不准,或重试时沿用了旧时间戳 | 401 |
| 缺少 nonce | 未传 nonce | 401 |
| 未配置接入方公钥 | 使用 RSA2 前须登记你方应用公钥 | 401 |
| 签名校验失败 | 待签名串与平台不一致:空值未剔除、数组未转 JSON、键序不同、值被 URL 编码、密钥不匹配 | 401 |
| nonce 已使用过(疑似重放) | 同一 nonce 在 600 秒内被重复使用;每次请求及重试都应生成新 nonce | 401 |
| 防重放服务暂不可用,请稍后重试 | 本次请求未受理;稍后使用新的 timestamp、nonce 和签名重试 | 503 |
签名失败时,请核对实际发送的参数与待签名参数是否一致,并检查排序、空值、JSON 编码及应用凭据。
API Reference
29 项接口参考,按需查看请求参数、调用示例、返回结果及通知要求。标记“暂未开放”的能力请先联系平台确认。
没有找到匹配的接口,请尝试其他关键词或切换分类。
公共协议见“公共参数与签名”。本接口的业务字段、完整请求和业务响应定义如下。
使用本接口验证应用凭据与签名。推荐 POST JSON,也支持 POST 表单或 GET;无需 channel,不会发起支付。
业务参数
| 参数 | 类型 | 必填 / 位置 | 说明 |
|---|---|---|---|
echo | string | 否 | 按原文签名并原样返回;省略返回空字符串。显式 null、数组、对象、数字或布尔值不接受。 默认:""。 |
上表只列业务字段;完整请求还包含 app_id、timestamp、nonce、sign,sign_type 可省略。先合并全部参数,再计算签名。
请替换示例中的域名、应用凭据及业务数据;时间戳、随机串和签名由公共客户端生成。
完整请求示例
POST /api/open.ping/index
Content-Type: application/json
{
"app_id": "ak_your_app_id",
"sign_type": "HMAC-SHA256",
"timestamp": "运行时生成",
"nonce": "每次请求生成新随机串",
"echo": "hello",
"sign": "由公共客户端计算"
}
业务错误与处理
| msg / 情况 | HTTP | 处理说明 |
|---|---|---|
| echo 必须为字符串 | 200 | 将 echo 改为字符串,或者省略该字段。 |
HTTP 200 时仍需检查 code;HTTP 401 请核对应用凭据与签名,HTTP 503 请稍后重试。
响应示例
{
"code": 1,
"msg": "验签通过,连接正常",
"time": "1792740000",
"data": {
"app_id": "ak_your_app_id",
"app_name": "接入方名称",
"pong": true,
"echo": "hello"
}
}
业务响应字段
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
data.app_id | string | 是 | 当前应用标识。 |
data.app_name | string | 是 | 当前应用名称。 |
data.pong | boolean | 是 | 鉴权与本次处理成功时为 true。 取值:True。 |
data.echo | string | 是 | 原始字符串,缺省为空。 |
公共协议见“公共参数与签名”。本接口的业务字段、完整请求和业务响应定义如下。
提交成功后保存 outMchNo,使用 registerQry 查询进件结果。code=1 表示申请已受理。
按主体类型提交完整资料:企业、个体提供营业执照资料,小微按对应要求提交身份和门店资料。
商户资料含特殊符号时,请先联系平台确认填写规范。
仅可操作或查询当前应用所属的商户和申请记录。
应用须先配置产品及约定费用;进件时逐项提交相同费用,不能加价或减价。示例费用仅作结构演示,请替换为所属应用各产品的当前配置;配置变化后请重新核对并提交。
业务参数
| 参数 | 类型 | 必填 / 位置 | 说明 |
|---|---|---|---|
channel | string | 是 | 开放平台文档约定的渠道。 取值:yibao。 |
merchant | object | 是 | 商户基本资料;数字及日期字段按字符串提交。 |
merchant.mchName | string | 是 | 商户全称。 最大 255 个字符。 |
merchant.mchNameAbbr | string | 是 | 商户简称。 最大 255 个字符。 |
merchant.etpsAttr | string | 是 | 主体类型:1 个体工商户,2 企业,3 小微。 取值:1 / 2 / 3。 |
merchant.servicePhone | string | 是 | 客服电话,手机号或含区号的固定电话。 |
merchant.mccCode | string | 是 | 三级行业项的 id,取 mccList 返回的 id/value;与返回的 mcc_code 字段区别。 |
merchant.contactName | string | 是 | 联系人姓名。 最大 255 个字符。 |
merchant.contactPhone | string | 是 | 联系人电话。 |
merchant.contactEmail | string | 否 | 联系人邮箱。 |
merchant.provinceCode | string | 条件 | 注册地址省编码;企业/个体必填。 |
merchant.cityCode | string | 条件 | 注册地址市编码;企业/个体必填。 |
merchant.districtCode | string | 条件 | 注册地址区县编码;企业/个体必填。 |
merchant.provinceName | string | 是 | 注册地址省名称。 |
merchant.cityName | string | 否 | 注册地址市名称。 |
merchant.districtName | string | 否 | 注册地址区县名称。 |
merchant.addressReg | string | 是 | 注册地址详细地址,2–255 字符。 最大 255 个字符。 |
merchant.longitude | string | 否 | 经度。 |
merchant.latitude | string | 否 | 纬度。 |
legal | object | 是 | 法人资料。 |
legal.artifName | string | 是 | 法人姓名。 |
legal.artifCertifType | string | 否 | 证件类型,当前校验仅支持身份证 00。 取值:00。 默认:"00"。 |
legal.artifCertifId | string | 是 | 法人身份证号。 |
legal.artifPhone | string | 是 | 法人手机号。 |
legal.certifIdStartDate | string | 是 | 有效期开始日期,YYYY-MM-DD。 |
legal.certifIdEndDate | string | 是 | 有效期结束日期,YYYY-MM-DD;长期证件使用“长期”。 |
business_license | object | 条件 | 企业/个体需提供,小微可省略。 |
business_license.businessLicense | string | 是 | 营业执照编号。 |
business_license.businessLicenseType | string | 否 | 证件类型,当前仅支持营业执照 01。 取值:01。 |
business_license.businessLicenseStartDate | string | 是 | 营业执照有效期开始,YYYY-MM-DD。 |
business_license.businessLicenseEndDate | string | 是 | 营业执照有效期结束,YYYY-MM-DD 或“长期”。 |
settlement | object | 是 | 结算资料。 |
settlement.accountType | string | 是 | 0 对公账户,1 银行借记卡。 取值:0 / 1。 |
settlement.accountNo | string | 是 | 结算账户号,保留为字符串。 |
settlement.accountName | string | 是 | 结算账户户名。 |
settlement.certificateType | string | 否 | 结算人证件类型。 默认:"00"。 |
settlement.certificateNo | string | 是 | 结算人证件号码。 |
settlement.settleType | string | 否 | 当前仅支持法人结算 1。 取值:1。 |
settlement.bankCode | string | 是 | 总行编码,取 bankList.bank_code。 |
settlement.bankName | string | 否 | 总行名称;可由 bankCode 查询补齐,建议明确提交。 |
settlement.bankProvince | string | 否 | 开户省编码。 |
settlement.bankProvinceName | string | 否 | 开户省名称。 |
settlement.bankCity | string | 否 | 开户市编码。 |
settlement.bankCityName | string | 否 | 开户市名称。 |
settlement.subBankCode | string | 是 | 支行联行号,取 branchList.branch_no。 |
settlement.subBankName | string | 是 | 支行名称。 |
settlement.mobileNo | string | 是 | 银行预留手机号。 |
channel_extra | object | 是 | 经营地址与渠道扩展。 |
channel_extra.addressBuss | string | 是 | 经营详细地址,必填;必须放在 channel_extra,放入 merchant 会被丢弃。 最大 255 个字符。 |
channel_extra.busProvinceCode | string | 否 | 经营地址省编码。 |
channel_extra.busProvinceName | string | 是 | 经营地址省名称。 |
channel_extra.busCityCode | string | 否 | 经营地址市编码。 |
channel_extra.busCityName | string | 是 | 经营地址市名称。 |
channel_extra.busDistrictCode | string | 否 | 经营地址区县编码。 |
channel_extra.busDistrictName | string | 否 | 经营地址区县名称。 |
channel_extra.shopType | string | 否 | 入网角色:0 连锁分店、1 总店、2 普通商户、3 分账接收方、4 平台商、5 入驻商户。 取值:0 / 1 / 2 / 3 / 4 / 5。 |
channel_extra.mchNameEn | string | 否 | 商户英文名,填写时 2–255 字符。 最大 255 个字符。 |
ubo | array | 条件 | 受益人资料。企业需按进件资料要求提供,小微可传空数组。 |
ubo[].uboName | string | 是 | 受益人姓名。 |
ubo[].uboIdCard | string | 是 | 受益人身份证号。 |
ubo[].uboIdStartDate | string | 是 | 有效期开始日期,YYYY-MM-DD。 |
ubo[].uboIdEndDate | string | 是 | 有效期结束日期,YYYY-MM-DD;长期证件使用“长期”。 |
ubo[].uboPhone | string | 否 | 受益人电话。 |
ubo[].uboAddress | string | 否 | 受益人证件/联系地址。 |
ubo[].uboFrontPicLocal | string | 是 | 身份证正面文件路径,取 upload 返回的 data.url。 |
ubo[].uboBackPicLocal | string | 是 | 身份证反面文件路径,取 upload 返回的 data.url。 |
path | object | 是 | 按图片名称索引的对象,不是数组;具体图片必填条件需按商户资料清单确认。 |
path.legalFrontPic | string | 否 | 法人身份证正面文件路径,取 upload 返回的 data.url;按主体/账户/产品提供相应材料。 |
path.legalBackPic | string | 否 | 法人身份证反面文件路径,取 upload 返回的 data.url;按主体/账户/产品提供相应材料。 |
path.businessLicensePic | string | 否 | 营业执照文件路径,取 upload 返回的 data.url;按主体/账户/产品提供相应材料。 |
path.shopGatePic | string | 否 | 门头照文件路径,取 upload 返回的 data.url;按主体/账户/产品提供相应材料。 |
path.shopInsidePic | string | 否 | 店内照文件路径,取 upload 返回的 data.url;按主体/账户/产品提供相应材料。 |
path.cashierDeskPic | string | 否 | 收银台照文件路径,取 upload 返回的 data.url;按主体/账户/产品提供相应材料。 |
path.bankCardPic | string | 否 | 银行卡正面文件路径,取 upload 返回的 data.url;按主体/账户/产品提供相应材料。 |
path.bankCardBackPic | string | 否 | 银行卡反面文件路径,取 upload 返回的 data.url;按主体/账户/产品提供相应材料。 |
path.bankAccountPermitPic | string | 否 | 开户许可证文件路径,取 upload 返回的 data.url;按主体/账户/产品提供相应材料。 |
path.shareCertificate | string | 否 | 分账证明文件路径,取 upload 返回的 data.url;按主体/账户/产品提供相应材料。 |
callbackurl | string | 是 | 进件结果通知地址,不接收通知时请保留该字段并填写空字符串。 |
parentMerchant | string | 否 | 上级商户号。 |
productCodes | array | 否 | 进件产品代码列表,仅可选择所属应用已配置的产品;省略时使用应用全部产品。每个所选产品均须在 productRates 填写与应用当前配置相等的费用。支付方式与场景须对应所选产品;支付宝 H5_PAY 对应 H5_PAY_M_ALIPAY_OFFLINE。最终开通结果以进件结果为准。 |
productRates | object | 是 | 所选产品的约定费用,按产品代码索引。每个选中产品必须填写一个十进制字符串,且等于所属应用当前配置,暂不允许加价或减价。不得遗漏所选产品或填写未选产品;百分比按 % 填写,固定费用按元/笔填写,零元也须显式填写。省略 productCodes 时,须填写应用全部产品的费用。 |
上表只列业务字段;完整请求还包含 app_id、timestamp、nonce、sign,sign_type 可省略。先合并全部参数,再计算签名。
请替换示例中的域名、应用凭据及业务数据;时间戳、随机串和签名由公共客户端生成。
完整请求示例
POST /api/open.merchant/register
Content-Type: application/json
{
"app_id": "ak_your_app_id",
"sign_type": "HMAC-SHA256",
"timestamp": "运行时生成",
"nonce": "每次请求生成新随机串",
"channel": "yibao",
"merchant": {
"mchName": "河南某某商贸有限公司",
"mchNameAbbr": "某某商贸",
"etpsAttr": "2",
"servicePhone": "0371-88886666",
"mccCode": "12",
"contactName": "张三",
"contactPhone": "13800138000",
"contactEmail": "zhangsan@example.com",
"provinceCode": "410000",
"cityCode": "410100",
"districtCode": "410102",
"provinceName": "河南省",
"cityName": "郑州市",
"districtName": "中原区",
"addressReg": "某某街道 100 号 3 层",
"longitude": "113.62",
"latitude": "34.75"
},
"legal": {
"artifName": "张三",
"artifCertifType": "00",
"artifCertifId": "410000199001011234",
"artifPhone": "13800138000",
"certifIdStartDate": "2015-01-01",
"certifIdEndDate": "2035-01-01"
},
"business_license": {
"businessLicense": "91410100MA3XXXXXXX",
"businessLicenseType": "01",
"businessLicenseStartDate": "2019-06-01",
"businessLicenseEndDate": "2039-06-01"
},
"settlement": {
"accountType": "0",
"accountNo": "6222021234567890123",
"accountName": "河南某某商贸有限公司",
"certificateType": "00",
"certificateNo": "410000199001011234",
"settleType": "1",
"bankCode": "ABC",
"bankName": "中国农业银行",
"subBankCode": "103491000018",
"subBankName": "中国农业银行郑州中原支行",
"mobileNo": "13800138000",
"bankProvince": "410000",
"bankProvinceName": "河南省",
"bankCity": "410100",
"bankCityName": "郑州市"
},
"ubo": [
{
"uboName": "张三",
"uboIdCard": "410000199001011234",
"uboIdStartDate": "2015-01-01",
"uboIdEndDate": "2035-01-01",
"uboPhone": "13800138000",
"uboAddress": "河南省郑州市中原区某某街道 100 号",
"uboFrontPicLocal": "/uploads/20260929/legal_front.jpg",
"uboBackPicLocal": "/uploads/20260929/legal_back.jpg"
}
],
"path": {
"legalFrontPic": "/uploads/20260929/legal_front.jpg",
"legalBackPic": "/uploads/20260929/legal_back.jpg",
"businessLicensePic": "/uploads/20260929/license.jpg",
"shopGatePic": "/uploads/20260929/gate.jpg",
"shopInsidePic": "/uploads/20260929/inside.jpg",
"bankCardPic": "/uploads/20260929/bank.jpg",
"bankCardBackPic": "/uploads/20261023/bankBack.jpg",
"bankAccountPermitPic": "/uploads/20261023/permit.jpg"
},
"callbackurl": "https://your-domain.com/notify/merchant",
"channel_extra": {
"addressBuss": "某某街道 100 号 3 层",
"busProvinceCode": "410000",
"busProvinceName": "河南省",
"busCityCode": "410100",
"busCityName": "郑州市",
"busDistrictCode": "410102",
"busDistrictName": "中原区",
"shopType": "2"
},
"sign": "由公共客户端计算",
"productCodes": [
"USER_SCAN_WECHAT_OFFLINE",
"D1_MANUAL",
"EASYSHARE_SHARE_MERCHANT"
],
"productRates": {
"USER_SCAN_WECHAT_OFFLINE": "0.72",
"D1_MANUAL": "0.00",
"EASYSHARE_SHARE_MERCHANT": "0.02"
}
}
业务错误与处理
| msg / 情况 | HTTP | 处理说明 |
|---|---|---|
| 请选择渠道 | 200 | 提交 channel=yibao。 |
| 申请失败,参数错误:… | 200 | 根据提示补齐对应分组字段。 |
| 进件申请失败: … | 200 | 先查询并核对原申请状态,再根据返回提示处理。 |
| 请先为应用配置进件产品和约定费用 | 200 | 由应用管理方先配置可用产品与费用后再提交进件。 |
| productRates 必须逐项填写所选产品的约定费用,不能缺少或多填 | 200 | productRates 的键须与所选产品一一对应;未选产品不要提交。 |
| productRates 中每个所选产品必须填写十进制费用字符串 | 200 | 每项费用使用最多四位小数的非负十进制字符串;固定零费用填写 "0"。 |
| …费用必须等于所属应用当前配置 … | 200 | 逐项核对当前应用配置,不能加价或减价;应用已调价时重新取得配置后提交。 |
HTTP 200 时仍需检查 code;HTTP 401 请核对应用凭据与签名,HTTP 503 请稍后重试。
响应示例
{
"code": 1,
"msg": "操作成功",
"time": "1792740000",
"data": {
"outMchNo": "yibao_example_request"
}
}
业务响应字段
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
data.outMchNo | string | 是 | 进件请求号,用于 registerQry/update/modifyMerchant。 |
公共协议见“公共参数与签名”。本接口的业务字段、完整请求和业务响应定义如下。
按层级查询行业目录;进件时使用三级目录项 id。当前不支持 mercType 筛选。
业务参数
| 参数 | 类型 | 必填 / 位置 | 说明 |
|---|---|---|---|
channel | string | 是 | 开放平台文档约定的渠道。 取值:yibao。 |
level | string | 否 | 层级:1 一级,2 二级,3 三级。 取值:1 / 2 / 3。 默认:"1"。 |
fatherCode | string | 否 | 父级项 id,取上一级响应的 id/value。 |
mccCode | string | 否 | 按字典的 mcc_code 精确筛选。 |
上表只列业务字段;完整请求还包含 app_id、timestamp、nonce、sign,sign_type 可省略。先合并全部参数,再计算签名。
请替换示例中的域名、应用凭据及业务数据;时间戳、随机串和签名由公共客户端生成。
完整请求示例
POST /api/open.merchant/mccList
Content-Type: application/json
{
"app_id": "ak_your_app_id",
"sign_type": "HMAC-SHA256",
"timestamp": "运行时生成",
"nonce": "每次请求生成新随机串",
"channel": "yibao",
"level": "1",
"sign": "由公共客户端计算"
}
业务错误与处理
| msg / 情况 | HTTP | 处理说明 |
|---|---|---|
| 不支持的渠道 | 200 | 当前使用 yibao。 |
HTTP 200 时仍需检查 code;HTTP 401 请核对应用凭据与签名,HTTP 503 请稍后重试。
响应示例
{
"code": 1,
"msg": "操作成功",
"time": "1792740000",
"data": [
{
"id": 1,
"mcc_name": "零售业",
"pid": 0,
"level": 1,
"mcc_code": 0,
"value": 1,
"name": "零售业"
}
]
}
业务响应字段
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
data[].id | integer / string | 否 | 行业目录项 id;进件使用三级项 id。 |
data[].mcc_code | string / integer | 否 | 行业编码;进件填写三级项 id,不能与此字段混用。 |
data[].mcc_name | string | 否 | 行业名称。 |
data[].level | integer / string | 否 | 层级。 |
data[].pid | integer / string | 否 | 父级项 id。 |
data[].value | integer / string | 否 | 与 id 一致。 |
data[].name | string | 否 | 与 mcc_name 一致。 |
公共协议见“公共参数与签名”。本接口的业务字段、完整请求和业务响应定义如下。
channel 与公共参数放入 JSON 正文,areaLevel、parentCode 放入 URL;两处参数一起参与签名,可使用公共客户端的第三个 query 参数。
当前使用 areaLevel、parentCode 查询;不支持按地区名称或批量地区编码筛选。
业务参数
| 参数 | 类型 | 必填 / 位置 | 说明 |
|---|---|---|---|
channel | string | 是 | 开放平台文档约定的渠道。 取值:yibao。 |
areaLevel | string | 否 / URL | 当前只读取 URL 查询参数。1 省、2 市、3 区县。 |
parentCode | string | 否 / URL | 父级编码;填写时必须同时提供 areaLevel,查市用 2,查区县用 3。 |
上表只列业务字段;完整请求还包含 app_id、timestamp、nonce、sign,sign_type 可省略。先合并全部参数,再计算签名。
请替换示例中的域名、应用凭据及业务数据;时间戳、随机串和签名由公共客户端生成。
完整请求示例
POST /api/open.merchant/areaCode?areaLevel=2&parentCode=410000
Content-Type: application/json
{
"app_id": "ak_your_app_id",
"sign_type": "HMAC-SHA256",
"timestamp": "运行时生成",
"nonce": "每次请求生成新随机串",
"channel": "yibao",
"sign": "由公共客户端计算"
}
业务错误与处理
| msg / 情况 | HTTP | 处理说明 |
|---|---|---|
| 不支持的渠道 | 200 | 正文提交 channel=yibao。 |
HTTP 200 时仍需检查 code;HTTP 401 请核对应用凭据与签名,HTTP 503 请稍后重试。
响应示例
{
"code": 1,
"msg": "操作成功",
"time": "1792740000",
"data": [
{
"code": "110000",
"value": "110000",
"name": "北京市",
"level": 1
}
]
}
业务响应字段
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
data[].code | string | 否 | 地区编码。 |
data[].value | string | 否 | 与 code 一致。 |
data[].name | string | 否 | 地区名称。 |
data[].level | integer / string | 否 | 地区层级。 |
公共协议见“公共参数与签名”。本接口的业务字段、完整请求和业务响应定义如下。
返回银行列表;需要名称搜索时,在返回列表中筛选。
业务参数
| 参数 | 类型 | 必填 / 位置 | 说明 |
|---|---|---|---|
channel | string | 是 | 开放平台文档约定的渠道。 取值:yibao。 |
bankCode | string | 否 | 银行编码,精确匹配。 |
上表只列业务字段;完整请求还包含 app_id、timestamp、nonce、sign,sign_type 可省略。先合并全部参数,再计算签名。
请替换示例中的域名、应用凭据及业务数据;时间戳、随机串和签名由公共客户端生成。
完整请求示例
POST /api/open.merchant/bankList
Content-Type: application/json
{
"app_id": "ak_your_app_id",
"sign_type": "HMAC-SHA256",
"timestamp": "运行时生成",
"nonce": "每次请求生成新随机串",
"channel": "yibao",
"bankCode": "ABC",
"sign": "由公共客户端计算"
}
业务错误与处理
| msg / 情况 | HTTP | 处理说明 |
|---|---|---|
| 不支持的渠道 | 200 | 使用 yibao。 |
HTTP 200 时仍需检查 code;HTTP 401 请核对应用凭据与签名,HTTP 503 请稍后重试。
响应示例
{
"code": 1,
"msg": "操作成功",
"time": "1792740000",
"data": [
{
"bank_code": "ABC",
"value": "ABC",
"name": "中国农业银行",
"bank_no": "103100000026"
}
]
}
业务响应字段
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
data[].bank_code | string | 否 | 银行编码,填入 settlement.bankCode。 |
data[].value | string | 否 | 与 bank_code 一致。 |
data[].name | string | 否 | 银行名称。 |
data[].bank_no | string | 否 | 银行联行号。 |
公共协议见“公共参数与签名”。本接口的业务字段、完整请求和业务响应定义如下。
可按省市编码、银行编码查询联行号;当前不支持 keyword 名称筛选。
业务参数
| 参数 | 类型 | 必填 / 位置 | 说明 |
|---|---|---|---|
channel | string | 是 | 开放平台文档约定的渠道。 取值:yibao。 |
bankCode | string | 否 | 银行总行编码。 |
provinceCode | string | 否 | 省编码。 |
cityCode | string | 否 | 市编码。 |
branchNo | string | 否 | 支行联行号,精确匹配。 |
上表只列业务字段;完整请求还包含 app_id、timestamp、nonce、sign,sign_type 可省略。先合并全部参数,再计算签名。
请替换示例中的域名、应用凭据及业务数据;时间戳、随机串和签名由公共客户端生成。
完整请求示例
POST /api/open.merchant/branchList
Content-Type: application/json
{
"app_id": "ak_your_app_id",
"sign_type": "HMAC-SHA256",
"timestamp": "运行时生成",
"nonce": "每次请求生成新随机串",
"channel": "yibao",
"bankCode": "ABC",
"cityCode": "410100",
"sign": "由公共客户端计算"
}
业务错误与处理
| msg / 情况 | HTTP | 处理说明 |
|---|---|---|
| 不支持的渠道 | 200 | 使用 yibao。 |
HTTP 200 时仍需检查 code;HTTP 401 请核对应用凭据与签名,HTTP 503 请稍后重试。
响应示例
{
"code": 1,
"msg": "操作成功",
"time": "1792740000",
"data": [
{
"branch_no": "102100000021",
"branch_name": "中国工商银行北京分行营业部",
"value": "102100000021-中国工商银行北京分行营业部",
"name": "中国工商银行北京分行营业部"
}
]
}
业务响应字段
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
data[].branch_no | string | 否 | 支行联行号,填入 settlement.subBankCode。 |
data[].branch_name | string | 否 | 支行名称。 |
data[].value | string | 否 | branch_no 与 branch_name 以短横线连接。 |
data[].name | string | 否 | 与 branch_name 一致。 |
公共协议见“公共参数与签名”。本接口的业务字段、完整请求和业务响应定义如下。
使用 multipart/form-data 提交文件,公共参数作为表单字段;文件内容不参与签名。
上传成功后保存返回的文件地址,用于提交商户资料。
业务参数
| 参数 | 类型 | 必填 / 位置 | 说明 |
|---|---|---|---|
file | file | 是 | 文件字段固定为 file;文件内容不参与签名。 |
上表只列业务字段;完整请求还包含 app_id、timestamp、nonce、sign,sign_type 可省略。先合并全部参数,再计算签名。
请替换示例中的域名、应用凭据及业务数据;时间戳、随机串和签名由公共客户端生成。
完整请求示例
curl 'https://你的域名/api/open.merchant/upload' \ -F 'app_id=ak_your_app_id' \ -F 'sign_type=HMAC-SHA256' \ -F 'timestamp=运行时生成' \ -F 'nonce=每次请求生成新随机串' \ -F 'file=@/你的本地路径/legal_front.jpg' \ -F 'sign=由公共客户端计算'
业务错误与处理
| msg / 情况 | HTTP | 处理说明 |
|---|---|---|
| 请上传文件 | 200 | 确认 multipart 的文件字段名为 file。 |
| 文件上传失败… | 200 | 核对文件大小、类型和实际错误提示。 |
HTTP 200 时仍需检查 code;HTTP 401 请核对应用凭据与签名,HTTP 503 请稍后重试。
响应示例
{
"code": 1,
"msg": "上传成功",
"time": "1792740000",
"data": {
"url": "/uploads/20261023/legal_front.jpg"
}
}
业务响应字段
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
data.url | string | 是 | 上传成功后的文件路径,填入进件 path 对应图片字段。 |
公共协议见“公共参数与签名”。本接口的业务字段、完整请求和业务响应定义如下。
用于修改已驳回的进件申请。请提交完整资料,审核中及待签约状态不支持修改。
callbackurl 不接收通知时填写空字符串;ubo 没有资料时保留为空数组。
仅可操作或查询当前应用所属的商户和申请记录。
业务参数
| 参数 | 类型 | 必填 / 位置 | 说明 |
|---|---|---|---|
channel | string | 是 | 开放平台文档约定的渠道。 取值:yibao。 |
merchant | object | 是 | 商户基本资料;数字及日期字段按字符串提交。 |
merchant.mchName | string | 是 | 商户全称。 最大 255 个字符。 |
merchant.mchNameAbbr | string | 是 | 商户简称。 最大 255 个字符。 |
merchant.etpsAttr | string | 是 | 主体类型:1 个体工商户,2 企业,3 小微。 取值:1 / 2 / 3。 |
merchant.servicePhone | string | 是 | 客服电话,手机号或含区号的固定电话。 |
merchant.mccCode | string | 是 | 三级行业项的 id,取 mccList 返回的 id/value;与返回的 mcc_code 字段区别。 |
merchant.contactName | string | 是 | 联系人姓名。 最大 255 个字符。 |
merchant.contactPhone | string | 是 | 联系人电话。 |
merchant.contactEmail | string | 否 | 联系人邮箱。 |
merchant.provinceCode | string | 条件 | 注册地址省编码;企业/个体必填。 |
merchant.cityCode | string | 条件 | 注册地址市编码;企业/个体必填。 |
merchant.districtCode | string | 条件 | 注册地址区县编码;企业/个体必填。 |
merchant.provinceName | string | 是 | 注册地址省名称。 |
merchant.cityName | string | 否 | 注册地址市名称。 |
merchant.districtName | string | 否 | 注册地址区县名称。 |
merchant.addressReg | string | 是 | 注册地址详细地址,2–255 字符。 最大 255 个字符。 |
merchant.longitude | string | 否 | 经度。 |
merchant.latitude | string | 否 | 纬度。 |
legal | object | 是 | 法人资料。 |
legal.artifName | string | 是 | 法人姓名。 |
legal.artifCertifType | string | 否 | 证件类型,当前校验仅支持身份证 00。 取值:00。 默认:"00"。 |
legal.artifCertifId | string | 是 | 法人身份证号。 |
legal.artifPhone | string | 是 | 法人手机号。 |
legal.certifIdStartDate | string | 是 | 有效期开始日期,YYYY-MM-DD。 |
legal.certifIdEndDate | string | 是 | 有效期结束日期,YYYY-MM-DD;长期证件使用“长期”。 |
business_license | object | 条件 | 企业/个体需提供,小微可省略。 |
business_license.businessLicense | string | 是 | 营业执照编号。 |
business_license.businessLicenseType | string | 否 | 证件类型,当前仅支持营业执照 01。 取值:01。 |
business_license.businessLicenseStartDate | string | 是 | 营业执照有效期开始,YYYY-MM-DD。 |
business_license.businessLicenseEndDate | string | 是 | 营业执照有效期结束,YYYY-MM-DD 或“长期”。 |
settlement | object | 是 | 结算资料。 |
settlement.accountType | string | 是 | 0 对公账户,1 银行借记卡。 取值:0 / 1。 |
settlement.accountNo | string | 是 | 结算账户号,保留为字符串。 |
settlement.accountName | string | 是 | 结算账户户名。 |
settlement.certificateType | string | 否 | 结算人证件类型。 默认:"00"。 |
settlement.certificateNo | string | 是 | 结算人证件号码。 |
settlement.settleType | string | 否 | 当前仅支持法人结算 1。 取值:1。 |
settlement.bankCode | string | 是 | 总行编码,取 bankList.bank_code。 |
settlement.bankName | string | 否 | 总行名称;可由 bankCode 查询补齐,建议明确提交。 |
settlement.bankProvince | string | 否 | 开户省编码。 |
settlement.bankProvinceName | string | 否 | 开户省名称。 |
settlement.bankCity | string | 否 | 开户市编码。 |
settlement.bankCityName | string | 否 | 开户市名称。 |
settlement.subBankCode | string | 是 | 支行联行号,取 branchList.branch_no。 |
settlement.subBankName | string | 是 | 支行名称。 |
settlement.mobileNo | string | 是 | 银行预留手机号。 |
channel_extra | object | 是 | 经营地址与渠道扩展。 |
channel_extra.addressBuss | string | 是 | 经营详细地址,必填;必须放在 channel_extra,放入 merchant 会被丢弃。 最大 255 个字符。 |
channel_extra.busProvinceCode | string | 否 | 经营地址省编码。 |
channel_extra.busProvinceName | string | 是 | 经营地址省名称。 |
channel_extra.busCityCode | string | 否 | 经营地址市编码。 |
channel_extra.busCityName | string | 是 | 经营地址市名称。 |
channel_extra.busDistrictCode | string | 否 | 经营地址区县编码。 |
channel_extra.busDistrictName | string | 否 | 经营地址区县名称。 |
channel_extra.shopType | string | 否 | 入网角色:0 连锁分店、1 总店、2 普通商户、3 分账接收方、4 平台商、5 入驻商户。 取值:0 / 1 / 2 / 3 / 4 / 5。 |
channel_extra.mchNameEn | string | 否 | 商户英文名,填写时 2–255 字符。 最大 255 个字符。 |
ubo | array | 是,可为空数组 | 受益人资料。企业需按进件资料要求提供,小微可传空数组。 |
ubo[].uboName | string | 是 | 受益人姓名。 |
ubo[].uboIdCard | string | 是 | 受益人身份证号。 |
ubo[].uboIdStartDate | string | 是 | 有效期开始日期,YYYY-MM-DD。 |
ubo[].uboIdEndDate | string | 是 | 有效期结束日期,YYYY-MM-DD;长期证件使用“长期”。 |
ubo[].uboPhone | string | 否 | 受益人电话。 |
ubo[].uboAddress | string | 否 | 受益人证件/联系地址。 |
ubo[].uboFrontPicLocal | string | 是 | 身份证正面文件路径,取 upload 返回的 data.url。 |
ubo[].uboBackPicLocal | string | 是 | 身份证反面文件路径,取 upload 返回的 data.url。 |
path | object | 是 | 按图片名称索引的对象,不是数组;具体图片必填条件需按商户资料清单确认。 |
path.legalFrontPic | string | 否 | 法人身份证正面文件路径,取 upload 返回的 data.url;按主体/账户/产品提供相应材料。 |
path.legalBackPic | string | 否 | 法人身份证反面文件路径,取 upload 返回的 data.url;按主体/账户/产品提供相应材料。 |
path.businessLicensePic | string | 否 | 营业执照文件路径,取 upload 返回的 data.url;按主体/账户/产品提供相应材料。 |
path.shopGatePic | string | 否 | 门头照文件路径,取 upload 返回的 data.url;按主体/账户/产品提供相应材料。 |
path.shopInsidePic | string | 否 | 店内照文件路径,取 upload 返回的 data.url;按主体/账户/产品提供相应材料。 |
path.cashierDeskPic | string | 否 | 收银台照文件路径,取 upload 返回的 data.url;按主体/账户/产品提供相应材料。 |
path.bankCardPic | string | 否 | 银行卡正面文件路径,取 upload 返回的 data.url;按主体/账户/产品提供相应材料。 |
path.bankCardBackPic | string | 否 | 银行卡反面文件路径,取 upload 返回的 data.url;按主体/账户/产品提供相应材料。 |
path.bankAccountPermitPic | string | 否 | 开户许可证文件路径,取 upload 返回的 data.url;按主体/账户/产品提供相应材料。 |
path.shareCertificate | string | 否 | 分账证明文件路径,取 upload 返回的 data.url;按主体/账户/产品提供相应材料。 |
callbackurl | string | 是 | 进件结果通知地址,不接收通知时请保留该字段并填写空字符串。 |
parentMerchant | string | 否 | 上级商户号。 |
outMchNo | string | 是 | register 返回的进件请求号。 |
上表只列业务字段;完整请求还包含 app_id、timestamp、nonce、sign,sign_type 可省略。先合并全部参数,再计算签名。
请替换示例中的域名、应用凭据及业务数据;时间戳、随机串和签名由公共客户端生成。
完整请求示例
POST /api/open.merchant/update
Content-Type: application/json
{
"app_id": "ak_your_app_id",
"sign_type": "HMAC-SHA256",
"timestamp": "运行时生成",
"nonce": "每次请求生成新随机串",
"channel": "yibao",
"merchant": {
"mchName": "河南某某商贸有限公司",
"mchNameAbbr": "某某商贸",
"etpsAttr": "2",
"servicePhone": "0371-88886666",
"mccCode": "12",
"contactName": "张三",
"contactPhone": "13800138000",
"contactEmail": "zhangsan@example.com",
"provinceCode": "410000",
"cityCode": "410100",
"districtCode": "410102",
"provinceName": "河南省",
"cityName": "郑州市",
"districtName": "中原区",
"addressReg": "某某街道 100 号 3 层",
"longitude": "113.62",
"latitude": "34.75"
},
"legal": {
"artifName": "张三",
"artifCertifType": "00",
"artifCertifId": "410000199001011234",
"artifPhone": "13800138000",
"certifIdStartDate": "2015-01-01",
"certifIdEndDate": "2035-01-01"
},
"business_license": {
"businessLicense": "91410100MA3XXXXXXX",
"businessLicenseType": "01",
"businessLicenseStartDate": "2019-06-01",
"businessLicenseEndDate": "2039-06-01"
},
"settlement": {
"accountType": "0",
"accountNo": "6222021234567890123",
"accountName": "河南某某商贸有限公司",
"certificateType": "00",
"certificateNo": "410000199001011234",
"settleType": "1",
"bankCode": "ABC",
"bankName": "中国农业银行",
"subBankCode": "103491000018",
"subBankName": "中国农业银行郑州中原支行",
"mobileNo": "13800138000",
"bankProvince": "410000",
"bankProvinceName": "河南省",
"bankCity": "410100",
"bankCityName": "郑州市"
},
"ubo": [
{
"uboName": "张三",
"uboIdCard": "410000199001011234",
"uboIdStartDate": "2015-01-01",
"uboIdEndDate": "2035-01-01",
"uboPhone": "13800138000",
"uboAddress": "河南省郑州市中原区某某街道 100 号",
"uboFrontPicLocal": "/uploads/20260929/legal_front.jpg",
"uboBackPicLocal": "/uploads/20260929/legal_back.jpg"
}
],
"path": {
"legalFrontPic": "/uploads/20260929/legal_front.jpg",
"legalBackPic": "/uploads/20260929/legal_back.jpg",
"businessLicensePic": "/uploads/20260929/license.jpg",
"shopGatePic": "/uploads/20260929/gate.jpg",
"shopInsidePic": "/uploads/20260929/inside.jpg",
"bankCardPic": "/uploads/20260929/bank.jpg",
"bankCardBackPic": "/uploads/20261023/bankBack.jpg",
"bankAccountPermitPic": "/uploads/20261023/permit.jpg"
},
"callbackurl": "https://your-domain.com/notify/merchant",
"channel_extra": {
"addressBuss": "某某街道 100 号 3 层",
"busProvinceCode": "410000",
"busProvinceName": "河南省",
"busCityCode": "410100",
"busCityName": "郑州市",
"busDistrictCode": "410102",
"busDistrictName": "中原区",
"shopType": "2"
},
"outMchNo": "yibao_example_request",
"sign": "由公共客户端计算"
}
业务错误与处理
| msg / 情况 | HTTP | 处理说明 |
|---|---|---|
| 进件信息不存在 | 200 | 核对 outMchNo。 |
| 该状态进件信息不能修改! | 200 | 确认原申请已驳回。 |
| 申请失败,参数错误:… | 200 | 补齐完整进件资料。 |
HTTP 200 时仍需检查 code;HTTP 401 请核对应用凭据与签名,HTTP 503 请稍后重试。
响应示例
{
"code": 1,
"msg": "操作成功",
"time": "1792740000",
"data": "成功"
}
业务响应字段
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
data | string | — | 操作成功时返回字符串“成功”。 |
公共协议见“公共参数与签名”。本接口的业务字段、完整请求和业务响应定义如下。
商户进件成功后方可变更资料。提交完整资料,ubo、path 无数据时也应保留字段。
资料变更需先联系平台确认可用申请信息;获得 requestNo 后使用 modifyQry 查询进度。
仅可操作或查询当前应用所属的商户和申请记录。
业务参数
| 参数 | 类型 | 必填 / 位置 | 说明 |
|---|---|---|---|
channel | string | 是 | 开放平台文档约定的渠道。 取值:yibao。 |
merchant | object | 是 | 商户基本资料;数字及日期字段按字符串提交。 |
merchant.mchName | string | 是 | 商户全称。 最大 255 个字符。 |
merchant.mchNameAbbr | string | 是 | 商户简称。 最大 255 个字符。 |
merchant.etpsAttr | string | 是 | 主体类型:1 个体工商户,2 企业,3 小微。 取值:1 / 2 / 3。 |
merchant.servicePhone | string | 是 | 客服电话,手机号或含区号的固定电话。 |
merchant.mccCode | string | 是 | 三级行业项的 id,取 mccList 返回的 id/value;与返回的 mcc_code 字段区别。 |
merchant.contactName | string | 是 | 联系人姓名。 最大 255 个字符。 |
merchant.contactPhone | string | 是 | 联系人电话。 |
merchant.contactEmail | string | 否 | 联系人邮箱。 |
merchant.provinceCode | string | 条件 | 注册地址省编码;企业/个体必填。 |
merchant.cityCode | string | 条件 | 注册地址市编码;企业/个体必填。 |
merchant.districtCode | string | 条件 | 注册地址区县编码;企业/个体必填。 |
merchant.provinceName | string | 是 | 注册地址省名称。 |
merchant.cityName | string | 否 | 注册地址市名称。 |
merchant.districtName | string | 否 | 注册地址区县名称。 |
merchant.addressReg | string | 是 | 注册地址详细地址,2–255 字符。 最大 255 个字符。 |
merchant.longitude | string | 否 | 经度。 |
merchant.latitude | string | 否 | 纬度。 |
legal | object | 是 | 法人资料。 |
legal.artifName | string | 是 | 法人姓名。 |
legal.artifCertifType | string | 否 | 证件类型,当前校验仅支持身份证 00。 取值:00。 默认:"00"。 |
legal.artifCertifId | string | 是 | 法人身份证号。 |
legal.artifPhone | string | 是 | 法人手机号。 |
legal.certifIdStartDate | string | 是 | 有效期开始日期,YYYY-MM-DD。 |
legal.certifIdEndDate | string | 是 | 有效期结束日期,YYYY-MM-DD;长期证件使用“长期”。 |
business_license | object | 条件 | 企业/个体需提供,小微可省略。 |
business_license.businessLicense | string | 是 | 营业执照编号。 |
business_license.businessLicenseType | string | 否 | 证件类型,当前仅支持营业执照 01。 取值:01。 |
business_license.businessLicenseStartDate | string | 是 | 营业执照有效期开始,YYYY-MM-DD。 |
business_license.businessLicenseEndDate | string | 是 | 营业执照有效期结束,YYYY-MM-DD 或“长期”。 |
settlement | object | 是 | 结算资料。 |
settlement.accountType | string | 是 | 0 对公账户,1 银行借记卡。 取值:0 / 1。 |
settlement.accountNo | string | 是 | 结算账户号,保留为字符串。 |
settlement.accountName | string | 是 | 结算账户户名。 |
settlement.certificateType | string | 否 | 结算人证件类型。 默认:"00"。 |
settlement.certificateNo | string | 是 | 结算人证件号码。 |
settlement.settleType | string | 否 | 当前仅支持法人结算 1。 取值:1。 |
settlement.bankCode | string | 是 | 总行编码,取 bankList.bank_code。 |
settlement.bankName | string | 否 | 总行名称;可由 bankCode 查询补齐,建议明确提交。 |
settlement.bankProvince | string | 否 | 开户省编码。 |
settlement.bankProvinceName | string | 否 | 开户省名称。 |
settlement.bankCity | string | 否 | 开户市编码。 |
settlement.bankCityName | string | 否 | 开户市名称。 |
settlement.subBankCode | string | 是 | 支行联行号,取 branchList.branch_no。 |
settlement.subBankName | string | 是 | 支行名称。 |
settlement.mobileNo | string | 是 | 银行预留手机号。 |
channel_extra | object | 是 | 经营地址与渠道扩展。 |
channel_extra.addressBuss | string | 是 | 经营详细地址,必填;必须放在 channel_extra,放入 merchant 会被丢弃。 最大 255 个字符。 |
channel_extra.busProvinceCode | string | 否 | 经营地址省编码。 |
channel_extra.busProvinceName | string | 是 | 经营地址省名称。 |
channel_extra.busCityCode | string | 否 | 经营地址市编码。 |
channel_extra.busCityName | string | 是 | 经营地址市名称。 |
channel_extra.busDistrictCode | string | 否 | 经营地址区县编码。 |
channel_extra.busDistrictName | string | 否 | 经营地址区县名称。 |
channel_extra.shopType | string | 否 | 入网角色:0 连锁分店、1 总店、2 普通商户、3 分账接收方、4 平台商、5 入驻商户。 取值:0 / 1 / 2 / 3 / 4 / 5。 |
channel_extra.mchNameEn | string | 否 | 商户英文名,填写时 2–255 字符。 最大 255 个字符。 |
ubo | array | 条件 | 受益人资料。企业需按进件资料要求提供,小微可传空数组。 |
ubo[].uboName | string | 是 | 受益人姓名。 |
ubo[].uboIdCard | string | 是 | 受益人身份证号。 |
ubo[].uboIdStartDate | string | 是 | 有效期开始日期,YYYY-MM-DD。 |
ubo[].uboIdEndDate | string | 是 | 有效期结束日期,YYYY-MM-DD;长期证件使用“长期”。 |
ubo[].uboPhone | string | 否 | 受益人电话。 |
ubo[].uboAddress | string | 否 | 受益人证件/联系地址。 |
ubo[].uboFrontPicLocal | string | 是 | 身份证正面文件路径,取 upload 返回的 data.url。 |
ubo[].uboBackPicLocal | string | 是 | 身份证反面文件路径,取 upload 返回的 data.url。 |
path | object | 是 | 按图片名称索引的对象,不是数组;具体图片必填条件需按商户资料清单确认。 |
path.legalFrontPic | string | 否 | 法人身份证正面文件路径,取 upload 返回的 data.url;按主体/账户/产品提供相应材料。 |
path.legalBackPic | string | 否 | 法人身份证反面文件路径,取 upload 返回的 data.url;按主体/账户/产品提供相应材料。 |
path.businessLicensePic | string | 否 | 营业执照文件路径,取 upload 返回的 data.url;按主体/账户/产品提供相应材料。 |
path.shopGatePic | string | 否 | 门头照文件路径,取 upload 返回的 data.url;按主体/账户/产品提供相应材料。 |
path.shopInsidePic | string | 否 | 店内照文件路径,取 upload 返回的 data.url;按主体/账户/产品提供相应材料。 |
path.cashierDeskPic | string | 否 | 收银台照文件路径,取 upload 返回的 data.url;按主体/账户/产品提供相应材料。 |
path.bankCardPic | string | 否 | 银行卡正面文件路径,取 upload 返回的 data.url;按主体/账户/产品提供相应材料。 |
path.bankCardBackPic | string | 否 | 银行卡反面文件路径,取 upload 返回的 data.url;按主体/账户/产品提供相应材料。 |
path.bankAccountPermitPic | string | 否 | 开户许可证文件路径,取 upload 返回的 data.url;按主体/账户/产品提供相应材料。 |
path.shareCertificate | string | 否 | 分账证明文件路径,取 upload 返回的 data.url;按主体/账户/产品提供相应材料。 |
outMchNo | string | 是 | 已进件成功的商户请求号。 |
上表只列业务字段;完整请求还包含 app_id、timestamp、nonce、sign,sign_type 可省略。先合并全部参数,再计算签名。
请替换示例中的域名、应用凭据及业务数据;时间戳、随机串和签名由公共客户端生成。
完整请求示例
POST /api/open.merchant/modifyMerchant
Content-Type: application/json
{
"app_id": "ak_your_app_id",
"sign_type": "HMAC-SHA256",
"timestamp": "运行时生成",
"nonce": "每次请求生成新随机串",
"channel": "yibao",
"merchant": {
"mchName": "河南某某商贸有限公司",
"mchNameAbbr": "某某商贸",
"etpsAttr": "2",
"servicePhone": "0371-88886666",
"mccCode": "12",
"contactName": "张三",
"contactPhone": "13800138000",
"contactEmail": "zhangsan@example.com",
"provinceCode": "410000",
"cityCode": "410100",
"districtCode": "410102",
"provinceName": "河南省",
"cityName": "郑州市",
"districtName": "中原区",
"addressReg": "某某街道 100 号 3 层",
"longitude": "113.62",
"latitude": "34.75"
},
"legal": {
"artifName": "张三",
"artifCertifType": "00",
"artifCertifId": "410000199001011234",
"artifPhone": "13800138000",
"certifIdStartDate": "2015-01-01",
"certifIdEndDate": "2035-01-01"
},
"business_license": {
"businessLicense": "91410100MA3XXXXXXX",
"businessLicenseType": "01",
"businessLicenseStartDate": "2019-06-01",
"businessLicenseEndDate": "2039-06-01"
},
"settlement": {
"accountType": "0",
"accountNo": "6222021234567890123",
"accountName": "河南某某商贸有限公司",
"certificateType": "00",
"certificateNo": "410000199001011234",
"settleType": "1",
"bankCode": "ABC",
"bankName": "中国农业银行",
"subBankCode": "103491000018",
"subBankName": "中国农业银行郑州中原支行",
"mobileNo": "13800138000",
"bankProvince": "410000",
"bankProvinceName": "河南省",
"bankCity": "410100",
"bankCityName": "郑州市"
},
"ubo": [
{
"uboName": "张三",
"uboIdCard": "410000199001011234",
"uboIdStartDate": "2015-01-01",
"uboIdEndDate": "2035-01-01",
"uboPhone": "13800138000",
"uboAddress": "河南省郑州市中原区某某街道 100 号",
"uboFrontPicLocal": "/uploads/20260929/legal_front.jpg",
"uboBackPicLocal": "/uploads/20260929/legal_back.jpg"
}
],
"path": {
"legalFrontPic": "/uploads/20260929/legal_front.jpg",
"legalBackPic": "/uploads/20260929/legal_back.jpg",
"businessLicensePic": "/uploads/20260929/license.jpg",
"shopGatePic": "/uploads/20260929/gate.jpg",
"shopInsidePic": "/uploads/20260929/inside.jpg",
"bankCardPic": "/uploads/20260929/bank.jpg",
"bankCardBackPic": "/uploads/20261023/bankBack.jpg",
"bankAccountPermitPic": "/uploads/20261023/permit.jpg"
},
"channel_extra": {
"addressBuss": "某某街道 100 号 3 层",
"busProvinceCode": "410000",
"busProvinceName": "河南省",
"busCityCode": "410100",
"busCityName": "郑州市",
"busDistrictCode": "410102",
"busDistrictName": "中原区",
"shopType": "2"
},
"outMchNo": "yibao_example_request",
"sign": "由公共客户端计算"
}
业务错误与处理
| msg / 情况 | HTTP | 处理说明 |
|---|---|---|
| 当前商户未进件成功无法申请商户资料变更 | 200 | 先查询原进件状态。 |
| 修改失败: … | 200 | 核对提交资料及返回提示。 |
HTTP 200 时仍需检查 code;HTTP 401 请核对应用凭据与签名,HTTP 503 请稍后重试。
响应示例
{
"code": 1,
"msg": "操作成功",
"time": "1792740000",
"data": {
"applicationNo": "渠道变更申请单号",
"applicationStatus": "渠道状态值"
}
}
以下示例说明响应结构;请结合 code 和业务状态判断处理结果。
业务响应字段
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
data.applicationNo | string | 是 | 资料变更申请单号,与查询时使用的 requestNo 不同。 |
data.applicationStatus | string | 是 | 资料变更申请的处理状态。 |
公共协议见“公共参数与签名”。本接口的业务字段、完整请求和业务响应定义如下。
使用资料变更时取得的 requestNo 查询,不能使用原进件 outMchNo。
仅可操作或查询当前应用所属的商户和申请记录。
业务参数
| 参数 | 类型 | 必填 / 位置 | 说明 |
|---|---|---|---|
channel | string | 是 | 开放平台文档约定的渠道。 取值:yibao。 |
requestNo | string | 是 | 变更请求号,不是原进件 outMchNo。须先与平台确认该号码的获取方式。 |
上表只列业务字段;完整请求还包含 app_id、timestamp、nonce、sign,sign_type 可省略。先合并全部参数,再计算签名。
请替换示例中的域名、应用凭据及业务数据;时间戳、随机串和签名由公共客户端生成。
完整请求示例
POST /api/open.merchant/modifyQry
Content-Type: application/json
{
"app_id": "ak_your_app_id",
"sign_type": "HMAC-SHA256",
"timestamp": "运行时生成",
"nonce": "每次请求生成新随机串",
"channel": "yibao",
"requestNo": "YIBAO_MODIFY_example",
"sign": "由公共客户端计算"
}
业务错误与处理
调用失败时查看 msg 提示;业务结果以返回状态或后续结果查询为准。
HTTP 200 时仍需检查 code;HTTP 401 请核对应用凭据与签名,HTTP 503 请稍后重试。
响应示例
{
"code": 1,
"msg": "操作成功",
"time": "1792740000",
"data": {}
}
以下示例说明响应结构;请结合 code 和业务状态判断处理结果。
业务响应字段
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
data | 按渠道返回 | — | 业务处理结果,具体字段须在接入前确认。 |
公共协议见“公共参数与签名”。本接口的业务字段、完整请求和业务响应定义如下。
使用进件申请返回的 outMchNo 作为 requestNo 查询进度。
申请尚未完成时,主要返回 applicationStatus、auditOpinion、requestNo;成功后可取得用于收款的 merchantNo。
仅可操作或查询当前应用所属的商户和申请记录。
业务参数
| 参数 | 类型 | 必填 / 位置 | 说明 |
|---|---|---|---|
channel | string | 是 | 开放平台文档约定的渠道。 取值:yibao。 |
requestNo | string | 是 | register 返回的 outMchNo;此接口的入参字段名叫 requestNo。 |
上表只列业务字段;完整请求还包含 app_id、timestamp、nonce、sign,sign_type 可省略。先合并全部参数,再计算签名。
请替换示例中的域名、应用凭据及业务数据;时间戳、随机串和签名由公共客户端生成。
完整请求示例
POST /api/open.merchant/registerQry
Content-Type: application/json
{
"app_id": "ak_your_app_id",
"sign_type": "HMAC-SHA256",
"timestamp": "运行时生成",
"nonce": "每次请求生成新随机串",
"channel": "yibao",
"requestNo": "yibao_example_request",
"sign": "由公共客户端计算"
}
业务错误与处理
| msg / 情况 | HTTP | 处理说明 |
|---|---|---|
| 入网请求号不能为空 | 200 | 提供 requestNo。 |
| 您未发起该请求号对应的入网申请,请核实 | 200 | 核对原进件返回的 outMchNo。 |
HTTP 200 时仍需检查 code;HTTP 401 请核对应用凭据与签名,HTTP 503 请稍后重试。
响应示例
{
"code": 1,
"msg": "操作成功",
"time": "1792740000",
"data": {
"applicationStatus": 1,
"auditOpinion": "",
"requestNo": "yibao_example_request",
"merchantNo": "10093518558",
"elecSignUrl": "",
"intentionAuthUrl": ""
}
}
业务响应字段
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
data.applicationStatus | integer / string | 是 | 进件状态:-1 待完善、0 待审核、1 成功、2 驳回、3 转人工、4 真实性待验证、5 待签合同、6 业务开通中;不是按数字大小推进。 |
data.auditOpinion | string / null | 是 | 审核意见或驳回原因。 |
data.requestNo | string | 是 | 对应 register 返回的 outMchNo。 |
data.merchantNo | string / null | 否 | 进件成功后返回的商户号,用于支付。 |
data.elecSignUrl | string / null | 否 | 合同签署地址。 |
data.intentionAuthUrl | string / null | 否 | 真实性验证地址。 |
公共协议见“公共参数与签名”。本接口的业务字段、完整请求和业务响应定义如下。
此接口暂未开放正式接入。查询进件结果请使用 registerQry。
业务参数
| 参数 | 类型 | 必填 / 位置 | 说明 |
|---|---|---|---|
channel | string | 是 | 开放平台文档约定的渠道。 取值:yibao。 |
mchNo | string | 是 | 商户号,对应 registerQry 返回的 merchantNo。 |
上表只列业务字段;完整请求还包含 app_id、timestamp、nonce、sign,sign_type 可省略。先合并全部参数,再计算签名。
请替换示例中的域名、应用凭据及业务数据;时间戳、随机串和签名由公共客户端生成。
完整请求示例
POST /api/open.merchant/merchantStatusQry
Content-Type: application/json
{
"app_id": "ak_your_app_id",
"sign_type": "HMAC-SHA256",
"timestamp": "运行时生成",
"nonce": "每次请求生成新随机串",
"channel": "yibao",
"mchNo": "10093518558",
"sign": "由公共客户端计算"
}
业务错误与处理
| msg / 情况 | HTTP | 处理说明 |
|---|---|---|
| 商户号不能为空 | 200 | 提供 mchNo。 |
| 响应不是有效 JSON | 200 | 此接口暂未开放,请使用 registerQry 查询进件结果。 |
HTTP 200 时仍需检查 code;HTTP 401 请核对应用凭据与签名,HTTP 503 请稍后重试。
响应示例
{
"code": 1,
"msg": "操作成功",
"time": "1792740000",
"data": {}
}
以下示例说明响应结构;请结合 code 和业务状态判断处理结果。
业务响应字段
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
data | 按渠道返回 | — | 业务处理结果,具体字段须在接入前确认。 |
公共协议见“公共参数与签名”。本接口的业务字段、完整请求和业务响应定义如下。
查询当前可用的收款通道标识;无需业务参数,按公共协议签名调用。
业务参数
无业务参数,仅提交公共参数。
上表只列业务字段;完整请求还包含 app_id、timestamp、nonce、sign,sign_type 可省略。先合并全部参数,再计算签名。
请替换示例中的域名、应用凭据及业务数据;时间戳、随机串和签名由公共客户端生成。
完整请求示例
POST /api/open.merchant/channels
Content-Type: application/json
{
"app_id": "ak_your_app_id",
"sign_type": "HMAC-SHA256",
"timestamp": "运行时生成",
"nonce": "每次请求生成新随机串",
"sign": "由公共客户端计算"
}
业务错误与处理
调用失败时查看 msg 提示;业务结果以返回状态或后续结果查询为准。
HTTP 200 时仍需检查 code;HTTP 401 请核对应用凭据与签名,HTTP 503 请稍后重试。
响应示例
{
"code": 1,
"msg": "success",
"time": "1792740000",
"data": {
"yibao": "易宝"
}
}
业务响应字段
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
data.yibao | string | 是 | 易宝渠道显示名称。 |
公共协议见“公共参数与签名”。本接口的业务字段、完整请求和业务响应定义如下。
此功能需平台协助开通。调用前请联系平台确认商户 id、图片资源标识及所需商户资料。
按本接口要求平铺提交字段,不使用 register 的嵌套分组;pics 使用已确认的资源标识。
保存申请返回的 applymentId,作为后续认证查询的 applyNo。
仅可操作或查询当前应用所属的商户和申请记录。
业务参数
| 参数 | 类型 | 必填 / 位置 | 说明 |
|---|---|---|---|
channel | string | 是 | 开放平台文档约定的渠道。 取值:yibao。 |
mchNo | string | 是 | 商户号。 |
id | integer | 是 | 商户记录标识,调用前联系平台获取并确认。 |
etpsAttr | string | 是 | 主体类型。 取值:1 / 2 / 3。 |
artifPhone | string | 是 | 法人手机号。 |
certifIdStartDate | string | 是 | 有效期开始日期,YYYY-MM-DD。 |
certifIdEndDate | string | 是 | 有效期结束日期,YYYY-MM-DD;长期证件使用“长期”。 |
provinceName | string | 是 | 省名称。 |
cityName | string | 是 | 市名称。 |
districtName | string | 是 | 区县名称。 |
addressReg | string | 是 | 详细地址。 |
businessLicenseStartDate | string | 是 | 执照开始日期。 |
businessLicenseEndDate | string | 是 | 执照结束日期或“长期”。 |
pics | object | 是 | |
pics.03 | string | 是 | 证照资源标识;请在调用前确认所需资源标识,不可使用 upload 返回的文件路径代替。 |
pics.05 | string | 小微条件 | 小微门头照片的渠道资源标识。 |
pics.04 | string | 小微条件 | 小微店内照片的渠道资源标识。 |
mchName | string | 小微条件 | 小微门店名。 |
busCityCode | string | 小微条件 | 小微经营地址市编码。 |
上表只列业务字段;完整请求还包含 app_id、timestamp、nonce、sign,sign_type 可省略。先合并全部参数,再计算签名。
请替换示例中的域名、应用凭据及业务数据;时间戳、随机串和签名由公共客户端生成。
完整请求示例
POST /api/open.merchant/wechatAuthApply
Content-Type: application/json
{
"app_id": "ak_your_app_id",
"sign_type": "HMAC-SHA256",
"timestamp": "运行时生成",
"nonce": "每次请求生成新随机串",
"channel": "yibao",
"mchNo": "10093518558",
"id": 123,
"etpsAttr": "2",
"artifPhone": "13800138000",
"certifIdStartDate": "2015-01-01",
"certifIdEndDate": "2035-01-01",
"provinceName": "河南省",
"cityName": "郑州市",
"districtName": "中原区",
"addressReg": "某某街道 100 号 3 层",
"businessLicenseStartDate": "2019-06-01",
"businessLicenseEndDate": "2039-06-01",
"pics": {
"03": "渠道证照资源标识"
},
"sign": "由公共客户端计算"
}
业务错误与处理
调用失败时查看 msg 提示;业务结果以返回状态或后续结果查询为准。
HTTP 200 时仍需检查 code;HTTP 401 请核对应用凭据与签名,HTTP 503 请稍后重试。
响应示例
{
"code": 1,
"msg": "操作成功",
"time": "1792740000",
"data": {
"applymentId": "渠道申请单号"
}
}
以下示例说明响应结构;请结合 code 和业务状态判断处理结果。
业务响应字段
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
data.applymentId | string | 是 | 认证申请单号;后续认证查询时作为 applyNo 提交。 |
公共协议见“公共参数与签名”。本接口的业务字段、完整请求和业务响应定义如下。
此功能需平台协助开通。调用前请联系平台确认商户 id、图片资源标识及所需商户资料。
按本接口要求平铺提交字段,不使用 register 的嵌套分组;pics 使用已确认的资源标识。
保存申请返回的 applymentId,作为后续认证查询的 applyNo。
仅可操作或查询当前应用所属的商户和申请记录。
业务参数
| 参数 | 类型 | 必填 / 位置 | 说明 |
|---|---|---|---|
channel | string | 是 | 开放平台文档约定的渠道。 取值:yibao。 |
mchNo | string | 是 | 商户号。 |
id | integer | 是 | 商户记录标识,调用前联系平台获取并确认。 |
etpsAttr | string | 是 | 主体类型。 取值:1 / 2 / 3。 |
artifPhone | string | 是 | 法人手机号。 |
certifIdStartDate | string | 是 | 有效期开始日期,YYYY-MM-DD。 |
certifIdEndDate | string | 是 | 有效期结束日期,YYYY-MM-DD;长期证件使用“长期”。 |
provinceName | string | 是 | 省名称。 |
cityName | string | 是 | 市名称。 |
districtName | string | 是 | 区县名称。 |
addressReg | string | 是 | 详细地址。 |
businessLicenseStartDate | string | 是 | 执照开始日期。 |
businessLicenseEndDate | string | 是 | 执照结束日期或“长期”。 |
pics | object | 小微条件 | |
pics.05 | string | 小微条件 | 小微门头照片的渠道资源标识。 |
pics.04 | string | 小微条件 | 小微店内照片的渠道资源标识。 |
mchName | string | 小微条件 | 小微门店名。 |
busCityCode | string | 小微条件 | 小微经营地址市编码。 |
artifCertifType | string | 是 | 法人证件类型。 |
businessLicense | string | 是 | 营业执照编号。 |
uboInfoList | array | 是 | 此申请使用 uboInfoList,不是 register 的 ubo;图片使用渠道资源标识。 |
uboInfoList[].uboName | string | 是 | 受益人姓名。 |
uboInfoList[].uboIdCard | string | 是 | 受益人证件号。 |
uboInfoList[].uboFrontPic | string | 是 | 正面渠道图片标识。 |
uboInfoList[].uboBackPic | string | 是 | 反面渠道图片标识。 |
uboInfoList[].uboAddress | string | 是 | 受益人地址。 |
uboInfoList[].uboIdStartDate | string | 是 | 有效期开始日期,YYYY-MM-DD。 |
uboInfoList[].uboIdEndDate | string | 是 | 有效期结束日期,YYYY-MM-DD;长期证件使用“长期”。 |
busProvinceCode | string | 小微条件 | 小微经营省编码。 |
busDistrictCode | string | 小微条件 | 小微经营区县编码。 |
addressBuss | string | 小微条件 | 小微经营详细地址。 |
上表只列业务字段;完整请求还包含 app_id、timestamp、nonce、sign,sign_type 可省略。先合并全部参数,再计算签名。
请替换示例中的域名、应用凭据及业务数据;时间戳、随机串和签名由公共客户端生成。
完整请求示例
POST /api/open.merchant/alipayAuthApply
Content-Type: application/json
{
"app_id": "ak_your_app_id",
"sign_type": "HMAC-SHA256",
"timestamp": "运行时生成",
"nonce": "每次请求生成新随机串",
"channel": "yibao",
"mchNo": "10093518558",
"id": 123,
"etpsAttr": "2",
"artifPhone": "13800138000",
"certifIdStartDate": "2015-01-01",
"certifIdEndDate": "2035-01-01",
"provinceName": "河南省",
"cityName": "郑州市",
"districtName": "中原区",
"addressReg": "某某街道 100 号 3 层",
"businessLicenseStartDate": "2019-06-01",
"businessLicenseEndDate": "2039-06-01",
"artifCertifType": "00",
"businessLicense": "91410100MA3XXXXXXX",
"uboInfoList": [
{
"uboName": "张三",
"uboIdCard": "410000199001011234",
"uboFrontPic": "渠道受益人正面资源",
"uboBackPic": "渠道受益人反面资源",
"uboAddress": "河南省郑州市中原区某某街道",
"uboIdStartDate": "2015-01-01",
"uboIdEndDate": "2035-01-01"
}
],
"sign": "由公共客户端计算"
}
业务错误与处理
调用失败时查看 msg 提示;业务结果以返回状态或后续结果查询为准。
HTTP 200 时仍需检查 code;HTTP 401 请核对应用凭据与签名,HTTP 503 请稍后重试。
响应示例
{
"code": 1,
"msg": "操作成功",
"time": "1792740000",
"data": {
"applymentId": "渠道申请单号"
}
}
以下示例说明响应结构;请结合 code 和业务状态判断处理结果。
业务响应字段
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
data.applymentId | string | 是 | 认证申请单号;后续认证查询时作为 applyNo 提交。 |
公共协议见“公共参数与签名”。本接口的业务字段、完整请求和业务响应定义如下。
使用认证申请返回的申请单号查询认证结果。
仅可操作或查询当前应用所属的商户和申请记录。
业务参数
| 参数 | 类型 | 必填 / 位置 | 说明 |
|---|---|---|---|
channel | string | 是 | 开放平台文档约定的渠道。 取值:yibao。 |
applyNo | string | 是 | 申请受理结果中的 applymentId;本接口入参名为 applyNo。 |
mchNo | string | 是 | 商户号。 |
上表只列业务字段;完整请求还包含 app_id、timestamp、nonce、sign,sign_type 可省略。先合并全部参数,再计算签名。
请替换示例中的域名、应用凭据及业务数据;时间戳、随机串和签名由公共客户端生成。
完整请求示例
POST /api/open.merchant/wechatAuthQry
Content-Type: application/json
{
"app_id": "ak_your_app_id",
"sign_type": "HMAC-SHA256",
"timestamp": "运行时生成",
"nonce": "每次请求生成新随机串",
"channel": "yibao",
"applyNo": "渠道申请单号",
"mchNo": "10093518558",
"sign": "由公共客户端计算"
}
业务错误与处理
调用失败时查看 msg 提示;业务结果以返回状态或后续结果查询为准。
HTTP 200 时仍需检查 code;HTTP 401 请核对应用凭据与签名,HTTP 503 请稍后重试。
响应示例
{
"code": 1,
"msg": "操作成功",
"time": "1792740000",
"data": {}
}
以下示例说明响应结构;请结合 code 和业务状态判断处理结果。
业务响应字段
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
data | 按渠道返回 | — | 业务处理结果,具体字段须在接入前确认。 |
公共协议见“公共参数与签名”。本接口的业务字段、完整请求和业务响应定义如下。
使用认证申请返回的申请单号查询认证结果。
仅可操作或查询当前应用所属的商户和申请记录。
业务参数
| 参数 | 类型 | 必填 / 位置 | 说明 |
|---|---|---|---|
channel | string | 是 | 开放平台文档约定的渠道。 取值:yibao。 |
applyNo | string | 是 | 申请受理结果中的 applymentId;本接口入参名为 applyNo。 |
mchNo | string | 是 | 商户号。 |
上表只列业务字段;完整请求还包含 app_id、timestamp、nonce、sign,sign_type 可省略。先合并全部参数,再计算签名。
请替换示例中的域名、应用凭据及业务数据;时间戳、随机串和签名由公共客户端生成。
完整请求示例
POST /api/open.merchant/alipayAuthQry
Content-Type: application/json
{
"app_id": "ak_your_app_id",
"sign_type": "HMAC-SHA256",
"timestamp": "运行时生成",
"nonce": "每次请求生成新随机串",
"channel": "yibao",
"applyNo": "渠道申请单号",
"mchNo": "10093518558",
"sign": "由公共客户端计算"
}
业务错误与处理
调用失败时查看 msg 提示;业务结果以返回状态或后续结果查询为准。
HTTP 200 时仍需检查 code;HTTP 401 请核对应用凭据与签名,HTTP 503 请稍后重试。
响应示例
{
"code": 1,
"msg": "操作成功",
"time": "1792740000",
"data": {}
}
以下示例说明响应结构;请结合 code 和业务状态判断处理结果。
业务响应字段
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
data | 按渠道返回 | — | 业务处理结果,具体字段须在接入前确认。 |
为已开通收款能力的商户创建支付订单。按支付方式获取二维码内容、H5 支付链接或支付调起参数,完成支付后通过结果通知或订单查询确认支付状态。
应用与收款商户须已开通所选支付方式及场景的产品。channel 固定填写 yibao;下表中的微信或支付宝选择使用 payChannel 参数。
code=1 表示下单成功,不表示付款完成。请以已验签的支付结果通知或 orderQuery 查询结果确认支付状态。
每笔业务使用唯一 orderId。请求超时或结果不确定时,先查询原订单;同单重试保持业务参数一致。
通知成功应答为 HTTP 2xx 与纯文本 SUCCESS;同一通知最多自动投递 10 次(含首次),失败等待间隔为 10、20、40、80、160、320、640、1280、2560 秒,不支持暂停响应指令。详细规则及接收示例见异步通知章节。
业务参数
| 参数 | 类型 | 必填 / 位置 | 说明 |
|---|---|---|---|
channel | string | 是 | 收款通道标识,当前固定填写 yibao。 取值:yibao。 |
merchantNo | string | 是 | 收款商户号,可从商户进件结果获取;须已开通对应支付能力。 |
orderAmount | string | 是 | 订单金额,单位元,范围 0.01 至 99999999.99,最多两位小数。 |
payWay | string | 是 | 支付方式须与 payChannel 组合选择:WECHAT 支持 USER_SCAN / WECHAT_OFFIACCOUNT / MINI_PROGRAM / SDK_PAY;ALIPAY 支持 USER_SCAN / MINI_PROGRAM / ALIPAY_LIFE / H5_PAY。 取值:USER_SCAN / WECHAT_OFFIACCOUNT / MINI_PROGRAM / SDK_PAY / ALIPAY_LIFE / H5_PAY。 |
goodsName | string | 是 | 商品名称,必填。 最大 85 个字符。 |
userId | string | 公众号 / 小程序 / 生活号必填 | 付款人标识:微信公众号或小程序填写 openId,支付宝生活号或小程序填写支付宝 userId,须与 appId 对应。扫码、微信 SDK 和 H5 支付可不传。 最大 128 个字符。 |
appId | string | 公众号 / 小程序 / 生活号 / SDK 必填 | 支付应用 ID;公众号、小程序、生活号和微信 SDK 支付必传,须对应已开通的支付应用。与公共参数 app_id 区分填写。 最大 64 个字符。 |
orderId | string | 否 | 商户业务订单号,建议必传且全局唯一。由 1 至 64 位字母、数字、下划线或连字符组成;不传则自动生成。相同订单重试须保持业务参数一致。 最大 64 个字符。 |
scene | string | 否 | 支付场景:ONLINE 线上,OFFLINE 线下。微信支持两种场景,支付宝仅支持 OFFLINE;须已开通对应场景的支付产品。 取值:ONLINE / OFFLINE。 默认:"OFFLINE"。 |
userIp | string | 否 | 付款人 IP 地址,可不传。 |
payChannel | string | 否 | 支付渠道:WECHAT 微信,ALIPAY 支付宝。建议显式填写;省略时 ALIPAY_LIFE、H5_PAY 默认 ALIPAY,其余默认 WECHAT。小程序支付请按实际渠道填写。与固定为 yibao 的 channel 区分。 取值:WECHAT / ALIPAY。 |
expiredTime | string | 否 | 支付截止时间,使用北京时间 yyyy-MM-dd HH:mm:ss,须晚于当前时间。省略时默认 30 分钟有效;同单重试保持原值。 |
fundProcessType | string | 否 | 资金处理方式。REAL_TIME:支付成功后自动处理费用并释放商户余款。DELAY_SETTLE:保留商户余款待后续处理;后续可按订单分账接口处理,完结分账暂未开放。 取值:REAL_TIME / DELAY_SETTLE。 默认:"REAL_TIME"。 |
notifyUrl | string | 否 | 支付成功通知地址,建议填写可从公网访问的 HTTP(S) 地址,使用标准端口,不能包含用户名或 URL 片段。不传则不发送支付通知。 最大 2048 个字符。 |
memo | string | 否 | 业务备注,在支付通知和订单查询中原样返回。 最大 256 个字符。 |
businessInfo | string | 否 | 业务扩展信息,填写 JSON 对象或数组字符串,最多 4096 个 UTF-8 字节;在支付通知和订单查询中原样返回。 最大 4096 个字符。 |
上表只列业务字段;完整请求还包含 app_id、timestamp、nonce、sign,sign_type 可省略。先合并全部参数,再计算签名。
支付渠道、场景与方式组合
| payChannel | scene | payWay |
|---|---|---|
| ONLINE / OFFLINE | USER_SCAN / WECHAT_OFFIACCOUNT / MINI_PROGRAM / SDK_PAY | |
| ALIPAY | OFFLINE | USER_SCAN / MINI_PROGRAM / ALIPAY_LIFE / H5_PAY |
请替换示例中的域名、应用凭据及业务数据;时间戳、随机串和签名由公共客户端生成。
完整请求示例
POST /api/open.merchant/prePay
Content-Type: application/json
{
"app_id": "ak_your_app_id",
"sign_type": "HMAC-SHA256",
"timestamp": "运行时生成",
"nonce": "每次请求生成新随机串",
"channel": "yibao",
"merchantNo": "10000000002",
"orderId": "SH20261023000001",
"orderAmount": "100.00",
"payChannel": "WECHAT",
"payWay": "USER_SCAN",
"goodsName": "测试商品",
"notifyUrl": "https://merchant.example.com/payment/notify",
"memo": "外部订单备注",
"businessInfo": "{\"externalOrderId\":\"EXT202610230001\"}",
"sign": "由公共客户端计算"
}
业务错误与处理
| msg / 情况 | HTTP | 处理说明 |
|---|---|---|
| payChannel 与 payWay 组合不支持 | 200 | 按文档支持的微信/支付宝组合提交。 |
| 订单金额须为 0.01 至 99999999.99 元,最多两位小数 | 200 | 用十进制元金额提交,勿传超精度或科学计数法字符串。 |
| goodsName 必须为非空字符串且不超过 85 个字符 | 200 | 明确提供商品名称。 |
| orderId 已存在且请求归属或业务参数不一致 | 200 | 勿跨应用复用订单号或修改同一订单业务参数。 |
| expiredTime 必须晚于当前时间 | 200 | 按北京时间设置未来截止时间。 |
| 应用未启用该支付产品 | 200 | 联系平台确认当前应用已开通所选支付产品。 |
| scene 仅支持 ONLINE、OFFLINE | 200 | 按支持的场景取值提交;省略时默认 OFFLINE。 |
| 支付宝支付当前仅支持 scene=OFFLINE | 200 | payChannel=ALIPAY 时使用 OFFLINE。 |
| 公众号、小程序、生活号支付必须明确提供 appId 和 userId | 200 | 按所选支付方式提交非空的支付应用 ID 和付款人标识。 |
| 微信 SDK 支付必须明确提供 appId | 200 | SDK_PAY 必须填写支付应用 appId;userId 可省略。 |
HTTP 200 时仍需检查 code;HTTP 401 请核对应用凭据与签名,HTTP 503 请稍后重试。
响应示例
{
"code": 1,
"msg": "success",
"time": "1792740000",
"data": {
"response_arr": "https://qr.yeepay.com/******",
"pay_way": "USER_SCAN",
"channel": "WECHAT",
"order_id": "202610221530001234",
"unique_order_no": "1001202610220000001"
}
}
业务响应字段
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
data.response_arr | string / object | 是 | USER_SCAN 返回二维码内容字符串;H5_PAY 返回支付跳转链接字符串;公众号、小程序、生活号和微信 SDK 返回支付调起参数,可能为对象或 JSON 字符串,请按所选支付方式解析。 |
data.pay_way | string | 是 | 请求的支付方式。 |
data.channel | string | 是 | 支付渠道:WECHAT 微信,ALIPAY 支付宝。 |
data.order_id | string | 是 | 订单号,用于查询和核对支付结果。 |
data.unique_order_no | string | 是 | 支付流水号,尚未取得时为空字符串。 |
支付成功通知
支付成功后,下单时填写的 notifyUrl 将收到 POST JSON 通知。通知签名方式与下单请求一致;HMAC-SHA256 使用应用密钥验签,RSA2 使用平台提供的通知公钥验签。重复通知使用同一 notify_id,请在业务处理成功后返回 SUCCESS。
通知字段
| 参数 | 类型 | 必填 / 位置 | 说明 |
|---|---|---|---|
app_id | string | 是 | 本次通知所属应用标识;须与你方该通知接收端使用的应用配置一致。 |
sign_type | string | 是 | 本次通知的签名方式,与该业务申请使用的签名方式一致。 取值:HMAC-SHA256 / RSA2。 |
timestamp | string | 是 | 本次通知发送的 Unix 秒级时间戳;重试时重新生成,验签允许偏差 300 秒。 |
nonce | string | 是 | 本次通知的随机串,重试时重新生成;业务去重使用固定 notify_id。 |
sign | string | 是 | 对通知中除 sign 外的非空字段验签,排序、空值和 JSON 规则同公共协议。HMAC 使用本应用 app_secret;RSA2 使用平台提供的通知公钥,不能使用你方应用公钥。 |
notify_id | string | 是 | 固定通知标识,重试时不变;请使用此字段去重,避免重复处理业务。 |
orderId | string | 是 | 订单号,对应下单时的 orderId;下单未传时为返回的生成值。 |
merchantNo | string | 是 | 收款商户号。 |
orderAmount | string | 是 | 原订单金额,单位元,两位小数;须与接入方订单核对。 |
status | string | 是 | SUCCESS 表示该订单支付成功;请核对订单号与金额后处理业务。 取值:SUCCESS。 |
uniqueOrderNo | string | 是 | 支付流水号,可用于核对交易。 |
paidTime | string | 是 | 支付成功时间,北京时间 yyyy-MM-dd HH:mm:ss。 |
payChannel | string | 是 | 本次支付渠道:WECHAT 微信,ALIPAY 支付宝。 取值:WECHAT / ALIPAY。 |
payWay | string | 是 | 本次订单的支付方式,与下单请求一致。 取值:USER_SCAN / WECHAT_OFFIACCOUNT / MINI_PROGRAM / SDK_PAY / ALIPAY_LIFE / H5_PAY。 |
fundProcessType | string | 是 | 下单时选择的资金处理方式。 取值:REAL_TIME / DELAY_SETTLE。 默认:"REAL_TIME"。 |
memo | string | 是 | 下单时提交的业务备注原值。 最大 256 个字符。 |
businessInfo | string | 是 | 下单时提交的 businessInfo 原始 JSON 字符串。 最大 4096 个字符。 |
通知结构示例
{
"app_id": "ak_your_app_id",
"sign_type": "HMAC-SHA256",
"timestamp": "运行时生成",
"nonce": "本次通知生成的随机串",
"notify_id": "N_example_stable_notification_id",
"orderId": "SH20261023000001",
"merchantNo": "10000000002",
"orderAmount": "100.00",
"status": "SUCCESS",
"uniqueOrderNo": "1001202610230000001",
"paidTime": "2026-10-23 17:00:00",
"payChannel": "WECHAT",
"payWay": "USER_SCAN",
"fundProcessType": "REAL_TIME",
"memo": "外部订单备注",
"businessInfo": "{\"externalOrderId\":\"EXT202610230001\"}",
"sign": "平台使用应用凭证生成的通知签名"
}
请先验签,核对业务请求及金额,使用 notify_id 去重;通知包含 version 时,较低版本不得覆盖新状态,包含 detailId 时须分别比较每笔明细的版本。业务处理成功后返回 HTTP 2xx 和纯文本 SUCCESS(大小写均可)。通知失败会重试,请避免重复发货或记账。
$payload = json_decode(file_get_contents('php://input'), true);
// HMAC 使用 app_secret;RSA2 第三个参数传平台提供的通知公钥。
$verified = is_array($payload) && $client->verifyNotification($payload, $platformPublicKey ?? '');
// 验签通过后,核对业务请求及金额,完成业务处理和通知去重,再应答 SUCCESS。
使用当前应用商户的资金账户,向同一应用下的商户账户申请分账。手续费承担方式可逐笔选择。
出款商户与全部接收商户均须属于当前应用,且已满足相应分账产品和商户关系要求。接口权限标识为 open.merchant/balancedivide。
仅支持资金账户向商户账户分账。明细中的 ledgerType 填写 MERCHANT;不可提交 parentMerchantNo、bankAccountBookNo、fundType 等未列出的字段。
每笔明细可填写 feeChargeSide=OUTSIDE 或 INSIDE;省略时为 OUTSIDE。实际扣账、到账和手续费金额以结果为准,不能只按申请金额推算。
code=1、status=ACCEPTED 仅表示申请受理。请通过签名通知或 balanceDivideQuery 确认每笔处理结果。
同一出款商户内的 divideRequestId 须唯一。同一应用、相同请求号和相同业务参数重复调用时返回原受理信息,修改参数时拒绝。
请求超时、受理结果不明确或暂未查到记录时,继续使用原 divideRequestId 查询,不能换号重复申请。
通知逐笔发送,请使用 notify_id 去重,并按 detailId 分别记录最新 version。不同明细的版本相互独立,较低版本不得覆盖同一明细的新状态。
成功后仍可能因冲退收到更高版本的 FAIL 通知,请按更新版本处理;reversed=true 表示已确认该明细曾成功、之后转为失败。
notifyUrl 选填;省略或为空字符串时不发送通知,仍可使用 balanceDivideQuery 查询结果。
通知成功应答为 HTTP 2xx 与纯文本 SUCCESS;同一通知最多自动投递 10 次(含首次),失败等待间隔为 10、20、40、80、160、320、640、1280、2560 秒,不支持暂停响应指令。详细规则及接收示例见异步通知章节。
业务参数
| 参数 | 类型 | 必填 / 位置 | 说明 |
|---|---|---|---|
channel | string | 是 | 收款通道标识,固定填写 yibao。 取值:yibao。 |
merchantNo | string | 是 | 出款商户号,须属于当前签名应用且已完成入网并开通分账能力。 最大 16 个字符。 |
divideRequestId | string | 是 | 你方生成的业务请求号,同一出款商户内唯一。结果不明确时保持原号查询,不能换号重试。 最大 64 个字符。 |
divideDetail | string | 是 | JSON 数组字符串,原文及规范编码后均不超过 1024 个 UTF-8 字节,包含 1 至 30 笔明细;各笔字段见下表。 最大 1024 个字符。 |
notifyUrl | string | 否 | 接收逐笔分账结果通知的公网 HTTP(S) 地址。省略或为空字符串时不发送通知,请使用 balanceDivideQuery 查询。 最大 2048 个字符。 |
上表只列业务字段;完整请求还包含 app_id、timestamp、nonce、sign,sign_type 可省略。先合并全部参数,再计算签名。
divideDetail JSON 明细字段
该参数仍按 JSON 字符串提交,下表说明字符串中每笔明细的字段。
| 参数 | 类型 | 必填 / 位置 | 说明 |
|---|---|---|---|
divideDetail[].ledgerNo | string | 是 | 接收商户号,须为当前应用下已完成入网的商户。 最大 16 个字符。 |
divideDetail[].ledgerType | string | 是 | 接收方类型,目前仅支持商户账户。 取值:MERCHANT。 |
divideDetail[].divideAmount | string | 是 | 分账金额,单位元;使用大于零、最多两位小数的十进制字符串。 |
divideDetail[].feeChargeSide | string | 否 | 手续费承担方式。OUTSIDE:出款方额外承担;INSIDE:从接收方到账金额中扣除。是否适用取决于商户已开通的计费方式,实际费用及扣账、到账金额以结果为准。 取值:OUTSIDE / INSIDE。 默认:"OUTSIDE"。 |
divideDetail[].remark | string | 否 | 分账附言,最多 32 字,不得包含换行或控制字符。 最大 32 个字符。 |
divideDetail[].divideReason | string | 否 | 分账说明,最多 40 字,不得包含换行或控制字符。 最大 40 个字符。 |
请替换示例中的域名、应用凭据及业务数据;时间戳、随机串和签名由公共客户端生成。
完整请求示例
POST /api/open.merchant/balanceDivide
Content-Type: application/json
{
"app_id": "ak_your_app_id",
"sign_type": "HMAC-SHA256",
"timestamp": "运行时生成",
"nonce": "每次请求生成新随机串",
"channel": "yibao",
"merchantNo": "10000000002",
"divideRequestId": "DIV_20261024_0001",
"divideDetail": "[{\"ledgerNo\":\"10000000003\",\"ledgerType\":\"MERCHANT\",\"divideAmount\":\"100.00\",\"feeChargeSide\":\"OUTSIDE\",\"remark\":\"订单结算\",\"divideReason\":\"业务分账\"}]",
"notifyUrl": "https://your-domain.com/notify/balance-divide",
"sign": "由公共客户端计算"
}
业务错误与处理
| msg / 情况 | HTTP | 处理说明 |
|---|---|---|
| 余额分账暂未开放 | 200 | 请确认应用和商户已获得余额分账接入权限。 |
| 商户不存在或无权访问 | 200 | 核对出款商户及每一笔接收商户,均须属于当前应用。 |
| divideDetail 必须为不超过 1024 字节的有效 JSON 数组字符串 | 200 | 使用 JSON 数组字符串,不要传对象、直接数组或 HTML 转义后的字符串。 |
| 分账明细编码后不得超过 1024 字节 | 200 | 减少单次明细数量或附言长度;每次最多 30 笔,同时满足长度限制。 |
| 分账接收方不可重复 | 200 | 同一次申请中每个接收商户仅可出现一次。 |
| feeChargeSide 仅支持 OUTSIDE、INSIDE | 200 | 在每笔明细内填写有效的承担方式。 |
| divideRequestId 已存在且归属或业务参数不一致 | 200 | 查询并核对原申请,勿修改参数或换应用重提。 |
| 分账申请受理结果未确认,请使用原 divideRequestId 查询,勿换号重试 | 200 | 原申请可能已受理,继续使用原请求号核对结果。 |
| 余额分账不支持参数 <字段> | 200 | 按参数表提交请求,删除未开放字段;结果通知地址使用 notifyUrl。 |
HTTP 200 时仍需检查 code;HTTP 401 请核对应用凭据与签名,HTTP 503 请稍后重试。
响应示例
{
"code": 1,
"msg": "分账申请已受理,请查询最终结果",
"time": "1792840000",
"data": {
"merchantNo": "10000000002",
"divideRequestId": "DIV_20261024_0001",
"status": "ACCEPTED",
"acceptedAt": 1792840000,
"totalAmount": "100.00",
"detailCount": 1,
"detailList": [
{
"detailId": "DD_example_detail",
"ledgerNo": "10000000003",
"ledgerType": "MERCHANT",
"divideAmount": "100.00",
"feeChargeSide": "OUTSIDE"
}
]
}
}
业务响应字段
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
data.merchantNo | string | 是 | 出款商户号。 |
data.divideRequestId | string | 是 | 原分账请求号。 |
data.status | string | 是 | ACCEPTED 仅表示受理,不代表各笔资金处理完成。 取值:ACCEPTED。 |
data.acceptedAt | integer | 是 | 受理确认的 Unix 秒时间戳。 |
data.totalAmount | string | 是 | 申请分账总金额,不含可能额外承担的手续费。 |
data.detailCount | integer | 是 | 申请明细数量。 |
data.detailList | array | 是 | |
data.detailList[].detailId | string | 是 | 稳定的分账明细标识;通知去重及版本比较须按此明细分别处理。 最大 64 个字符。 |
data.detailList[].ledgerNo | string | 是 | 接收商户号。 最大 16 个字符。 |
data.detailList[].ledgerType | string | 是 | 接收方类型。 取值:MERCHANT。 |
data.detailList[].divideAmount | string | 是 | 申请分账金额,单位元。 |
data.detailList[].feeChargeSide | string | 是 | 本笔申请的手续费承担方式。 取值:OUTSIDE / INSIDE。 |
逐笔余额分账结果通知
通知采用 POST application/json,签名方式与申请一致。HMAC-SHA256 使用应用密钥验签;RSA2 使用通知公钥验签。核对商户、请求号、明细和金额,按 notify_id 去重、按 detailId 分别比较 version。业务处理成功后返回 HTTP 2xx 和纯文本 SUCCESS。通知失败会重试,同一版本的业务内容不变。
通知字段
| 参数 | 类型 | 必填 / 位置 | 说明 |
|---|---|---|---|
app_id | string | 是 | 本次通知所属应用标识;须与你方该通知接收端使用的应用配置一致。 |
sign_type | string | 是 | 本次通知的签名方式,与该业务申请使用的签名方式一致。 取值:HMAC-SHA256 / RSA2。 |
timestamp | string | 是 | 本次通知发送的 Unix 秒级时间戳;重试时重新生成,验签允许偏差 300 秒。 |
nonce | string | 是 | 本次通知的随机串,重试时重新生成;业务去重使用固定 notify_id。 |
sign | string | 是 | 对通知中除 sign 外的非空字段验签,排序、空值和 JSON 规则同公共协议。HMAC 使用本应用 app_secret;RSA2 使用平台提供的通知公钥,不能使用你方应用公钥。 |
detailId | string | 是 | 稳定的分账明细标识;通知去重及版本比较须按此明细分别处理。 最大 64 个字符。 |
detailNo | string / null | 是 | 分账处理明细号,尚未取得时为 null。 最大 64 个字符。 |
ledgerNo | string | 是 | 接收商户号。 最大 16 个字符。 |
ledgerType | string | 是 | 接收方类型。 取值:MERCHANT。 |
divideAmount | string | 是 | 申请分账金额,单位元。 |
feeChargeSide | string | 是 | 本笔申请的手续费承担方式。 取值:OUTSIDE / INSIDE。 |
status | string | 是 | 单笔处理状态;成功后发生冲退时仍可能变为 FAIL。 取值:SUCCESS / FAIL。 |
reversed | boolean | 是 | 是否已确认本笔分账曾成功、之后转为失败。 |
version | integer | 是 | 同一 detailId 内递增的通知版本,从 1 开始;不同明细分别比较,较低版本不得覆盖新状态。 |
receiveAmount | string / null | 是 | 实际到账金额;尚未确认时为 null,不得按申请金额或零推算。 |
debitAmount | string / null | 是 | 实际扣账金额;尚未确认时为 null。 |
feeAmount | string / null | 是 | 实际分账手续费;尚未确认时为 null。 |
finishTime | string / null | 是 | 结果中返回的完成时间;尚未取得时为 null。 |
failReason | string | 是 | 失败原因,无失败原因时为空字符串。 |
remark | string | 是 | 申请时填写的附言。 |
divideReason | string | 是 | 申请时填写的分账说明。 |
notify_id | string | 是 | 固定通知标识,重试不变。 |
eventType | string | 是 | 通知类型。 取值:BALANCE_DIVIDE_RESULT。 |
merchantNo | string | 是 | 原出款商户号。 |
divideRequestId | string | 是 | 原分账请求号。 |
occurredAt | integer | 是 | 本版本结果的确认时间,Unix 秒时间戳;重试时不变。 |
通知结构示例
{
"app_id": "ak_your_app_id",
"sign_type": "HMAC-SHA256",
"timestamp": "1792840060",
"nonce": "本次通知生成的新随机串",
"sign": "通知签名",
"notify_id": "BN_example_notification",
"eventType": "BALANCE_DIVIDE_RESULT",
"merchantNo": "10000000002",
"divideRequestId": "DIV_20261024_0001",
"detailId": "DD_example_detail",
"detailNo": "DETAIL_EXAMPLE_1",
"ledgerNo": "10000000003",
"ledgerType": "MERCHANT",
"divideAmount": "100.00",
"feeChargeSide": "OUTSIDE",
"status": "SUCCESS",
"reversed": false,
"version": 1,
"receiveAmount": "100.00",
"debitAmount": "100.02",
"feeAmount": "0.02",
"finishTime": "2026-10-24 20:00:00",
"failReason": "",
"remark": "订单结算",
"divideReason": "业务分账",
"occurredAt": 1792840060
}
请先验签,核对业务请求及金额,使用 notify_id 去重;通知包含 version 时,较低版本不得覆盖新状态,包含 detailId 时须分别比较每笔明细的版本。业务处理成功后返回 HTTP 2xx 和纯文本 SUCCESS(大小写均可)。通知失败会重试,请避免重复发货或记账。
$payload = json_decode(file_get_contents('php://input'), true);
// HMAC 使用 app_secret;RSA2 第三个参数传平台提供的通知公钥。
$verified = is_array($payload) && $client->verifyNotification($payload, $platformPublicKey ?? '');
// 验签通过后,核对业务请求及金额,完成业务处理和通知去重,再应答 SUCCESS。
按原出款商户号和分账请求号,查询本应用申请的逐笔余额分账结果、实际金额和手续费。
仅可查询本应用发起的申请;查询权限标识为 open.merchant/balancedividequery,申请权限与查询权限分别授权。
使用原 merchantNo 和 divideRequestId 查询;不能用支付订单号、结算请求号替代。
请完整处理 detailList。不同明细可有不同结果;PROCESSING 表示尚有明细待确认,PARTIAL_SUCCESS 表示全部处理后部分成功。
成功结果后续仍可能变为 FAIL,请结合较高版本通知及查询结果处理冲退。
所有金额以元为单位,返回两位小数字符串。null 表示未取得有效金额,不得按零或申请金额处理;任一明细金额未知时,对应汇总金额为 null。
queriedAt 是最后一次成功核对结果的 Unix 秒时间戳。查询结果可能短暂延迟,建议轮询间隔不短于 5 秒。
查询失败、受理结果不明或暂未查到申请,均不能作为换号重新分账的依据。
商户关联至其他应用后,历史申请仍仅限原发起应用查询。
业务参数
| 参数 | 类型 | 必填 / 位置 | 说明 |
|---|---|---|---|
channel | string | 是 | 收款通道标识,固定填写 yibao。 取值:yibao。 |
merchantNo | string | 是 | 出款商户号,须属于当前签名应用且已完成入网并开通分账能力。 最大 16 个字符。 |
divideRequestId | string | 是 | 你方生成的业务请求号,同一出款商户内唯一。结果不明确时保持原号查询,不能换号重试。 最大 64 个字符。 |
上表只列业务字段;完整请求还包含 app_id、timestamp、nonce、sign,sign_type 可省略。先合并全部参数,再计算签名。
请替换示例中的域名、应用凭据及业务数据;时间戳、随机串和签名由公共客户端生成。
完整请求示例
POST /api/open.merchant/balanceDivideQuery
Content-Type: application/json
{
"app_id": "ak_your_app_id",
"sign_type": "HMAC-SHA256",
"timestamp": "运行时生成",
"nonce": "每次请求生成新随机串",
"channel": "yibao",
"merchantNo": "10000000002",
"divideRequestId": "DIV_20261024_0001",
"sign": "由公共客户端计算"
}
业务错误与处理
| msg / 情况 | HTTP | 处理说明 |
|---|---|---|
| 分账申请不存在或无权访问 | 200 | 核对原商户号、分账请求号及发起应用。 |
| 余额分账查询暂不可用,请稍后使用原请求号查询或联系技术支持 | 200 | 继续用原请求号核对,勿换号再次申请。 |
HTTP 200 时仍需检查 code;HTTP 401 请核对应用凭据与签名,HTTP 503 请稍后重试。
响应示例
{
"code": 1,
"msg": "查询成功",
"time": "1792840000",
"data": {
"merchantNo": "10000000002",
"divideRequestId": "DIV_20261024_0001",
"status": "SUCCESS",
"totalAmount": "100.00",
"detailCount": 1,
"successCount": 1,
"failCount": 0,
"processingCount": 0,
"acceptedAt": 1792840000,
"queriedAt": 1792840060,
"detailList": [
{
"detailId": "DD_example_detail",
"detailNo": "DETAIL_EXAMPLE_1",
"ledgerNo": "10000000003",
"ledgerType": "MERCHANT",
"divideAmount": "100.00",
"feeChargeSide": "OUTSIDE",
"status": "SUCCESS",
"reversed": false,
"version": 1,
"receiveAmount": "100.00",
"debitAmount": "100.02",
"feeAmount": "0.02",
"finishTime": "2026-10-24 20:00:00",
"failReason": "",
"remark": "订单结算",
"divideReason": "业务分账"
}
],
"receiveAmount": "100.00",
"debitAmount": "100.02",
"feeAmount": "0.02"
}
}
业务响应字段
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
data.merchantNo | string | 是 | 出款商户号。 |
data.divideRequestId | string | 是 | 原分账请求号。 |
data.status | string | 是 | 汇总状态。UNKNOWN:受理结果未确认;REJECTED:申请未受理;PROCESSING:仍有明细待确认;SUCCESS:当前全部成功;PARTIAL_SUCCESS:全部处理后部分成功;FAIL:当前全部失败。成功结果后续仍可能发生变化,须处理更新的结果通知。 取值:UNKNOWN / REJECTED / PROCESSING / SUCCESS / PARTIAL_SUCCESS / FAIL。 |
data.totalAmount | string | 是 | 申请分账总金额,不含可能额外承担的手续费。 |
data.detailCount | integer | 是 | |
data.successCount | integer | 是 | |
data.failCount | integer | 是 | |
data.processingCount | integer | 是 | |
data.acceptedAt | integer | 是 | 受理确认时间,Unix 秒时间戳;未确认时为 0。 |
data.queriedAt | integer | 是 | 最后一次成功核对分账结果的 Unix 秒时间戳;尚未取得有效查询结果时为 0。 |
data.detailList | array | 是 | |
data.detailList[].detailId | string | 是 | 稳定的分账明细标识;通知去重及版本比较须按此明细分别处理。 最大 64 个字符。 |
data.detailList[].detailNo | string / null | 是 | 分账处理明细号,尚未取得时为 null。 最大 64 个字符。 |
data.detailList[].ledgerNo | string | 是 | 接收商户号。 最大 16 个字符。 |
data.detailList[].ledgerType | string | 是 | 接收方类型。 取值:MERCHANT。 |
data.detailList[].divideAmount | string | 是 | 申请分账金额,单位元。 |
data.detailList[].feeChargeSide | string | 是 | 本笔申请的手续费承担方式。 取值:OUTSIDE / INSIDE。 |
data.detailList[].status | string | 是 | 单笔处理状态;成功后发生冲退时仍可能变为 FAIL。 取值:PROCESSING / SUCCESS / FAIL。 |
data.detailList[].reversed | boolean | 是 | 是否已确认本笔分账曾成功、之后转为失败。 |
data.detailList[].version | integer | 是 | 本明细的通知版本,尚无结果通知时为 0;不同明细分别计数。 |
data.detailList[].receiveAmount | string / null | 是 | 实际到账金额;尚未确认时为 null,不得按申请金额或零推算。 |
data.detailList[].debitAmount | string / null | 是 | 实际扣账金额;尚未确认时为 null。 |
data.detailList[].feeAmount | string / null | 是 | 实际分账手续费;尚未确认时为 null。 |
data.detailList[].finishTime | string / null | 是 | 结果中返回的完成时间;尚未取得时为 null。 |
data.detailList[].failReason | string | 是 | 失败原因,无失败原因时为空字符串。 |
data.detailList[].remark | string | 是 | 申请时填写的附言。 |
data.detailList[].divideReason | string | 是 | 申请时填写的分账说明。 |
data.receiveAmount | string / null | 是 | 已确认的逐笔到账金额合计;任一明细金额未知时为 null。 |
data.debitAmount | string / null | 是 | 已确认的逐笔扣账金额合计;任一明细金额未知时为 null。 |
data.feeAmount | string / null | 是 | 已确认的逐笔手续费合计;任一明细金额未知时为 null。 |
将原订单的可分账金额,按指定金额分配至同一应用下的商户。
仅支持已支付且当前可分账的 DELAY_SETTLE 订单。请先查询 orderQuery 的 canDivide 和 availableDivideAmount;实际是否可提交,以本次申请校验为准。
仅按金额分账,单次 1 至 5 笔明细,JSON 字符串原文及规范编码后均不超过 1000 个 UTF-8 字节。接收商户不得重复。
本接口使用订单剩余可分账金额,与资金账户余额不同。未分配余款继续保留,暂不开放解冻余款或指定比例分账。
同一商户内 divideRequestId 唯一。同一应用使用相同请求号、订单及规范化业务参数重复调用时返回原受理信息;更改参数时拒绝。
同一订单上一笔分账结果未确认前,不能发起下一笔。超时、处理中、未知结果或暂未查到时,只查询原 divideRequestId,不能换号重复申请。
一次申请按整批处理,任一接收方失败则整批失败,没有部分成功状态。SUCCESS 不等于已提现至银行卡。
notifyUrl 为唯一的结果通知地址,选填;省略或为空时不发送通知,请通过 orderDivideQuery 查询。通知验签后按 notify_id 去重,并按同一订单及请求号的 version 处理更新。
通知成功应答为 HTTP 2xx 与纯文本 SUCCESS;同一通知最多自动投递 10 次(含首次),失败等待间隔为 10、20、40、80、160、320、640、1280、2560 秒,不支持暂停响应指令。详细规则及接收示例见异步通知章节。
业务参数
| 参数 | 类型 | 必填 / 位置 | 说明 |
|---|---|---|---|
channel | string | 是 | 渠道标识,固定填写 yibao。 取值:yibao。 |
merchantNo | string | 是 | 原订单的收款商户编号,须属于当前应用。 最大 11 个字符。 |
orderId | string | 是 | 原支付订单号,须为当前应用创建的订单。 最大 64 个字符。 |
divideRequestId | string | 是 | 你方生成的分账请求号,同一收款商户内唯一。 最大 64 个字符。 |
divideDetail | string | 是 | 按金额分账的 JSON 数组字符串,长度限制为 1000 个 UTF-8 字节;各笔字段见下表。 最大 1000 个字符。 |
notifyUrl | string | 否 | 接收本批订单分账结果签名通知的公网 HTTP(S) 地址。选填;省略或为空字符串时不发送通知。 最大 2048 个字符。 |
上表只列业务字段;完整请求还包含 app_id、timestamp、nonce、sign,sign_type 可省略。先合并全部参数,再计算签名。
divideDetail JSON 明细字段
该参数仍按 JSON 字符串提交,下表说明字符串中每笔明细的字段。
| 参数 | 类型 | 必填 / 位置 | 说明 |
|---|---|---|---|
divideDetail[].ledgerNo | string | 是 | 接收商户编号,须属于同一应用且已完成入网及分账关系配置。 最大 11 个字符。 |
divideDetail[].amount | string | 是 | 本笔分账金额,单位元,大于零,最多两位小数;请按字符串填写。 |
divideDetail[].ledgerType | string | 否 | 商户间分账,省略时使用 MERCHANT2MERCHANT。 取值:MERCHANT2MERCHANT。 默认:"MERCHANT2MERCHANT"。 |
divideDetail[].divideDetailDesc | string | 否 | 分账说明,单行文本,最多 128 个 UTF-8 字节。 最大 128 个字符。 |
请替换示例中的域名、应用凭据及业务数据;时间戳、随机串和签名由公共客户端生成。
完整请求示例
POST /api/open.merchant/orderDivide
Content-Type: application/json
{
"app_id": "ak_your_app_id",
"sign_type": "HMAC-SHA256",
"timestamp": "运行时生成",
"nonce": "每次请求生成新随机串",
"channel": "yibao",
"merchantNo": "10000000002",
"orderId": "ORDER_20261025_0001",
"divideRequestId": "DIVIDE_20261025_0001",
"divideDetail": "[{\"ledgerNo\":\"10000000003\",\"amount\":\"10.37\",\"divideDetailDesc\":\"供应商结算\"}]",
"notifyUrl": "https://your-domain.com/notify/order-divide",
"sign": "由公共客户端计算"
}
业务错误与处理
| msg / 情况 | HTTP | 处理说明 |
|---|---|---|
| 订单暂不可分账,请稍后查询 | 200 | 先查询原订单的 canDivide,确认业务条件后再提交。 |
| 该订单存在未确认的分账申请,请先查询原申请 | 200 | 使用上一笔 divideRequestId 查询,不能更换请求号重复申请。 |
| 分账总金额超过订单可用额度 / 分账总金额超过订单剩余可分账金额 | 200 | 核对 availableDivideAmount,减少本次申请金额。 |
| 分账申请受理结果未确认,请使用原 divideRequestId 查询,勿换号重试 | 200 | 继续查询原申请;未查到不能认定原申请未受理。 |
| 订单分账不支持参数 <字段> | 200 | 按参数表提交,删除比例、发起方、解冻余款及其他未开放字段。 |
| 商户不存在或无权访问 | 200 | 核对订单、出款商户及全部接收商户的应用归属。 |
| divideRequestId 已存在且归属或业务参数不一致 | 200 | 核对原申请,不能更改订单、金额、接收方、通知地址或应用重复提交。 |
| 请稍后发起订单分账,勿频繁调用 | 200 | 支付成功后稍等,且同一订单分账申请至少间隔 3 秒。 |
HTTP 200 时仍需检查 code;HTTP 401 请核对应用凭据与签名,HTTP 503 请稍后重试。
响应示例
{
"code": 1,
"msg": "操作成功",
"time": "1792922400",
"data": {
"orderId": "ORDER_20261025_0001",
"merchantNo": "10000000002",
"divideRequestId": "DIVIDE_20261025_0001",
"status": "ACCEPTED",
"totalAmount": "10.37",
"detailCount": 1,
"acceptedAt": 1792922400
}
}
业务响应字段
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
data.orderId | string | 是 | 原支付订单号。 |
data.merchantNo | string | 是 | 收款商户编号。 |
data.divideRequestId | string | 是 | 你方分账请求号。 |
data.status | string | 是 | ACCEPTED 表示申请已受理,请继续查询最终结果。 取值:ACCEPTED。 |
data.totalAmount | string | 是 | 申请分账总金额,单位元。 |
data.detailCount | integer | 是 | 本次申请的明细笔数。 |
data.acceptedAt | integer | 是 | 申请受理时间,Unix 秒。 |
订单分账结果通知
每次申请按整批发送最终结果。通知签名方式与原申请一致:HMAC-SHA256 使用应用密钥验签,RSA2 使用通知公钥验签。收到较低版本或重复通知时,不重复记账。
通知字段
| 参数 | 类型 | 必填 / 位置 | 说明 |
|---|---|---|---|
app_id | string | 是 | 本次通知所属应用标识;须与你方该通知接收端使用的应用配置一致。 |
sign_type | string | 是 | 本次通知的签名方式,与该业务申请使用的签名方式一致。 取值:HMAC-SHA256 / RSA2。 |
timestamp | string | 是 | 本次通知发送的 Unix 秒级时间戳;重试时重新生成,验签允许偏差 300 秒。 |
nonce | string | 是 | 本次通知的随机串,重试时重新生成;业务去重使用固定 notify_id。 |
sign | string | 是 | 对通知中除 sign 外的非空字段验签,排序、空值和 JSON 规则同公共协议。HMAC 使用本应用 app_secret;RSA2 使用平台提供的通知公钥,不能使用你方应用公钥。 |
orderId | string | 是 | 原支付订单号。 |
merchantNo | string | 是 | 收款商户编号。 |
divideRequestId | string | 是 | 你方分账请求号。 |
status | string | 是 | 本批分账最终状态。 取值:SUCCESS / FAIL。 |
totalAmount | string | 是 | 申请分账总金额,单位元。 |
detailCount | integer | 是 | 本次申请的明细笔数。 |
acceptedAt | integer | 是 | 申请受理时间,Unix 秒。 |
version | integer | 是 | 结果版本,按同一 orderId、divideRequestId 比较。 |
feeAmount | string / null | 是 | 本批实际分账手续费合计;任何明细未确认时为 null。 |
receiveAmount | string / null | 是 | 本批实际入账金额合计;任何明细未确认时为 null。 |
finishTime | string / null | 是 | 分账完成时间;尚未取得为 null。 |
detailList | array | 是 | 本批分账全部明细,每项包含接收商户、申请金额、实际手续费及实际入账金额。 |
detailList[].detailId | string | 是 | 分账明细标识。 |
detailList[].detailNo | string / null | 是 | 分账成功后的明细流水号;尚未取得为 null。 |
detailList[].ledgerNo | string | 是 | 接收商户编号。 |
detailList[].ledgerType | string | 是 | 商户间分账。 取值:MERCHANT2MERCHANT。 |
detailList[].amount | string | 是 | 申请金额,单位元。 |
detailList[].feeAmount | string / null | 是 | 实际分账手续费,单位元;null 表示尚未确认。 |
detailList[].receiveAmount | string / null | 是 | 实际入账金额,单位元;null 表示尚未确认。 |
detailList[].divideDetailDesc | string | 是 | 本笔分账说明。 |
notify_id | string | 是 | 通知唯一标识,重复通知保持不变。 |
eventType | string | 是 | 通知类型。 取值:ORDER_DIVIDE_RESULT。 |
通知结构示例
{
"app_id": "ak_your_app_id",
"sign_type": "HMAC-SHA256",
"timestamp": "运行时生成",
"nonce": "每次请求生成新随机串",
"orderId": "ORDER_20261025_0001",
"merchantNo": "10000000002",
"divideRequestId": "DIVIDE_20261025_0001",
"status": "SUCCESS",
"totalAmount": "10.37",
"detailCount": 1,
"acceptedAt": 1792922400,
"version": 1,
"feeAmount": "0.02",
"receiveAmount": "10.37",
"finishTime": "2026-10-25 18:00:00",
"detailList": [
{
"detailId": "OIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
"detailNo": "DIVIDE_DETAIL_EXAMPLE",
"ledgerNo": "10000000003",
"ledgerType": "MERCHANT2MERCHANT",
"amount": "10.37",
"feeAmount": "0.02",
"receiveAmount": "10.37",
"divideDetailDesc": "供应商结算"
}
],
"notify_id": "ONbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
"eventType": "ORDER_DIVIDE_RESULT",
"sign": "由实际通知参数计算"
}
请先验签,核对业务请求及金额,使用 notify_id 去重;通知包含 version 时,较低版本不得覆盖新状态,包含 detailId 时须分别比较每笔明细的版本。业务处理成功后返回 HTTP 2xx 和纯文本 SUCCESS(大小写均可)。通知失败会重试,请避免重复发货或记账。
$payload = json_decode(file_get_contents('php://input'), true);
// HMAC 使用 app_secret;RSA2 第三个参数传平台提供的通知公钥。
$verified = is_array($payload) && $client->verifyNotification($payload, $platformPublicKey ?? '');
// 验签通过后,核对业务请求及金额,完成业务处理和通知去重,再应答 SUCCESS。
按原订单号及分账请求号查询整批处理结果、明细和实际分账费用。
只可查询原发起应用的分账申请;商户后续改绑不转移历史记录归属。
查询原申请不会再次发起分账。结果为 UNKNOWN 或 PROCESSING 时继续查询;请勿换请求号重复申请。
feeAmount、receiveAmount 为已确认的实际金额,null 表示未知,不能按零费用或申请金额推算。
接口权限标识为 open.merchant/orderdividequery;申请权限为 open.merchant/orderdivide。
业务参数
| 参数 | 类型 | 必填 / 位置 | 说明 |
|---|---|---|---|
channel | string | 是 | 渠道标识,固定填写 yibao。 取值:yibao。 |
merchantNo | string | 是 | 原订单的收款商户编号,须属于当前应用。 最大 11 个字符。 |
orderId | string | 是 | 原支付订单号,须为当前应用创建的订单。 最大 64 个字符。 |
divideRequestId | string | 是 | 你方生成的分账请求号,同一收款商户内唯一。 最大 64 个字符。 |
上表只列业务字段;完整请求还包含 app_id、timestamp、nonce、sign,sign_type 可省略。先合并全部参数,再计算签名。
请替换示例中的域名、应用凭据及业务数据;时间戳、随机串和签名由公共客户端生成。
完整请求示例
POST /api/open.merchant/orderDivideQuery
Content-Type: application/json
{
"app_id": "ak_your_app_id",
"sign_type": "HMAC-SHA256",
"timestamp": "运行时生成",
"nonce": "每次请求生成新随机串",
"channel": "yibao",
"merchantNo": "10000000002",
"orderId": "ORDER_20261025_0001",
"divideRequestId": "DIVIDE_20261025_0001",
"sign": "由公共客户端计算"
}
业务错误与处理
| msg / 情况 | HTTP | 处理说明 |
|---|---|---|
| 订单暂不可分账,请稍后查询 | 200 | 先查询原订单的 canDivide,确认业务条件后再提交。 |
| 该订单存在未确认的分账申请,请先查询原申请 | 200 | 使用上一笔 divideRequestId 查询,不能更换请求号重复申请。 |
| 分账总金额超过订单可用额度 / 分账总金额超过订单剩余可分账金额 | 200 | 核对 availableDivideAmount,减少本次申请金额。 |
| 分账申请受理结果未确认,请使用原 divideRequestId 查询,勿换号重试 | 200 | 继续查询原申请;未查到不能认定原申请未受理。 |
| 订单分账不支持参数 <字段> | 200 | 按参数表提交,删除比例、发起方、解冻余款及其他未开放字段。 |
| 商户不存在或无权访问 | 200 | 核对订单、出款商户及全部接收商户的应用归属。 |
| divideRequestId 已存在且归属或业务参数不一致 | 200 | 核对原申请,不能更改订单、金额、接收方、通知地址或应用重复提交。 |
| 请稍后发起订单分账,勿频繁调用 | 200 | 支付成功后稍等,且同一订单分账申请至少间隔 3 秒。 |
HTTP 200 时仍需检查 code;HTTP 401 请核对应用凭据与签名,HTTP 503 请稍后重试。
响应示例
{
"code": 1,
"msg": "操作成功",
"time": "1792922400",
"data": {
"orderId": "ORDER_20261025_0001",
"merchantNo": "10000000002",
"divideRequestId": "DIVIDE_20261025_0001",
"status": "SUCCESS",
"totalAmount": "10.37",
"detailCount": 1,
"acceptedAt": 1792922400,
"version": 1,
"feeAmount": "0.02",
"receiveAmount": "10.37",
"finishTime": "2026-10-25 18:00:00",
"queriedAt": 1792922405,
"detailList": [
{
"detailId": "OIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
"detailNo": "DIVIDE_DETAIL_EXAMPLE",
"ledgerNo": "10000000003",
"ledgerType": "MERCHANT2MERCHANT",
"amount": "10.37",
"feeAmount": "0.02",
"receiveAmount": "10.37",
"divideDetailDesc": "供应商结算"
}
]
}
}
业务响应字段
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
data.orderId | string | 是 | 原支付订单号。 |
data.merchantNo | string | 是 | 收款商户编号。 |
data.divideRequestId | string | 是 | 你方分账请求号。 |
data.status | string | 是 | UNKNOWN 结果未确认;PROCESSING 处理中;SUCCESS 整批成功;FAIL 整批失败;REJECTED 明确未受理。 取值:UNKNOWN / PROCESSING / SUCCESS / FAIL / REJECTED。 |
data.totalAmount | string | 是 | 申请分账总金额,单位元。 |
data.detailCount | integer | 是 | 本次申请的明细笔数。 |
data.acceptedAt | integer | 是 | 申请受理时间,Unix 秒。 |
data.version | integer | 是 | 结果版本,按同一 orderId、divideRequestId 比较。 |
data.feeAmount | string / null | 是 | 本批实际分账手续费合计;任何明细未确认时为 null。 |
data.receiveAmount | string / null | 是 | 本批实际入账金额合计;任何明细未确认时为 null。 |
data.finishTime | string / null | 是 | 分账完成时间;尚未取得为 null。 |
data.queriedAt | integer | 是 | 最近有效结果查询时间,Unix 秒;尚无有效查询为 0。 |
data.detailList | array | 是 | |
data.detailList[].detailId | string | 是 | 分账明细标识。 |
data.detailList[].detailNo | string / null | 是 | 分账成功后的明细流水号;尚未取得为 null。 |
data.detailList[].ledgerNo | string | 是 | 接收商户编号。 |
data.detailList[].ledgerType | string | 是 | 商户间分账。 取值:MERCHANT2MERCHANT。 |
data.detailList[].amount | string | 是 | 申请金额,单位元。 |
data.detailList[].feeAmount | string / null | 是 | 实际分账手续费,单位元;null 表示尚未确认。 |
data.detailList[].receiveAmount | string / null | 是 | 实际入账金额,单位元;null 表示尚未确认。 |
data.detailList[].divideDetailDesc | string | 是 | 本笔分账说明。 |
查询当前应用发起的订单,返回订单金额、支付状态、费用与资金处理状态,以及剩余可分账金额。仅能查询当前应用的订单;金额为查询时点的快照,具体可用情况以 unSplitAmount 和 unSplitAmountQueriedAt 为准。
使用下单返回的 order_id 或请求时提交的 orderId 查询;请求仍需携带公共参数并重新签名。
unSplitAmount 为剩余可分账金额,单位元,以两位小数字符串返回。null 表示尚未取得有效金额,不可按零处理;0.00 表示确认剩余金额为零。
unSplitAmountQueriedAt 是金额查询的 Unix 秒时间戳,未取得金额时为 0。建议轮询间隔不短于 5 秒。
订单支付状态可能更新延迟。请结合已验签的支付结果通知确认;查询接口仅返回订单信息。
订单总手续费查看 totalFee;unSplitAmount 不能直接按订单金额减总手续费推算,也不是商户账户余额。保留资金后续处理能力请先确认适用范围。
业务参数
| 参数 | 类型 | 必填 / 位置 | 说明 |
|---|---|---|---|
orderId | string | 是 | 订单号;只能查询当前应用通过 prePay 创建的订单。 最大 64 个字符。 |
上表只列业务字段;完整请求还包含 app_id、timestamp、nonce、sign,sign_type 可省略。先合并全部参数,再计算签名。
请替换示例中的域名、应用凭据及业务数据;时间戳、随机串和签名由公共客户端生成。
完整请求示例
POST /api/open.merchant/orderQuery
Content-Type: application/json
{
"app_id": "ak_example",
"sign_type": "HMAC-SHA256",
"timestamp": "1792713600",
"nonce": "example-query-nonce",
"sign": "请在服务端生成签名",
"orderId": "OPEN_ORDER_20261023_001"
}
业务错误与处理
| msg / 情况 | HTTP | 处理说明 |
|---|---|---|
| 订单不存在或无权访问 | 200 | 核对订单号和调用应用;仅支持查询本应用通过 prePay 创建的订单。 |
HTTP 200 时仍需检查 code;HTTP 401 请核对应用凭据与签名,HTTP 503 请稍后重试。
响应示例
{
"code": 1,
"msg": "success",
"time": "1792713600",
"data": {
"orderId": "OPEN_ORDER_20261023_001",
"merchantNo": "10000000002",
"uniqueOrderNo": "YOP_ORDER_20261023_001",
"orderAmount": "100.00",
"status": 1,
"payChannel": "WECHAT",
"payWay": "USER_SCAN",
"platformFee": "0.38",
"fundProcessType": "DELAY_SETTLE",
"fundStatus": "RESERVED",
"notifyStatus": "SUCCESS",
"paidAt": 1792713590,
"memo": "订单备注",
"businessInfo": "{\"source\":\"example\"}",
"pricingMode": "APP_TOTAL",
"paymentProduct": "USER_SCAN_WECHAT_OFFLINE",
"totalFeeRate": "0.600000",
"totalFee": "0.60",
"feeStatus": "CONFIRMED",
"unSplitAmount": "99.40",
"unSplitAmountQueriedAt": 1792713600,
"canDivide": false,
"availableDivideAmount": null
}
}
业务响应字段
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
data.orderId | string | 是 | 订单号 |
data.merchantNo | string | 是 | 收款商户号 |
data.uniqueOrderNo | string | 是 | 支付流水号,尚未取得时为空。 |
data.orderAmount | string | 是 | 订单金额,单位元,十进制字符串。 |
data.unSplitAmount | string / null | 是 | 剩余可分账金额,单位元,固定两位小数字符串;null 表示未取得有效金额,不能按 0 处理;0.00 表示已确认没有剩余可分账金额。适用于支付成功后的分账场景,与账户余额不同。 |
data.unSplitAmountQueriedAt | integer | 是 | 有效剩余可分账金额的查询时间,Unix 秒时间戳;未取得金额时为 0。金额为此时点的快照,同一订单最多复用 5 秒。 |
data.status | integer | 是 | 订单支付状态:0 待支付、1 已支付、2 失败、3 已取消、4 已过期。状态更新可能延迟;本次剩余金额查询不改变支付状态。 |
data.payChannel | string | 是 | 支付渠道:WECHAT / ALIPAY。 |
data.payWay | string | 是 | 下单支付方式。 |
data.platformFee | string | 是 | 费用处理参考金额,单位元;订单总手续费以 totalFee 为准,费用是否确认见 feeStatus。 |
data.fundProcessType | string | 是 | 接入方业务选择:REAL_TIME / DELAY_SETTLE。 |
data.fundStatus | string | 是 | 资金处理状态;DELAY_SETTLE 模式下 RESERVED 表示余款保留待后续处理。 |
data.notifyStatus | string | 是 | 向接入方发送支付通知的任务状态,独立于支付状态。 |
data.paidAt | integer | 是 | 支付成功的 Unix 秒时间戳,未支付为 0。 |
data.memo | string | 是 | 下单时的业务备注。 |
data.businessInfo | string | 是 | 下单时的业务扩展信息,为 JSON 字符串或空字符串。 |
data.pricingMode | string | 是 | 计费类型:LEGACY 历史计费,APP_TOTAL 应用约定费率计费。 取值:LEGACY / APP_TOTAL。 |
data.paymentProduct | string | 是 | 本次交易对应的支付产品代码,历史订单可能为空。 |
data.totalFeeRate | string / null | 是 | 本次订单适用的总费率,以百分比表示;0.600000 表示 0.6%。历史订单可能为 null。 |
data.totalFee | string / null | 是 | 本次订单总手续费,单位元。历史订单可能为 null。 |
data.feeStatus | string | 是 | 费用状态:PENDING 待确认,CONFIRMED 已确认,REVIEW 待核对,LEGACY 历史计费。 取值:LEGACY / PENDING / CONFIRMED / REVIEW。 |
data.canDivide | boolean | 是 | 当前是否具备订单分账条件。金额是查询时点快照,申请时会重新校验;false 时不应提交分账。 |
data.availableDivideAmount | string / null | 是 | 当前可申请订单分账的金额,单位元。未具备条件、存在未确认申请或金额未知时为 null;0.00 表示已确认没有可用额度。 |
查询当前应用所属商户的全部账户余额及账户状态。资金账户、待结算账户和待分账账户分别展示,总余额不等于可出款金额。
仅可查询当前应用下的商户。若应用配置了 scope,需授权 open.merchant/accountbalancequery。
金额为查询时点的余额,以两位小数字符串返回。查询余额不代表已完成分账或结算。
无法取得有效金额或查询失败时返回 code=0、data=null;不能把查询失败当成零余额。建议轮询间隔不短于 5 秒。
订单分账使用 orderQuery.unSplitAmount;余额分账使用商户资金账户余额,不能把全部账户总余额、待结算余额或订单可分账金额混用。
FUND_ACCOUNT 表示商户资金账户。余额分账使用资金账户余额,是否可发起仍取决于应用权限、商户产品、账户状态及实际可用资金。
业务参数
| 参数 | 类型 | 必填 / 位置 | 说明 |
|---|---|---|---|
channel | string | 是 | 渠道标识,本接口必填 yibao。 取值:yibao。 |
merchantNo | string | 是 | 商户编号,仅可查询当前签名应用所属的商户。 最大 32 个字符。 |
上表只列业务字段;完整请求还包含 app_id、timestamp、nonce、sign,sign_type 可省略。先合并全部参数,再计算签名。
请替换示例中的域名、应用凭据及业务数据;时间戳、随机串和签名由公共客户端生成。
完整请求示例
POST /api/open.merchant/accountBalanceQuery
Content-Type: application/json
{
"app_id": "ak_example",
"sign_type": "HMAC-SHA256",
"timestamp": "1792800000",
"nonce": "每次请求生成新随机串",
"sign": "请在服务端生成签名",
"channel": "yibao",
"merchantNo": "10000000002"
}
业务错误与处理
| msg / 情况 | HTTP | 处理说明 |
|---|---|---|
| 商户不存在或无权访问 | 200 | 核对 merchantNo 及当前应用归属;其他应用和未分配商户均不能查询。 |
| channel 必须填写 yibao | 200 | 本接口 channel 仅支持 yibao。 |
| merchantNo 必须为有效的商户编号,最多 32 位 | 200 | merchantNo 必须是字符串,允许字母、数字、下划线和连字符,最多 32 位。 |
| 余额查询暂不可用,请稍后重试或联系平台核对商户配置 | 200 | 本次查询未成功,请稍后使用原查询条件重试;不要按零余额处理。 |
HTTP 200 时仍需检查 code;HTTP 401 请核对应用凭据与签名,HTTP 503 请稍后重试。
响应示例
{
"code": 1,
"msg": "查询成功",
"time": "1792800000",
"data": {
"merchantNo": "10000000002",
"totalAccountBalance": "200.37",
"accountInfoList": [
{
"accountType": "FUND_ACCOUNT",
"balance": "100.37",
"accountStatus": "AVAILABLE",
"createTime": "2026-10-01T12:00:00+08:00"
},
{
"accountType": "SETTLE_ACCOUNT",
"balance": "100.00",
"accountStatus": "AVAILABLE"
}
],
"queriedAt": 1792800000
}
}
业务响应字段
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
data.merchantNo | string | 是 | 商户编号,仅可查询当前签名应用所属的商户。 最大 32 个字符。 |
data.totalAccountBalance | string | 是 | 全部账户总余额,不能作为某一账户的可出款金额。 单位元,固定两位小数字符串;如存在负余额会保留负号。 |
data.accountInfoList | array | 是 | 实际返回的账户列表;缺少某类账户不代表其余额为零,不会补造账户。 |
data.accountInfoList[].accountType | string | 是 | 账户类型:SETTLE_ACCOUNT 待结算、FUND_ACCOUNT 商户资金、DIVIDE_ACCOUNT 待分账、FEE_ACCOUNT 手续费、MARKET_ACCOUNT 营销、SPECIAL_FUND_ACCOUNT 专款、DIVIDE_FUND_ACCOUNT 分账资金、DIVIDE_PENDING_ACCOUNT 分账在途。请兼容新增账户类型。 最大 64 个字符。 |
data.accountInfoList[].balance | string | 是 | 本账户余额,能否出款还需结合账户状态、产品权限及实际操作结果。 单位元,固定两位小数字符串;如存在负余额会保留负号。 |
data.accountInfoList[].accountStatus | string | 是 | 账户状态:AVAILABLE 可用、FROZEN 冻结、FROZEN_CREDIT 冻结止收、FROZEN_DEBIT 冻结止付、CANCELLATION 销户。请兼容新增状态。 最大 64 个字符。 |
data.accountInfoList[].createTime | string | 否 | 账户开户时间,取得时返回。 最大 64 个字符。 |
data.queriedAt | integer | 是 | 本次成功查询的 Unix 秒时间戳。金额仅为查询时点快照,不预占资金。 |
查询当前应用所属商户的可结算金额、未结算总额,以及结算产品和账户明细。支持查询当前全部,或按指定截止时间查询。
仅可查询当前应用下的商户。若应用配置了 scope,需授权 open.merchant/settlebalancequery。
金额为查询时点的余额,以两位小数字符串返回。查询余额不代表已完成分账或结算。
无法取得有效金额或查询失败时返回 code=0、data=null;不能把查询失败当成零余额。建议轮询间隔不短于 5 秒。
当前 D1 手动结算产品代码为 D1_MANUAL。可结算时间及金额以本接口结果为准,不能简单按分账时间加 24 小时判断。
settlableAmount 为可结算但未结算金额;unsettledAmount 还包含尚未到结算周期的金额。金额变为零不能据此确认结算成功。
按截止时间查询时,在完整请求中添加 operatePeriod=PERIOD 和 endTime=2026-10-23T23:59:59+08:00,再重新生成签名。该查询不提供历史时点的账户余额回放。
业务参数
| 参数 | 类型 | 必填 / 位置 | 说明 |
|---|---|---|---|
channel | string | 是 | 渠道标识,本接口必填 yibao。 取值:yibao。 |
merchantNo | string | 是 | 商户编号,仅可查询当前签名应用所属的商户。 最大 32 个字符。 |
operatePeriod | string | 否 | ALL 查询当前全部;PERIOD 查询指定截止时间范围。 取值:ALL / PERIOD。 默认:"ALL"。 |
endTime | string | 条件必填 | operatePeriod=PERIOD 时必填;ISO 8601 秒精度,必须带时区,如 2026-10-23T23:59:59+08:00,也支持 Z。ALL 时省略。 最大 25 个字符。 |
tradeChannel | string | 否 | 交易通道,当前仅支持 YEEPAY。 取值:YEEPAY。 默认:"YEEPAY"。 |
上表只列业务字段;完整请求还包含 app_id、timestamp、nonce、sign,sign_type 可省略。先合并全部参数,再计算签名。
请替换示例中的域名、应用凭据及业务数据;时间戳、随机串和签名由公共客户端生成。
完整请求示例
POST /api/open.merchant/settleBalanceQuery
Content-Type: application/json
{
"app_id": "ak_example",
"sign_type": "HMAC-SHA256",
"timestamp": "1792800000",
"nonce": "每次请求生成新随机串",
"sign": "请在服务端生成签名",
"channel": "yibao",
"merchantNo": "10000000002"
}
业务错误与处理
| msg / 情况 | HTTP | 处理说明 |
|---|---|---|
| 商户不存在或无权访问 | 200 | 核对 merchantNo 及当前应用归属;其他应用和未分配商户均不能查询。 |
| channel 必须填写 yibao | 200 | 本接口 channel 仅支持 yibao。 |
| merchantNo 必须为有效的商户编号,最多 32 位 | 200 | merchantNo 必须是字符串,允许字母、数字、下划线和连字符,最多 32 位。 |
| 余额查询暂不可用,请稍后重试或联系平台核对商户配置 | 200 | 本次查询未成功,请稍后使用原查询条件重试;不要按零余额处理。 |
| operatePeriod 仅支持 ALL、PERIOD | 200 | 本阶段不接受 AMOUNT。 |
| PERIOD 必须填写有效 endTime,格式如 2026-10-23T23:59:59+08:00,须含时区 | 200 | 核对日期、时间及有效时区,PERIOD 不可省略。 |
| endTime 仅在 operatePeriod=PERIOD 时填写 | 200 | ALL 查询省略 endTime。 |
| tradeChannel 当前仅支持 YEEPAY | 200 | 使用 YEEPAY 或省略 tradeChannel。 |
HTTP 200 时仍需检查 code;HTTP 401 请核对应用凭据与签名,HTTP 503 请稍后重试。
响应示例
{
"code": 1,
"msg": "查询成功",
"time": "1792800000",
"data": {
"merchantNo": "10000000002",
"operatePeriod": "ALL",
"endTime": null,
"tradeChannel": "YEEPAY",
"settlableAmount": "80.10",
"unsettledAmount": "100.00",
"detailList": [
{
"settleType": "D1_MANUAL",
"accountType": "SETTLE_ACCOUNT",
"tradeChannel": "YEEPAY",
"settlableAmount": "80.10",
"unsettledAmount": "100.00"
}
],
"queriedAt": 1792800000
}
}
业务响应字段
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
data.merchantNo | string | 是 | 商户编号,仅可查询当前签名应用所属的商户。 最大 32 个字符。 |
data.operatePeriod | string | 是 | 本次查询范围。 取值:ALL / PERIOD。 |
data.endTime | string / null | 是 | PERIOD 返回北京时间的截止时间;ALL 返回 null。 |
data.tradeChannel | string | 是 | 本次查询的交易通道。 取值:YEEPAY。 |
data.settlableAmount | string | 是 | 当前可结算但未结算的金额。变为零不代表结算成功,可能已生成结算记录或本身就没有可结算金额。 单位元,固定两位小数字符串;如存在负余额会保留负号。 |
data.unsettledAmount | string | 是 | 未结算总额,包含可结算但未结算金额,以及尚未到结算周期的金额。 单位元,固定两位小数字符串;如存在负余额会保留负号。 |
data.detailList | array | 是 | 按结算产品和账户返回的金额明细。 |
data.detailList[].settleType | string | 是 | 结算产品代码,当前使用 D1_MANUAL;请兼容其他已开通产品。 最大 64 个字符。 |
data.detailList[].accountType | string | 是 | 结算账户类型,常见 SETTLE_ACCOUNT 待结算账户、DIVIDE_PENDING_ACCOUNT 分账在途账户、BASIC_ACCOUNT 基本账户。 最大 64 个字符。 |
data.detailList[].tradeChannel | string | 是 | 交易通道。 取值:YEEPAY。 |
data.detailList[].settlableAmount | string | 是 | 该明细当前可结算金额。 单位元,固定两位小数字符串;如存在负余额会保留负号。 |
data.detailList[].unsettledAmount | string | 是 | 该明细未结算总额。 单位元,固定两位小数字符串;如存在负余额会保留负号。 |
data.queriedAt | integer | 是 | 本次成功查询的 Unix 秒时间戳。金额仅为查询时点快照,不预占资金。 |
查询当前应用所属商户已配置的结算方向及对应比例。一个商户可能有多个方向,按 settleWayList 中各项比例解释。
仅可查询当前签名应用所属的商户;如应用限制 scope,需授权 open.merchant/settlewayquery。
settleWayList 是结算方向列表,不能假定只有一项。BANKCARD 表示银行卡,ACCOUNT 表示资金账户,BANKACCOUNT 表示合作银行账户;兼容 FEE_ACCOUNT 手续费账户和 MARKET_ACCOUNT 营销账户。
settleRatio 单位为百分比,固定两位小数字符串,例如 80.00 表示 80%。请保留各项方向及比例。
成功返回空列表表示本次没有取得已配置的结算方向,不应默认解释为银行卡或资金账户;缺失有效列表、未知方向、异常比例或查询失败时返回 code=0、data=null。
本接口返回结算方向及比例。queriedAt 为本次成功查询的 Unix 秒时间戳。
结算方式、待结算金额、账户余额分别通过 settleWayQuery、settleBalanceQuery、accountBalanceQuery 查询;配置了某种结算方向不代表资金已结算到账。
业务参数
| 参数 | 类型 | 必填 / 位置 | 说明 |
|---|---|---|---|
channel | string | 是 | 渠道标识,本接口必填 yibao。 取值:yibao。 |
merchantNo | string | 是 | 商户编号,仅可查询当前签名应用所属的商户。 最大 32 个字符。 |
上表只列业务字段;完整请求还包含 app_id、timestamp、nonce、sign,sign_type 可省略。先合并全部参数,再计算签名。
请替换示例中的域名、应用凭据及业务数据;时间戳、随机串和签名由公共客户端生成。
完整请求示例
POST /api/open.merchant/settleWayQuery
Content-Type: application/json
{
"app_id": "ak_example",
"sign_type": "HMAC-SHA256",
"timestamp": "1792800000",
"nonce": "每次请求生成新随机串",
"sign": "请在服务端生成签名",
"channel": "yibao",
"merchantNo": "10000000002"
}
业务错误与处理
| msg / 情况 | HTTP | 处理说明 |
|---|---|---|
| 商户不存在或无权访问 | 200 | 核对商户编号与当前应用归属,其他应用及未分配商户均不可查询。 |
| channel 必须填写 yibao | 200 | 本接口仅支持 channel=yibao。 |
| merchantNo 必须为有效的商户编号,最多 32 位 | 200 | 提交字符串商户编号,允许字母、数字、下划线和连字符,最多 32 位。 |
| 请使用 POST 请求 | 200 | 按公共协议使用 POST 提交签名请求。 |
| 结算方式查询暂不可用,请稍后重试或联系平台核对商户配置 | 200 | 本次查询未成功,请稍后重试;不要将失败结果解释为已设置银行卡结算。 |
HTTP 200 时仍需检查 code;HTTP 401 请核对应用凭据与签名,HTTP 503 请稍后重试。
响应示例
{
"code": 1,
"msg": "查询成功",
"time": "1792800000",
"data": {
"merchantNo": "10000000002",
"settleWayList": [
{
"settleWay": "BANKCARD",
"settleWayName": "银行卡",
"settleRatio": "80.00"
},
{
"settleWay": "ACCOUNT",
"settleWayName": "资金账户",
"settleRatio": "20.00"
}
],
"queriedAt": 1792800000
}
}
业务响应字段
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
data.merchantNo | string | 是 | 商户编号,仅可查询当前签名应用所属的商户。 最大 32 个字符。 |
data.settleWayList | array | 是 | 已配置的结算方向和比例列表,可能有多项;空列表不代表默认结算至银行卡。 |
data.settleWayList[].settleWay | string | 是 | BANKCARD 银行卡;ACCOUNT 资金账户;BANKACCOUNT 合作银行账户;FEE_ACCOUNT 手续费账户;MARKET_ACCOUNT 营销账户。 取值:BANKCARD / ACCOUNT / BANKACCOUNT / FEE_ACCOUNT / MARKET_ACCOUNT。 |
data.settleWayList[].settleWayName | string | 是 | 结算方向的中文名称,与 settleWay 对应。 取值:银行卡 / 资金账户 / 合作银行账户 / 手续费账户 / 营销账户。 |
data.settleWayList[].settleRatio | string | 是 | 该结算方向的比例,单位 %,范围 0.00 至 100.00,固定两位小数字符串。80.00 表示 80%。 |
data.queriedAt | integer | 是 | 本次成功查询的 Unix 秒时间戳,结算配置为此时点的快照。 |
为当前应用所属商户选择一个结算方向,后续结算时全部资金转至所选目标。每次仅选择一个方向,无需且不允许填写百分比。银行卡和合作银行账号须已添加为结算卡。
仅可修改当前签名应用所属的商户。应用限制 scope 时须授权 open.merchant/settlewaymodifyratio,查询接口授权不等于此修改接口授权。
只提交一个 settleWay,后续结算时全部资金转至所选方向。不得传入 settleRatio、settleWayList 或其他结算方向列表。
例如全部结算至资金账户,填写 settleWay=ACCOUNT;全部结算至已绑定银行卡,填写 settleWay=BANKCARD,并补充该卡的 bankCardNo。
BANKCARD/BANKACCOUNT 须填写已添加为结算卡的完整账号,其他方向省略 bankCardNo;银行卡号须作为字符串传递。
处理成功返回 code=1、data.status=SUCCESS。processedAt 为本次确认时间,不代表资金到账时间;修改后请调用 settleWayQuery 核对配置。
超时或返回“结果未确认”时,修改可能已生效。先查询当前配置并核对目标,再决定是否重新提交;不要直接循环重试。
本接口设置结算方向,不发起资金结算。账户余额、可结算金额分别使用 accountBalanceQuery 和 settleBalanceQuery 查询。
响应不回显账号或户名。
业务参数
| 参数 | 类型 | 必填 / 位置 | 说明 |
|---|---|---|---|
channel | string | 是 | 渠道标识,必填 yibao。 取值:yibao。 |
merchantNo | string | 是 | 商户编号,仅可修改当前签名应用所属的商户。 最大 32 个字符。 |
settleWay | string | 是 | 选择一个结算方向:BANKCARD 银行卡;ACCOUNT 商户资金账户;BANKACCOUNT 合作银行账户;FEE_ACCOUNT 商户手续费账户;MARKET_ACCOUNT 商户营销账户。每次仅选择一个方向,后续结算时全部资金转至所选目标。 取值:BANKCARD / ACCOUNT / BANKACCOUNT / FEE_ACCOUNT / MARKET_ACCOUNT。 |
bankCardNo | string | 条件必填 | BANKCARD/BANKACCOUNT 时必填,且已添加为结算卡;其他方向省略。银行卡方向填写已绑定完整卡号;合作银行方向填写开户返回的合作银行账号。禁止填写掩码或数值类型。 最大 64 个字符。 |
上表只列业务字段;完整请求还包含 app_id、timestamp、nonce、sign,sign_type 可省略。先合并全部参数,再计算签名。
请替换示例中的域名、应用凭据及业务数据;时间戳、随机串和签名由公共客户端生成。
完整请求示例
POST /api/open.merchant/settleWayModifyRatio
Content-Type: application/json
{
"app_id": "ak_example",
"sign_type": "HMAC-SHA256",
"timestamp": "1792800000",
"nonce": "每次请求生成新随机串",
"sign": "请在服务端生成签名",
"channel": "yibao",
"merchantNo": "10000000002",
"settleWay": "ACCOUNT"
}
业务错误与处理
| msg / 情况 | HTTP | 处理说明 |
|---|---|---|
| 商户不存在或无权访问 | 200 | 核对 merchantNo 和应用归属,其他应用及未分配商户均不可修改。 |
| channel 必须填写 yibao | 200 | 填写 channel=yibao。 |
| merchantNo 必须为有效的商户编号,最多 32 位 | 200 | 提交字符串商户编号。 |
| settleWay 必须为单个受支持的结算方向 | 200 | 填写五种已支持方向之一,不能传数组、空值或未知方向。 |
| 请求包含不支持的结算比例字段 | 200 | 删除 settleRatio 字段,仅通过 settleWay 选择一个结算方向。 |
| 仅允许提交一个 settleWay,请勿传入结算方向列表 | 200 | 删除 settleWayList 及其他结算方向列表,仅提交单个 settleWay。 |
| 银行卡或合作银行方向必须填写有效的完整 bankCardNo,最多 64 位 | 200 | 填写已经绑定的完整账号字符串,不能使用掩码。 |
| 非银行卡或合作银行方向请省略 bankCardNo | 200 | ACCOUNT、FEE_ACCOUNT、MARKET_ACCOUNT 项省略账号字段。 |
| 结算账户不存在或未开通 | 200 | 核对目标账号和产品开通情况。 |
| 结算修改商户关系校验未通过 | 200 | 联系技术支持核对商户权限。 |
| 结算修改请求重复,请先查询当前配置 | 200 | 查询当前配置确认前次结果,避免重复提交。 |
| 结算方式修改结果未确认,请先查询当前配置后再决定是否重试 | 200 | 超时、异常响应或状态未确认;不能直接认定修改没有生效。 |
HTTP 200 时仍需检查 code;HTTP 401 请核对应用凭据与签名,HTTP 503 请稍后重试。
响应示例
{
"code": 1,
"msg": "修改成功",
"time": "1792800000",
"data": {
"merchantNo": "10000000002",
"status": "SUCCESS",
"processedAt": 1792800000
}
}
业务响应字段
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
data.merchantNo | string | 是 | 本次修改处理的商户编号。 最大 32 个字符。 |
data.status | string | 是 | 本次结算方向修改处理成功。 取值:SUCCESS。 |
data.processedAt | integer | 是 | 本次修改处理确认的 Unix 秒时间戳,不是结算到账时间。 |
将待结算账户中当前符合结算条件的资金,按商户已配置的结算方向发起结算。银行卡方向结算至绑定银行卡,ACCOUNT 方向转入资金账户。
仅可操作当前签名应用所属商户;应用限制 scope 时须授权 open.merchant/selfsettleapply。查询权限不代表有申请权限。
先用 settleWayQuery 确认方向,用 settleBalanceQuery 查看可结算资金,再发起申请。申请不会修改结算方向,也不能在请求中指定银行卡或比例。
结算至 BANKCARD 时转至已配置银行卡;结算至 ACCOUNT 时转入商户资金账户。使用其他已配置方向时,以相应账户及记录明细为准。
operatePeriod 默认 ALL,申请结算当前全部符合条件的资金。PERIOD 须填写带时区的 endTime;当前 D1 按结算日切和产品规则处理,不等于交易时间加 24 小时。
D1 示例:endTime=2026-10-24T00:00:00+08:00 表示按该结算日的可结算范围处理;实际可结算金额及是否可处理,以查询和申请结果为准。
每笔业务由你方生成固定且唯一的 settleRequestNo。nonce 是每次 HTTP 请求的防重放随机串,不能代替业务请求号;查询原申请时继续使用原 settleRequestNo。
code=1、data.status=ACCEPTED 只表示已受理,尚未确认结算成功或到账。最终结果请调用 settleRecordsQuery,结合记录状态和到账明细判断。
超时、重复请求或受理结果未确认时,先按原 settleRequestNo 查询。不要更换业务请求号再次申请,也不要自动循环重试;记录暂未查到时不能认定原申请失败。
这是待结算资金的自助结算;已进入资金账户的余额提现是另一项能力。接口只返回受理信息,不把申请金额填作实际到账金额。
notifyUrl 为接收结算结果通知的公网 HTTP(S) 地址。选填;省略或为空字符串时不发送通知,可通过 settleRecordsQuery 查询结果。
同一商户内的 settleRequestNo 须唯一。同一应用使用相同请求号和业务参数重复调用时返回原受理信息;参数不一致时拒绝。结果未确认时继续使用原号查询。
通知可能重复或乱序。使用 notify_id 去重,并记录同一结算申请的最新 version;重复通知直接确认,较低版本不得覆盖新状态。
结算成功后发生冲退时,会收到更高版本的 RETREATED 通知,retreatFlag=true;请按新版本更新业务状态。
结算结果通知采用 POST JSON,签名方式与本次申请一致:HMAC-SHA256 使用应用密钥验签,RSA2 使用平台提供的通知公钥验签。同一版本的业务内容和 notify_id 不变;每次通知的 timestamp、nonce、sign 可能不同。
通知成功应答为 HTTP 2xx 与纯文本 SUCCESS;同一通知最多自动投递 10 次(含首次),失败等待间隔为 10、20、40、80、160、320、640、1280、2560 秒,不支持暂停响应指令。详细规则及接收示例见异步通知章节。
业务参数
| 参数 | 类型 | 必填 / 位置 | 说明 |
|---|---|---|---|
channel | string | 是 | 渠道标识,必填 yibao。 取值:yibao。 |
merchantNo | string | 是 | 商户编号,仅限当前签名应用所属的商户。 最大 32 个字符。 |
settleRequestNo | string | 是 | 接入方生成的结算业务请求号,在同一商户内须保持唯一。查询和故障确认始终使用原号,不能换号重试。 最大 64 个字符。 |
operatePeriod | string | 否 | ALL 申请结算当前全部可结算资金;PERIOD 申请结算截至指定时间的可结算资金。当前不开放指定金额结算。 取值:ALL / PERIOD。 默认:"ALL"。 |
endTime | string | 条件必填 | PERIOD 时必填;带时区的截止时间,例 2026-10-24T00:00:00+08:00;ALL 时省略。 |
bankRemark | string | 否 | 银行附言,最多 32 字,不能包含换行或控制字符。 最大 32 个字符。 |
notifyUrl | string | 否 | 接收结算结果通知的公网 HTTP(S) 地址。选填;省略或为空字符串时不发送通知,可通过 settleRecordsQuery 查询结果。 最大 2048 个字符。 |
上表只列业务字段;完整请求还包含 app_id、timestamp、nonce、sign,sign_type 可省略。先合并全部参数,再计算签名。
请替换示例中的域名、应用凭据及业务数据;时间戳、随机串和签名由公共客户端生成。
完整请求示例
POST /api/open.merchant/selfSettleApply
Content-Type: application/json
{
"app_id": "ak_example",
"sign_type": "HMAC-SHA256",
"timestamp": "1792800000",
"nonce": "每次请求生成新随机串",
"sign": "请在服务端生成签名",
"channel": "yibao",
"merchantNo": "10000000002",
"settleRequestNo": "SETTLE_20261024_0001",
"operatePeriod": "ALL",
"notifyUrl": "https://partner.example.com/notify/settlement"
}
业务错误与处理
| msg / 情况 | HTTP | 处理说明 |
|---|---|---|
| 商户不存在或无权访问 | 200 | 核对商户编号和当前应用归属。 |
| settleRequestNo 必须为 1 至 64 位字母、数字、下划线或连字符 | 200 | 提交商户内唯一、格式有效的字符串请求号。 |
| operatePeriod 仅支持 ALL、PERIOD | 200 | 当前仅开放全部可结算资金和按截止时间结算,不支持 AMOUNT。 |
| 自助结算申请不支持参数 <字段>,请按接口文档提交 | 200 | 删除指定金额、方向、账号、extInfo、receiverMerchantNo 等未开放字段;notifyUrl 按字段要求填写。 |
| endTime 仅在 operatePeriod=PERIOD 时填写 | 200 | ALL 请求省略 endTime;PERIOD 必须填写。 |
| endTime 必须为带时区的 ISO 8601 秒精度时间 | 200 | 填写有效日期及明确时区,不支持无时区或毫秒。 |
| bankRemark 必须为不超过 32 字的单行字符串 | 200 | 缩短附言并移除控制字符。 |
| 当前范围内无可结算明细 | 200 | 先查询可结算金额和产品周期;不代表商户账户没有余额。 |
| 可结算账户余额不足 | 200 | 核对实时可结算资金及近期结算申请。 |
| 结算金额未达起结金额 | 200 | 确认产品的起结金额规则。 |
| 结算请求号重复,请使用原请求号查询结算记录 | 200 | 查询原申请;不要换号重新申请。 |
| 结算申请受理结果未确认,请使用原 settleRequestNo 查询结算记录,勿换号重试 | 200 | 原申请可能已被受理,先查询和核对。 |
| settleRequestNo 已存在且归属或业务参数不一致 | 200 | 原业务请求号不得换应用或修改参数后再次申请;查询并核对原申请。 |
| notifyUrl 必须为字符串 / notifyUrl 地址无效 | 200 | 可省略、留空字符串或填写符合要求的公网 HTTP(S) 地址,不接受 null、私网、保留地址或跳转目标。 |
HTTP 200 时仍需检查 code;HTTP 401 请核对应用凭据与签名,HTTP 503 请稍后重试。
响应示例
{
"code": 1,
"msg": "结算申请已受理,请查询最终结果",
"time": "1792800000",
"data": {
"merchantNo": "10000000002",
"settleRequestNo": "SETTLE_20261024_0001",
"settleOrderNo": "SETTLE_ORDER_EXAMPLE",
"status": "ACCEPTED",
"acceptedAt": 1792800000
}
}
业务响应字段
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
data.merchantNo | string | 是 | 商户编号,仅限当前签名应用所属的商户。 最大 32 个字符。 |
data.settleRequestNo | string | 是 | 接入方生成的结算业务请求号,在同一商户内须保持唯一。查询和故障确认始终使用原号,不能换号重试。 最大 64 个字符。 |
data.settleOrderNo | string | 是 | 本次受理返回的结算订单号。 最大 64 个字符。 |
data.status | string | 是 | ACCEPTED 仅表示结算申请已受理,不能据此标记到账。 取值:ACCEPTED。 |
data.acceptedAt | integer | 是 | 本次受理确认时间,Unix 秒时间戳。 |
结算结果通知
通知采用 POST application/json。请先验签、核对商户及原请求号,使用 notify_id 去重,并按 version 处理通知顺序。业务处理成功后返回 HTTP 2xx 和纯文本 SUCCESS。通知失败会重试;同一版本的业务内容不变,timestamp、nonce、sign 可能不同。
通知字段
| 参数 | 类型 | 必填 / 位置 | 说明 |
|---|---|---|---|
app_id | string | 是 | 本次通知所属应用标识;须与你方该通知接收端使用的应用配置一致。 |
sign_type | string | 是 | 本次通知的签名方式,与该业务申请使用的签名方式一致。 取值:HMAC-SHA256 / RSA2。 |
timestamp | string | 是 | 本次通知发送的 Unix 秒级时间戳;重试时重新生成,验签允许偏差 300 秒。 |
nonce | string | 是 | 本次通知的随机串,重试时重新生成;业务去重使用固定 notify_id。 |
sign | string | 是 | 对通知中除 sign 外的非空字段验签,排序、空值和 JSON 规则同公共协议。HMAC 使用本应用 app_secret;RSA2 使用平台提供的通知公钥,不能使用你方应用公钥。 |
notify_id | string | 是 | 固定通知事件标识,重试不变;请持久化去重。 最大 64 个字符。 |
eventType | string | 是 | 结算结果通知类型。 取值:SETTLEMENT_RESULT。 |
version | integer | 是 | 同一商户、结算请求的单调递增通知版本;仅允许更高版本更新状态。 |
merchantNo | string | 是 | 原申请商户编号。 |
settleRequestNo | string | 是 | 原结算业务请求号。 |
settleOrderNo | string | 是 | 已核实的结算订单号。 |
settleStatus | string | 是 | SUCCESS 结算成功;SETTLE_FAIL 结算异常;RETREATED 已发生打款冲退,不能作为资金仍到账处理。 取值:SUCCESS / SETTLE_FAIL / RETREATED。 |
settleAmount | string | 是 | 应结金额,单位元,固定两位小数。 |
realAmount | string / null | 是 | 结算到账金额,元;未取得时为 null,不默认等于应结金额。 |
feeAmount | string / null | 是 | 结算手续费,元;未知时为 null,明确为零时为 0.00。 |
retreatFlag | boolean / null | 是 | true 表示冲退;false 表示本次明确未冲退;null 表示未取得标记。 |
settleType | string / null | 是 | 结算产品;以本次记录为准,未返回时为 null。 最大 64 个字符。 |
detailList | array / null | 是 | 全部到账明细,不折叠为其中一条;未取得明细列表时为 null,返回空列表时保持为空。 |
detailList[].status | string | 是 | 到账明细状态:INIT 待处理;REMIT_PROCESS 银行处理中;REMIT_FAIL/ACCOUNTING_FAIL 出款失败;REMIT_SUCCESS/SUCCESS 已到账。 取值:INIT / REMIT_PROCESS / REMIT_FAIL / ACCOUNTING_FAIL / REMIT_SUCCESS / SUCCESS。 |
detailList[].statusName | string | 是 | 该明细状态的中文名称。 |
detailList[].realAmount | string / null | 是 | 该明细到账金额,元;未知时为 null,明确为零时为 0.00。 |
detailList[].accountType | string / null | 是 | 目标账户类型:DEBIT_CARD 借记卡、PUBLIC_CARD 对公账户、PASSBOOK 存折、UNIT_SETTLE_CARD 单位结算卡、BANKACCOUNT 银行账户、FEE_ACCOUNT 手续费账户、MARKET_ACCOUNT 营销账户、ACCOUNT 资金账户;未知时为 null。 最大 64 个字符。 |
detailList[].correct | boolean / null | 是 | 是否打款冲退。true 表示该笔发生冲退,不能仅凭成功状态判断资金仍已到账;null 表示未取得冲退标记。 |
detailList[].finishTime | string / null | 是 | 到账完成时间,未返回时为 null;保留查询结果时间文本。 最大 64 个字符。 |
detailList[].reverseTime | string / null | 是 | 冲退时间,未返回时为 null。 最大 64 个字符。 |
occurredAt | integer | 是 | 本版本结果的确认时间,Unix 秒时间戳;重试时不变。timestamp 为本次通知发送时间。 |
通知结构示例
{
"app_id": "ak_example",
"sign_type": "HMAC-SHA256",
"timestamp": "1792800000",
"nonce": "本次投递生成的新随机串",
"sign": "平台对全部参数生成签名",
"notify_id": "SN0000000000000000000000000000000000000000",
"eventType": "SETTLEMENT_RESULT",
"version": 1,
"merchantNo": "10000000002",
"settleRequestNo": "SETTLE_20261024_0001",
"settleOrderNo": "SETTLE_ORDER_EXAMPLE",
"settleStatus": "SUCCESS",
"settleAmount": "100.00",
"realAmount": null,
"feeAmount": "0.00",
"retreatFlag": false,
"settleType": "D1_MANUAL",
"detailList": null,
"occurredAt": 1792800000
}
请先验签,核对业务请求及金额,使用 notify_id 去重;通知包含 version 时,较低版本不得覆盖新状态,包含 detailId 时须分别比较每笔明细的版本。业务处理成功后返回 HTTP 2xx 和纯文本 SUCCESS(大小写均可)。通知失败会重试,请避免重复发货或记账。
$payload = json_decode(file_get_contents('php://input'), true);
// HMAC 使用 app_secret;RSA2 第三个参数传平台提供的通知公钥。
$verified = is_array($payload) && $client->verifyNotification($payload, $platformPublicKey ?? '');
// 验签通过后,核对业务请求及金额,完成业务处理和通知去重,再应答 SUCCESS。
按原结算请求号,或按结算申请起止时间,查询当前应用所属商户的结算处理结果、到账明细和冲退情况。
仅可查询当前签名应用所属商户;应用限制 scope 时须授权 open.merchant/settlerecordsquery。
查询原申请结果优先填写 settleRequestNo。按时间查询时同时填写 settleRequestBeginTime、settleRequestEndTime,两者按申请时间筛选,每次范围不能超过 31 天;两种条件也可同时提交。
时间输入使用带时区的 ISO 8601 秒精度格式,例如 2026-10-24T00:00:00+08:00;不接受无条件拉取全部历史记录。
code=1 仅表示本次查询成功。实际结算状态看 settleRecordList[].status;到账状态、目标账户类型和冲退标记还要查看各记录的 detailList。
BEFORE_REMIT 和 REMITTING 属于处理中,不能标记到账。SETTLE_FAIL 为结算异常;SUCCESS 仍应结合到账明细及 correct 冲退标记处理,correct=true 时不能视为资金仍到账。
记录和到账明细可能有多条,请完整处理列表,不要只取第一条记录代表整笔结算。
所有金额均为元、固定两位小数字符串;未知到账金额、手续费和未返回的可选字段为 null,不猜测为零或应结金额。
空记录列表、查询失败、记录暂不可见均不能证明原申请失败,也不能作为换号再次申请的依据。请用原请求号继续查询或联系平台核对。
结算申请仅限原发起应用查询;商户关联至其他应用后,其他应用也不能读取原申请记录。
结算结果发送至 selfSettleApply 时填写的 notifyUrl;未收到通知或需要确认结果时,请主动查询。
业务参数
| 参数 | 类型 | 必填 / 位置 | 说明 |
|---|---|---|---|
channel | string | 是 | 渠道标识,必填 yibao。 取值:yibao。 |
merchantNo | string | 是 | 商户编号,仅限当前签名应用所属的商户。 最大 32 个字符。 |
settleRequestNo | string | 二选一 | 接入方生成的结算业务请求号,在同一商户内须保持唯一。查询和故障确认始终使用原号,不能换号重试。 最大 64 个字符。 |
settleRequestBeginTime | string | 条件必填 | 结算申请起始时间;按时间查询时与截止时间一起填写,范围不超过 31 天。 |
settleRequestEndTime | string | 条件必填 | 结算申请截止时间;不能早于起始时间。 |
tradeChannel | string | 否 | 当前仅支持 YEEPAY,可省略。 取值:YEEPAY。 默认:"YEEPAY"。 |
上表只列业务字段;完整请求还包含 app_id、timestamp、nonce、sign,sign_type 可省略。先合并全部参数,再计算签名。
请替换示例中的域名、应用凭据及业务数据;时间戳、随机串和签名由公共客户端生成。
完整请求示例
POST /api/open.merchant/settleRecordsQuery
Content-Type: application/json
{
"app_id": "ak_example",
"sign_type": "HMAC-SHA256",
"timestamp": "1792800000",
"nonce": "每次请求生成新随机串",
"sign": "请在服务端生成签名",
"channel": "yibao",
"merchantNo": "10000000002",
"settleRequestNo": "SETTLE_20261024_0001"
}
业务错误与处理
| msg / 情况 | HTTP | 处理说明 |
|---|---|---|
| 商户不存在或无权访问 | 200 | 核对当前应用的商户归属。 |
| 请填写 settleRequestNo,或同时填写结算申请起止时间 | 200 | 选择原请求号查询,或填写完整时间范围。 |
| settleRequestNo 必须为 1 至 64 位字母、数字、下划线或连字符 | 200 | 使用发起申请时的原业务请求号。 |
| 结算申请时间范围须按先后填写且不能超过 31 天 | 200 | 缩小时间范围并核对先后顺序。 |
| settleRequestBeginTime / settleRequestEndTime 必须为带时区的 ISO 8601 秒精度时间 | 200 | 提供有效日期和明确时区,不支持无时区、毫秒或空值。 |
| tradeChannel 当前仅支持 YEEPAY | 200 | 省略该参数或填写 YEEPAY。 |
| 本接口不支持 receiverMerchantNo | 200 | 删除该参数,仅查询当前应用商户。 |
| 结算记录查询暂不可用,请稍后重试或联系平台核对 | 200 | 查询失败或暂未查到记录不代表结算申请失败,请继续使用原请求号核对结果。 |
HTTP 200 时仍需检查 code;HTTP 401 请核对应用凭据与签名,HTTP 503 请稍后重试。
响应示例
{
"code": 1,
"msg": "查询成功",
"time": "1792800000",
"data": {
"merchantNo": "10000000002",
"settleRequestNo": "SETTLE_20261024_0001",
"tradeChannel": "YEEPAY",
"settleRecordList": [
{
"summaryNo": "SETTLE_RECORD_EXAMPLE",
"status": "SUCCESS",
"statusName": "结算成功",
"settleAmount": "100.00",
"realAmount": "100.00",
"realFee": "0.00",
"createTime": "2026-10-24 00:05:00",
"settleType": "D1_MANUAL",
"detailList": [
{
"status": "SUCCESS",
"statusName": "已到账",
"realAmount": "100.00",
"accountType": "ACCOUNT",
"correct": false,
"finishTime": "2026-10-24 00:05:30",
"reverseTime": null
}
]
}
],
"queriedAt": 1792800000
}
}
业务响应字段
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
data.merchantNo | string | 是 | 商户编号,仅限当前签名应用所属的商户。 最大 32 个字符。 |
data.settleRequestNo | string / null | 是 | 接入方生成的结算业务请求号,在同一商户内须保持唯一。查询和故障确认始终使用原号,不能换号重试。 最大 64 个字符。 |
data.tradeChannel | string | 是 | 本次查询交易通道。 取值:YEEPAY。 |
data.settleRecordList | array | 是 | 本次条件下返回的全部结算记录;空列表表示暂未查到,不能据此认定申请失败。 |
data.settleRecordList[].summaryNo | string | 是 | 结算记录订单号。 最大 64 个字符。 |
data.settleRecordList[].status | string | 是 | 结算订单状态:SUCCESS 结算成功;BEFORE_REMIT 待出款;SETTLE_FAIL 结算异常;REMITTING 银行处理中。 取值:SUCCESS / BEFORE_REMIT / SETTLE_FAIL / REMITTING。 |
data.settleRecordList[].statusName | string | 是 | 结算订单状态的中文名称。 |
data.settleRecordList[].settleAmount | string | 是 | 应结金额,单位元,固定两位小数。 |
data.settleRecordList[].realAmount | string / null | 是 | 结算到账金额,元;未取得时为 null,不默认等于应结金额。 |
data.settleRecordList[].realFee | string / null | 是 | 结算手续费,元;未知时为 null,明确为零时为 0.00。 |
data.settleRecordList[].createTime | string / null | 是 | 结算订单创建时间,未返回时为 null。 最大 64 个字符。 |
data.settleRecordList[].settleType | string / null | 是 | 结算产品;以本次记录为准,未返回时为 null。 最大 64 个字符。 |
data.settleRecordList[].detailList | array / null | 是 | 全部到账明细,不折叠为其中一条;未取得明细列表时为 null,返回空列表时保持为空。 |
data.settleRecordList[].detailList[].status | string | 是 | 到账明细状态:INIT 待处理;REMIT_PROCESS 银行处理中;REMIT_FAIL/ACCOUNTING_FAIL 出款失败;REMIT_SUCCESS/SUCCESS 已到账。 取值:INIT / REMIT_PROCESS / REMIT_FAIL / ACCOUNTING_FAIL / REMIT_SUCCESS / SUCCESS。 |
data.settleRecordList[].detailList[].statusName | string | 是 | 该明细状态的中文名称。 |
data.settleRecordList[].detailList[].realAmount | string / null | 是 | 该明细到账金额,元;未知时为 null,明确为零时为 0.00。 |
data.settleRecordList[].detailList[].accountType | string / null | 是 | 目标账户类型:DEBIT_CARD 借记卡、PUBLIC_CARD 对公账户、PASSBOOK 存折、UNIT_SETTLE_CARD 单位结算卡、BANKACCOUNT 银行账户、FEE_ACCOUNT 手续费账户、MARKET_ACCOUNT 营销账户、ACCOUNT 资金账户;未知时为 null。 最大 64 个字符。 |
data.settleRecordList[].detailList[].correct | boolean / null | 是 | 是否打款冲退。true 表示该笔发生冲退,不能仅凭成功状态判断资金仍已到账;null 表示未取得冲退标记。 |
data.settleRecordList[].detailList[].finishTime | string / null | 是 | 到账完成时间,未返回时为 null;保留查询结果时间文本。 最大 64 个字符。 |
data.settleRecordList[].detailList[].reverseTime | string / null | 是 | 冲退时间,未返回时为 null。 最大 64 个字符。 |
data.queriedAt | integer | 是 | 本次查询时间,Unix 秒时间戳。 |
Payment
商户须完成进件、相应签署与支付产品开通。下单复用公共鉴权,按支付方式补充业务参数;下单受理与最终付款结果需分别判断。
01
商户须已进件成功并开通所选支付产品。使用 registerQry 查询进件结果,保存收款商户号。
merchantNo 就是 registerQry 返回的 merchantNo,与进件时平台返回的 outMchNo 不是同一个值,切勿混用。
调用前确认应用与收款商户已开通对应支付能力;收费按应用约定执行,无需在下单参数中填写费率。
02
同一个 prePay 接口,使用 payChannel 选择 WECHAT 或 ALIPAY,使用 payWay 区分受理形态。返回统一放在 data.response_arr,但形态不同。
| payWay | 形态 | 必填 | 说明 |
|---|---|---|---|
| USER_SCAN | 微信 / 支付宝主扫 | 基础业务参数 | payChannel 选择支付渠道,返回二维码内容字符串 |
| WECHAT_OFFIACCOUNT | 微信公众号 JSAPI | + appId、userId | 返回微信调起参数对象;userId 为付款人 openId |
| MINI_PROGRAM | 微信 / 支付宝小程序 | + appId、userId | 显式填写 payChannel;返回小程序支付调起参数 |
| SDK_PAY | 微信 APP SDK | + appId | 不强制传 userId;使用返回参数调用微信支付 SDK |
| ALIPAY_LIFE | 支付宝生活号 | + appId、userId | 返回支付宝调起参数对象;userId 为支付宝 userId |
| H5_PAY | 支付宝 H5 | 基础业务参数 | payChannel 填写 ALIPAY,返回支付跳转链接 |
公众号、小程序和生活号必须传 appId 和 userId;微信 SDK 必须传 appId。支付应用 appId 与开放平台凭证 app_id 不同。
03
公共参数与业务参数平铺提交,签名规则与进件接口完全一致。
{
"app_id": "ak_********",
"sign_type": "HMAC-SHA256",
"timestamp": "1786777149",
"nonce": "9f3c1a2b4d5e6f70",
"channel": "yibao",
"merchantNo": "10093518558",
"orderId": "SH20261022000001",
"orderAmount": "0.01",
"payChannel": "WECHAT",
"payWay": "USER_SCAN",
"goodsName": "测试商品",
"scene": "OFFLINE",
"sign": "****"
}
$result = $client->request('/api/open.merchant/prePay', [
'channel' => 'yibao',
'merchantNo' => $merchantNo,
'orderId' => $yourOrderNo,
'orderAmount' => '0.01',
'payChannel' => 'WECHAT',
'payWay' => 'USER_SCAN',
'goodsName' => '测试商品',
]);
if ($result['http_status'] !== 200 || $result['body']['code'] !== 1) {
throw new RuntimeException($result['body']['msg']);
}
$data = $result['body']['data'];
// USER_SCAN 的 response_arr 为二维码内容;下单成功不等于支付成功。
金额单位是元,不是分;scene 默认 OFFLINE。微信支持 ONLINE / OFFLINE,支付宝支持 OFFLINE;应用与商户须已开通所选场景的支付产品。
04
下单时填写 notifyUrl,支付成功后系统会向该地址发送签名通知。
收到通知后先验签,再核对订单号与金额,按 notify_id 去重处理业务。处理成功后返回纯文本 SUCCESS;备注和业务扩展信息将原样返回。
也可调用 orderQuery 或登录接入控制台查询订单。状态更新可能有延迟,不能仅凭支付页面跳转判定付款成功。
05
fundProcessType 默认 REAL_TIME,支付成功后自动处理费用并释放商户余款。
DELAY_SETTLE 保留订单余款。查询 orderQuery 确认可分账后,可调用 orderDivide 按金额分配;未分配余款继续保留,完结分账暂未开放。
支付成功以签名通知或订单查询为准,不以资金处理完成与否作为付款成功条件。
Integration
公共协议只实现一次;各接口更换路径与业务参数。以下为企业进件示例,资料必须替换,渠道受理结果仍需实际联调确认。
01
下载客户端并保存为 OpenApiClient.php。HMAC 使用 app_secret;RSA2 使用你方私钥并将第四个构造参数设为 RSA2。每次调用都会自动生成时间戳、nonce 和签名。
<?php
require __DIR__ . '/OpenApiClient.php';
$client = new OpenApiClient('https://你的域名', '你的 app_id', '你的 app_secret');
$result = $client->request('/api/open.ping/index', ['echo' => 'hello']);
if ($result['http_status'] !== 200 || $result['body']['code'] !== 1) {
throw new RuntimeException($result['body']['msg']);
}02
逐张上传实际资料。文件内容不参与签名,客户端自动使用 multipart;其他接口继续使用 JSON。下例仅演示上传一张,其余资料按同样方式处理。
$result = $client->request('/api/open.merchant/upload', [], [], [
'file' => __DIR__ . '/legal-front.jpg',
]);
if ($result['http_status'] !== 200 || $result['body']['code'] !== 1) {
throw new RuntimeException($result['body']['msg']);
}
$legalFrontUrl = $result['body']['data']['url'];03
下载企业进件业务参数 JSON,替换真实资料、字典编码和全部上传路径。经营地址必须位于 channel_extra.addressBuss;productRates 必须按所选产品逐项填写等于所属应用当前配置的费用,示例费率请替换;完整字段和主体条件见 register。模板不包含公共参数,客户端会自动添加。
$business = json_decode(
file_get_contents(__DIR__ . '/register-business.json'),
true, 512, JSON_THROW_ON_ERROR
);
$business['path']['legalFrontPic'] = $legalFrontUrl;
// 其他资料图片同样替换为真实上传结果;不要提交模板占位资料。
$result = $client->request('/api/open.merchant/register', $business);
if ($result['http_status'] !== 200 || $result['body']['code'] !== 1) {
throw new RuntimeException($result['body']['msg']);
}
$outMchNo = $result['body']['data']['outMchNo']; // 保存到你方数据库04
每个后续请求仍由客户端独立签名,不复用旧 nonce。registerQry 的 requestNo 填前一步取得的 outMchNo;进件受理和进件成功是不同状态。
$result = $client->request('/api/open.merchant/registerQry', [
'channel' => 'yibao',
'requestNo' => $outMchNo,
]);
if ($result['http_status'] !== 200 || $result['body']['code'] !== 1) {
throw new RuntimeException($result['body']['msg']);
}
$state = (string)$result['body']['data']['applicationStatus'];
if ($state === '1') {
$merchantNo = $result['body']['data']['merchantNo'];
// 按产品开通情况准备支付参数;支付最终结果需另行核对。
}Notifications
集中查看支付、订单分账、余额分账和自助结算通知。按通知类型核对业务、处理重复与乱序,再返回成功应答;通知未送达时使用对应查询接口核对结果。
成功应答结束当前通知的自动投递。支付成功仅确认付款,不代表分账或结算完成。进件结果回调使用单独协议 ↗
01 · 通知类型与对应参数
| 通知类型 | 通知粒度 | 发起接口 |
|---|---|---|
| 支付成功通知 ↗ | 每笔支付成功 | /api/open.merchant/prePay |
| 订单分账结果通知 ↗ | 按申请整批通知 | /api/open.merchant/orderDivide |
| 余额分账结果通知 ↗ | 按分账明细逐笔通知 | /api/open.merchant/balanceDivide |
| 自助结算结果通知 ↗ | 按结算申请及结果版本通知 | /api/open.merchant/selfSettleApply |
以下通知发送至对应业务请求中的 notifyUrl,使用 POST application/json,字段位于 JSON 顶层。进件使用 callbackurl 和表单格式,见本章后的进件结果回调,不适用以下重试约定。
02 · 什么响应表示接收成功、什么时候停止通知
| 接入方响应 | 判定 | 后续行为 |
|---|---|---|
| HTTP 200,正文 SUCCESS | 接收成功 | 推荐应答;确认后结束当前 notify_id 的自动投递。 |
| 其他 HTTP 2xx,正文 success / Success | 接收成功 | 正文忽略大小写并去除首尾空白;建议统一返回大写 SUCCESS。 |
| HTTP 2xx,正文为空、FAIL、STOP、PAUSE 或 JSON | 接收失败 | 即使 HTTP 成功,也不会确认通知;按剩余次数重试。 |
| HTTP 非 2xx、网络错误或超时 | 接收失败 | 即使正文为 SUCCESS 也不会确认通知;按剩余次数重试。 |
HTTP/1.1 200 OK Content-Type: text/plain; charset=utf-8 SUCCESS
SUCCESS 表示业务已可靠处理,或已确认是重复/旧版本并安全忽略。它只结束当前通知,不会关闭该商户或该业务后续的新版本通知。
目前没有暂停或恢复通知的开放接口,也不识别 PAUSE、STOP、Retry-After 等暂停指令。返回失败只会触发有限重试,不能当作无限期暂停。
如果不需要通知,请在创建对应业务时省略 notifyUrl 或填写空字符串;这不是对已创建业务的暂停操作。
03 · 自动投递次数、失败间隔和超时
同一 notify_id 最多自动投递 10 次,包含首次投递,即最多自动重试 9 次。失败后的等待间隔如下,每次从上一次投递失败后起算,不是从首次投递开始累计。
| 第几次投递 | 距上次失败的等待间隔 |
|---|---|
| 第 2 次投递 | 10 秒 |
| 第 3 次投递 | 20 秒 |
| 第 4 次投递 | 40 秒 |
| 第 5 次投递 | 80 秒(1 分 20 秒) |
| 第 6 次投递 | 160 秒(2 分 40 秒) |
| 第 7 次投递 | 320 秒(5 分 20 秒) |
| 第 8 次投递 | 640 秒(10 分 40 秒) |
| 第 9 次投递 | 1280 秒(21 分 20 秒) |
| 第 10 次投递 | 2560 秒(42 分 40 秒) |
通知 HTTP 请求总超时为 15 秒。上述间隔是失败后的计划等待时间,实际到达时间可能因网络或服务繁忙而推迟,不承诺精确到秒。
首次及后续某次投递一旦收到成功应答,当前通知即不再重试。达到最大次数后停止自动投递;此时请使用对应结果查询接口核对业务,不要将通知失败当作支付或分账失败,也不要换请求号重新发起资金申请。
04 · 验签、去重与版本
先用公共客户端 verifyNotification 验证应用、签名算法、签名及当前时间。HMAC-SHA256 使用应用密钥;RSA2 使用通知公钥。收到通知后仍须核对本地业务归属、商户、请求号和金额。
| 通知类型 | 接入方处理要求 |
|---|---|
| 支付成功 | 按 app_id + notify_id 去重,核对 orderId、merchantNo、orderAmount;付款成功不表示分账完成。 |
| 订单分账 | 按 app_id + notify_id 去重;按 merchantNo + orderId + divideRequestId 比较 version,读取整批 detailList。 |
| 余额分账 | 按 app_id + notify_id 去重;按 merchantNo + divideRequestId + detailId 分别比较 version;冲退可能产生更高版本。 |
| 自助结算 | 按 app_id + notify_id 去重;按 merchantNo + settleRequestNo 比较 version;冲退以更高版本结果处理。 |
同一通知重试时,notify_id 和业务内容不变;timestamp、nonce、sign 会重新生成。结果变化产生新通知及新的 notify_id,较低版本不得覆盖同一业务或明细的较高版本。金额为 null 时表示未确认,不能按 0 记账。
05 · 接收端参考代码
接收函数负责解析、验签和 HTTP 应答。你方须实现 notification-business.php,返回一个可调用的业务处理函数:在同一事务中核对业务、处理 notify_id 去重和 version、保存业务结果及已处理标记;成功或重复/旧版本已安全忽略后返回 true,处理失败返回 false 或抛异常。示例不会替你完成这些业务步骤。
<?php
require __DIR__ . '/OpenApiClient.php';
require __DIR__ . '/NotificationReceiver.php';
// 凭据保存在你方服务器,算法与应用配置一致。
$signType = 'HMAC-SHA256'; // RSA2 应用改为 RSA2。
$client = new OpenApiClient('https://你的域名', '你的 app_id', '你的 app_secret', $signType);
// RSA2 时填写平台提供的通知公钥,HMAC 时留空。
$platformPublicKey = '';
$handleBusiness = require __DIR__ . '/notification-business.php';
if (!is_callable($handleBusiness)) {
http_response_code(503);
header('Content-Type: text/plain; charset=utf-8');
exit('FAIL');
}
$result = receiveOpenNotification(
file_get_contents('php://input'), $client, $handleBusiness, $platformPublicKey
);
http_response_code($result['http_status']);
header('Content-Type: text/plain; charset=utf-8');
echo $result['body'];
06 · 各类通知参数与 JSON 示例
支付成功后,下单时填写的 notifyUrl 将收到 POST JSON 通知。通知签名方式与下单请求一致;HMAC-SHA256 使用应用密钥验签,RSA2 使用平台提供的通知公钥验签。重复通知使用同一 notify_id,请在业务处理成功后返回 SUCCESS。
接入方收到的参数
| 参数 | 类型 | 必填 / 位置 | 说明 |
|---|---|---|---|
app_id | string | 是 | 本次通知所属应用标识;须与你方该通知接收端使用的应用配置一致。 |
sign_type | string | 是 | 本次通知的签名方式,与该业务申请使用的签名方式一致。 取值:HMAC-SHA256 / RSA2。 |
timestamp | string | 是 | 本次通知发送的 Unix 秒级时间戳;重试时重新生成,验签允许偏差 300 秒。 |
nonce | string | 是 | 本次通知的随机串,重试时重新生成;业务去重使用固定 notify_id。 |
sign | string | 是 | 对通知中除 sign 外的非空字段验签,排序、空值和 JSON 规则同公共协议。HMAC 使用本应用 app_secret;RSA2 使用平台提供的通知公钥,不能使用你方应用公钥。 |
notify_id | string | 是 | 固定通知标识,重试时不变;请使用此字段去重,避免重复处理业务。 |
orderId | string | 是 | 订单号,对应下单时的 orderId;下单未传时为返回的生成值。 |
merchantNo | string | 是 | 收款商户号。 |
orderAmount | string | 是 | 原订单金额,单位元,两位小数;须与接入方订单核对。 |
status | string | 是 | SUCCESS 表示该订单支付成功;请核对订单号与金额后处理业务。 取值:SUCCESS。 |
uniqueOrderNo | string | 是 | 支付流水号,可用于核对交易。 |
paidTime | string | 是 | 支付成功时间,北京时间 yyyy-MM-dd HH:mm:ss。 |
payChannel | string | 是 | 本次支付渠道:WECHAT 微信,ALIPAY 支付宝。 取值:WECHAT / ALIPAY。 |
payWay | string | 是 | 本次订单的支付方式,与下单请求一致。 取值:USER_SCAN / WECHAT_OFFIACCOUNT / MINI_PROGRAM / SDK_PAY / ALIPAY_LIFE / H5_PAY。 |
fundProcessType | string | 是 | 下单时选择的资金处理方式。 取值:REAL_TIME / DELAY_SETTLE。 默认:"REAL_TIME"。 |
memo | string | 是 | 下单时提交的业务备注原值。 最大 256 个字符。 |
businessInfo | string | 是 | 下单时提交的 businessInfo 原始 JSON 字符串。 最大 4096 个字符。 |
通知 JSON 示例
{
"app_id": "ak_your_app_id",
"sign_type": "HMAC-SHA256",
"timestamp": "运行时生成",
"nonce": "本次通知生成的随机串",
"notify_id": "N_example_stable_notification_id",
"orderId": "SH20261023000001",
"merchantNo": "10000000002",
"orderAmount": "100.00",
"status": "SUCCESS",
"uniqueOrderNo": "1001202610230000001",
"paidTime": "2026-10-23 17:00:00",
"payChannel": "WECHAT",
"payWay": "USER_SCAN",
"fundProcessType": "REAL_TIME",
"memo": "外部订单备注",
"businessInfo": "{\"externalOrderId\":\"EXT202610230001\"}",
"sign": "平台使用应用凭证生成的通知签名"
}
每次申请按整批发送最终结果。通知签名方式与原申请一致:HMAC-SHA256 使用应用密钥验签,RSA2 使用通知公钥验签。收到较低版本或重复通知时,不重复记账。
接入方收到的参数
| 参数 | 类型 | 必填 / 位置 | 说明 |
|---|---|---|---|
app_id | string | 是 | 本次通知所属应用标识;须与你方该通知接收端使用的应用配置一致。 |
sign_type | string | 是 | 本次通知的签名方式,与该业务申请使用的签名方式一致。 取值:HMAC-SHA256 / RSA2。 |
timestamp | string | 是 | 本次通知发送的 Unix 秒级时间戳;重试时重新生成,验签允许偏差 300 秒。 |
nonce | string | 是 | 本次通知的随机串,重试时重新生成;业务去重使用固定 notify_id。 |
sign | string | 是 | 对通知中除 sign 外的非空字段验签,排序、空值和 JSON 规则同公共协议。HMAC 使用本应用 app_secret;RSA2 使用平台提供的通知公钥,不能使用你方应用公钥。 |
orderId | string | 是 | 原支付订单号。 |
merchantNo | string | 是 | 收款商户编号。 |
divideRequestId | string | 是 | 你方分账请求号。 |
status | string | 是 | 本批分账最终状态。 取值:SUCCESS / FAIL。 |
totalAmount | string | 是 | 申请分账总金额,单位元。 |
detailCount | integer | 是 | 本次申请的明细笔数。 |
acceptedAt | integer | 是 | 申请受理时间,Unix 秒。 |
version | integer | 是 | 结果版本,按同一 orderId、divideRequestId 比较。 |
feeAmount | string / null | 是 | 本批实际分账手续费合计;任何明细未确认时为 null。 |
receiveAmount | string / null | 是 | 本批实际入账金额合计;任何明细未确认时为 null。 |
finishTime | string / null | 是 | 分账完成时间;尚未取得为 null。 |
detailList | array | 是 | 本批分账全部明细,每项包含接收商户、申请金额、实际手续费及实际入账金额。 |
detailList[].detailId | string | 是 | 分账明细标识。 |
detailList[].detailNo | string / null | 是 | 分账成功后的明细流水号;尚未取得为 null。 |
detailList[].ledgerNo | string | 是 | 接收商户编号。 |
detailList[].ledgerType | string | 是 | 商户间分账。 取值:MERCHANT2MERCHANT。 |
detailList[].amount | string | 是 | 申请金额,单位元。 |
detailList[].feeAmount | string / null | 是 | 实际分账手续费,单位元;null 表示尚未确认。 |
detailList[].receiveAmount | string / null | 是 | 实际入账金额,单位元;null 表示尚未确认。 |
detailList[].divideDetailDesc | string | 是 | 本笔分账说明。 |
notify_id | string | 是 | 通知唯一标识,重复通知保持不变。 |
eventType | string | 是 | 通知类型。 取值:ORDER_DIVIDE_RESULT。 |
通知 JSON 示例
{
"app_id": "ak_your_app_id",
"sign_type": "HMAC-SHA256",
"timestamp": "运行时生成",
"nonce": "每次请求生成新随机串",
"orderId": "ORDER_20261025_0001",
"merchantNo": "10000000002",
"divideRequestId": "DIVIDE_20261025_0001",
"status": "SUCCESS",
"totalAmount": "10.37",
"detailCount": 1,
"acceptedAt": 1792922400,
"version": 1,
"feeAmount": "0.02",
"receiveAmount": "10.37",
"finishTime": "2026-10-25 18:00:00",
"detailList": [
{
"detailId": "OIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
"detailNo": "DIVIDE_DETAIL_EXAMPLE",
"ledgerNo": "10000000003",
"ledgerType": "MERCHANT2MERCHANT",
"amount": "10.37",
"feeAmount": "0.02",
"receiveAmount": "10.37",
"divideDetailDesc": "供应商结算"
}
],
"notify_id": "ONbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
"eventType": "ORDER_DIVIDE_RESULT",
"sign": "由实际通知参数计算"
}
通知采用 POST application/json,签名方式与申请一致。HMAC-SHA256 使用应用密钥验签;RSA2 使用通知公钥验签。核对商户、请求号、明细和金额,按 notify_id 去重、按 detailId 分别比较 version。业务处理成功后返回 HTTP 2xx 和纯文本 SUCCESS。通知失败会重试,同一版本的业务内容不变。
接入方收到的参数
| 参数 | 类型 | 必填 / 位置 | 说明 |
|---|---|---|---|
app_id | string | 是 | 本次通知所属应用标识;须与你方该通知接收端使用的应用配置一致。 |
sign_type | string | 是 | 本次通知的签名方式,与该业务申请使用的签名方式一致。 取值:HMAC-SHA256 / RSA2。 |
timestamp | string | 是 | 本次通知发送的 Unix 秒级时间戳;重试时重新生成,验签允许偏差 300 秒。 |
nonce | string | 是 | 本次通知的随机串,重试时重新生成;业务去重使用固定 notify_id。 |
sign | string | 是 | 对通知中除 sign 外的非空字段验签,排序、空值和 JSON 规则同公共协议。HMAC 使用本应用 app_secret;RSA2 使用平台提供的通知公钥,不能使用你方应用公钥。 |
detailId | string | 是 | 稳定的分账明细标识;通知去重及版本比较须按此明细分别处理。 最大 64 个字符。 |
detailNo | string / null | 是 | 分账处理明细号,尚未取得时为 null。 最大 64 个字符。 |
ledgerNo | string | 是 | 接收商户号。 最大 16 个字符。 |
ledgerType | string | 是 | 接收方类型。 取值:MERCHANT。 |
divideAmount | string | 是 | 申请分账金额,单位元。 |
feeChargeSide | string | 是 | 本笔申请的手续费承担方式。 取值:OUTSIDE / INSIDE。 |
status | string | 是 | 单笔处理状态;成功后发生冲退时仍可能变为 FAIL。 取值:SUCCESS / FAIL。 |
reversed | boolean | 是 | 是否已确认本笔分账曾成功、之后转为失败。 |
version | integer | 是 | 同一 detailId 内递增的通知版本,从 1 开始;不同明细分别比较,较低版本不得覆盖新状态。 |
receiveAmount | string / null | 是 | 实际到账金额;尚未确认时为 null,不得按申请金额或零推算。 |
debitAmount | string / null | 是 | 实际扣账金额;尚未确认时为 null。 |
feeAmount | string / null | 是 | 实际分账手续费;尚未确认时为 null。 |
finishTime | string / null | 是 | 结果中返回的完成时间;尚未取得时为 null。 |
failReason | string | 是 | 失败原因,无失败原因时为空字符串。 |
remark | string | 是 | 申请时填写的附言。 |
divideReason | string | 是 | 申请时填写的分账说明。 |
notify_id | string | 是 | 固定通知标识,重试不变。 |
eventType | string | 是 | 通知类型。 取值:BALANCE_DIVIDE_RESULT。 |
merchantNo | string | 是 | 原出款商户号。 |
divideRequestId | string | 是 | 原分账请求号。 |
occurredAt | integer | 是 | 本版本结果的确认时间,Unix 秒时间戳;重试时不变。 |
通知 JSON 示例
{
"app_id": "ak_your_app_id",
"sign_type": "HMAC-SHA256",
"timestamp": "1792840060",
"nonce": "本次通知生成的新随机串",
"sign": "通知签名",
"notify_id": "BN_example_notification",
"eventType": "BALANCE_DIVIDE_RESULT",
"merchantNo": "10000000002",
"divideRequestId": "DIV_20261024_0001",
"detailId": "DD_example_detail",
"detailNo": "DETAIL_EXAMPLE_1",
"ledgerNo": "10000000003",
"ledgerType": "MERCHANT",
"divideAmount": "100.00",
"feeChargeSide": "OUTSIDE",
"status": "SUCCESS",
"reversed": false,
"version": 1,
"receiveAmount": "100.00",
"debitAmount": "100.02",
"feeAmount": "0.02",
"finishTime": "2026-10-24 20:00:00",
"failReason": "",
"remark": "订单结算",
"divideReason": "业务分账",
"occurredAt": 1792840060
}
通知采用 POST application/json。请先验签、核对商户及原请求号,使用 notify_id 去重,并按 version 处理通知顺序。业务处理成功后返回 HTTP 2xx 和纯文本 SUCCESS。通知失败会重试;同一版本的业务内容不变,timestamp、nonce、sign 可能不同。
接入方收到的参数
| 参数 | 类型 | 必填 / 位置 | 说明 |
|---|---|---|---|
app_id | string | 是 | 本次通知所属应用标识;须与你方该通知接收端使用的应用配置一致。 |
sign_type | string | 是 | 本次通知的签名方式,与该业务申请使用的签名方式一致。 取值:HMAC-SHA256 / RSA2。 |
timestamp | string | 是 | 本次通知发送的 Unix 秒级时间戳;重试时重新生成,验签允许偏差 300 秒。 |
nonce | string | 是 | 本次通知的随机串,重试时重新生成;业务去重使用固定 notify_id。 |
sign | string | 是 | 对通知中除 sign 外的非空字段验签,排序、空值和 JSON 规则同公共协议。HMAC 使用本应用 app_secret;RSA2 使用平台提供的通知公钥,不能使用你方应用公钥。 |
notify_id | string | 是 | 固定通知事件标识,重试不变;请持久化去重。 最大 64 个字符。 |
eventType | string | 是 | 结算结果通知类型。 取值:SETTLEMENT_RESULT。 |
version | integer | 是 | 同一商户、结算请求的单调递增通知版本;仅允许更高版本更新状态。 |
merchantNo | string | 是 | 原申请商户编号。 |
settleRequestNo | string | 是 | 原结算业务请求号。 |
settleOrderNo | string | 是 | 已核实的结算订单号。 |
settleStatus | string | 是 | SUCCESS 结算成功;SETTLE_FAIL 结算异常;RETREATED 已发生打款冲退,不能作为资金仍到账处理。 取值:SUCCESS / SETTLE_FAIL / RETREATED。 |
settleAmount | string | 是 | 应结金额,单位元,固定两位小数。 |
realAmount | string / null | 是 | 结算到账金额,元;未取得时为 null,不默认等于应结金额。 |
feeAmount | string / null | 是 | 结算手续费,元;未知时为 null,明确为零时为 0.00。 |
retreatFlag | boolean / null | 是 | true 表示冲退;false 表示本次明确未冲退;null 表示未取得标记。 |
settleType | string / null | 是 | 结算产品;以本次记录为准,未返回时为 null。 最大 64 个字符。 |
detailList | array / null | 是 | 全部到账明细,不折叠为其中一条;未取得明细列表时为 null,返回空列表时保持为空。 |
detailList[].status | string | 是 | 到账明细状态:INIT 待处理;REMIT_PROCESS 银行处理中;REMIT_FAIL/ACCOUNTING_FAIL 出款失败;REMIT_SUCCESS/SUCCESS 已到账。 取值:INIT / REMIT_PROCESS / REMIT_FAIL / ACCOUNTING_FAIL / REMIT_SUCCESS / SUCCESS。 |
detailList[].statusName | string | 是 | 该明细状态的中文名称。 |
detailList[].realAmount | string / null | 是 | 该明细到账金额,元;未知时为 null,明确为零时为 0.00。 |
detailList[].accountType | string / null | 是 | 目标账户类型:DEBIT_CARD 借记卡、PUBLIC_CARD 对公账户、PASSBOOK 存折、UNIT_SETTLE_CARD 单位结算卡、BANKACCOUNT 银行账户、FEE_ACCOUNT 手续费账户、MARKET_ACCOUNT 营销账户、ACCOUNT 资金账户;未知时为 null。 最大 64 个字符。 |
detailList[].correct | boolean / null | 是 | 是否打款冲退。true 表示该笔发生冲退,不能仅凭成功状态判断资金仍已到账;null 表示未取得冲退标记。 |
detailList[].finishTime | string / null | 是 | 到账完成时间,未返回时为 null;保留查询结果时间文本。 最大 64 个字符。 |
detailList[].reverseTime | string / null | 是 | 冲退时间,未返回时为 null。 最大 64 个字符。 |
occurredAt | integer | 是 | 本版本结果的确认时间,Unix 秒时间戳;重试时不变。timestamp 为本次通知发送时间。 |
通知 JSON 示例
{
"app_id": "ak_example",
"sign_type": "HMAC-SHA256",
"timestamp": "1792800000",
"nonce": "本次投递生成的新随机串",
"sign": "平台对全部参数生成签名",
"notify_id": "SN0000000000000000000000000000000000000000",
"eventType": "SETTLEMENT_RESULT",
"version": 1,
"merchantNo": "10000000002",
"settleRequestNo": "SETTLE_20261024_0001",
"settleOrderNo": "SETTLE_ORDER_EXAMPLE",
"settleStatus": "SUCCESS",
"settleAmount": "100.00",
"realAmount": null,
"feeAmount": "0.00",
"retreatFlag": false,
"settleType": "D1_MANUAL",
"detailList": null,
"occurredAt": 1792800000
}
Callback
进件状态发生变化时,平台向你在 register、update 时登记的 callbackurl 推送结果;成功后的资料变更请先确认查询与通知约定。回调与主动查询互为兜底,两者都应实现。
本节仅说明进件结果,使用 callbackurl 和表单提交。支付、分账和自助结算的 JSON 通知、成功应答及重试次数见「异步通知」;不能将这些规则套用于进件通知。
01
以 POST 表单推送到登记地址;当前发送实现可能使用 URL 编码表单或 multipart 表单,请兼容两种表单 Content-Type,不能只按 JSON 接收。
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
| requestNo | string | 是 | 进件请求号,对应 register 返回的 outMchNo,用它关联你方进件申请 |
| applicationStatus | string | 是 | 当前状态:1 成功 / 2 驳回 / 4 真实性待验证 / 5 待签合同 / 6 业务开通中 |
| auditOpinion | string | 否 | 审核意见;驳回时为具体原因 |
| merchantNo | string | 否 | 商户号,进件成功后返回 |
| applicationNo | string | 否 | 进件申请单号,可用于核对申请 |
| agreementSignUrl | string | 否 | 待签合同时的合同签署地址 |
| intentionAuthUrl | string | 否 | 真实性验证阶段的实名认证地址 |
通知可能包含扩展字段;请仅依赖本文明确列出的字段处理业务。
02
先记录通知,再调用 registerQry 核验并推进关键状态。进件通知尚未单独约定验签及自动重试次数/间隔,请以主动查询兜底,处理成功返回 HTTP 200。
$data = $_POST; // 表单提交,不是 JSON body $outMch = $data['requestNo'] ?? ''; // 对应进件返回的 outMchNo $status = $data['applicationStatus'] ?? '';// 1 成功 / 2 驳回 / 4 / 5 / 6 // 1. 幂等:同一 requestNo + 同一状态只处理一次 // 2. 保存进件状态、审核意见和商户号,供你方业务使用 // 3. 主动查询核验状态;处理成功返回 200,自动重试规则尚未形成承诺 echo 'success';
通知可能重复或乱序到达,请做好去重,并使用 registerQry 核验当前状态;长时间处于处理中或未收到通知时,也可主动查询确认结果。
Security
按约定生成请求签名,使用新的时间戳和随机串,并在应用授权范围内调用接口。业务结果及通知处理要求以各接口说明为准。
按应用已开通的方式签名。HMAC-SHA256 使用应用密钥;RSA2(SHA256withRSA)使用你方私钥,并须提前登记应用公钥。
请求时间戳与服务器偏差超过 300 秒即拒绝;nonce 在同一应用下 600 秒内仅可使用一次,重复即判定为重放。
请确认应用已获得所需接口权限,调用服务器的出口 IP 须满足应用的 IP 白名单要求。
接口返回 { code, msg, time, data }。请同时检查 HTTP 状态码和 code:1 表示本次处理成功,0 表示失败;msg 为处理提示,time 为秒级时间戳字符串。申请受理不代表业务最终完成。
填写 notifyUrl 接收支付、分账或结算结果。按异步通知说明验签、核对业务信息并处理重复通知;未收到通知时,使用对应查询接口确认。
先用 open.ping/index 验证签名链路是否打通,再进入业务接口,避免把签名问题误判为业务问题。
FAQ
不需要。公共客户端负责凭证、时间戳、nonce 和签名;调用时只更换路径与业务参数。先合并全部参数再计算签名,业务参数变化后必须重新签名;无需在每次请求前调用 Ping。
示例用于说明请求结构。请替换应用凭据、商户号及业务资料;时间戳、nonce 和签名由公共客户端在运行时生成。
不是。公共参数是 app_id、timestamp、nonce、sign 和可选 sign_type;channel 是部分业务接口的字段。Ping、渠道列表和资料上传不要求 channel。文件上传及各类结果通知的特殊约定见对应条目。
支持个体工商户、企业与小微。小微适用于个人经营者;请按主体类型准备商户、证照及结算资料。
小微无需提交营业执照相关字段;企业需额外提供营业执照信息、有效期以及结算账户等资料。请按所选主体类型提交,缺少资料时根据返回提示补齐。
按照应用已开通的签名方式接入,默认使用 HMAC-SHA256;使用 RSA2 时先向平台登记应用公钥,并保存平台公钥用于验证通知。
可以。进件使用 callbackurl;支付、分账和自助结算使用对应请求的 notifyUrl。后者选填,省略或为空时不发送通知。接收参数、成功应答和投递间隔见异步通知;未收到结果时可主动查询。
调用 channels 获取当前可用通道,填写接口要求的 channel;支付时使用 payChannel 选择微信或支付宝。
商户开通收款能力后,可使用 prePay 发起支付,通过签名通知或 orderQuery 确认结果。选择 DELAY_SETTLE 的订单可在具备条件后调用 orderDivide 分账,用 orderDivideQuery 查询整批结果;资金账户余额可通过 balanceDivide 分账,用 balanceDivideQuery 查询逐笔结果。账户、可结算金额、结算方向、自助结算及结算记录也可通过对应接口查询和处理。退款、资金账户余额提现、完结分账及对账文件暂未开放。
下单时填写 notifyUrl。支付成功后,该地址将收到包含 memo、businessInfo 的签名通知。验签、核对订单与金额并完成幂等处理后返回 SUCCESS;也可调用 orderQuery 查询订单。
selfSettleApply 返回 ACCEPTED 仅表示申请受理。填写 notifyUrl 可接收签名结果通知;省略或为空时,请通过 settleRecordsQuery 查询。通知须验签,按 notify_id 去重并按 version 处理顺序,业务处理成功后返回 SUCCESS。结算成功后发生冲退时,请按更高版本的 RETREATED 通知更新状态。
下单时选择 DELAY_SETTLE。支付成功后查询 orderQuery,仅在 canDivide=true 且具备可用额度时,使用 orderDivide 按金额分配给同应用商户。单次最多 5 笔,按整批返回成功或失败;填写 notifyUrl 接收签名通知,或用 orderDivideQuery 查询。上一笔结果未确认前,不要提交下一笔;未分配余款继续保留。
余额分账从出款商户的资金账户扣款,接收商户须属于同一应用。每笔明细可选择 feeChargeSide=OUTSIDE(出款方额外承担,默认)或 INSIDE(从接收方到账金额中扣除);实际是否适用取决于已开通的计费方式,实际扣账、到账和手续费以结果为准。申请受理后,使用 balanceDivideQuery 或签名通知确认结果。
结果按明细分别通知。使用 notify_id 去重,并按 detailId 分别保存最新 version,不同明细的版本互不替代。成功后仍可能收到更高版本的失败结果,请更新对应明细;未收到通知时,使用原 divideRequestId 查询,不能换号重复分账。
暂未通过开放接口提供。当前只开放主扫(用户扫商户二维码)与 JSAPI 调起两种形态,如有付款码场景需要,请与平台联系确认。
申请接入 → 平台下发 app_id 与密钥 → 用 open.ping/index 验证签名链路 → 提交进件 → 拿到 merchantNo 后即可下单收款。
Contact
Apply
请联系客服获取 app_id 与密钥。密钥仅通过人工渠道下发,不会在页面上公开。
在手机上点击号码即可直接拨打。