You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 15:30:04