rdluck 4 سال پیش
والد
کامیت
01cfc84189
11فایلهای تغییر یافته به همراه978 افزوده شده و 160 حذف شده
  1. 3 1
      controllers/base_auth.go
  2. 172 18
      controllers/user.go
  3. 273 112
      controllers/wechat.go
  4. 8 0
      models/session.go
  5. 48 18
      models/user_record.go
  6. 9 5
      models/wechat.go
  7. 7 2
      models/wx_user.go
  8. 1 0
      services/elastic.go
  9. 342 0
      services/user.go
  10. 110 0
      services/wechat.go
  11. 5 4
      utils/config.go

+ 3 - 1
controllers/base_auth.go

@@ -4,6 +4,7 @@ import (
 	"encoding/json"
 	"encoding/json"
 	"fmt"
 	"fmt"
 	"github.com/astaxie/beego"
 	"github.com/astaxie/beego"
+	"hongze/hongze_cygx/services"
 	"net/http"
 	"net/http"
 	"net/url"
 	"net/url"
 	"strconv"
 	"strconv"
@@ -59,7 +60,8 @@ func (this *BaseAuthController) Prepare() {
 				this.StopRun()
 				this.StopRun()
 				return
 				return
 			}
 			}
-			wxUser, err := models.GetWxUserItemByUserId(session.UserId)
+			//wxUser, err := models.GetWxUserItemByUserId(session.UserId)
+			wxUser, err := services.GetWxUserItemByOpenId(session.OpenId)
 			if err != nil {
 			if err != nil {
 				if err.Error() == utils.ErrNoRow() {
 				if err.Error() == utils.ErrNoRow() {
 					this.JSON(models.BaseResponse{Ret: 408, Msg: "信息已变更,请重新登陆!", ErrMsg: "获取信息失败 " + strconv.Itoa(session.UserId)}, false, false)
 					this.JSON(models.BaseResponse{Ret: 408, Msg: "信息已变更,请重新登陆!", ErrMsg: "获取信息失败 " + strconv.Itoa(session.UserId)}, false, false)

+ 172 - 18
controllers/user.go

@@ -16,6 +16,7 @@ type UserController struct {
 	BaseAuthController
 	BaseAuthController
 }
 }
 
 
+/*
 // @Title 登录
 // @Title 登录
 // @Description 登录接口
 // @Description 登录接口
 // @Param	request	body models.LoginReq true "type json string"
 // @Param	request	body models.LoginReq true "type json string"
@@ -166,6 +167,154 @@ func (this *UserController) Login() {
 	br.Data = resp
 	br.Data = resp
 	br.Msg = "登录成功"
 	br.Msg = "登录成功"
 }
 }
+*/
+
+// @Title 登录
+// @Description 登录接口
+// @Param	request	body models.LoginReq true "type json string"
+// @Success 200 {object} models.LoginResp
+// @router /login [post]
+func (this *UserController) Login() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	var req models.LoginReq
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+	user := this.User
+	if user == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录"
+		br.Ret = 408
+		return
+	}
+
+	unionId := this.User.UnionId
+	openId := this.User.OpenId
+	if unionId == "" {
+		br.Msg = "参数错误"
+		br.ErrMsg = "参数错误,unionId 为空"
+		return
+	}
+	if req.LoginType == 1 || req.LoginType == 3 {
+		if req.Mobile == "" {
+			br.Msg = "参数错误"
+			br.ErrMsg = "参数错误,手机号为空 为空"
+			return
+		}
+		if req.LoginType == 3 {
+			item, err := models.GetMsgCode(req.Mobile, req.VCode)
+			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
+			}
+		}
+		req.Mobile = strings.Trim(req.Mobile, " ")
+	} else if req.LoginType == 2 {
+		if req.Email == "" {
+			br.ErrMsg = "邮箱不能为空,请输入邮箱"
+			br.Msg = "邮箱不能为空,请输入邮箱"
+			return
+		}
+		if !utils.ValidateEmailFormatat(req.Email) {
+			br.ErrMsg = "邮箱格式错误,请重新输入"
+			br.Msg = "邮箱格式错误,请重新输入"
+			return
+		}
+		item, err := models.GetMsgCode(req.Email, req.VCode)
+		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
+		}
+	} else {
+		br.Msg = "无效的登录方式"
+		br.ErrMsg = "无效的登录方式,Err:" + err.Error()
+		return
+	}
+	user, err = services.BindWxUser(openId, req.Mobile, req.Email)
+	userId := user.UserId
+	var token string
+	tokenItem, err := models.GetTokenByOpenId(openId)
+	if err != nil && err.Error() != utils.ErrNoRow() {
+		br.Msg = "登录失败"
+		br.ErrMsg = "登录失败,获取token失败:" + err.Error()
+		return
+	}
+
+	if tokenItem == nil || (err != nil && err.Error() == utils.ErrNoRow()) {
+		timeUnix := time.Now().Unix()
+		timeUnixStr := strconv.FormatInt(timeUnix, 10)
+		token = utils.MD5(openId) + utils.MD5(timeUnixStr)
+		//新增session
+		{
+			session := new(models.CygxSession)
+			session.OpenId = unionId
+			session.UnionId = unionId
+			session.UserId = userId
+			session.CreatedTime = time.Now()
+			session.LastUpdatedTime = time.Now()
+			session.ExpireTime = time.Now().AddDate(0, 1, 0)
+			session.AccessToken = token
+			err = models.AddSession(session)
+			if err != nil {
+				br.Msg = "登录失败"
+				br.ErrMsg = "登录失败,新增用户session信息失败:" + err.Error()
+				return
+			}
+		}
+	} else {
+		token = tokenItem.AccessToken
+	}
+
+	//新增登录日志
+	{
+		loginLog := new(models.WxUserLog)
+		loginLog.UserId = userId
+		loginLog.OpenId = unionId
+		loginLog.Mobile = req.Mobile
+		loginLog.Email = req.Email
+		loginLog.CreateTime = time.Now()
+		loginLog.Handle = "wechat_user_login"
+		loginLog.Remark = token
+		go models.AddWxUserLog(loginLog)
+	}
+
+	resp := new(models.LoginResp)
+	resp.UserId = userId
+	resp.Authorization = token
+	br.Ret = 200
+	br.Success = true
+	br.Data = resp
+	br.Msg = "登录成功"
+}
 
 
 // @Title 获取用户详情
 // @Title 获取用户详情
 // @Description 获取用户详情接口
 // @Description 获取用户详情接口
@@ -256,29 +405,34 @@ func (this *UserController) CheckLogin() {
 		return
 		return
 	}
 	}
 	uid := this.User.UserId
 	uid := this.User.UserId
