shop.tonybtw.com

shop.tonybtw.com

https://git.tonybtw.com/shop.tonybtw.com.git git://git.tonybtw.com/shop.tonybtw.com.git
2,049 bytes raw
1
package handlers
2
3
import (
4
	"encoding/json"
5
	"io"
6
	"net/http"
7
8
	"shop.tonybtw.com/internal/lib"
9
	"shop.tonybtw.com/internal/models"
10
)
11
12
type Webhook_Handler struct {
13
	ctx *lib.App_Context
14
}
15
16
func New_Webhook_Handler(ctx *lib.App_Context) *Webhook_Handler {
17
	return &Webhook_Handler{ctx: ctx}
18
}
19
20
func (h *Webhook_Handler) Handle_Stripe(w http.ResponseWriter, r *http.Request) {
21
	payload, err := io.ReadAll(r.Body)
22
	if err != nil {
23
		http.Error(w, "Invalid payload", http.StatusBadRequest)
24
		return
25
	}
26
27
	sig_header := r.Header.Get("Stripe-Signature")
28
29
	event, err := lib.Verify_Webhook(payload, sig_header)
30
	if err != nil {
31
		http.Error(w, "Invalid signature", http.StatusBadRequest)
32
		return
33
	}
34
35
	event_type, _ := event["type"].(string)
36
37
	if event_type == "checkout.session.completed" {
38
		data := event["data"].(map[string]interface{})
39
		session_obj := data["object"].(map[string]interface{})
40
41
		h.handle_checkout_complete(session_obj)
42
	}
43
44
	w.Header().Set("Content-Type", "application/json")
45
	json.NewEncoder(w).Encode(map[string]bool{"received": true})
46
}
47
48
func (h *Webhook_Handler) handle_checkout_complete(session map[string]interface{}) {
49
	shipping_details := map[string]interface{}{}
50
	if sd, ok := session["shipping_details"].(map[string]interface{}); ok {
51
		shipping_details = sd
52
	} else if s, ok := session["shipping"].(map[string]interface{}); ok {
53
		shipping_details = s
54
	}
55
56
	shipping_name := ""
57
	if name, ok := shipping_details["name"].(string); ok {
58
		shipping_name = name
59
	}
60
61
	shipping_address := ""
62
	if addr, ok := shipping_details["address"].(map[string]interface{}); ok {
63
		addr_bytes, _ := json.Marshal(addr)
64
		shipping_address = string(addr_bytes)
65
	}
66
67
	customer_details := session["customer_details"].(map[string]interface{})
68
	email := customer_details["email"].(string)
69
70
	order_id, err := models.Create_Order(
71
		h.ctx.DB,
72
		session["id"].(string),
73
		session["payment_intent"].(string),
74
		email,
75
		int(session["amount_total"].(float64)),
76
		"paid",
77
		shipping_name,
78
		shipping_address,
79
	)
80
81
	if err != nil {
82
		return
83
	}
84
85
	_ = order_id
86
}