callback.go 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271
  1. package http
  2. import (
  3. "encoding/json"
  4. "io/ioutil"
  5. "net/url"
  6. "strconv"
  7. "strings"
  8. "go-common/app/service/main/push/dao/huawei"
  9. "go-common/app/service/main/push/dao/jpush"
  10. "go-common/app/service/main/push/dao/mi"
  11. "go-common/app/service/main/push/dao/oppo"
  12. pushmdl "go-common/app/service/main/push/model"
  13. "go-common/library/ecode"
  14. "go-common/library/log"
  15. bm "go-common/library/net/http/blademaster"
  16. )
  17. var mobis = map[string]int{
  18. "android": pushmdl.MobiAndroid,
  19. "android_i": pushmdl.MobiAndroid,
  20. "iphone": pushmdl.MobiIPhone,
  21. "ipad": pushmdl.MobiIPad,
  22. "android_comic": pushmdl.MobiAndroidComic,
  23. }
  24. func huaweiCallback(c *bm.Context) {
  25. var (
  26. err error
  27. res = make(map[string]interface{})
  28. )
  29. defer func() {
  30. c.JSONMap(res, err)
  31. }()
  32. bs, err := ioutil.ReadAll(c.Request.Body)
  33. if err != nil {
  34. res["errno"] = ecode.RequestErr
  35. res["errmsg"] = "param error"
  36. log.Error("huawei callback param(%s) error", bs)
  37. return
  38. }
  39. cb := new(huawei.Callback)
  40. if err = json.Unmarshal(bs, &cb); err != nil {
  41. res["errno"] = ecode.RequestErr
  42. res["errmsg"] = "param error"
  43. log.Error("huawei callback param(%s) error(%v)", bs, err)
  44. return
  45. }
  46. if err = pushSrv.CallbackHuawei(c, cb); err != nil {
  47. res["errno"] = err
  48. res["errmsg"] = err.Error()
  49. log.Error("huawei callback param(%s) error(%v)", bs, err)
  50. return
  51. }
  52. res["errno"] = ecode.OK
  53. res["errmsg"] = "success"
  54. }
  55. func miCallback(c *bm.Context) {
  56. param := c.Request.Form
  57. d := param.Get("data")
  58. if d == "" {
  59. c.JSON(nil, ecode.RequestErr)
  60. log.Error("xiaomi callback param empty")
  61. return
  62. }
  63. m := map[string]*mi.Callback{}
  64. if err := json.Unmarshal([]byte(d), &m); err != nil {
  65. c.JSON(nil, ecode.RequestErr)
  66. log.Error("xiaomi callback param(%s) error(%v)", d, err)
  67. return
  68. }
  69. c.JSON(nil, pushSrv.CallbackXiaomi(c, m))
  70. }
  71. func miRegidCallback(c *bm.Context) {
  72. params := c.Request.Form
  73. appID := params.Get("app_id")
  74. if appID == "" {
  75. c.JSON(nil, ecode.RequestErr)
  76. log.Error("app_id is empty")
  77. return
  78. }
  79. appVer := params.Get("app_version")
  80. if appVer == "" {
  81. c.JSON(nil, ecode.RequestErr)
  82. log.Error("app_version is empty")
  83. return
  84. }
  85. appPkg := params.Get("app_pkg")
  86. if appPkg == "" {
  87. c.JSON(nil, ecode.RequestErr)
  88. log.Error("app_pkg is empty")
  89. return
  90. }
  91. regid := params.Get("regid")
  92. if regid == "" {
  93. c.JSON(nil, ecode.RequestErr)
  94. log.Error("regid is empty")
  95. return
  96. }
  97. auth := strings.TrimPrefix(c.Request.Header.Get("Authorization"), "key=")
  98. if auth == "" {
  99. c.JSON(nil, ecode.RequestErr)
  100. log.Error("auth is empty")
  101. return
  102. }
  103. cb := &mi.RegidCallback{
  104. AppID: appID,
  105. AppVer: appVer,
  106. AppPkg: appPkg,
  107. AppSecret: auth,
  108. Regid: regid,
  109. }
  110. c.JSON(nil, pushSrv.CallbackXiaomiRegid(c, cb))
  111. }
  112. func oppoCallback(c *bm.Context) {
  113. bs, err := ioutil.ReadAll(c.Request.Body)
  114. if err != nil {
  115. c.JSON(nil, ecode.RequestErr)
  116. log.Error("huawei callback param(%s) error", bs)
  117. return
  118. }
  119. var cb []*oppo.Callback
  120. if err = json.Unmarshal(bs, &cb); err != nil {
  121. c.JSON(nil, ecode.RequestErr)
  122. log.Error("oppo callback param(%s) error(%v)", bs, err)
  123. return
  124. }
  125. param := c.Request.Form
  126. task := param.Get("task")
  127. if task == "" {
  128. c.JSON(nil, ecode.RequestErr)
  129. log.Error("oppo callback task empty")
  130. return
  131. }
  132. c.JSON(nil, pushSrv.CallbackOppo(c, task, cb))
  133. }
  134. func jpushCallback(ctx *bm.Context) {
  135. bs, err := ioutil.ReadAll(ctx.Request.Body)
  136. if err != nil {
  137. log.Error("jpush batch callback param(%s) error(%v)", bs, err)
  138. ctx.JSON(nil, ecode.RequestErr)
  139. return
  140. }
  141. var cbs []*jpush.CallbackReply
  142. if err = json.Unmarshal(bs, &cbs); err != nil {
  143. log.Error("jpush batch callback param(%s) error(%v)", bs, err)
  144. ctx.JSON(nil, ecode.RequestErr)
  145. return
  146. }
  147. ctx.JSON(nil, pushSrv.CallbackJpush(ctx, cbs))
  148. }
  149. func iOSCallback(c *bm.Context) {
  150. params := c.Request.Form
  151. task := params.Get("task")
  152. if task == "" {
  153. c.JSON(nil, ecode.RequestErr)
  154. log.Error("task is empty")
  155. return
  156. }
  157. p := params.Get("mobi_app")
  158. if p == "" {
  159. c.JSON(nil, ecode.RequestErr)
  160. log.Error("mobi_app is empty")
  161. return
  162. }
  163. token := params.Get("tid")
  164. if token == "" {
  165. c.JSON(nil, ecode.RequestErr)
  166. log.Error("tid is empty")
  167. return
  168. }
  169. c.JSON(nil, pushSrv.CallbackIOS(c, task, token, mobis[p]))
  170. }
  171. func androidCallback(c *bm.Context) {
  172. // Warn: 刚开始接极光时,极光没有回执功能,只能客户端来做送达回执,数据不准确
  173. // 如今极光提供了送达回执的功能,数据不能重复记录,所以这里直接return
  174. // 目前这个方法只有极光送达回执在调用(调用方是客户端),直接停用
  175. c.JSON(nil, nil)
  176. }
  177. func clickCallback(c *bm.Context) {
  178. var (
  179. err error
  180. pid int
  181. platform int
  182. params = c.Request.Form
  183. )
  184. task := params.Get("task")
  185. if task == "" {
  186. c.JSON(nil, ecode.RequestErr)
  187. log.Error("task is empty")
  188. return
  189. }
  190. app, _ := strconv.ParseInt(params.Get("app"), 10, 64)
  191. if app <= 0 {
  192. c.JSON(nil, ecode.RequestErr)
  193. log.Error("app error(%s)", params.Get("app"))
  194. return
  195. }
  196. mid, _ := strconv.ParseInt(params.Get("mid"), 10, 64)
  197. p := params.Get("mobi_app")
  198. if p == "" {
  199. c.JSON(nil, ecode.RequestErr)
  200. log.Error("mobi_app is empty")
  201. return
  202. }
  203. pid, ok := mobis[p]
  204. if !ok {
  205. c.JSON(nil, ecode.RequestErr)
  206. log.Error("mobi_app error(%s)", params.Get("mobi_app"))
  207. return
  208. }
  209. sdk, _ := strconv.Atoi(params.Get("push_sdk"))
  210. if sdk == 0 {
  211. c.JSON(nil, ecode.RequestErr)
  212. log.Error("push_sdk error(%s)", params.Get("push_sdk"))
  213. return
  214. }
  215. switch sdk {
  216. case pushmdl.PushSDKApns:
  217. if pid == pushmdl.MobiIPhone {
  218. platform = pushmdl.PlatformIPhone
  219. } else if pid == pushmdl.MobiIPad {
  220. platform = pushmdl.PlatformIPad
  221. }
  222. case pushmdl.PushSDKXiaomi:
  223. platform = pushmdl.PlatformXiaomi
  224. case pushmdl.PushSDKHuawei:
  225. platform = pushmdl.PlatformHuawei
  226. case pushmdl.PushSDKOppo:
  227. platform = pushmdl.PlatformOppo
  228. case pushmdl.PushSDKJpush:
  229. platform = pushmdl.PlatformJpush
  230. default:
  231. c.JSON(nil, ecode.RequestErr)
  232. log.Error("invalid push_sdk value(%d)", sdk)
  233. return
  234. }
  235. token, err := url.QueryUnescape(params.Get("token"))
  236. if err != nil || token == "" {
  237. c.JSON(nil, ecode.RequestErr)
  238. log.Error("token(%s) error(%v)", params.Get("token"), err)
  239. return
  240. }
  241. buvid := c.Request.Header.Get("Buvid")
  242. if buvid == "" {
  243. if buvid, err = url.QueryUnescape(params.Get("buvid")); buvid == "" {
  244. c.JSON(nil, ecode.RequestErr)
  245. log.Error("buvid(%s) error(%v)", params.Get("buvid"), err)
  246. return
  247. }
  248. }
  249. cb := &pushmdl.Callback{
  250. Task: task,
  251. APP: app,
  252. Platform: platform,
  253. Mid: mid,
  254. Pid: pid,
  255. Token: token,
  256. Buvid: buvid,
  257. Click: 1,
  258. }
  259. c.JSON(nil, pushSrv.CallbackClick(c, cb))
  260. }