package front import ( "fmt" "jfw/config" "jfw/jyutil" "jfw/public" "log" "net/url" qutil "qfw/util" "qfw/util/redis" "time" "github.com/go-xweb/httpsession" "github.com/go-xweb/xweb" "go.mongodb.org/mongo-driver/bson" "go.mongodb.org/mongo-driver/bson/primitive" ) type SingleLogin struct { *xweb.Action singleLogin xweb.Mapper `xweb:"/swordfish/SingleLogin"` //微信登录中转 shortUrl xweb.Mapper `xweb:"/stl/(.*)"` //短地址跳转 } func init() { xweb.AddAction(&SingleLogin{}) } //短地址跳转 func (this *SingleLogin) ShortUrl(key string) error { var redirectUrl = "/swordfish/about" if key != "" && config.ActiveConfig.ShortUrl[key] != "" { redirectUrl = config.ActiveConfig.ShortUrl[key] } return this.Redirect(redirectUrl) } //是否关注处理 func (this *SingleLogin) SingleLogin() error { userid := qutil.ObjToString(this.GetSession("userId")) toHref := this.GetString("toHref") log.Println("SingleLogin sessionId", this.Session().Id()) if userid != "" { //已有session,直接跳转至结果页面 return this.Redirect(toHref) } data := map[string]interface{}{} stateKey := this.GetString("state") log.Println("SingleLogin stateKey", userid, stateKey) if stateKey == "" { //公众号回调 stateKey = getTmpKey() data["href"] = toHref data["title"] = this.GetString("title") redis.Put("other", stateKey, data, 60*5) //存储信息 return this.Redirect(fmt.Sprintf(config.Wxoauth, url.QueryEscape(this.Site()+this.Url()), stateKey), 302) } //获取wx跳转前参数 if redisValue := redis.Get("other", stateKey); redisValue != nil { if param, ok := redisValue.(map[string]interface{}); ok { data = param } } log.Println("SingleLogin data", data) openid := jyutil.Getopenid(this.GetString("code")) //获取用户openid if loginCreateSess(openid, this.Session()) { log.Println("已关注用户", openid, data["href"]) return this.Redirect(qutil.ObjToString(data["href"])) } log.Println("SingleLogin 未关注用户", openid) if len(data) > 0 { //存储携带信息 redis.Put("other", fmt.Sprintf("SingleLogin_%s", openid), data, 60*30) } return this.Render("/weixin/singlelogin/index.html") } func getTmpKey() string { return fmt.Sprintf("%s_%s", time.Now().Format("20060102150405"), qutil.GetLetterRandom(5)) } func loginCreateSess(openid string, sess *httpsession.Session) bool { _person, ok := public.MQFW.FindOne("user", bson.M{"s_m_openid": openid, "i_ispush": 1}) if ok && *_person != nil && len(*_person) > 0 { person := *_person if person["i_shareknow"] != nil { sess.Set("shareknow", person["i_shareknow"]) } sess.Set("userId", (person["_id"].(primitive.ObjectID)).Hex()) sess.Set("s_m_openid", person["s_m_openid"]) sess.Set("openid", person["s_m_openid"]) sess.Set("s_nickname", person["s_nickname"]) if person["s_avatar"] == nil { sess.Set("s_avatar", person["s_headimage"]) } else { sess.Set("s_avatar", person["s_avatar"]) } return true } else { return false } }