diff --git a/src/HttpServer/logic/bytedance.go b/src/HttpServer/logic/bytedance.go new file mode 100644 index 0000000..e2765dc --- /dev/null +++ b/src/HttpServer/logic/bytedance.go @@ -0,0 +1,78 @@ +package logic + +//2021-04-14添加 +//https://bytedance.feishu.cn/docs/doccnkUkS6ivKQgbeGPxjN3mgNc# + +import ( + "HttpServer/redishandler" + "common/logger" + "common/redis" + "crypto/hmac" + "crypto/sha256" + "encoding/hex" + "encoding/json" + "errors" + "io/ioutil" + "net/http" +) + +// 计算签名算法 +func CreateCommonBytedanceSign(post_body []byte, openid string) string { + sessionkey := GetBytedanceSessionKey(openid) + if sessionkey != "" { + return CreateBytedanceSign(sessionkey, post_body) + } + return "" +} + +// 计算签名算法 +func CreateBytedanceSign(session_key string, post_body []byte) string { + h := hmac.New(sha256.New, []byte(session_key)) + h.Write(post_body) + hashcode2 := hex.EncodeToString(h.Sum(nil)) + return hashcode2 +} + +// 保存sessionkey +func SetBytedanceSessionKey(openid, sessionkey string) { + rediskey := redis.USER_SESSION_KEY + "_" + openid + expire := 86400 * 30 + redishandler.GetRedisClient().SetExString(rediskey, sessionkey, expire) +} + +// 获取sessionkey +func GetBytedanceSessionKey(openid string) string { + rediskey := redis.USER_SESSION_KEY + "_" + openid + val, _ := redishandler.GetRedisClient().GetString(rediskey) + return val +} + +//获取global_id +func GetBytedanceGlobalID(access_token, openid string) (globalid int, err error) { + url := GETGLOBALIDURL + "?access_token=" + access_token + "&open_id=" + openid + res, err := http.Get(url) + if err != nil { + logger.Error("GetBytedanceGlobalID err=%v", err) + return + } + + result, _ := ioutil.ReadAll(res.Body) + defer res.Body.Close() + + var tmp GetGlobalIDResp + err = json.Unmarshal(result, &tmp) + if err != nil { + logger.Error("GetBytedanceGlobalID err=%v", err) + return + } + + if tmp.Errcode != 0 { + logger.Error("GetBytedanceGlobalID err=%v", tmp.Errmsg) + err = errors.New("GetBytedanceGlobalID error:tmp:" + string(result)) + return + } + + globalid = tmp.GlobalID + return + +} diff --git a/src/HttpServer/logic/constdef.go b/src/HttpServer/logic/constdef.go index 2edad8c..a29ffd4 100644 --- a/src/HttpServer/logic/constdef.go +++ b/src/HttpServer/logic/constdef.go @@ -5,10 +5,13 @@ const ( ) const ( + GETGLOBALIDURL = "https://developer.toutiao.com/api/apps/gold/gen_global_id" //获取global_id ADDCOINTOTOUTIAOURL = "https://developer.toutiao.com/api/apps/gold/deliver" GETTOUTIAOACCESSTOKENURL = "https://developer.toutiao.com/api/apps/token" GETTOUTIAOOPENIDURL = "https://developer.toutiao.com/api/apps/jscode2session" GETTOUTIAOCOINURL = "https://developer.toutiao.com/api/apps/gold/search" - TOUTIAOAPPID = "tt841ff2a21b254572" //"tt29e35f5eb6c9b9dd" - TOUTIAOSECRET = "14a09009e4ea999261876a4b26b09ec2ebc1e7ee" //"100cb2286445027f606844fc156121dd7db06075" + //TOUTIAOAPPID = "tt841ff2a21b254572" //"tt29e35f5eb6c9b9dd 正式tt841ff2a21b254572" + //TOUTIAOSECRET = "14a09009e4ea999261876a4b26b09ec2ebc1e7ee" //"100cb2286445027f606844fc156121dd7db06075 正式14a09009e4ea999261876a4b26b09ec2ebc1e7ee" + TOUTIAOAPPID = "tted769bcb724e5b1201" + TOUTIAOSECRET = "daa13cc0d0e27960438bb2071c950d59ab80ab14" ) diff --git a/src/HttpServer/logic/datadef.go b/src/HttpServer/logic/datadef.go index c5f352c..bfb822f 100644 --- a/src/HttpServer/logic/datadef.go +++ b/src/HttpServer/logic/datadef.go @@ -7,6 +7,7 @@ type AddcointotoutiaoReq struct { Amount int `json:"amount"` Description string `json:"description"` Bonus_type string `json:"bonus_type"` + GlobalID int `json:"global_id"` } type AddcointotoutiaoResp struct { @@ -29,6 +30,12 @@ type GetOpenidResp struct { Errmsg string `json:"errmsg"` } +type GetGlobalIDResp struct { + GlobalID int `json:"global_id"` + Errcode int `json:"errcode"` + Errmsg string `json:"errmsg"` +} + //-------------------------------------------------------------------------- type GetcurpropertyReq struct { diff --git a/src/HttpServer/logic/function.go b/src/HttpServer/logic/function.go index 0159804..2015f57 100644 --- a/src/HttpServer/logic/function.go +++ b/src/HttpServer/logic/function.go @@ -188,6 +188,9 @@ func GetOpenid(code string) (string, error) { return "", errors.New(tmp.Errmsg) } + //保存头条session key + go SetBytedanceSessionKey(tmp.Openid, tmp.Session_key) + return tmp.Openid, nil } @@ -273,6 +276,14 @@ func AddCoinToTouTiao(openid string, deviceid, amount int, descr string, btype s logger.Error("AddCoinToTouTiao err=%v", err) return 0, 0, err } + + //获取 GlobalID + globalid, err := GetBytedanceGlobalID(acctoken, openid) + if err != nil { + logger.Error("AddCoinToTouTiao err=%v", err) + return 0, 0, err + } + var reqdata AddcointotoutiaoReq reqdata.Access_token = acctoken reqdata.Amount = amount @@ -280,6 +291,7 @@ func AddCoinToTouTiao(openid string, deviceid, amount int, descr string, btype s reqdata.Description = descr reqdata.Device_id = deviceid reqdata.Open_id = openid + reqdata.GlobalID = globalid logger.Info("AddCoinToTouTiao req=%v", reqdata) bys, err := json.Marshal(&reqdata) if err != nil { @@ -287,11 +299,17 @@ func AddCoinToTouTiao(openid string, deviceid, amount int, descr string, btype s return 0, 0, err } - res, err := DoHttpPost(bys, ADDCOINTOTOUTIAOURL) + //计算签名 + signbody, _ := json.Marshal(reqdata) + signature := CreateCommonBytedanceSign(signbody, openid) + apiurl := ADDCOINTOTOUTIAOURL + "?signature=" + signature + + res, err := DoHttpPost(bys, apiurl) 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 { diff --git a/src/common/redis/def.go b/src/common/redis/def.go index 56043e1..543e8a9 100644 --- a/src/common/redis/def.go +++ b/src/common/redis/def.go @@ -3,4 +3,5 @@ package redis const ( USER_DATA_KEY = "DAYCS_USER_DATA_KEY" //玩家数据 hset GAME_ACCESS_TOKEN = "DAYCD_GAME_ACCESS_TOKEN" //头条sdk + USER_SESSION_KEY = "usk_" //头条用户sessionkey ) diff --git a/src/mysql/dbmysql.go b/src/mysql/dbmysql.go index 9c96a55..93f5b01 100644 --- a/src/mysql/dbmysql.go +++ b/src/mysql/dbmysql.go @@ -145,8 +145,6 @@ func GetFromBackUp(openid string) (err error, Openid string, LastGetTime, LeftCn defer rows.Close() } - logger.Error("cmd", cmd) - if err != nil { logger.Notic("GetFromBackUp mysql select error:%v", err) return -- libgit2 0.21.0