projectId 为主线组织数据和流程,而不是把项目当成一个可有可无的辅助字段。recruit 属于典型异步接口。同步响应只说明“平台是否接受本次任务”,不直接代表“已经签约成功”。eligible=false 和 0 额度,并明确原因字段。accepted=true、status=进行中、paymentTime!=null 这类字段都不等价于“业务最终成功”。/merchantapi/v2 路径前缀、统一请求头、统一签名与加密规则。| 术语 | 说明 |
|---|---|
| 商户 | 接入商户 API 的业务主体 |
| 创客 | 平台侧可参与项目、签约、结算的自由职业者 |
| 项目 | 平台中的业务载体,招募、额度、结算、交付物均围绕项目发生 |
| 招募批次号 | 商户为一次招募请求定义的业务批次号,用于幂等和结果关联 |
| 平台用户 ID | 商户自身业务系统中标识创客的稳定业务 ID |
| 招募任务 | 平台为单个创客生成的异步处理任务,对应 taskId |
| 结算单 | 一次结算申请,包含一个或多个结算明细 |
| 结算明细 | 结算单中的单笔记录,通常对应某个创客的一笔付款 |
| 交付物 | 围绕某个结算明细上传的成果文件 |
| 可结算额度 | 创客在当前项目、当前收款方式下还能继续结算的真实金额 |
| 同税地资格 | 创客在某个税地下的实名、活体、签约等资格组合状态 |
projectIdtaskIdmakerIdsettlementIddetailIddeliverableIdinvoiceIdaccountIdprojectId 以“显式传入优先,client 默认项目兜底”为基本口径projectIdclient 预先绑定默认 projectIdprojectId 为准。projectId,不要依赖默认项目兜底。platformUserId 不是一个可随意替换的展示字段,而是商户侧用来识别创客的重要业务标识。platformUserId,否则容易触发历史绑定冲突或未决任务冲突。| 状态码 | 状态描述 | 说明 |
|---|---|---|
| 0 | 未开始 | 项目尚未进入可执行阶段 |
| 1 | 进行中 | 当前可用于招募、额度、结算等业务 |
| 2 | 已结束 | 项目已结束,不能继续招募和结算 |
| 状态码 | 状态描述 | 说明 |
|---|---|---|
| 0 | 未审核 | 项目已创建但还未审核通过 |
| 1 | 已审核 | 项目审核通过,可进入正式使用阶段 |
| 2 | 已驳回 | 项目审核未通过 |
queryRecruitStatus 使用三态表示创客在当前项目下的状态:| 状态值 | 状态描述 | 说明 |
|---|---|---|
UNRECRUITED | 未招募 | 创客不存在,或存在但尚未加入当前项目 |
RECRUITED_UNSIGNED | 已招募待签约 | 已加入当前项目,但实名、活体、签约任一未完成,或历史签约已无法覆盖当前项目要求 |
RECRUITED_SIGNED | 已招募已签约 | 已加入当前项目,且同税地资格完整、签约仍在有效期内 |
recruit 的最终业务结果依赖异步回调,当前商户需要重点关注以下三类异步状态:| 状态值 | 状态描述 | 说明 |
|---|---|---|
FAILED | 失败 | 异步处理失败,商户应结合错误码和错误信息处理 |
SIGN_URL_READY | 签约链接已生成 | 已生成签约链接,等待创客完成签约 |
SIGNED | 已签约 | 已签约成功,或复用了仍然有效的历史签约结果 |
| 状态码 | 状态描述 | 说明 | 可执行操作 |
|---|---|---|---|
| 0 | 未发放 | 结算单已创建,但尚未发起支付 | 可发起支付 |
| 1 | 发放中 | 结算支付处理中 | 可查询状态 |
| 2 | 发放完成 | 结算流程已完成 | 可查询状态、查询回单 |
| 3 | 拒绝发放 | 结算被拒绝或不可继续处理 | 不可再次发起支付 |
| 状态码 | 状态描述 | 说明 |
|---|---|---|
| 1 | 待支付 | 明细已创建,等待支付 |
| 2 | 支付成功 / 已完成 | 当前实现中可获取回单的成功状态 |
| 3 | 支付失败 | 明细支付失败 |
| 4 | 拒绝支付 / 其他失败态 | 明细未成功完成 |
| 状态码 | 状态描述 | 说明 |
|---|---|---|
| 0 | 待审核 | 已上传,等待审核 |
| 1 | 已通过 | 审核通过 |
| 2 | 已驳回 | 审核驳回,通常会返回驳回原因 |
| 状态码 | 状态描述 | 说明 |
|---|---|---|
| 0 | 开票中 | 发票申请已提交,处理中 |
| 1 | 已开票 | 已完成开票 |
| 2 | 拒绝开票 | 发票申请被拒绝 |
项目
├── 招募与签约
├── 创客额度
├── 结算单与结算明细
├── 交付物
└── 发票归集项目 -> 招募 -> 签约 -> 额度 -> 结算 -> 交付物 -> 发票recruit 是 API 中最容易接错的接口。recruitBatchNoprojectIdplatformUserIdtaskIdaccepted=true 不代表已经签约成功,只代表该创客的任务已进入处理链路SIGN_URL_READY 回调或状态查询结果为准,而不是以同步受理结果为准max(默认合同截止时间, 项目 check_date_end + 1个月)check_date_end 更晚,系统可能仍会要求重新签约platformUserId 应被视为商户自己定义的稳定创客编号。platformUserId,系统会按冲突处理,而不是默默覆盖。fileNamefileUrlAppIdAppSecretAESKeyclient 是否已绑定默认 projectIdhttps://s.qa.gaosiqihui.com/merchantapi/v2https://s.gaosiqihui.com/merchantapi/v2X-SignrequestId 方便问题排查projectId。如果当前 client 已绑定默认项目,部分接口可以不传 projectId;但如果商户有多项目、跨团队、跨业务线使用场景,建议统一显式传入 projectId,避免调用落到错误项目。POST /merchantapi/v2/test/crypto{
"message": "Hello World! 测试V2加密功能"
}AppIdcode=0data.originalMessage 与原始明文一致signatureGET /merchantapi/v2/projects?page=1&size=20&status=1&auditStatus=1projectIdprojectNamestatusauditStatusavailableMethodsmonthlyAvailableGET /merchantapi/v2/projects/{projectId}checkDateStart / checkDateEndcheckDateEnd,因为它会影响历史合同是否可复用。POST /merchantapi/v2/projects/queryRecruitStatusPOST /merchantapi/v2/projects/recruittaskIdPOST /merchantapi/v2/projects/makers/quotaeligible=truereceiveMethodQuotas[].availableQuota 足够覆盖本次结算金额POST /merchantapi/v2/settlementsPOST /merchantapi/v2/settlements/{settlementId}/pay| 场景 | 所属接口/配置 | 回调地址来源 | 是否必须配置 | 典型结果 |
|---|---|---|---|---|
| 项目审核结果 | POST /merchantapi/v2/projects/create | 请求体 notifyUrl | 否 | 项目审核通过 / 驳回 |
| 招募结果 | POST /merchantapi/v2/projects/recruit | 请求体 notifyUrl | 是 | FAILED / SIGN_URL_READY / SIGNED |
| 结算结果 | POST /merchantapi/v2/settlements | 请求体 notifyUrl | 否 | 结算主单和明细状态更新 |
| 充值上账结果 | 商户 API 客户端配置 | 客户端配置 rechargeNotifyUrl | 否 | 企业账户充值到账 |
| 发票结果 | POST /merchantapi/v2/invoice/apply | 请求体 notifyUrl | 否 | 开票中 / 已开票 / 拒绝开票 |
HTTP POST 向商户回调地址发送 JSON Body。2xx 响应等原因发起重试。{
"sign": "xxxxx",
"signType": "AES_ONLY",
"timestamp": "1742891000000",
"nonce": "0d7d8f1a-xxxx",
"appId": "pico_app_002",
"data": "......"
}| 字段 | 说明 |
|---|---|
sign | 通知签名 |
signType | 当前客户端配置的签名/加密模式 |
timestamp | 毫秒时间戳 |
nonce | 随机串 |
appId | 商户应用 ID |
data | 业务数据;若开启通知加密则为密文,否则为明文 JSON |
signdata 为加密串,先解密 dataappIdbody(即外层 data)noncesignTypetimestamp2xx 状态码,平台即视为本次通知成功。2xx,或平台发送过程中出现网络异常,平台会自动重试。1 / 2 / 4 / 5 / 10 / 20 分钟。taskId、settlementId、invoiceId、dealId 等。| 接口名称 | 请求方式 | 接口路径 | 功能描述 |
|---|---|---|---|
| 加密测试 | POST | /merchantapi/v2/test/crypto | 测试验签、解密和上下文识别 |
| 查询项目列表 | GET | /merchantapi/v2/projects | 获取商户可用项目列表 |
| 创建项目 | POST | /merchantapi/v2/projects/create | 创建项目 |
| 查询项目详情 | GET | /merchantapi/v2/projects/{projectId} | 获取项目完整详情 |
| 查询创客招募状态 | POST | /merchantapi/v2/projects/queryRecruitStatus | 查询创客在当前项目下的招募与签约状态 |
| 批量招募创客 | POST | /merchantapi/v2/projects/recruit | 批量异步招募创客 |
| 查询创客额度 | POST | /merchantapi/v2/projects/makers/quota | 查询单个创客可结算额度 |
| 批量查询创客额度 | POST | /merchantapi/v2/projects/makers/quota/batch | 批量查询创客可结算额度 |
| 上传交付物 | POST | /merchantapi/v2/projects/upload-deliverable | 上传结算明细对应交付物 |
| 查询已上传交付物 | POST | /merchantapi/v2/projects/query-deliverables | 查询结算明细下历史交付物 |
| 查询结算单列表 | GET | /merchantapi/v2/settlements | 分页查询结算单列表 |
| 查询结算单详情 | GET | /merchantapi/v2/settlements/{settlementId} | 查询结算单详情 |
| 创建结算单 | POST | /merchantapi/v2/settlements | 创建结算单 |
| 发起支付 | POST | /merchantapi/v2/settlements/{settlementId}/pay | 对已创建结算单发起支付 |
| 获取结算回单 | GET | /merchantapi/v2/settlement-details/{detailId}/receipt | 获取结算回单 |
| 查询自由职业者信息 | POST | /merchantapi/v2/makers/query | 批量查询自由职业者信息 |
| 解绑自由职业者 | POST | /merchantapi/v2/makers/unbind | 按平台用户 ID 解绑自由职业者 |
| 查询企业账户信息 | GET | /merchantapi/v2/account/queryMerchantAccountInfo | 查询企业账户列表与余额信息 |
| 查询可开票余额 | GET | /merchantapi/v2/invoice/queryAvailableInvoiceBalance | 查询按税地和税目归集的可开票余额 |
| 开票申请 | POST | /merchantapi/v2/invoice/apply | 发起开票申请 |
| 查询发票详情 | GET | /merchantapi/v2/invoice/myInvoice/{invoiceId} | 查询发票申请结果和附件 |
| 请求头 | 必填 | 说明 |
|---|---|---|
X-App-Id | 是 | 平台分配的应用 ID |
X-Timestamp | 是 | 毫秒级时间戳 |
X-Nonce | 是 | 随机字符串,建议每次请求唯一 |
X-Sign | 是 | 请求签名 |
X-Encrypt-Type | POST 请求是 | 当前按 AES 接入 |
MerchantApiResponse<T> 结构:{
"code": 0,
"message": "成功",
"data": {},
"timestamp": "1742891000000",
"requestId": "req_xxx",
"encrypted": false,
"signature": "xxxx"
}| 字段 | 说明 |
|---|---|
code | 顶层结果码,0 表示接口调用成功 |
message | 顶层结果描述 |
data | 业务数据 |
timestamp | 响应时间戳 |
requestId | 平台侧请求标识,联调和问题排查时请保留 |
encrypted | 当前对外响应中通常为 false |
signature | 响应签名,商户建议校验 |
{"encryptedData":"..."} 形式传输。projectId 的 POST 接口遵循“请求体优先,client 默认项目兜底”的口径。code=0 只代表请求受理成功,不代表业务最终成功。POST /merchantapi/v2/test/crypto
{
"message": "Hello World! 测试V2加密功能"
}| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| message | String | 是 | 测试消息,最长 1000 字符 |
{
"code": 0,
"message": "成功",
"data": {
"originalMessage": "Hello World! 测试V2加密功能",
"encryptionInfo": "AES加密方案"
}
}| 字段 | 类型 | 说明 |
|---|---|---|
| originalMessage | String | 原始消息 |
| encryptionInfo | String | 当前识别到的加密方案说明 |
GET /merchantapi/v2/projects?page=1&size=20&status=1&auditStatus=1| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| page | Integer | 否 | 页码,默认 1,必须大于 0 |
| size | Integer | 否 | 每页数量,默认 20,范围 1-100 |
| status | Integer | 否 | 项目状态:0-未开始,1-进行中,2-已结束 |
| auditStatus | Integer | 否 | 审核状态:0-未审核,1-已审核,2-已驳回 |
{
"code": 0,
"message": "成功",
"data": {
"total": 5,
"page": 1,
"size": 20,
"projects": [
{
"projectId": "2016422018623922178",
"projectName": "直播活动推广项目",
"projectCode": "XM100086",
"taxCompanyId": "17",
"taxCompanyName": "上海税地",
"status": 1,
"statusDesc": "进行中",
"auditStatus": 1,
"auditStatusDesc": "已审核",
"createTime": "2026-03-23T10:00:00",
"availableMethods": ["bank", "alipay"],
"currentMonth": "2026-03",
"monthlyAvailable": 5000.00
}
]
}
}projectId 和判断项目是否可用。monthlyAvailable 是摘要值,详细额度需查看项目详情或创客额度接口。POST /merchantapi/v2/projects/create
{
"notifyUrl": "https://merchant.example.com/callback/project-audit",
"name": "直播活动推广项目",
"content": "负责直播活动推广与线索收集",
"calculationType": "DAY",
"calculationDesc": "按天结算",
"projectBudget": 12.34,
"type": 0,
"makerNumber": 20,
"settlementRule": "验收通过后T+7结算",
"verify": "提交成果并审核通过视为验收完成",
"checkDateStart": "2026-03-25",
"checkDateEnd": "2026-03-31",
"remark": "优先安排有直播经验的创客"
}| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| notifyUrl | String | 否 | 项目审核状态回调地址,长度不超过 200 |
| name | String | 是 | 项目名称,最长 100 |
| content | String | 是 | 项目内容,最长 1000 |
| calculationType | String | 是 | 计价方式 |
| calculationDesc | String | 是 | 计价方式描述,最长 500 |
| projectBudget | BigDecimal | 是 | 项目预算,单位万 |
| type | Integer | 否 | 当前仅支持 0 |
| makerNumber | Integer | 是 | 招募人数 |
| settlementRule | String | 是 | 结算规则,最长 100 |
| verify | String | 是 | 验收标准,最长 1000 |
| checkDateStart | String | 是 | 验收开始日期,格式 yyyy-MM-dd |
| checkDateEnd | String | 是 | 验收结束日期,格式 yyyy-MM-dd |
| remark | String | 否 | 备注,最长 200 |
{
"code": 0,
"message": "成功",
"data": {
"projectId": "1967533227101458434",
"code": "XM100086",
"projectName": "直播活动推广项目",
"auditStatus": 0,
"auditStatusDesc": "未审核",
"message": "创建成功,待审核"
}
}notifyUrl,项目审核状态发生变化后,平台会向该地址发送异步通知。| 字段 | 说明 |
|---|---|
projectId | 项目 ID |
projectName | 项目名称 |
auditStatus | 审核状态:0/1/2 |
auditStatusDesc | 审核状态描述 |
rejectReason | 驳回原因;审核通过时通常为空 |
status | 项目状态 |
statusDesc | 项目状态描述 |
projectId 做幂等更新。auditStatus=1 时,可将项目切换到“可进入招募/额度/结算联调”的状态。auditStatus=2 时,建议保存 rejectReason 并阻断后续业务发起。GET /merchantapi/v2/projects/{projectId}| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| projectId | String | 是 | 项目 ID |