Added payment update action
This commit is contained in:
1 parent
b6203d8a03
commit
fe6f3b6672
12 files changed
+420
-105
No files matched your search
+50
-17
@@ -18,7 +18,6 @@ import (
|
||||
)
|
||||
|
||||
type Service struct {
|
||||
Provider *database.PaymentEntryProvider
|
||||
ClientId string
|
||||
ClientSecret string
|
||||
SourceCode string
|
||||
@@ -30,24 +29,57 @@ type Service struct {
|
||||
expiration time.Time
|
||||
}
|
||||
|
||||
func (s *Service) CreatePaymentUrl(amount int64) (url string, err error) {
|
||||
entry, err := s.Provider.CreateEntry(database.PaymentEntry{
|
||||
Gateway: state.GatewayVivaWallet,
|
||||
State: state.StateInitialized,
|
||||
TotalAmount: amount,
|
||||
})
|
||||
func (s *Service) UpdatePayment(entry database.PaymentEntry) (updatedEntry database.PaymentEntry, err error) {
|
||||
token, err := s.oAuthToken()
|
||||
httpResponse, err := createRequest(
|
||||
"GET",
|
||||
"https://demo-api.vivapayments.com/checkout/v2/transactions/"+entry.TransactionId.String(),
|
||||
map[string]string{"authorization": "Bearer " + token, "content-type": "application/json"},
|
||||
[]byte{},
|
||||
)
|
||||
if err != nil {
|
||||
return "", err
|
||||
return database.PaymentEntry{}, err
|
||||
}
|
||||
entry, err = s.InitializePayment(entry)
|
||||
|
||||
var response TransactionStatusResponse
|
||||
err = readResponse(httpResponse, &response)
|
||||
if err != nil {
|
||||
return "", err
|
||||
return database.PaymentEntry{}, err
|
||||
}
|
||||
entry, err = s.Provider.UpdateEntry(entry)
|
||||
newState := determineStatus(response.StatusId)
|
||||
|
||||
if entry.State != newState && newState != "" {
|
||||
log.Printf("Updated state for %s: %s -> %s", entry.Id.String(), entry.State, newState)
|
||||
entry.State = newState
|
||||
}
|
||||
return entry, nil
|
||||
}
|
||||
|
||||
func determineStatus(id TransactionStatus) state.PaymentState {
|
||||
switch id {
|
||||
case PaymentPreauthorized:
|
||||
return state.StateAccepted
|
||||
case PaymentPending:
|
||||
return state.StatePending
|
||||
case PaymentSuccessful:
|
||||
return state.StateCompleted
|
||||
case PaymentUnsuccessful:
|
||||
return state.StateError
|
||||
case PaymentRefunded:
|
||||
return state.StateVoided
|
||||
case PaymentVoided:
|
||||
return state.StateVoided
|
||||
}
|
||||
log.Printf("Unknonw transactionStatus: %s", string(id))
|
||||
return ""
|
||||
}
|
||||
|
||||
func (s *Service) CreatePaymentUrl(entry database.PaymentEntry) (database.PaymentEntry, string, error) {
|
||||
entry, err := s.InitializePayment(entry)
|
||||
if err != nil {
|
||||
return "", err
|
||||
return entry, "", err
|
||||
}
|
||||
return "https://demo.vivapayments.com/web/checkout?ref=" + string(*entry.OrderId), nil
|
||||
return entry, "https://demo.vivapayments.com/web/checkout?ref=" + string(*entry.OrderId), nil
|
||||
}
|
||||
|
||||
func (s *Service) InitializePayment(entry database.PaymentEntry) (database.PaymentEntry, error) {
|
||||
@@ -80,6 +112,7 @@ func (s *Service) InitializePayment(entry database.PaymentEntry) (database.Payme
|
||||
if err != nil {
|
||||
return database.PaymentEntry{}, err
|
||||
}
|
||||
entry.State = state.StateInitialized
|
||||
entry.OrderId = &response.OrderId
|
||||
return entry, nil
|
||||
}
|
||||
@@ -208,7 +241,7 @@ func (s *Service) basicAuth() string {
|
||||
return base64.StdEncoding.EncodeToString([]byte(s.MerchantId + ":" + s.ApiKey))
|
||||
}
|
||||
|
||||
func (s *Service) HandleResponse(c *gin.Context, expectedState state.PaymentState) (string, error) {
|
||||
func (s *Service) HandleResponse(c *gin.Context, provider *database.PaymentEntryProvider, state state.PaymentState) (string, error) {
|
||||
transactionId := uuid.MustParse(c.Query("t"))
|
||||
orderId := database.OrderId(c.Query("s"))
|
||||
lang := c.Query("lang")
|
||||
@@ -216,19 +249,19 @@ func (s *Service) HandleResponse(c *gin.Context, expectedState state.PaymentStat
|
||||
eci := c.Query("eci")
|
||||
|
||||
log.Printf("Received error response for viva payment %s", orderId)
|
||||
entry, err := s.Provider.FetchByOrderId(orderId)
|
||||
entry, err := provider.FetchByOrderId(orderId)
|
||||
if err != nil {
|
||||
log.Printf("Couldn't find payment info for viva payment %s", orderId)
|
||||
return "", err
|
||||
}
|
||||
|
||||
entry.State = expectedState
|
||||
entry.State = state
|
||||
entry.ECI = &eci
|
||||
entry.Lang = &lang
|
||||
entry.EventId = &eventId
|
||||
entry.TransactionId = &transactionId
|
||||
|
||||
if _, err := s.Provider.UpdateEntry(entry); err != nil {
|
||||
if _, err := provider.UpdateEntry(entry); err != nil {
|
||||
return "", err
|
||||
}
|
||||
|
||||
|
||||
@@ -33,3 +33,23 @@ type TransactionResponse struct {
|
||||
EventId int64 `json:"EventId"`
|
||||
Success bool `json:"Success"`
|
||||
}
|
||||
|
||||
type TransactionStatus string
|
||||
|
||||
const (
|
||||
PaymentSuccessful TransactionStatus = "F"
|
||||
PaymentPending TransactionStatus = "A"
|
||||
PaymentPreauthorized TransactionStatus = "C"
|
||||
PaymentUnsuccessful TransactionStatus = "E"
|
||||
PaymentRefunded TransactionStatus = "R"
|
||||
PaymentVoided TransactionStatus = "X"
|
||||
)
|
||||
|
||||
type TransactionStatusResponse struct {
|
||||
Email string `json:"email"`
|
||||
Amount int `json:"amount"`
|
||||
OrderCode database.OrderId `json:"orderCode"`
|
||||
StatusId TransactionStatus `json:"statusId"`
|
||||
FullName string `json:"fullName"`
|
||||
CardNumber string `json:"cardNumber"`
|
||||
}
|
||||
Reference in new issue
Block a user