MoonPay Commerce:核对Pay Link成功事件、验签和重投
链小知 · 进阶 · 核验 · 依官方文档整理
固定事件作用域与交易ID,避免把重复通知或Deposit告警当成新增订单收款。
开始前准备
- 准备已有且脱敏的订单、请求或回执记录;没有实际记录时仅按文档列出待核字段。
- 本教程依据公开资料,不登录、申请密钥、调用业务API、创建收款或执行退款。
1. 固定Pay Link事件与作用域
Pay Link一次性付款成功通知的订阅类型为REGULAR_TRANSACTION或ALL,实际payload的event为CREATED。省略paylinkId表示账户全局,指定则限该Pay Link。
Deposit与订阅是其他事件类别;不用DEPOSIT_TX_*、最低额或审核告警判断Pay Link已收款。
检查结果:订阅类型、CREATED及全局/单链接作用域对应。
2. 先验Bearer和原正文签名
官方Webhook要求Authorization: Bearer <sharedToken>与X-Signature。用原请求正文在JSON解析前计算sharedToken为键的HMAC-SHA256十六进制摘要,使用恒定时间比较。
sharedToken在创建时只返回一次;本文不创建、不读取或保存实际凭据,仅核已有脱敏验签结果。认证缺失或验签失败则事件不作为订单完成依据。
检查结果:Bearer检查与原正文HMAC检查都有结果或明确未验证。
3. 按交易字段关联订单并防重复
CREATED载荷的transactionObject含id、paylinkId和meta.transactionSignature/transactionStatus;transaction是同一数据的JSON字符串。chargeToken关联买方Charge页面。
重投可能重复同一交易。应用处理时按已核实的交易id及订单关联避免重复履约;这是对交易字段与重投机制的处理建议,不声称官方提供全平台exactly-once。X-Webhook-Delivery-Id与X-Transaction-Id在当前参考页限定Deposit通知,不能假定Pay Link也有。
检查结果:重投与新交易已分开;没有限定头时不用猜测头值去重。
4. 对照通知送达和真实收款
仪表盘Developers → Webhooks可核事件日志、送达状态及时间,官方自动重投最多12次,达到上限可从日志手动replay。本文只核已有记录,不重放实际通知。
送达失败属于通知问题,不能据此宣称付款失败;结合Charge的paylinkTx或signature交易记录核收款。无法取得对应交易时保留未知。
检查结果:日志送达、重投次数和底层交易三项分列。
怎样确认完成
- 形成订单、资源ID、金额、状态与未验证项的对照;保留失败原文。
常见错误与边界
- 本文只核Pay Link成功事件;Deposit共享请求头及配额告警不扩展到所有Webhook。
- 通知处理建议不保证不丢消息,也不代替实际收款和对账验收。