Explorar el Código

新用户微信扫码登录之后,绑定手机号

xingzai hace 2 años
padre
commit
d5bfd52f2a

+ 94 - 31
controllers/wechat.go

@@ -2,11 +2,11 @@ package controllers
 
 import (
 	"encoding/json"
-	"fmt"
 	"hongze/hongze_clpt/models"
 	"hongze/hongze_clpt/services"
 	"hongze/hongze_clpt/utils"
 	"strconv"
+	"strings"
 	"time"
 )
 
@@ -18,6 +18,10 @@ type WechatCommonController struct {
 	BaseCommonController
 }
 
+type MobileWechatController struct {
+	BaseAuthMobileController
+}
+
 // @Title 微信登录小助手接口
 // @Description 微信登录小助手接口
 // @Param   Code   query   string  true       "微信唯一编码code"
@@ -36,43 +40,25 @@ func (this *WechatCommonController) WechatLogin() {
 		return
 	}
 	var token string
-	item, err := services.WxGetUserOpenIdByOpenCode(code)
-	if err != nil {
-		br.Msg = "获取用户信息失败"
-		br.ErrMsg = "获取用户信息失败,Err:" + err.Error()
-		return
-	}
-	if item.Errcode != 0 {
-		br.Msg = "获取用户信息失败"
-		br.ErrMsg = "获取access_token 失败 errcode:" + strconv.Itoa(item.Errcode) + " ;errmsg:" + item.Errmsg
-		return
-	}
-	openId := item.Openid
-	if openId == "" {
-		br.Msg = "获取用户信息失败"
-		br.ErrMsg = "获取openid失败,openid:" + item.Openid
-		return
-	}
-	//openId := "oN0jD1QwcA2uRD0BC4mH5zJMo0eg"
 	resp := new(models.UserDetailByUserLogin)
-	accessToken, err := services.GetWxAccessOpenToken()
+	WxAccessToken, err := services.GetWxAccessOpenToken(code)
 	if err != nil {
 		br.Msg = "获取用户信息失败"
 		br.ErrMsg = "获取access_token失败,err:" + err.Error()
 		return
 	}
