233 lines
6.6 KiB
TypeScript
233 lines
6.6 KiB
TypeScript
#!/usr/bin/env tsx
|
|
|
|
// 模拟从你的日志中提取的 Stripe 订阅数据
|
|
const mockSubscriptionData = {
|
|
"id": "sub_1Rt8nRLW0cChKPJ0Osn5UBcV",
|
|
"object": "subscription",
|
|
"application": null,
|
|
"application_fee_percent": null,
|
|
"automatic_tax": {
|
|
"disabled_reason": null,
|
|
"enabled": false,
|
|
"liability": null
|
|
},
|
|
"billing_cycle_anchor": 1754492307,
|
|
"billing_cycle_anchor_config": null,
|
|
"billing_mode": {
|
|
"type": "classic"
|
|
},
|
|
"billing_thresholds": null,
|
|
"cancel_at": null,
|
|
"cancel_at_period_end": false,
|
|
"canceled_at": null,
|
|
"cancellation_details": {
|
|
"comment": null,
|
|
"feedback": null,
|
|
"reason": null
|
|
},
|
|
"collection_method": "charge_automatically",
|
|
"created": 1754492307,
|
|
"currency": "usd",
|
|
"customer": "cus_SojwymqWZ4EXlZ",
|
|
"days_until_due": null,
|
|
"default_payment_method": "pm_1Rt8nPLW0cChKPJ0EF0QrEyS",
|
|
"default_source": null,
|
|
"default_tax_rates": [],
|
|
"description": null,
|
|
"discounts": [],
|
|
"ended_at": null,
|
|
"invoice_settings": {
|
|
"account_tax_ids": null,
|
|
"issuer": {
|
|
"type": "self"
|
|
}
|
|
},
|
|
"items": {
|
|
"object": "list",
|
|
"data": [
|
|
{
|
|
"id": "si_SomMVRu4Bpje2r",
|
|
"object": "subscription_item",
|
|
"billing_thresholds": null,
|
|
"created": 1754492308,
|
|
"current_period_end": 1757170707,
|
|
"current_period_start": 1754492307,
|
|
"discounts": [],
|
|
"metadata": {},
|
|
"plan": {
|
|
"id": "price_1RslfmLW0cChKPJ0VurJSg9I",
|
|
"object": "plan",
|
|
"active": true,
|
|
"amount": 1999,
|
|
"amount_decimal": "1999",
|
|
"billing_scheme": "per_unit",
|
|
"created": 1754403422,
|
|
"currency": "usd",
|
|
"interval": "month",
|
|
"interval_count": 1,
|
|
"livemode": false,
|
|
"metadata": {},
|
|
"meter": null,
|
|
"nickname": null,
|
|
"product": "prod_SoOSFPRNsYcTF8",
|
|
"tiers_mode": null,
|
|
"transform_usage": null,
|
|
"trial_period_days": null,
|
|
"usage_type": "licensed"
|
|
},
|
|
"price": {
|
|
"id": "price_1RslfmLW0cChKPJ0VurJSg9I",
|
|
"object": "price",
|
|
"active": true,
|
|
"billing_scheme": "per_unit",
|
|
"created": 1754403422,
|
|
"currency": "usd",
|
|
"custom_unit_amount": null,
|
|
"livemode": false,
|
|
"lookup_key": null,
|
|
"metadata": {},
|
|
"nickname": null,
|
|
"product": "prod_SoOSFPRNsYcTF8",
|
|
"recurring": {
|
|
"interval": "month",
|
|
"interval_count": 1,
|
|
"meter": null,
|
|
"trial_period_days": null,
|
|
"usage_type": "licensed"
|
|
},
|
|
"tax_behavior": "inclusive",
|
|
"tiers_mode": null,
|
|
"transform_quantity": null,
|
|
"type": "recurring",
|
|
"unit_amount": 1999,
|
|
"unit_amount_decimal": "1999"
|
|
},
|
|
"quantity": 1,
|
|
"subscription": "sub_1Rt8nRLW0cChKPJ0Osn5UBcV",
|
|
"tax_rates": []
|
|
}
|
|
],
|
|
"has_more": false,
|
|
"total_count": 1,
|
|
"url": "/v1/subscription_items?subscription=sub_1Rt8nRLW0cChKPJ0Osn5UBcV"
|
|
},
|
|
"latest_invoice": "in_1Rt8nPLW0cChKPJ0YOG0OCof",
|
|
"livemode": false,
|
|
"metadata": {},
|
|
"next_pending_invoice_item_invoice": null,
|
|
"on_behalf_of": null,
|
|
"pause_collection": null,
|
|
"payment_settings": {
|
|
"payment_method_options": {
|
|
"acss_debit": null,
|
|
"bancontact": null,
|
|
"card": {
|
|
"network": null,
|
|
"request_three_d_secure": "automatic"
|
|
},
|
|
"customer_balance": null,
|
|
"konbini": null,
|
|
"sepa_debit": null,
|
|
"us_bank_account": null
|
|
},
|
|
"payment_method_types": [
|
|
"card"
|
|
],
|
|
"save_default_payment_method": "off"
|
|
},
|
|
"pending_invoice_item_interval": null,
|
|
"pending_setup_intent": null,
|
|
"pending_update": null,
|
|
"plan": {
|
|
"id": "price_1RslfmLW0cChKPJ0VurJSg9I",
|
|
"object": "plan",
|
|
"active": true,
|
|
"amount": 1999,
|
|
"amount_decimal": "1999",
|
|
"billing_scheme": "per_unit",
|
|
"created": 1754403422,
|
|
"currency": "usd",
|
|
"interval": "month",
|
|
"interval_count": 1,
|
|
"livemode": false,
|
|
"metadata": {},
|
|
"meter": null,
|
|
"nickname": null,
|
|
"product": "prod_SoOSFPRNsYcTF8",
|
|
"tiers_mode": null,
|
|
"transform_usage": null,
|
|
"trial_period_days": null,
|
|
"usage_type": "licensed"
|
|
},
|
|
"quantity": 1,
|
|
"schedule": null,
|
|
"start_date": 1754492307,
|
|
"status": "active",
|
|
"test_clock": null,
|
|
"transfer_data": null,
|
|
"trial_end": null,
|
|
"trial_settings": {
|
|
"end_behavior": {
|
|
"missing_payment_method": "create_invoice"
|
|
}
|
|
},
|
|
"trial_start": null
|
|
}
|
|
|
|
function testWebhookData() {
|
|
console.log('🔍 Testing webhook data extraction...')
|
|
|
|
const subscription = mockSubscriptionData as any
|
|
|
|
console.log('📊 Subscription object keys:', Object.keys(subscription))
|
|
|
|
// 测试当前的提取逻辑
|
|
const customerId = subscription.customer as string
|
|
const status = subscription.status as string
|
|
const stripeSubscriptionId = subscription.id as string
|
|
const items = subscription.items as { data: Array<{ price: { id: string } }> }
|
|
const priceId = items?.data[0]?.price?.id
|
|
const currentPeriodStart = subscription.current_period_start as number
|
|
const currentPeriodEnd = subscription.current_period_end as number
|
|
|
|
console.log('🎯 Extracted data (current logic):')
|
|
console.log(' customerId:', customerId)
|
|
console.log(' status:', status)
|
|
console.log(' stripeSubscriptionId:', stripeSubscriptionId)
|
|
console.log(' priceId:', priceId)
|
|
console.log(' currentPeriodStart:', currentPeriodStart)
|
|
console.log(' currentPeriodEnd:', currentPeriodEnd)
|
|
|
|
// 检查日期是否有效
|
|
if (currentPeriodStart) {
|
|
const startDate = new Date(currentPeriodStart * 1000)
|
|
console.log(' startDate:', startDate.toISOString())
|
|
} else {
|
|
console.log(' ❌ currentPeriodStart is undefined/null')
|
|
}
|
|
|
|
if (currentPeriodEnd) {
|
|
const endDate = new Date(currentPeriodEnd * 1000)
|
|
console.log(' endDate:', endDate.toISOString())
|
|
} else {
|
|
console.log(' ❌ currentPeriodEnd is undefined/null')
|
|
}
|
|
|
|
// 检查替代的日期字段
|
|
console.log('\n🔍 Looking for alternative date fields:')
|
|
console.log(' start_date:', subscription.start_date)
|
|
console.log(' created:', subscription.created)
|
|
console.log(' billing_cycle_anchor:', subscription.billing_cycle_anchor)
|
|
|
|
// 检查 items 中的日期
|
|
if (subscription.items?.data?.[0]) {
|
|
const item = subscription.items.data[0]
|
|
console.log(' item.current_period_start:', item.current_period_start)
|
|
console.log(' item.current_period_end:', item.current_period_end)
|
|
}
|
|
|
|
console.log('\n✅ Analysis complete!')
|
|
}
|
|
|
|
testWebhookData()
|