From 1e90ff21f3c99bfb7c5b097e4eb61cb7d3248cae Mon Sep 17 00:00:00 2001 From: Derya Cakmak <97deryacakmak@gmail.com> Date: Tue, 2 Jul 2024 01:45:52 +0300 Subject: [PATCH] Add BKM Express Integration --- adapter/bkm_express.go | 59 ++++++++++++++++++++++++++++++++++++ adapter/craftgate.go | 1 + adapter/model.go | 25 ++++++++++++++++ tests/bkm_express_test.go | 63 +++++++++++++++++++++++++++++++++++++++ 4 files changed, 148 insertions(+) create mode 100644 adapter/bkm_express.go create mode 100644 tests/bkm_express_test.go diff --git a/adapter/bkm_express.go b/adapter/bkm_express.go new file mode 100644 index 0000000..cfc48b7 --- /dev/null +++ b/adapter/bkm_express.go @@ -0,0 +1,59 @@ +package adapter + +import ( + "context" + "fmt" + "net/http" +) + +type BkmExpress struct { + Client *Client +} + +func (api *BkmExpress) Init(ctx context.Context, request InitBkmExpressRequest) (*InitBkmExpressResponse, error) { + newRequest, err := api.Client.NewRequest(ctx, http.MethodPost, "/payment/v1/bkm-express/init", request) + if err != nil { + return nil, err + } + + response := &Response[InitBkmExpressResponse]{} + err = api.Client.Do(ctx, newRequest, response) + if err != nil { + return nil, err + } + + return response.Data, nil +} + +func (api *BkmExpress) Complete(ctx context.Context, request CompleteBkmExpressRequest) (*PaymentResponse, error) { + newRequest, err := api.Client.NewRequest(ctx, http.MethodPost, "/payment/v1/bkm-express/complete", request) + if err != nil { + return nil, err + } + + response := &Response[PaymentResponse]{} + err = api.Client.Do(ctx, newRequest, response) + if err != nil { + return nil, err + } + + return response.Data, nil +} + +func (api *BkmExpress) RetrievePayment(ctx context.Context, ticketId string) error { + newRequest, err := api.Client.NewRequest(ctx, http.MethodGet, fmt.Sprintf("/payment/v1/bkm-express/payments/%s", ticketId), nil) + if err != nil { + return fmt.Errorf("failed to create new request: %w", err) + } + response := &Void{} + + err = api.Client.Do(ctx, newRequest, response) + if err != nil { + return fmt.Errorf("request failed: %w", err) + } + if response == nil { + return fmt.Errorf("empty response") + } + + return nil +} diff --git a/adapter/craftgate.go b/adapter/craftgate.go index b181a4a..6942bd1 100644 --- a/adapter/craftgate.go +++ b/adapter/craftgate.go @@ -109,6 +109,7 @@ type Client struct { BankAccountTracking *BankAccountTracking Merchant *Merchant Juzdan *Juzdan + BkmExpress *BkmExpress } func New(apiKey, apiSecret, baseURL string, opts ...ClientOption) (*Client, error) { diff --git a/adapter/model.go b/adapter/model.go index 796020b..b08c834 100644 --- a/adapter/model.go +++ b/adapter/model.go @@ -1284,6 +1284,12 @@ type CheckMasterpassUserResponse struct { AccountStatus *string `json:"accountStatus"` } +type InitBkmExpressResponse struct { + Id *string `json:"id"` + Path *string `json:"path"` + Token *string `json:"token"` +} + type InstallmentPrice struct { InstallmentPrice *float64 `json:"installmentPrice"` BankCommissionRate *float64 `json:"bankCommissionRate"` @@ -1950,6 +1956,19 @@ type MasterpassCreatePayment struct { AdditionalParams map[string]interface{} `json:"additionalParams,omitempty"` } +type InitBkmExpressRequest struct { + Price float64 `json:"price,omitempty"` + PaidPrice float64 `json:"paidPrice,omitempty"` + Currency Currency `json:"currency,omitempty"` + PaymentGroup PaymentGroup `json:"paymentGroup,omitempty"` + ConversationId string `json:"conversationId,omitempty"` + PaymentPhase PaymentPhase `json:"paymentPhase,omitempty"` + BuyerMemberId int64 `json:"buyerMemberId,omitempty"` + BankOrderId string `json:"bankOrderId,omitempty"` + Items []PaymentItem `json:"items"` + EnabledInstallment bool `json:"enabledInstallments"` +} + type CreateMerchantRequest struct { Name string `json:"name"` LegalCompanyTitle string `json:"legalCompanyTitle"` @@ -1962,6 +1981,12 @@ type CreateMerchantRequest struct { ContactPhoneNumber string `json:"contactPhoneNumber"` } +type CompleteBkmExpressRequest struct { + Status bool `json:"status"` + Message string `json:"message"` + TicketId string `json:"ticketId"` +} + type MerchantApiCredential struct { Name string `json:"name"` ApiKey string `json:"apiKey"` diff --git a/tests/bkm_express_test.go b/tests/bkm_express_test.go new file mode 100644 index 0000000..977bd14 --- /dev/null +++ b/tests/bkm_express_test.go @@ -0,0 +1,63 @@ +package tests + +import ( + "context" + "github.com/craftgate/craftgate-go-client/adapter" + craftgate "github.com/craftgate/craftgate-go-client/adapter" + "github.com/davecgh/go-spew/spew" + "github.com/stretchr/testify/require" + "testing" +) + +var bkmExpressClient, _ = craftgate.New("api-key", "secret-key", "https://sandbox-api.craftgate.io") + +func TestBkm_Express_Init(t *testing.T) { + request := adapter.InitBkmExpressRequest{ + Price: 1.25, + PaidPrice: 1.25, + Currency: craftgate.Currency_TRY, + PaymentGroup: craftgate.PaymentGroup_LISTING_OR_SUBSCRIPTION, + ConversationId: "foo-bar", + Items: []craftgate.PaymentItem{ + { + Name: "Item 1", + Price: 1, + ExternalId: "1", + }, + { + Name: "Item 2", + Price: 0.25, + ExternalId: "2", + }, + }, + } + res, err := bkmExpressClient.BkmExpress.Init(context.Background(), request) + _, _ = spew.Printf("%#v\n", res) + + if err != nil { + t.Errorf("Error %s", err) + } +} + +func TestBkm_Express_Complete(t *testing.T) { + request := adapter.CompleteBkmExpressRequest{ + Status: true, + Message: "İşlem Başarılı", + TicketId: "404308dcfdc163-0545-46d7-8f86-5a11718e56ec", + } + + res, err := bkmExpressClient.BkmExpress.Complete(context.Background(), request) + + require.NotNil(t, res.AuthCode) + require.NotNil(t, res.HostReference) + if err != nil { + t.Errorf("Error %s", err) + } +} + +func TestBkm_Express_RetrievePayment(t *testing.T) { + err := bkmExpressClient.BkmExpress.RetrievePayment(context.Background(), "dcfdc163-0545-46d7-8f86-5a11718e56ec") + if err != nil { + t.Fatalf("RetrievePayment failed: %v", err) + } +}