singleLogin.go 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. package front
  2. import (
  3. "fmt"
  4. "jfw/config"
  5. "jfw/jyutil"
  6. "jfw/public"
  7. "log"
  8. "net/url"
  9. qutil "qfw/util"
  10. "qfw/util/redis"
  11. "time"
  12. "github.com/go-xweb/httpsession"
  13. "github.com/go-xweb/xweb"
  14. "go.mongodb.org/mongo-driver/bson"
  15. "go.mongodb.org/mongo-driver/bson/primitive"
  16. )
  17. type SingleLogin struct {
  18. *xweb.Action
  19. singleLogin xweb.Mapper `xweb:"/swordfish/SingleLogin"` //微信登录中转
  20. shortUrl xweb.Mapper `xweb:"/stl/(.*)"` //短地址跳转
  21. }
  22. func init() {
  23. xweb.AddAction(&SingleLogin{})
  24. }
  25. //短地址跳转
  26. func (this *SingleLogin) ShortUrl(key string) error {
  27. var redirectUrl = "/swordfish/about"
  28. if key != "" && config.ActiveConfig.ShortUrl[key] != "" {
  29. redirectUrl = config.ActiveConfig.ShortUrl[key]
  30. }
  31. return this.Redirect(redirectUrl)
  32. }
  33. //是否关注处理
  34. func (this *SingleLogin) SingleLogin() error {
  35. userid := qutil.ObjToString(this.GetSession("userId"))
  36. toHref := this.GetString("toHref")
  37. log.Println("SingleLogin sessionId", this.Session().Id())
  38. if userid != "" { //已有session,直接跳转至结果页面
  39. return this.Redirect(toHref)
  40. }
  41. data := map[string]interface{}{}
  42. stateKey := this.GetString("state")
  43. log.Println("SingleLogin stateKey", userid, stateKey)
  44. if stateKey == "" { //公众号回调
  45. stateKey = getTmpKey()
  46. data["href"] = toHref
  47. data["title"] = this.GetString("title")
  48. redis.Put("other", stateKey, data, 60*5) //存储信息
  49. return this.Redirect(fmt.Sprintf(config.Wxoauth, url.QueryEscape(this.Site()+this.Url()), stateKey), 302)
  50. }
  51. //获取wx跳转前参数
  52. if redisValue := redis.Get("other", stateKey); redisValue != nil {
  53. if param, ok := redisValue.(map[string]interface{}); ok {
  54. data = param
  55. }
  56. }
  57. log.Println("SingleLogin data", data)
  58. openid := jyutil.Getopenid(this.GetString("code")) //获取用户openid
  59. if loginCreateSess(openid, this.Session()) {
  60. log.Println("已关注用户", openid, data["href"])
  61. return this.Redirect(qutil.ObjToString(data["href"]))
  62. }
  63. log.Println("SingleLogin 未关注用户", openid)
  64. if len(data) > 0 { //存储携带信息
  65. redis.Put("other", fmt.Sprintf("SingleLogin_%s", openid), data, 60*30)
  66. }
  67. return this.Render("/weixin/singlelogin/index.html")
  68. }
  69. func getTmpKey() string {
  70. return fmt.Sprintf("%s_%s", time.Now().Format("20060102150405"), qutil.GetLetterRandom(5))
  71. }
  72. func loginCreateSess(openid string, sess *httpsession.Session) bool {
  73. _person, ok := public.MQFW.FindOne("user", bson.M{"s_m_openid": openid, "i_ispush": 1})
  74. if ok && *_person != nil && len(*_person) > 0 {
  75. person := *_person
  76. if person["i_shareknow"] != nil {
  77. sess.Set("shareknow", person["i_shareknow"])
  78. }
  79. sess.Set("userId", (person["_id"].(primitive.ObjectID)).Hex())
  80. sess.Set("s_m_openid", person["s_m_openid"])
  81. sess.Set("openid", person["s_m_openid"])
  82. sess.Set("s_nickname", person["s_nickname"])
  83. if person["s_avatar"] == nil {
  84. sess.Set("s_avatar", person["s_headimage"])
  85. } else {
  86. sess.Set("s_avatar", person["s_avatar"])
  87. }
  88. return true
  89. } else {
  90. return false
  91. }
  92. }