-	//判断token是否过期
-	userItem, err := models.GetWxUserItemByUserId(uid)
-	if err != nil {
-		br.Msg = "获取用户信息失败"
-		br.ErrMsg = "获取用户信息失败,Err:" + err.Error()
-		return
-	}
 	resp := new(models.CheckStatusResp)
 	resp := new(models.CheckStatusResp)
-	permissionStr, err := models.GetCompanyPermission(userItem.CompanyId)
-	if err != nil {
-		br.Msg = "获取信息失败"
-		br.ErrMsg = "获取客户信息失败,Err:" + err.Error()
-		return
-	}
-	resp.PermissionName = permissionStr
+	if uid > 0 {
+		//判断token是否过期
+		userItem, err := models.GetWxUserItemByUserId(uid)
+		if err != nil {
+			br.Msg = "获取用户信息失败"
+			br.ErrMsg = "获取用户信息失败,Err:" + err.Error()
+			return
+		}
+		permissionStr, err := models.GetCompanyPermission(userItem.CompanyId)
+		if err != nil {
+			br.Msg = "获取信息失败"
+			br.ErrMsg = "获取客户信息失败,Err:" + err.Error()
+			return
+		}
+		resp.PermissionName = permissionStr
 
 
-	if userItem.Mobile == "" && userItem.Email == "" {
+		if userItem.Mobile == "" && userItem.Email == "" {
+			resp.IsBind = true
+		}
+		if userItem.UnionId == "" {
+			resp.IsAuth = true
+		}
+	} else {
 		resp.IsBind = true
 		resp.IsBind = true
-	}
-	if userItem.UnionId == "" {
 		resp.IsAuth = true
 		resp.IsAuth = true
+		resp.PermissionName = ""
 	}
 	}
-
 	br.Success = true
 	br.Success = true
 	br.Msg = "获取成功"
 	br.Msg = "获取成功"
 	br.Data = resp
 	br.Data = resp

+ 273 - 112
controllers/wechat.go

@@ -18,6 +18,141 @@ type WechatCommonController struct {
 	BaseCommonController
 	BaseCommonController
 }
 }
 
 
+//
+//// @Title 微信登录接口
+//// @Description 微信登录接口
+//// @Param   Code   query   string  true       "微信唯一编码code"
+//// @Success 200 {object} models.WxLoginResp
+//// @router /login [get]
+//func (this *WechatCommonController) WechatLogin() {
+//	br := new(models.BaseResponse).Init()
+//	defer func() {
+//		this.Data["json"] = br
+//		this.ServeJSON()
+//	}()
+//	code := this.GetString("Code")
+//	if code == "" {
+//		br.Msg = "参数错误"
+//		br.ErrMsg = "Code 为空"
+//		return
+//	}
+//	wxInfo, err := weapp.Login(utils.WxAppId, utils.WxAppSecret, code)
+//	if err != nil {
+//		br.Msg = "获取用户信息失败"
+//		br.ErrMsg = "获取用户信息失败,Err:" + err.Error()
+//		return
+//	}
+//	if err = wxInfo.GetResponseError(); err != nil {
+//		br.Msg = "获取用户信息失败"
+//		br.ErrMsg = "获取用户信息失败,code:" + strconv.Itoa(wxInfo.ErrCode) + ",msg:" + wxInfo.ErrMSG
+//		return
+//	}
+//	firstLogin := 1
+//	userId := 0
+//	wxUser, err := models.GetWxUserItemByUnionid(wxInfo.UnionID)
+//	if err != nil && err.Error() != utils.ErrNoRow() {
+//		br.Msg = "获取用户信息失败"
+//		br.ErrMsg = "根据openid获取用户信息失败,Eerr:" + err.Error()
+//		return
+//	}
+//	if wxUser == nil || (err != nil && err.Error() == utils.ErrNoRow()) {
+//		user := new(models.WxUser)
+//		user.OpenId = wxInfo.OpenID
+//		user.CompanyId = 1
+//		user.CreatedTime = time.Now()
+//		user.UnionId = wxInfo.UnionID
+//		user.Unionid = wxInfo.UnionID
+//		user.FirstLogin = 1
+//		user.Enabled = 1
+//		user.RegisterPlatform = 1
+//		user.RegisterTime = time.Now()
+//		user.SessionKey = wxInfo.SessionKey
+//		newId, err := models.AddWxUser(user)
+//		if err != nil {
+//			br.Msg = "登录失败"
+//			br.ErrMsg = "登录失败,新增联系人失败,Eerr:" + err.Error()
+//			return
+//		}
+//		userId = int(newId)
+//	} else {
+//		firstLogin = wxUser.FirstLogin
+//		userId = wxUser.UserId
+//		models.ModifyWxUserSessionKey(wxInfo.SessionKey, userId)
+//	}
+//
+//	var token string
+//	tokenItem, err := models.GetTokenByUid(userId)
+//	if err != nil && err.Error() != utils.ErrNoRow() {
+//		br.Msg = "登录失败"
+//		br.ErrMsg = "登录失败,获取token失败:" + err.Error()
+//		return
+//	}
+//
+//	if tokenItem == nil || (err != nil && err.Error() == utils.ErrNoRow()) {
+//		timeUnix := time.Now().Unix()
+//		timeUnixStr := strconv.FormatInt(timeUnix, 10)
+//		token = utils.MD5(strconv.Itoa(userId)) + utils.MD5(timeUnixStr)
+//		//新增session
+//		{
+//			session := new(models.CygxSession)
+//			session.OpenId = wxInfo.OpenID
+//			session.UnionId = wxInfo.UnionID
+//			session.UserId = userId
+//			session.CreatedTime = time.Now()
+//			session.LastUpdatedTime = time.Now()
+//			session.ExpireTime = time.Now().AddDate(0, 3, 0)
+//			session.AccessToken = token
+//			err = models.AddSession(session)
+//			if err != nil {
+//				br.Msg = "登录失败"
+//				br.ErrMsg = "登录失败,新增用户session信息失败:" + err.Error()
+//				return
+//			}
+//		}
+//	} else {
+//		token = tokenItem.AccessToken
+//	}
+//	{
+//		newItem, _ := models.GetWxUserItemByUserId(userId)
+//		if newItem.Mobile == "" && newItem.Email == "" {
+//			firstLogin = 1
+//		}
+//	}
+//
+//	//新增登录日志
+//	{
+//		loginLog := new(models.WxUserLog)
+//		loginLog.UserId = userId
+//		loginLog.OpenId = wxInfo.OpenID
+//		loginLog.UnionId = wxInfo.UnionID
+//		loginLog.CreateTime = time.Now()
+//		loginLog.Handle = "wechat_login_cygx"
+//		loginLog.Remark = token
+//		go models.AddWxUserLog(loginLog)
+//	}
+//
+//	{
+//		codeLog := new(models.WxUserCode)
+//		codeLog.WxCode = code
+//		codeLog.UserId = userId
+//		codeLog.Code = 0
+//		codeLog.FirstLogin = firstLogin
+//		codeLog.Authorization = token
+//		codeLog.UserPermission = 1
+//		codeLog.CreateTime = time.Now()
+//		models.AddWxUserCode(codeLog)
+//	}
+//
+//	resp := new(models.WxLoginResp)
+//	resp.UserId = userId
+//	resp.FirstLogin = firstLogin
+//	resp.Authorization = token
+//	br.Ret = 200
+//	br.Success = true
+//	br.Msg = "登录成功"
+//	br.Data = resp
+//}
+
 // @Title 微信登录接口
 // @Title 微信登录接口
 // @Description 微信登录接口
 // @Description 微信登录接口
 // @Param   Code   query   string  true       "微信唯一编码code"
 // @Param   Code   query   string  true       "微信唯一编码code"
