192 lines
5.0 KiB
Go
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)
|
||
|
}
|