Compare commits
4 Commits
| Author | SHA1 | Date |
|---|---|---|
|
|
ce7bfe83cd | 11 months ago |
|
|
f1ca699478 | 1 year ago |
|
|
0221534569 | 1 year ago |
|
|
6d79b3acaf | 1 year ago |
16 changed files with 33 additions and 478 deletions
@ -1,147 +0,0 @@ |
||||
package pg3 |
||||
|
||||
import ( |
||||
"fmt" |
||||
"server/common" |
||||
"server/db" |
||||
"server/util" |
||||
"strconv" |
||||
"time" |
||||
) |
||||
|
||||
const ( |
||||
ErrCodeSuccess = 0 |
||||
ErrCodePlayerNotFound = 2000 // 玩家不存在
|
||||
ErrCodePlayerToken = 2001 // Token错误
|
||||
ErrCodeInvalidGameID = 102 // 无效的GameDI
|
||||
ErrCodeInternalError = 3000 // 内部错误
|
||||
ErrCodeInsufficientBal = 2010 // 投注失败,如余额不足
|
||||
) |
||||
|
||||
type GameListResponse struct { |
||||
Code int `json:"code"` |
||||
Msg string `json:"msg"` |
||||
Data GameListData `json:"data"` |
||||
} |
||||
|
||||
type GameListData struct { |
||||
GameList []GameListItem `json:"glist"` |
||||
} |
||||
|
||||
type GameListItem struct { |
||||
Icon string `json:"icon"` |
||||
MapID string `json:"mapid"` |
||||
Name string `json:"name"` |
||||
Site string `json:"site"` |
||||
GameID string `json:"gameid"` |
||||
} |
||||
|
||||
// EnterGameRequest 进入游戏
|
||||
type EnterGameRequest struct { |
||||
Uname string `json:"uname"` // 用户名,最长30个字节
|
||||
GameID string `json:"gameid"` // 所进游戏的编码
|
||||
Token string `json:"token,omitempty"` // 用户验证token,最长120个字节,用于单一钱包的身份验证接口
|
||||
Lang string `json:"lang,omitempty"` // 游戏语言,默认为en
|
||||
Nick string `json:"nick,omitempty"` // 用户昵称,最长40个字节
|
||||
TotalRecharge int64 `json:"totalRecharge"` // 总充值
|
||||
TotalBet int64 `json:"totalBet"` // 总下注
|
||||
Balance int64 `json:"balance"` // 金额
|
||||
TotalWithdraw int64 `json:"totalWithdraw"` // 总提现(已提现+提现打款中+玩家审核)
|
||||
} |
||||
type EnterGameResponse struct { |
||||
Code int `json:"code"` |
||||
Msg string `json:"msg"` |
||||
Data struct { |
||||
GameURL string `json:"gameurl"` |
||||
} `json:"data"` |
||||
} |
||||
|
||||
// PlaceBetRequest 下注
|
||||
type PlaceBetRequest struct { |
||||
Uname string `json:"uname"` |
||||
Token string `json:"token"` |
||||
BetID string `json:"betid"` |
||||
SessionID string `json:"sessionid"` |
||||
GameID string `json:"gameid"` |
||||
Bet float64 `json:"bet"` |
||||
Award float64 `json:"award"` |
||||
IsEndRound bool `json:"is_end_round"` |
||||
Ctime int64 `json:"ctime"` |
||||
} |
||||
|
||||
type PlaceBetResponse struct { |
||||
Code int `json:"code"` |
||||
Msg string `json:"msg"` |
||||
Data struct { |
||||
Uname string `json:"uname"` |
||||
BetID string `json:"betid"` |
||||
Balance float64 `json:"balance"` |
||||
} `json:"data"` |
||||
} |
||||
|
||||
type VerifySessionReq struct { |
||||
Uname string `json:"uname"` |
||||
Token string `json:"token"` |
||||
} |
||||
|
||||
type VerifySessionResp struct { |
||||
Code int `json:"code"` |
||||
Msg string `json:"msg"` |
||||
Data struct { |
||||
Uname string `json:"uname"` |
||||
Balance float64 `json:"balance"` |
||||
} `json:"data"` |
||||
} |
||||
|
||||
type GetBalanceRequest struct { |
||||
GameId string `json:"gameid"` |
||||
Uname string `json:"uname"` |
||||
} |
||||
|
||||
type GetBalanceResponse struct { |
||||
Code int `json:"code"` |
||||
Msg string `json:"msg"` |
||||
Data struct { |
||||
Uname string `json:"uname"` |
||||
Balance float64 `json:"balance"` |
||||
} `json:"data"` |
||||
} |
||||
|
||||
func GetGameList() { |
||||
API = APITest |
||||
AgentMap = AgentMapTest |
||||
url := fmt.Sprintf("%s/api/game/loadlist", APITest) |
||||
mchid := AgentMap.MchId |
||||
key := AgentMap.Key |
||||
timestamp := time.Now().Unix() |
||||
headers := map[string]string{ |
||||
"X-Game-Mchid": mchid, |
||||
"X-Game-Timestamp": strconv.FormatInt(timestamp, 10), |
||||
"Content-Type": "application/json;charset=UTF-8", |
||||
} |
||||
type empty struct{} |
||||
var e empty |
||||
// Generate sign
|
||||
emptyBody := "{}" |
||||
sign := GenerateSign(emptyBody, timestamp, key) |
||||
headers["X-Game-Sign"] = sign |
||||
|
||||
var response GameListResponse |
||||
err := util.HttpPost(url, e, &response, headers) |
||||
if err != nil { |
||||
return |
||||
} |
||||
|
||||
var gameList []*common.ConfigGameList |
||||
for _, item := range response.Data.GameList { |
||||
id, _ := strconv.Atoi(item.MapID) |
||||
gameList = append(gameList, &common.ConfigGameList{ |
||||
GameProvider: common.ProviderPG2, |
||||
GameID: id, |
||||
GameCode: item.GameID, |
||||
Icon: item.Icon, |
||||
Name: item.Name, |
||||
}) |
||||
} |
||||
db.Mysql().Create(gameList) |
||||
} |
||||
@ -1,84 +0,0 @@ |
||||
package pg3 |
||||
|
||||
import ( |
||||
"encoding/json" |
||||
"fmt" |
||||
"server/call" |
||||
"server/common" |
||||
"server/config" |
||||
"server/db" |
||||
"server/modules/web/providers/base" |
||||
utils "server/util" |
||||
"strconv" |
||||
"time" |
||||
|
||||
"github.com/liangdas/mqant/log" |
||||
) |
||||
|
||||
type Sub struct { |
||||
Base *base.Base |
||||
} |
||||
|
||||
func NewSub(base *base.Base) { |
||||
base.Sub = &Sub{Base: base} |
||||
base.SubInitRouter = PG |
||||
} |
||||
|
||||
func (s *Sub) Init() { |
||||
API = APITest |
||||
AgentMap = AgentMapTest |
||||
if config.GetBase().Release { |
||||
API = APIRlease |
||||
AgentMap = AgentMapRelease |
||||
} |
||||
} |
||||
|
||||
func (s *Sub) EnterGame() string { |
||||
url := fmt.Sprintf("%s/api/usr/ingame", API) |
||||
timestamp := time.Now().Unix() |
||||
uid := s.Base.EnterGameReq.UID |
||||
token := s.Base.EnterGameReq.Token |
||||
providerID := s.Base.EnterGameReq.ProviderID |
||||
gameID := s.Base.EnterGameReq.GameID |
||||
mchid := AgentMap.MchId |
||||
key := AgentMap.Key |
||||
rtp := call.GetRtpControl(uid) |
||||
log.Info("uid:%v,rtp:%v", uid, rtp) |
||||
db.Redis().SetData(common.GetRedisKeyPlayerRtp(uid), rtp) |
||||
headers := map[string]string{ |
||||
"X-Game-Mchid": mchid, |
||||
"X-Game-Timestamp": strconv.FormatInt(timestamp, 10), |
||||
"Content-Type": "application/json;charset=UTF-8", |
||||
} |
||||
rechargeInfo := call.GetRechargeInfo(uid) |
||||
balance := call.GetUserCurrency(uid, common.CurrencyINR) |
||||
playerProfile := call.GetPlayerProfileByCurrency(uid, common.CurrencyINR) |
||||
// Generate sign
|
||||
game := call.GetConfigGameListByID(providerID, gameID) |
||||
if game == nil { |
||||
return "" |
||||
} |
||||
request := EnterGameRequest{ |
||||
Uname: common.GetProviderUserName(fmt.Sprintf("%d", uid)), |
||||
GameID: game.GameCode, |
||||
Token: common.GetProviderUserToken(token), |
||||
Lang: "pt", |
||||
Nick: "", |
||||
TotalRecharge: rechargeInfo.TotalRecharge / common.DecimalDigits, |
||||
TotalWithdraw: (rechargeInfo.TotalWithdraw + rechargeInfo.TotalWithdrawing) / common.DecimalDigits, |
||||
TotalBet: playerProfile.TotalBet / common.DecimalDigits, |
||||
Balance: balance / common.DecimalDigits, |
||||
} |
||||
body, _ := json.Marshal(request) |
||||
sign := GenerateSign(string(body), timestamp, key) |
||||
headers["X-Game-Sign"] = sign |
||||
// Decode response
|
||||
var response EnterGameResponse |
||||
err := utils.HttpPost(url, request, &response, headers) |
||||
if err != nil { |
||||
log.Error("err:%v", err) |
||||
return "" |
||||
} |
||||
|
||||
return response.Data.GameURL |
||||
} |
||||
@ -1,164 +0,0 @@ |
||||
package pg3 |
||||
|
||||
import ( |
||||
"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 PG(e *gin.RouterGroup) { |
||||
e.POST("/VerifySession", VerifySession) |
||||
e.POST("/Cash/Get", GetPlayerBalance) |
||||
e.POST("/Cash/Bet", PlaceBet) |
||||
} |
||||
|
||||
func GetGameID(providerID int, gameCode string) int { |
||||
game := call.GetConfigGameListByCode(providerID, gameCode) |
||||
if game != nil { |
||||
return game.GameID |
||||
} |
||||
return 0 |
||||
} |
||||
|
||||
func VerifySession(c *gin.Context) { |
||||
a := app.NewApp(c) |
||||
defer func() { |
||||
a.ResponseB() |
||||
}() |
||||
req := &VerifySessionReq{} |
||||
resp := &VerifySessionResp{} |
||||
a.RetData = resp |
||||
if !a.SB(req) { |
||||
resp.Code = ErrCodeInternalError |
||||
return |
||||
} |
||||
log.Debug("VerifySession req:%+v", req) |
||||
|
||||
if a.ShouldRoute(req, "Uname", common.ProviderAPITypeJson) { |
||||
return |
||||
} |
||||
|
||||
uid, err := strconv.Atoi(req.Uname) |
||||
if err != nil { |
||||
log.Error("err:%v", err) |
||||
resp.Code = ErrCodePlayerNotFound |
||||
return |
||||
} |
||||
|
||||
currency, err := db.Redis().GetInt(common.GetRedisKeyGameCurrency(uid)) |
||||
if err != nil { |
||||
log.Error("err:%v", err) |
||||
resp.Code = ErrCodeInternalError |
||||
return |
||||
} |
||||
|
||||
resp.Data.Balance = call.GetUserCurrencyFloat(uid, common.CurrencyType(currency), 2) |
||||
|
||||
a.Data = resp |
||||
} |
||||
|
||||
func GetPlayerBalance(c *gin.Context) { |
||||
a := app.NewApp(c) |
||||
defer func() { |
||||
a.ResponseB() |
||||
}() |
||||
req := &GetBalanceRequest{} |
||||
resp := &GetBalanceResponse{} |
||||
a.RetData = resp |
||||
if !a.SB(req) { |
||||
resp.Code = ErrCodeInternalError |
||||
return |
||||
} |
||||
log.Debug("GetPlayerBalance req:%+v", req) |
||||
|
||||
if a.ShouldRoute(req, "Uname", common.ProviderAPITypeJson) { |
||||
return |
||||
} |
||||
|
||||
uid, err := strconv.Atoi(req.Uname) |
||||
if err != nil { |
||||
log.Error("err:%v", err) |
||||
resp.Code = ErrCodePlayerNotFound |
||||
return |
||||
} |
||||
|
||||
currency, err := db.Redis().GetInt(common.GetRedisKeyGameCurrency(uid)) |
||||
if err != nil { |
||||
log.Error("err:%v", err) |
||||
resp.Code = ErrCodeInternalError |
||||
return |
||||
} |
||||
resp.Data.Uname = req.Uname |
||||
resp.Data.Balance = call.GetUserCurrencyFloat(uid, common.CurrencyType(currency), 2) |
||||
a.Data = resp |
||||
|
||||
log.Debug("GetPlayerBalance resp:%+v", resp) |
||||
} |
||||
|
||||
func PlaceBet(c *gin.Context) { |
||||
a := app.NewApp(c) |
||||
defer func() { |
||||
a.ResponseB() |
||||
}() |
||||
req := &PlaceBetRequest{} |
||||
resp := &PlaceBetResponse{} |
||||
a.RetData = resp |
||||
if !a.SB(req) { |
||||
resp.Code = ErrCodeInternalError |
||||
return |
||||
} |
||||
log.Debug("PlaceBet:%+v", req) |
||||
|
||||
if a.ShouldRoute(req, "Token", common.ProviderAPITypeJson) { |
||||
return |
||||
} |
||||
|
||||
// 验证token
|
||||
uid, _ := db.Redis().GetInt(common.GetRedisKeyToken(req.Token)) |
||||
if uid == 0 { |
||||
resp.Code = ErrCodePlayerNotFound |
||||
return |
||||
} |
||||
|
||||
provider := call.GetConfigGameProvider(common.ProviderPG2) |
||||
now := time.Now().Unix() |
||||
if req.Bet != 0 || req.Award != 0 { |
||||
betReq := &base.BetReq{ |
||||
UID: uid, |
||||
CurrencyType: common.CurrencyINR, |
||||
BetAmount: int64(req.Bet * common.DecimalDigits), |
||||
TurnOver: int64(req.Bet * common.DecimalDigits), |
||||
SettleAmount: int64(req.Award * common.DecimalDigits), |
||||
SessionType: common.SessionTypeSettle, |
||||
GameID: GetGameID(common.ProviderPG2, req.GameID), |
||||
GameName: req.GameID, |
||||
Provider: provider, |
||||
BetID: req.BetID, |
||||
SessionID: req.SessionID, |
||||
Time: now, |
||||
} |
||||
betResp := base.SessionBet(betReq) |
||||
if betResp.Code != base.CodeOk { |
||||
resp.Code = ErrCodeInternalError |
||||
if betResp.Code == base.CodeAccepted { |
||||
resp.Code = ErrCodeInternalError |
||||
} else if betResp.Code == base.CodeNotEnoughAmount { |
||||
resp.Code = ErrCodeInsufficientBal |
||||
} |
||||
return |
||||
} |
||||
resp.Data.Balance = util.Decimal(float64(betResp.Balance)/common.DecimalDigits, 2) |
||||
} else { |
||||
resp.Data.Balance = util.Decimal(float64(call.GetUserCurrency(uid, common.CurrencyINR))/common.DecimalDigits, 2) |
||||
} |
||||
|
||||
a.Data = resp |
||||
} |
||||
@ -1,17 +0,0 @@ |
||||
package pg3 |
||||
|
||||
import ( |
||||
"crypto/md5" |
||||
"encoding/hex" |
||||
"strconv" |
||||
"strings" |
||||
|
||||
"github.com/liangdas/mqant/log" |
||||
) |
||||
|
||||
func GenerateSign(body string, timestamp int64, key string) string { |
||||
data := body + strconv.FormatInt(timestamp, 10) + key |
||||
log.Info("data:%v", data) |
||||
hash := md5.Sum([]byte(data)) |
||||
return strings.ToUpper(hex.EncodeToString(hash[:])) |
||||
} |
||||
@ -1,27 +0,0 @@ |
||||
package pg3 |
||||
|
||||
const ( |
||||
APIRlease = "https://pggame.ux7k.com" |
||||
APITest = "https://pggame.1iibet.com" |
||||
LaunchGameURL = "/api/usr/ingame" |
||||
GetGameListURL = "/api/game/loadlist" |
||||
Lang = "en" |
||||
) |
||||
|
||||
type Agent struct { |
||||
MchId string `json:"mch_id"` |
||||
Key string `json:"key"` |
||||
} |
||||
|
||||
var ( |
||||
API = "" |
||||
AgentMap Agent |
||||
AgentMapTest = Agent{ |
||||
"10025", |
||||
"12DD45A2758A9AEA0224DB8B7F8A36E3", |
||||
} |
||||
AgentMapRelease = Agent{ |
||||
"10001", |
||||
"E21B1CFF68CD984C6ADB25554BAF16C3", |
||||
} |
||||
) |
||||
Loading…
Reference in new issue