跳转到主要内容
这些接口都使用 Portal token,只访问 token 的 sub 对应用户。读取需要 portal:read;写入需要 portal:write,且只能操作用户自己的数据。

认证

Gateway 校验 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。
请求中没有用于指定其他用户的 body 字段。会话始终为该 token 对应用户创建。

响应

每次调用都会创建一个新的独立会话,有效期较短。用户打开链接并完成绑卡流程后,卡片会加入该用户的支付方式(见支付方式列表);不会创建指令或授权。会话处于 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 包含:

请求示例

响应

把激活链接当作凭证处理。不要转发、截图或写入日志;拿到链接的人可以在链接有效期内打开它,并取得该客户的 Clink 浏览器登录态。只把链接发给目标用户。

激活指令

创建指令不等于授权。指定已有卡的指令状态为 CREATED;需要绑卡的指令状态为 PENDING。两者都只有用户在 Clink 签名页完成 Passkey 验证后才变为 ACTIVE。链接在有效期内可以重新打开或刷新,但指令只能签署一次。
  1. 让用户在浏览器中打开 activation_url。
  2. CREATED 指令由用户确认卡片并完成 Passkey 验证;PENDING 指令由用户在同一次 ceremony 中完成绑卡和 Passkey 验证。页面会建立浏览器登录态并继续到授权步骤。
  3. 轮询 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 登记公钥即可使用加密模式;生产环境建议登记。

登记平台公钥

联系 Clink 在目标环境登记平台的 RSA 公钥;公钥按平台 client name 映射。是否登记公钥决定响应模式:已登记时凭证密封到该公钥;未登记时,只有在服务端启用明文模式且 gateway 响应脱敏已生效的情况下才返回明文卡字段(MCP 等价的回退行为);默认开关关闭时接口会 fail closed。生产使用前请先登记公钥。
未登记公钥时,在服务端启用明文模式的前提下,响应会以明文把 DPAN 和动态 CVV 返回给平台后端。不要把这些字段写入日志、模型输入或普通存储,也不要在结账后保留。请在 Clink 登记公钥(生产环境建议)以切换到密封的 key/payload 模式。该明文回退行为与 MCP get_credential 一致。在 gateway 响应脱敏尚未生效的环境中不要启用明文模式:该模式由服务端 portal-plaintext-enabled 配置开关控制(默认关闭),开关关闭时接口会 fail closed 并返回 71211012(credential_public_key_not_configured),而不是明文卡字段。

请求字段

products 中每个商品的字段:

请求示例

响应

matched 决定响应结构。
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 都属于失败类。同一类内重复回报会以 HTTP 200 返回已记录的结果;例如已记录 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。

账单地址

读取或替换用户的账单地址。
PUT 返回更新后的地址。Clink 校验必填字段,并复用现有 wallet 账单地址规则(配置国家名单,以及这些国家的 city/line1 要求)。只有 portal:read 的 token PUT 返回 403。

错误

业务错误使用同一个 envelope,不带 data:code 是数字业务码,msg 是人类可读描述。判断错误时以 HTTP 状态和 code 为准,不要依赖字符串错误码。