From 4596c516c28a505b37a372d9dd126ee914f0bae0 Mon Sep 17 00:00:00 2001 From: 陆恒 Date: Wed, 27 May 2020 11:22:31 +0800 Subject: [PATCH] 提交接口 --- src/HttpServer/logic/constdef.go | 8 ++++++++ src/HttpServer/logic/datadef.go | 42 +++++++++++++++++++++++++++++++++++++++++- src/HttpServer/logic/errordef.go | 10 +++++++--- src/HttpServer/logic/function.go | 125 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/HttpServer/logic/httpserver.go | 13 ++++++++++++- src/HttpServer/logic/logic.go | 77 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/common/redis/def.go | 4 ++-- 7 files changed, 272 insertions(+), 7 deletions(-) diff --git a/src/HttpServer/logic/constdef.go b/src/HttpServer/logic/constdef.go index 473bc19..7b63028 100644 --- a/src/HttpServer/logic/constdef.go +++ b/src/HttpServer/logic/constdef.go @@ -3,3 +3,11 @@ package logic const ( DAILY_FETCH_CNT = 5 //每日领取宝箱次数 ) + +const ( + ADDCOINTOTOUTIAOURL = "https://developer.toutiao.com/api/apps/gold/deliver" + GETTOUTIAOACCESSTOKENURL = "https://developer.toutiao.com/api/apps/token" + GETTOUTIAOCOINURL = "https://developer.toutiao.com/api/apps/gold/search" + TOUTIAOAPPID = "tt29e35f5eb6c9b9dd" + TOUTIAOSECRET = "100cb2286445027f606844fc156121dd7db06075" +) diff --git a/src/HttpServer/logic/datadef.go b/src/HttpServer/logic/datadef.go index e98b400..b93e5cc 100644 --- a/src/HttpServer/logic/datadef.go +++ b/src/HttpServer/logic/datadef.go @@ -1,6 +1,28 @@ package logic -// +type AddcointotoutiaoReq struct { + Access_token string `json:"access_token"` + Open_id string `json:"open_id"` + Device_id int `json:"device_id"` + Amount int `json:"amount"` + Description string `json:"description"` + Bonus_type string `json:"bonus_type"` +} + +type AddcointotoutiaoResp struct { + Errcode int `json:"errcode"` + Errmsg string `json:"errmsg"` + Data int `json:"data"` +} + +type GetAccessTokenResp struct { + Access_token string `json:"access_token"` + Expires_in string `json:"expires_in"` + Errcode int `json:"errcode"` + Errmsg string `json:"errmsg"` +} + +//-------------------------------------------------------------------------- type GetcurpropertyReq struct { Openid string `json:"openid"` @@ -19,6 +41,24 @@ type GetcurpropertyResp struct { RetData GetcurpropertyData `json:"retData"` } +type FetchproteryboxReq struct { + Openid string `json:"openid"` + Device_id int `json:"device_id"` +} + +type FetchproteryboxData struct { + Goldnum int `json:"goldnum"` + Sumgold int `json:"sumgold"` + Curlevle int64 `json:"curlevle"` + Leftcnt int `json:"leftcnt"` +} + +type FetchproteryboxResp struct { + ErrNum int `json:"errNum"` + RetMsg string `json:"retMsg"` + RetData FetchproteryboxData `json:"retData"` +} + //------------------------------------------------------------------------------------------------------ type UserData struct { diff --git a/src/HttpServer/logic/errordef.go b/src/HttpServer/logic/errordef.go index 90f45f7..7030912 100644 --- a/src/HttpServer/logic/errordef.go +++ b/src/HttpServer/logic/errordef.go @@ -1,8 +1,12 @@ package logic const ( - ERROR_OK = 0 //没有错误 - ERROR_UNMASH_JSONFAILED = 1 //json解析失败 - ERROR_SERVER_FAILED = 2 //j服务器错误 + ERROR_OK = 0 //没有错误 + ERROR_UNMASH_JSONFAILED = 1 //json解析失败 + ERROR_SERVER_FAILED = 2 //j服务器错误 + ERROR_FETCHLIMIT = 3 //当天领取次数达到上限 + ERROR_READCFG_FAILED = 4 //读取配置错误 + ERROR_PROPERTY_NOTENOUGH = 5 //当前物资不足 + ERROR_TOUTIAOAPI_FAILED = 6 //头条接口失败 ) diff --git a/src/HttpServer/logic/function.go b/src/HttpServer/logic/function.go index 9c1f0b8..f5a771a 100644 --- a/src/HttpServer/logic/function.go +++ b/src/HttpServer/logic/function.go @@ -3,10 +3,14 @@ package logic import ( "HttpServer/jsonconf" "HttpServer/redishandler" + "bytes" "common/logger" "common/redis" "encoding/json" + "errors" + "io/ioutil" "net/http" + "strconv" "time" ) @@ -139,3 +143,124 @@ func (u *UserData) CalcProperty() { logger.Error("CalcProperty err=%v", err) } } + +func GetAccessToken() (string, error) { + //首先从缓存取 + var token string + token, err := redishandler.GetRedisClient().GetString(redis.GAME_ACCESS_TOKEN) + if err == nil { + return token, nil + } + + //如果没找到 则取取 + url := GETTOUTIAOACCESSTOKENURL + "?appid=" + TOUTIAOAPPID + "&secret=" + TOUTIAOSECRET + "&grant_type=client_credential" + res, err := http.Get(url) + if err != nil { + logger.Error("GetAccessToken err=%v", err) + return "", err + } + result, _ := ioutil.ReadAll(res.Body) + defer res.Body.Close() + + var tmp GetAccessTokenResp + err = json.Unmarshal([]byte(result), &tmp) + if err != nil { + logger.Error("GetAccessToken err=%v", err) + return "", err + } + + if tmp.Access_token == "" { + logger.Error("GetAccessToken err=%v", tmp.Errmsg) + return "", errors.New(tmp.Errmsg) + } + + //保存token缓存 + expiretime, _ := strconv.Atoi(tmp.Expires_in) + redishandler.GetRedisClient().SetString(redis.GAME_ACCESS_TOKEN, tmp.Access_token) + redishandler.GetRedisClient().Expire(redis.GAME_ACCESS_TOKEN, expiretime-10) + + return tmp.Access_token, nil +} + +func DoHttpPost(bys []byte, url string) (string, error) { + body := bytes.NewBuffer(bys) + + res, err := http.Post(url, "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 GetCoinFromToutiao(openid string, deviceid int) (int, error) { + accesstoken, _ := GetAccessToken() + url := GETTOUTIAOCOINURL + "?access_token=" + accesstoken + "&open_id=" + openid + "&device_id=" + strconv.Itoa(deviceid) + res, err := http.Get(url) + if err != nil { + logger.Error("GetAccessToken err=%v", err) + return 0, err + } + result, _ := ioutil.ReadAll(res.Body) + defer res.Body.Close() + + var tmp AddcointotoutiaoResp + err = json.Unmarshal(result, &tmp) + if err != nil { + logger.Error("GetAccessToken err=%v", err) + return 0, err + } + if tmp.Errcode != 0 { + logger.Error("GetAccessToken err=%v", tmp.Errmsg) + return 0, errors.New(tmp.Errmsg) + } + return tmp.Data, nil +} + +func AddCoinToTouTiao(openid string, deviceid, amount int, descr string, btype string) (int, int, error) { + acctoken, err := GetAccessToken() + if err != nil { + logger.Error("AddCoinToTouTiao err=%v", err) + return 0, 0, err + } + var reqdata AddcointotoutiaoReq + reqdata.Access_token = acctoken + reqdata.Amount = amount + reqdata.Bonus_type = btype + reqdata.Description = descr + reqdata.Device_id = deviceid + reqdata.Open_id = openid + logger.Info("AddCoinToTouTiao req=%v", reqdata) + bys, err := json.Marshal(&reqdata) + if err != nil { + logger.Error("AddCoinToTouTiao failed=%v", err) + return 0, 0, err + } + + res, err := DoHttpPost(bys, ADDCOINTOTOUTIAOURL) + if err != nil { + logger.Error("AddCoinToTouTiao failed=%v", err) + return 0, 0, err + } + var resp AddcointotoutiaoResp + err = json.Unmarshal([]byte(res), &resp) + if err != nil { + logger.Error("AddCoinToTouTiao failed=%v", err) + return 0, 0, err + } + + if resp.Errcode != 0 { + logger.Error("AddCoinToTouTiao failed=%v", err) + return 0, 0, errors.New(resp.Errmsg) + } + + newcoin, err := GetCoinFromToutiao(openid, deviceid) + if err != nil { + logger.Error("AddCoinToTouTiao failed=%v", err) + return 0, 0, err + } + return resp.Data, newcoin, nil +} diff --git a/src/HttpServer/logic/httpserver.go b/src/HttpServer/logic/httpserver.go index 573f4b4..d05b1de 100644 --- a/src/HttpServer/logic/httpserver.go +++ b/src/HttpServer/logic/httpserver.go @@ -43,11 +43,22 @@ func startServerHttpServe() { http.HandleFunc("/eliminatestar/test", Testapi) //测试接口 http.HandleFunc("/eliminatestar/clear", ClearData) //清除账号 //---------------------------------------------------------------------------------------- - http.HandleFunc("/daycs/getcurproperty", Getcurproperty) //请求当前物资 + http.HandleFunc("/daycs/getcurproperty", Getcurproperty) //请求当前物资 + http.HandleFunc("/daycs/fetchproterybox", Fetchproterybox) //请求领取物资宝箱 err := http.ListenAndServe(conf.GetServerHttpAddrConf(), nil) CheckErr(err) } +func Fetchproterybox(w http.ResponseWriter, r *http.Request) { + result, _ := ioutil.ReadAll(r.Body) + r.Body.Close() + + s := string(result) + logger.Info("Fetchproterybox , body:%v", s) + + HandlerFetchproterybox(w, s) +} + func ClearData(w http.ResponseWriter, r *http.Request) { Uuid := 0 diff --git a/src/HttpServer/logic/logic.go b/src/HttpServer/logic/logic.go index 9a59b47..50ffae9 100644 --- a/src/HttpServer/logic/logic.go +++ b/src/HttpServer/logic/logic.go @@ -1,12 +1,89 @@ package logic import ( + "HttpServer/jsonconf" "common/logger" "encoding/json" "fmt" "net/http" ) +func HandlerFetchproterybox(w http.ResponseWriter, data string) { + SetHeader(w) + var resp FetchproteryboxResp + resp.ErrNum = 0 + var rdata FetchproteryboxReq + err := json.Unmarshal([]byte(data), &rdata) + for { + if err != nil { + logger.Info("json decode HandlerFetchproterybox data failed:%v,for:%v", err, data) + resp.RetMsg = "json解析失败" + resp.ErrNum = ERROR_UNMASH_JSONFAILED + break + } + + uinfo, err := GetUserInfo(rdata.Openid) + if err != nil || uinfo == nil { + logger.Info(" HandlerFetchproterybox getdata failed:%v,for:%v", err, data) + resp.RetMsg = "服务器读取数据失败" + resp.ErrNum = ERROR_SERVER_FAILED + break + } + + //判断当前剩余次数 + if uinfo.LeftCnt == 0 { + logger.Info(" HandlerFetchproterybox LeftCnt failed:%v,for:%v", err, data) + resp.RetMsg = "当天领取已达上限" + resp.ErrNum = ERROR_FETCHLIMIT + break + } + + //判断物资是否足够 + cfg := jsonconf.GetGoldChestConfig(uinfo.TotalFetchCnt + 1) + if cfg == nil { + logger.Info(" HandlerFetchproterybox cfg failed:%v,for:%v", err, data) + resp.RetMsg = "读取配置错误" + resp.ErrNum = ERROR_READCFG_FAILED + break + } + if uinfo.Property < cfg.Score { + logger.Info(" HandlerFetchproterybox property failed:%v,for:%v", err, data) + resp.RetMsg = "当前物资不足" + resp.ErrNum = ERROR_PROPERTY_NOTENOUGH + break + } + + //加金币 + addgold, sumgold, err := AddCoinToTouTiao(rdata.Openid, rdata.Device_id, cfg.Reward, "每日领取宝箱奖励", "other") + if err != nil { + logger.Info(" HandlerFetchproterybox property failed:%v,for:%v", err, data) + resp.RetMsg = "调用头条接口失败" + resp.ErrNum = ERROR_TOUTIAOAPI_FAILED + break + } + + uinfo.TotalFetchCnt++ + uinfo.Property -= cfg.Score + uinfo.LeftCnt-- + + resp.RetData.Goldnum = addgold + resp.RetData.Sumgold = sumgold + resp.RetData.Curlevle = uinfo.CalcCurLe() + resp.RetData.Leftcnt = uinfo.LeftCnt + + //保存 + err = SaveUserInfo(uinfo) + if err != nil { + logger.Error("HandlerFetchproterybox err=%v", err) + } + + break + } + //回包 + respstr, _ := json.Marshal(&resp) + fmt.Fprint(w, string(respstr)) +} + func HandlerGetcurproperty(w http.ResponseWriter, data string) { SetHeader(w) var resp GetcurpropertyResp diff --git a/src/common/redis/def.go b/src/common/redis/def.go index fa9df9d..56043e1 100644 --- a/src/common/redis/def.go +++ b/src/common/redis/def.go @@ -1,6 +1,6 @@ package redis const ( - USER_DATA_KEY = "DAYCS_USER_DATA_KEY" //玩家数据 - + USER_DATA_KEY = "DAYCS_USER_DATA_KEY" //玩家数据 hset + GAME_ACCESS_TOKEN = "DAYCD_GAME_ACCESS_TOKEN" //头条sdk ) -- libgit2 0.21.0