印度包网
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

465 lines
12 KiB

package handler
import (
"encoding/json"
"fmt"
"server/call"
"server/config"
"server/db"
"server/modules/web/app"
"server/pb"
"server/util"
"time"
"server/common"
"server/modules/web/values"
"github.com/gin-gonic/gin"
"github.com/liangdas/mqant/log"
"github.com/olivere/elastic/v7"
)
func CheckRechargeOrder(c *gin.Context) {
a := app.NewApp(c)
defer func() {
a.Response()
}()
req := new(values.RechargeOrderReq)
if !a.S(req) {
return
}
// log.Debug("req:%+v", *req)
one := &common.RechargeOrder{OrderID: req.OrderID}
db.Mysql().Get(one)
resp := values.RechargeOrderResp{}
resp.Status = int(one.Status)
a.Data = resp
// log.Debug("resp:%+v", resp)
}
func RechargeInfoFirst(c *gin.Context) {
a := app.NewApp(c)
defer func() {
a.Response()
}()
resp := &values.RechargeInfoFirstResp{}
a.Data = resp
a.GetUID()
resp.List = make([]values.PayInfo, 0, len(call.GetConfigFirstPay()))
rechargeInfo := call.GetRechargeInfo(a.UID)
for _, v := range call.GetConfigFirstPay() {
var bonus int64
per, _ := call.GetConfigFirstPayByCount(v.Amount, rechargeInfo.BuyAmountDataMap[fmt.Sprintf("%d", v.Amount)])
if per > 0 {
bonus = v.Amount * per / 100
}
var productId int
if product := call.GetConfigPayProductByAmount(v.Amount); product != nil {
productId = product.ProductID
}
resp.List = append(resp.List, values.PayInfo{
Amount: v.Amount,
Bonus: bonus,
ProductId: productId,
})
}
}
func RechargeInfo(c *gin.Context) {
a := app.NewApp(c)
defer func() {
a.Response()
}()
list := call.GetConfigPayProductByActivityID(0)
resp := &values.RechargeInfoResp{Tips: call.GetConfigPlatform().PayTips, SelectID: config.GetConfig().Web.SelectID}
a.Data = resp
resp.Channels = call.GetConfigPayChannels()
// payData := call.GetPlayerPayData(a.UID)
a.GetUID()
re := &common.RechargeInfo{}
if a.UID > 0 {
re = call.GetRechargeInfo(a.UID)
}
for _, v := range call.GetConfigFirstPay() {
one := values.OneConfigPayBonus{
Amount: v.Amount,
}
if re.TotalRecharge > 0 {
one.Per = v.Per
} else {
one.Per = v.FirstPer
}
resp.ConfigPayBonus = append(resp.ConfigPayBonus, one)
}
data := common.CurrencyBalance{}
q := elastic.NewBoolQuery()
q.Filter(elastic.NewMatchQuery("uid", a.UID))
q.Filter(elastic.NewMatchQuery("value", 100*common.DecimalDigits))
q.Filter(elastic.NewMatchQuery("event", common.CurrencyEventReCharge))
db.ES().QueryOne(common.ESIndexBalance, q, &data, "id", false)
log.Info("data:%+v", data)
rechargeInfo := call.GetRechargeInfo(a.UID)
for _, v := range list {
one := *v
if v.IfSell == 2 {
continue
}
if v.Type == common.CurrencyUSDT {
for _, j := range resp.Channels {
if j.CurrencyType == common.CurrencyUSDT {
if j.PayDown <= v.Amount && j.PayUp >= v.Amount {
one.Channels = append(one.Channels, j.ChannelID)
}
}
}
resp.List = append(resp.List, one)
} else if v.Type == common.CurrencyINR {
for _, j := range resp.Channels {
if j.CurrencyType == common.CurrencyINR {
if j.PayDown <= v.Amount && j.PayUp >= v.Amount {
one.Channels = append(one.Channels, j.ChannelID)
}
}
}
count := rechargeInfo.BuyAmountDataMap[fmt.Sprintf("%d", one.Amount)]
if bonus, _ := call.GetConfigFirstPayByCount(one.Amount, count); bonus > 0 {
one.Bonus = bonus * one.Amount / 100
}
resp.List = append(resp.List, one)
}
}
if a.UID > 0 {
// 判断是否有折扣券
tickets := call.GetUserValidItems(a.UID, common.ItemDiscountTicket)
for _, v := range tickets {
diff := v.Time - time.Now().Unix()
if v.Time != -1 && diff <= 0 {
id := v.ID
util.Go(func() {
db.Mysql().Update(&common.PlayerItems{ID: id}, map[string]interface{}{"status": common.ItemStatusInvalid})
})
continue
}
resp.DiscountTicket = append(resp.DiscountTicket, &values.DiscountTicket{
Id: v.ID,
Discount: v.Exi1,
TimeLeft: v.Time,
Amount: v.Exi2,
})
}
}
for _, channel := range resp.Channels {
channel.PayStatus = call.GetChannelStatus(channel.ChannelID)
}
resp.NeedBet = call.GetUserNeedBet(a.UID)
resp.Cash = call.GetUserCurrencyTotal(a.UID, common.CurrencyType(0))
if resp.NeedBet == 0 {
resp.CanWithdraw = resp.Cash
}
}
func RechargeHistory(c *gin.Context) {
a := app.NewApp(c)
defer func() {
a.Response()
}()
req := new(values.RechargeHistoryReq)
if !a.S(req) {
return
}
resp := &values.RechargeHistoryResp{}
a.Data = resp
now := time.Now()
switch req.Tag {
case 0:
req.StartAt = now.AddDate(0, 0, -1).Unix()
req.EndAt = now.Unix()
case 1:
req.StartAt = now.AddDate(0, 0, -7).Unix()
req.EndAt = now.Unix()
case 2:
req.StartAt = now.AddDate(0, 0, -30).Unix()
req.EndAt = now.Unix()
}
var err error
mdb := db.Mysql().C().Model(&common.RechargeOrder{}).Where("uid = ? and event = ? and create_time >= ? and create_time <= ? ",
a.UID, common.CurrencyEventReCharge, req.StartAt, req.EndAt)
err = mdb.Count(&resp.Count).Error
if err != nil {
log.Error("get recharge order count err, %s", err.Error())
}
err = mdb.Order("create_time desc").Offset(req.Page * req.PageSize).Limit(req.PageSize).Find(&resp.List).Error
if err != nil {
log.Error("get recharge order list err, %s", err.Error())
a.Code = values.CodeRetry
return
}
for index, v := range resp.List {
switch v.Status {
case 1, 2:
resp.List[index].Status = 0
case 3:
resp.List[index].Status = 1
case 4, 5:
resp.List[index].Status = 2
}
}
a.Data = resp
}
func PlayerRecharge(c *gin.Context) {
a := app.NewApp(c)
defer func() {
a.Response()
}()
req := new(values.RechargeReq)
if !a.S(req) {
a.Code = values.CodeParam
return
}
log.Debug("player %v recharge:%+v", a.UID, *req)
if req.CurrencyType == 0 {
req.CurrencyType = common.CurrencyINR
}
if req.ProductID > 0 {
product := call.GetConfigPayProductByID(req.ProductID)
if product == nil {
a.Code = values.CodeRetry
return
}
req.Amount = product.Amount
req.ActivityID = product.ActivityID
if product.ActivityID > 0 {
can, _ := a.CanBuyProduct(req.ActivityID, req.ProductID)
if !can {
a.Code = values.CodeRetry
a.Msg = "Buy limit"
return
}
req.Bonus = false
}
} else {
req.Amount = common.RoundCurrency(req.CurrencyType, req.Amount)
}
payCount, _ := db.Redis().GetInt(common.GetRedisKeyPlayerPayCount(a.UID))
// 判断充值间隔 同渠道限制3秒拉一单 30秒限制4单
if db.Redis().Exist(common.GetRedisKeyPlayerChannelPayInterval(req.PayChannel, a.UID)) && payCount >= 4 {
a.Code = values.CodeParam
a.Msg = "Requests are too frequent, please try again later"
return
}
call.AddChannel(req.PayChannel, false)
if req.UserPhone == "" {
req.UserPhone = util.CheckPhone(req.UserPhone)
}
payImp := NewRechargeImp(req, a.UID, a.Channel, a.GetRemoteIP())
if payImp == nil {
a.Code = values.CodeRetry
a.Msg = "channel unavailable"
log.Error("req params err:%v", req)
return
}
code := payImp.Recharge()
if code != values.CodeOK {
a.Code = code
a.Msg = "channel unavailable"
return
}
// ok
a.Data = payImp.Data
a.Msg = payImp.Order.OrderID
log.Debug("player %v recharge resp:%v,msg:%v", a.UID, a.Data, a.Msg)
uid := a.UID
util.Go(func() {
db.Redis().SetData(common.GetRedisKeyPlayerChannelPayInterval(req.PayChannel, uid), 1, 3*time.Second)
db.Redis().Incr(common.GetRedisKeyPlayerPayCount(a.UID), 1)
if payCount == 0 {
db.Redis().Expire(common.GetRedisKeyPlayerPayCount(a.UID), 30*time.Second)
}
})
if !config.GetBase().Release {
util.Go(func() {
call.RechargeCallback(payImp.Order, true, "", "")
})
}
}
func NewRechargeImp(req *values.RechargeReq, uid, cid int, ip string) *RechargeImp {
r := new(RechargeImp)
r.Channel = call.GetChannelByID(cid)
if r.Channel == nil {
log.Error("invalid cid:%v", cid)
return nil
}
order := &common.RechargeOrder{
CreateTime: time.Now().Unix(),
CurrencyType: req.CurrencyType,
Amount: req.Amount,
ChannelID: cid,
UID: uid,
Status: common.StatusROrderCreate,
Event: int(common.CurrencyEventReCharge),
UPI: req.PayChannel,
ProductID: req.ProductID,
ActivityID: req.ActivityID,
}
if req.ActivityID > 0 {
switch req.ActivityID {
case common.ActivityIDWeekCard:
order.Event = int(common.CurrencyEventActivityWeekCard)
}
}
// 只有商城购买才能使用优惠券
// todo activityId为0才是商城购买
if req.ProductID == 0 && req.DiscountTicketId > 0 {
// 判断是否有折扣券
ticket := call.GetItem(req.DiscountTicketId)
if ticket != nil && req.Amount >= ticket.Exi2 {
ticketData := common.ActivityRechargeData{ID: common.ItemDiscountTicket, I1: int(ticket.Exi1), I2: req.Amount}
ticketByte, _ := json.Marshal(ticketData)
order.Extra = string(ticketByte)
req.Amount = common.RoundCurrency(common.CurrencyINR, req.Amount-ticket.Exi1)
order.Amount = req.Amount
}
}
re := call.GetRechargeInfo(uid)
//notCharge := re.TotalRecharge == 0
//per := call.GetConfigFirstPayPerByAmount(notCharge, order.Amount)
var times int
if req.Bonus {
times = re.BuyAmountDataMap[fmt.Sprintf("%d", order.Amount)]
per, topThree := call.GetConfigFirstPayByCount(order.Amount, times)
if per > 0 {
order.Bonus = order.Amount * per / 100
}
if topThree {
times++
} else {
times = 0
}
}
r.UID = uid
info, _ := call.GetUserXInfo(uid, "mobile")
p := new(PayImp)
p.CurrencyType = req.CurrencyType
p.req = new(pb.InnerRechargeReq)
p.req.Phone = req.UserPhone
p.req.Amount = req.Amount
p.req.PlayerChannel = uint32(cid)
if req.CurrencyType == common.CurrencyINR {
// 判断黑名单
if call.BlackListAndKick(uid, &common.BlackList{Phone: info.Mobile}) {
return nil
}
pinfo := &common.PayInfo{UID: uid}
db.Mysql().Get(pinfo)
// if req.UserName == nil {
// log.Error("invalid param:%+v", req)
// return nil
// }
p.req.Name = util.GenerateRandomString(5)
p.req.Phone = pinfo.Mobile
p.req.IP = ip
p.req.Number = pinfo.BankCardNo
if info.Mobile != "" {
p.req.Phone = info.Mobile
}
if pinfo.AccountName != "" {
p.req.Name = pinfo.AccountName
}
if pinfo.Email != "" {
p.req.Email = pinfo.Email
}
}
order.Times = times
r.Order = order
p.base = r
r.RechargeIn = p
r.PayChannel = req.PayChannel
return r
}
type RechargeIn interface {
Recharge() int
}
// RechargeImp 新充值对象
type RechargeImp struct {
Data interface{}
RechargeIn
Order *common.RechargeOrder
// product *common.ConfigPayProduct
// tx *gorm.DB
UID int
Channel *common.Channel
PayChannel int
}
func (r *RechargeImp) CreateRecharge() error {
if r.Order.OrderID == "" {
r.Order.OrderID = util.NewOrderID(r.UID)
}
// r.Order.UID = r.UID
// r.Order.Status = common.StatusROrderCreate
// r.Order.Event = int(common.CurrencyEventReCharge)
// r.Order.ChannelID = int(r.Channel.ChannelID)
if err := db.Mysql().C().Model(r.Order).Create(r.Order).Error; err != nil {
log.Error("create order err:%v", err)
return err
}
return nil
}
// pay模块支付
type PayImp struct {
base *RechargeImp
req *pb.InnerRechargeReq
CurrencyType common.CurrencyType
}
func (p *PayImp) Recharge() int {
orderID := util.NewOrderID(p.base.UID)
// product := p.base.product
var resp *pb.InnerRechargeResp
var err error
if p.CurrencyType == common.CurrencyINR {
req := &pb.InnerRechargeReq{OrderID: orderID, Amount: p.req.Amount, Phone: p.req.Phone,
Name: p.req.Name, UID: uint32(p.base.UID), Channel: uint32(p.base.PayChannel), IsPersonalCard: false, PaySource: common.PaySourceModulePay}
p.base.Order.PaySource = common.PaySourceModulePay
if p.base.PayChannel < 0 {
req.IsPersonalCard = true
}
resp, err = call.Recharge(req)
if err != nil {
log.Error("err:%v", err)
return values.CodeRetry
}
p.base.Order.PayChannel = int(resp.Channel)
} else {
orderID = "USDT" + orderID
req := &pb.InnerRechargeReq{OrderID: orderID, Amount: p.req.Amount, UID: uint32(p.base.UID), Channel: uint32(p.base.PayChannel), PaySource: common.PaySourceBlockPay}
p.base.Order.PaySource = common.PaySourceBlockPay
resp, err = call.Recharge(req)
if err != nil {
log.Error("err:%v", err)
return values.CodeRetry
}
p.base.Order.Extra = resp.URL
}
p.base.Data = values.PayResp{OrderID: orderID, Addr: resp.URL}
p.base.Order.OrderID = orderID
p.base.Order.APIPayID = resp.APIOrderID
err = p.base.CreateRecharge()
if err != nil {
return values.CodeRetry
}
return values.CodeOK
}