package handlers import ( "encoding/json" "io" "net/http" "shop.tonybtw.com/internal/lib" "shop.tonybtw.com/internal/models" ) type Webhook_Handler struct { ctx *lib.App_Context } func New_Webhook_Handler(ctx *lib.App_Context) *Webhook_Handler { return &Webhook_Handler{ctx: ctx} } func (h *Webhook_Handler) Handle_Stripe(w http.ResponseWriter, r *http.Request) { payload, err := io.ReadAll(r.Body) if err != nil { http.Error(w, "Invalid payload", http.StatusBadRequest) return } sig_header := r.Header.Get("Stripe-Signature") event, err := lib.Verify_Webhook(payload, sig_header) if err != nil { http.Error(w, "Invalid signature", http.StatusBadRequest) return } event_type, _ := event["type"].(string) if event_type == "checkout.session.completed" { data := event["data"].(map[string]interface{}) session_obj := data["object"].(map[string]interface{}) h.handle_checkout_complete(session_obj) } w.Header().Set("Content-Type", "application/json") json.NewEncoder(w).Encode(map[string]bool{"received": true}) } func (h *Webhook_Handler) handle_checkout_complete(session map[string]interface{}) { shipping_details := map[string]interface{}{} if sd, ok := session["shipping_details"].(map[string]interface{}); ok { shipping_details = sd } else if s, ok := session["shipping"].(map[string]interface{}); ok { shipping_details = s } shipping_name := "" if name, ok := shipping_details["name"].(string); ok { shipping_name = name } shipping_address := "" if addr, ok := shipping_details["address"].(map[string]interface{}); ok { addr_bytes, _ := json.Marshal(addr) shipping_address = string(addr_bytes) } customer_details := session["customer_details"].(map[string]interface{}) email := customer_details["email"].(string) order_id, err := models.Create_Order( h.ctx.DB, session["id"].(string), session["payment_intent"].(string), email, int(session["amount_total"].(float64)), "paid", shipping_name, shipping_address, ) if err != nil { return } _ = order_id }