DEV Community 中文 关注 有效的 webhook 签名并不意味着您尚未处理过该请求。 Webhook 即使拥有有效的签名,仍可能是重复事件。这一区别是使用 Stripe Digital Seller Kit 的免费样本进行探索的。该样本包含用于 Webhook 签名验证的 PHP 文件以及一个带签名的下载链接辅助工具。本地测试在 PHP 8.5.4 环境下进行,未涉及真实的 Stripe 请求或支付。核心 Webhook 测试显示,对 verify_webhook 函数的两次调用均返回了事件。这是因为请求体与签名匹配,且时间戳处于允许的五分钟窗口内。所提供的签名检查器不会保留对已处理事件的记忆。修改请求体或超出时间戳限制均能正确导致拒绝,从而验证了签名完整性和时效性检查。然而,这些检查并不能防止重复事件的处理。处理重复事件需要独立的机制来跟踪已完成的订单。如果两个请求同时到达,可能会发生竞态条件:在任一请求写入之前,两者都可能未看到任何先前记录。为防止这种情况,履行状态的检查与记录必须通过原子操作进行保护,例如使用数据库事务或文件锁。据称,完整的 Stripe Digital Seller Kit 提供了独立的防重复订单处理功能,本次分析未对此进行测试。下载链接辅助工具也经过了测试,验证了其在有效令牌、无效 ID、错误密钥和过期链接等情况下的正确行为。这些测试并未涵盖更广泛的功能,如退款处理或下载次数统计。作者强调,应将“同一有效事件两次”的测试与“无效签名”的测试分开进行,以避免混淆并确保正确的重复事件处理。 A valid webhook signature doesn't mean you haven't handled it already dev.to DEV Community 中文 RSS thenote.app
verify_webhook函数的两次调用均返回了事件。这是因为请求体与签名匹配,且时间戳处于允许的五分钟窗口内。所提供的签名检查器不会保留对已处理事件的记忆。修改请求体或超出时间戳限制均能正确导致拒绝,从而验证了签名完整性和时效性检查。然而,这些检查并不能防止重复事件的处理。处理重复事件需要独立的机制来跟踪已完成的订单。如果两个请求同时到达,可能会发生竞态条件:在任一请求写入之前,两者都可能未看到任何先前记录。为防止这种情况,履行状态的检查与记录必须通过原子操作进行保护,例如使用数据库事务或文件锁。据称,完整的 Stripe Digital Seller Kit 提供了独立的防重复订单处理功能,本次分析未对此进行测试。下载链接辅助工具也经过了测试,验证了其在有效令牌、无效 ID、错误密钥和过期链接等情况下的正确行为。这些测试并未涵盖更广泛的功能,如退款处理或下载次数统计。作者强调,应将“同一有效事件两次”的测试与“无效签名”的测试分开进行,以避免混淆并确保正确的重复事件处理。