sub 对应用户。读取需要 portal:read;写入需要 portal:write,且只能操作用户自己的数据。
认证
aud=clink-agent-platform-portal、token_use=access 和所需 scope,然后把验证后的客户身份传给 cwallet。请求中没有用于指定其他客户或邮箱的参数。
Clink 响应使用统一 envelope:
data。
通用行为
pageNum和pageSize使用从 1 开始的分页。- 订单列表支持
status、from、to过滤。 - 列表按用户隔离,不按 Agent 过滤;该用户下任意 Agent 创建的订单、退款和授权都会返回。
- 记录不存在,或记录属于其他用户时,返回
404。 - 写接口只限用户自己的风控规则、账单地址、购买指令、绑卡会话、支付凭证、支付结果和支付方式;其余接口只读。
- 写接口的请求金额使用主货币单位的十进制字符串:
"12.50"表示 USD 12.50。不要传最小单位。
获取账户信息
支付方式列表
status 为 ACTIVE 或 DISABLED。不会返回 PAN 或 CVV。is_default 标识默认卡;默认卡可以删除。
添加卡片请使用绑定银行卡。如果要在一次流程中完成绑卡和购买授权,请在创建指令中省略 payment_instrument_id。删除卡片请使用删除支付方式。
绑定银行卡
为 token 对应用户创建短期绑卡会话,并返回一个供用户在浏览器中打开、完成绑卡的 URL。需要portal:write。
该接口不创建指令,也不授权消费。用户只需要添加卡片时使用它;如果要一次完成绑卡和授权,请改用创建指令并省略 payment_instrument_id。
响应
每次调用都会创建一个新的独立会话,有效期较短。用户打开链接并完成绑卡流程后,卡片会加入该用户的支付方式(见支付方式列表);不会创建指令或授权。会话处于 pending 状态时可以重新打开或重复兑换链接;绑卡流程完成或会话过期后链接失效。
删除支付方式
删除 token 对应用户的一个支付方式。需要portal:write。
删除成功返回
200 和 deleted: true。删除立即生效,响应不返回用户操作页面链接。支付方式不存在,或属于其他用户时,都返回相同的 404,因此响应不会泄露其他用户的卡是否存在。默认卡可以删除。删除成功后重复发起该请求会返回 404。
订单列表
truncated: true 表示带状态/时间过滤的扫描达到 Clink 内部扫描上限;total 描述已扫描记录,不一定是该用户完整匹配历史。不带过滤时只读取一页,不使用有界扫描。
订单详情
agent_info 以及 refund_summary:
退款列表
退款详情
404。
授权列表
授权详情
mandates 和 usages。usages 是原始使用记录;Portal 展示已用和剩余金额时由调用方自行汇总。授权属于其他用户时返回 404。
授权响应中的 client_reference_id 是指令自身的字段。通过 portal 创建的指令由 Clink 生成随机值;它不是创建请求的 request_id,也不是取凭证和回报结果时发送的 client_reference_id。不要用它做对账。
创建指令
为 token 对应用户创建购买指令(消费授权),并返回短期激活链接;用户打开链接并在 Clink 签名页完成 Passkey 验证后,授权才会生效。需要portal:write。
payment_instrument_id 决定使用哪种签约模式:
指定卡签约时,从支付方式列表获取
payment_instrument_id。绑卡并签约时,不要发送卡号、CVV 或任何其他卡片字段;用户在 Clink 页面输入卡片信息。客户身份始终来自 token;请求体中没有 customer 或 email 字段。
激活链接的签名会话兑换完成后,指定卡指令继续进入 /authorize/{paymentInstrumentId}?instructionId=...;绑卡并签约指令继续进入 /bind-authorize?instructionId=...,用户在那里完成绑卡和授权(同一次 Passkey ceremony)。
请求字段
每条 mandate 包含:
请求示例
- 指定卡签约
- 绑卡并签约
响应
- 指定卡签约
- 绑卡并签约
激活指令
创建指令不等于授权。指定已有卡的指令状态为CREATED;需要绑卡的指令状态为 PENDING。两者都只有用户在 Clink 签名页完成 Passkey 验证后才变为 ACTIVE。链接在有效期内可以重新打开或刷新,但指令只能签署一次。
- 让用户在浏览器中打开
activation_url。 CREATED指令由用户确认卡片并完成 Passkey 验证;PENDING指令由用户在同一次 ceremony 中完成绑卡和 Passkey 验证。页面会建立浏览器登录态并继续到授权步骤。- 轮询
GET /agent/platform/authorizations/{instructionId},直到status为ACTIVE。
CREATED 或 PENDING,不会授权任何消费。链接只发给目标用户;它是激活链接,不是 portal token。
幂等
request_id 是幂等键,两种签约模式规则一致。Clink 默认保留幂等记录 24 小时;超过该窗口后,用同一 request_id 重试会新建一条指令。窗口内使用完全一致的参数重试会返回同一 instruction_id;对尚未签署的指令正常重试会返回新的激活链接。如果重试的 request_id 对应已签署或已终态的指令,Clink 返回该指令但不返回新的 activation_url 或 activation_expires_at(这两个字段会被省略);请读取 GET /agent/platform/authorizations/{instructionId} 获取当前状态。相同 request_id 携带不同参数返回 409,code 为 71211011(portal_conflict)。
获取凭证
针对已激活的指令和 mandate,为一次购买获取一次性支付凭证。需要portal:write。
响应有两种模式,取决于平台是否已在 Clink 登记公钥:
- 已登记公钥(
matched: true):Clink 把卡字段密封到key/payload信封中,只有持有配对私钥的平台才能解密。 - 未登记公钥(
matched: false):当服务端启用明文模式且 gateway 响应脱敏已生效时,Clink 在响应中以明文返回 DPAN 和动态 CVV。卡可以直接使用,但这些字段会以明文到达平台后端。
登记平台公钥
联系 Clink 在目标环境登记平台的 RSA 公钥;公钥按平台 client name 映射。是否登记公钥决定响应模式:已登记时凭证密封到该公钥;未登记时,只有在服务端启用明文模式且 gateway 响应脱敏已生效的情况下才返回明文卡字段(MCP 等价的回退行为);默认开关关闭时接口会 fail closed。生产使用前请先登记公钥。请求字段
products 中每个商品的字段:
请求示例
响应
matched 决定响应结构。
- 密文模式(matched: true)
- 明文模式(matched: false)
Clink 使用平台登记的公钥密封凭证,卡字段在
payload 内。
密封模式响应只包含
matched、key、payload 和 expires_at;此时 card、display 和 ID 字段会被省略,ID 在解密后的 payload 内。明文模式响应不包含 key 或 payload。
明文模式下 card 的字段:
明文模式下 number 和 securityCode 始终存在;其余字段可选,网络未提供时省略。
解密密封响应
当matched 为 true 时,使用平台私钥解密 key 和 payload。解密后的 payload 包含 orderId、paymentExecutionDetailId、clientReferenceId、status、网络凭证(DPAN、动态 CVV 和有效期)以及持卡人和地址字段。信封格式和解密示例见解密。
不要把解密后的卡字段写入日志、模型输入或普通记录,并以解密后 payload 中的有效期信息为准判断凭证可用时间;expires_at 只是估算。保存 client_reference_id;回报支付结果会用到它。
幂等
client_reference_id 是幂等键。使用相同 client_reference_id 重试会返回同一凭证:matched 为 true 时返回同一密封信封,明文模式下从服务端加密缓存返回同一张卡,不会重复签发。携带不同参数复用时返回 409,code 为 71211011(portal_conflict)。
回报支付结果
使用凭证后,回报在商户页面观察到的结果。需要portal:write。Clink 用该回报闭环订单和指令 usage。回报只记录商户页面显示的结果,不会执行或验证支付。
该接口是支付结果确认入口。它是确认或回报交易结果的唯一入口,Clink 不提供独立的“确认交易”接口。请在下方说明的 24 小时回报窗口内,通过该接口回报最终结果(包括在
UNKNOWN 回报之后补报最终结果)。请求字段
failure_reason 接受 CARD_DECLINED、AUTHENTICATION_REQUIRED、AMOUNT_CHANGED、CREDENTIAL_EXPIRED、CREDENTIAL_LOST、MERCHANT_ERROR、BUYER_CANCELLED 或 OTHER。
请求示例
响应
回报规则
- Clink 在
report_deadline之前接受最终结果,即凭证签发后 24 小时。超过窗口的回报返回410,code为71211018(report_window_expired)。 - usage 不存在或不属于 token 对应用户时返回
404。 - Clink 按两类比较最终结果:
SUCCEEDED属于成功类;FAILED和NOT_SUBMITTED都属于失败类。同一类内重复回报会以 HTTP200返回已记录的结果;例如已记录NOT_SUBMITTED后再回报FAILED不冲突。已记录终态后回报另一类结果返回409,code为71211017(result_already_reported)。 SUCCEEDED、FAILED和NOT_SUBMITTED会闭环 usage,并进入 Clink 既有的支付结果处理链路。UNKNOWN不记录终态、不发布结果消息,返回PENDING;请在report_deadline之前回报最终结果。paid_amount和currency_code必须成对出现。paid_amount与授权金额不一致时,Clink 记录paid_amount_mismatch: true,不覆盖授权金额。
风控规则
读取或全量替换用户的全局默认风控规则。autoSuspendEnabled 在当前版本是固定安全行为:Clink 始终返回 true,写入值会被忽略。请求 schema 为兼容保留该字段,但不能用它关闭自动暂停。PUT 返回保存后的规则。只有 portal:read 的 token 可以读,但 PUT 返回 403。
账单地址
读取或替换用户的账单地址。portal:read 的 token PUT 返回 403。
错误
业务错误使用同一个 envelope,不带data:code 是数字业务码,msg 是人类可读描述。判断错误时以 HTTP 状态和 code 为准,不要依赖字符串错误码。