88 "io"
99 "net/http"
1010
11- "github.com/pocketbase/pocketbase/apis"
1211 "github.com/pocketbase/pocketbase/core"
1312 "github.com/stripe/stripe-go/v84"
1413 "github.com/stripe/stripe-go/v84/webhook"
@@ -20,9 +19,6 @@ type SubscriptionHandler struct {
2019
2120func (h * SubscriptionHandler ) Checkout (e * core.RequestEvent ) error {
2221 user := e .Auth
23- if user == nil {
24- return apis .NewUnauthorizedError ("Login first" , nil )
25- }
2622
2723 var data struct {
2824 Plan string `json:"plan"`
@@ -42,7 +38,18 @@ func (h *SubscriptionHandler) Checkout(e *core.RequestEvent) error {
4238
4339 url , err := h .service .CreateCheckoutSession (user , data .Plan , baseURL )
4440 if err != nil {
45- return e .BadRequestError (err .Error (), nil )
41+ switch {
42+ case errors .Is (err , ErrPlanInvalid ):
43+ return e .BadRequestError ("The selected plan is invalid." , nil )
44+
45+ case errors .Is (err , ErrAlreadySubscribed ):
46+ return e .BadRequestError ("You already have an active subscription." , nil )
47+
48+ default :
49+ // 记录未知的系统错误
50+ h .service .app .Logger ().Error ("Checkout failed" , "error" , err )
51+ return e .InternalServerError ("An unexpected error occurred." , nil )
52+ }
4653 }
4754
4855 return e .JSON (http .StatusOK , map [string ]string {"url" : url })
@@ -63,39 +70,51 @@ func (h *SubscriptionHandler) StripeWebhook(e *core.RequestEvent) error {
6370 },
6471 )
6572 if err != nil {
66- fmt . Println ( err )
73+ h . service . app . Logger (). Debug ( "Invalid Stripe signature" , "err" , err )
6774 return e .BadRequestError ("Invalid signature" , nil )
6875 }
6976
77+ h .service .app .Logger ().Info ("Received Stripe Webhook" ,
78+ "type" , event .Type ,
79+ "id" , event .ID ,
80+ )
81+
7082 switch event .Type {
7183 case "checkout.session.completed" :
7284 var session stripe.CheckoutSession
7385 err := json .Unmarshal (event .Data .Raw , & session )
7486 if err != nil {
75- fmt . Println ( err )
87+ h . service . app . Logger (). Warn ( "Stripe webhook: JSON unmarshal failed" , "err" , err )
7688 return e .BadRequestError ("JSON unmarshal failed" , nil )
7789 }
7890
7991 // 🌟 调用 Service 层处理业务(如更新用户订阅状态、发货等)
8092 // 传入 e.App (PocketBase 实例) 以便在 Service 里操作数据库
8193 if err := h .service .HandleCheckoutCompleted (session ); err != nil {
82- fmt .Println (err )
94+ h .service .app .Logger ().Error ("Stripe webhook: checkout.session.completed processing failed" ,
95+ "error" , err ,
96+ "sessionId" , session .ID ,
97+ "userId" , session .ClientReferenceID ,
98+ )
8399
84- return e .InternalServerError ("Handle checkout failed" , err )
100+ return e .InternalServerError ("Handle checkout failed" , nil )
85101 }
86102 case "invoice.paid" :
87103
88104 var inv stripe.Invoice
89105 err := json .Unmarshal (event .Data .Raw , & inv )
90106 if err != nil {
91- fmt .Println (err )
92- return e .BadRequestError ("Parsing invoice failed" , err )
107+
108+ h .service .app .Logger ().Warn ("Stripe webhook: JSON unmarshal failed" , "err" , err )
109+ return e .BadRequestError ("Parsing invoice failed" , nil )
93110 }
94111
95112 err = h .service .HandleInvoicePaid (inv )
96113 if err != nil {
97- fmt .Println (err )
98- return e .InternalServerError ("Handle checkout failed" , err )
114+ h .service .app .Logger ().Error ("Stripe webhook: invoice.paid processing failed" ,
115+ "error" , err ,
116+ )
117+ return e .InternalServerError ("Handle checkout failed" , nil )
99118 }
100119
101120 }
@@ -108,12 +127,12 @@ func (h *SubscriptionHandler) CheckSubscription(e *core.RequestEvent) error {
108127
109128 if errors .Is (err , sql .ErrNoRows ) {
110129
111- return e .BadRequestError ("No subscription" , nil )
130+ return e .NotFoundError ("No subscription" , nil )
112131 }
113132
114133 if err != nil {
115-
116- return e .InternalServerError ("Check subscription failed" , err )
134+ h . service . app . Logger (). Warn ( "Failed to check subscription" , "err" , err )
135+ return e .InternalServerError ("Check subscription failed" , nil )
117136 }
118137
119138 return e .JSON (http .StatusOK , subscription )
0 commit comments