@@ -46,78 +181,21 @@ func (this *WechatCommonController) WechatLogin() {
 		br.ErrMsg = "获取用户信息失败,code:" + strconv.Itoa(wxInfo.ErrCode) + ",msg:" + wxInfo.ErrMSG
 		br.ErrMsg = "获取用户信息失败,code:" + strconv.Itoa(wxInfo.ErrCode) + ",msg:" + wxInfo.ErrMSG
 		return
 		return
 	}
 	}
-	firstLogin := 1
-	userId := 0
-	wxUser, err := models.GetWxUserItemByUnionid(wxInfo.UnionID)
-	if err != nil && err.Error() != utils.ErrNoRow() {
-		br.Msg = "获取用户信息失败"
-		br.ErrMsg = "根据openid获取用户信息失败,Eerr:" + err.Error()
-		return
-	}
-	if wxUser == nil || (err != nil && err.Error() == utils.ErrNoRow()) {
-		user := new(models.WxUser)
-		user.OpenId = wxInfo.OpenID
-		user.CompanyId = 1
-		user.CreatedTime = time.Now()
-		user.UnionId = wxInfo.UnionID
-		user.Unionid = wxInfo.UnionID
-		user.FirstLogin = 1
-		user.Enabled = 1
-		user.RegisterPlatform = 1
-		user.RegisterTime = time.Now()
-		user.SessionKey = wxInfo.SessionKey
-		newId, err := models.AddWxUser(user)
-		if err != nil {
-			br.Msg = "登录失败"
-			br.ErrMsg = "登录失败,新增联系人失败,Eerr:" + err.Error()
-			return
-		}
-		userId = int(newId)
-	} else {
-		firstLogin = wxUser.FirstLogin
-		userId = wxUser.UserId
-		models.ModifyWxUserSessionKey(wxInfo.SessionKey, userId)
-	}
 
 
-	var token string
-	tokenItem, err := models.GetTokenByUid(userId)
-	if err != nil && err.Error() != utils.ErrNoRow() {
-		br.Msg = "登录失败"
-		br.ErrMsg = "登录失败,获取token失败:" + err.Error()
+	wxUserInfo := new(services.WxUserInfo)
+	wxUserInfo.Unionid = wxInfo.UnionID
+	wxUserInfo.Openid = wxInfo.OpenID
+	wxUserInfo.Unionid = wxInfo.UnionID
+	wxUserInfo.Errcode = wxInfo.ErrCode
+	wxUserInfo.Errmsg = wxInfo.ErrMSG
+	wxUserInfo.SessionKey = wxInfo.SessionKey
+	token, userId, firstLogin, _, err := services.WxLogin(code, wxInfo.OpenID, wxInfo.UnionID, wxUserInfo)
+	if err != nil {
+		br.Msg = "微信登录失败"
+		br.ErrMsg = "微信登录失败,err:" + err.Error()
 		return
 		return
 	}
 	}
 
 
