Hướng dẫn cách tích hợp Paypal vào trang thanh toán với Golang
Có thể nói Golang là một mã nguồn tuyệt vời trong việc phát triển các chức năng cho Web Application, xây dựng các Backend với tốc độ nhanh, dễ viết để tách bạch với nền tảng Frontend hiện đại như Flutter, React, Vue...Một trong những lợi thế tuyệt vời của Golang đó là thư viện go/html được tích hợp sẵn giúp việc render ra các web tĩnh trở nên dễ dàng hơn bao giờ hết.
Tận dụng thế mạnh đó, Nam Digital đã áp dụng để xây dựng rất nhiều dự án với thời gian phát triển ngắn nhưng lại mang lại tốc độ tuyệt vời cũng như trải nghiệm đơn giản. Trong đó Nam phát triển 3 website
- Nam Digital
- Shopemlon
- Vật liệu nhà tốt
Tạm thời thì Nam vẫn đang rất ấn tượng với tốc độ xử lý Backend cũng như Render ra các page rất nhanh của Go, điều tuyệt vời cũng nằm ở tính ổn định của các sản phẩm được khởi tạo, chạy hàng năm trời cũng rất ổn áp bởi các hệ thống được tách bạch hoàn toàn bằng Docker Container.
Quên mất, hãy bắt đầu chủ đề chính thôi, cùng tới với cách tích hợp Paypal vào trang thanh toán với Golang
Hàm checkout của Web tĩnh sẽ có dạng nào?
Hàm Checkout của Web tĩnh sẽ thường là action của Form trước đó, tức là nó sẽ parse nội dung của form như:
- Họ tên người đặt hàng
- Số tiền
- Tổng cộng (total)
- Địa chỉ thanh toán...
Bỏ qua các yếu tố râu ria thì cứ xem như chúng ta đã get được total order rồi, giờ hãy đem nó đi xử lý về mặt Logic thôi
Sử dụng thư viện Plutov/paypal
Nam đánh giá đây là một thư viện rất tốt trong việc điều hướng tới các Endpoint của Paypal nhằm gửi đơn hàng, bạn cũng cần có tài khoản Sandbox của Paypal để thực hiện Test nhé
Dưới đây là ví dụ của việc gửi đơn hàng cho Paypal theo Total đã format từ tiền Việt sang
// Hàm xử lý thanh toán PayPal
func HandlePaypalPayment(w http.ResponseWriter, r *http.Request) {
// Cấu hình PayPal
var Client *paypal.Client
// Sử dụng môi trường sandbox cho việc phát triển
Client, err := paypal.NewClient("Client ID", "Client Secret", paypal.APIBaseSandBox)
if err != nil {
log.Fatal(err)
}
Client.SetLog(os.Stdout) // Đặt log để theo dõi các request và response
// // Get the cart data from the session
session, _ := store.Get(r, "mysession")
strcart := session.Values["cart"].(string)
var cart []models.Item
json.Unmarshal([]byte(strcart), &cart)
// Retrieve the new total from the session
var total float64
if newTotal, ok := session.Values["newTotal"].(float64); ok {
total = newTotal
} else {
total = Product_total(cart)
}
total_usd := ConvertToUSD(total)
// Tạo context
ctx := context.Background()
// Tạo payment request đến PayPal
payment := paypal.PurchaseUnitRequest{
ReferenceID: "ref-id",
Amount: &paypal.PurchaseUnitAmount{
Currency: "USD",
Value: fmt.Sprintf("%.2f", total_usd),
},
}
// Tạo payer
payer := &paypal.CreateOrderPayer{
Name: &paypal.CreateOrderPayerName{
GivenName: "PayPal",
},
}
// Tạo appContext
appContext := &paypal.ApplicationContext{
BrandName: "YourBrandName",
}
// Tạo đơn hàng PayPal
resp, err := Client.CreateOrder(ctx, paypal.OrderIntentCapture, []paypal.PurchaseUnitRequest{payment}, payer, appContext)
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
// Chuyển hướng người dùng đến trang thanh toán của PayPal
for _, link := range resp.Links {
if link.Rel == "approve" {
http.Redirect(w, r, link.Href, http.StatusFound)
return
}
}
http.Error(w, "Không tìm thấy URL thanh toán từ PayPal", http.StatusInternalServerError)
}
Hết rồi, hy vọng Code này sẽ hữu ích cho bạn, bạn có thể đặt điều kiện nếu phương thức thanh toán (select name="payment-method" là paypal thì sẽ xử lý logic phía trên), chúc bạn thành công