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.
638 lines
16 KiB
638 lines
16 KiB
package sn |
|
|
|
import ( |
|
"encoding/json" |
|
"fmt" |
|
"io/ioutil" |
|
"server/call" |
|
"server/common" |
|
"server/db" |
|
"server/modules/web/app" |
|
"server/modules/web/providers/base" |
|
"server/util" |
|
"strconv" |
|
"time" |
|
|
|
"github.com/gin-gonic/gin" |
|
"github.com/liangdas/mqant/log" |
|
) |
|
|
|
func Sn(e *gin.RouterGroup) { |
|
e.POST("/wallet_request", GetBalance) |
|
e.POST("/wallet_bet", GameBet) |
|
e.POST("/wallet_settlement", Settle) |
|
e.POST("/wallet_bet_rollback", Rollback) |
|
e.POST("/wallet_update", Update) |
|
e.POST("/game_control_callback", GameControlCallback) |
|
} |
|
|
|
func GetBalance(c *gin.Context) { |
|
a := app.NewApp(c) |
|
defer func() { |
|
a.ResponseB() |
|
}() |
|
req := &GetBalanceReq{} |
|
resp := &GetBalanceResp{} |
|
a.RetData = resp |
|
body, err := ioutil.ReadAll(c.Request.Body) |
|
if err != nil { |
|
log.Error("read body err: %v", err) |
|
resp.Code = INVALIDREQUESTERR |
|
return |
|
} |
|
log.Debug("get balance:%s", string(body)) |
|
err = json.Unmarshal(body, &req) |
|
if err != nil { |
|
log.Error("unmarshal err, %s", err.Error()) |
|
resp.Code = INVALIDREQUESTERR |
|
return |
|
} |
|
|
|
account := c.GetHeader("account") |
|
headers := make(map[string]string) |
|
for key, values := range c.Request.Header { |
|
if len(values) > 0 { |
|
headers[key] = values[0] // 取第一个值 |
|
} |
|
} |
|
if a.ShouldRouteByAccount(&account, common.ProviderAPITypeJson, req, headers) { |
|
return |
|
} |
|
newBody, _ := json.Marshal(req) |
|
var tmpValue map[string]interface{} |
|
json.Unmarshal(newBody, &tmpValue) |
|
tmpSign := GeneratedSign(tmpValue, SignKey) |
|
if tmpSign != req.Sign { |
|
log.Error("sign is wrong, %+v", req) |
|
resp.Code = INVALIDREQUESTERR |
|
return |
|
} |
|
uids := account |
|
uid, err := strconv.Atoi(uids) |
|
if err != nil { |
|
log.Error("err:%v", err) |
|
resp.Code = INVALIDREQUESTERR |
|
return |
|
} |
|
|
|
currency, err := db.Redis().GetInt(common.GetRedisKeyGameCurrency(uid)) |
|
if err != nil { |
|
log.Error("err:%v", err) |
|
resp.Code = INVALIDREQUESTERR |
|
return |
|
} |
|
|
|
resp.Msg = "success" |
|
resp.Data.Chips = int(call.GetUserCurrencyFloat(uid, common.CurrencyType(currency), 0) * common.DecimalDigits) |
|
log.Debug("GetBalanceResp:%+v", resp) |
|
} |
|
|
|
func GameBet(c *gin.Context) { |
|
a := app.NewApp(c) |
|
defer func() { |
|
a.ResponseB() |
|
}() |
|
req := &GameBetReq{} |
|
resp := &GameBetResp{} |
|
a.RetData = resp |
|
body, err := ioutil.ReadAll(c.Request.Body) |
|
if err != nil { |
|
log.Error("read body err: %v", err) |
|
resp.Code = INVALIDREQUESTERR |
|
return |
|
} |
|
log.Debug("game bet:%s", string(body)) |
|
err = json.Unmarshal(body, &req) |
|
if err != nil { |
|
log.Error("unmarshal err, %s", err.Error()) |
|
resp.Code = INVALIDREQUESTERR |
|
return |
|
} |
|
account := c.GetHeader("account") |
|
headers := make(map[string]string) |
|
for key, values := range c.Request.Header { |
|
if len(values) > 0 { |
|
headers[key] = values[0] // 取第一个值 |
|
} |
|
} |
|
if a.ShouldRouteByAccount(&account, common.ProviderAPITypeJson, req, headers) { |
|
return |
|
} |
|
//reqBody, _ := json.Marshal(req) |
|
var tmpValue map[string]interface{} |
|
err = json.Unmarshal(body, &tmpValue) |
|
if err != nil { |
|
log.Error("unmarshal err, %s", err.Error()) |
|
resp.Code = INVALIDREQUESTERR |
|
return |
|
} |
|
tmpSign := GeneratedSign(tmpValue, SignKey) |
|
if tmpSign != req.Sign { |
|
log.Error("sign is wrong, %+v", req) |
|
resp.Code = INVALIDREQUESTERR |
|
return |
|
} |
|
uids := account |
|
uid, err := strconv.Atoi(uids) |
|
if err != nil { |
|
log.Error("err:%v", err) |
|
resp.Code = INVALIDREQUESTERR |
|
return |
|
} |
|
provider := call.GetConfigGameProvider(common.ProviderSn) |
|
now := time.Now().Unix() |
|
configGame := call.GetGameListByByID(common.ProviderSn, req.GameId) |
|
if configGame == nil { |
|
log.Error("get game config err") |
|
resp.Code = INVALIDREQUESTERR |
|
return |
|
} |
|
betAmount := req.Amount |
|
if betAmount < 0 { |
|
betAmount = -req.Amount |
|
} |
|
betReq := &base.BetReq{ |
|
UID: uid, |
|
CurrencyType: common.CurrencyINR, |
|
SessionType: base.SessionTypeBet, |
|
GameID: req.GameId, |
|
GameName: configGame.GameCode, |
|
Provider: provider, |
|
BetID: req.BetId, |
|
SessionID: req.OrderId, |
|
Time: now, |
|
BetAmount: int64(betAmount), |
|
TurnOver: int64(betAmount), |
|
} |
|
betResp := base.SessionBet(betReq) |
|
if betResp.Code != base.CodeOk { |
|
resp.Code = INVALIDREQUESTERR |
|
if betResp.Code == base.CodeAccepted { |
|
resp.Msg = "duplicate order" |
|
} else if betResp.Code == base.CodeNotEnoughAmount { |
|
resp.Msg = "insufficient balance" |
|
} else { |
|
resp.Msg = "operation failed." |
|
} |
|
log.Error("GameBetResp err:%v", resp.Code) |
|
return |
|
} |
|
resp.Data.DeductionAmount = betAmount |
|
resp.Data.Chips = int(call.GetUserCurrencyFloat(uid, common.CurrencyType(0), 0) * common.DecimalDigits) |
|
resp.Msg = "success" |
|
log.Debug("GameBetResp:%+v", resp) |
|
a.Data = resp |
|
} |
|
|
|
func Settle(c *gin.Context) { |
|
a := app.NewApp(c) |
|
defer func() { |
|
a.ResponseB() |
|
}() |
|
req := &SettleReq{} |
|
resp := &SettleResp{} |
|
a.RetData = resp |
|
body, err := ioutil.ReadAll(c.Request.Body) |
|
if err != nil { |
|
log.Error("read body err: %v", err) |
|
resp.Code = INVALIDREQUESTERR |
|
return |
|
} |
|
log.Debug("sn Settle:%s", string(body)) |
|
err = json.Unmarshal(body, &req) |
|
if err != nil { |
|
log.Error("unmarshal err, %s", err.Error()) |
|
resp.Code = INVALIDREQUESTERR |
|
return |
|
} |
|
account := c.GetHeader("account") |
|
headers := make(map[string]string) |
|
for key, values := range c.Request.Header { |
|
if len(values) > 0 { |
|
headers[key] = values[0] // 取第一个值 |
|
} |
|
} |
|
if a.ShouldRouteByAccount(&account, common.ProviderAPITypeJson, req, headers) { |
|
return |
|
} |
|
var tmpValue map[string]interface{} |
|
err = json.Unmarshal(body, &tmpValue) |
|
if err != nil { |
|
log.Error("unmarshal err, %s", err.Error()) |
|
resp.Code = INVALIDREQUESTERR |
|
return |
|
} |
|
tmpSign := GeneratedSign(tmpValue, SignKey) |
|
if tmpSign != req.Sign { |
|
log.Error("sign is wrong, %+v", req) |
|
resp.Code = INVALIDREQUESTERR |
|
return |
|
} |
|
uids := account |
|
uid, err := strconv.Atoi(uids) |
|
if err != nil { |
|
log.Error("err:%v", err) |
|
resp.Code = INVALIDREQUESTERR |
|
return |
|
} |
|
provider := call.GetConfigGameProvider(common.ProviderSn) |
|
{ // 订单是否合法 |
|
record := &common.ProviderBetRecord{ |
|
UID: uid, |
|
Provider: provider.ProviderID, |
|
Type: base.SessionTypeBet, |
|
SessionID: req.OrderId, |
|
} |
|
db.Mysql().Get(record) |
|
if record.ID == 0 { |
|
resp.Code = INVALIDREQUESTERR |
|
resp.Data.Chips = int(call.GetUserCurrencyFloat(uid, common.CurrencyType(0), 0) * common.DecimalDigits) |
|
return |
|
} |
|
} |
|
now := time.Now().Unix() |
|
configGame := call.GetGameListByByID(common.ProviderSn, req.GameId) |
|
if configGame == nil { |
|
log.Error("get game config err") |
|
resp.Code = INVALIDREQUESTERR |
|
return |
|
} |
|
var betId string |
|
if len(req.Details) > 0 { |
|
betId = req.Details[0].BetId |
|
} |
|
settleAmount := int64(req.JpBonus + req.BackAmount) |
|
betReq := &base.BetReq{ |
|
UID: uid, |
|
CurrencyType: common.CurrencyINR, |
|
SessionType: base.SessionTypeSettle, |
|
GameID: req.GameId, |
|
GameName: configGame.GameCode, |
|
Provider: provider, |
|
BetID: betId, |
|
SessionID: req.OrderId, |
|
Time: now, |
|
} |
|
for _, detail := range req.Details { |
|
settleAmount += int64(detail.WinAmount) |
|
} |
|
betReq.SettleAmount = settleAmount |
|
betResp := base.SessionBet(betReq) |
|
if betResp.Code != base.CodeOk { |
|
resp.Code = INVALIDREQUESTERR |
|
if betResp.Code == base.CodeAccepted { |
|
resp.Msg = "duplicate order" |
|
} else if betResp.Code == base.CodeNotEnoughAmount { |
|
resp.Msg = "insufficient balance" |
|
} else { |
|
resp.Msg = "operation failed." |
|
} |
|
log.Error("GameBetResp err:%v", resp.Code) |
|
return |
|
} |
|
|
|
resp.Data.Chips = int(call.GetUserCurrencyFloat(uid, common.CurrencyType(0), 0) * common.DecimalDigits) |
|
resp.Msg = "success" |
|
log.Debug("SettleResp:%+v", resp) |
|
a.Data = resp |
|
} |
|
|
|
func Rollback(c *gin.Context) { |
|
a := app.NewApp(c) |
|
defer func() { |
|
a.ResponseB() |
|
}() |
|
req := &RollbackReq{} |
|
resp := &RollbackResp{} |
|
a.RetData = resp |
|
body, err := ioutil.ReadAll(c.Request.Body) |
|
if err != nil { |
|
log.Error("read body err: %v", err) |
|
resp.Code = INVALIDREQUESTERR |
|
return |
|
} |
|
log.Debug("sn rollback:%s", string(body)) |
|
err = json.Unmarshal(body, &req) |
|
if err != nil { |
|
log.Error("unmarshal err, %s", err.Error()) |
|
resp.Code = INVALIDREQUESTERR |
|
return |
|
} |
|
account := c.GetHeader("account") |
|
headers := make(map[string]string) |
|
for key, values := range c.Request.Header { |
|
if len(values) > 0 { |
|
headers[key] = values[0] // 取第一个值 |
|
} |
|
} |
|
if a.ShouldRouteByAccount(&account, common.ProviderAPITypeJson, req, headers) { |
|
return |
|
} |
|
var tmpValue map[string]interface{} |
|
err = json.Unmarshal(body, &tmpValue) |
|
if err != nil { |
|
log.Error("unmarshal err, %s", err.Error()) |
|
resp.Code = INVALIDREQUESTERR |
|
return |
|
} |
|
tmpSign := GeneratedSign(tmpValue, SignKey) |
|
if tmpSign != req.Sign { |
|
log.Error("sign is wrong, %+v", req) |
|
resp.Code = INVALIDREQUESTERR |
|
return |
|
} |
|
uids := account |
|
uid, err := strconv.Atoi(uids) |
|
if err != nil { |
|
log.Error("err:%v", err) |
|
resp.Code = INVALIDREQUESTERR |
|
return |
|
} |
|
provider := call.GetConfigGameProvider(common.ProviderSn) |
|
|
|
configGame := call.GetGameListByByID(common.ProviderSn, req.GameId) |
|
if configGame == nil { |
|
log.Error("get game config err") |
|
resp.Code = INVALIDREQUESTERR |
|
return |
|
} |
|
|
|
// 订单是否合法 |
|
record := &common.ProviderBetRecord{ |
|
UID: uid, |
|
Provider: provider.ProviderID, |
|
SessionID: req.OrderId, |
|
} |
|
db.Mysql().Get(record) |
|
if record.ID == 0 { |
|
resp.Code = INVALIDREQUESTERR |
|
resp.Data.Chips = int(call.GetUserCurrencyFloat(uid, common.CurrencyType(0), 0) * common.DecimalDigits) |
|
return |
|
} |
|
|
|
var rollbackAmount int64 |
|
|
|
if record.Type == base.SessionTypeBet { |
|
rollbackAmount = record.Amount |
|
} else if record.Type == base.SessionTypeSettle { |
|
rollbackAmount = record.Settle - record.Amount |
|
} |
|
|
|
adjustReq := &base.AdjustmentReq{ |
|
UID: uid, |
|
Amount: rollbackAmount, |
|
GameID: req.GameId, |
|
GameName: configGame.GameCode, |
|
Provider: provider, |
|
BetID: req.OrderId, |
|
SessionID: req.OrderId, |
|
Time: time.Now().Unix(), |
|
Type: base.SessionTypeAdjustment, |
|
Ess: fmt.Sprintf("%s rollback", configGame.Name), |
|
} |
|
adjustResp := base.Adjustment(adjustReq) |
|
if adjustResp.Code != CodeSuccess { |
|
log.Debug("rollback adjustResp code:%d", adjustResp.Code) |
|
resp.Code = INVALIDREQUESTERR |
|
resp.Msg = "operation failed." |
|
return |
|
} |
|
resp.Data.Chips = int(call.GetUserCurrencyFloat(uid, common.CurrencyType(0), 0) * common.DecimalDigits) |
|
resp.Msg = "success" |
|
log.Debug("rollback:%+v", resp) |
|
a.Data = resp |
|
} |
|
|
|
func Update(c *gin.Context) { |
|
a := app.NewApp(c) |
|
defer func() { |
|
a.ResponseB() |
|
}() |
|
req := &UpdateReq{} |
|
resp := &UpdateResp{} |
|
a.RetData = resp |
|
body, err := ioutil.ReadAll(c.Request.Body) |
|
if err != nil { |
|
log.Error("read body err: %v", err) |
|
resp.Code = INVALIDREQUESTERR |
|
return |
|
} |
|
log.Debug("sn update:%s", string(body)) |
|
err = json.Unmarshal(body, &req) |
|
if err != nil { |
|
log.Error("unmarshal err, %s", err.Error()) |
|
resp.Code = INVALIDREQUESTERR |
|
return |
|
} |
|
account := c.GetHeader("account") |
|
headers := make(map[string]string) |
|
for key, values := range c.Request.Header { |
|
if len(values) > 0 { |
|
headers[key] = values[0] // 取第一个值 |
|
} |
|
} |
|
if a.ShouldRouteByAccount(&account, common.ProviderAPITypeJson, req, headers) { |
|
return |
|
} |
|
var tmpValue map[string]interface{} |
|
err = json.Unmarshal(body, &tmpValue) |
|
if err != nil { |
|
log.Error("unmarshal err, %s", err.Error()) |
|
resp.Code = INVALIDREQUESTERR |
|
return |
|
} |
|
tmpSign := GeneratedSign(tmpValue, SignKey) |
|
if tmpSign != req.Sign { |
|
log.Error("sign is wrong, %+v", req) |
|
resp.Code = INVALIDREQUESTERR |
|
return |
|
} |
|
uids := account |
|
uid, err := strconv.Atoi(uids) |
|
if err != nil { |
|
log.Error("err:%v", err) |
|
resp.Code = INVALIDREQUESTERR |
|
return |
|
} |
|
provider := call.GetConfigGameProvider(common.ProviderSn) |
|
|
|
configGame := call.GetGameListByByID(common.ProviderSn, req.GameId) |
|
if configGame == nil { |
|
log.Error("get game config err") |
|
resp.Code = INVALIDREQUESTERR |
|
return |
|
} |
|
|
|
// 订单是否合法 |
|
record := &common.ProviderBetRecord{ |
|
UID: uid, |
|
Provider: provider.ProviderID, |
|
SessionID: req.OrderId, |
|
} |
|
db.Mysql().Get(record) |
|
if record.ID == 0 { |
|
resp.Code = INVALIDREQUESTERR |
|
resp.Data.Chips = int(call.GetUserCurrencyFloat(uid, common.CurrencyType(0), 0) * common.DecimalDigits) |
|
return |
|
} |
|
|
|
updateAmount := int64(req.Amount) |
|
desc := "game update" |
|
|
|
if req.SubTypeId == 80006 || req.SubTypeId == 80007 || req.SubTypeId == 80031 || req.SubTypeId == 101010 { |
|
if updateAmount < 0 { |
|
updateAmount *= -1 |
|
} |
|
} else if req.SubTypeId == 80016 { |
|
|
|
} else { |
|
if updateAmount > 0 { |
|
updateAmount *= -1 |
|
} |
|
} |
|
|
|
switch req.SubTypeId { |
|
case 80005: // 小费 |
|
desc = "game tip" |
|
case 80006: |
|
desc = "game activity" |
|
case 80007: |
|
desc = "game jp" |
|
case 800016: |
|
desc = "game award" |
|
case 80030: |
|
desc = "create room free" |
|
case 80031: |
|
desc = "create room award" |
|
case 101010: |
|
desc = "create room rollback" |
|
} |
|
|
|
adjustReq := &base.AdjustmentReq{ |
|
UID: uid, |
|
Amount: updateAmount, |
|
GameID: req.GameId, |
|
GameName: configGame.GameCode, |
|
Provider: provider, |
|
BetID: req.OrderId, |
|
SessionID: req.OrderId, |
|
Time: time.Now().Unix(), |
|
Type: base.SessionTypeAdjustment, |
|
Ess: desc, |
|
} |
|
adjustResp := base.Adjustment(adjustReq) |
|
if adjustResp.Code != CodeSuccess { |
|
log.Debug("update adjustResp code:%d", adjustResp.Code) |
|
resp.Code = INVALIDREQUESTERR |
|
resp.Msg = "operation failed." |
|
return |
|
} |
|
resp.Data.Chips = int(call.GetUserCurrencyFloat(uid, common.CurrencyType(0), 0) * common.DecimalDigits) |
|
resp.Msg = "success" |
|
log.Debug("rollback:%+v", resp) |
|
a.Data = resp |
|
} |
|
|
|
func GameControlCallback(c *gin.Context) { |
|
a := app.NewApp(c) |
|
defer func() { |
|
a.ResponseB() |
|
}() |
|
req := &GameControlCallbackReq{} |
|
resp := &GameControlCallbackResp{} |
|
a.RetData = resp |
|
body, err := ioutil.ReadAll(c.Request.Body) |
|
if err != nil { |
|
log.Error("read body err: %v", err) |
|
resp.Code = INVALIDREQUESTERR |
|
return |
|
} |
|
log.Debug("sn gameControlCallback:%s", string(body)) |
|
err = json.Unmarshal(body, &req) |
|
if err != nil { |
|
log.Error("unmarshal err, %s", err.Error()) |
|
resp.Code = INVALIDREQUESTERR |
|
return |
|
} |
|
account := c.GetHeader("account") |
|
headers := make(map[string]string) |
|
for key, values := range c.Request.Header { |
|
if len(values) > 0 { |
|
headers[key] = values[0] // 取第一个值 |
|
} |
|
} |
|
if a.ShouldRouteByAccount(&account, common.ProviderAPITypeJson, req, headers) { |
|
return |
|
} |
|
var tmpValue map[string]interface{} |
|
err = json.Unmarshal(body, &tmpValue) |
|
if err != nil { |
|
log.Error("unmarshal err, %s", err.Error()) |
|
resp.Code = INVALIDREQUESTERR |
|
return |
|
} |
|
tmpSign := GeneratedSign(tmpValue, SignKey) |
|
if tmpSign != req.Sign { |
|
log.Error("sign is wrong, %+v", req) |
|
resp.Code = INVALIDREQUESTERR |
|
return |
|
} |
|
uids := account |
|
uid, err := strconv.Atoi(uids) |
|
if err != nil { |
|
log.Error("err:%v", err) |
|
resp.Code = INVALIDREQUESTERR |
|
return |
|
} |
|
resp.Msg = "success" |
|
log.Debug("gameControlCallback resp:%+v", resp) |
|
a.Data = resp |
|
defer func() { |
|
err = Control(uid, util.ToInt(req.ControlId)) |
|
if err != nil { |
|
log.Error("sn control err, %s", err.Error()) |
|
} |
|
}() |
|
} |
|
|
|
func Control(uid int, controlId int) error { |
|
if controlId == 0 { |
|
controlId = 1 |
|
} |
|
req := &ControlReq{ |
|
BaseReq: BaseReq{ |
|
SnAccount: SnAccount, |
|
Time: time.Now().Unix(), |
|
}, |
|
ThirdName: call.GetProviderUserName(fmt.Sprintf("%d", uid)), |
|
ControlId: controlId, |
|
Sn: SnId, |
|
AgentId: AgentId, |
|
Data: []struct { |
|
TargetRtp int `json:"target_rtp"` |
|
}{ |
|
{ |
|
TargetRtp: call.GetProviderGameRtp(uid), |
|
}, |
|
}, |
|
} |
|
|
|
log.Debug("sn control req, %+v", *req) |
|
reqBody, _ := json.Marshal(req) |
|
var tmpValue map[string]interface{} |
|
json.Unmarshal(reqBody, &tmpValue) |
|
req.Sign = GeneratedSign(tmpValue, SignKey) |
|
|
|
var resp ControlResp |
|
err := util.HttpPost(APIControl, req, &resp, nil) |
|
if err != nil { |
|
log.Error("err:%v", err) |
|
return err |
|
} |
|
if resp.Code != CodeRequestSuccess && resp.Code != CodeRequestExist { |
|
log.Error("control err, %+v", resp) |
|
return fmt.Errorf("control err, %+v ", resp) |
|
} |
|
|
|
return nil |
|
}
|
|
|