USDC 收银台集成
一份务实的工程指南,介绍如何在结账环节集成 USDC 付款:API 模式、网络选择、Webhook 幂等性,以及您在生产环境中会遇到的各种故障情形。
要点速览
USDC 收银台集成遵循一套熟悉的模式:在您的服务器上创建支付意图(金额、币种、网络偏好),从收单机构获取托管收银台 URL 或组件配置,让买家在自己的钱包中付款,并以幂等方式处理确认 Webhook。最关键的工程决策包括:网络选择(默认使用 Solana 或 Base,费用不到一美分)、Webhook 幂等性(使用订单 ID + 交易哈希)、退款流程(在结账时收集钱包地址,并提供退款 API),以及钱包签名环节的平滑体验(移动端通过深度链接唤起钱包,桌面端回退到二维码)。实现得当的话,USDC 结账从头到尾不到 30 秒即可完成,商户成本视收单机构而定,为 0.3%–1%。
标准 API 形态
USDC 收单 API 大体沿用了 Stripe 推广开来的支付意图模式。最基本的接口包括:
服务器创建支付意图
调用
POST /v1/payments,请求体包含amount、currency(以法币报价时为 USD;以稳定币报价时为 USDC)、settlement_preference(USDC 或法币)、networks(允许的网络列表)、order_id(您的幂等键)、success_url、cancel_url,以及一个供您自行对账使用的metadata数据块。收单机构返回收银台 URL 或组件配置
托管收银台:返回一个 URL,买家会被重定向到该地址。嵌入式组件:返回一份客户端配置(可公开密钥、支付意图 ID),由组件加载。两种流程都会处理钱包检测、网络选择和报价展示。
买家在钱包中签名,链上转账广播
移动端:通过深度链接跳转到 MetaMask、Phantom、Trust 等钱包。桌面端:使用 WalletConnect 二维码或浏览器扩展弹窗。买家核对金额后签名。
收单机构等待区块确认,触发 Webhook
收单机构向您发送
POST your_webhook_url请求,载荷包含event_type: “payment.succeeded”、order_id、amount、tx_hash、network,以及一个您需要用收单机构的 Webhook 密钥验证的签名。服务器以幂等方式将订单标记为已付款
验证 Webhook 签名,在数据库中查询
(order_id, tx_hash),如尚未标记则标记为已付款,然后发起履约。
网络选择
接受哪些网络,是用户体验与成本之间的权衡:
- Solana:网络费用不到一美分,确认时间不到一秒。是小额客单价(AOV)场景的最佳默认选择。
- Base:网络费用几美分,确认需要几秒。钱包支持广泛;对加密原生用户群来说是不错的默认选择。
- Polygon、Arbitrum:费用和速度与 Base 相近。可以加入,但并非必需。
- Ethereum 主网:视 Gas 情况,网络费用为 $1–$8+。对小额订单的买家来说负担较重。适合高客单价(超过 $500)订单,或作为备选。
- Tron:如果您面向亚洲和非洲的 USDT 资金流,值得考虑在 USDC 之外同时支持 TRON 上的 USDT。
Webhook 幂等性
Webhook 会重试,因此您的处理程序必须具备幂等性。标准模式如下:
- 使用收单机构的密钥,通过 HMAC-SHA256 验证 Webhook 签名。
- 从载荷中提取
(order_id, tx_hash)。 - 在您的
processed_payments表中查询这一组合。 - 如果找到:直接返回 200 OK,不做任何其他操作。
- 如果未找到:插入该行(对这一组合设置 UNIQUE 约束),然后在主订单表中将订单标记为已付款,再发起履约。
- 将第 5 步包在同一个数据库事务中,这样即使流程中途崩溃,也不会重复履约。
大多数收单 Webhook 都包含一个投递 ID,请记录下来以便调试,但不要把它当作幂等键。网络确认和收单机构的重试可能产生多个重复的 payment.succeeded 事件,它们的投递 ID 不同,tx_hash 却相同;去重必须基于链上身份,而不是投递记录。
退款流程
主流的模式有两种:
- 原路退款:收单机构将 USDC 退回买家最初付款所用的地址。用户体验最简洁;之所以可行,是因为链上付款记录中包含来源地址。
- 退款至指定地址:由买家指定退款目的地(如果买家是从交易所或热钱包付款,该地址可能与来源地址不同)。大多数收单机构通过带有
destination_address的POST /v1/refunds支持这一方式。
退款这一环节的网络费用由商户承担。全额退款和部分退款均受支持。退款本身所需的链上确认时间与原始付款相同。
生产环境中的故障情形
- 买家签名后放弃。链上转账已经广播,但买家在 Webhook 触发之前关闭了页面。收单机构仍会通过链上监控检测并确认这笔付款;您的履约流程应由 Webhook 触发,而不是由页面重定向触发。
- 买家支付的金额不对。大多数收单机构会在链上检测时拒绝金额不符的付款。部分收单机构允许近似匹配(在一定容差范围内),并在 Webhook 中标明差额。
- 买家在错误的网络上付款。如果买家在 Ethereum 上签名,而您只接受 Solana,这笔付款将完全不在收单机构的监控范围内。大多数服务商会通过找回流程退还资金;有些则会导致资金丢失。请在结账时清楚标明网络选择。
- 买家从交易所地址付款。原路退款可能被退回,或进入错误的账户。对于任何可能产生退款的产品,请在结账时明确收集退款目的地址。
- 稳定币脱锚。虽然罕见,但确实会发生。如果 USDC 在报价与链上结算之间的短暂窗口内大幅脱锚,差额将视双方协议由商户或收单机构承担。
通过 DPT Acquiring 添加 USDC 收银台
每笔交易 0.3% 起。以 USDC 或法币当日结算。提供托管收银台 URL 或可嵌入组件。SDK 和 Webhook 文档请访问 merchant.dpt.xyz。