Files
jx-callback/business/jxcallback/auth/weixin/weixin.go

118 lines
3.0 KiB
Go

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/dao"
"git.rosy.net.cn/jx-callback/business/model/legacymodel"
"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) {
globals.SugarLogger.Debugf("GetUserInfo code:%s", code)
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.SugarLogger.Debugf("GetUserInfo code:%s, pwd:%s", code, pwd)
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) {
globals.SugarLogger.Debugf("Login openid:%s, password:%s", openid, password)
if value := globals.Cacher.Get(openid); value != nil {
if password == value.(string) {
// wxUser := &legacymodel.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) {
globals.SugarLogger.Debugf("BindMobile mobileNum:%s, code:%s, nickname:%s", mobileNum, code, nickname)
loginInfo := new(auth.LoginInfo)
if err = globals.Cacher.GetAs(token, loginInfo); err == nil {
if mobile.VerifyCode(mobileNum, code) {
user := &legacymodel.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
}