package logic import ( "HttpServer/jsonconf" "HttpServer/redishandler" "bytes" "common/logger" "common/redis" "crypto/md5" "encoding/hex" "encoding/json" "errors" "fmt" "io/ioutil" "net/http" "sort" "strconv" "time" ) func SetHeader(w http.ResponseWriter) { w.Header().Set("Access-Control-Allow-Origin", "*") //允许访问所有域 w.Header().Set("Content-Type", "application/json") w.Header().Set("Access-Control-Allow-Headers", "Content-Type,Uuid") } func SaveUserInfo(data *UserData, uniqueid string) error { savestr, err := json.Marshal(data) if err != nil { return err } err = redishandler.GetRedisClient().HSet(redis.USER_DATA_KEY, uniqueid, string(savestr)) return err } func GetUserInfo(uniqueid string) (*UserData, error) { data, err := redishandler.GetRedisClient().HGet(redis.USER_DATA_KEY, uniqueid) if err != nil { return nil, err } var tmp UserData err = json.Unmarshal([]byte(data), &tmp) if err != nil { return nil, err } return &tmp, nil } func (uinfo *UserData) GetSpecialWithDrawData(money float32) (int, *WithDrawDesc) { //处理提现状态 for k, val := range uinfo.WithDraw.SpecialCashdata { if val.Cnum == money { return k, &val } } return -1, nil } func (uinfo *UserData) GetWithDrawData(money float32) (int, *WithDrawDesc) { //处理提现状态 for k, val := range uinfo.WithDraw.Cashdata { if val.Cnum == money { return k, &val } } return -1, nil } func HandlerSyncuserdata(w http.ResponseWriter, data string, uuid int) { SetHeader(w) var resp GetuserdataResp resp.Code = 0 var rdata GetuserdataReq err := json.Unmarshal([]byte(data), &rdata) for { if err != nil { logger.Info("json decode HandlerGetuserdata data failed:%v,for:%v", err, data) resp.Message = "json解析错误" resp.Code = 1 break } //需要加上渠道才是唯一的玩家id,不同渠道视为不同数据 uniqueuuid := strconv.Itoa(uuid) + rdata.Channel data, err := GetUserInfo(uniqueuuid) if err != nil || data == nil { resp.Code = 1 resp.Message = "ERROR_SRV_ERROR" break } //此处处理一下从sdk拉取钱包金币数量 gold, err := GetCoinFromSdk(uuid, rdata.Gameid, rdata.Channel) if err == nil { data.RealGold = gold } else { logger.Error("GetCoinFromSdk failed err=%v", err) } resp.Data.Walletgold = data.RealGold resp.Data.Nowtime = int(time.Now().Unix()) resp.Data.Curji = data.BigLevel resp.Data.Curlevel = data.PassLevel resp.Data.Guanrednum = data.GuanRedNum resp.Data.Jirednum = data.JiRedNum resp.Data.Randnum = data.RandNum SaveUserInfo(data, uniqueuuid) resp.Code = 0 break } //回包 respstr, _ := json.Marshal(&resp) fmt.Fprint(w, string(respstr)) logger.Info("###HandlerSyncuserdata###rdata:%v", string(respstr)) } func InitUserInfo(data *UserLoginReq, resp *UserLoginResp, uuid int, uniqueuid string) error { var initdata UserData initdata.Lv = 1 initdata.LvRewardGet = 2 initdata.Exp = 0 initdata.Userid = uuid initdata.ContinueLoginDay = 1 initdata.SumLoginDay = 1 initdata.GetFromGuanCnt = 0 initdata.GuanGold = 0 initdata.LastLoginTime = int(time.Now().Unix()) goldnum, _ := GetCoinFromSdk(uuid, data.Gameid, data.Channel) initdata.RealGold = goldnum initdata.WatchAddsTime = WATCH_ADD_DAY_LIMIT initdata.LeftFreeRB = FREE_REDBAG_NUM initdata.UpLvCostTime = 0 initdata.PassLevel = 0 initdata.BigLevel = 1 initdata.GuanRedNum = 0 initdata.JiRedNum = 0 initdata.RandNum = RANDNUMLIMIT initdata.UpLvCostTimeSec = int(time.Now().Unix()) //todo 等待提现配置表 for _, val := range jsonconf.GetJsonConf().WithDrawConfig { var tmp WithDrawDesc tmp.Cid = val.Id tmp.Cnum = val.Money if val.Isnew == 1 { tmp.Isnew = 1 } else { tmp.Isnew = 2 } tmp.Limitlv = val.Level if val.Id == 1 { tmp.Preisfind = 1 } else { tmp.Preisfind = 0 } tmp.Logindaylimit = val.Day initdata.WithDraw.Cashdata = append(initdata.WithDraw.Cashdata, tmp) } //处理活跃提现的部分 for _, val := range jsonconf.GetJsonConf().ActiveWithdrawConfig { var tmp WithDrawDesc tmp.Cid = val.Id tmp.Cnum = val.Money if val.Isnew == 1 { tmp.Isnew = 1 } else { tmp.Isnew = 2 } tmp.Limitlv = val.Level //没有前置条件 tmp.Preisfind = 1 tmp.Logindaylimit = val.Day initdata.WithDraw.SpecialCashdata = append(initdata.WithDraw.SpecialCashdata, tmp) } //resp.Data.Leftredbagcnt = initdata.WatchAddsTime resp.Data.Walletgold = initdata.RealGold resp.Data.Curji = initdata.BigLevel resp.Data.Curlevel = initdata.PassLevel resp.Data.Guanrednum = initdata.GuanRedNum resp.Data.Jirednum = initdata.JiRedNum resp.Data.Randnum = initdata.RandNum err := SaveUserInfo(&initdata, uniqueuid) logger.Info("InitUserInfoddddd uinfo=%+v", initdata) if err != nil { logger.Error("InitUserInfo err=%v", err) return err } return err } func GettotalParam(paramlist []string) string { //排序 sort.Strings(paramlist) //拼接 sumparam := "" for _, val := range paramlist { sumparam += val } return sumparam } func GetHashValue(signsum string) string { /*h := sha1.New() h.Write([]byte(signsum)) bs := h.Sum(nil) sign := hex.EncodeToString(bs)*/ ctx := md5.New() ctx.Write([]byte(signsum)) return hex.EncodeToString(ctx.Sum(nil)) } func DoHttpPost(bys []byte, apistr string) (string, error) { body := bytes.NewBuffer(bys) url1 := XIAOXINGXING_SDKURLOFFICAL + apistr //"api/server/addcoin" res, err := http.Post(url1, "application/json;charset=utf-8", body) if err != nil { logger.Error("DoHttpPost failed err=%v", err) return "", err } result, _ := ioutil.ReadAll(res.Body) defer res.Body.Close() return string(result), nil } func GetCoinFromSdk(uuid int, gameid string, channel string) (int, error) { SERVERKEY := XIAOXINGXING_SERVERKEYTEST if gameid == "1015" { SERVERKEY = XIAOXINGXING_SERVERKEYTEST_1015 } if gameid == "1016" { SERVERKEY = XIAOXINGXING_SERVERKEYTEST_1016 } var paramlist []string var params GetCoinDesc params.Sign_type = "md5" params.Gameid = gameid params.Channel = channel params.Uid = uuid params.Time_stamp = strconv.Itoa(int(time.Now().Unix())) signtypestr := "sign_type=" + params.Sign_type timestampstr := "time_stamp=" + strconv.Itoa(int(time.Now().Unix())) paramgameid := "gameid=" + gameid pchannel := "channel=" + channel puid := "uid=" + strconv.Itoa(uuid) paramlist = append(paramlist, signtypestr) paramlist = append(paramlist, timestampstr) paramlist = append(paramlist, paramgameid) paramlist = append(paramlist, pchannel) paramlist = append(paramlist, puid) sumparam := GettotalParam(paramlist) //加serverkey signsum := sumparam + SERVERKEY //进行hash sign := GetHashValue(signsum) params.Sign = sign logger.Info("GetCoinFromSdk sumparam is:%v,sign is:", signsum, sign) bys, err := json.Marshal(¶ms) if err != nil { logger.Error("GetCoinFromSdk failed=%v", err) return 0, err } res, err := DoHttpPost(bys, "api/server/getcoin") if err != nil { logger.Error("GetCoinFromSdk failed=%v", err) return 0, err } logger.Info("GetCoinFromSdk res=%v", res) var resp AddCoinResp err = json.Unmarshal([]byte(res), &resp) if err != nil { logger.Error("GetCoinFromSdk failed=%v", err) return 0, err } if resp.Code != "0" { logger.Error("GetCoinFromSdk failed=%v", resp.Msg) return 0, err } return resp.Data.Mycoin, nil } func AddCoinToSdk(uuid int, goldnum int, gameid string, channel string, atype int) (int, error) { SERVERKEY := XIAOXINGXING_SERVERKEYTEST if gameid == "1015" { SERVERKEY = XIAOXINGXING_SERVERKEYTEST_1015 } if gameid == "1016" { SERVERKEY = XIAOXINGXING_SERVERKEYTEST_1016 } var paramlist []string sign_type := "sign_type=md5" paramlist = append(paramlist, sign_type) time_stamp := "time_stamp=" + strconv.Itoa(int(time.Now().Unix())) paramlist = append(paramlist, time_stamp) paramgameid := "gameid=" + gameid paramlist = append(paramlist, paramgameid) pchannel := "channel=" + channel paramlist = append(paramlist, pchannel) puid := "uid=" + strconv.Itoa(uuid) paramlist = append(paramlist, puid) pcoin := "coin=" + strconv.Itoa(goldnum) paramlist = append(paramlist, pcoin) ptyp := "typ=" + strconv.Itoa(atype) paramlist = append(paramlist, ptyp) sumparam := GettotalParam(paramlist) //加serverkey signsum := sumparam + SERVERKEY logger.Info("AddCoinToSdk sumparam=%v", signsum) //进行hash sign := GetHashValue(signsum) var req AddCoinDesc req.Channel = channel req.Gameid = gameid req.Coin = goldnum req.Sign = sign req.Sign_type = "md5" req.Time_stamp = strconv.Itoa(int(time.Now().Unix())) req.Typ = atype req.Uid = uuid bys, err := json.Marshal(&req) if err != nil { logger.Error("AddCoinToSdk failed=%v", err) return 0, err } res, err := DoHttpPost(bys, "api/server/addcoin") if err != nil { logger.Error("AddCoinToSdk failed=%v", err) return 0, err } logger.Info("AddCoinToSdk res=%v", res) var resp AddCoinResp err = json.Unmarshal([]byte(res), &resp) if err != nil { logger.Error("AddCoinToSdk failed=%v", err) return 0, err } if resp.Code != "0" { gold, _ := GetCoinFromSdk(uuid, gameid, channel) logger.Error("AddCoinToSdk failed=%v", resp.Msg) return gold, err } return resp.Data.Mycoin, nil } func GetCashFromSDK(uuid int, goldnum int, gameid, channel, openid, nickname, headurl, ver string, checkcoin int) (int, error) { SERVERKEY := XIAOXINGXING_SERVERKEYTEST if gameid == "1015" { SERVERKEY = XIAOXINGXING_SERVERKEYTEST_1015 } if gameid == "1016" { SERVERKEY = XIAOXINGXING_SERVERKEYTEST_1016 } if goldnum == 0 || uuid == 0 || gameid == "" || channel == "" || openid == "" || ver == "" { logger.Error("GetCashFromSDK param empty") return 0, errors.New("param empty") } var paramlist []string var params TixianDesc params.Sign_type = "md5" params.Gameid = gameid params.Channel = channel params.Uid = uuid params.Time_stamp = strconv.Itoa(int(time.Now().Unix())) params.Headurl = headurl params.Money = goldnum params.Openid = openid params.Nickname = nickname params.Typ = 6 params.Ver = ver params.Editcoin = 1 params.Checkcoin = checkcoin signtypestr := "sign_type=" + params.Sign_type timestampstr := "time_stamp=" + strconv.Itoa(int(time.Now().Unix())) paramgameid := "gameid=" + gameid pchannel := "channel=" + channel puid := "uid=" + strconv.Itoa(uuid) phead := "headurl=" + headurl pnickname := "nickname=" + nickname popenid := "openid=" + openid pmoney := "money=" + strconv.Itoa(goldnum) ptype := "typ=" + "6" //微信 ped := "editcoin=1" pcheco := "checkcoin=" + strconv.Itoa(checkcoin) //pver := "ver=" + params.Ver paramlist = append(paramlist, signtypestr) paramlist = append(paramlist, timestampstr) paramlist = append(paramlist, paramgameid) paramlist = append(paramlist, pchannel) paramlist = append(paramlist, puid) if headurl != "" { paramlist = append(paramlist, phead) } if nickname != "" { paramlist = append(paramlist, pnickname) } paramlist = append(paramlist, popenid) paramlist = append(paramlist, pmoney) paramlist = append(paramlist, ptype) paramlist = append(paramlist, ped) paramlist = append(paramlist, pcheco) //paramlist = append(paramlist, pver) sumparam := GettotalParam(paramlist) //加serverkey signsum := sumparam + SERVERKEY //进行hash sign := GetHashValue(signsum) params.Sign = sign bys, err := json.Marshal(¶ms) if err != nil { logger.Error("GetCashFromSDK failed=%v", err) return 0, err } res, err := DoHttpPost(bys, "api/server/tixian") logger.Info("GetCashFromSDK sumparam is:%v,sign is:%v", signsum, sign) logger.Info("GetCashFromSDK sumparam param=%v", string(bys)) if err != nil { logger.Error("GetCashFromSDK failed=%v", err) return 0, err } logger.Info("GetCashFromSDK res=%v", res) var resp GetCashResp err = json.Unmarshal([]byte(res), &resp) if err != nil { logger.Error("GetCashFromSDK failed=%v", err) return 0, err } if resp.Code != "0" { logger.Error("GetCashFromSDK failed=%v", resp.Msg) return 0, errors.New(resp.Msg) } //拉取一下新的金币值 newnum, err := GetCoinFromSdk(uuid, gameid, channel) if err != nil { logger.Error("GetCashFromSDK failed=%v", err) return 0, err } return newnum, nil } func (u *UserData) IsInWithList(num float32) (bool, int) { for k, val := range u.WithDraw.Cashdata { if val.Cnum == num { return true, k } } return false, -1 } func (u *UserData) IsInSpeaialWithList(num float32) (bool, int) { for k, val := range u.WithDraw.SpecialCashdata { if val.Cnum == num { return true, k } } return false, -1 } func (u *UserData) ReInitWithDraw(uniqueuid string) error { //u.WithDraw.Cashdata = u.WithDraw.Cashdata[:0] //重新读取配置 for _, val := range jsonconf.GetJsonConf().WithDrawConfig { isin, idx := u.IsInWithList(val.Money) if isin && idx >= 0 && idx < len(u.WithDraw.Cashdata) { //已经有了的话更新一下配置 u.WithDraw.Cashdata[idx].Logindaylimit = val.Day u.WithDraw.Cashdata[idx].Limitlv = val.Level u.WithDraw.Cashdata[idx].Cnum = val.Money u.WithDraw.Cashdata[idx].Cid = val.Id } else { //还没有 新加入 var tmp WithDrawDesc tmp.Cid = val.Id tmp.Cnum = val.Money if val.Isnew == 1 { tmp.Isnew = 1 } else { tmp.Isnew = 2 } tmp.Limitlv = val.Level if val.Id == 1 { tmp.Preisfind = 1 } else { tmp.Preisfind = 0 } tmp.Logindaylimit = val.Day u.WithDraw.Cashdata = append(u.WithDraw.Cashdata, tmp) } } //需要反过来判断一下 如果此时提现档位在表里面不存在 则删除 for i := 0; i < len(u.WithDraw.Cashdata); { exist := false for _, val := range jsonconf.GetJsonConf().WithDrawConfig { if val.Money == u.WithDraw.Cashdata[i].Cnum { exist = true } } if !exist { u.WithDraw.Cashdata = append(u.WithDraw.Cashdata[:i], u.WithDraw.Cashdata[i+1:]...) } else { i++ } } //需要统一处理一下前置条件 for i := 0; i < len(u.WithDraw.Cashdata); i++ { if i > 0 { //需要判断下前面的前置条件 if u.WithDraw.Cashdata[i-1].Preisfind == 1 { //前面已完成,拿自己也变成完成状态 u.WithDraw.Cashdata[i].Preisfind = 1 } } } for _, val := range jsonconf.GetJsonConf().ActiveWithdrawConfig { isin, idx := u.IsInSpeaialWithList(val.Money) if isin && idx >= 0 && idx < len(u.WithDraw.SpecialCashdata) { //已经有了的话更新一下配置 u.WithDraw.SpecialCashdata[idx].Logindaylimit = val.Day u.WithDraw.SpecialCashdata[idx].Limitlv = val.Level u.WithDraw.SpecialCashdata[idx].Cnum = val.Money } else { //还没有 新加入 var tmp WithDrawDesc tmp.Cid = val.Id tmp.Cnum = val.Money if val.Isnew == 1 { tmp.Isnew = 1 } else { tmp.Isnew = 2 } tmp.Limitlv = val.Level //没有前置条件 tmp.Preisfind = 1 tmp.Logindaylimit = val.Day u.WithDraw.SpecialCashdata = append(u.WithDraw.SpecialCashdata, tmp) } } //做一个排序 sort.Sort(u.WithDraw.Cashdata) sort.Sort(u.WithDraw.SpecialCashdata) err := SaveUserInfo(u, uniqueuid) if err != nil { logger.Error("ReInitWithDraw failed") } return err } func GetCashList(uuid int, gameid string, channel string, start int, number int) (*[]WithDrawRecord, error) { SERVERKEY := XIAOXINGXING_SERVERKEYTEST if gameid == "1015" { SERVERKEY = XIAOXINGXING_SERVERKEYTEST_1015 } if gameid == "1016" { SERVERKEY = XIAOXINGXING_SERVERKEYTEST_1016 } var paramlist []string var params GetCashListDesc params.Sign_type = "md5" params.Gameid = gameid params.Channel = channel params.Uid = uuid params.Time_stamp = strconv.Itoa(int(time.Now().Unix())) params.Start = start params.Number = number signtypestr := "sign_type=" + params.Sign_type timestampstr := "time_stamp=" + strconv.Itoa(int(time.Now().Unix())) paramgameid := "gameid=" + gameid pchannel := "channel=" + channel puid := "uid=" + strconv.Itoa(uuid) pstart := "start=" + strconv.Itoa(start) pnumber := "number=" + strconv.Itoa(number) paramlist = append(paramlist, signtypestr) paramlist = append(paramlist, timestampstr) paramlist = append(paramlist, paramgameid) paramlist = append(paramlist, pchannel) paramlist = append(paramlist, puid) if start != 0 { paramlist = append(paramlist, pstart) } paramlist = append(paramlist, pnumber) sumparam := GettotalParam(paramlist) //加serverkey signsum := sumparam + SERVERKEY logger.Info("GetCashList sumparam=%v", signsum) //进行hash sign := GetHashValue(signsum) params.Sign = sign bys, err := json.Marshal(¶ms) if err != nil { logger.Error("GetCashList failed=%v", err) return nil, err } res, err := DoHttpPost(bys, "api/server/tixian/lst") if err != nil { logger.Error("GetCashList failed=%v", err) return nil, err } logger.Info("GetCashList res=%v", res) var resp GetCashListResp err = json.Unmarshal([]byte(res), &resp) if err != nil { logger.Error("GetCoinFromSdk failed=%v", err) return nil, err } if resp.Code != "0" { logger.Error("GetCoinFromSdk failed=%v", resp.Msg) return nil, err } return &resp.Data, nil }