Commit 900acc73acc49abff83f492fcaa59b5961fb4f86
1 parent
425e2c97
Exists in
master
新增签名等功能
Showing
6 changed files
with
110 additions
and
5 deletions
Show diff stats
| @@ -0,0 +1,78 @@ | @@ -0,0 +1,78 @@ | ||
| 1 | +package logic | ||
| 2 | + | ||
| 3 | +//2021-04-14添加 | ||
| 4 | +//https://bytedance.feishu.cn/docs/doccnkUkS6ivKQgbeGPxjN3mgNc# | ||
| 5 | + | ||
| 6 | +import ( | ||
| 7 | + "HttpServer/redishandler" | ||
| 8 | + "common/logger" | ||
| 9 | + "common/redis" | ||
| 10 | + "crypto/hmac" | ||
| 11 | + "crypto/sha256" | ||
| 12 | + "encoding/hex" | ||
| 13 | + "encoding/json" | ||
| 14 | + "errors" | ||
| 15 | + "io/ioutil" | ||
| 16 | + "net/http" | ||
| 17 | +) | ||
| 18 | + | ||
| 19 | +// 计算签名算法 | ||
| 20 | +func CreateCommonBytedanceSign(post_body []byte, openid string) string { | ||
| 21 | + sessionkey := GetBytedanceSessionKey(openid) | ||
| 22 | + if sessionkey != "" { | ||
| 23 | + return CreateBytedanceSign(sessionkey, post_body) | ||
| 24 | + } | ||
| 25 | + return "" | ||
| 26 | +} | ||
| 27 | + | ||
| 28 | +// 计算签名算法 | ||
| 29 | +func CreateBytedanceSign(session_key string, post_body []byte) string { | ||
| 30 | + h := hmac.New(sha256.New, []byte(session_key)) | ||
| 31 | + h.Write(post_body) | ||
| 32 | + hashcode2 := hex.EncodeToString(h.Sum(nil)) | ||
| 33 | + return hashcode2 | ||
| 34 | +} | ||
| 35 | + | ||
| 36 | +// 保存sessionkey | ||
| 37 | +func SetBytedanceSessionKey(openid, sessionkey string) { | ||
| 38 | + rediskey := redis.USER_SESSION_KEY + "_" + openid | ||
| 39 | + expire := 86400 * 30 | ||
| 40 | + redishandler.GetRedisClient().SetExString(rediskey, sessionkey, expire) | ||
| 41 | +} | ||
| 42 | + | ||
| 43 | +// 获取sessionkey | ||
| 44 | +func GetBytedanceSessionKey(openid string) string { | ||
| 45 | + rediskey := redis.USER_SESSION_KEY + "_" + openid | ||
| 46 | + val, _ := redishandler.GetRedisClient().GetString(rediskey) | ||
| 47 | + return val | ||
| 48 | +} | ||
| 49 | + | ||
| 50 | +//获取global_id | ||
| 51 | +func GetBytedanceGlobalID(access_token, openid string) (globalid int, err error) { | ||
| 52 | + url := GETGLOBALIDURL + "?access_token=" + access_token + "&open_id=" + openid | ||
| 53 | + res, err := http.Get(url) | ||
| 54 | + if err != nil { | ||
| 55 | + logger.Error("GetBytedanceGlobalID err=%v", err) | ||
| 56 | + return | ||
| 57 | + } | ||
| 58 | + | ||
| 59 | + result, _ := ioutil.ReadAll(res.Body) | ||
| 60 | + defer res.Body.Close() | ||
| 61 | + | ||
| 62 | + var tmp GetGlobalIDResp | ||
| 63 | + err = json.Unmarshal(result, &tmp) | ||
| 64 | + if err != nil { | ||
| 65 | + logger.Error("GetBytedanceGlobalID err=%v", err) | ||
| 66 | + return | ||
| 67 | + } | ||
| 68 | + | ||
| 69 | + if tmp.Errcode != 0 { | ||
| 70 | + logger.Error("GetBytedanceGlobalID err=%v", tmp.Errmsg) | ||
| 71 | + err = errors.New("GetBytedanceGlobalID error:tmp:" + string(result)) | ||
| 72 | + return | ||
| 73 | + } | ||
| 74 | + | ||
| 75 | + globalid = tmp.GlobalID | ||
| 76 | + return | ||
| 77 | + | ||
| 78 | +} |
src/HttpServer/logic/constdef.go
| @@ -5,10 +5,13 @@ const ( | @@ -5,10 +5,13 @@ const ( | ||
| 5 | ) | 5 | ) |
| 6 | 6 | ||
| 7 | const ( | 7 | const ( |
| 8 | + GETGLOBALIDURL = "https://developer.toutiao.com/api/apps/gold/gen_global_id" //获取global_id | ||
| 8 | ADDCOINTOTOUTIAOURL = "https://developer.toutiao.com/api/apps/gold/deliver" | 9 | ADDCOINTOTOUTIAOURL = "https://developer.toutiao.com/api/apps/gold/deliver" |
| 9 | GETTOUTIAOACCESSTOKENURL = "https://developer.toutiao.com/api/apps/token" | 10 | GETTOUTIAOACCESSTOKENURL = "https://developer.toutiao.com/api/apps/token" |
| 10 | GETTOUTIAOOPENIDURL = "https://developer.toutiao.com/api/apps/jscode2session" | 11 | GETTOUTIAOOPENIDURL = "https://developer.toutiao.com/api/apps/jscode2session" |
| 11 | GETTOUTIAOCOINURL = "https://developer.toutiao.com/api/apps/gold/search" | 12 | GETTOUTIAOCOINURL = "https://developer.toutiao.com/api/apps/gold/search" |
| 12 | - TOUTIAOAPPID = "tt841ff2a21b254572" //"tt29e35f5eb6c9b9dd" | ||
| 13 | - TOUTIAOSECRET = "14a09009e4ea999261876a4b26b09ec2ebc1e7ee" //"100cb2286445027f606844fc156121dd7db06075" | 13 | + //TOUTIAOAPPID = "tt841ff2a21b254572" //"tt29e35f5eb6c9b9dd 正式tt841ff2a21b254572" |
| 14 | + //TOUTIAOSECRET = "14a09009e4ea999261876a4b26b09ec2ebc1e7ee" //"100cb2286445027f606844fc156121dd7db06075 正式14a09009e4ea999261876a4b26b09ec2ebc1e7ee" | ||
| 15 | + TOUTIAOAPPID = "tted769bcb724e5b1201" | ||
| 16 | + TOUTIAOSECRET = "daa13cc0d0e27960438bb2071c950d59ab80ab14" | ||
| 14 | ) | 17 | ) |
src/HttpServer/logic/datadef.go
| @@ -7,6 +7,7 @@ type AddcointotoutiaoReq struct { | @@ -7,6 +7,7 @@ type AddcointotoutiaoReq struct { | ||
| 7 | Amount int `json:"amount"` | 7 | Amount int `json:"amount"` |
| 8 | Description string `json:"description"` | 8 | Description string `json:"description"` |
| 9 | Bonus_type string `json:"bonus_type"` | 9 | Bonus_type string `json:"bonus_type"` |
| 10 | + GlobalID int `json:"global_id"` | ||
| 10 | } | 11 | } |
| 11 | 12 | ||
| 12 | type AddcointotoutiaoResp struct { | 13 | type AddcointotoutiaoResp struct { |
| @@ -29,6 +30,12 @@ type GetOpenidResp struct { | @@ -29,6 +30,12 @@ type GetOpenidResp struct { | ||
| 29 | Errmsg string `json:"errmsg"` | 30 | Errmsg string `json:"errmsg"` |
| 30 | } | 31 | } |
| 31 | 32 | ||
| 33 | +type GetGlobalIDResp struct { | ||
| 34 | + GlobalID int `json:"global_id"` | ||
| 35 | + Errcode int `json:"errcode"` | ||
| 36 | + Errmsg string `json:"errmsg"` | ||
| 37 | +} | ||
| 38 | + | ||
| 32 | //-------------------------------------------------------------------------- | 39 | //-------------------------------------------------------------------------- |
| 33 | 40 | ||
| 34 | type GetcurpropertyReq struct { | 41 | type GetcurpropertyReq struct { |
src/HttpServer/logic/function.go
| @@ -188,6 +188,9 @@ func GetOpenid(code string) (string, error) { | @@ -188,6 +188,9 @@ func GetOpenid(code string) (string, error) { | ||
| 188 | return "", errors.New(tmp.Errmsg) | 188 | return "", errors.New(tmp.Errmsg) |
| 189 | } | 189 | } |
| 190 | 190 | ||
| 191 | + //保存头条session key | ||
| 192 | + go SetBytedanceSessionKey(tmp.Openid, tmp.Session_key) | ||
| 193 | + | ||
| 191 | return tmp.Openid, nil | 194 | return tmp.Openid, nil |
| 192 | } | 195 | } |
| 193 | 196 | ||
| @@ -273,6 +276,14 @@ func AddCoinToTouTiao(openid string, deviceid, amount int, descr string, btype s | @@ -273,6 +276,14 @@ func AddCoinToTouTiao(openid string, deviceid, amount int, descr string, btype s | ||
| 273 | logger.Error("AddCoinToTouTiao err=%v", err) | 276 | logger.Error("AddCoinToTouTiao err=%v", err) |
| 274 | return 0, 0, err | 277 | return 0, 0, err |
| 275 | } | 278 | } |
| 279 | + | ||
| 280 | + //获取 GlobalID | ||
| 281 | + globalid, err := GetBytedanceGlobalID(acctoken, openid) | ||
| 282 | + if err != nil { | ||
| 283 | + logger.Error("AddCoinToTouTiao err=%v", err) | ||
| 284 | + return 0, 0, err | ||
| 285 | + } | ||
| 286 | + | ||
| 276 | var reqdata AddcointotoutiaoReq | 287 | var reqdata AddcointotoutiaoReq |
| 277 | reqdata.Access_token = acctoken | 288 | reqdata.Access_token = acctoken |
| 278 | reqdata.Amount = amount | 289 | reqdata.Amount = amount |
| @@ -280,6 +291,7 @@ func AddCoinToTouTiao(openid string, deviceid, amount int, descr string, btype s | @@ -280,6 +291,7 @@ func AddCoinToTouTiao(openid string, deviceid, amount int, descr string, btype s | ||
| 280 | reqdata.Description = descr | 291 | reqdata.Description = descr |
| 281 | reqdata.Device_id = deviceid | 292 | reqdata.Device_id = deviceid |
| 282 | reqdata.Open_id = openid | 293 | reqdata.Open_id = openid |
| 294 | + reqdata.GlobalID = globalid | ||
| 283 | logger.Info("AddCoinToTouTiao req=%v", reqdata) | 295 | logger.Info("AddCoinToTouTiao req=%v", reqdata) |
| 284 | bys, err := json.Marshal(&reqdata) | 296 | bys, err := json.Marshal(&reqdata) |
| 285 | if err != nil { | 297 | if err != nil { |
| @@ -287,11 +299,17 @@ func AddCoinToTouTiao(openid string, deviceid, amount int, descr string, btype s | @@ -287,11 +299,17 @@ func AddCoinToTouTiao(openid string, deviceid, amount int, descr string, btype s | ||
| 287 | return 0, 0, err | 299 | return 0, 0, err |
| 288 | } | 300 | } |
| 289 | 301 | ||
| 290 | - res, err := DoHttpPost(bys, ADDCOINTOTOUTIAOURL) | 302 | + //计算签名 |
| 303 | + signbody, _ := json.Marshal(reqdata) | ||
| 304 | + signature := CreateCommonBytedanceSign(signbody, openid) | ||
| 305 | + apiurl := ADDCOINTOTOUTIAOURL + "?signature=" + signature | ||
| 306 | + | ||
| 307 | + res, err := DoHttpPost(bys, apiurl) | ||
| 291 | if err != nil { | 308 | if err != nil { |
| 292 | logger.Error("AddCoinToTouTiao failed=%v", err) | 309 | logger.Error("AddCoinToTouTiao failed=%v", err) |
| 293 | return 0, 0, err | 310 | return 0, 0, err |
| 294 | } | 311 | } |
| 312 | + | ||
| 295 | var resp AddcointotoutiaoResp | 313 | var resp AddcointotoutiaoResp |
| 296 | err = json.Unmarshal([]byte(res), &resp) | 314 | err = json.Unmarshal([]byte(res), &resp) |
| 297 | if err != nil { | 315 | if err != nil { |
src/common/redis/def.go
| @@ -3,4 +3,5 @@ package redis | @@ -3,4 +3,5 @@ package redis | ||
| 3 | const ( | 3 | const ( |
| 4 | USER_DATA_KEY = "DAYCS_USER_DATA_KEY" //玩家数据 hset | 4 | USER_DATA_KEY = "DAYCS_USER_DATA_KEY" //玩家数据 hset |
| 5 | GAME_ACCESS_TOKEN = "DAYCD_GAME_ACCESS_TOKEN" //头条sdk | 5 | GAME_ACCESS_TOKEN = "DAYCD_GAME_ACCESS_TOKEN" //头条sdk |
| 6 | + USER_SESSION_KEY = "usk_" //头条用户sessionkey | ||
| 6 | ) | 7 | ) |
src/mysql/dbmysql.go
| @@ -145,8 +145,6 @@ func GetFromBackUp(openid string) (err error, Openid string, LastGetTime, LeftCn | @@ -145,8 +145,6 @@ func GetFromBackUp(openid string) (err error, Openid string, LastGetTime, LeftCn | ||
| 145 | defer rows.Close() | 145 | defer rows.Close() |
| 146 | } | 146 | } |
| 147 | 147 | ||
| 148 | - logger.Error("cmd", cmd) | ||
| 149 | - | ||
| 150 | if err != nil { | 148 | if err != nil { |
| 151 | logger.Notic("GetFromBackUp mysql select error:%v", err) | 149 | logger.Notic("GetFromBackUp mysql select error:%v", err) |
| 152 | return | 150 | return |