-	if tokenItem == nil || (err != nil && err.Error() == utils.ErrNoRow()) {
-		timeUnix := time.Now().Unix()
-		timeUnixStr := strconv.FormatInt(timeUnix, 10)
-		token = utils.MD5(strconv.Itoa(userId)) + utils.MD5(timeUnixStr)
-		//新增session
-		{
-			session := new(models.CygxSession)
-			session.OpenId = wxInfo.OpenID
-			session.UnionId = wxInfo.UnionID
-			session.UserId = userId
-			session.CreatedTime = time.Now()
-			session.LastUpdatedTime = time.Now()
-			session.ExpireTime = time.Now().AddDate(0, 3, 0)
-			session.AccessToken = token
-			err = models.AddSession(session)
-			if err != nil {
-				br.Msg = "登录失败"
-				br.ErrMsg = "登录失败,新增用户session信息失败:" + err.Error()
-				return
-			}
-		}
-	} else {
-		token = tokenItem.AccessToken
-	}
-	{
-		newItem, _ := models.GetWxUserItemByUserId(userId)
-		if newItem.Mobile == "" && newItem.Email == "" {
-			firstLogin = 1
-		}
-	}
-
 	//新增登录日志
 	//新增登录日志
 	{
 	{
 		loginLog := new(models.WxUserLog)
 		loginLog := new(models.WxUserLog)
@@ -151,6 +229,122 @@ func (this *WechatCommonController) WechatLogin() {
 	br.Msg = "登录成功"
 	br.Msg = "登录成功"
 	br.Data = resp
 	br.Data = resp
 }
 }
+//
+//// @Title 小程序获取用户信息
+//// @Description 小程序获取用户信息接口(需要登录)
+//// @Param	request	body models.WxGetUserInfoReq true "type json string"
+//// @Success 200 {object} models.WxGetUserInfoResp
+//// @router /getUserInfo [post]
+//func (this *WechatController) GetUserInfo() {
+//	br := new(models.BaseResponse).Init()
+//	defer func() {
+//		this.Data["json"] = br
+//		this.ServeJSON()
+//	}()
+//	var req models.WxGetUserInfoReq
+//	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+//	if err != nil {
+//		br.Msg = "参数解析异常!"
+//		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+//		return
+//	}
+//	if req.RawData == "" || req.EncryptedData == "" || req.Signature == "" || req.Iv == "" {
+//		br.Msg = "参数错误"
+//		return
+//	}
+//	user := this.User
+//	if user == nil {
+//		br.Msg = "请登陆"
+//		br.Ret = 408
+//		return
+//	}
+//	sessionKey := user.SessionKey
+//	userInfo, err := weapp.DecryptUserInfo(sessionKey, req.RawData, req.EncryptedData, req.Signature, req.Iv)
+//	if err != nil {
+//		br.Msg = "解析用户信息失败"
+//		br.ErrMsg = "解析用户信息失败,DecryptUserInfo Err:" + err.Error()
+//		return
+//	}
+//	userId := 0
+//	//修改用户微信信息
+//	oldUser, err := models.GetWxUserItemByUnionid(userInfo.UnionID)
+//	if err != nil && err.Error() != utils.ErrNoRow() {
+//		br.Msg = "获取用户信息失败"
+//		br.ErrMsg = "获取用户信息失败 Err:" + err.Error()
+//		return
+//	}
+//	if oldUser == nil || (err != nil && err.Error() == utils.ErrNoRow()) {
+//		err = models.ModifyWxUserInfo(userInfo.UnionID, userInfo.Nickname, userInfo.Province, userInfo.City, userInfo.Country, userInfo.Avatar, userInfo.Gender, user.UserId)
+//		if err != nil && err.Error() != utils.ErrNoRow() {
+//			br.Msg = "获取用户信息失败"
+//			br.ErrMsg = "修改用户信息失败 Err:" + err.Error()
+//			return
+//		}
+//		userId = user.UserId
+//	} else {
+//		if user.UserId == oldUser.UserId {
+//			err = models.ModifyWxUserInfo(userInfo.UnionID, userInfo.Nickname, userInfo.Province, userInfo.City, userInfo.Country, userInfo.Avatar, userInfo.Gender, user.UserId)
+//			if err != nil && err.Error() != utils.ErrNoRow() {
+//				br.Msg = "获取用户信息失败"
+//				br.ErrMsg = "修改用户信息失败 Err:" + err.Error()
+//				return
+//			}
+//			userId = user.UserId
+//		} else {
+//			userId = oldUser.UserId
+//			err = models.ModifyWxUserInfo(userInfo.UnionID, userInfo.Nickname, userInfo.Province, userInfo.City, userInfo.Country, userInfo.Avatar, userInfo.Gender, oldUser.UserId)
+//			if err != nil && err.Error() != utils.ErrNoRow() {
+//				br.Msg = "获取用户信息失败"
+//				br.ErrMsg = "修改用户信息失败 Err:" + err.Error()
+//				return
+//			}
+//			err = models.DeleteWxUserByUserId(user.UserId)
+//			if err != nil {
+//				br.Msg = "删除用户信息失败"
+//				br.ErrMsg = "删除用户信息失败 Err:" + err.Error()
+//				return
+//			}
+//		}
+//	}
+//	var token string
+//	tokenItem, err := models.GetTokenByUid(userId)
+//	if err != nil && err.Error() != utils.ErrNoRow() {
+//		br.Msg = "登录失败"
+//		br.ErrMsg = "登录失败,获取token失败:" + err.Error()
+//		return
+//	}
+//
+//	if tokenItem == nil || (err != nil && err.Error() == utils.ErrNoRow()) {
+//		timeUnix := time.Now().Unix()
+//		timeUnixStr := strconv.FormatInt(timeUnix, 10)
+//		token = utils.MD5(strconv.Itoa(userId)) + utils.MD5(timeUnixStr)
+//		//新增session
+//		{
+//			session := new(models.CygxSession)
+//			session.OpenId = userInfo.OpenID
+//			session.UnionId = userInfo.UnionID
+//			session.UserId = userId
+//			session.CreatedTime = time.Now()
+//			session.LastUpdatedTime = time.Now()
+//			session.ExpireTime = time.Now().AddDate(0, 3, 0)
+//			session.AccessToken = token
+//			err = models.AddSession(session)
+//			if err != nil {
+//				br.Msg = "登录失败"
+//				br.ErrMsg = "登录失败,新增用户session信息失败:" + err.Error()
+//				return
+//			}
+//		}
+//	} else {
+//		token = tokenItem.AccessToken
+//	}
+//	resp := new(models.WxGetUserInfoResp)
+//	resp.Authorization = token
+//	br.Msg = "获取成功!"
+//	br.Ret = 200
+//	br.Success = true
+//}
+
 
 
 // @Title 小程序获取用户信息
 // @Title 小程序获取用户信息
 // @Description 小程序获取用户信息接口(需要登录)
 // @Description 小程序获取用户信息接口(需要登录)
@@ -180,6 +374,7 @@ func (this *WechatController) GetUserInfo() {
 		br.Ret = 408
 		br.Ret = 408
 		return
 		return
 	}
 	}
