package main import ( "encoding/json" "fmt" "io" "net/http" ) type KlarnaClient struct { Url string UserName string Password string client *http.Client } func NewKlarnaClient(url, userName, password string) *KlarnaClient { return &KlarnaClient{ Url: url, UserName: userName, Password: password, client: &http.Client{}, } } const ( KlarnaPlaygroundUrl = "https://api.playground.klarna.com" ) func (k *KlarnaClient) GetOrder(orderId string) (*CheckoutOrder, error) { req, err := http.NewRequest("GET", k.Url+"/checkout/v3/orders/"+orderId, nil) if err != nil { return nil, err } req.Header.Add("Content-Type", "application/json") req.SetBasicAuth(k.UserName, k.Password) res, err := k.client.Do(req) if err != nil { return nil, err } defer res.Body.Close() var klarnaOrderResponse CheckoutOrder if res.StatusCode >= 200 && res.StatusCode <= 299 { err = json.NewDecoder(res.Body).Decode(&klarnaOrderResponse) if err != nil { return nil, err } return &klarnaOrderResponse, nil } return nil, fmt.Errorf(res.Status) } func (k *KlarnaClient) CreateOrder(reader io.Reader) (*CheckoutOrder, error) { //bytes.NewReader(reply.Payload) req, err := http.NewRequest("POST", k.Url+"/checkout/v3/orders", reader) if err != nil { return nil, err } req.Header.Add("Content-Type", "application/json") req.SetBasicAuth(k.UserName, k.Password) res, err := http.DefaultClient.Do(req) if nil != err { return nil, err } defer res.Body.Close() if res.StatusCode >= 200 && res.StatusCode <= 299 { var klarnaOrderResponse CheckoutOrder err = json.NewDecoder(res.Body).Decode(&klarnaOrderResponse) return &klarnaOrderResponse, err } return nil, fmt.Errorf(res.Status) } func (k *KlarnaClient) UpdateOrder(orderId string, reader io.Reader) (*CheckoutOrder, error) { //bytes.NewReader(reply.Payload) req, err := http.NewRequest("POST", fmt.Sprintf("%s/checkout/v3/orders/%s", k.Url, orderId), reader) if err != nil { return nil, err } req.Header.Add("Content-Type", "application/json") req.SetBasicAuth(k.UserName, k.Password) res, err := http.DefaultClient.Do(req) if nil != err { return nil, err } defer res.Body.Close() if res.StatusCode >= 200 && res.StatusCode <= 299 { var klarnaOrderResponse CheckoutOrder err = json.NewDecoder(res.Body).Decode(&klarnaOrderResponse) return &klarnaOrderResponse, err } return nil, fmt.Errorf(res.Status) } func (k *KlarnaClient) AbortOrder(orderId string) error { req, err := http.NewRequest("POST", fmt.Sprintf("%s/checkout/v3/orders/%s/abort", k.Url, orderId), nil) if err != nil { return err } req.SetBasicAuth(k.UserName, k.Password) _, err = http.DefaultClient.Do(req) if err != nil { return err } return nil }