-
Notifications
You must be signed in to change notification settings - Fork 298
Expand file tree
/
Copy pathroute.ts
More file actions
161 lines (136 loc) · 4.47 KB
/
Copy pathroute.ts
File metadata and controls
161 lines (136 loc) · 4.47 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
import { NextRequest, NextResponse } from 'next/server'
import { handleCreemWebhook } from '@/lib/payment/creem'
// 🔥 通用支付Webhook处理器
export async function POST(request: NextRequest) {
try {
// 🔍 获取请求体和各种可能的签名头
const body = await request.text()
const userAgent = request.headers.get('user-agent') || ''
const contentType = request.headers.get('content-type') || ''
// 🔍 检测支付提供商
const paymentProvider = detectPaymentProvider(request, body)
console.log(`收到支付Webhook请求 - 提供商: ${paymentProvider}`)
switch (paymentProvider) {
case 'creem':
return await handleCreemPayment(request, body)
case 'stripe':
return await handleStripePayment(request, body)
case 'paypal':
return await handlePayPalPayment(request, body)
default:
console.error('未知的支付提供商:', paymentProvider)
return NextResponse.json(
{
success: false,
error: `不支持的支付提供商: ${paymentProvider}`
},
{ status: 400 }
)
}
} catch (error) {
console.error('通用支付Webhook处理异常:', error)
return NextResponse.json(
{
success: false,
error: '服务器内部错误'
},
{ status: 500 }
)
}
}
// 🔍 检测支付提供商
function detectPaymentProvider(request: NextRequest, body: string): string {
// 🔥 通过请求头检测CREEM
const creemSignature = request.headers.get('x-creem-signature') ||
request.headers.get('x-signature')
if (creemSignature) {
return 'creem'
}
// 🔥 通过请求头检测Stripe
const stripeSignature = request.headers.get('stripe-signature')
if (stripeSignature) {
return 'stripe'
}
// 🔥 通过User-Agent检测PayPal
const userAgent = request.headers.get('user-agent') || ''
if (userAgent.includes('PayPal')) {
return 'paypal'
}
// 🔥 通过请求体内容检测
try {
const data = JSON.parse(body)
// CREEM特征检测
if (data.type && (data.type.includes('checkout') || data.type.includes('subscription'))) {
return 'creem'
}
// Stripe特征检测
if (data.object && data.object === 'event') {
return 'stripe'
}
// PayPal特征检测
if (data.event_type || data.resource_type) {
return 'paypal'
}
} catch (error) {
console.log('无法解析请求体为JSON,使用默认检测')
}
// 🔥 默认返回CREEM(当前主要使用的支付方式)
return 'creem'
}
// 🔥 处理CREEM支付
async function handleCreemPayment(request: NextRequest, body: string) {
const signature = request.headers.get('x-creem-signature') ||
request.headers.get('x-signature') ||
request.headers.get('signature') || ''
console.log('处理CREEM支付Webhook')
const result = await handleCreemWebhook(body, signature)
if (result.success) {
console.log('CREEM Webhook处理成功:', result.event?.type)
return NextResponse.json({
success: true,
provider: 'creem',
message: 'CREEM Webhook处理成功',
eventType: result.event?.type
})
} else {
console.error('CREEM Webhook处理失败:', result.error)
return NextResponse.json(
{
success: false,
provider: 'creem',
error: result.error
},
{ status: 400 }
)
}
}
// 🔥 处理Stripe支付(预留接口)
async function handleStripePayment(request: NextRequest, body: string) {
console.log('处理Stripe支付Webhook')
// TODO: 实现Stripe Webhook处理逻辑
return NextResponse.json({
success: true,
provider: 'stripe',
message: 'Stripe Webhook处理功能待实现'
})
}
// 🔥 处理PayPal支付(预留接口)
async function handlePayPalPayment(request: NextRequest, body: string) {
console.log('处理PayPal支付Webhook')
// TODO: 实现PayPal Webhook处理逻辑
return NextResponse.json({
success: true,
provider: 'paypal',
message: 'PayPal Webhook处理功能待实现'
})
}
// 🔥 支持GET请求用于验证端点
export async function GET() {
return NextResponse.json({
message: '通用支付Webhook端点正常运行',
timestamp: new Date().toISOString(),
endpoint: '/api/webhooks/payments',
supportedProviders: ['creem', 'stripe', 'paypal'],
currentPrimaryProvider: 'creem'
})
}