router.go 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419
  1. package router
  2. import (
  3. "fmt"
  4. "github.com/gogf/gf/frame/g"
  5. "github.com/gogf/gf/net/ghttp"
  6. "github.com/gogf/gf/os/gtime"
  7. douyinOauth "github.com/lin-jim-leon/douyin/open/oauth"
  8. douyinUser "github.com/lin-jim-leon/douyin/open/user"
  9. _ "github.com/lin-jim-leon/kuaishou/open/merchant"
  10. "github.com/lin-jim-leon/kuaishou/open/oauth"
  11. _ "github.com/lin-jim-leon/kuaishou/open/oauth"
  12. "github.com/lin-jim-leon/kuaishou/open/user"
  13. _ "github.com/lin-jim-leon/kuaishou/open/user"
  14. "strconv"
  15. youngeetalentapi "youngmini_server/app/api/youngee_talent_api"
  16. "youngmini_server/app/model/youngee_talent_model"
  17. "youngmini_server/app/service/youngee_talent_service"
  18. "youngmini_server/app/system/assignment"
  19. "youngmini_server/app/system/sectask"
  20. "youngmini_server/app/system/wxpay"
  21. "youngmini_server/middleware"
  22. )
  23. // MiddlewareCORS 允许跨域请求中间件 所有的路由都会经过这个中间件
  24. func MiddlewareCORS(r *ghttp.Request) {
  25. corsOptions := r.Response.DefaultCORSOptions()
  26. corsOptions.AllowHeaders = "Authorization,Content-Length,X-CSRF-Token,Token,session,X_Requested_With,Accept,Origin,Host,Connection,Accept-Encoding,Accept-Language,DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Pragma"
  27. corsOptions.ExposeHeaders = "Content-Length,Access-Control-Allow-Origin,Access-Control-Allow-Headers,Content-Language,Expires,Last-Modified,Pragma,FooBar"
  28. corsOptions.MaxAge = 1728000
  29. //corsOptions := ghttp.CORSOptions{
  30. //AllowOrigin: "*",
  31. //AllowMethods: "POST,GET,OPTIONS,PUT,DELETE,UPDATE",
  32. //AllowCredentials: "false",
  33. //MaxAge: 1728000,
  34. //AllowHeaders: "Authorization,Content-Length,X-CSRF-Token,Token,session,X_Requested_With,Accept,Origin,Host,Connection,Accept-Encoding,Accept-Language,DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Pragma",
  35. //ExposeHeaders: "Content-Length,Access-Control-Allow-Origin,Access-Control-Allow-Headers,Content-Language,Expires,Last-Modified,Pragma,FooBar",
  36. //}
  37. //corsOptions.AllowDomain = []string{"goframe.org", "johng.cn"}
  38. //corsOptions.AllowHeaders = "Authorization,Content-Type,Accept,Origin,User-Agent,DNT,Cache-Control,X-Mx-ReqToken,Keep-Alive,X-Requested-With,X-Forwarded-*,Pragma,Cache-Control,If-Modified-Since,userToken,appid"
  39. r.Response.CORS(corsOptions)
  40. r.Middleware.Next()
  41. }
  42. // MiddlewareAuth 用户认证中间件
  43. //
  44. // func MiddlewareAuth(r *ghttp.Request) {
  45. // //排除路径
  46. // array := garray.NewFrom(g.Slice{"/admin/account"})
  47. // if array.Contains(r.RequestURI) == false {
  48. // userData, err := backstage_service.Token.AuthorizationGetUserData(r)
  49. // if err != nil {
  50. // r.Response.WriteStatus(http.StatusForbidden)
  51. // response.JsonExit(r, http.StatusForbidden, err.Error())
  52. // }
  53. // if userData == nil {
  54. // r.Response.WriteStatus(http.StatusUnauthorized)
  55. // response.JsonExit(r, http.StatusForbidden, "用户不存在")
  56. // }
  57. // }
  58. // // 中间件处理逻辑
  59. // r.Middleware.Next()
  60. // }
  61. //
  62. // 用于存数据库的验证信息
  63. // json用于序列化和反序列化
  64. // MiddlewareSuperAuth 超级管理员可以操作的登录接口
  65. //
  66. // func MiddlewareSuperAuth(r *ghttp.Request) {
  67. // // 排除路径
  68. // userData, _ := backstage_service.Token.AuthorizationGetUserData(r)
  69. // if userData.User != "10000000" {
  70. // r.Response.WriteStatus(http.StatusPaymentRequired)
  71. // response.JsonExit(r, http.StatusPaymentRequired, "没有权限操作")
  72. // }
  73. // // 中间件处理逻辑
  74. // r.Middleware.Next()
  75. // }
  76. func init() {
  77. s := g.Server()
  78. // 解决跨域
  79. s.BindMiddleware("/*", MiddlewareCORS)
  80. // v2小程序端接口
  81. s.Group("/youngee/c", func(group *ghttp.RouterGroup) {
  82. group.Middleware(middleware.ErrorHandler)
  83. //用于接口测试
  84. s.BindHandler("/apitest", func(r *ghttp.Request) {
  85. r.Response.WriteJson("成功访问服务端")
  86. })
  87. //扫码之后---用于快手电商:nignx转发含code的请求到此处
  88. s.BindHandler("/kuaishouauth", func(r *ghttp.Request) {
  89. fmt.Println("****进入rounter中的/kuaishouauth*******")
  90. ClientKey := "ks651333097154138217"
  91. ClientSecret := "dBt0rVRhTpUqcrOYGGpv0A"
  92. //SignSecret := "bf6393dce0a2b669ee348bebb837b0da"
  93. code := r.GetString("code")
  94. state := r.GetString("state")
  95. //来自管理后台的用户,state是手机号码
  96. if len(state) == 11 {
  97. record, err := g.DB().Model("youngee_m_kuaishou_userinfo").Where("phone_num = ? ", state).One()
  98. if record.IsEmpty() {
  99. fmt.Println("未找到符合条件的记录")
  100. return
  101. }
  102. if err != nil {
  103. fmt.Println("查询youngee_m_kuaishou_userinfo表出错")
  104. }
  105. //发起请求,将数据存在record中
  106. m_res_auth, _ := oauth.GetAccessToken(ClientKey, ClientSecret, code)
  107. AccessToken := m_res_auth.AccessToken
  108. //获取基本信息
  109. m_res_info, _ := user.GetUserinfo(ClientKey, AccessToken)
  110. //将值update到表中
  111. // 将值更新到表中的记录中
  112. _, err = g.DB().Model("youngee_m_kuaishou_userinfo").
  113. Where("phone_number = ?", state).
  114. Data(g.Map{
  115. "access_token": AccessToken,
  116. // 假设 m_res_info 中有 fields 例如 nickname 和 avatar
  117. "nickname": m_res_info.Data.Name,
  118. "code": code,
  119. "refresh_token": m_res_auth.RefreshToken,
  120. "open_id": m_res_auth.OpenId,
  121. "create_time": gtime.Now(),
  122. "update_time": gtime.Now(),
  123. "expired": 0, //是否到期 1.后台两个小时刷新一次 2.获取list的时候需要将这个字段更新到数据中
  124. "is_delete": 0,
  125. }).
  126. Update()
  127. }
  128. //来自达人授权,获取accesstoken
  129. res_auth, _ := oauth.GetAccessToken(ClientKey, ClientSecret, code)
  130. r.Response.WriteJson(res_auth)
  131. //防止一个快手账号重复绑定
  132. userInfo := youngee_talent_model.KuaishouUserInfo{}
  133. //这个openid存在(如果对应到两条数据,只保留一条) 且对应的达人不是我,
  134. err := g.DB().Model("platform_kuaishou_user_info").Where("open_id = ? ", res_auth.OpenId).Order("platform_id DESC").Scan(&userInfo)
  135. if err != nil {
  136. fmt.Println("查询数据库失败")
  137. }
  138. //快手电商账号重复绑定,提示前端
  139. //此openId在表中有对应数据,且对应的达人不是当前达人,
  140. if userInfo.TalentId != "" && userInfo.TalentId != state {
  141. redisKsBindStatusKey := fmt.Sprintf("KsBind:%s", state)
  142. //redis设置绑定状态为
  143. _, err := g.Redis().Do("SETEX", 10, redisKsBindStatusKey, "bound_to_other")
  144. if err != nil {
  145. fmt.Println("redis出错")
  146. }
  147. return
  148. }
  149. //如果该快手账号(openID)已经有数据了,更新数据。没有数据则插入数据。
  150. _, err = g.DB().Model("platform_kuaishou_user_info").
  151. Where("open_id = ? AND platform_id = ?", res_auth.OpenId, 4).
  152. Delete()
  153. if err != nil {
  154. r.Response.WriteJson("platform_kuaishou_user_info delete failed")
  155. }
  156. AccessToken := res_auth.AccessToken
  157. //获取基本信息
  158. res_info, _ := user.GetUserinfo(ClientKey, AccessToken)
  159. //30天销量不在扫码时获取。
  160. err_auth := r.Response.WriteJson(res_auth)
  161. err_info := r.Response.WriteJson(res_info)
  162. if err_auth != nil {
  163. panic("write auth_response error")
  164. }
  165. if err_info != nil {
  166. panic("write auth_response error")
  167. }
  168. if res_auth.Result != 1 {
  169. panic("授权结果出错了")
  170. }
  171. if res_info.Result != 1 {
  172. panic("获取用户信息出错了")
  173. }
  174. //auth中含有最终信息
  175. authInfo := &youngee_talent_model.KuaishouUserInfo{
  176. Code: code,
  177. TalentId: state,
  178. AccessToken: AccessToken,
  179. OpenId: res_auth.OpenId,
  180. PlatformId: 4, //快手电商
  181. RefreshToken: res_auth.RefreshToken,
  182. HeadUri: res_info.Data.Head,
  183. NickName: res_info.Data.Name,
  184. Fan: res_info.Data.Fan,
  185. UpdateTime: gtime.Now(),
  186. CreateTime: gtime.Now(),
  187. }
  188. if _, err := g.DB().Model("platform_kuaishou_user_info").Save(authInfo); err != nil {
  189. r.Response.WriteJson(g.Map{
  190. "error": err.Error(),
  191. })
  192. return
  193. }
  194. })
  195. //用于快手平台:nignx转发含code的请求到此处
  196. s.BindHandler("/kuaishouVideo", func(r *ghttp.Request) {
  197. fmt.Println("****进入rounter中的/kuaishouVideo*******")
  198. ClientKey := "ks671599294546520767"
  199. ClientSecret := "8VSrp3O09nunjLMXR1uotg"
  200. //SignSecret := "bf6393dce0a2b669ee348bebb837b0da"
  201. code := r.GetString("code")
  202. state := r.GetString("state")
  203. //获取accesstoken
  204. res_auth, _ := oauth.GetAccessToken(ClientKey, ClientSecret, code)
  205. userInfo := youngee_talent_model.KuaishouUserInfo{}
  206. //这个openid存在 且对应的达人不是我
  207. err := g.DB().Model("platform_kuaishou_user_info").Where("open_id = ? ", userInfo.OpenId).Scan(&userInfo)
  208. if err != nil {
  209. fmt.Println("查询数据库失败")
  210. }
  211. //抖音账号重复绑定,提示前端
  212. //此openId在表中有对应数据,且对应的达人不是当前达人,
  213. if userInfo.TalentId != "" && userInfo.TalentId != state {
  214. redisKsBindStatusKey := fmt.Sprintf("KsBind:%s", state)
  215. //redis设置绑定状态为
  216. _, err := g.Redis().Do("SETEX", 10, redisKsBindStatusKey, "bound_to_other")
  217. if err != nil {
  218. fmt.Println("redis出错")
  219. }
  220. return
  221. }
  222. //如果该快手账号(openID)已经有数据了,删除。模拟在快手刷新授权 没有数据则空操作
  223. _, err = g.DB().Model("platform_kuaishou_user_info").
  224. Where("open_id = ? AND platform_id = ?", res_auth.OpenId, 8).
  225. Delete()
  226. if err != nil {
  227. r.Response.WriteJson("platform_kuaishou_user_info delete failed")
  228. }
  229. AccessToken := res_auth.AccessToken
  230. //获取基本信息
  231. res_info, _ := user.GetUserinfo(ClientKey, AccessToken)
  232. //视频数据
  233. videoCount, err := youngee_talent_service.GetVideoCount(ClientKey, AccessToken)
  234. likeCount, err := youngee_talent_service.GetLikeCount(ClientKey, AccessToken)
  235. //用户进入主页获取,并存入数据库中
  236. err_auth := r.Response.WriteJson(res_auth)
  237. err_info := r.Response.WriteJson(res_info)
  238. if err_auth != nil {
  239. panic("write auth_response error")
  240. }
  241. if err_info != nil {
  242. panic("write auth_response error")
  243. }
  244. if res_auth.Result != 1 {
  245. panic("授权结果出错了")
  246. }
  247. if res_info.Result != 1 {
  248. panic("获取用户信息出错了")
  249. }
  250. //auth中含有最终信息
  251. authInfo := &youngee_talent_model.KuaishouUserInfo{
  252. Code: code,
  253. TalentId: state,
  254. AccessToken: AccessToken,
  255. OpenId: res_auth.OpenId,
  256. PlatformId: 8, //快手平台
  257. RefreshToken: res_auth.RefreshToken,
  258. HeadUri: res_info.Data.Head,
  259. NickName: res_info.Data.Name,
  260. Fan: res_info.Data.Fan,
  261. LikeNum: likeCount, //点赞数
  262. VideoNum: videoCount.PublicCount, //作品数目
  263. UpdateTime: gtime.Now(),
  264. CreateTime: gtime.Now(),
  265. City: res_info.Data.City,
  266. Sex: res_info.Data.Sex,
  267. }
  268. if _, err := g.DB().Model("platform_kuaishou_user_info").Save(authInfo); err != nil {
  269. r.Response.WriteJson(g.Map{
  270. "error": err.Error(),
  271. })
  272. return
  273. }
  274. })
  275. //用于抖音平台:nignx转发含code的请求到此处
  276. s.BindHandler("/douyinauth", func(r *ghttp.Request) {
  277. ClientKey := "ks671599294546520767"
  278. ClientSecret := "8VSrp3O09nunjLMXR1uotg"
  279. code := r.GetString("code")
  280. state := r.GetString("state")
  281. //获取accesstoken
  282. res_auth, _ := douyinOauth.GetAccessToken(ClientKey, ClientSecret, code)
  283. douyinOpenId := res_auth.Data.OpenId
  284. userInfo := youngee_talent_model.KuaishouUserInfo{}
  285. //这个openid存在 且对应的达人不是我,
  286. err := g.DB().Model("platform_kuaishou_user_info").Where("open_id = ? ", douyinOpenId).Scan(&userInfo)
  287. if err != nil {
  288. fmt.Println("查询数据库失败")
  289. }
  290. //抖音账号重复绑定,提示前端
  291. //此openId在表中有对应数据,且对应的达人不是当前达人,
  292. if userInfo.TalentId != "" && userInfo.TalentId != state {
  293. redisDyBindStatusKey := fmt.Sprintf("DyBind:%s", state)
  294. //redis设置绑定状态为 10s过期
  295. _, err := g.Redis().Do("SETEX", 10, redisDyBindStatusKey, "bound_to_other")
  296. if err != nil {
  297. fmt.Println("redis出错")
  298. }
  299. return
  300. }
  301. //如果达人已经有抖音数据了,删除。模拟在抖音刷新授权 没有数据则空操作
  302. _, err = g.DB().Model("platform_kuaishou_user_info").
  303. Where("open_id = ? AND platform_id = ? AND talent_id = ?", douyinOpenId, 2, state).
  304. Delete()
  305. if err != nil {
  306. r.Response.WriteJson("抖音账号覆盖失败")
  307. }
  308. AccessToken := res_auth.Data.AccessToken
  309. //获取基本信息
  310. res_info, _ := douyinUser.GetUserInfo(res_auth.Data.OpenId, AccessToken)
  311. //获取用户粉丝数 千粉以上
  312. res_fans, _ := douyinUser.GetUserFans(AccessToken, "7", douyinOpenId) //近7天,返回一个列表每天都有总粉丝数
  313. errCode := res_fans.Data.ErrorCode
  314. var fansNumStr string
  315. if errCode == 0 { // 满足千粉以上
  316. fansNumStr = res_fans.Data.ResultList[0].TotalFans
  317. } else {
  318. fansNumStr = "0"
  319. }
  320. fansNum, err := strconv.Atoi(fansNumStr)
  321. if err != nil {
  322. fmt.Println("Error converting string to int:", err)
  323. // 可以在这里添加错误处理逻辑
  324. }
  325. //获取抖音作品数目和点赞数目
  326. VideoInfo, _ := youngee_talent_service.GetDyVideoInfo(douyinOpenId, AccessToken)
  327. //用户进入主页获取,并存入数据库中
  328. err_auth := r.Response.WriteJson(res_auth)
  329. err_info := r.Response.WriteJson(res_info)
  330. if err_auth != nil {
  331. panic("write auth_response error")
  332. }
  333. if err_info != nil {
  334. panic("write auth_response error")
  335. }
  336. if res_auth.Data.ErrorCode != 0 {
  337. panic("抖音授权结果出错了")
  338. }
  339. if res_info.Data.ErrorCode != 0 {
  340. panic("抖音获取用户信息出错了")
  341. }
  342. //auth中含有最终信息
  343. authInfo := &youngee_talent_model.KuaishouUserInfo{
  344. Code: code,
  345. TalentId: state,
  346. AccessToken: AccessToken,
  347. OpenId: douyinOpenId,
  348. PlatformId: 2, //抖音平台
  349. RefreshToken: res_auth.Data.RefreshToken,
  350. HeadUri: res_info.Data.Avatar,
  351. NickName: res_info.Data.Nickname,
  352. Fan: fansNum, //专门获取粉丝数的接口,默认为0。
  353. VideoNum: VideoInfo.VideoCount,
  354. LikeNum: VideoInfo.LikeCount,
  355. UpdateTime: gtime.Now(),
  356. CreateTime: gtime.Now(),
  357. }
  358. //sava,有数据则更新,没有数据则插入
  359. if _, err := g.DB().Model("platform_kuaishou_user_info").Save(authInfo); err != nil {
  360. r.Response.WriteJson(g.Map{
  361. "error": err.Error(),
  362. })
  363. return
  364. }
  365. })
  366. // 达人不需要鉴权的接口
  367. group.GET("/g", youngeetalentapi.TalentGetApi)
  368. group.POST("/p", youngeetalentapi.TalentPostApi)
  369. // 达人需要鉴权的接口
  370. group.Group("/t", func(group *ghttp.RouterGroup) {
  371. group.Middleware(middleware.DuplicateVerify, middleware.WxAuth)
  372. group.GET("/g", youngeetalentapi.TalentAuthGetApi)
  373. group.POST("/p", youngeetalentapi.TalentAuthPostApi)
  374. })
  375. })
  376. // v2小程序端接口
  377. s.Group("/youngee/c/api", func(group *ghttp.RouterGroup) {
  378. group.Middleware(middleware.ErrorHandler)
  379. //// 达人不需要鉴权的接口
  380. //group.GET("/g", youngeetalentapi.TalentGetApi)
  381. //group.POST("/p", youngeetalentapi.TalentPostApi)
  382. group.Group("/selection", func(group *ghttp.RouterGroup) {
  383. group.GET("/list", sectask.SecTask.List)
  384. })
  385. // 达人需要鉴权的接口
  386. group.Group("/t", func(group *ghttp.RouterGroup) {
  387. group.Middleware(middleware.DuplicateVerify, middleware.WxAuth)
  388. group.Group("/secTask", func(group *ghttp.RouterGroup) {
  389. group.GET("/list", sectask.SecTask.List)
  390. group.GET("/list-tab", sectask.SecTask.ListTab)
  391. group.GET("/logistics/detail", sectask.SecTask.ShowLogisticsDetail)
  392. })
  393. group.Group("/assignment", func(group *ghttp.RouterGroup) {
  394. group.GET("/list", assignment.Assignment.List)
  395. group.POST("/add", assignment.Assignment.Add)
  396. })
  397. group.Group("/wxpay", func(group *ghttp.RouterGroup) {
  398. group.POST("/pay", wxpay.WxPay.WxPay)
  399. })
  400. })
  401. })
  402. }