package http import ( "encoding/json" "io/ioutil" "net/url" "strconv" "strings" "go-common/app/service/main/push/dao/huawei" "go-common/app/service/main/push/dao/jpush" "go-common/app/service/main/push/dao/mi" "go-common/app/service/main/push/dao/oppo" pushmdl "go-common/app/service/main/push/model" "go-common/library/ecode" "go-common/library/log" bm "go-common/library/net/http/blademaster" ) var mobis = map[string]int{ "android": pushmdl.MobiAndroid, "android_i": pushmdl.MobiAndroid, "iphone": pushmdl.MobiIPhone, "ipad": pushmdl.MobiIPad, "android_comic": pushmdl.MobiAndroidComic, } func huaweiCallback(c *bm.Context) { var ( err error res = make(map[string]interface{}) ) defer func() { c.JSONMap(res, err) }() bs, err := ioutil.ReadAll(c.Request.Body) if err != nil { res["errno"] = ecode.RequestErr res["errmsg"] = "param error" log.Error("huawei callback param(%s) error", bs) return } cb := new(huawei.Callback) if err = json.Unmarshal(bs, &cb); err != nil { res["errno"] = ecode.RequestErr res["errmsg"] = "param error" log.Error("huawei callback param(%s) error(%v)", bs, err) return } if err = pushSrv.CallbackHuawei(c, cb); err != nil { res["errno"] = err res["errmsg"] = err.Error() log.Error("huawei callback param(%s) error(%v)", bs, err) return } res["errno"] = ecode.OK res["errmsg"] = "success" } func miCallback(c *bm.Context) { param := c.Request.Form d := param.Get("data") if d == "" { c.JSON(nil, ecode.RequestErr) log.Error("xiaomi callback param empty") return } m := map[string]*mi.Callback{} if err := json.Unmarshal([]byte(d), &m); err != nil { c.JSON(nil, ecode.RequestErr) log.Error("xiaomi callback param(%s) error(%v)", d, err) return } c.JSON(nil, pushSrv.CallbackXiaomi(c, m)) } func miRegidCallback(c *bm.Context) { params := c.Request.Form appID := params.Get("app_id") if appID == "" { c.JSON(nil, ecode.RequestErr) log.Error("app_id is empty") return } appVer := params.Get("app_version") if appVer == "" { c.JSON(nil, ecode.RequestErr) log.Error("app_version is empty") return } appPkg := params.Get("app_pkg") if appPkg == "" { c.JSON(nil, ecode.RequestErr) log.Error("app_pkg is empty") return } regid := params.Get("regid") if regid == "" { c.JSON(nil, ecode.RequestErr) log.Error("regid is empty") return } auth := strings.TrimPrefix(c.Request.Header.Get("Authorization"), "key=") if auth == "" { c.JSON(nil, ecode.RequestErr) log.Error("auth is empty") return } cb := &mi.RegidCallback{ AppID: appID, AppVer: appVer, AppPkg: appPkg, AppSecret: auth, Regid: regid, } c.JSON(nil, pushSrv.CallbackXiaomiRegid(c, cb)) } func oppoCallback(c *bm.Context) { bs, err := ioutil.ReadAll(c.Request.Body) if err != nil { c.JSON(nil, ecode.RequestErr) log.Error("huawei callback param(%s) error", bs) return } var cb []*oppo.Callback if err = json.Unmarshal(bs, &cb); err != nil { c.JSON(nil, ecode.RequestErr) log.Error("oppo callback param(%s) error(%v)", bs, err) return } param := c.Request.Form task := param.Get("task") if task == "" { c.JSON(nil, ecode.RequestErr) log.Error("oppo callback task empty") return } c.JSON(nil, pushSrv.CallbackOppo(c, task, cb)) } func jpushCallback(ctx *bm.Context) { bs, err := ioutil.ReadAll(ctx.Request.Body) if err != nil { log.Error("jpush batch callback param(%s) error(%v)", bs, err) ctx.JSON(nil, ecode.RequestErr) return } var cbs []*jpush.CallbackReply if err = json.Unmarshal(bs, &cbs); err != nil { log.Error("jpush batch callback param(%s) error(%v)", bs, err) ctx.JSON(nil, ecode.RequestErr) return } ctx.JSON(nil, pushSrv.CallbackJpush(ctx, cbs)) } func iOSCallback(c *bm.Context) { params := c.Request.Form task := params.Get("task") if task == "" { c.JSON(nil, ecode.RequestErr) log.Error("task is empty") return } p := params.Get("mobi_app") if p == "" { c.JSON(nil, ecode.RequestErr) log.Error("mobi_app is empty") return } token := params.Get("tid") if token == "" { c.JSON(nil, ecode.RequestErr) log.Error("tid is empty") return } c.JSON(nil, pushSrv.CallbackIOS(c, task, token, mobis[p])) } func androidCallback(c *bm.Context) { // Warn: 刚开始接极光时,极光没有回执功能,只能客户端来做送达回执,数据不准确 // 如今极光提供了送达回执的功能,数据不能重复记录,所以这里直接return // 目前这个方法只有极光送达回执在调用(调用方是客户端),直接停用 c.JSON(nil, nil) } func clickCallback(c *bm.Context) { var ( err error pid int platform int params = c.Request.Form ) task := params.Get("task") if task == "" { c.JSON(nil, ecode.RequestErr) log.Error("task is empty") return } app, _ := strconv.ParseInt(params.Get("app"), 10, 64) if app <= 0 { c.JSON(nil, ecode.RequestErr) log.Error("app error(%s)", params.Get("app")) return } mid, _ := strconv.ParseInt(params.Get("mid"), 10, 64) p := params.Get("mobi_app") if p == "" { c.JSON(nil, ecode.RequestErr) log.Error("mobi_app is empty") return } pid, ok := mobis[p] if !ok { c.JSON(nil, ecode.RequestErr) log.Error("mobi_app error(%s)", params.Get("mobi_app")) return } sdk, _ := strconv.Atoi(params.Get("push_sdk")) if sdk == 0 { c.JSON(nil, ecode.RequestErr) log.Error("push_sdk error(%s)", params.Get("push_sdk")) return } switch sdk { case pushmdl.PushSDKApns: if pid == pushmdl.MobiIPhone { platform = pushmdl.PlatformIPhone } else if pid == pushmdl.MobiIPad { platform = pushmdl.PlatformIPad } case pushmdl.PushSDKXiaomi: platform = pushmdl.PlatformXiaomi case pushmdl.PushSDKHuawei: platform = pushmdl.PlatformHuawei case pushmdl.PushSDKOppo: platform = pushmdl.PlatformOppo case pushmdl.PushSDKJpush: platform = pushmdl.PlatformJpush default: c.JSON(nil, ecode.RequestErr) log.Error("invalid push_sdk value(%d)", sdk) return } token, err := url.QueryUnescape(params.Get("token")) if err != nil || token == "" { c.JSON(nil, ecode.RequestErr) log.Error("token(%s) error(%v)", params.Get("token"), err) return } buvid := c.Request.Header.Get("Buvid") if buvid == "" { if buvid, err = url.QueryUnescape(params.Get("buvid")); buvid == "" { c.JSON(nil, ecode.RequestErr) log.Error("buvid(%s) error(%v)", params.Get("buvid"), err) return } } cb := &pushmdl.Callback{ Task: task, APP: app, Platform: platform, Mid: mid, Pid: pid, Token: token, Buvid: buvid, Click: 1, } c.JSON(nil, pushSrv.CallbackClick(c, cb)) }