Implemented gateway interactions
This commit is contained in:
1 parent
80602afe58
commit
5dbf767863
16 files changed
+811
-30
No files matched your search
@@ -0,0 +1,57 @@
|
||||
package wspay
|
||||
|
||||
import (
|
||||
"github.com/google/uuid"
|
||||
"time"
|
||||
)
|
||||
|
||||
type PaymentState string
|
||||
|
||||
const (
|
||||
// initial state
|
||||
StateInitialized PaymentState = "initialized"
|
||||
|
||||
// state on response
|
||||
StateAccepted PaymentState = "accepted"
|
||||
StateError PaymentState = "error"
|
||||
StateCanceledInitialization PaymentState = "canceled_initialization"
|
||||
|
||||
// state after confirmation
|
||||
StateCompleted PaymentState = "completed"
|
||||
StateVoided PaymentState = "voided"
|
||||
StateCanceled PaymentState = "canceled"
|
||||
)
|
||||
|
||||
type WsPayDb struct {
|
||||
Id uuid.UUID `db:"id"`
|
||||
ShopID string `db:"shop_id"`
|
||||
ShoppingCartID string `db:"shopping_card_id"`
|
||||
TotalAmount int64 `db:"total_amount"`
|
||||
Lang string `db:"lang"`
|
||||
|
||||
CustomerFirstName string `db:"customer_first_name"`
|
||||
CustomerLastName string `db:"customer_last_name"`
|
||||
CustomerAddress string `db:"customer_address"`
|
||||
CustomerCity string `db:"customer_city"`
|
||||
CustomerZIP string `db:"customer_zip"`
|
||||
CustomerCountry string `db:"customer_country"`
|
||||
CustomerPhone string `db:"customer_phone"`
|
||||
|
||||
PaymentPlan string `db:"payment_plan"`
|
||||
CreditCardName string `db:"credit_card_name"`
|
||||
CreditCardNumber string `db:"credit_card_number"`
|
||||
PaymentMethod string `db:"payment_method"`
|
||||
CurrencyCode int `db:"currency_code"`
|
||||
|
||||
DateTime time.Time `db:"date_time"`
|
||||
|
||||
ECI string `db:"eci"`
|
||||
STAN string `db:"stan"`
|
||||
|
||||
Success int `db:"success"`
|
||||
ApprovalCode string `db:"approval_code"`
|
||||
ErrorMessage string `db:"error_message"`
|
||||
ErrorCodes string `db:"error_codes"`
|
||||
|
||||
State PaymentState `db:"payment_state"`
|
||||
}
|
||||
@@ -0,0 +1,98 @@
|
||||
package wspay
|
||||
|
||||
import (
|
||||
"crypto/sha512"
|
||||
"encoding/hex"
|
||||
"errors"
|
||||
"github.com/google/uuid"
|
||||
"github.com/jmoiron/sqlx"
|
||||
"strconv"
|
||||
)
|
||||
|
||||
type Service struct {
|
||||
DB *sqlx.DB
|
||||
}
|
||||
|
||||
func (s *Service) CreateEntry(shopId string, totalAmount int64) (WsPayDb, error) {
|
||||
id := uuid.Must(uuid.NewRandom())
|
||||
entry := WsPayDb{
|
||||
Id: id,
|
||||
ShopID: shopId,
|
||||
ShoppingCartID: id.String(),
|
||||
TotalAmount: totalAmount,
|
||||
State: StateInitialized,
|
||||
}
|
||||
_, err := s.DB.Exec(`INSERT INTO "wspay" ("id", "shop_id", "shopping_card_id", "total_amount", "payment_state") VALUES ($1, $2, $3, $4, $5)`,
|
||||
&entry.Id, &entry.ShopID, &entry.ShoppingCartID, &entry.TotalAmount, &entry.State,
|
||||
)
|
||||
if err != nil {
|
||||
return WsPayDb{}, err
|
||||
}
|
||||
return s.FetchById(id)
|
||||
}
|
||||
|
||||
func (s *Service) FetchAll() ([]WsPayDb, error) {
|
||||
var entries []WsPayDb
|
||||
err := s.DB.Select(&entries, `SELECT * FROM "wspay"`)
|
||||
return entries, err
|
||||
}
|
||||
|
||||
func (s *Service) FetchById(id uuid.UUID) (WsPayDb, error) {
|
||||
entry := WsPayDb{}
|
||||
err := s.DB.Get(&entry, `SELECT * FROM "wspay" WHERE "id" = $1`, id)
|
||||
return entry, err
|
||||
}
|
||||
|
||||
func (s *Service) FetchByShoppingCartID(id string) (WsPayDb, error) {
|
||||
entry := WsPayDb{}
|
||||
err := s.DB.Get(&entry, `SELECT * FROM "wspay" WHERE "shopping_card_id" = $1`, id)
|
||||
return entry, err
|
||||
}
|
||||
|
||||
func (s *Service) Update(entry WsPayDb) error {
|
||||
_, err := s.DB.Exec(`UPDATE "wspay" set "lang" = $2, "customer_first_name" = $3, "customer_last_name" = $4, "customer_address" = $5, "customer_city" = $6, "customer_zip" = $7, "customer_country" = $8, "customer_phone" = $9, "payment_plan" = $10, "credit_card_name" = $11, "credit_card_number" = $12, "payment_method" = $13, "currency_code" = $14, "date_time" = $15, "eci" = $16, "stan" = $17, "success" = $18, "approval_code" = $19, "error_message" = $20, "error_codes" = $21, "payment_state" = $22 WHERE "id" = $1`,
|
||||
&entry.Id, &entry.Lang, &entry.CustomerFirstName, &entry.CustomerLastName, &entry.CustomerAddress, &entry.CustomerCity, &entry.CustomerZIP, &entry.CustomerCountry, &entry.CustomerPhone, &entry.PaymentPlan, &entry.CreditCardName, &entry.CreditCardNumber, &entry.PaymentMethod, &entry.CurrencyCode, &entry.DateTime, &entry.ECI, &entry.STAN, &entry.Success, &entry.ApprovalCode, &entry.ErrorMessage, &entry.ErrorCodes, &entry.State,
|
||||
)
|
||||
return err
|
||||
}
|
||||
|
||||
func CalculateFormSignature(shopId string, secret string, cartId string, amount int64) string {
|
||||
/**
|
||||
Represents a signature created from string formatted from following values in a following order using
|
||||
SHA512 algorithm:
|
||||
ShopID
|
||||
SecretKey
|
||||
ShoppingCartID
|
||||
SecretKey
|
||||
TotalAmount
|
||||
SecretKey
|
||||
*/
|
||||
signature := shopId + secret + cartId + secret + strconv.FormatInt(amount, 10) + secret
|
||||
hash := sha512.New()
|
||||
hash.Write([]byte(signature))
|
||||
return hex.EncodeToString(hash.Sum(nil))
|
||||
}
|
||||
|
||||
func CompareFormReturnSignature(signature string, shopId string, secret string, cartId string, success int, approvalCode string) error {
|
||||
/**
|
||||
Represents a signature created from string formatted from following values in a following order using
|
||||
SHA512 algorithm:
|
||||
ShopID
|
||||
SecretKey
|
||||
ShoppingCartID
|
||||
SecretKey
|
||||
Success
|
||||
SecretKey
|
||||
ApprovalCode
|
||||
SecretKey
|
||||
Merchant should validate this signature to make sure that the request is originating from WSPayForm.
|
||||
*/
|
||||
calculatedSignature := shopId + secret + cartId + secret + strconv.FormatInt(int64(success), 10) + secret + approvalCode + secret
|
||||
hash := sha512.New()
|
||||
hash.Write([]byte(calculatedSignature))
|
||||
if hex.EncodeToString(hash.Sum(nil)) == signature {
|
||||
return nil
|
||||
} else {
|
||||
return errors.New("signature mismatch")
|
||||
}
|
||||
}
|
||||
+160
@@ -0,0 +1,160 @@
|
||||
package wspay
|
||||
|
||||
const AuthorisationForm = "https://formtest.wspay.biz/authorization.aspx"
|
||||
|
||||
type WsPayForm struct {
|
||||
// required args
|
||||
ShopID string
|
||||
ShoppingCartID string
|
||||
Version string
|
||||
TotalAmount int64
|
||||
ReturnURL string
|
||||
ReturnErrorURL string
|
||||
CancelURL string
|
||||
Signature string
|
||||
|
||||
// optional args
|
||||
Lang string
|
||||
CustomerFirstName string
|
||||
CustomerLastName string
|
||||
CustomerAddress string
|
||||
CustomerCity string
|
||||
CustomerZIP string
|
||||
CustomerCountry string
|
||||
CustomerPhone string
|
||||
PaymentPlan string
|
||||
CreditCardName string
|
||||
PaymentMethod string
|
||||
IntAmount int64
|
||||
IntCurrency string
|
||||
ReturnMethod string
|
||||
CurrencyCode int
|
||||
}
|
||||
|
||||
type WsPayFormReturn struct {
|
||||
CustomerFirstName string `form:"CustomerFirstname"`
|
||||
CustomerSurname string `form:"CustomerSurname"`
|
||||
CustomerAddress string `form:"CustomerAddress"`
|
||||
CustomerCity string `form:"CustomerCity"`
|
||||
CustomerZIP string `form:"CustomerZIP"`
|
||||
CustomerCountry string `form:"CustomerCountry"`
|
||||
CustomerPhone string `form:"CustomerPhone"`
|
||||
CustomerEmail string `form:"CustomerEmail"`
|
||||
ShoppingCartID string `form:"ShoppingCartID"`
|
||||
Lang string `form:"Lang"`
|
||||
DateTime string `form:"DateTime"` //yyyymmddHHMMss
|
||||
Amount string `form:"Amount"` // eg. 123,43
|
||||
ECI string `form:"ECI"`
|
||||
STAN string `form:"STAN"`
|
||||
Partner string `form:"Partner"`
|
||||
WsPayOrderId string `form:"WsPayOrderId"`
|
||||
PaymentType string `form:"PaymentType"`
|
||||
CreditCardNumber string `form:"CreditCardNumber"` // masked number
|
||||
PaymentPlan string `form:"PaymentPlan"`
|
||||
ShopPostedPaymentPlan string `form:"ShopPostedPaymentPlan"`
|
||||
ShopPostedLang string `form:"ShopPostedLang"`
|
||||
ShopPostedCreditCardName string `form:"ShopPostedCreditCardName"`
|
||||
Success int `form:"Success"`
|
||||
ApprovalCode string `form:"ApprovalCode"`
|
||||
ErrorMessage string `form:"ErrorMessage"`
|
||||
ShopPostedPaymentMethod string `form:"ShopPostedPaymentMethod"`
|
||||
Signature string `form:"Signature"`
|
||||
}
|
||||
|
||||
type WsPayFormError struct {
|
||||
CustomerFirstName string
|
||||
CustomerSurname string
|
||||
CustomerAddress string
|
||||
CustomerCity string
|
||||
CustomerZIP string
|
||||
CustomerCountry string
|
||||
CustomerPhone string
|
||||
CustomerEmail string
|
||||
ShoppingCartID string
|
||||
Lang string
|
||||
DateTime string //yyyymmddHHMMss
|
||||
Amount string // eg. 123,43
|
||||
ECI string
|
||||
PaymentType string
|
||||
PaymentPlan string
|
||||
ShopPostedPaymentPlan string
|
||||
ShopPostedLang string
|
||||
ShopPostedCreditCardName string
|
||||
Success int
|
||||
ApprovalCode string
|
||||
ErrorMessage string
|
||||
ShopPostedPaymentMethod string
|
||||
ErrorCodes string
|
||||
Signature string
|
||||
}
|
||||
|
||||
type WsPayFormCancel struct {
|
||||
ResponseCode int
|
||||
ShoppingCartID string
|
||||
ApprovalCode string
|
||||
Success int
|
||||
Signature string
|
||||
}
|
||||
|
||||
type WsPayCompletionRequest struct {
|
||||
Version string
|
||||
WsPayOrderId string
|
||||
ShopId string
|
||||
ApprovalCode string
|
||||
STAN string
|
||||
Amount string
|
||||
Signature string
|
||||
}
|
||||
|
||||
type WsPayCompletionResponse struct {
|
||||
WsPayOrderId string
|
||||
ShopId string
|
||||
ApprovalCode string
|
||||
STAN string
|
||||
ErrorMessage string
|
||||
ActionSuccess string
|
||||
Signature string
|
||||
}
|
||||
|
||||
type WsPayStatusCheckRequest struct {
|
||||
Version string
|
||||
ShopId string
|
||||
ShoppingCartId string
|
||||
Signature string
|
||||
}
|
||||
|
||||
type WsPayStatusCheckResponse struct {
|
||||
WsPayOrderId string
|
||||
Signature string
|
||||
STAN string
|
||||
ApprovalCode string
|
||||
ShopID string
|
||||
ShoppingCartID string
|
||||
Amount string
|
||||
CurrencyCode string
|
||||
ActionSuccess string
|
||||
Success string // deprecated
|
||||
Authorized int
|
||||
Completed int
|
||||
Voided int
|
||||
Refunded int
|
||||
PaymentPlan string
|
||||
Partner string
|
||||
OnSite int
|
||||
CreditCardName string
|
||||
CreditCardNumber string
|
||||
ECI string
|
||||
CustomerFirstName string
|
||||
CustomerLastName string
|
||||
CustomerCity string
|
||||
CustomerZIP string
|
||||
CustomerCountry string
|
||||
CustomerPhone string
|
||||
CustomerEmail string
|
||||
TransactionDateTime string //yyyymmddHHMMss
|
||||
IsLessThan30DaysFromTransaction bool
|
||||
CanBeCompleted bool
|
||||
CanBeVoided bool
|
||||
CanBeRefunded bool
|
||||
ExpirationDate string
|
||||
}
|
||||
Reference in new issue
Block a user