package weixin import ( "errors" "fmt" "time" "git.rosy.net.cn/baseapi/platformapi/weixinsnsapi" "git.rosy.net.cn/baseapi/utils" "git.rosy.net.cn/jx-callback/business/jxcallback/auth" "git.rosy.net.cn/jx-callback/business/jxcallback/auth/mobile" "git.rosy.net.cn/jx-callback/business/model" "git.rosy.net.cn/jx-callback/business/model/dao" "git.rosy.net.cn/jx-callback/globals" "git.rosy.net.cn/jx-callback/globals/api" "github.com/astaxie/beego/orm" ) const ( LoginType = "weixinsns" DefTempPasswordDuration = 5 * time.Minute // 登录时间限制在5分钟内 ) var ( ErrLoginFailed = errors.New("登录失败") StrStateIsWrong = "state:%s状态不对" ) var ( auther *Auther ) type Auther struct { } type UserInfoExt struct { weixinsnsapi.UserInfo TempPassword string `json:"tempPassword"` // 一段时间有效的登录密码 } func init() { auther = new(Auther) auth.RegisterAuther(LoginType, auther) } func GetUserInfo(code string, state string) (token *UserInfoExt, err error) { if state == "" { wxapi := weixinsnsapi.New(api.WeixinAPI.GetAppID(), api.WeixinAPI.GetSecret()) token, err2 := wxapi.RefreshToken(code) if err = err2; err == nil { wxUserinfo, err2 := wxapi.GetUserInfo(token.OpenID) if err = err2; err == nil { pwd := utils.GetUUID() globals.Cacher.Set(wxUserinfo.OpenID, pwd, DefTempPasswordDuration) return &UserInfoExt{ UserInfo: *wxUserinfo, TempPassword: pwd, }, nil } } } else { err = fmt.Errorf(StrStateIsWrong, state) } return nil, err } func (a *Auther) Login(openid, password string) (err error) { if value := globals.Cacher.Get(openid); value != nil { if password == value.(string) { // wxUser := &model.WeiXins{ // OpenID: openid, // } // if err = dao.GetEntity(nil, wxUser, "OpenID"); err == nil { globals.Cacher.Del(openid) return nil // } } } else { err = ErrLoginFailed } return err } func (a *Auther) Logout(openid string) error { return globals.Cacher.Del(openid) } func BindMobile(token, mobileNum, code, nickname string) (err error) { loginInfo := new(auth.LoginInfo) if err = globals.Cacher.GetAs(token, loginInfo); err == nil { if mobile.VerifyCode(mobileNum, code) { user := &model.WeiXins{ OpenID: loginInfo.ID, Tel: mobileNum, NickName: nickname, } db := dao.GetDB() if err = dao.GetEntity(db, user, "OpenID"); err == nil { user.Tel = mobileNum user.NickName = nickname _, err = dao.UpdateEntity(db, user, "Tel", "NickName") } else if err == orm.ErrNoRows { err = dao.CreateEntity(db, user) } } else { err = errors.New("验证码错") } } return err }