1
This commit is contained in:
334
services/udunservice/udunservice.go
Normal file
334
services/udunservice/udunservice.go
Normal file
@ -0,0 +1,334 @@
|
||||
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
|
||||
}
|
||||
Reference in New Issue
Block a user