143 lines
3.6 KiB
Go
143 lines
3.6 KiB
Go
package main
|
|
|
|
import (
|
|
"context"
|
|
"encoding/json"
|
|
"fmt"
|
|
"io"
|
|
"log"
|
|
"net/http"
|
|
|
|
"github.com/google/uuid"
|
|
)
|
|
|
|
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(ctx context.Context, orderId string) (*CheckoutOrder, error) {
|
|
req, err := http.NewRequest("GET", k.Url+"/checkout/v3/orders/"+orderId, nil)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
spanCtx, span := tracer.Start(ctx, "Get klarna order")
|
|
defer span.End()
|
|
req = req.WithContext(spanCtx)
|
|
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()
|
|
return k.getOrderResponse(res)
|
|
}
|
|
|
|
func (k *KlarnaClient) getOrderResponse(res *http.Response) (*CheckoutOrder, error) {
|
|
var err error
|
|
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
|
|
}
|
|
body, err := io.ReadAll(res.Body)
|
|
if err == nil {
|
|
log.Println(string(body))
|
|
}
|
|
|
|
return nil, fmt.Errorf("%s", res.Status)
|
|
}
|
|
|
|
func (k *KlarnaClient) CreateOrder(ctx context.Context, 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
|
|
}
|
|
spanCtx, span := tracer.Start(ctx, "Create klarna order")
|
|
defer span.End()
|
|
req = req.WithContext(spanCtx)
|
|
req.Header.Add("Content-Type", "application/json")
|
|
req.SetBasicAuth(k.UserName, k.Password)
|
|
|
|
res, err := k.client.Do(req)
|
|
if nil != err {
|
|
return nil, err
|
|
}
|
|
defer res.Body.Close()
|
|
return k.getOrderResponse(res)
|
|
}
|
|
|
|
func (k *KlarnaClient) UpdateOrder(ctx context.Context, 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
|
|
}
|
|
|
|
spanCtx, span := tracer.Start(ctx, "Update klarna order")
|
|
defer span.End()
|
|
req = req.WithContext(spanCtx)
|
|
req.Header.Add("Content-Type", "application/json")
|
|
req.SetBasicAuth(k.UserName, k.Password)
|
|
|
|
res, err := k.client.Do(req)
|
|
if nil != err {
|
|
return nil, err
|
|
}
|
|
defer res.Body.Close()
|
|
return k.getOrderResponse(res)
|
|
}
|
|
|
|
func (k *KlarnaClient) AbortOrder(ctx context.Context, 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
|
|
}
|
|
spanCtx, span := tracer.Start(ctx, "Abort klarna order")
|
|
defer span.End()
|
|
req = req.WithContext(spanCtx)
|
|
req.SetBasicAuth(k.UserName, k.Password)
|
|
|
|
_, err = k.client.Do(req)
|
|
return err
|
|
}
|
|
|
|
// ordermanagement/v1/orders/{order_id}/acknowledge
|
|
func (k *KlarnaClient) AcknowledgeOrder(ctx context.Context, orderId string) error {
|
|
req, err := http.NewRequest("POST", fmt.Sprintf("%s/ordermanagement/v1/orders/%s/acknowledge", k.Url, orderId), nil)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
spanCtx, span := tracer.Start(ctx, "Acknowledge klarna order")
|
|
defer span.End()
|
|
req = req.WithContext(spanCtx)
|
|
id := uuid.New()
|
|
|
|
req.SetBasicAuth(k.UserName, k.Password)
|
|
req.Header.Add("Klarna-Idempotency-Key", id.String())
|
|
|
|
_, err = k.client.Do(req)
|
|
return err
|
|
}
|