Commit 8b9ba965295fc094d0bd34ac04a16a96a93ee658

Authored by 王家文
1 parent b0cb5864
Exists in master and in 1 other branch dev-wjw

refactor♻️:项目目录重构

controllers/base.go
1 package controllers 1 package controllers
2 2
3 import ( 3 import (
  4 + "apigame/middleware/sign"
4 "apigame/service/constd" 5 "apigame/service/constd"
5 - "apigame/sign"  
6 "encoding/json" 6 "encoding/json"
7 "github.com/astaxie/beego" 7 "github.com/astaxie/beego"
8 ) 8 )
middleware/sdk/sdk.go 0 → 100644
@@ -0,0 +1,155 @@ @@ -0,0 +1,155 @@
  1 +package sdk
  2 +
  3 +import (
  4 + "apigame/util/util-lx/lxalilog"
  5 + "apigame/util/util-lx/lxbeego"
  6 + "apigame/util/util-lx/lxredis"
  7 + "encoding/json"
  8 + "errors"
  9 + "fmt"
  10 + "strings"
  11 +
  12 + "github.com/astaxie/beego"
  13 +)
  14 +
  15 +type MapSdkTokenRet struct {
  16 + Code string `json:"code"`
  17 + Data struct {
  18 + Ttl int `json:"ttl"`
  19 + } `json:"data"`
  20 + Msg string `json:"msg"`
  21 +}
  22 +
  23 +type MapSDKMemberInfo struct {
  24 + Code string `json:"code"`
  25 + Data struct {
  26 + Uid int64 `json:"uid"`
  27 + Channel string `json:"channel"`
  28 + Scene string `json:"scene"`
  29 + Openid string `json:"openid"`
  30 + Unionid string `json:"unionid"`
  31 + Nickname string `json:"nickname"`
  32 + Headurl string `json:"headurl"`
  33 + Sex int `json:"sex"`
  34 + Shareuid int64 `json:"shareuid"`
  35 + Status int `json:"status"`
  36 + FirstLogin string `json:"first_login"`
  37 + Logindays int `json:"logindays"`
  38 + CreateTime int64 `json:"create_time"`
  39 + LastloginTime int64 `json:"lastlogin_time"`
  40 + UpdateTime int64 `json:"update_time"`
  41 + } `json:"data"`
  42 + Msg string `json:"msg"`
  43 +}
  44 +
  45 +func ckecklocaldb(gameid string, uid int64, token string) (err error) {
  46 +
  47 + _redis := lxredis.LXredis{
  48 + Name: fmt.Sprintf("token::%s::%d", gameid, uid),
  49 + Db: beego.AppConfig.String("redis::sdkdb"),
  50 + Prefix: beego.AppConfig.String("redis::sdkprefix"),
  51 + }
  52 +
  53 + tstr, err := _redis.GET()
  54 + if err != nil {
  55 + lxalilog.Errors(err, "_redis GET:")
  56 + return
  57 + }
  58 +
  59 + if tstr == "" {
  60 + err = errors.New("tsrt")
  61 + lxalilog.Errors(err, "tstr empty:")
  62 + return
  63 + }
  64 +
  65 + redistoken := strings.Split(tstr, "|")[0]
  66 + if redistoken != token {
  67 + err = errors.New("token error")
  68 + lxalilog.Errors(err, "redistoken:", redistoken, ",token:", token)
  69 + return
  70 + }
  71 +
  72 + return
  73 +}
  74 +
  75 +// 验证SDKtoken
  76 +func CheckSdkToken(gameid string, uid int64, token string) (err error) {
  77 +
  78 + if uid == 99 || token == "fb0ba80fad895664c7aea7c8ce462505" {
  79 + return
  80 + }
  81 +
  82 + return ckecklocaldb(gameid, uid, token)
  83 +
  84 + // var (
  85 + // gconfig = service_config.GetGameConfigByGameID(gameid)
  86 + // apiurl = beego.AppConfig.String("sdk::checktoken") + gconfig.Appkey
  87 + // )
  88 +
  89 + // content, httpcode, err := lurl.PostBody(apiurl, map[string]interface{}{
  90 + // "gameid": gameid,
  91 + // "uid": uid,
  92 + // "token": token,
  93 + // })
  94 +
  95 + // if err != nil {
  96 + // lxalilog.Errors("lurl.PostBody error:", err, gameid, uid, token)
  97 + // return
  98 + // }
  99 +
  100 + // if httpcode != 200 {
  101 + // err = errors.New("httpcode!= 200")
  102 + // lxalilog.Errors("httpcode error:", err, gameid, uid, token, httpcode)
  103 + // return
  104 + // }
  105 +
  106 + // var ret MapSdkTokenRet
  107 + // err = json.Unmarshal(content, &ret)
  108 + // if err != nil {
  109 + // lxalilog.Errors("json.Unmarshal error:", err, gameid, uid, token, string(content))
  110 + // return
  111 + // }
  112 +
  113 + // if ret.Code != "0" {
  114 + // err = errors.New("ret.Code != 0")
  115 + // lxalilog.Errors(err, gameid, uid, token, string(content))
  116 + // return
  117 + // }
  118 +
  119 + // return
  120 +}
  121 +
  122 +// 获取SDK用户信息
  123 +func GetSdkMemberInfo(gameid string, uid int64) (member MapSDKMemberInfo, err error) {
  124 +
  125 + var (
  126 + apiurl = fmt.Sprintf("%s?gameid=%s&uid=%d", beego.AppConfig.String("sdk::getmemberinfo"), gameid, uid)
  127 + )
  128 +
  129 + content, httpcode, err := lxbeego.Get(apiurl)
  130 +
  131 + if err != nil {
  132 + lxalilog.Errors("lxbeego.lxbeego error:", err, apiurl)
  133 + return
  134 + }
  135 +
  136 + if httpcode != 200 {
  137 + err = errors.New("httpcode!= 200")
  138 + lxalilog.Errors("httpcode error:", err, apiurl)
  139 + return
  140 + }
  141 +
  142 + err = json.Unmarshal(content, &member)
  143 + if err != nil {
  144 + lxalilog.Errors("json.Unmarshal error:", err, apiurl, string(content))
  145 + return
  146 + }
  147 +
  148 + if member.Code != "0" {
  149 + err = errors.New("ret.Code != 0")
  150 + lxalilog.Errors(err, apiurl, string(content))
  151 + return
  152 + }
  153 +
  154 + return
  155 +}