+	userId := user.UserId
 	sessionKey := user.SessionKey
 	sessionKey := user.SessionKey
 	userInfo, err := weapp.DecryptUserInfo(sessionKey, req.RawData, req.EncryptedData, req.Signature, req.Iv)
 	userInfo, err := weapp.DecryptUserInfo(sessionKey, req.RawData, req.EncryptedData, req.Signature, req.Iv)
 	if err != nil {
 	if err != nil {
@@ -187,59 +382,25 @@ func (this *WechatController) GetUserInfo() {
 		br.ErrMsg = "解析用户信息失败,DecryptUserInfo Err:" + err.Error()
 		br.ErrMsg = "解析用户信息失败,DecryptUserInfo Err:" + err.Error()
 		return
 		return
 	}
 	}
-	userId := 0
 	//修改用户微信信息
 	//修改用户微信信息
-	oldUser, err := models.GetWxUserItemByUnionid(userInfo.UnionID)
-	if err != nil && err.Error() != utils.ErrNoRow() {
-		br.Msg = "获取用户信息失败"
-		br.ErrMsg = "获取用户信息失败 Err:" + err.Error()
+	err = models.ModifyUserRecordInfo(userInfo.UnionID, userInfo.Nickname, userInfo.Avatar, userInfo.City, userInfo.Province, userInfo.Country, userInfo.Gender, userId)
+	if err != nil {
+		br.Msg = "授权失败"
+		br.ErrMsg = "授权失败,修改用户信息失败:" + err.Error()
 		return
 		return
 	}
 	}
-	if oldUser == nil || (err != nil && err.Error() == utils.ErrNoRow()) {
-		err = models.ModifyWxUserInfo(userInfo.UnionID, userInfo.Nickname, userInfo.Province, userInfo.City, userInfo.Country, userInfo.Avatar, userInfo.Gender, user.UserId)
-		if err != nil && err.Error() != utils.ErrNoRow() {
-			br.Msg = "获取用户信息失败"
-			br.ErrMsg = "修改用户信息失败 Err:" + err.Error()
-			return
-		}
-		userId = user.UserId
-	} else {
-		if user.UserId == oldUser.UserId {
-			err = models.ModifyWxUserInfo(userInfo.UnionID, userInfo.Nickname, userInfo.Province, userInfo.City, userInfo.Country, userInfo.Avatar, userInfo.Gender, user.UserId)
-			if err != nil && err.Error() != utils.ErrNoRow() {
-				br.Msg = "获取用户信息失败"
-				br.ErrMsg = "修改用户信息失败 Err:" + err.Error()
-				return
-			}
-			userId = user.UserId
-		} else {
-			userId = oldUser.UserId
-			err = models.ModifyWxUserInfo(userInfo.UnionID, userInfo.Nickname, userInfo.Province, userInfo.City, userInfo.Country, userInfo.Avatar, userInfo.Gender, oldUser.UserId)
-			if err != nil && err.Error() != utils.ErrNoRow() {
-				br.Msg = "获取用户信息失败"
-				br.ErrMsg = "修改用户信息失败 Err:" + err.Error()
-				return
-			}
-			err = models.DeleteWxUserByUserId(user.UserId)
-			if err != nil {
-				br.Msg = "删除用户信息失败"
-				br.ErrMsg = "删除用户信息失败 Err:" + err.Error()
-				return
-			}
-		}
-	}
 	var token string
 	var token string
-	tokenItem, err := models.GetTokenByUid(userId)
+	tokenItem, err := models.GetTokenByOpenId(userInfo.OpenID)
 	if err != nil && err.Error() != utils.ErrNoRow() {
 	if err != nil && err.Error() != utils.ErrNoRow() {
-		br.Msg = "登录失败"
-		br.ErrMsg = "登录失败,获取token失败:" + err.Error()
+		br.Msg = "授权失败"
+		br.ErrMsg = "授权失败,获取token失败:" + err.Error()
 		return
 		return
 	}
 	}
 
 
 	if tokenItem == nil || (err != nil && err.Error() == utils.ErrNoRow()) {
 	if tokenItem == nil || (err != nil && err.Error() == utils.ErrNoRow()) {
 		timeUnix := time.Now().Unix()
 		timeUnix := time.Now().Unix()
 		timeUnixStr := strconv.FormatInt(timeUnix, 10)
 		timeUnixStr := strconv.FormatInt(timeUnix, 10)
-		token = utils.MD5(strconv.Itoa(userId)) + utils.MD5(timeUnixStr)
+		token = utils.MD5(userInfo.OpenID) + utils.MD5(timeUnixStr)
 		//新增session
 		//新增session
 		{
 		{
 			session := new(models.CygxSession)
 			session := new(models.CygxSession)
@@ -252,8 +413,8 @@ func (this *WechatController) GetUserInfo() {
 			session.AccessToken = token
 			session.AccessToken = token
 			err = models.AddSession(session)
 			err = models.AddSession(session)
 			if err != nil {
 			if err != nil {
-				br.Msg = "登录失败"
-				br.ErrMsg = "登录失败,新增用户session信息失败:" + err.Error()
+				br.Msg = "授权失败"
+				br.ErrMsg = "授权失败,新增用户session信息失败:" + err.Error()
 				return
 				return
 			}
 			}
 		}
 		}

+ 8 - 0
models/session.go

@@ -43,3 +43,11 @@ func GetTokenByUid(uid int) (item *CygxSession, err error) {
 	err = o.Raw(sql, uid).QueryRow(&item)
 	err = o.Raw(sql, uid).QueryRow(&item)
 	return
 	return
 }
 }
+
+//根据用户id获取token
+func GetTokenByOpenId(openId string) (item *CygxSession, err error) {
+	sql := `SELECT * FROM cygx_session WHERE open_id=? AND expire_time> NOW() ORDER BY session_id DESC LIMIT 1 `
+	o := orm.NewOrm()
+	err = o.Raw(sql, openId).QueryRow(&item)
+	return
+}

+ 48 - 18
models/user_record.go

@@ -7,26 +7,56 @@ import (
 
 
 type UserRecord struct {
 type UserRecord struct {
 	UserRecordId   int       `orm:"column(user_record_id);pk"`
 	UserRecordId   int       `orm:"column(user_record_id);pk"`
+	OpenId         string    `description:"用户openid,最大长度:32"`
+	UnionId        string    `description:"用户unionid,最大长度:64"`
+	Subscribe      int       `description:"是否关注"`
+	NickName       string    `descritpion:"用户昵称,最大长度:32"`
+	RealName       string    `descritpion:"用户实际名称,最大长度:32"`
+	BindAccount    string    `descritpion:"绑定时的账号,最大长度:128"`
+	Sex            int       `descritpion:"普通用户性别,1为男性,2为女性"`
+	Province       string    `description:"普通用户个人资料填写的省份,最大长度:30"`
+	City           string    `description:"普通用户个人资料填写的城市,最大长度:30"`
+	Country        string    `description:"国家,如中国为CN,最大长度:30"`
+	Headimgurl     string    `description:"用户第三方(微信)头像,最大长度:512"`
+	CreateTime     time.Time `description:"创建时间,关系添加时间、用户授权时间"`
+	CreatePlatform int       `description:"注册平台,1:日度点评公众号,2:管理后台,3:pc端网站,4:查研观向小程序;默认:1"`
+	SessionKey     string    `description:"微信小程序会话密钥,最大长度:255"`
 	UserId         int       `description:"用户id"`
 	UserId         int       `description:"用户id"`
-	OpenId         string    `description:"open_id"`
-	UnionId        string    `description:"union_id"`
-	Subscribe      int       `description:"subscribe"`
-	NickName       string    `description:"用户昵称"`
-	RealName       string    `description:"用户实际名称"`
-	BindAccount    string    `description:"绑定时的账号"`
-	Sex            int       `description:"普通用户性别,1为男性,2为女性"`
-	Province       string    `description:"普通用户个人资料填写的省份"`
-	City           string    `description:"普通用户个人资料填写的城市"`
-	Country        string    `description:"国家,如中国为CN"`
-	Headimgurl     string    `description:"头像"`
-	CreateTime     time.Time `description:"头像"`
-	CreatePlatform int       `description:"注册平台,1:日度点评公众号,2:管理后台,3:pc端网站,4:查研观向小程序"`
-	SessionKey     string    `description:"微信小程序会话密钥"`
 }
 }
 
 
-//新增联系人记录
-func AddUserRecord(item *UserRecord) (lastId int64, err error) {
+//根据openid获取用户关系
+func GetUserRecordByOpenId(openId string) (item *UserRecord, err error) {
+	sql := `SELECT * FROM user_record WHERE open_id=? `
+	err = orm.NewOrm().Raw(sql, openId).QueryRow(&item)
+	return
+}
+
+//根据用户id和平台id获取用户关系
+func GetUserRecordByUserId(userId, platform int) (item *UserRecord, err error) {
+	sql := `SELECT * FROM user_record WHERE user_id=? AND create_platform = ?`
+	err = orm.NewOrm().Raw(sql, userId, platform).QueryRow(&item)
+	return
+}
+
+//添加用户关系
+func AddUserRecord(record *UserRecord) (recordId int64, err error) {
 	o := orm.NewOrm()
 	o := orm.NewOrm()
-	lastId, err = o.Insert(item)
+	recordId, err = o.Insert(record)
 	return
 	return
-}
+}
+
+//根据openid绑定用户关系
+func BindUserRecordByOpenid(userId int, openId, bindAccount string) (err error) {
+	o := orm.NewOrm()
+	msql := " UPDATE user_record SET user_id = ?,bind_account=? WHERE open_id = ? "
+	_, err = o.Raw(msql, userId, bindAccount, openId).Exec()
+	return
+}
+
+//修改用户微信信息
+func ModifyUserRecordInfo(openId, nickName, headimgUrl, city, province, country string, sex, userId int) (err error) {
+	o := orm.NewOrm()
+	sql := `UPDATE user_record SET nick_name=?,headimgurl=?,sex=?,city=?,province=?,country=? WHERE user_id=? and openid=? `
+	_, err = o.Raw(sql, nickName, headimgUrl, sex, city, province, country, userId, openId).Exec()
+	return
+}

+ 9 - 5
models/wechat.go

@@ -83,8 +83,12 @@ func GetWxToken() (item *WxAccessToken, err error) {
 }
 }
 
 
 type WxAccessToken struct {
 type WxAccessToken struct {
-	AccessToken string `json:"access_token"`
-	ExpiresIn   int    `json:"expires_in"`
-	Errcode     int
-	Errmsg      string
-}
+	AccessToken  string `json:"access_token"`
+	ExpiresIn    int    `json:"expires_in"`
+	RefreshToken string `json:"refresh_token"`
+	Openid       string `json:"openid"`
+	Unionid      string `json:"unionid"`
+	Scope        string `json:"scope"`
+	Errcode      int    `json:"errcode"`
+	Errmsg       string `json:"errmsg"`
+}

+ 7 - 2
models/wx_user.go

@@ -172,11 +172,16 @@ type WxGetPhoneNumberResp struct {
 	CountryCode     string `description:"区号"`
 	CountryCode     string `description:"区号"`
 }
 }
 
 
-
 func GetWxUserItemByMobile(mobile string) (item *WxUserItem, err error) {
 func GetWxUserItemByMobile(mobile string) (item *WxUserItem, err error) {
 	sql := `SELECT a.*,b.company_name FROM wx_user AS a
 	sql := `SELECT a.*,b.company_name FROM wx_user AS a
 			LEFT JOIN company AS b on a.company_id=b.company_id
 			LEFT JOIN company AS b on a.company_id=b.company_id
 			WHERE a.mobile=? `
 			WHERE a.mobile=? `
 	err = orm.NewOrm().Raw(sql, mobile).QueryRow(&item)
 	err = orm.NewOrm().Raw(sql, mobile).QueryRow(&item)
 	return
 	return
-}
+}
+
+func GetWxUserItemByEmail(email string) (item *WxUserItem, err error) {
+	sql := `SELECT * FROM wx_user WHERE email=? `
+	err = orm.NewOrm().Raw(sql, email).QueryRow(&item)
+	return
+}

+ 1 - 0
services/elastic.go

@@ -454,6 +454,7 @@ func EsMultiMatchFunctionScoreQuery(indexName, keyWord string, startSize, pageSi
 	return
 	return
 }
 }
 
 
+
 func GetWeight(length int) []int {
 func GetWeight(length int) []int {
 	steep := 10
 	steep := 10
 	intArr := make([]int, 0)
 	intArr := make([]int, 0)

+ 342 - 0
services/user.go

@@ -0,0 +1,342 @@
+package services
+
+import (
+	"errors"
+	"hongze/hongze_cygx/models"
+	"hongze/hongze_cygx/utils"
+	"strconv"
+	"time"
+)
+
+var ERR_NO_USER_RECORD = errors.New("用户关系没有入库")
+var ERR_USER_NOT_BIND = errors.New("用户没有绑定")
+
+//通过openid获取用户信息
+func GetWxUserItemByOpenId(openid string) (item *models.WxUserItem, err error) {
+	//通过openid获取用户关联信息
+	userRecord, userRecordErr := models.GetUserRecordByOpenId(openid)
+	if userRecordErr != nil {
+		if userRecordErr.Error() == utils.ErrNoRow() {
+			err = ERR_NO_USER_RECORD
+			return
+		} else {
+			err = userRecordErr
+			return
+		}
+	}
+
+	//该openid在系统中没有关联关系
+	if userRecord == nil {
+		err = ERR_NO_USER_RECORD
+		return
+	}
+
+	//该openid没有绑定用户
+	if userRecord.UserId <= 0 {
+		err = ERR_USER_NOT_BIND
+		item = new(models.WxUserItem)
+		//格式化返回用户数据
+		formatWxUserAndUserRecord(item, userRecord)
+		return
+	}
+
+	//获取用户信息
+	item, wxUserErr := models.GetWxUserItemByUserId(userRecord.UserId)
+	if wxUserErr != nil {
+		err = wxUserErr
+		return
+	}
+	//格式化返回用户数据
+	formatWxUserAndUserRecord(item, userRecord)
+	return
+}
+
+//根据用户id和平台id获取用户信息
+func GetWxUserItemByUserId(userId, platform int) (wxUserItem *models.WxUserItem, err error) {
+	//获取用户信息
+	wxUserItem, wxUserErr := models.GetWxUserItemByUserId(userId)
+	if wxUserErr != nil {
+		err = wxUserErr
+		return
+	}
+	//格式化返回用户数据
+	formatWxUser(wxUserItem, platform)
+	return
+}
+
+//根据用户邮箱和平台id获取用户信息
+func GetWxUserItemByEmail(email string, platform int) (wxUserItem *models.WxUserItem, err error) {
+	//获取用户信息
+	wxUserItem, wxUserErr := models.GetWxUserItemByEmail(email)
+	if wxUserErr != nil {
+		err = wxUserErr
+		return
+	}
+
+	//格式化返回用户数据
+	formatWxUser(wxUserItem, platform)
+	return
+}
+
+//根据用户手机号和平台id获取用户信息
+func GetWxUserItemByMobile(mobile string, platform int) (wxUserItem *models.WxUserItem, err error) {
+	//获取用户信息
+	wxUserItem, wxUserErr := models.GetWxUserItemByMobile(mobile)
+	if wxUserErr != nil {
+		err = wxUserErr
+		return
+	}
+	//格式化返回用户数据
+	formatWxUser(wxUserItem, platform)
+	return
+}
+
+//根据用户unionid和平台id获取用户信息
+func GetWxUserItemByUnionId(unionId string, platform int) (wxUserItem *models.WxUserItem, err error) {
+	//获取用户信息
+	wxUserItem, wxUserErr := models.GetWxUserItemByUnionid(unionId)
+	if wxUserErr != nil {
+		err = wxUserErr
+		return
+	}
+	//格式化返回用户数据
+	formatWxUser(wxUserItem, platform)
+	return
+}
+
+//通过用户 关系表记录  和  用户记录  格式化返回 用户数据
+func formatWxUserAndUserRecord(wxUser *models.WxUserItem, userRecord *models.UserRecord) {
+	wxUser.OpenId = userRecord.OpenId
+	wxUser.UnionId = userRecord.UnionId
+	wxUser.NickName = userRecord.NickName
+	//wxUser.RealName = userRecord.RealName
+	//wxUser.BindAccount = userRecord.BindAccount
+	wxUser.Headimgurl = userRecord.Headimgurl
+}
+
+//通过用户 用户记录  和  来源平台  格式化返回 用户数据
+func formatWxUser(wxUser *models.WxUserItem, platform int) {
+	//根据用户id和平台id获取用户关系
+	userRecord, userRecordErr := models.GetUserRecordByUserId(wxUser.UserId, platform)
+	if userRecordErr != nil {
+		if userRecordErr.Error() != utils.ErrNoRow() {
+			return
+		}
+		if userRecordErr.Error() == utils.ErrNoRow() {
+			return
+		}
+	}
+
+	//该openid在系统中没有关联关系
+	if userRecord == nil {
+		return
+	}
+
+	wxUser.OpenId = userRecord.OpenId
+	wxUser.UnionId = userRecord.UnionId
+	wxUser.NickName = userRecord.NickName
+	//wxUser.RealName = userRecord.RealName
+	//wxUser.BindAccount = userRecord.BindAccount
+	wxUser.Headimgurl = userRecord.Headimgurl
+	return
+}
+
+//用户绑定
+func BindWxUser(openid, mobile, email string) (wxUser *models.WxUserItem, err error) {
+	if mobile == "" && email == "" {
+		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
+	}
+	//根据邮箱获取用户信息
+	if wxUser == nil && email != "" {
+		tmpWxUser, wxUserErr := models.GetWxUserItemByEmail(email)
+		if wxUserErr != nil && wxUserErr.Error() != utils.ErrNoRow() {
+			err = wxUserErr
+			return
+		}
+		wxUser = tmpWxUser
+		bindAccount = email
+	}
+
+	//查询openid的第三方(微信)信息
+	userRecord, err := models.GetUserRecordByOpenId(openid)
+	if err != nil {
+		return
+	}
+
+	var userId int
+	//如果查询出来的用户是nil,那么需要新增用户
+	if wxUser == nil {
+		user := &models.WxUser{
+			CompanyId:        1,
+			CreatedTime:      time.Now(),
+			FirstLogin:       1,
+			Enabled:          1,
+			RegisterPlatform: 1,
+			RegisterTime:     time.Now(),
+			Mobile:           mobile,
+			Email:            email,
+		}
+		tmpUserId, addUserErr := models.AddWxUser(user)
+		if err != nil {
+			err = addUserErr
+			return
+		}
+		user.UserId = int(tmpUserId)
+		userId = int(tmpUserId)
+		wxUser, err = models.GetWxUserItemByUserId(userId)
+	} else {
+		userId = wxUser.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
+	//格式化用户数据
+	formatWxUserAndUserRecord(wxUser, userRecord)
+	return
+}
+
+//微信登录
+func WxLogin(code, openId, unionId string, wxUserInfo *WxUserInfo) (token string, userId, firstLogin, permission int, err error) {
+	if unionId == "" {
+		unionId = wxUserInfo.Unionid
+	}
+	//firstLogin==1,强制绑定手机号或者邮箱
+	firstLogin = 1
+	wxUser, wxUserErr := GetWxUserItemByOpenId(openId)
+	if wxUserErr == ERR_NO_USER_RECORD { //没有用户openid记录
+		_, recordErr := AddUserRecord(openId, unionId, wxUserInfo.Nickname, "", wxUserInfo.Province, wxUserInfo.City, wxUserInfo.Country, wxUserInfo.Headimgurl, wxUserInfo.SessionKey, utils.WxPlatform, wxUserInfo.Sex, 0)
+		err = recordErr
+		return
+	} else if wxUserErr == ERR_USER_NOT_BIND {
+		//没有用户信息
+		//wxUser.FirstLogin = 1
+	} else if wxUserErr != nil {
+		err = wxUserErr
+		return
+	}
+
+	//如果已经登录注册绑定的情况下
+	if wxUser != nil && wxUserErr == nil {
+		//获取用户权限
+		firstLogin = wxUser.FirstLogin
+		userId = wxUser.UserId
+		if wxUserInfo != nil {
+			go models.ModifyUserRecordInfo(openId, wxUserInfo.Nickname, wxUserInfo.Headimgurl, wxUserInfo.City, wxUserInfo.Province, wxUserInfo.Country, wxUserInfo.Sex, userId)
+		}
+
+		{
+			codeLog := new(models.WxUserCode)
+			codeLog.WxCode = code
+			codeLog.UserId = userId
+			codeLog.Code = 0
+			codeLog.FirstLogin = firstLogin
+			codeLog.Authorization = token
+			codeLog.UserPermission = permission
+			codeLog.CreateTime = time.Now()
+			models.AddWxUserCode(codeLog)
+		}
+		if wxUser.Mobile == "" && wxUser.Email == "" {
+			firstLogin = 1
+		}
+	}
+
+	//获取登录token
+	tokenItem, tokenErr := models.GetTokenByOpenId(openId)
+	if tokenErr != nil && tokenErr.Error() != utils.ErrNoRow() {
+		err = errors.New("登录失败,获取token失败:" + tokenErr.Error())
+		return
+	}
+
+	if tokenItem == nil || (tokenErr != nil && tokenErr.Error() == utils.ErrNoRow()) {
+		timeUnix := time.Now().Unix()
+		timeUnixStr := strconv.FormatInt(timeUnix, 10)
+		token = utils.MD5(openId) + utils.MD5(timeUnixStr)
+		//新增session
+		{
+			session := new(models.CygxSession)
+			session.OpenId = openId
+			session.UserId = userId
+			session.CreatedTime = time.Now()
+			session.LastUpdatedTime = time.Now()
+			session.ExpireTime = time.Now().AddDate(0, 3, 0)
+			session.AccessToken = token
+			sessionErr := models.AddSession(session)
+			if err != nil {
+				err = errors.New("登录失败,新增用户session信息失败:" + sessionErr.Error())
+				return
+			}
+		}
+	} else {
+		token = tokenItem.AccessToken
+	}
+
+	//新增登录日志
+	{
+		loginLog := new(models.WxUserLog)
+		loginLog.UserId = userId
+		loginLog.OpenId = openId
+		loginLog.UnionId = unionId
+		loginLog.CreateTime = time.Now()
+		loginLog.Handle = "wechat_login"
+		loginLog.Remark = token
+		go models.AddWxUserLog(loginLog)
+	}
+	return
+}
+
+func UserLogin() {
+
+}
+
+//添加第三方用户(微信)记录
+func AddUserRecord(openId, unionId, nickName, realName, province, city, country, headimgurl, sessionKey string, platform, sex, subscribe int) (userRecord *models.UserRecord, err error) {
+	find, err := models.GetUserRecordByOpenId(openId)
+	if err != nil && err.Error() != utils.ErrNoRow() {
+		return
+	}
+	if find != nil {
+		userRecord = find
+		return
+	}
+	userRecord = &models.UserRecord{
+		OpenId:         openId,  //用户open_id
+		UnionId:        unionId, //用户union_id
+		Subscribe:      subscribe,
+		NickName:       nickName,   //用户昵称,最大长度:32
+		RealName:       realName,   //用户实际名称,最大长度:32
+		Sex:            sex,        //普通用户性别,1为男性,2为女性
+		Province:       province,   //普通用户个人资料填写的省份,最大长度:30
+		City:           city,       //普通用户个人资料填写的城市,最大长度:30
+		Country:        country,    //国家,如中国为CN,最大长度:30
+		Headimgurl:     headimgurl, //用户第三方(微信)头像,最大长度:512
+		CreateTime:     time.Now(), //创建时间,关系添加时间、用户授权时间
+		CreatePlatform: platform,   //注册平台,1:日度点评公众号,2:管理后台,3:pc端网站,4:查研观向小程序;默认:1
+		SessionKey:     sessionKey, //微信小程序会话密钥,最大长度:255
+	}
+	recordId, err := models.AddUserRecord(userRecord)
+	if err != nil {
+		return
+	}
+	userRecord.UserRecordId = int(recordId)
+	return
+}

+ 110 - 0
services/wechat.go

@@ -0,0 +1,110 @@
+package services
+
+import (
+	"encoding/json"
+	"errors"
+	"fmt"
+	"hongze/hongze_cygx/utils"
+	"rdluck_tools/http"
+	"strconv"
+	"strings"
+	"time"
+)
+
+type WxAccessToken struct {
+	AccessToken  string `json:"access_token"`
+	ExpiresIn    int    `json:"expires_in"`
+	RefreshToken string `json:"refresh_token"`
+	Openid       string `json:"openid"`
+	Unionid      string `json:"unionid"`
+	Scope        string `json:"scope"`
+	Errcode      int    `json:"errcode"`
+	Errmsg       string `json:"errmsg"`
+}
+
+func WxGetUserOpenIdByCode(code string) (item *WxAccessToken, err error) {
+	if code == "" {
+		err = errors.New("code is empty")
+		return nil, err
+	}
+	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.WxAppId, utils.WxAppSecret, code)
+	result, err := http.Get(requestUrl)
+	if err != nil {
+		return nil, err
+	}
+	utils.FileLog.Info("WxGetUserOpenIdByCode:%s", string(result))
+	err = json.Unmarshal(result, &item)
+	return
+}
+
+type WxToken struct {
+	AccessToken string `json:"access_token"`
+	ExpiresIn   int    `json:"expires_in"`
+	Errcode     int    `json:"errcode"`
+	Errmsg      string `json:"errmsg"`
+}
+
+func WxGetToken() (item *WxToken, err error) {
+	requestUrl := `https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=%s&secret=%s`
+	requestUrl = fmt.Sprintf(requestUrl, utils.WxAppId, utils.WxAppSecret)
+	fmt.Println("requestUrl:", requestUrl)
+	result, err := http.Get(requestUrl)
+	if err != nil {
+		return nil, err
+	}
+	err = json.Unmarshal(result, &item)
+	fmt.Println("WxGetToken start")
+	fmt.Println(string(result))
+	fmt.Println("WxGetToken end")
+	return
+}
+
+type WxUserInfo struct {
+	Openid         string `json:"openid"`
+	Nickname       string `json:"nickname"`
+	Sex            int    `json:"sex"`
+	Language       string `json:"language"`
+	City           string `json:"city"`
+	Province       string `json:"province"`
+	Country        string `json:"country"`
+	Headimgurl     string `json:"headimgurl"`
+	SubscribeTime  int    `json:"subscribe_time"`
+	Unionid        string `json:"unionid"`
+	Remark         string `json:"remark"`
+	Groupid        int    `json:"groupid"`
+	SubscribeScene string `json:"subscribe_scene"`
+	Errcode        int    `json:"errcode"`
+	Errmsg         string `json:"errmsg"`
+	SessionKey     string `json:"session_key"`
+}
+
+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 = fmt.Sprintf(requestUrl, accessToken, openId)
+	result, err := http.Get(requestUrl)
+	if err != nil {
+		return
+	}
+	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)
+	return
+}
+
+func GetWxSignature(ticket, url, noncestr string) (string, string, int64) {
+	timestamp := time.Now().Unix()
+	signStr := strings.Join([]string{"jsapi_ticket=", ticket,
+		"&noncestr=", noncestr,
+		"&timestamp=", strconv.FormatInt(timestamp, 10), "&url=", url}, "")
+	signature := utils.Sha1(signStr)
+	fmt.Println("signStr", signStr)
+	return signature, noncestr, timestamp
+}
+
+type WxUserDetail struct {
+	Unionid    string
+	Headimgurl string
+	Nickname   string
+}

+ 5 - 4
utils/config.go

@@ -5,10 +5,10 @@ import (
 )
 )
 
 
 var (
 var (
-	RunMode        string //运行模式
-	MYSQL_URL      string //数据库连接
-	MYSQL_URL_RDDP string //数据库连接
-	MYSQL_URL_TACTICS  string
+	RunMode           string //运行模式
+	MYSQL_URL         string //数据库连接
+	MYSQL_URL_RDDP    string //数据库连接
+	MYSQL_URL_TACTICS string
 )
 )
 
 
 //微信配置信息
 //微信配置信息
@@ -27,6 +27,7 @@ var (
 	WxPublicId        string //微信原始ID
 	WxPublicId        string //微信原始ID
 	WxPublicAppId     string
 	WxPublicAppId     string
 	WxPublicAppSecret string
 	WxPublicAppSecret string
+	WxPlatform        = 4 //注册平台,1:日度点评公众号,2:管理后台,3:pc端网站,4:查研观向小程序
 )
 )
 
 
 func init() {
 func init() {