Goライブラリ (omise-go)
omise-go ライブラリは、ゴルーチン、チャネル、コンテキスト対応操作、および最新のGoのベストプラクティスをサポートする、Omise APIへの慣用的な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モジュール
クイックスタート
基本的な構成
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"),
)
}
構成構造体を使用
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サタン
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("チャージ作成失敗: %w", err)
}
if charge.Paid {
fmt.Printf("チャージ成功: %s\n", charge.ID)
} else {
fmt.Printf("チャージ失敗: %s\n", charge.FailureMessage)
}
return charge, nil
}
コンテキストを使用
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
}
// タイムアウト付きの使用方法
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 セキュアで
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("チャージ失敗: %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("金額: %d\n", charge.Amount)
fmt.Printf("通貨: %s\n", charge.Currency)
fmt.Printf("ステータス: %s\n", charge.Status)
fmt.Printf("支払い済み: %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("顧客が作成されました: %s\n", customer.ID)
return customer, nil
}