Răsfoiți Sursa

微信扫码登录切换到开放平台

xingzai 2 ani în urmă
părinte
comite
13adb007ab
7 a modificat fișierele cu 220 adăugiri și 23 ștergeri
  1. 20 20
      controllers/wechat.go
  2. 8 0
      models/user_record.go
  3. 1 1
      routers/commentsRouter.go
  4. 128 0
      services/user.go
  5. 54 0
      services/wechat.go
  6. 8 2
      utils/config.go
  7. 1 0
      utils/constants.go

+ 20 - 20
controllers/wechat.go

@@ -23,7 +23,7 @@ type WechatCommonController struct {
 // @Param   Code   query   string  true       "微信唯一编码code"
 // @Success 200 {object}  models.UserDetailByUserLogin
 // @router /login [get]
-func (this *WechatCommonController) WechatLoginByxzs() {
+func (this *WechatCommonController) WechatLogin() {
 	br := new(models.BaseResponse).Init()
 	defer func() {
 		this.Data["json"] = br
@@ -36,26 +36,26 @@ func (this *WechatCommonController) WechatLoginByxzs() {
 		return
 	}
 	var token string
-	//item, err := services.WxGetUserOpenIdByCodeXzs(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"
+	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.GetWxAccessTokenByXzs()
+	accessToken, err := services.GetWxAccessOpenToken()
 	if err != nil {
 		br.Msg = "获取用户信息失败"
 		br.ErrMsg = "获取access_token失败,err:" + err.Error()

+ 8 - 0
models/user_record.go

@@ -101,3 +101,11 @@ func ModifyUserRecordByDetail(openId, unionId, nickName, headimgUrl, city, provi
 	_, err = o.Raw(sql, unionId, nickName, headimgUrl, sex, city, province, country, userId, openId).Exec()
 	return
 }
+
+//修改用户微信信息
+func ModifyUserRecordSessionKey(openId, sessionKey string) (err error) {
+	o := orm.NewOrm()
+	sql := `UPDATE user_record SET session_key=? WHERE open_id=? `
+	_, err = o.Raw(sql, sessionKey, openId).Exec()
+	return
+}

+ 1 - 1
routers/commentsRouter.go

@@ -135,7 +135,7 @@ func init() {
 
     beego.GlobalControllerRouter["hongze/hongze_clpt/controllers:WechatCommonController"] = append(beego.GlobalControllerRouter["hongze/hongze_clpt/controllers:WechatCommonController"],
         beego.ControllerComments{
-            Method: "WechatLoginByxzs",
+            Method: "WechatLogin",
             Router: `/login`,
             AllowHTTPMethods: []string{"get"},
             MethodParams: param.Make(),

+ 128 - 0
services/user.go

@@ -2,8 +2,10 @@ package services
 
 import (
 	"errors"
+	"fmt"
 	"hongze/hongze_clpt/models"
 	"hongze/hongze_clpt/utils"
+	"strconv"
 	"strings"
 	"time"
 )
@@ -283,3 +285,129 @@ func BindWxUserMobileAndOpenid(mobile, openid, countryCode string) (wxUser *mode
 	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
+	//fmt.Println()
+	fmt.Println("GetWxUserItemByOpenId ", openId)
+
+QUERY_WX_USER:
+	wxUser, wxUserErr := GetWxUserItemByOpenId(openId)
+	fmt.Println("wxUserErr", wxUserErr)
+	if wxUserErr == ERR_NO_USER_RECORD { //没有用户openid记录
+		//先添加第三方信息(openid等信息)
+		_, recordErr := AddUserRecord(openId, unionId, wxUserInfo.Nickname, "", wxUserInfo.Province, wxUserInfo.City, wxUserInfo.Country, wxUserInfo.Headimgurl, wxUserInfo.SessionKey, utils.CE_LUE_ID, wxUserInfo.Sex, 0)
+		//如果插入失败,那么直接将错误信息返回
+		if recordErr != nil {
+			err = recordErr
+			return
+		}
+		//插入成功后,需要重新查询该用户,并进入下面的逻辑
+		goto QUERY_WX_USER
+	} else if wxUserErr == ERR_USER_NOT_BIND {
+		//没有用户信息
+		//wxUser.FirstLogin = 1
+	} else if wxUserErr != nil {
+		err = wxUserErr
+		return
+	}
+	fmt.Println("wxUserInfo", wxUserInfo)
+	fmt.Println("wxUserInfo.Nickname", wxUserInfo.Nickname)
+	fmt.Println("SessionKey", wxUserInfo.SessionKey)
+	if wxUserInfo != nil {
+		fmt.Println("ModifyUserRecordSessionKey")
+		err = models.ModifyUserRecordSessionKey(openId, wxUserInfo.SessionKey)
+		fmt.Println("ModifyUserRecordSessionKey Err", err)
+	}
+	//如果已经登录注册绑定的情况下
+	if wxUser != nil && wxUserErr == nil {
+		//获取用户权限
+		firstLogin = wxUser.FirstLogin
+		userId = wxUser.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()
+			go 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
+	}
+	fmt.Println("line 271 ", openId)
+	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
+	}
+	fmt.Println("line 294 ", token)
+
+	return
+}
+
+//添加第三方用户(微信)记录
+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
+}

+ 54 - 0
services/wechat.go

@@ -218,3 +218,57 @@ func GetWxAccessToken() (accessTokenStr string, err error) {
 		}
 	}
 }
+
+//开放平台
+func WxGetUserOpenIdByOpenCode(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.WxOpenAppId, utils.WxOpenAppSecret, code)
+	result, err := http.Get(requestUrl)
+	if err != nil {
+		return nil, err
+	}
+	err = json.Unmarshal(result, &item)
+	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)
+	result, err := http.Get(requestUrl)
+	if err != nil {
+		utils.FileLog.Info("获取wxToken失败,Err:%s", err.Error())
+		return nil, err
+	}
+	err = json.Unmarshal(result, &item)
+	if err != nil {
+		fmt.Println(fmt.Sprintf("GetWxToken Unmarshal Err:%s", err.Error()))
+		return
+	}
+	if item.Errmsg != "" {
+		err = fmt.Errorf(item.Errmsg)
+		utils.FileLog.Info(fmt.Sprintf("GetWxToken fail result:%s", string(result)))
+	}
+	return
+}
+
+func GetWxAccessOpenToken() (accessTokenStr string, err error) {
+	//缓存校验
+	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)
+	}
+	return
+}

