用途:通过 x402 协议为 Telnyx 账户充值,使用 Base 区块链上的 USDC。流程分三步:获取报价、客户端签名、提交结算。该功能受 X402_PAYMENTS_ENABLED 功能开关控制,未启用时 API 返回 403。
前提条件:需 Telnyx API key(环境变量 TELNYX_API_KEY);需持有 Base 网络(chain ID eip155:8453)上 USDC 的钱包。Base 上的 USDC 合约地址为 0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913。
第一步 获取报价:向 https://api.telnyx.com/v2/x402/credit_account/quote 发送 POST 请求,请求体为 {"amount_usd": "50.00"},并携带 Authorization 与 Content-Type 头。报价有每笔最小/最大限额,由 API 的 422 错误消息给出当前值;报价 5 分钟后过期。响应含 id、amount_usd、amount_crypto(最小单位,6 位小数,如 $50.00 → "50000000")、network、expires_at 以及 x402 V2 的 payment_requirements,其中 accepts[0] 包含 scheme、network、amount、asset、payTo、maxTimeoutSeconds 和 extra(quoteId、facilitatorUrl、name、version)。
第二步 客户端签名:用户需用 ethers.js、viem 等 EIP-712 签名库签署 USDC 的 transferWithAuthorization(EIP-3009)消息,授权链下转账,无需用户发起链上交易。签名输入包括付款方私钥、报价中的 payTo、amount,以及 EIP-712 域字段。域中 name、version 来自报价的 accepts[0].extra;chainId 需客户端从 network(eip155:8453 → 8453)推导;verifyingContract 与 accepts[0].asset 相同,即 USDC 合约地址。需使用随机 32 字节 nonce 与有效期(当前时间至报价过期时间)。签名生成 r、s、v,此步无法仅用 curl 完成。私钥切勿硬编码或提交至版本控制。
构造 payment_signature:PaymentPayload v2 有三个顶层键 x402Version、accepted、payload(payload 与 accepted 平级,不能嵌入 accepted 内)。accepted 需原样复制报价的 accepts[0];payload 含 signature 与 authorization(from、to、value、validAfter、validBefore、nonce),其中 to 等于 accepted.payTo,value 等于 accepted.amount,validAfter 为 "0",validBefore 为 Unix 时间戳(报价过期时间)。resource 字段可选,但可用端到端实现会包含,用于描述所支付的 API 端点。随后将整个 PaymentPayload JSON 做 base64 编码。
第三步 提交:向 https://api.telnyx.com/v2/x402/credit_account 发送 POST 请求,请求体为 {"id":"<quote_id>","payment_signature":"<base64>"}。两字段均必填,id 须指向有效且未过期的报价。当前 API 网关不支持 PAYMENT-SIGNATURE 头方式,应使用请求体参数。
结算状态:成功返回 201,含 id、record_type 为 x402_transaction、amount、currency、status、quote_id、tx_hash、created_at。status 可为 verified(签名已验证,链上结算待处理)或 settled(链上确认,平台额度到账)。Base L2 结算近乎即时(约 2 秒),达到 settled 后加额度。
错误处理:422 包含低于最小限额、超过最大限额、余额不足(insufficient_balance / insufficient_funds)、授权额度不足(insufficient_allowance);400 包含授权过期、签名无效、nonce 无效;502 包含 facilitator 不可用、交易失败;503 包含 facilitator 超时、结算超时。
常见错误:将字段放在根级(v1 风格)会报 accepted 缺失;把 payload 嵌入 accepted 会报 payload 缺失;签名缺少 0x 前缀;amount、payTo、network 与报价不一致会触发校验错误。注意:这是仅文档型技能,签名步骤需要加密钱包库。