diff --git a/mgrsrv/api/webapi_worldsrv.go b/mgrsrv/api/webapi_worldsrv.go index f5a48cf..cc232e2 100644 --- a/mgrsrv/api/webapi_worldsrv.go +++ b/mgrsrv/api/webapi_worldsrv.go @@ -6,6 +6,7 @@ import ( "encoding/json" "fmt" "io" + "mongo.games.com/game/webapi" "net/http" "sync" "sync/atomic" @@ -29,6 +30,7 @@ import ( const ( WEBAPI_TRANSACTE_EVENT int = iota WEBAPI_TRANSACTE_RESPONSE + PLATFORMAPPKEY = "PLATFORMAPPKEYtest123" ) var WebApiStats = new(sync.Map) @@ -139,6 +141,97 @@ func WorldSrvApi(rw http.ResponseWriter, req *http.Request) { return } +func PlatformSrvApi(rw http.ResponseWriter, req *http.Request) { + defer utils.DumpStackIfPanic("api.PlatformSrvApi") + logger.Logger.Info("PlatformSrvApi receive:", req.URL.Path, req.URL.RawQuery) + + if common.RequestCheck(req, model.GameParamData.WhiteHttpAddr) == false { + logger.Logger.Info("RemoteAddr [%v] require api.", req.RemoteAddr) + return + } + data, err := io.ReadAll(req.Body) + if err != nil { + logger.Logger.Info("Body err.", err) + webApiResponse(rw, nil /*map[string]interface{}{webapi.RESPONSE_STATE: webapi.STATE_ERR, webapi.RESPONSE_ERRMSG: "Post data is null!"}*/) + return + } + + params := make(map[string]string) + json.Unmarshal(data, ¶ms) + + realSign := webapi.MD5Params(params, PLATFORMAPPKEY, "sign") + + sign := params["sign"] + if realSign != sign { + logger.Logger.Info(req.RemoteAddr, " srvCtrlMain sign error: expect ", realSign, " ; but get ", sign, " raw=", params) + webApiResponse(rw, nil /*map[string]interface{}{webapi.RESPONSE_STATE: webapi.STATE_ERR, webapi.RESPONSE_ERRMSG: "Sign error!"}*/) + return + } + + startTime := time.Now().UnixNano() + + var stats *ApiStats + if v, exist := WebApiStats.Load(req.URL.Path); exist { + stats = v.(*ApiStats) + } else { + stats = &ApiStats{} + WebApiStats.Store(req.URL.Path, stats) + } + var rep []byte + start := time.Now() + res := make(chan []byte, 1) + suc := core.CoreObject().SendCommand(&WebApiEvent{req: req, path: req.URL.Path, h: HandlerWrapper(func(event *WebApiEvent, data []byte) bool { + logger.Logger.Trace("WorldSrvApi start transcate") + tnp := &transact.TransNodeParam{ + Tt: common.TransTypeWebApi, + Ot: transact.TransOwnerType(common.GetSelfSrvType()), + Oid: common.GetSelfSrvId(), + AreaID: common.GetSelfAreaId(), + } + tNode := transact.DTCModule.StartTrans(tnp, event, transact.DefaultTransactTimeout) //超时时间30秒 + if tNode != nil { + tNode.TransEnv.SetField(WEBAPI_TRANSACTE_EVENT, event) + tNode.Go(core.CoreObject()) + } + return true + }), body: data, rawQuery: req.URL.RawQuery, res: res}, false) + if suc { + select { + case rep = <-res: + if rep != nil { + webApiResponse(rw, rep) + } + case <-time.After(ApiDefaultTimeout): + //rep = make(map[string]interface{}) + //rep[webapi.RESPONSE_STATE] = webapi.STATE_ERR + //rep[webapi.RESPONSE_ERRMSG] = "proccess timeout!" + webApiResponse(rw, rep) + if stats != nil { + atomic.AddInt64(&stats.TimeoutTimes, 1) + } + } + } else { + webApiResponse(rw, nil) + if stats != nil { + atomic.AddInt64(&stats.UnreachTimes, 1) + } + } + ps := int64(time.Now().Sub(start) / time.Millisecond) + if stats != nil { + atomic.AddInt64(&stats.RunTimes, 1) + atomic.AddInt64(&stats.TotalRuningTime, ps) + if atomic.LoadInt64(&stats.MaxRuningTime) < ps { + atomic.StoreInt64(&stats.MaxRuningTime, ps) + } + } + result, err := json.Marshal(rep) + if err == nil { + log := model.NewAPILog(req.URL.Path, req.URL.RawQuery, string(data[:]), req.RemoteAddr, string(result[:]), startTime, ps) + mq.Write(log) + } + return +} + // -------------------------------------------------------------------------------------- func init() { transact.RegisteHandler(common.TransTypeWebApi, &transact.TransHanderWrapper{ @@ -262,6 +355,10 @@ func init() { admin.MyAdminApp.Route("/api/game/exchange_create", WorldSrvApi) // 兑换订单列表 admin.MyAdminApp.Route("/api/game/exchange_order", WorldSrvApi) + + // 平台玩家注册账号 + admin.MyAdminApp.Route("/api/platform/createUser", PlatformSrvApi) + } func Stats() map[string]ApiStats { diff --git a/webapi/sign.go b/webapi/sign.go index 2b6d0c0..0797421 100644 --- a/webapi/sign.go +++ b/webapi/sign.go @@ -5,6 +5,7 @@ import ( "bytes" "crypto/md5" "encoding/hex" + "fmt" "io" "net/url" "sort" @@ -65,3 +66,33 @@ func MakeMd5String(strs ...string) string { } return hex.EncodeToString(buff.Sum(nil)) } + +func StringToMD5(waitMD5string string) string { + h := md5.New() + h.Write([]byte(waitMD5string)) + cipherStr := h.Sum(nil) + + return hex.EncodeToString(cipherStr) +} + +func MD5Params(params map[string]string, key string, filter string) string { + // 将请求参数的key提取出来,并排好序 + newKeys := make([]string, 0) + for k, _ := range params { + //需要过滤的签名 + if k == filter { + continue + } + newKeys = append(newKeys, k) + } + sort.Strings(newKeys) + var originStr string + // 将输入进行标准化的处理 + for _, v := range newKeys { + originStr += fmt.Sprintf("%v=%v&", v, params[v]) + } + originStr += fmt.Sprintf("key=%v", key) + // 使用md5算法进行处理 + sign := StringToMD5(originStr) + return sign +} diff --git a/worldsrv/task_login.go b/worldsrv/task_login.go index 2840aa3..cdb4f2d 100644 --- a/worldsrv/task_login.go +++ b/worldsrv/task_login.go @@ -40,6 +40,9 @@ func (t *TaskLogin) Call(o *basic.Object) interface{} { var playerData *model.PlayerData acc, retCode := model.AccountIsExist(t.GetUsername(), t.GetUsername(), t.GetPassword(), t.GetPlatform(), t.GetTimeStamp(), t.GetLoginType(), t.tagkey, false, t.codeValid) + + // token验证 + switch retCode { case common.LoginOk: t.flag = login_proto.OpResultCode_OPRC_Sucess diff --git a/worldsrv/trascate_webapi.go b/worldsrv/trascate_webapi.go index 9a6fb83..d89bf4d 100644 --- a/worldsrv/trascate_webapi.go +++ b/worldsrv/trascate_webapi.go @@ -2978,6 +2978,42 @@ func init() { }), "exchange_create").Start() return common.ResponseTag_TransactYield, pack })) + + WebAPIHandlerMgrSingleton.RegisteWebAPIHandler("/api/platform/createUse", WebAPIHandlerWrapper( + func(tNode *transact.TransNode, params []byte) (int, proto.Message) { + pack := &webapiproto.SAGetExchangeOrder{ + Tag: webapiproto.TagCode_FAILED, + } + msg := &webapiproto.ASGetExchangeOrder{} + var err error + err = proto.Unmarshal(params, msg) + if err != nil { + pack.Tag = webapiproto.TagCode_FAILED + logger.Logger.Errorf("/api/game/exchange_order Unmarshal err: %v", err) + return common.ResponseTag_ParamError, pack + } + + logger.Logger.Tracef("/api/game/exchange_order %v", msg) + + var b []byte + task.New(nil, task.CallableWrapper(func(o *basic.Object) interface{} { + b, err = webapi.API_ExchangeRecord(common.GetAppId(), msg) + return nil + }), task.CompleteNotifyWrapper(func(i interface{}, t task.Task) { + if err != nil || b == nil { + logger.Logger.Errorf("/api/game/exchange_order API_ExchangeList err: %v", err) + pack.Tag = webapiproto.TagCode_FAILED + } else { + err = proto.Unmarshal(b, pack) + if err != nil { + logger.Logger.Errorf("/api/game/exchange_order Unmarshal err: %v", err) + } + } + tNode.TransRep.RetFiels = pack + tNode.Resume() + }), "/api/game/exchange_order").Start() + return common.ResponseTag_TransactYield, pack + })) } type playerDataParam struct {