+ 8 - 2
utils/config.go

@@ -23,8 +23,11 @@ var (
 	WxAppId     string //查研观向小程序
 	WxAppSecret string //查研观向小程序
 
-	WxPublicAppId                 string //查研观向小助手公众号
-	WxPublicAppSecret             string //查研观向小助手公众号
+	WxPublicAppId     string //查研观向小助手公众号
+	WxPublicAppSecret string //查研观向小助手公众号
+
+	WxOpenAppId                   string //公众平台AppId
+	WxOpenAppSecret               string //公众平台AppSecret
 	HeadimgurlDefault             string //默认头像
 	WxMsgTemplateIdApplyXzs       string //申请待处理(小助手)
 	WxMsgTemplateIdApplyCancelXzs string //预约取消提醒(小助手)
@@ -91,6 +94,9 @@ func init() {
 		WxMsgTemplateIdAskMsgMobile = "15557270714,17634786714,18767183922,17516315016"
 		WxMsgTemplateIdAskMsgXzs = "qfNuops-sKrfIkbA7U97A7gSrX03mUpoEpJksRUdloo" //手机号用户【XXX】发送模板消息模板ID(小助手)
 
+		WxOpenAppId = "wx294d2825f451f851"                   //公众平台AppId
+		WxOpenAppSecret = "7bf62d2d037280f8b635c6eca2f31db9" //公众平台AppSecret
+
 		IndexName = "cygx_article_v1"
 	}
 	HeadimgurlDefault = "https://hongze.oss-cn-shanghai.aliyuncs.com/static/images/202202/20220225/XFBBOUmDC5AXkfxnHiuqKpPtoofH.png"

+ 1 - 0
utils/constants.go

@@ -75,6 +75,7 @@ const (
 	SummaryArticleId                 int    = 1000000
 	StrategyPlatform                 string = "https://vmp.hzinsights.com/v2/articles/"
 	DefaultHeadimgurl                string = "https://hzstatic.hzinsights.com/static/temp/20220426202204/20220426/P5qLR2zzfBdKItp3eX2Du1tvq9Ba.jpg"
+	OPEN_TOKEN_KEY                   string = "CLPT_OPEN_TOKEN_KEY" //策略品台开放平台的token key
 )
 
 //模板消息推送类型