middleware/sign/index.go 0 → 100644
@@ -0,0 +1,309 @@ @@ -0,0 +1,309 @@
  1 +package sign
  2 +
  3 +import (
  4 + "apigame/api-common/config"
  5 + "apigame/middleware/sdk"
  6 + "apigame/service/constd"
  7 + "apigame/util/util-lx/lxalilog"
  8 + "apigame/util/util-lx/lxarray"
  9 + "apigame/util/util-lx/lxconv"
  10 + "apigame/util/util-lx/lxlimit"
  11 + "apigame/util/util-lx/lxtime"
  12 + "encoding/json"
  13 + "errors"
  14 + "fmt"
  15 +
  16 + "sort"
  17 + "strings"
  18 + "unicode/utf8"
  19 +
  20 + "github.com/astaxie/beego/validation"
  21 +)
  22 +
  23 +type MCheckConfig struct {
  24 + CheckUrlGameID bool
  25 + CheckToken bool
  26 + CheckSign bool
  27 + FunName string
  28 + Bodys []byte
  29 + Ip lxlimit.MFuncItem `json:"ip"`
  30 + Kernel lxlimit.MFuncItem `json:"kernel"`
  31 + Member lxlimit.MFuncItem `json:"member"`
  32 + Url string `json:"url"`
  33 + Params map[string]string `json:"params"`
  34 +}
  35 +
  36 +func getTimeStamp(time_stamp interface{}) (timestamp int64) {
  37 + if time_stamp == nil {
  38 + return
  39 + }
  40 +
  41 + tsp := ""
  42 +
  43 + switch tp := time_stamp.(type) {
  44 + case string:
  45 + tsp = fmt.Sprintf("%s", tp)
  46 + }
  47 +
  48 + if tsp == "" {
  49 + return
  50 + }
  51 +
  52 + timestamp = lxconv.ParseInt64(tsp)
  53 + lth := utf8.RuneCountInString(tsp)
  54 + if lth > 10 {
  55 + timestamp = timestamp / 1000
  56 + }
  57 +
  58 + return
  59 +
  60 +}
  61 +
  62 +func InitCheck(postdata interface{}, cgg MCheckConfig) (code string, gameconfig config.MApiGameConfig, err error) {
  63 +
  64 + var (
  65 + postGameId string
  66 + urlGameId string
  67 + ty string
  68 + c lxlimit.MFuncConfig
  69 + nowtime = lxtime.NowUninx()
  70 + time_stamp int64
  71 + JG = int64(2)
  72 + )
  73 +
  74 + // 检查时间戳
  75 + tempData := make(map[string]interface{})
  76 + _ = json.Unmarshal(cgg.Bodys, &tempData)
  77 +
  78 + time_stamp = getTimeStamp(tempData["time_stamp"])
  79 + if time_stamp < (nowtime-JG) || time_stamp > (nowtime+JG) {
  80 + code = constd.RECODE_REQUESTTIME_ERROR
  81 + err = errors.New(code)
  82 + lxalilog.Errors("RECODE_REQUESTTIME_ERROR error:", string(cgg.Bodys))
  83 + return
  84 + }
  85 +
  86 + c.Ip = cgg.Ip
  87 + c.Kernel = cgg.Kernel
  88 + c.Params = cgg.Params
  89 + c.Url = cgg.Url
  90 + c.BodyBy = cgg.Bodys
  91 + if cgg.FunName == "" {
  92 + c.FunName = c.Url
  93 + }
  94 + c.Member = cgg.Member
  95 +
  96 + for k, v := range c.Params {
  97 + if k == ":gameid" {
  98 + urlGameId = v
  99 + }
  100 + }
  101 +
  102 + if cgg.CheckUrlGameID && urlGameId == "" {
  103 + code = constd.RECODE_PARAMERROR
  104 + err = errors.New(code)
  105 + lxalilog.Errors("urlGameid error:")
  106 + return
  107 + }
  108 +
  109 + postGameId, ty = lxlimit.CheckLimit(c)
  110 +
  111 + if cgg.CheckUrlGameID && postGameId != urlGameId {
  112 + code = constd.RECODE_PARAMERROR
  113 + err = errors.New(code)
  114 + lxalilog.Errors("urlGameid !=postGameId:", urlGameId, postdata)
  115 + return
  116 + }
  117 +
  118 + if ty != "" {
  119 + code = constd.RECODE_REQUESTXIANLIU_ERROR
  120 + err = errors.New(ty)
  121 + return
  122 + }
  123 +
  124 + err = json.Unmarshal(cgg.Bodys, &postdata)
  125 + if err != nil {
  126 + code = constd.RECODE_PARAMERROR
  127 + lxalilog.Errors("json.Unmarshal error:", err, string(cgg.Bodys))
  128 + return
  129 + }
  130 +
  131 + valid := validation.Validation{}
  132 +
  133 + var b bool
  134 +
  135 + b, err = valid.Valid(postdata)
  136 + if err != nil {
  137 + code = constd.RECODE_PARAMERROR
  138 + lxalilog.Errors("valid.Valid error:", err, string(cgg.Bodys), valid.Errors)
  139 + return
  140 + }
  141 +
  142 + if !b {
  143 + code = constd.RECODE_PARAMERROR
  144 + err = errors.New(code)
  145 + lxalilog.Errors("valid.Valid error:", err, string(cgg.Bodys), valid.Errors)
  146 + return
  147 + }
  148 +
  149 + if cgg.CheckSign {
  150 + code, gameconfig, err = CheckSign(postdata, cgg.CheckToken)
  151 + if err != nil {
  152 + return
  153 + }
  154 + }
  155 +
  156 + return
  157 +}
  158 +
  159 +// Check 检查签名
  160 +func Check(req []byte, postdata interface{}, checkSign bool, checkToken bool) (code string, err error) {
  161 +
  162 + err = json.Unmarshal(req, &postdata)
  163 + if err != nil {
  164 + code = constd.RECODE_PARAMERROR
  165 + lxalilog.Errors("json.Unmarshal error:", err, string(req))
  166 + return
  167 + }
  168 +
  169 + valid := validation.Validation{}
  170 +
  171 + var b bool
  172 +
  173 + b, err = valid.Valid(postdata)
  174 + if err != nil {
  175 + code = constd.RECODE_PARAMERROR
  176 + lxalilog.Errors("valid.Valid error:", err, string(req), valid.Errors)
  177 + return
  178 + }
  179 +
  180 + if !b {
  181 + code = constd.RECODE_PARAMERROR
  182 + err = errors.New(code)
  183 + lxalilog.Errors("valid.Valid error:", err, string(req), valid.Errors)
  184 + return
  185 + }
  186 +
  187 + if checkSign {
  188 + code, _, err = CheckSign(postdata, checkToken)
  189 + if err != nil {
  190 + return
  191 + }
  192 + }
  193 +
  194 + return
  195 +}
  196 +
  197 +// CheckSign 校验签名
  198 +func CheckSign(data interface{}, checkToken bool) (code string, gameconfig config.MApiGameConfig, err error) {
  199 +
  200 + var (
  201 + logstr string
  202 + )
  203 +
  204 + jsonBody, _ := json.Marshal(data)
  205 +
  206 + logstr += string(jsonBody)
  207 +
  208 + var newdata = make(map[string]interface{})
  209 +
  210 + err = json.Unmarshal(jsonBody, &newdata)
  211 + if err != nil {
  212 + code = constd.RECODE_SIGNERROR
  213 + lxalilog.Errors("json.Unmarshal error:", err)
  214 + return
  215 + }
  216 +
  217 + if newdata["gameid"] == "" || newdata["channel"] == "" || newdata["sign"] == "" || newdata["sign_type"] == "" || newdata["time_stamp"] == "" || newdata["ver"] == "" {
  218 + code = constd.RECODE_SIGNERROR
  219 + err = errors.New("签名错误,参数错误" + logstr)
  220 + lxalilog.Errors(err)
  221 + return
  222 + }
  223 +
  224 + gameid := newdata["gameid"].(string)
  225 +
  226 + gameconfig, err = config.GetApiGameConfig(gameid)
  227 + if err != nil {
  228 + lxalilog.Errors(err)
  229 + return
  230 + }
  231 +
  232 + if newdata["sign"].(string) == "fb0ba80fad895664c7aea7c8ce462505" {
  233 + return
  234 + }
  235 +
  236 + appkey := gameconfig.Appkey
  237 +
  238 + if appkey == "" {
  239 + code = constd.RECODE_SIGNERROR
  240 + err = errors.New("签名错误,参数错误" + gameid + "no appkey")
  241 + lxalilog.Errors(err)
  242 + return
  243 + }
  244 +
  245 + sign := newdata["sign"]
  246 +
  247 + sortdata := make([]string, 0, len(newdata))
  248 +
  249 + fiterword := "and|exec|insert|select|delete|update|count|master|truncate|declare|char(|mid(|chr(|'"
  250 + fiterwords := strings.Split(fiterword, "|")
  251 + var fiterkey []interface{}
  252 +
  253 + for k, v := range newdata {
  254 + newv := lxconv.InterfaceToStr(v)
  255 +
  256 + if b := lxarray.InArray(newv, fiterwords); b {
  257 + fiterkey = append(fiterkey, k)
  258 + }
  259 + if newv != "" && newv != "0" && k != "sign" && k != "ver" && k != "dev" && k != "dever" && k != "pkv" {
  260 + sortdata = append(sortdata, k)
  261 + }
  262 + }
  263 +
  264 + if len(fiterkey) > 0 {
  265 + code = constd.RECODE_WEIXINAZIFU_ERROR
  266 + err = errors.New("fiterkey error" + logstr)
  267 + lxalilog.Errors(err, lxconv.JsonEncode(fiterkey), "data:", lxconv.JsonEncode(newdata))
  268 + return
  269 + }
  270 +
  271 + sort.Strings(sortdata)
  272 + valstr := ""
  273 + for _, k := range sortdata { // 先下标,再数值
  274 + v := lxconv.InterfaceToStr(newdata[k])
  275 + valstr += k + "=" + v
  276 + }
  277 +
  278 + valstr += appkey
  279 +
  280 + logstr += ",valstr:(" + valstr + ")"
  281 +
  282 + md5key := strings.ToLower(lxconv.EncryMD5(valstr))
  283 +
  284 + if md5key != sign {
  285 + code = constd.RECODE_SIGNERROR
  286 + err = errors.New(code)
  287 + lxalilog.Errors("sign error,md5key::", md5key, ",sign:", sign, logstr, "data:", lxconv.JsonEncode(newdata))
  288 + return
  289 + }
  290 +
  291 + if checkToken {
  292 +
  293 + if newdata["uid"] == nil || newdata["token"] == nil {
  294 + code = constd.RECODE_PARAMERROR
  295 + err = errors.New(code)
  296 + lxalilog.Errors("no uid or token", "data:", lxconv.JsonEncode(newdata))
  297 + return
  298 + }
  299 +
  300 + err = sdk.CheckSdkToken(gameid, lxconv.ToInt64(newdata["uid"]), lxconv.InterfaceToStr(newdata["token"]))
  301 + if err != nil {
  302 + code = constd.RECODE_LOGINCHECK_ERROR
  303 + return
  304 + }
  305 +
  306 + }
  307 +
  308 + return
  309 +}
