Go Library (omise-go)
ไลบรารี omise-go มีอินเทอร์เฟซ Go ที่เป็นธรรมชาติสำหรับ Omise API พร้อมด้วยการสนับสนุน goroutines, channels, การดำเนินการที่รับรู้ context และแนวทางปฏิบัติที่ทันสมัยของ Go
การติดตั้ง
การใช้ go get
go get github.com/omise/omise-go/v2
การใช้ go.mod
require github.com/omise/omise-go/v2 v2.0.0
ข้อกำหนด
- Go 1.16 ขึ้นไป (รวมถึง Go 1.20+)
- Go modules สำหรับการจัดการ dependency
เริ่มต้นอย่างรวดเร็ว
การกำหนดค่าพื้นฐาน
package main
import (
"github.com/omise/omise-go/v2"
"github.com/omise/omise-go/v2/operations"
)
func main() {
client, err := omise.NewClient(
"pkey_test_123456789",
"skey_test_123456789",
)
if err != nil {
panic(err)
}
}
ด้วยตัวแปรสภาพแวดล้อม
import (
"os"
"github.com/omise/omise-go/v2"
)
func initClient() (*omise.Client, error) {
return omise.NewClient(
os.Getenv("OMISE_PUBLIC_KEY"),
os.Getenv("OMISE_SECRET_KEY"),
)
}
ด้วยการกำหนดค่า Struct
type Config struct {
OmisePublicKey string
OmiseSecretKey string
APIVersion string
}
func NewOmiseClient(config Config) (*omise.Client, error) {
client, err := omise.NewClient(
config.OmisePublicKey,
config.OmiseSecretKey,
)
if err != nil {
return nil, err
}
client.SetAPIVersion(config.APIVersion)
return client, nil
}
ตัวแปรสภาพแวดล้อม
# การพัฒนา/ทดสอบ
export OMISE_SECRET_KEY=skey_test_123456789
export OMISE_PUBLIC_KEY=pkey_test_123456789
# ผลิตภาพ
# export OMISE_SECRET_KEY=skey_live_123456789
# export OMISE_PUBLIC_KEY=pkey_live_123456789
การดำเนินการทั่วไป
การสร้างค่าธรรมเนียม
package main
import (
"context"
"fmt"
"github.com/omise/omise-go/v2"
"github.com/omise/omise-go/v2/operations"
)
func createCharge(client *omise.Client, token string, amount int64) (*omise.Charge, error) {
charge, createCharge := &omise.Charge{}, &operations.CreateCharge{
Amount: amount, // 1,000.00 THB = 100000 satang
Currency: "THB",
Card: token,
Description: "Order #1234",
Metadata: map[string]interface{}{
"order_id": "1234",
"customer_name": "John Doe",
},
}
if err := client.Do(charge, createCharge); err != nil {
return nil, fmt.Errorf("charge creation failed: %w", err)
}
if charge.Paid {
fmt.Printf("Charge successful: %s\n", charge.ID)
} else {
fmt.Printf("Charge failed: %s\n", charge.FailureMessage)
}
return charge, nil
}
ด้วย Context
import "context"
func createChargeWithContext(
ctx context.Context,
client *omise.Client,
token string,
amount int64,
) (*omise.Charge, error) {
charge, createCharge := &omise.Charge{}, &operations.CreateCharge{
Amount: amount,
Currency: "THB",
Card: token,
}
if err := client.DoWithContext(ctx, charge, createCharge); err != nil {
return nil, err
}
return charge, nil
}
// การใช้งานพร้อม timeout
func main() {
client, _ := omise.NewClient("pkey", "skey")
ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
defer cancel()
charge, err := createChargeWithContext(ctx, client, "tokn_test_123", 100000)
if err != nil {
log.Fatal(err)
}
}
ด้วย 3D Secure
type ChargeResult struct {
Charge *omise.Charge
RedirectURI string
}
func createSecureCharge(
client *omise.Client,
token string,
amount int64,
returnURI string,
) (*ChargeResult, error) {
charge, createCharge := &omise.Charge{}, &operations.CreateCharge{
Amount: amount,
Currency: "THB",
Card: token,
ReturnURI: returnURI,
}
if err := client.Do(charge, createCharge); err != nil {
return nil, err
}
if charge.Authorized {
if charge.AuthorizeURI != "" {
return &ChargeResult{RedirectURI: charge.AuthorizeURI}, nil
}
return &ChargeResult{Charge: charge}, nil
}
return nil, fmt.Errorf("charge failed: %s", charge.FailureMessage)
}
การดึงค่าธรรมเนียม
func getCharge(client *omise.Client, chargeID string) (*omise.Charge, error) {
charge, retrieve := &omise.Charge{}, &operations.RetrieveCharge{
ChargeID: chargeID,
}
if err := client.Do(charge, retrieve); err != nil {
return nil, err
}
fmt.Printf("Amount: %d\n", charge.Amount)
fmt.Printf("Currency: %s\n", charge.Currency)
fmt.Printf("Status: %s\n", charge.Status)
fmt.Printf("Paid: %t\n", charge.Paid)
return charge, nil
}
การแสดงรายชื่อค่าธรรมเนียม
func listCharges(client *omise.Client) ([]*omise.Charge, error) {
chargeList := &omise.ChargeList{}
listOp := &operations.ListCharges{
List: operations.List{
Limit: 20,
Offset: 0,
Order: operations.ReverseChronological,
},
}
if err := client.Do(chargeList, listOp); err != nil {
return nil, err
}
return chargeList.Data, nil
}
// พร้อมการกรองตามวันที่
func listRecentCharges(client *omise.Client) ([]*omise.Charge, error) {
weekAgo := time.Now().AddDate(0, 0, -7)
chargeList := &omise.ChargeList{}
listOp := &operations.ListCharges{
List: operations.List{
From: weekAgo,
To: time.Now(),
},
}
if err := client.Do(chargeList, listOp); err != nil {
return nil, err
}
// กรองค่าธรรมเนียมที่ชำระแล้ว
var paidCharges []*omise.Charge
for _, charge := range chargeList.Data {
if charge.Paid {
paidCharges = append(paidCharges, charge)
}
}
return paidCharges, nil
}
การสร้างลูกค้า
func createCustomer(
client *omise.Client,
email, description string,
) (*omise.Customer, error) {
customer, createOp := &omise.Customer{}, &operations.CreateCustomer{
Email: email,
Description: description,
Metadata: map[string]interface{}{
"user_id": "12345",
"account_type": "premium",
},
}
if err := client.Do(customer, createOp); err != nil {
return nil, err
}
fmt.Printf("Customer created: %s\n", customer.ID)
return customer, nil
}
การบันทึกบัตรเข้าไปในลูกค้า
func addCardToCustomer(
client *omise.Client,
customerID, token string,
) (*omise.Customer, error) {
customer, updateOp := &omise.Customer{}, &operations.UpdateCustomer{
CustomerID: customerID,
Card: token,
}
if err := client.Do(customer, updateOp); err != nil {
return nil, err
}
fmt.Printf("Card saved: %s\n", customer.DefaultCard)
return customer, nil
}
// สร้างลูกค้าด้วยบัตร
func createCustomerWithCard(
client *omise.Client,
email, token string,
) (*omise.Customer, error) {
customer, createOp := &omise.Customer{}, &operations.CreateCustomer{
Email: email,
Card: token,
}
if err := client.Do(customer, createOp); err != nil {
return nil, err
}
return customer, nil
}
การแสดงรายชื่อบัตรลูกค้า
func listCustomerCards(client *omise.Client, customerID string) ([]*omise.Card, error) {
customer, retrieve := &omise.Customer{}, &operations.RetrieveCustomer{
CustomerID: customerID,
}
if err := client.Do(customer, retrieve); err != nil {
return nil, err
}
for _, card := range customer.Cards.Data {
fmt.Printf("%s ending in %s\n", card.Brand, card.LastDigits)
fmt.Printf("Expires: %d/%d\n", card.ExpirationMonth, card.ExpirationYear)
}
return customer.Cards.Data, nil
}
การสร้างการคืนเงิน
// การคืนเงินเต็มจำนวน
func refundCharge(client *omise.Client, chargeID string) (*omise.Refund, error) {
refund, createOp := &omise.Refund{}, &operations.CreateRefund{
ChargeID: chargeID,
}
if err := client.Do(refund, createOp); err != nil {
return nil, err
}
return refund, nil
}
// การคืนเงินบางส่วน
func partialRefund(
client *omise.Client,
chargeID string,
amount int64,
) (*omise.Refund, error) {
refund, createOp := &omise.Refund{}, &operations.CreateRefund{
ChargeID: chargeID,
Amount: amount,
Metadata: map[string]interface{}{
"reason": "customer_request",
"ticket_id": "TICKET-123",
},
}
if err := client.Do(refund, createOp); err != nil {
return nil, err
}
fmt.Printf("Refund %s: %d %s\n", refund.ID, refund.Amount, refund.Currency)
return refund, nil
}
การสร้างการโอน
func createTransfer(
client *omise.Client,
amount int64,
recipientID string,
) (*omise.Transfer, error) {
transfer, createOp := &omise.Transfer{}, &operations.CreateTransfer{
Amount: amount,
Recipient: recipientID,
Metadata: map[string]interface{}{
"payout_id": "PAYOUT-456",
},
}
if err := client.Do(transfer, createOp); err != nil {
return nil, err
}
fmt.Printf("Transfer %s: %d\n", transfer.ID, transfer.Amount)
return transfer, nil
}
วิธีการชำระเงินแบบอื่น
การสร้างแหล่งที่มา
// QR PromptPay
func createPromptPaySource(client *omise.Client, amount int64) (*omise.Source, error) {
source, createOp := &omise.Source{}, &operations.CreateSource{
Type: "promptpay",
Amount: amount,
Currency: "THB",
}
if err := client.Do(source, createOp); err != nil {
return nil, err
}
fmt.Printf("QR Code URL: %s\n", source.ScannableCode.Image.DownloadURI)
// สร้างค่าธรรมเนียมด้วย source
charge, chargeOp := &omise.Charge{}, &operations.CreateCharge{
Amount: amount,
Currency: "THB",
Source: source.ID,
ReturnURI: "https://example.com/payment/callback",
}
if err := client.Do(charge, chargeOp); err != nil {
return nil, err
}
return source, nil
}
ธนาคารอินเทอร์เน็ต
func createInternetBankingCharge(
client *omise.Client,
amount int64,
bank string,
) (*omise.Charge, error) {
source, sourceOp := &omise.Source{}, &operations.CreateSource{
Type: "internet_banking_" + bank,
Amount: amount,
Currency: "THB",
}
if err := client.Do(source, sourceOp); err != nil {
return nil, err
}
charge, chargeOp := &omise.Charge{}, &operations.CreateCharge{
Amount: amount,
Currency: "THB",
Source: source.ID,
ReturnURI: "https://example.com/payment/callback",
}
if err := client.Do(charge, chargeOp); err != nil {
return nil, err
}
// เปลี่ยนเส้นทางไปยัง charge.AuthorizeURI
return charge, nil
}
การผ่อนชำระ
func createInstallmentCharge(
client *omise.Client,
amount int64,
bank string,
term int,
) (*omise.Charge, error) {
source, sourceOp := &omise.Source{}, &operations.CreateSource{
Type: "installment_" + bank,
Amount: amount,
Currency: "THB",
InstallmentTerm: term,
}
if err := client.Do(source, sourceOp); err != nil {
return nil, err
}
charge, chargeOp := &omise.Charge{}, &operations.CreateCharge{
Amount: amount,
Currency: "THB",
Source: source.ID,
ReturnURI: "https://example.com/payment/callback",
}
if err := client.Do(charge, chargeOp); err != nil {
return nil, err
}
return charge, nil
}
การจัดการข้อผิดพลาด
import (
"errors"
"github.com/omise/omise-go/v2"
)
func createChargeWithErrorHandling(
client *omise.Client,
token string,
amount int64,
) (*omise.Charge, error) {
charge, createCharge := &omise.Charge{}, &operations.CreateCharge{
Amount: amount,
Currency: "THB",
Card: token,
}
if err := client.Do(charge, createCharge); err != nil {
var omiseErr *omise.Error
if errors.As(err, &omiseErr) {
switch omiseErr.Code {
case "authentication_failure":
return nil, errors.New("invalid API key")
case "invalid_card":
return nil, errors.New("card was declined")
case "insufficient_fund":
return nil, errors.New("insufficient funds")
default:
return nil, fmt.Errorf("omise error: %s", omiseErr.Message)
}
}
return nil, fmt.Errorf("request failed: %w", err)
}
return charge, nil
}
ตัวจัดการข้อผิดพลาดแบบกำหนดเอง
type PaymentErrorHandler struct {
errorMessages map[string]string
}
func NewPaymentErrorHandler() *PaymentErrorHandler {
return &PaymentErrorHandler{
errorMessages: map[string]string{
"insufficient_fund": "Insufficient funds on card",
"stolen_or_lost_card": "Card reported as stolen or lost",
"invalid_security_code": "Invalid CVV code",
"payment_cancelled": "Payment was cancelled",
},
}
}
func (h *PaymentErrorHandler) GetErrorMessage(err error) string {
var omiseErr *omise.Error
if errors.As(err, &omiseErr) {
if msg, ok := h.errorMessages[omiseErr.Code]; ok {
return msg
}
return omiseErr.Message
}
return err.Error()
}