开放 API 文档
等待填写测试配置
接入说明
商户开通开放 API 后,可以使用 API Key / API Secret 调用 VCC 提供的开放业务接口。后台或商户端登录态接口不属于开放 API,不在本文档中列出。
调用前准备
- 在商户端开发者配置中生成 API Key 和 API Secret。
- API Secret 明文只展示一次,请妥善保存。
- 正式环境可按需配置公网 IPv4 白名单;未配置时不限制来源 IP,配置后仅允许白名单 IP 调用。
- 请求和响应正文统一使用 JSON。
鉴权 Header
| Header | 必填 | 说明 |
|---|---|---|
X-VCC-API-KEY | 是 | 商户 API Key。 |
X-VCC-TIMESTAMP | 是 | 毫秒时间戳。 |
X-VCC-NONCE | 是 | 随机字符串,建议每次请求唯一。 |
X-VCC-SIGNATURE | 是 | 请求签名,使用 API Secret 计算。 |
X-VCC-REQUEST-ID | 否 | 商户侧请求 ID,不传时服务端生成。 |
签名原文
HTTP_METHOD + "\n" + REQUEST_PATH + "\n" + TIMESTAMP + "\n" + NONCE + "\n" + SHA256_HEX(RAW_REQUEST_BODY)
在线测试会自动计算签名,并在调试信息中显示签名原文、bodyHash 和 signature。
Webhook 总览
Webhook 是 VCC 主动向商户推送本地业务已收口事件的能力。VCC 不直接转发上游原始回调;开卡、卡操作、卡交易和预算操作在本地业务处理完成后写入 outbox,再异步向商户配置的 Webhook 地址发起 POST 推送。
- 投递语义为至少一次,商户侧必须做幂等处理。
- Webhook 地址保存时会校验 URL 格式和公网地址;投递前还会再次校验,防止域名后续改指内网地址。
- Webhook Secret 明文只在生成或重置时展示一次,保存后不再回显。
成功判定与重试策略
VCC 按商户 Webhook 接口的 HTTP 状态码和响应正文共同判断本次推送是否成功:商户接口必须返回 2xx,且响应正文去除首尾空白后等于 ok(大小写不敏感),才表示已接收成功。其他 HTTP 状态码、2xx 但正文不是 ok、网络异常、超时、DNS 或 URL 安全校验失败,都视为本次推送失败。
| 投递次数 | 触发时机 | 说明 |
|---|---|---|
| 第 1 次 | 事件创建后尽快异步推送 | 业务事件写入 outbox 后立即尝试投递。 |
| 第 2 次 | 第 1 次失败约 1 分钟后 | 仅在首次未返回 ok 或发生异常时触发。 |
| 第 3 次 | 上次失败约 5 分钟后 | 仍失败则继续等待下一轮。 |
| 第 4 次 | 上次失败约 15 分钟后 | 按到期时间由定时任务扫描推送。 |
| 第 5 次 | 上次失败约 30 分钟后 | HTTP 3xx/4xx/5xx 都不会视为成功。 |
| 第 6 次 | 上次失败约 1 小时后 | 商户侧应保证接口稳定返回 ok。 |
| 第 7 次 | 上次失败约 3 小时后 | 最后一次重试;仍失败则标记为放弃。 |
重试任务默认每 30 秒扫描一次已到重试时间的失败记录,因此实际投递时间可能比表中时间略有延迟。商户侧收到重复事件时,应使用 eventId 做接收幂等。
Webhook 请求 Header
| Header | 说明 |
|---|---|
X-VCC-WEBHOOK-ID | Webhook 事件 ID,对应正文 eventId。 |
X-VCC-WEBHOOK-EVENT | Webhook 精确事件类型,对应正文 eventType。 |
X-VCC-WEBHOOK-TIMESTAMP | VCC 发送时间戳,毫秒。 |
X-VCC-WEBHOOK-NONCE | 本次推送随机串。 |
X-VCC-WEBHOOK-SIGNATURE | 签名值,格式为 v1=hex。 |
签名原文
eventId + "\n" + eventType + "\n" + timestamp + "\n" + nonce + "\n" + SHA256_HEX(RAW_REQUEST_BODY)
签名算法为 HMAC-SHA256,密钥使用商户配置的 Webhook Secret。商户侧收到推送后,应取原始请求 body 计算 SHA256,再按上方原文拼接并校验 X-VCC-WEBHOOK-SIGNATURE。
外层字段
| 字段 | 类型 | 说明 |
|---|---|---|
eventId | String | 本次 Webhook 事件唯一 ID。商户侧可用该字段做接收幂等。 |
eventType | String | 精确事件类型,例如 CARD_TRANSACTION.SETTLED、BUDGET_OPERATION.RECHARGE_SUCCESS。建议商户按该字段分发业务。 |
eventCategory | String | 事件大类,例如 CARD_TRANSACTION、BUDGET_OPERATION。用于粗粒度分组和订阅。 |
eventTime | String | VCC 生成事件时间,格式 yyyy-MM-dd HH:mm:ss。 |
apiVersion | String | Webhook 契约版本,当前为 2026-06-01。 |
merchantId | Number | 商户 ID。 |
data | Object | 业务数据。不同 eventType 下字段不同。 |
订阅大类和事件
| 大类 | 事件 | 说明 |
|---|---|---|
CARD_ISSUE | CARD_ISSUE.SUCCESSCARD_ISSUE.FAILED | 开卡成功、确认失败且已退款。 |
CARD_OPERATION | CARD_OPERATION.RECHARGE_SUCCESSCARD_OPERATION.WITHDRAW_SUCCESSCARD_OPERATION.FREEZE_SUCCESSCARD_OPERATION.UNFREEZE_SUCCESSCARD_OPERATION.CANCEL_SUCCESSCARD.RISK_CANCELLEDCARD_OPERATION.LIMIT_CHANGE_SUCCESSCARD_OPERATION.REMARK_UPDATE_SUCCESS | 卡充值、余额转出、冻结、解冻、销卡、单卡限额变更、卡备注变更。 |
CARD_TRANSACTION | CARD_TRANSACTION.PROCESSINGCARD_TRANSACTION.AUTH_SUCCESSCARD_TRANSACTION.AUTH_FAILEDCARD_TRANSACTION.SETTLEDCARD_TRANSACTION.REFUND_SUCCESSCARD_TRANSACTION.REVERSE_SUCCESSCARD_TRANSACTION.CORRECTION | 交易授权、失败、清算、退款、撤销和订单修正。 |
BUDGET_OPERATION | BUDGET_OPERATION.CREATEDBUDGET_OPERATION.RECHARGE_SUCCESSBUDGET_OPERATION.WITHDRAW_SUCCESS | 预算组创建、充值成功、转出成功。 |
幂等建议
- 接收层幂等:使用
eventId防止同一 Webhook 重试导致重复处理。 - 交易业务幂等:同一订单可能按阶段推送多次,建议按
data.transactionId + eventType记录事件,并用data.transactionId推进本地状态机。 - 卡操作和预算操作通常一次操作一个最终事件;仍建议按
eventId做接收幂等。
开卡事件
开卡成功后推送 CARD_ISSUE.SUCCESS。该事件表示 VCC 已完成本地开卡结果收口,并返回商户可用的卡交付信息。
CARD_ISSUE.SUCCESS 示例
{
"eventId": "card_issue_901_SUCCESS",
"eventType": "CARD_ISSUE.SUCCESS",
"eventCategory": "CARD_ISSUE",
"eventTime": "2026-07-02 11:30:00",
"apiVersion": "2026-06-01",
"merchantId": 10001,
"data": {
"taskId": 901,
"batchNo": "BATCH202607020001",
"requestNo": "kaika_412321_idsjaidja",
"cardType": "PREPAID",
"budgetId": null,
"cardGroupId": null,
"applyStatus": "SUCCESS",
"fundStatus": "CONFIRMED",
"totalCount": 1,
"successCount": 1,
"failCount": 0,
"cards": [
{
"cardId": "VC202607020001",
"cardNoMask": "486532******1298",
"cardType": "PREPAID",
"cardStatus": 1,
"remark": "广告投放卡",
"effectiveLimitConfig": {
"perTransLimit": "0.00",
"dayLimit": "0.00",
"monthLimit": "0.00",
"cardLifeCycleLimit": "3000.00",
"currency": "USD"
},
"cardNumberCiphertext": "base64url_iv_ciphertext_tag",
"expiryDateCiphertext": "base64url_iv_ciphertext_tag",
"cvvCiphertext": "base64url_iv_ciphertext_tag",
"sensitiveEncryptAlg": "AES-256-GCM",
"sensitiveEncryptVersion": "v1",
"issueBatchNo": "BATCH202607020001",
"createdAt": "2026-07-02 11:29:58"
}
],
"failItems": [],
"completeTime": "2026-07-02 11:30:00",
"updateTime": "2026-07-02 11:30:00"
}
}CARD_ISSUE.FAILED 示例
{
"eventId": "card_issue_902_FAILED",
"eventType": "CARD_ISSUE.FAILED",
"eventCategory": "CARD_ISSUE",
"eventTime": "2026-07-02 11:45:00",
"apiVersion": "2026-06-01",
"merchantId": 10001,
"data": {
"taskId": 902,
"batchNo": "BATCH202607020002",
"requestNo": "kaika_412321_failed01",
"cardType": "PREPAID",
"budgetId": null,
"cardGroupId": null,
"applyStatus": "FAILED",
"fundStatus": "REFUNDED",
"totalCount": 1,
"successCount": 0,
"failCount": 1,
"cards": [],
"failItems": [
{
"itemId": 8891,
"itemNo": "BATCH202607020002-0001",
"seqNo": 1,
"status": "FAILED",
"taskStatus": "FAILED",
"fundStatus": "REFUNDED",
"failReasonCode": "CARD_ISSUE_FAILED",
"failReasonText": "开卡失败,已退款"
}
],
"completeTime": "2026-07-02 11:45:00",
"updateTime": "2026-07-02 11:45:00"
}
}三要素解密
开卡成功 Webhook 中完整卡号、有效期和 CVV 只以密文返回。商户必须先配置 Webhook Secret;未配置 Secret 时无法启用 Webhook。解密密钥使用 Webhook Secret 派生,不使用 API Key 或 API Secret。
key = HMAC-SHA256(webhookSecret, "vcc-webhook-sensitive-v1") plain = AES-256-GCM-Decrypt( key, base64url_decode(ciphertext)[0..11], // 12 字节 IV base64url_decode(ciphertext)[12..end] // ciphertext + 16 字节 tag )
密文字段格式为 base64url(iv + ciphertext + tag),不包含 = 填充。sensitiveEncryptAlg 当前固定为 AES-256-GCM,sensitiveEncryptVersion 当前固定为 v1。
data 字段说明
| 字段 | 说明 |
|---|---|
taskId | 开卡申请任务 ID。 |
batchNo | 开卡批次号,可用于查询本批卡。 |
requestNo | 商户自定义开卡请求号,VCC 会在开卡同步响应、状态查询和开卡终态 Webhook 中原样返回。 |
applyStatus | 本次申请最终业务状态。Webhook 当前只推送明确终态 SUCCESS 或 FAILED。 |
fundStatus | 资金状态。失败 Webhook 只在 REFUNDED 后发送;人工核对或可能补出卡的失败不会推送 CARD_ISSUE.FAILED。 |
cards | 成功开出的卡列表,包含 VCC 卡 ID、脱敏卡号、卡类型、卡状态、卡备注 remark、当前生效限额 effectiveLimitConfig、完整卡号密文 cardNumberCiphertext、有效期密文 expiryDateCiphertext、CVV 密文 cvvCiphertext 和批次号。 |
failItems | 确认失败且已收口的明细列表,失败原因仅返回商户可见业务文案。 |
卡操作事件
卡操作事件统一归入 CARD_OPERATION。充值和余额转出带金额;冻结、解冻、销卡、单卡限额变更、卡备注变更均表达本地业务已收口后的操作结果。
普通销卡推送 CARD_OPERATION.CANCEL_SUCCESS;风控销卡推送 CARD.RISK_CANCELLED,订阅 CARD_OPERATION 即可接收。存在待退余额时,销卡事件必须在退款成功入账后推送;储值卡余额为零时无需等待不存在的退款回调,可在销卡完成后推送。两类事件均返回实际 refundAmount 和 refundCurrency;无余额可退时金额为 0.00,不会省略字段。
充值成功示例
{
"eventId": "wh_202607020101",
"eventType": "CARD_OPERATION.RECHARGE_SUCCESS",
"eventCategory": "CARD_OPERATION",
"eventTime": "2026-07-02 11:35:00",
"apiVersion": "2026-06-01",
"merchantId": 10001,
"data": {
"requestNo": "CR202607020001",
"operationType": "RECHARGE",
"operationStatus": "SUCCESS",
"cardId": "card_88481234",
"cardNoMask": "486532******1298",
"cardType": "BUDGET",
"amount": "200.00",
"currency": "USD",
"operationTime": "2026-07-02 11:34:58"
}
}余额转出成功示例
{
"eventId": "wh_202607020102",
"eventType": "CARD_OPERATION.WITHDRAW_SUCCESS",
"eventCategory": "CARD_OPERATION",
"eventTime": "2026-07-02 11:40:00",
"apiVersion": "2026-06-01",
"merchantId": 10001,
"data": {
"requestNo": "CW202607020001",
"operationType": "WITHDRAW",
"operationStatus": "SUCCESS",
"cardId": "card_88481234",
"cardNoMask": "486532******1298",
"cardType": "BUDGET",
"amount": "50.00",
"currency": "USD",
"operationTime": "2026-07-02 11:39:59"
}
}冻结成功示例
{
"eventId": "wh_202607020103",
"eventType": "CARD_OPERATION.FREEZE_SUCCESS",
"eventCategory": "CARD_OPERATION",
"eventTime": "2026-07-02 11:45:00",
"apiVersion": "2026-06-01",
"merchantId": 10001,
"data": {
"requestNo": "CF202607020001",
"operationType": "FREEZE",
"operationStatus": "SUCCESS",
"cardId": "card_88481234",
"cardNoMask": "486532******1298",
"cardType": "BUDGET",
"operationTime": "2026-07-02 11:44:59"
}
}解冻成功示例
{
"eventId": "wh_202607020104",
"eventType": "CARD_OPERATION.UNFREEZE_SUCCESS",
"eventCategory": "CARD_OPERATION",
"eventTime": "2026-07-02 11:50:00",
"apiVersion": "2026-06-01",
"merchantId": 10001,
"data": {
"requestNo": "CU202607020001",
"operationType": "UNFREEZE",
"operationStatus": "SUCCESS",
"cardId": "card_88481234",
"cardNoMask": "486532******1298",
"cardType": "BUDGET",
"operationTime": "2026-07-02 11:49:59"
}
}销卡成功示例
{
"eventId": "wh_202607020105",
"eventType": "CARD_OPERATION.CANCEL_SUCCESS",
"eventCategory": "CARD_OPERATION",
"eventTime": "2026-07-02 11:55:00",
"apiVersion": "2026-06-01",
"merchantId": 10001,
"data": {
"requestNo": "CC202607020001",
"operationType": "CANCEL",
"operationStatus": "SUCCESS",
"cardId": "card_88481234",
"cardNoMask": "486532******1298",
"cardType": "BUDGET",
"refundAmount": "0.00",
"refundCurrency": "USD",
"operationTime": "2026-07-02 11:54:59"
}
}风控销卡成功示例
{
"eventId": "card_operation_card_operation_3001_RISK_CANCELLED",
"eventType": "CARD.RISK_CANCELLED",
"eventCategory": "CARD",
"eventTime": "2026-07-21 10:45:00",
"apiVersion": "2026-06-01",
"merchantId": 10001,
"data": {
"requestNo": "agg_tx_risk_001",
"operationType": "CANCEL",
"operationStatus": "SUCCESS",
"cardId": "card_88481234",
"cardNoMask": "486532******1298",
"cardType": "PREPAID",
"cancelType": "RISK_CANCEL",
"reason": "风控销卡",
"sourceTransactionId": "agg_tx_risk_001",
"refundAmount": "3.80",
"refundCurrency": "USD",
"operationTime": "2026-07-21 10:44:59"
}
}单卡限额变更成功示例
{
"eventId": "card_operation_card_limit_change_8812_LIMIT_CHANGE_SUCCESS",
"eventType": "CARD_OPERATION.LIMIT_CHANGE_SUCCESS",
"eventCategory": "CARD_OPERATION",
"eventTime": "2026-07-02 12:05:00",
"apiVersion": "2026-06-01",
"merchantId": 10001,
"data": {
"requestNo": "CL202607020001",
"operationType": "LIMIT_CHANGE",
"operationStatus": "SUCCESS",
"cardId": "card_88481234",
"cardNoMask": "486532******1298",
"cardType": "BUDGET",
"beforeLimitConfig": {
"perTransLimit": "0.00",
"dayLimit": "0.00",
"monthLimit": "0.00",
"cardLifeCycleLimit": "2000.00",
"currency": "USD"
},
"afterLimitConfig": {
"perTransLimit": "0.00",
"dayLimit": "0.00",
"monthLimit": "0.00",
"cardLifeCycleLimit": "3000.00",
"currency": "USD"
},
"currency": "USD",
"remark": "调整广告卡生命周期限额",
"operationTime": "2026-07-02 12:04:59"
}
}卡备注变更成功示例
{
"eventId": "card_operation_card_operation_5424_REMARK_UPDATE_SUCCESS",
"eventType": "CARD_OPERATION.REMARK_UPDATE_SUCCESS",
"eventCategory": "CARD_OPERATION",
"eventTime": "2026-07-02 12:10:00",
"apiVersion": "2026-06-01",
"merchantId": 10001,
"data": {
"requestNo": "RM202607020001",
"operationType": "REMARK_UPDATE",
"operationStatus": "SUCCESS",
"cardId": "card_88481234",
"cardNoMask": "486532******1298",
"cardType": "BUDGET",
"beforeRemark": "广告投放卡",
"afterRemark": "广告投放卡-7月",
"remark": "广告投放卡-7月",
"operationTime": "2026-07-02 12:09:59"
}
}字段说明
| 字段 | 说明 |
|---|---|
requestNo | 业务请求号或操作订单号。 |
operationType | RECHARGE、WITHDRAW、FREEZE、UNFREEZE、CANCEL、LIMIT_CHANGE、REMARK_UPDATE。 |
amount | 资金变动金额,仅充值和余额转出类事件返回。 |
refundAmount / refundCurrency | 普通销卡和风控销卡最终实际退回商户账户的金额与币种;无余额可退时返回 0.00 / USD。 |
cancelType / reason / sourceTransactionId | 仅 CARD.RISK_CANCELLED 返回,用于说明风控销卡类型、商户可见原因和触发交易流水。 |
beforeLimitConfig / afterLimitConfig | 限额变更前后配置,仅 LIMIT_CHANGE 返回。 |
beforeRemark / afterRemark | 备注变更前后内容,仅 REMARK_UPDATE 返回。 |
卡交易事件
卡交易可能按阶段推送多次。同一订单可能先有处理中或授权成功,后续再有清算完成;撤销也可能先进入处理中,后续再推送撤销成功。商户侧应把 Webhook 当成状态推进事件,而不是一次性最终结果。
处理中示例
{
"eventId": "wh_202607020200",
"eventType": "CARD_TRANSACTION.PROCESSING",
"eventCategory": "CARD_TRANSACTION",
"eventTime": "2026-07-02 12:00:05",
"apiVersion": "2026-06-01",
"merchantId": 10001,
"data": {
"transactionId": "txn_900000",
"relatedTransactionId": "",
"eventStatus": "PROCESSING",
"cardId": "card_88481234",
"cardNoMask": "486532******1298",
"cardType": "BUDGET",
"transactionType": "AUTH",
"originalAmount": "35.60",
"originalCurrency": "USD",
"actualAmount": "0.00",
"actualCurrency": "USD",
"feeAmount": "0.00",
"merchantName": "Google Ads",
"merchantCountry": "US",
"merchantMcc": "7311",
"transactionTime": "2026-07-02 12:00:02"
}
}授权成功示例
{
"eventId": "wh_202607020201",
"eventType": "CARD_TRANSACTION.AUTH_SUCCESS",
"eventCategory": "CARD_TRANSACTION",
"eventTime": "2026-07-02 12:01:00",
"apiVersion": "2026-06-01",
"merchantId": 10001,
"data": {
"transactionId": "txn_900001",
"relatedTransactionId": "",
"eventStatus": "AUTH_SUCCESS",
"cardId": "card_88481234",
"cardNoMask": "486532******1298",
"cardType": "BUDGET",
"transactionType": "AUTH",
"originalAmount": "35.60",
"originalCurrency": "USD",
"actualAmount": "35.60",
"actualCurrency": "USD",
"feeAmount": "0.53",
"merchantName": "Google Ads",
"merchantCountry": "US",
"merchantMcc": "7311",
"transactionTime": "2026-07-02 12:00:02"
}
}授权失败示例
{
"eventId": "wh_202607020202",
"eventType": "CARD_TRANSACTION.AUTH_FAILED",
"eventCategory": "CARD_TRANSACTION",
"eventTime": "2026-07-02 12:03:00",
"apiVersion": "2026-06-01",
"merchantId": 10001,
"data": {
"transactionId": "txn_900002",
"relatedTransactionId": "",
"eventStatus": "AUTH_FAILED",
"cardId": "card_88481234",
"cardNoMask": "486532******1298",
"cardType": "BUDGET",
"transactionType": "AUTH",
"originalAmount": "12.00",
"originalCurrency": "USD",
"actualAmount": "0.00",
"actualCurrency": "USD",
"feeAmount": "0.00",
"merchantName": "Example Store",
"merchantCountry": "US",
"merchantMcc": "5812",
"transactionTime": "2026-07-02 12:02:55"
}
}清算完成示例
{
"eventId": "wh_202607020203",
"eventType": "CARD_TRANSACTION.SETTLED",
"eventCategory": "CARD_TRANSACTION",
"eventTime": "2026-07-02 12:05:00",
"apiVersion": "2026-06-01",
"merchantId": 10001,
"data": {
"transactionId": "txn_900001",
"relatedTransactionId": "",
"eventStatus": "SETTLED",
"cardId": "card_88481234",
"cardNoMask": "486532******1298",
"cardType": "BUDGET",
"transactionType": "AUTH",
"originalAmount": "35.60",
"originalCurrency": "USD",
"actualAmount": "35.60",
"actualCurrency": "USD",
"feeAmount": "0.53",
"merchantName": "Google Ads",
"merchantCountry": "US",
"merchantMcc": "7311",
"transactionTime": "2026-07-02 12:00:02"
}
}退款成功示例
{
"eventId": "wh_202607020204",
"eventType": "CARD_TRANSACTION.REFUND_SUCCESS",
"eventCategory": "CARD_TRANSACTION",
"eventTime": "2026-07-02 12:15:00",
"apiVersion": "2026-06-01",
"merchantId": 10001,
"data": {
"transactionId": "txn_900004",
"relatedTransactionId": "txn_900001",
"eventStatus": "REFUND_SUCCESS",
"cardId": "card_88481234",
"cardNoMask": "486532******1298",
"cardType": "BUDGET",
"transactionType": "REFUND",
"originalAmount": "10.00",
"originalCurrency": "USD",
"actualAmount": "10.00",
"actualCurrency": "USD",
"feeAmount": "0.00",
"merchantName": "Google Ads",
"merchantCountry": "US",
"merchantMcc": "7311",
"transactionTime": "2026-07-02 12:14:58"
}
}撤销成功示例
{
"eventId": "wh_202607020205",
"eventType": "CARD_TRANSACTION.REVERSE_SUCCESS",
"eventCategory": "CARD_TRANSACTION",
"eventTime": "2026-07-02 12:20:00",
"apiVersion": "2026-06-01",
"merchantId": 10001,
"data": {
"transactionId": "txn_900005",
"relatedTransactionId": "txn_900001",
"eventStatus": "REVERSE_SUCCESS",
"cardId": "card_88481234",
"cardNoMask": "486532******1298",
"cardType": "BUDGET",
"transactionType": "REVERSE",
"originalAmount": "35.60",
"originalCurrency": "USD",
"actualAmount": "35.60",
"actualCurrency": "USD",
"feeAmount": "0.00",
"merchantName": "Google Ads",
"merchantCountry": "US",
"merchantMcc": "7311",
"transactionTime": "2026-07-02 12:18:10"
}
}订单修正示例
{
"eventId": "wh_202607020206",
"eventType": "CARD_TRANSACTION.CORRECTION",
"eventCategory": "CARD_TRANSACTION",
"eventTime": "2026-07-02 12:25:00",
"apiVersion": "2026-06-01",
"merchantId": 10001,
"data": {
"transactionId": "txn_900006",
"relatedTransactionId": "txn_900001",
"eventStatus": "CORRECTION",
"cardId": "card_88481234",
"cardNoMask": "486532******1298",
"cardType": "BUDGET",
"transactionType": "AUTH_CORRECTION",
"originalAmount": "1.20",
"originalCurrency": "USD",
"actualAmount": "1.20",
"actualCurrency": "USD",
"feeAmount": "0.00",
"merchantName": "Google Ads",
"merchantCountry": "US",
"merchantMcc": "7311",
"transactionTime": "2026-07-02 12:24:59"
}
}交易字段说明
| 字段 | 说明 |
|---|---|
transactionId | VCC 本地交易 ID。 |
relatedTransactionId | 关联原交易 ID。退款、撤销、修正类事件通常会返回。 |
eventStatus | 本次 Webhook 对应的交易阶段,和外层 eventType 后缀保持一致。 |
transactionType | 交易业务类型,例如 AUTH、REFUND、REVERSE、AUTH_CORRECTION。 |
originalAmount | 原始授权或交易金额。 |
actualAmount | 商户侧用于展示和对账的实际交易金额;成功消费仅并入已实际收取的手续费,未收取不并入。 |
feeAmount | 本次交易已实际收取的商户侧聚合手续费;未收取、待补扣或待人工处理的费用返回 0.00。 |
交易事件处理建议
eventId用于 Webhook 接收幂等;同一事件重试时不要重复入账。transactionId用于业务订单状态推进;同一transactionId可能出现多个eventType。relatedTransactionId用于关联退款、撤销和修正的原交易。PROCESSING不建议直接作为最终入账依据,应等待成功、失败、清算、退款或撤销类事件推进。
预算操作事件
预算组创建、充值成功和转出成功统一归入 BUDGET_OPERATION。系统手续费结算、预算组补差等内部资金请求不会作为普通预算充值或转出 Webhook 推送。
预算组创建示例
{
"eventId": "wh_202607020301",
"eventType": "BUDGET_OPERATION.CREATED",
"eventCategory": "BUDGET_OPERATION",
"eventTime": "2026-07-02 13:00:00",
"apiVersion": "2026-06-01",
"merchantId": 10001,
"data": {
"budgetId": 9001,
"budgetNo": "BG202607020001",
"budgetName": "July Ads Budget",
"cardGroupId": 301,
"cardGroupName": "US Ads Group",
"operationType": "CREATE",
"operationStatus": "SUCCESS",
"requestNo": "BG202607020001",
"currency": "USD",
"status": "ACTIVE",
"operationTime": "2026-07-02 12:59:59"
}
}预算充值成功示例
{
"eventId": "wh_202607020302",
"eventType": "BUDGET_OPERATION.RECHARGE_SUCCESS",
"eventCategory": "BUDGET_OPERATION",
"eventTime": "2026-07-02 13:10:00",
"apiVersion": "2026-06-01",
"merchantId": 10001,
"data": {
"budgetId": 9001,
"budgetNo": "BG202607020001",
"budgetName": "July Ads Budget",
"cardGroupId": 301,
"cardGroupName": "US Ads Group",
"operationType": "RECHARGE",
"operationStatus": "SUCCESS",
"requestNo": "BR202607020001",
"amount": "1000.00",
"currency": "USD",
"status": "ACTIVE",
"operationTime": "2026-07-02 13:09:58"
}
}预算转出成功示例
{
"eventId": "wh_202607020303",
"eventType": "BUDGET_OPERATION.WITHDRAW_SUCCESS",
"eventCategory": "BUDGET_OPERATION",
"eventTime": "2026-07-02 13:20:00",
"apiVersion": "2026-06-01",
"merchantId": 10001,
"data": {
"budgetId": 9001,
"budgetNo": "BG202607020001",
"budgetName": "July Ads Budget",
"cardGroupId": 301,
"cardGroupName": "US Ads Group",
"operationType": "WITHDRAW",
"operationStatus": "SUCCESS",
"requestNo": "BW202607020001",
"amount": "200.00",
"currency": "USD",
"status": "ACTIVE",
"operationTime": "2026-07-02 13:19:59"
}
}测试事件
商户在开发者配置中点击测试推送时,VCC 会发送 WEBHOOK_TEST。该事件只用于连通性和验签调试,不代表业务状态变化。
WEBHOOK_TEST 示例
{
"eventId": "wh_test_202607020001",
"eventType": "WEBHOOK_TEST",
"eventCategory": "WEBHOOK_TEST",
"eventTime": "2026-07-02 13:30:00",
"apiVersion": "2026-06-01",
"merchantId": 10001,
"data": {
"message": "VCC Webhook 测试推送"
}
}错误码
| 错误码 | 说明 | 处理建议 |
|---|---|---|
400 | 请求参数错误。 | 按接口字段说明修正请求参数。 |
401 | API Key 缺失、无效或 API 权限未开启。 | 检查 API Key 和 API 权限状态。 |
403 | 来源 IP 不在已配置白名单,或签名校验失败。 | 如已配置 IP 白名单,请检查来源 IP;同时检查签名串和 API Secret。 |
500 | 系统异常。 | 保留 requestId 并联系平台排查。 |