treasurer/payway/fk.go
2023-05-16 19:21:56 +03:00

192 lines
5.0 KiB
Go

package payway
import (
"context"
"crypto/hmac"
"crypto/sha256"
"encoding/json"
"fmt"
"sort"
"strings"
"time"
"bitbucket.org/skeris/treasurer/dal"
"github.com/fatih/structs"
"go.mongodb.org/mongo-driver/mongo"
)
//const AllowedIPs = "136.243.38.147 136.243.38.149 136.243.38.150 136.243.38.151 136.243.38.189"
type FreeKassa struct {
MongoID string
Name string
ShortName string
MerchantID string
WalletID string
Secret1 string // Request key
Secret2 string // Response key
Secret3 string // Wallet API Key
PayoutTypeList []dal.PayoutType
PaymentTypeList []dal.PayWayPayment
}
func NewFk(ctx context.Context, conn *dal.MongoConnection) (*FreeKassa, error) {
fmt.Println("NewFK0")
fk, err := conn.GetPayWayByName(ctx, "FreeKassa")
if err != nil {
if err == mongo.ErrNoDocuments {
fk = &dal.PayWay{
ID: "fk1",
Name: "FreeKassa",
ShortName: "fk",
MerchantID: "20397",
WalletID: "20397",
Secret1: "+%H$+Jb$gNw<PbE",
Secret2: "*}/^bkOCGq[C*Ss",
Secret3: "db9f770bf1b400445fb9c7d82e59ba81",
PayoutTypeList: []dal.PayoutType{},
CreatedAt: time.Time{},
UpdatedAt: time.Time{},
}
fk.ID, err = conn.InsertPayWay(ctx, *fk)
if err != nil {
return nil, err
}
} else {
return nil, err
}
}
paymentList, err := conn.GetPayWayPaymentByPayWay(ctx, fk.ShortName)
if err != nil {
return nil, err
}
return &FreeKassa{
MongoID: fk.ID,
Name: fk.Name,
ShortName: fk.ShortName,
MerchantID: fk.MerchantID,
WalletID: fk.WalletID,
Secret1: fk.Secret1,
Secret2: fk.Secret2,
Secret3: fk.Secret3,
PayoutTypeList: fk.PayoutTypeList,
PaymentTypeList: paymentList,
}, nil
}
func (fk *FreeKassa) GetMongoID() string {
return fk.MongoID
}
func (fk *FreeKassa) GetName() string {
return fk.Name
}
func (fk *FreeKassa) UpdateData(data *dal.PayWay) {
fk.MongoID = data.ID
fk.Name = data.MerchantID
fk.MerchantID = data.MerchantID
fk.Secret1 = data.Secret1
fk.Secret2 = data.Secret2
fk.Secret3 = data.Secret3
}
func (fk *FreeKassa) UpdatePayment(data []dal.PayWayPayment) {
fk.PaymentTypeList = data
}
func (fk *FreeKassa) UpdatePayout(data []dal.PayoutType) {
fk.PayoutTypeList = data
}
// GetPayoutTypeList - возвращает локальные способы вывода средств из кошелька
func (fk *FreeKassa) GetPayoutTypeList() []dal.PayoutType {
return fk.PayoutTypeList
}
// GetPayoutType - возвращает локальный указанный способ вывода средств, либо nil если не найдено
func (fk *FreeKassa) GetPayoutType(payoutType string) *dal.PayoutType {
for _, v := range fk.PayoutTypeList {
if v.ApiId == payoutType {
return &v
}
}
return nil
}
// GetPaymentTypeList - возвращает локальные способы пополнения
func (fk *FreeKassa) GetPaymentTypeList() []dal.PayWayPayment {
return fk.PaymentTypeList
}
// GetPaymentType - возвращает локальный указанный способ пополнения, либо nil если не найдено
func (fk *FreeKassa) GetPaymentType(paymentType string) *dal.PayWayPayment {
for _, v := range fk.PaymentTypeList {
if v.ApiId == paymentType {
return &v
}
}
return nil
}
// FindPayoutType - возвращает локальный указанный способ вывода средств учитывая amount.
// Возвращает nil если ничего не найдено
func (fk *FreeKassa) FindPayoutType(payoutType string, amount float64) *dal.PayoutType {
for _, v := range fk.PayoutTypeList {
if v.ApiId == payoutType && amount > v.Minimum && amount < v.Maximum {
return &v
}
}
return nil
}
// prepareData - сортирует структуру по имени поля, добавляет подпись и переводит в байты
func (fk *FreeKassa) prepareData(data interface{}) ([]byte, error) {
s := structs.New(data)
structMap := s.Map() // Преобразуем структуру в map
// Сортируем по ключу
keys := make([]string, 0, len(structMap))
for k := range structMap {
keys = append(keys, k)
}
sort.Strings(keys)
sorted := map[string]interface{}{}
var arr []string
for _, k := range keys {
if structMap[k] != "" {
sorted[s.Field(k).Tag("json")] = structMap[k]
arr = append(arr, fmt.Sprintf("%v", structMap[k]))
}
}
// Добавляем подпись
sorted["signature"] = fk.createSign(arr)
// Переводим в байты
return json.Marshal(sorted)
}
// createSign - создает hmac_sha256 подпись по Secret1
func (fk *FreeKassa) createSign(data []string) string {
str := strings.Join(data, "|")
sign := hmac.New(sha256.New, []byte("45fb9c7d82e59ba81"))
sign.Write([]byte(str))
h := sign.Sum(nil)
return fmt.Sprintf("%x", h)
}