MCPcopy Create free account
hub / github.com/0xUnixIO/pulse / handleCheckoutCompleted

Method handleCheckoutCompleted

internal/payment/webhook.go:67–135  ·  view source on GitHub ↗
(event stripe.Event)

Source from the content-addressed store, hash-verified

65}
66
67func (d *WebhookDeps) handleCheckoutCompleted(event stripe.Event) {
68 var sess stripe.CheckoutSession
69 if err := json.Unmarshal(event.Data.Raw, &sess); err != nil {
70 log.Printf("payment: unmarshal checkout session: %v", err)
71 return
72 }
73
74 order, err := d.OrderStore.GetOrderByStripeSession(sess.ID)
75 if err != nil {
76 // sessionID 可能因写入失败未关联,回退到 metadata 中的 order_id
77 if orderID, ok := sess.Metadata["order_id"]; ok && orderID != "" {
78 order, err = d.OrderStore.GetOrder(orderID)
79 }
80 if err != nil {
81 log.Printf("payment: get order by session %s: %v", sess.ID, err)
82 return
83 }
84 }
85
86 // 幂等性:已处理过则跳过
87 if order.Status == orders.StatusPaid {
88 return
89 }
90
91 now := time.Now().UTC()
92 order.Status = orders.StatusPaid
93 order.PaidAt = &now
94 order.StripeSessionID = sess.ID
95 if sess.Customer != nil {
96 order.StripeCustomerID = sess.Customer.ID
97 }
98 if sess.Subscription != nil {
99 order.StripeSubscriptionID = sess.Subscription.ID
100 }
101
102 plan, err := d.PlanStore.GetPlan(order.PlanID)
103 if err != nil {
104 log.Printf("payment: get plan %s: %v", order.PlanID, err)
105 return
106 }
107
108 if order.UserID == "" {
109 // 新用户:从 shop 购买
110 if err := d.provisionNewUser(&order, plan, now); err != nil {
111 log.Printf("payment: provision user for order %s: %v", order.ID, err)
112 // 不更新订单状态,保留 pending 以便 webhook 重试可重新处理
113 return
114 }
115 } else {
116 // 已有用户续费
117 if err := d.renewExistingUser(order, plan, now); err != nil {
118 log.Printf("payment: renew user for order %s: %v", order.ID, err)
119 // 不标记为 paid,保留 pending 以便 Stripe 重试时重新处理
120 return
121 }
122 }
123
124 if _, err := d.OrderStore.UpsertOrder(order); err != nil {

Callers 1

HandleWebhookMethod · 0.95

Calls 7

provisionNewUserMethod · 0.95
renewExistingUserMethod · 0.95
GetOrderMethod · 0.65
GetPlanMethod · 0.65
UpsertOrderMethod · 0.65
IncrementStockSoldMethod · 0.65

Tested by

no test coverage detected