package game_mgr import ( "app/service/main/message/pb" "app/service/main/redis" "crypto/md5" "encoding/base64" "encoding/json" "fmt" "github.com/gin-gonic/gin" "io" "sort" "strings" ) func RunHttp() error { r := gin.Default() r.HEAD("/push/:appId", OnDataPush) r.POST("/push/:appId", OnDataPush) return r.RunTLS(":8898", "tsl/server.pem", "tsl/server.key") } func OnDataPush(c *gin.Context) { var err error defer func() { c.JSON(200, gin.H{ "message": "ok", }) if err != nil { fmt.Println("OnDataPush err", err) } return }() appId := c.Param("appId") appSecret, ok := APP_TOKEN_MAP[appId] if !ok { return } roomId := c.GetHeader("x-roomid") msgType := c.GetHeader("x-msg-type") headerCheck := map[string]string{ "x-nonce-str": c.GetHeader("x-nonce-str"), "x-timestamp": c.GetHeader("x-timestamp"), "x-msg-type": msgType, "x-roomid": roomId, } bodyData, err := io.ReadAll(c.Request.Body) if err != nil { return } signatureRemote := c.GetHeader("x-signature") signatureLocal := signature(headerCheck, string(bodyData), appSecret) if false && signatureRemote != signatureLocal { return } var audienceData []*pb.Audience var notifyData []*pb.NotifyAudienceAction switch msgType { case "live_comment": var rawData []*struct { AvatarUrl string `json:"avatar_url"` Content string `json:"content"` MsgID string `json:"msg_id"` NickName string `json:"nickname"` SecOpenid string `json:"sec_openid"` Timestamp int64 `json:"timestamp"` } err = json.Unmarshal(bodyData, &rawData) if err != nil { return } for _, data := range rawData { audienceData = append(audienceData, &pb.Audience{ OpenId: data.SecOpenid, NickName: data.NickName, AvatarUrl: data.AvatarUrl, }) notifyData = append(notifyData, &pb.NotifyAudienceAction{ OpenId: data.SecOpenid, Content: data.Content, }) } case "live_gift": var rawData []*struct { MsgID string `json:"msg_id"` SecOpenid string `json:"sec_openid"` SecGiftID string `json:"sec_gift_id"` GiftNum int `json:"gift_num"` GiftValue int `json:"gift_value"` AvatarUrl string `json:"avatar_url"` NickName string `json:"nickname"` Timestamp int `json:"timestamp"` Test bool `json:"test"` } err = json.Unmarshal(bodyData, &rawData) if err != nil { return } for _, data := range rawData { audienceData = append(audienceData, &pb.Audience{ OpenId: data.SecOpenid, NickName: data.NickName, AvatarUrl: data.AvatarUrl, }) notifyData = append(notifyData, &pb.NotifyAudienceAction{ OpenId: data.SecOpenid, GiftId: data.SecGiftID, }) } case "live_like": var rawData []*struct { MsgID string `json:"msg_id"` SecOpenid string `json:"sec_openid"` LikeNum int `json:"like_num"` AvatarUrl string `json:"avatar_url"` NickName string `json:"nickname"` Timestamp int `json:"timestamp"` } err = json.Unmarshal(bodyData, &rawData) if err != nil { return } for _, data := range rawData { audienceData = append(audienceData, &pb.Audience{ OpenId: data.SecOpenid, NickName: data.NickName, AvatarUrl: data.AvatarUrl, }) notifyData = append(notifyData, &pb.NotifyAudienceAction{ OpenId: data.SecOpenid, LikeNum: int32(data.LikeNum), }) } } for _, audience := range audienceData { redis.SetAudience(appId, audience) } for _, notify := range notifyData { redis.Publish(appId, roomId, notify) fmt.Println("[Publish]", appId, roomId) } } func signature(header map[string]string, bodyStr, secret string) string { keyList := make([]string, 0, 4) for key, _ := range header { keyList = append(keyList, key) } sort.Slice(keyList, func(i, j int) bool { return keyList[i] < keyList[j] }) kvList := make([]string, 0, 4) for _, key := range keyList { kvList = append(kvList, key+"="+header[key]) } urlParams := strings.Join(kvList, "&") rawData := urlParams + bodyStr + secret md5Result := md5.Sum([]byte(rawData)) return base64.StdEncoding.EncodeToString(md5Result[:]) }