335 lines
9.5 KiB
Go
335 lines
9.5 KiB
Go
package udunservice
|
|
|
|
import (
|
|
"encoding/json"
|
|
log "github.com/go-admin-team/go-admin-core/logger"
|
|
"github.com/shopspring/decimal"
|
|
"go-admin/app/admin/models"
|
|
"go-admin/pkg/timehelper"
|
|
"go-admin/pkg/udunhelper"
|
|
"go-admin/pkg/utility"
|
|
"go.uber.org/zap"
|
|
"gorm.io/gorm"
|
|
"math"
|
|
"strconv"
|
|
"strings"
|
|
)
|
|
|
|
// TradeCallback 充值,提币回调
|
|
func TradeCallback(orm *gorm.DB, timestamp, nonce, body, sign string) string {
|
|
|
|
log.Error("充值,提币回调返回值", zap.String("body", body), zap.String("timestamp", timestamp), zap.String("nonce", nonce),
|
|
zap.String("sign", sign))
|
|
|
|
//验证签名
|
|
sign1 := udunhelper.CheckCallBackSign(timestamp, nonce, body)
|
|
//udunhelper.CheckCallBackSign()
|
|
if sign != sign1 {
|
|
log.Error("充值,提币回调返回值 签名不正确", zap.String("body", body), zap.String("timestamp", timestamp), zap.String("nonce", nonce),
|
|
zap.String("sign", sign))
|
|
return "error"
|
|
}
|
|
|
|
// 反序列化
|
|
var trade udunhelper.CallBackRes
|
|
if err := json.Unmarshal([]byte(body), &trade); err != nil {
|
|
return "error"
|
|
}
|
|
// 充值
|
|
if trade.TradeType == 1 {
|
|
//
|
|
return handleRecharge(orm, trade, timestamp)
|
|
} else if trade.TradeType == 2 {
|
|
//提币
|
|
//return handleWithdraw(trade)
|
|
}
|
|
return "success"
|
|
}
|
|
|
|
// 充值回调处理
|
|
func handleRecharge(orm *gorm.DB, trade udunhelper.CallBackRes, timestamp string) string {
|
|
// 检测是否已经写入,根据交易Hash判断是否已经存在充值记录
|
|
var charge models.LineRecharge
|
|
err := orm.Model(&models.LineRecharge{}).Where("txid = ?", trade.TxId).Find(&charge).Error
|
|
if err != nil {
|
|
log.Error("GetVtsRechargeByOrderNo", zap.Error(err))
|
|
return "error"
|
|
}
|
|
|
|
if charge.Status == "2" {
|
|
// 已经成功,则不继续写入
|
|
log.Error("已经成功,则不继续写入", zap.String("txId", trade.TxId))
|
|
return "error"
|
|
}
|
|
|
|
// 充币通知
|
|
amount := getBalance(trade.Amount, trade.Decimals)
|
|
fee := getBalance(trade.Fee, trade.Decimals)
|
|
// 查询钱包信息
|
|
var wallet models.LineWallet
|
|
err = orm.Model(&models.LineWallet{}).Where("address = ?", trade.Address).Find(&wallet).Error
|
|
//wallet, err := walletdb.GetVtsWalletByAddress(trade.Address)
|
|
if err != nil {
|
|
log.Error("GetVtsWalletByAddress", zap.Error(err), zap.String("address", trade.Address))
|
|
return "error"
|
|
}
|
|
// 加载币种信息
|
|
var udCoin models.LineUduncoin
|
|
err = orm.Model(&models.LineUduncoin{}).Where("main_coin_type = ? AND coin_type = ?", trade.MainCoinType, trade.CoinType).Find(&udCoin).Error
|
|
//udCoin, err := uduncoindb.GetVtsUduncoinItemByCoinType(trade.MainCoinType, trade.CoinType)
|
|
if err != nil {
|
|
log.Error("GetVtsUduncoinItemByCoinType", zap.Error(err), zap.String("MainCoinType", trade.MainCoinType),
|
|
zap.String("CoinType", trade.CoinType))
|
|
return "error"
|
|
}
|
|
height := utility.StringAsInteger(trade.BlockHigh)
|
|
//currTime := time.Now()
|
|
status := 1
|
|
switch trade.Status {
|
|
case 0:
|
|
status = 1
|
|
case 1:
|
|
status = 1
|
|
case 2:
|
|
status = 3 // 失败
|
|
case 3:
|
|
status = 2 // 成功
|
|
case 4:
|
|
status = 3 // 失败
|
|
}
|
|
coinCode := udCoin.Symbol
|
|
if strings.EqualFold(coinCode, "TRCUSDT") {
|
|
coinCode = "USDT"
|
|
}
|
|
//coin := coinservice.CoinCache.GetByCode(coinCode)
|
|
//if coin.Id == 0 {
|
|
// loghelper.Error("TradeCallback 充值,提币回调 未找到系统对应的币种Id", zap.String("udCoin.Symbol", udCoin.Symbol))
|
|
// return "error"
|
|
//}
|
|
t1 := timehelper.IntToTime(utility.StringAsInt64(timestamp))
|
|
//timehelper.IntToTime()
|
|
// 充值
|
|
recharge := models.LineRecharge{
|
|
UserId: wallet.UserId,
|
|
Confirms: strconv.Itoa(0),
|
|
TranType: strconv.Itoa(1),
|
|
BlockIndex: strconv.Itoa(height),
|
|
Amount: utility.FloatToStr(amount),
|
|
Fee: utility.FloatToStr(fee),
|
|
Account: "",
|
|
Address: trade.Address,
|
|
Txid: trade.TxId,
|
|
BlockTime: t1,
|
|
TimeReceived: t1,
|
|
MainCoin: udCoin.MainSymbol,
|
|
OrderNo: trade.TradeId, // 流水号
|
|
Status: strconv.Itoa(status),
|
|
State: strconv.Itoa(trade.Status),
|
|
AddressFrom: "",
|
|
}
|
|
// 加载账户信息
|
|
//beforeAmount := float64(0)
|
|
//afterAmount := float64(0)
|
|
if trade.Status == 3 {
|
|
tx := orm.Begin()
|
|
err := tx.Model(&models.LineRecharge{}).Create(&recharge).Error
|
|
if err != nil {
|
|
tx.Rollback()
|
|
log.Error("create LineRecharge err", zap.Error(err), zap.String("wallet.UserId", strconv.FormatInt(wallet.UserId, 10)),
|
|
zap.String("money", utility.FloatToStr(amount)))
|
|
}
|
|
err = tx.Model(&models.LineUser{}).Where("id = ?", wallet.UserId).Update("money", gorm.Expr("money + ?", amount)).Error
|
|
if err != nil {
|
|
tx.Rollback()
|
|
log.Error("update user money err", zap.Error(err), zap.String("wallet.UserId", strconv.FormatInt(wallet.UserId, 10)),
|
|
zap.String("money", utility.FloatToStr(amount)))
|
|
return "error"
|
|
}
|
|
tx.Commit()
|
|
}
|
|
|
|
//hold := holddb.GetUserHold(wallet.UserId, recharge.CoinId)
|
|
//if hold.Id == 0 {
|
|
// hold = dbmodel.VtsHold{
|
|
// Id: 0,
|
|
// CoinId: recharge.CoinId,
|
|
// UserId: wallet.UserId,
|
|
// Num: 0,
|
|
// UseNum: amount,
|
|
// FreezeNum: 0,
|
|
// CreateTime: currTime,
|
|
// UpdateTime: currTime,
|
|
// }
|
|
// beforeAmount = 0
|
|
// afterAmount = amount
|
|
//} else {
|
|
// beforeAmount = hold.UseNum
|
|
// afterAmount = utility.FloatAdd(hold.UseNum, amount)
|
|
// hold.UseNum = amount
|
|
// hold.UpdateTime = currTime
|
|
//}
|
|
//// 流水
|
|
//log := dbmodel.VtsCurrentHoldLog{
|
|
// ID: 0,
|
|
// UserID: wallet.UserId,
|
|
// CoinID: recharge.CoinId,
|
|
// UseFree: 1,
|
|
// DealType: 5,
|
|
// Remarks: "优顿充值",
|
|
// RelateOrderNo: trade.TradeId,
|
|
// Amount: amount,
|
|
// BeforeAmount: beforeAmount,
|
|
// AfterAmount: afterAmount,
|
|
// Poundage: fee,
|
|
// CreateTime: currTime,
|
|
//}
|
|
//
|
|
//// 开启事务
|
|
//tx, err := dbhelper.MasterPgdb.Beginx()
|
|
//if err != nil {
|
|
// loghelper.Error("Begin", zap.Error(err))
|
|
// return "error"
|
|
//}
|
|
//if err = walletdb.RechargeInsert(recharge, tx); err != nil {
|
|
// _ = tx.Rollback()
|
|
// return "error"
|
|
//}
|
|
//// 账户写入
|
|
//if trade.Status == 3 {
|
|
// if err = holddb.UpdateHoldUseNum(hold, tx); err != nil {
|
|
// _ = tx.Rollback()
|
|
// return "error"
|
|
// }
|
|
// // 流水
|
|
// if err = holddb.AddCurrentHoldLog(log, tx); err != nil {
|
|
// _ = tx.Rollback()
|
|
// loghelper.Error("handleRecharge", zap.Error(err))
|
|
// return "error"
|
|
// }
|
|
//}
|
|
//// 提交
|
|
//if err = tx.Commit(); err != nil {
|
|
// loghelper.Error("Commit", zap.Error(err))
|
|
// return "error"
|
|
//}
|
|
////保存消息日志
|
|
//templates := cmsdb.GetTempContent(3, 3) //充币通知
|
|
//var template adminmodel.CmsTemplateContentDb
|
|
//if len(templates) > 0 {
|
|
// template = templates[0]
|
|
//}
|
|
//if template.TemplateId > 0 {
|
|
// // 写入站内信
|
|
// store := dbmodel.CmsMessageUserDB{
|
|
// UserId: recharge.UserId,
|
|
// MessageId: template.TemplateId,
|
|
// IsRead: 1,
|
|
// Type: 1,
|
|
// CreateTime: time.Now(),
|
|
// CategoryId: template.CategoryId,
|
|
// Content: strings.ReplaceAll(template.Content, "{num}", " "+utility.FloatToStr(amount)+" "+coinCode),
|
|
// LittleTitle: template.LittleTitle,
|
|
// }
|
|
// err = cmsdb.AddMessageUserItem(store)
|
|
// if err != nil {
|
|
// loghelper.Error("AddCmsMessageUser Error:", zap.Error(err))
|
|
// }
|
|
//}
|
|
return "success"
|
|
}
|
|
|
|
// 提币回调处理
|
|
//func handleWithdraw(trade udunhelper.CallBackRes) string {
|
|
// // 提币通知
|
|
// status := 7
|
|
// switch trade.Status {
|
|
// case 0:
|
|
// status = 7
|
|
// case 1:
|
|
// status = 7
|
|
// case 2:
|
|
// status = 9
|
|
// case 3:
|
|
// status = 8
|
|
// case 4:
|
|
// status = 9
|
|
// }
|
|
// if status < 8 {
|
|
// return "success"
|
|
// }
|
|
// // 加载
|
|
// data, err := walletdb.GetWithdrawItemByOrderNo(trade.BusinessId)
|
|
// if err != nil {
|
|
// return "error"
|
|
// }
|
|
// data.Status = status
|
|
// data.State = trade.Status
|
|
// data.TxId = trade.TxId
|
|
// if status == 9 {
|
|
// data.Remark = "未知原因"
|
|
// }
|
|
// num := data.SumNum //utility.FloatAddCut(data.Num, data.NumFee, 8)
|
|
// // 更新这个表的状态
|
|
// tx, err := dbhelper.MasterPgdb.Beginx()
|
|
// if err != nil {
|
|
// loghelper.Error("Begin", zap.Error(err))
|
|
// return "error"
|
|
// }
|
|
// err = walletdb.WithdrawStatusByUd(data, tx)
|
|
// if err != nil {
|
|
// _ = tx.Rollback()
|
|
// return "error"
|
|
// }
|
|
// if status == 9 {
|
|
// //如果失败则把资金重新返回给用户,减去相应的冻结资金
|
|
// err = holddb.UpdateHoldWithdraw(num, -num, data.UserId, data.CoinId, tx)
|
|
// if err != nil {
|
|
// _ = tx.Rollback()
|
|
// return "error"
|
|
// }
|
|
// } else {
|
|
// //成功的话则减去相应的冻结资金
|
|
// err = holddb.UpdateHoldWithdraw(0, -num, data.UserId, data.CoinId, tx)
|
|
// if err != nil {
|
|
// _ = tx.Rollback()
|
|
// return "error"
|
|
// }
|
|
// }
|
|
// _ = tx.Commit()
|
|
//
|
|
// //保存消息日志
|
|
// templates := cmsdb.GetTempContent(4, 3) // 提币通知
|
|
// var template adminmodel.CmsTemplateContentDb
|
|
// if len(templates) > 0 {
|
|
// template = templates[0]
|
|
// }
|
|
// if template.TemplateId > 0 {
|
|
// coin := coinservice.CoinCache.GetById(data.CoinId)
|
|
// // 写入站内信
|
|
// store := dbmodel.CmsMessageUserDB{
|
|
// UserId: data.UserId,
|
|
// MessageId: template.TemplateId,
|
|
// IsRead: 1,
|
|
// Type: 1,
|
|
// CreateTime: time.Now(),
|
|
// CategoryId: template.CategoryId,
|
|
// Content: strings.ReplaceAll(template.Content, "{num}", " "+utility.FloatToStr(data.Num)+" "+coin.CoinCode),
|
|
// LittleTitle: template.LittleTitle,
|
|
// }
|
|
// err = cmsdb.AddMessageUserItem(store)
|
|
// if err != nil {
|
|
// loghelper.Error("AddCmsMessageUser Error:", zap.Error(err))
|
|
// }
|
|
// }
|
|
// return "success"
|
|
//}
|
|
|
|
// getBalance 获取金额
|
|
func getBalance(balance, decimals string) float64 {
|
|
am, _ := strconv.ParseFloat(balance, 64)
|
|
dec, _ := strconv.ParseFloat(decimals, 64)
|
|
res := decimal.NewFromFloat(am / math.Pow(10, dec))
|
|
amount, _ := res.Truncate(8).Float64()
|
|
return amount
|
|
}
|