周三下午三点,一位独立开发者打开Stripe后台,发现过去三周有5笔付款,但GitHub仓库的邀请记录是零。不是Stripe没到账,不是webhook没触发——是他的代码在"优雅地"失败。
问题藏在三行代码里:if repo:。当price_id不在映射表里,程序直接跳过,返回200 OK。Stripe看到成功,客户收到确认邮件,开发者后台一片绿色。唯独该发的仓库邀请,消失在沉默中。
![]()
这不是个例。搜索"webhook tutorial",十个有九个教你验证签名、解析事件、返回200。几乎没人告诉你:200意味着"我承诺做完了",而不只是"我收到了"。
作者给这个盲区起了名字:output-attestation(输出验证)。核心就四行:
delivered = False
if repo := PRICE_TO_REPO.get(price_id):
github.add_collaborator(repo, email)
delivered = True
if not delivered:
raise WebhookFulfillmentError
关键在最后那个raise。Stripe收到5xx会重试,你的后台会立刻出现retry风暴——5分钟就能发现问题,而不是三周后手动查订单表才发现零行记录。
常见的"正确"写法其实是陷阱:
if not repo:
log.warning("unknown price_id")
return {"status": "ok"}
三个致命问题:日志是pull机制,你得主动去看;WARNING埋在INFO堆里,side project根本没人3点监控;最隐蔽的是——你教会了整个系统"这次成功了",下游重放、对账、审计全建立在谎言之上的。
webhook的契约被误解太久了。200不是"我收到了",是"我负责到底了"。如果你的handler不能保证这一点,就该让Stripe知道,让它用重试来喊你起床。
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.