-	if accessToken == "" {
+	if WxAccessToken.AccessToken == "" {
 		br.Msg = "获取用户信息失败"
 		br.ErrMsg = "access_token 为空,"
 		return
 	}
-	wxUserInfo, err := services.WxGetUserInfo(openId, accessToken)
+	openId := WxAccessToken.Openid
+	wxUserInfo, err := services.WxGetUserInfo(openId, WxAccessToken.AccessToken)
 	if err != nil {
 		br.Msg = "获取用户信息失败"
 		br.ErrMsg = "获取微信用户信息失败,Err:" + err.Error()
 		return
 	}
-	fmt.Println(wxUserInfo)
 	if wxUserInfo.Errcode != 0 {
 		userInfoJson, _ := json.Marshal(wxUserInfo)
 		br.Msg = "登录失败"
@@ -91,7 +77,7 @@ func (this *WechatCommonController) WechatLogin() {
 		br.ErrMsg = "查询数量失败,Err:" + err.Error()
 		return
 	}
-	items := new(models.CygxUserRecord)
+	items := new(models.UserRecord)
 	items.OpenId = openId
 	items.UnionId = unionId
 	items.NickName = wxUserInfo.Nickname
@@ -100,9 +86,10 @@ func (this *WechatCommonController) WechatLogin() {
 	items.City = wxUserInfo.City
 	items.Country = wxUserInfo.Country
 	items.Headimgurl = wxUserInfo.Headimgurl
+	items.CreatePlatform = 7
 	items.CreateTime = time.Now()
 	if total == 0 {
-		_, err = models.AddCygxUserRecord(items)
+		_, err = models.AddUserRecord(items)
 		if err != nil {
 			br.Msg = "获取用户信息失败"
 			br.ErrMsg = "添加openid失败,Err:" + err.Error()
@@ -111,33 +98,30 @@ func (this *WechatCommonController) WechatLogin() {
 	}
 	timeUnix := time.Now().Unix()
 	timeUnixStr := strconv.FormatInt(timeUnix, 10)
-
 	user, err := models.GetWxUserItemByUserUnionId(unionId)
 	if err != nil && err.Error() != utils.ErrNoRow() {
 		br.Msg = "获取用户信息失败"
 		br.ErrMsg = "获取本地用户信息失败,Err:" + err.Error()
 		return
 	}
-	fmt.Println(user)
 	totalItem, err := models.GetTokenByOpenId(openId)
 	if err != nil && err.Error() != utils.ErrNoRow() {
 		br.Msg = "获取用户信息失败"
 		br.ErrMsg = "查询数量失败,Err:" + err.Error()
 		return
 	}
-	fmt.Println(totalItem)
 	if totalItem == nil {
 		token = utils.MD5(unionId) + utils.MD5(timeUnixStr)
 		itemsSession := new(models.CygxClptSession)
 		itemsSession.UnionId = unionId
 		itemsSession.OpenId = openId
-		itemsSession.Mobile = user.Mobile
 		itemsSession.AccessToken = token
 		itemsSession.CreatedTime = time.Now()
 		itemsSession.LastUpdatedTime = time.Now()
 		itemsSession.ExpireTime = time.Now().AddDate(0, 3, 0)
 		if user != nil {
 			itemsSession.UserId = user.UserId
+			itemsSession.Mobile = user.Mobile
 		}
 		err = models.AddCygxClptSession(itemsSession)
 		if err != nil {
@@ -148,7 +132,6 @@ func (this *WechatCommonController) WechatLogin() {
 	} else {
 		token = totalItem.AccessToken
 	}
-	fmt.Println(token)
 	if user == nil {
 		resp.HasPermission = 3
 	} else {
@@ -174,10 +157,90 @@ func (this *WechatCommonController) WechatLogin() {
 	if resp.Headimgurl == "" {
 		resp.Headimgurl = utils.DefaultHeadimgurl
 	}
-
 	resp.Token = token
 	br.Ret = 200
 	br.Success = true
 	br.Msg = "获取成功"
 	br.Data = resp
 }
+
+// @Title 微信登录后绑定手机号接口
+// @Description 微信登录后绑定手机号接口
+// @Param	request	body models.WxBindMobileReq true "type json string"
+// @Success Ret=200 绑定成功
+// @router /bindMobile [post]
+func (this *MobileWechatController) WechatBindMobile() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	var req models.WxBindMobileReq
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+	authorization := this.Token
+	if authorization == "" {
+		br.Msg = "参数错误"
+		br.ErrMsg = "参数错误,authorization不能为空"
+		return
+	}
+	session, err := models.GetSessionByToken(authorization)
+	if err != nil {
+		br.Msg = "绑定失败"
+		br.ErrMsg = "绑定失败,err:" + err.Error()
+		return
+	}
+	openid := session.OpenId
+	req.Mobile = strings.Trim(req.Mobile, " ")
+	if req.Mobile == "" {
+		br.Msg = "参数错误"
+		br.ErrMsg = "参数错误,手机号为空"
+		return
+	}
+	mobile := req.Mobile
+	code := req.VCode
+	if code == "" {
+		br.Msg = "参数错误"
+		br.ErrMsg = "Code 为空"
+		return
+	}
+	item, err := models.GetMsgCode(mobile, code)
+	if err != nil {
+		if err.Error() == utils.ErrNoRow() {
+			br.Msg = "验证码错误,请重新输入"
+			br.ErrMsg = "校验验证码失败,Err:" + err.Error()
+			return
+		} else {
+			br.Msg = "验证码错误,请重新输入"
+			br.ErrMsg = "校验验证码失败,Err:" + err.Error()
+			return
+		}
+	}
+	if item == nil {
+		br.Msg = "验证码错误,请重新输入"
+		return
+	}
+	user, err := services.BindWxUser(mobile, "86")
+	if err != nil {
+		br.Msg = "登录失败"
+		br.ErrMsg = "获取用户信息失败,GetUserDetailByMobile Err:" + err.Error()
+		return
+	}
+	err = models.BindSessionMobile(mobile, authorization)
+	if err != nil {
+		br.Msg = "登录失败"
+		br.ErrMsg = "获取用户信息失败,BindSessionMobile Err:" + err.Error()
+		return
+	}
+	err = models.BindUserRecordByOpenid(user.UserId, openid, mobile)
+	if err != nil {
+		return
+	}
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "绑定成功"
+}

+ 1 - 1
models/cygx_user_record.go

@@ -28,7 +28,7 @@ func AddCygxUserRecord(item *CygxUserRecord) (lastId int64, err error) {
 //获取数量
 func GetCygxUserRecordCount(openId string) (count int, err error) {
 	o := orm.NewOrm()
-	sqlCount := ` SELECT COUNT(1) AS count  FROM cygx_user_record WHERE open_id=? `
+	sqlCount := ` SELECT COUNT(1) AS count  FROM user_record WHERE open_id=? `
 	err = o.Raw(sqlCount, openId).QueryRow(&count)
 	return
 }

+ 8 - 0
models/session.go

@@ -53,3 +53,11 @@ func GetTokenByOpenId(mobile string) (item *CygxClptSession, err error) {
 	err = o.Raw(sql, mobile).QueryRow(&item)
 	return
 }
+
+//用户绑定手机号时同时绑定外呼手机号
+func BindSessionMobile(mobile, token string) (err error) {
+	o := orm.NewOrm()
+	sql := `UPDATE cygx_clpt_session SET mobile=?  WHERE access_token=? `
+	_, err = o.Raw(sql, mobile, token).Exec()
+	return
+}

+ 6 - 0
models/user.go

@@ -47,6 +47,12 @@ type LoginReq struct {
 	VCode  string `description:"验证码"`
 }
 
+type WxBindMobileReq struct {
+	Mobile string `description:"手机号"`
+	VCode  string `description:"验证码"`
+	//Token  string `description:"Token"`
+}
+
 func PcBindMobile(unionId, mobile string, userId, loginType int) (wxUserId int, err error) {
 	//loginType  登录方式:1:手机,2:邮箱
 	sql := ``

+ 7 - 0
models/user_record.go

@@ -25,6 +25,13 @@ type UserRecord struct {
 	UserId         int       `description:"用户id"`
 }
 
+//添加
+func AddUserRecord(item *UserRecord) (lastId int64, err error) {
+	o := orm.NewOrm()
+	lastId, err = o.Insert(item)
+	return
+}
+
 //根据openid获取用户关系
 func GetUserRecordByOpenId(openId string) (item *UserRecord, err error) {
 	sql := `SELECT * FROM user_record WHERE open_id=? `

+ 9 - 0
routers/commentsRouter.go

@@ -97,6 +97,15 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["hongze/hongze_clpt/controllers:MobileWechatController"] = append(beego.GlobalControllerRouter["hongze/hongze_clpt/controllers:MobileWechatController"],
+        beego.ControllerComments{
+            Method: "WechatBindMobile",
+            Router: `/bindMobile`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["hongze/hongze_clpt/controllers:ResourceController"] = append(beego.GlobalControllerRouter["hongze/hongze_clpt/controllers:ResourceController"],
         beego.ControllerComments{
             Method: "Upload",

+ 1 - 0
routers/router.go

@@ -27,6 +27,7 @@ func init() {
 			web.NSInclude(
 				&controllers.WechatController{},
 				&controllers.WechatCommonController{},
+				&controllers.MobileWechatController{},
 			),
 		),
 		web.NSNamespace("/user",

+ 56 - 33
services/user.go

@@ -126,13 +126,6 @@ func BindWxUser(mobile, countryCode string) (wxUser *models.WxUserItem, err erro
 		wxUser = tmpWxUser
 		//bindAccount = mobile
 	}
-
-	//查询openid的第三方(微信)信息
-	//userRecord, err := models.GetUserRecordByOpenId(openid)
-	//if err != nil {
-	//	return
-	//}
-
 	var userId int
 	//如果查询出来的用户是nil,那么需要新增用户
 	if wxUser == nil {
@@ -169,32 +162,6 @@ func BindWxUser(mobile, countryCode string) (wxUser *models.WxUserItem, err erro
 			models.ModifyWxUserRegisterStatus(userId)
 		}
 	}
-
-	//如果存在该手机号/邮箱,那么需要校验
-	//if userRecord.UserId > 0 && userRecord.UserId != userId {
-	//	err = errors.New("用户已绑定,不允许重复绑定")
-	//	return
-	//}
-
-	//err = models.BindUserRecordByOpenid(userId, openid, bindAccount)
-	//if err != nil {
-	//	return
-	//}
-	//userRecord.UserId = userId
-
-	//如果当前该第三方用户信息的昵称为空串的话,那么需要去查询该用户的第一个绑定信息的数据作为来源做数据修复
-	//if userRecord.NickName == "" {
-	//	oldUserRecord, err := models.GetUserThirdRecordByUserId(userId)
-	//	if err == nil && oldUserRecord != nil {
-	//		//如果该用户绑定的第一条数据的头像信息不为空串,那么就去做新数据的修复
-	//		if oldUserRecord.NickName != "" {
-	//			_ = models.ModifyUserRecordByDetail(userRecord.OpenId, userRecord.UnionId, oldUserRecord.NickName, oldUserRecord.Headimgurl, oldUserRecord.City, oldUserRecord.Province, oldUserRecord.Country, oldUserRecord.Sex, userId)
-	//		}
-	//	}
-	//}
-
-	//格式化用户数据
-	//formatWxUserAndUserRecord(wxUser, userRecord)
 	return
 }
 
@@ -411,3 +378,59 @@ func AddUserRecord(openId, unionId, nickName, realName, province, city, country,
 	//userRecord.UserRecordId = int(recordId)
 	return
 }
+
+//用户绑定
+func BindSession(mobile, countryCode string) (wxUser *models.WxUserItem, err error) {
+	if mobile == "" {
+		err = errors.New("手机号或邮箱必填一个")
+		return
+	}
+	//var bindAccount string
+	//根据手机号获取用户信息
+	if mobile != "" {
+		tmpWxUser, wxUserErr := models.GetWxUserItemByMobile(mobile)
+		if wxUserErr != nil && wxUserErr.Error() != utils.ErrNoRow() {
+			err = wxUserErr
+			return
+		}
+		wxUser = tmpWxUser
+		//bindAccount = mobile
+	}
+	var userId int
+	//如果查询出来的用户是nil,那么需要新增用户
+	if wxUser == nil {
+		user := &models.WxUser{
+			CompanyId:        1,
+			CreatedTime:      time.Now(),
+			FirstLogin:       1,
+			Enabled:          1,
+			RegisterPlatform: 7,
+			RegisterTime:     time.Now(),
+			Mobile:           mobile,
+			//Email:               email,
+			IsRegister:          1,
+			Source:              3,
+			CountryCode:         countryCode,
+			OutboundMobile:      mobile,
+			OutboundCountryCode: countryCode,
+		}
+		tmpUserId, addUserErr := models.AddWxUser(user)
+		if addUserErr != nil {
+			err = addUserErr
+			return
+		}
+		user.UserId = int(tmpUserId)
+		userId = int(tmpUserId)
+		wxUser, err = models.GetWxUserItemByUserId(userId)
+	} else {
+		userId = wxUser.UserId
+		err = models.BindUserOutboundMobile(mobile, countryCode, userId)
+		if err != nil {
+			return
+		}
+		if wxUser.IsRegister == 0 {
+			models.ModifyWxUserRegisterStatus(userId)
+		}
+	}
+	return
+}

+ 26 - 17
services/wechat.go

@@ -101,13 +101,13 @@ func WxGetToken() (item *WxAccessToken, err error) {
 }
 
 func WxGetUserInfo(openId, accessToken string) (item *WxUserInfo, err error) {
-	requestUrl := `https://api.weixin.qq.com/cgi-bin/user/info?access_token=%s&openid=%s`
+	requestUrl := `https://api.weixin.qq.com/sns/userinfo?access_token=%s&openid=%s`
 	requestUrl = fmt.Sprintf(requestUrl, accessToken, openId)
 	result, err := http.Get(requestUrl)
 	if err != nil {
 		return
 	}
-	//fmt.Println("result:", string(result))
+	fmt.Println("result:", string(result))
 	utils.FileLog.Info("WxGetUserInfo:%s openId:%s,accessToken:%s ", string(result), openId, accessToken)
 	utils.FileLog.Info("WxGetUserInfo Result:%s ", string(result))
 	err = json.Unmarshal(result, &item)
@@ -227,6 +227,7 @@ func WxGetUserOpenIdByOpenCode(code string) (item *WxAccessToken, err error) {
 	}
 	requestUrl := `https://api.weixin.qq.com/sns/oauth2/access_token?appid=%s&secret=%s&code=%s&grant_type=authorization_code`
 	requestUrl = fmt.Sprintf(requestUrl, utils.WxOpenAppId, utils.WxOpenAppSecret, code)
+	fmt.Println(requestUrl)
 	result, err := http.Get(requestUrl)
 	if err != nil {
 		return nil, err
@@ -235,9 +236,10 @@ func WxGetUserOpenIdByOpenCode(code string) (item *WxAccessToken, err error) {
 	return
 }
 
-func WxGetOpenToken() (item *WxAccessToken, err error) {
-	requestUrl := `https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=%s&secret=%s`
-	requestUrl = fmt.Sprintf(requestUrl, utils.WxOpenAppId, utils.WxOpenAppSecret)
+func WxGetOpenToken(wxcode string) (item *WxAccessToken, err error) {
+	//requestUrl := `https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=%s&secret=%s`
+	requestUrl := `https://api.weixin.qq.com/sns/oauth2/access_token?appid=%s&secret=%s&code=%s&grant_type=authorization_code`
+	requestUrl = fmt.Sprintf(requestUrl, utils.WxOpenAppId, utils.WxOpenAppSecret, wxcode)
 	result, err := http.Get(requestUrl)
 	if err != nil {
 		utils.FileLog.Info("获取wxToken失败,Err:%s", err.Error())
@@ -255,20 +257,27 @@ func WxGetOpenToken() (item *WxAccessToken, err error) {
 	return
 }
 
-func GetWxAccessOpenToken() (accessTokenStr string, err error) {
+func GetWxAccessOpenToken(code string) (item *WxAccessToken, err error) {
 	//缓存校验
-	cacheKey := utils.OPEN_TOKEN_KEY
-	accessTokenStr, _ = utils.Rc.RedisString(cacheKey)
-	if accessTokenStr != "" {
+	//cacheKey := utils.OPEN_TOKEN_KEY
+	//accessTokenStr, _ = utils.Rc.RedisString(cacheKey)
+	//if accessTokenStr != "" {
+	//	return
+	//} else {
+	//	WxAccessToken, errWx := WxGetOpenToken()
+	//	if errWx != nil {
+	//		err = errWx
+	//		return
+	//	}
+	//	accessTokenStr = WxAccessToken.AccessToken
+	//	utils.Rc.Put(cacheKey, WxAccessToken.AccessToken, time.Second*7000)
+	//}
+	WxAccessToken, errWx := WxGetOpenToken(code)
+	if errWx != nil {
+		err = errWx
 		return
-	} else {
-		WxAccessToken, errWx := WxGetOpenToken()
-		if errWx != nil {
-			err = errWx
-			return
-		}
-		accessTokenStr = WxAccessToken.AccessToken
-		utils.Rc.Put(cacheKey, WxAccessToken.AccessToken, time.Second*7000)
 	}
+	item = WxAccessToken
+	//accessTokenStr = WxAccessToken.AccessToken
 	return
 }