sdk/sdk.go
@@ -1,155 +0,0 @@ @@ -1,155 +0,0 @@
1 -package sdk  
2 -  
3 -import (  
4 - "apigame/util/util-lx/lxalilog"  
5 - "apigame/util/util-lx/lxbeego"  
6 - "apigame/util/util-lx/lxredis"  
7 - "encoding/json"  
8 - "errors"  
9 - "fmt"  
10 - "strings"  
11 -  
12 - "github.com/astaxie/beego"  
13 -)  
14 -  
15 -type MapSdkTokenRet struct {  
16 - Code string `json:"code"`  
17 - Data struct {  
18 - Ttl int `json:"ttl"`  
19 - } `json:"data"`  
20 - Msg string `json:"msg"`  
21 -}  
22 -  
23 -type MapSDKMemberInfo struct {  
24 - Code string `json:"code"`  
25 - Data struct {  
26 - Uid int64 `json:"uid"`  
27 - Channel string `json:"channel"`  
28 - Scene string `json:"scene"`  
29 - Openid string `json:"openid"`  
30 - Unionid string `json:"unionid"`  
31 - Nickname string `json:"nickname"`  
32 - Headurl string `json:"headurl"`  
33 - Sex int `json:"sex"`  
34 - Shareuid int64 `json:"shareuid"`  
35 - Status int `json:"status"`  
36 - FirstLogin string `json:"first_login"`  
37 - Logindays int `json:"logindays"`  
38 - CreateTime int64 `json:"create_time"`  
39 - LastloginTime int64 `json:"lastlogin_time"`  
40 - UpdateTime int64 `json:"update_time"`  
41 - } `json:"data"`  
42 - Msg string `json:"msg"`  
43 -}  
44 -  
45 -func ckecklocaldb(gameid string, uid int64, token string) (err error) {  
46 -  
47 - _redis := lxredis.LXredis{  
48 - Name: fmt.Sprintf("token::%s::%d", gameid, uid),  
49 - Db: beego.AppConfig.String("redis::sdkdb"),  
50 - Prefix: beego.AppConfig.String("redis::sdkprefix"),  
51 - }  
52 -  
53 - tstr, err := _redis.GET()  
54 - if err != nil {  
55 - lxalilog.Errors(err, "_redis GET:")  
56 - return  
57 - }  
58 -  
59 - if tstr == "" {  
60 - err = errors.New("tsrt")  
61 - lxalilog.Errors(err, "tstr empty:")  
62 - return  
63 - }  
64 -  
65 - redistoken := strings.Split(tstr, "|")[0]  
66 - if redistoken != token {  
67 - err = errors.New("token error")  
68 - lxalilog.Errors(err, "redistoken:", redistoken, ",token:", token)  
69 - return  
70 - }  
71 -  
72 - return  
73 -}  
74 -  
75 -// 验证SDKtoken  
76 -func CheckSdkToken(gameid string, uid int64, token string) (err error) {  
77 -  
78 - if uid == 99 || token == "fb0ba80fad895664c7aea7c8ce462505" {  
79 - return  
80 - }  
81 -  
82 - return ckecklocaldb(gameid, uid, token)  
83 -  
84 - // var (  
85 - // gconfig = service_config.GetGameConfigByGameID(gameid)  
86 - // apiurl = beego.AppConfig.String("sdk::checktoken") + gconfig.Appkey  
87 - // )  
88 -  
89 - // content, httpcode, err := lurl.PostBody(apiurl, map[string]interface{}{  
90 - // "gameid": gameid,  
91 - // "uid": uid,  
92 - // "token": token,  
93 - // })  
94 -  
95 - // if err != nil {  
96 - // lxalilog.Errors("lurl.PostBody error:", err, gameid, uid, token)  
97 - // return  
98 - // }  
99 -  
100 - // if httpcode != 200 {  
101 - // err = errors.New("httpcode!= 200")  
102 - // lxalilog.Errors("httpcode error:", err, gameid, uid, token, httpcode)  
103 - // return  
104 - // }  
105 -  
106 - // var ret MapSdkTokenRet  
107 - // err = json.Unmarshal(content, &ret)  
108 - // if err != nil {  
109 - // lxalilog.Errors("json.Unmarshal error:", err, gameid, uid, token, string(content))  
110 - // return  
111 - // }  
112 -  
113 - // if ret.Code != "0" {  
114 - // err = errors.New("ret.Code != 0")  
115 - // lxalilog.Errors(err, gameid, uid, token, string(content))  
116 - // return  
117 - // }  
118 -  
119 - // return  
120 -}  
121 -  
122 -// 获取SDK用户信息  
123 -func GetSdkMemberInfo(gameid string, uid int64) (member MapSDKMemberInfo, err error) {  
124 -  
125 - var (  
126 - apiurl = fmt.Sprintf("%s?gameid=%s&uid=%d", beego.AppConfig.String("sdk::getmemberinfo"), gameid, uid)  
127 - )  
128 -  
129 - content, httpcode, err := lxbeego.Get(apiurl)  
130 -  
131 - if err != nil {  
132 - lxalilog.Errors("lxbeego.lxbeego error:", err, apiurl)  
133 - return  
134 - }  
135 -  
136 - if httpcode != 200 {  
137 - err = errors.New("httpcode!= 200")  
138 - lxalilog.Errors("httpcode error:", err, apiurl)  
139 - return  
140 - }  
141 -  
142 - err = json.Unmarshal(content, &member)  
143 - if err != nil {  
144 - lxalilog.Errors("json.Unmarshal error:", err, apiurl, string(content))  
145 - return  
146 - }  
147 -  
148 - if member.Code != "0" {  
149 - err = errors.New("ret.Code != 0")  
150 - lxalilog.Errors(err, apiurl, string(content))  
151 - return  
152 - }  
153 -  
154 - return  
155 -}  
sign/index.go
@@ -1,309 +0,0 @@ @@ -1,309 +0,0 @@
1 -package sign  
2 -  
3 -import (  
4 - "apigame/api-common/config"  
5 - "apigame/sdk"  
6 - "apigame/service/constd"  
7 - "apigame/util/util-lx/lxalilog"  
8 - "apigame/util/util-lx/lxarray"  
9 - "apigame/util/util-lx/lxconv"  
10 - "apigame/util/util-lx/lxlimit"  
11 - "apigame/util/util-lx/lxtime"  
12 - "encoding/json"  
13 - "errors"  
14 - "fmt"  
15 -  
16 - "sort"  
17 - "strings"  
18 - "unicode/utf8"  
19 -  
20 - "github.com/astaxie/beego/validation"  
21 -)  
22 -  
23 -type MCheckConfig struct {  
24 - CheckUrlGameID bool  
25 - CheckToken bool  
26 - CheckSign bool  
27 - FunName string  
28 - Bodys []byte  
29 - Ip lxlimit.MFuncItem `json:"ip"`  
30 - Kernel lxlimit.MFuncItem `json:"kernel"`  
31 - Member lxlimit.MFuncItem `json:"member"`  
32 - Url string `json:"url"`  
33 - Params map[string]string `json:"params"`  
34 -}  
35 -  
36 -func getTimeStamp(time_stamp interface{}) (timestamp int64) {  
37 - if time_stamp == nil {  
38 - return  
39 - }  
40 -  
41 - tsp := ""  
42 -  
43 - switch tp := time_stamp.(type) {  
44 - case string:  
45 - tsp = fmt.Sprintf("%s", tp)  
46 - }  
47 -  
48 - if tsp == "" {  
49 - return  
50 - }  
51 -  
52 - timestamp = lxconv.ParseInt64(tsp)  
53 - lth := utf8.RuneCountInString(tsp)  
54 - if lth > 10 {  
55 - timestamp = timestamp / 1000  
56 - }  
57 -  
58 - return  
59 -  
60 -}  
61 -  
62 -func InitCheck(postdata interface{}, cgg MCheckConfig) (code string, gameconfig config.MApiGameConfig, err error) {  
63 -  
64 - var (  
65 - postGameId string  
66 - urlGameId string  
67 - ty string  
68 - c lxlimit.MFuncConfig  
69 - nowtime = lxtime.NowUninx()  
70 - time_stamp int64  
71 - JG = int64(2)  
72 - )  
73 -  
74 - // 检查时间戳  
75 - tempData := make(map[string]interface{})  
76 - _ = json.Unmarshal(cgg.Bodys, &tempData)  
77 -  
78 - time_stamp = getTimeStamp(tempData["time_stamp"])  
79 - if time_stamp < (nowtime-JG) || time_stamp > (nowtime+JG) {  
80 - code = constd.RECODE_REQUESTTIME_ERROR  
81 - err = errors.New(code)  
82 - lxalilog.Errors("RECODE_REQUESTTIME_ERROR error:", string(cgg.Bodys))  
83 - return  
84 - }  
85 -  
86 - c.Ip = cgg.Ip  
87 - c.Kernel = cgg.Kernel  
88 - c.Params = cgg.Params  
89 - c.Url = cgg.Url  
90 - c.BodyBy = cgg.Bodys  
91 - if cgg.FunName == "" {  
92 - c.FunName = c.Url  
93 - }  
94 - c.Member = cgg.Member  
95 -  
96 - for k, v := range c.Params {  
97 - if k == ":gameid" {  
98 - urlGameId = v  
99 - }  
100 - }  
101 -  
102 - if cgg.CheckUrlGameID && urlGameId == "" {  
103 - code = constd.RECODE_PARAMERROR  
104 - err = errors.New(code)  
105 - lxalilog.Errors("urlGameid error:")  
106 - return  
107 - }  
108 -  
109 - postGameId, ty = lxlimit.CheckLimit(c)  
110 -  
111 - if cgg.CheckUrlGameID && postGameId != urlGameId {  
112 - code = constd.RECODE_PARAMERROR  
113 - err = errors.New(code)  
114 - lxalilog.Errors("urlGameid !=postGameId:", urlGameId, postdata)  
115 - return  
116 - }  
117 -  
118 - if ty != "" {  
119 - code = constd.RECODE_REQUESTXIANLIU_ERROR  
120 - err = errors.New(ty)  
121 - return  
122 - }  
123 -  
124 - err = json.Unmarshal(cgg.Bodys, &postdata)  
125 - if err != nil {  
126 - code = constd.RECODE_PARAMERROR  
127 - lxalilog.Errors("json.Unmarshal error:", err, string(cgg.Bodys))  
128 - return  
129 - }  
130 -  
131 - valid := validation.Validation{}  
132 -  
133 - var b bool  
134 -  
135 - b, err = valid.Valid(postdata)  
136 - if err != nil {  
137 - code = constd.RECODE_PARAMERROR  
138 - lxalilog.Errors("valid.Valid error:", err, string(cgg.Bodys), valid.Errors)  
139 - return  
140 - }  
141 -  
142 - if !b {  
143 - code = constd.RECODE_PARAMERROR  
144 - err = errors.New(code)  
145 - lxalilog.Errors("valid.Valid error:", err, string(cgg.Bodys), valid.Errors)  
146 - return  
147 - }  
148 -  
149 - if cgg.CheckSign {  
150 - code, gameconfig, err = CheckSign(postdata, cgg.CheckToken)  
151 - if err != nil {  
152 - return  
153 - }  
154 - }  
155 -  
156 - return  
157 -}  
158 -  
159 -// Check 检查签名  
160 -func Check(req []byte, postdata interface{}, checkSign bool, checkToken bool) (code string, err error) {  
161 -  
162 - err = json.Unmarshal(req, &postdata)  
163 - if err != nil {  
164 - code = constd.RECODE_PARAMERROR  
165 - lxalilog.Errors("json.Unmarshal error:", err, string(req))  
166 - return  
167 - }  
168 -  
169 - valid := validation.Validation{}  
170 -  
171 - var b bool  
172 -  
173 - b, err = valid.Valid(postdata)  
174 - if err != nil {  
175 - code = constd.RECODE_PARAMERROR  
176 - lxalilog.Errors("valid.Valid error:", err, string(req), valid.Errors)  
177 - return  
178 - }  
179 -  
180 - if !b {  
181 - code = constd.RECODE_PARAMERROR  
182 - err = errors.New(code)  
183 - lxalilog.Errors("valid.Valid error:", err, string(req), valid.Errors)  
184 - return  
185 - }  
186 -  
187 - if checkSign {  
188 - code, _, err = CheckSign(postdata, checkToken)  
189 - if err != nil {  
190 - return  
191 - }  
192 - }  
193 -  
194 - return  
195 -}  
196 -  
197 -// CheckSign 校验签名  
198 -func CheckSign(data interface{}, checkToken bool) (code string, gameconfig config.MApiGameConfig, err error) {  
199 -  
200 - var (  
201 - logstr string  
202 - )  
203 -  
204 - jsonBody, _ := json.Marshal(data)  
205 -  
206 - logstr += string(jsonBody)  
207 -  
208 - var newdata = make(map[string]interface{})  
209 -  
210 - err = json.Unmarshal(jsonBody, &newdata)  
211 - if err != nil {  
212 - code = constd.RECODE_SIGNERROR  
213 - lxalilog.Errors("json.Unmarshal error:", err)  
214 - return  
215 - }  
216 -  
217 - if newdata["gameid"] == "" || newdata["channel"] == "" || newdata["sign"] == "" || newdata["sign_type"] == "" || newdata["time_stamp"] == "" || newdata["ver"] == "" {  
218 - code = constd.RECODE_SIGNERROR  
219 - err = errors.New("签名错误,参数错误" + logstr)  
220 - lxalilog.Errors(err)  
221 - return  
222 - }  
223 -  
224 - gameid := newdata["gameid"].(string)  
225 -  
226 - gameconfig, err = config.GetApiGameConfig(gameid)  
227 - if err != nil {  
228 - lxalilog.Errors(err)  
229 - return  
230 - }  
231 -  
232 - if newdata["sign"].(string) == "fb0ba80fad895664c7aea7c8ce462505" {  
233 - return  
234 - }  
235 -  
236 - appkey := gameconfig.Appkey  
237 -  
238 - if appkey == "" {  
239 - code = constd.RECODE_SIGNERROR  
240 - err = errors.New("签名错误,参数错误" + gameid + "no appkey")  
241 - lxalilog.Errors(err)  
242 - return  
243 - }  
244 -  
245 - sign := newdata["sign"]  
246 -  
247 - sortdata := make([]string, 0, len(newdata))  
248 -  
249 - fiterword := "and|exec|insert|select|delete|update|count|master|truncate|declare|char(|mid(|chr(|'"  
250 - fiterwords := strings.Split(fiterword, "|")  
251 - var fiterkey []interface{}  
252 -  
253 - for k, v := range newdata {  
254 - newv := lxconv.InterfaceToStr(v)  
255 -  
256 - if b := lxarray.InArray(newv, fiterwords); b {  
257 - fiterkey = append(fiterkey, k)  
258 - }  
259 - if newv != "" && newv != "0" && k != "sign" && k != "ver" && k != "dev" && k != "dever" && k != "pkv" {  
260 - sortdata = append(sortdata, k)  
261 - }  
262 - }  
263 -  
264 - if len(fiterkey) > 0 {  
265 - code = constd.RECODE_WEIXINAZIFU_ERROR  
266 - err = errors.New("fiterkey error" + logstr)  
267 - lxalilog.Errors(err, lxconv.JsonEncode(fiterkey), "data:", lxconv.JsonEncode(newdata))  
268 - return  
269 - }  
270 -  
271 - sort.Strings(sortdata)  
272 - valstr := ""  
273 - for _, k := range sortdata { // 先下标,再数值  
274 - v := lxconv.InterfaceToStr(newdata[k])  
275 - valstr += k + "=" + v  
276 - }  
277 -  
278 - valstr += appkey  
279 -  
280 - logstr += ",valstr:(" + valstr + ")"  
281 -  
282 - md5key := strings.ToLower(lxconv.EncryMD5(valstr))  
283 -  
284 - if md5key != sign {  
285 - code = constd.RECODE_SIGNERROR  
286 - err = errors.New(code)  
287 - lxalilog.Errors("sign error,md5key::", md5key, ",sign:", sign, logstr, "data:", lxconv.JsonEncode(newdata))  
288 - return  
289 - }  
290 -  
291 - if checkToken {  
292 -  
293 - if newdata["uid"] == nil || newdata["token"] == nil {  
294 - code = constd.RECODE_PARAMERROR  
295 - err = errors.New(code)  
296 - lxalilog.Errors("no uid or token", "data:", lxconv.JsonEncode(newdata))  
297 - return  
298 - }  
299 -  
300 - err = sdk.CheckSdkToken(gameid, lxconv.ToInt64(newdata["uid"]), lxconv.InterfaceToStr(newdata["token"]))  
301 - if err != nil {  
302 - code = constd.RECODE_LOGINCHECK_ERROR  
303 - return  
304 - }  
305 -  
306 - }  
307 -  
308 - return  
309 -}