service.go 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225
  1. package share
  2. import (
  3. qu "app.yhyue.com/moapp/jybase/common"
  4. se "app.yhyue.com/moapp/jybase/encrypt"
  5. "app.yhyue.com/moapp/jybase/redis"
  6. "app.yhyue.com/moapp/message/config"
  7. "app.yhyue.com/moapp/message/db"
  8. "encoding/base64"
  9. "fmt"
  10. "github.com/SKatiyar/qr"
  11. "github.com/gogf/gf/v2/frame/g"
  12. "github.com/gogf/gf/v2/net/ghttp"
  13. "log"
  14. "net/url"
  15. "regexp"
  16. "strings"
  17. )
  18. type ShareRouter struct{}
  19. func (c *ShareRouter) Info(r *ghttp.Request) {
  20. userid := r.Header.Get("userId")
  21. res := map[string]interface{}{}
  22. keyUser := fmt.Sprintf("SF_%s", userid)
  23. if value := redis.GetStr("other", keyUser); value != "" {
  24. varr := strings.Split(value, "#@#@")
  25. link := fmt.Sprintf("%s/front/followGift/%s", config.PushConfig.Webdomain, varr[3])
  26. r, _ := qr.Encode(link, qr.M)
  27. pngdat := r.PNG()
  28. res["data"] = map[string]interface{}{
  29. "shareId": varr[3], //口令
  30. "shareLink": link, //微信分享链接
  31. "erUrl": base64.StdEncoding.EncodeToString(pngdat),
  32. }
  33. res["error_code"] = 0
  34. res["error_msg"] = ""
  35. } else {
  36. nickname, headimageurl := "", ""
  37. if data := GetInfo(userid); data != nil {
  38. nickname = qu.ObjToString(data["nickname"])
  39. headimageurl = qu.ObjToString(data["headimageurl"])
  40. }
  41. shareId := VarLSCPool.GetJob()
  42. shareIdKey := fmt.Sprintf("shareId_%s", shareId)
  43. value := fmt.Sprintf("%s#@#@%s#@#@%s#@#@%s", userid, nickname, headimageurl, shareIdKey)
  44. redis.Put("other", shareIdKey, userid, -1)
  45. redis.Put("other", keyUser, value, -1)
  46. link := fmt.Sprintf("%s/front/followGift/%s", config.PushConfig.Webdomain, shareIdKey)
  47. r, _ := qr.Encode(link, qr.M)
  48. pngdat := r.PNG()
  49. res["data"] = map[string]interface{}{
  50. "shareId": shareIdKey, //口令
  51. "shareLink": link, //微信分享链接
  52. "erUrl": base64.StdEncoding.EncodeToString(pngdat),
  53. }
  54. res["error_code"] = 0
  55. res["error_msg"] = ""
  56. }
  57. r.Response.WriteJson(res)
  58. }
  59. func (c *ShareRouter) Receive(r *ghttp.Request) {
  60. openid := se.SE.DecodeString(r.Get("oid").String()) //被分享者openid
  61. if db.Mgo.Count("user", map[string]interface{}{"s_m_openid": openid, "i_appid": 2}) > 0 {
  62. r.Response.WriteJson(g.Map{
  63. "error_code": -1,
  64. "error_msg": "老用户无法领取奖励",
  65. "data": map[string]interface{}{
  66. "status": false,
  67. },
  68. })
  69. return
  70. }
  71. shareId := r.Get("shareId").String()
  72. redisKey := fmt.Sprintf("rec_%s", openid)
  73. log.Println(openid, shareId, redisKey) //分享者和被分享者对应关系
  74. shareUserid := redis.GetStr("other", shareId) //获取分享者
  75. if shareUserid == "" {
  76. r.Response.WriteJson(g.Map{
  77. "error_code": -1,
  78. "error_msg": "领取失败",
  79. "data": map[string]interface{}{
  80. "status": false,
  81. },
  82. })
  83. return
  84. }
  85. r.Response.WriteJson(g.Map{
  86. "error_code": 0,
  87. "error_msg": "",
  88. "data": map[string]interface{}{
  89. "status": redis.Put("other", redisKey, shareUserid, timeOut()),
  90. },
  91. })
  92. }
  93. func (c *ShareRouter) List(r *ghttp.Request) {
  94. userid := r.Get("userId").String()
  95. pNum := r.Get("pageNum").Int()
  96. pSize := r.Get("pagesize").Int()
  97. rdata := map[string]interface{}{
  98. "count": 0,
  99. "haveNextPage": false,
  100. "res": []map[string]interface{}{},
  101. }
  102. query := map[string]interface{}{
  103. "share_uid": userid,
  104. }
  105. count := db.Mgo.Count("user_share", query)
  106. if count == 0 {
  107. r.Response.WriteJson(g.Map{
  108. "error_code": 0,
  109. "error_msg": "",
  110. "data": rdata,
  111. })
  112. return
  113. }
  114. result, _ := db.Mgo.Find("user_share", query, `{"createtime":-1}`, `{"shared_uid":1}`, false, pNum*pSize, pSize)
  115. haveNextPage := (pNum+1)*pSize < count
  116. rdata["count"] = count
  117. rdata["haveNextPage"] = haveNextPage
  118. rdata["pageSize"] = pSize
  119. rdata["res"] = Info(result)
  120. r.Response.WriteJson(g.Map{
  121. "error_code": 0,
  122. "error_msg": "",
  123. "data": rdata,
  124. })
  125. }
  126. func (c *ShareRouter) Followgift(r *ghttp.Request) {
  127. client := r.Header.Get("User-Agent")
  128. var mobileReg = regexp.MustCompile("(?i)(Android|Mobile|Phone)")
  129. Wxoauth := `https://open.weixin.qq.com/connect/oauth2/authorize?appid=` + qu.ObjToString(config.Wx.WxJianyu.Appid) + `&redirect_uri=%s&response_type=code&scope=snsapi_base&state=%s#wechat_redirect`
  130. fdata := map[string]interface{}{
  131. "error_code": 0,
  132. "error_msg": "",
  133. }
  134. idata := map[string]interface{}{}
  135. bm := mobileReg.MatchString(client)
  136. openid := r.Header.Get("s_m_openid")
  137. nickname := r.Header.Get("s_nickname")
  138. redisName := "other"
  139. headImg := ""
  140. qrstr := ""
  141. infos := ""
  142. shareid := r.Get("shareId").String()
  143. if !strings.Contains(shareid, "shareId_") {
  144. rdata, ok := db.Mgo.FindOneByField("user", map[string]interface{}{"s_m_openid": shareid, "i_appid": 2}, `{"_id":1}`)
  145. if rdata != nil && ok && len(*rdata) > 0 {
  146. uid := BsonIdToSId((*rdata)["_id"])
  147. infos = redis.GetStr(redisName, fmt.Sprintf("SF_%s", uid))
  148. }
  149. }
  150. if shareUserid := redis.GetStr(redisName, shareid); shareUserid == "" && infos == "" {
  151. r.Response.WriteJson(g.Map{
  152. "error_code": -1,
  153. "error_msg": "无数据",
  154. })
  155. return
  156. } else {
  157. if infos == "" {
  158. infos = redis.GetStr(redisName, fmt.Sprintf("SF_%s", shareUserid))
  159. }
  160. if infos != "" {
  161. nickname = strings.Split(infos, "#@#@")[1]
  162. headImg = strings.Split(infos, "#@#@")[2]
  163. link := fmt.Sprintf("%s/front/followGift/%s", qu.ObjToString(config.PushConfig.Webdomain), strings.Split(infos, "#@#@")[3])
  164. r, _ := qr.Encode(link, qr.M)
  165. pngdat := r.PNG()
  166. qrstr = base64.StdEncoding.EncodeToString(pngdat)
  167. shareid = strings.Split(infos, "#@#@")[3]
  168. if IsPhone(nickname) {
  169. nickname = string(nickname[0:3]) + "****" + string(nickname[len(nickname)-4:])
  170. }
  171. }
  172. }
  173. if bm {
  174. if openid == "" {
  175. if r.Header.Get("s_m_openid") == "" {
  176. if r.Get("state").String() == "wx" {
  177. //微信跳回来的
  178. code := r.Get("code").String()
  179. if code != "" {
  180. openid = Getopenid(code)
  181. if openid != "" {
  182. if CheckUserIsSubscribe(openid) {
  183. FindUserAndCreateSess(openid, r.Session, "wx", false)
  184. }
  185. }
  186. }
  187. } else {
  188. if CheckWxBrowser(r.Request) {
  189. //所有参数都不再使用,跳到微信验证用户
  190. idata["data"] = fmt.Sprintf(Wxoauth, url.QueryEscape(r.Host+r.URL.String()), "wx")
  191. fdata["data"] = idata
  192. r.Response.WriteJson(fdata)
  193. }
  194. }
  195. }
  196. }
  197. idata["shareid"] = shareid
  198. idata["share_nickname"] = nickname
  199. idata["share_headImg"] = headImg
  200. idata["openid"] = se.SE.EncodeString(openid)
  201. idata["share_qr"] = qrstr
  202. mynickname := r.Header.Get("s_nickname")
  203. myavatar := r.Header.Get("s_avatar")
  204. idata["nickname"] = mynickname
  205. idata["avatar"] = myavatar
  206. idata["signature"] = SignJSSDK(r.Host + r.URL.String())
  207. fdata["data"] = idata
  208. r.Response.WriteJson(fdata)
  209. } else {
  210. idata["shareid"] = shareid
  211. idata["share_nickname"] = nickname
  212. idata["share_headImg"] = headImg
  213. idata["signature"] = SignJSSDK(r.Host + r.URL.String())
  214. idata["isWeixin"] = CheckWxBrowser(r.Request)
  215. idata["share_qr"] = qrstr
  216. fdata["data"] = idata
  217. r.Response.WriteJson(fdata)
  218. }
  219. }