Stripe发票周期异常:Webhook返回70年代时间问题求助
解决Stripe Webhook返回70年代支付周期的问题
你遇到的70年代日期本质是Unix时间戳0对应的1970-01-01,说明代码对Stripe返回的周期时间处理存在错误,以下是具体排查和修复方案:
核心问题分析
Stripe返回的时间字段均为秒级Unix时间戳,而JavaScript的Date构造函数默认接受毫秒级时间戳,直接使用会导致时间解析异常;另外也可能存在字段读取错误、套餐配置未生效的情况。
排查与修复步骤
1. 确认正确的周期字段
Stripe对象中对应支付周期的字段为:
- 订阅(
Subscription):current_period_start、current_period_end - 发票(
Invoice):period_start、period_end
检查你的processWebhookSubscription和processWebhookInvoiceSuccess函数,确保没有误读其他无关字段(比如created)。
2. 修复时间戳格式转换
将Stripe返回的秒级时间戳乘以1000,转换为JavaScript支持的毫秒级:
// 错误用法:直接传入秒级时间戳 const invalidDate = new Date(subscription.current_period_start); // 正确用法:转换为毫秒级 const validStartDate = new Date(subscription.current_period_start * 1000); const validEndDate = new Date(subscription.current_period_end * 1000);
3. 验证原始事件数据
在处理函数中打印原始数据,确认Stripe返回的时间戳是否正常:
export async function processWebhookSubscription(subscription: Stripe.Subscription) { // 打印原始时间戳,确认是否为有效数值 console.log("原始周期时间戳:", subscription.current_period_start, subscription.current_period_end); // 后续业务逻辑... }
如果打印结果为0,需检查Stripe Dashboard的套餐配置:
- 确认套餐(Price)的
recurring.interval设置为month - 确认订阅创建时未手动传入错误的
current_period_start参数
4. 类型安全检查(TypeScript环境)
确保Stripe.Subscription和Stripe.Invoice的类型定义正确,没有自定义类型覆盖原始字段的类型声明。
示例修正代码
以processWebhookSubscription函数为例,正确的周期处理逻辑:
export async function processWebhookSubscription(subscription: Stripe.Subscription) { // 转换时间戳为可使用的日期对象 const periodStart = new Date(subscription.current_period_start * 1000); const periodEnd = new Date(subscription.current_period_end * 1000); // 基于有效周期执行配额计算逻辑 console.log("有效支付周期:", periodStart.toISOString(), "至", periodEnd.toISOString()); // 你的其他业务代码... }
内容的提问来源于stack exchange,提问作者Natan Santos
相关产品推荐
相关产品推荐

