浏览代码

新增客户模块

rdluck 4 年之前
父节点
当前提交
1e90d3e1aa
共有 8 个文件被更改,包括 397 次插入10 次删除
  1. 155 0
      controllers/wechat.go
  2. 2 0
      models/db.go
  3. 14 7
      models/session.go
  4. 30 0
      models/wx_token.go
  5. 46 3
      models/wx_user.go
  6. 8 0
      routers/router.go
  7. 2 0
      services/user_permission.go
  8. 140 0
      services/wechat.go

+ 155 - 0
controllers/wechat.go

@@ -0,0 +1,155 @@
+package controllers
+
+import (
+	"fmt"
+	"hongze/hongze_api/models"
+	"hongze/hongze_api/services"
+	"hongze/hongze_api/utils"
+	"strconv"
+	"time"
+)
+
+type WechatController struct {
+	BaseAuthController
+}
+
+type WechatCommonController struct {
+	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")
+	fmt.Println("code:", code)
+	item, err := services.WxGetUserOpenIdByCode(code)
+	if err != nil {
+		br.Msg = "获取用户信息失败"
+		br.ErrMsg = "获取用户信息失败,Err:" + err.Error()
+		return
+	}
+	if item.Errcode != "" {
+		br.Msg = "获取用户信息失败"
+		br.ErrMsg = "获取access_token 失败 errcode:" + item.Errcode + " ;errmsg:" + item.Errmsg
+		return
+	}
+	openId := item.Openid
+	firstLogin := 1
+	userId := 0
+	//获取成功
+	if openId != "" {
+		wxUser, err := models.GetWxUserItemByOpenId(openId)
+		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()) {
+			accessToken, err := services.WxGetAccessToken()
+			if err != nil {
+				br.Msg = "获取用户信息失败"
+				br.ErrMsg = "获取access_token失败,err:" + err.Error()
+				return
+			}
+			//获取用户信息
+			wxUserInfo, err := services.WxGetUserInfo(openId, accessToken)
+			if err != nil {
+				br.Msg = "获取用户信息失败"
+				br.ErrMsg = "获取微信用户信息失败,Err:" + err.Error()
+				return
+			}
+			if wxUserInfo.Errcode != "" {
+				br.Msg = "获取用户信息失败"
+				br.ErrMsg = "获取用户信息失败 errcode:" + item.Errcode + " ;errmsg:" + item.Errmsg
+				return
+			}
+			user := new(models.WxUser)
+			user.OpenId = openId
+			user.CompanyId = 1
+			user.CreatedTime = time.Now()
+			user.UnionId = wxUserInfo.Unionid
+			user.Subscribe = wxUserInfo.SubscribeScene
+			user.SubscribeTime = wxUserInfo.SubscribeTime
+			user.NickName = wxUserInfo.Nickname
+			user.Sex = wxUserInfo.Sex
+			user.City = wxUserInfo.City
+			user.Province = wxUserInfo.Province
+			user.Country = wxUserInfo.Country
+			user.Headimgurl = wxUserInfo.Headimgurl
+			user.Remark = wxUserInfo.Remark
+			user.FirstLogin = 1
+			err = models.AddWxUser(user)
+			if wxUserInfo.Unionid != "" {
+				wxUser, err = models.GetWxUserItemByUnionid(wxUserInfo.Unionid)
+				if err != nil {
+					br.Msg = "获取用户信息失败"
+					br.ErrMsg = "获取微信用户信息失败,Err:" + err.Error()
+					return
+				}
+			} else {
+				wxUser, err = models.GetWxUserItemByOpenId(openId)
+				if err != nil {
+					br.Msg = "获取用户信息失败"
+					br.ErrMsg = "获取微信用户信息失败,Err:" + err.Error()
+					return
+				}
+			}
+			userId = wxUser.UserId
+		} else {
+			firstLogin = wxUser.FirstLogin
+			userId = wxUser.UserId
+		}
+	} else {
+		br.Msg = "获取用户信息失败"
+		br.ErrMsg = "获取openid失败,openid:" + item.Openid
+		return
+	}
+	timeUnix := time.Now().Unix()
+	timeUnixStr := strconv.FormatInt(timeUnix, 10)
+	token := utils.MD5(strconv.Itoa(userId)) + utils.MD5(timeUnixStr)
+	//新增session
+	{
+		session := new(models.Session)
+		session.OpenId = openId
+		session.UserId = userId
+		session.CreatedTime = time.Now()
+		session.LastUpdatedTime = time.Now()
+		session.ExpireTime = time.Now().AddDate(1, 0, 0)
+		session.AccessToken = token
+		err = models.AddSession(session)
+		if err != nil {
+			br.Msg = "登录失败"
+			br.ErrMsg = "登录失败,新增用户session信息失败:" + err.Error()
+			return
+		}
+	}
+	permission, err := services.CheckUserPermission(userId)
+	if err != nil {
+		utils.FileLog.Info("%s", err.Error())
+	}
+	resp := new(models.WxLoginResp)
+	resp.UserId = userId
+	resp.OpenId = openId
+	resp.Code = 0
+	resp.FirstLogin = firstLogin
+	resp.Authorization = token
+	resp.UserPermission = permission
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取数据成功"
+	br.Data = resp
+}
+
+
+/*
+$app->bag('api/wechat/getWxSign',"WechatController@getWxSign");
+$app->bag('api/wechat/check', "WechatController@check");
+*/

+ 2 - 0
models/db.go

@@ -37,5 +37,7 @@ func init() {
 		new(ReportAudioRecord),
 		new(ReportViewLog),
 		new(ReportViewRecord),
+		new(WxUser),
+		new(Session),
 	)
 }

+ 14 - 7
models/session.go

@@ -6,18 +6,25 @@ import (
 )
 
 type Session struct {
-	SessionId   int
-	UserId      int
-	OpenId      string
-	AccessToken string
-	ExpireTime  string
-	CreatedTime time.Time
+	SessionId       int `orm:"column(session_id);pk"`
+	UserId          int
+	OpenId          string
+	AccessToken     string
+	ExpireTime      time.Time
+	CreatedTime     time.Time
+	LastUpdatedTime time.Time
 }
 
 func GetSessionByToken(token string) (item *Session, err error) {
 	sql := `SELECT * FROM session WHERE access_token=? AND expired_time> NOW() ORDER BY expired_time DESC LIMIT 1 `
 	o := orm.NewOrm()
-	o.Using("rddp")
 	err = o.Raw(sql, token).QueryRow(&item)
 	return
+}
+
+//添加用户信息
+func AddSession(item *Session) (err error) {
+	o := orm.NewOrm()
+	_, err = o.Insert(item)
+	return
 }

+ 30 - 0
models/wx_token.go

@@ -0,0 +1,30 @@
+package models
+
+import "rdluck_tools/orm"
+
+type WxToken struct {
+	AccessToken string
+	ExpiresIn   int64
+	Id          int
+}
+
+func GetWxToken() (item *WxToken, err error) {
+	sql := `SELECT *  FROM wx_token `
+	o := orm.NewOrm()
+	err = o.Raw(sql).QueryRow(&item)
+	return
+}
+
+func AddWxToken(token string, expiresIn int64) (err error) {
+	sql := `INSERT INTO wx_token(access_token, expires_in)VALUES(?,?) `
+	o := orm.NewOrm()
+	_, err = o.Raw(sql, token, expiresIn).Exec()
+	return
+}
+
+func UpdateWxToken(token string, expiresIn int64,id int) (err error) {
+	sql := `UPDATE wx_token SET access_token=?, expires_in=? WHERE id=? `
+	o := orm.NewOrm()
+	_, err = o.Raw(sql, token, expiresIn,id).Exec()
+	return
+}

+ 46 - 3
models/wx_user.go

@@ -6,7 +6,7 @@ import (
 )
 
 type WxUser struct {
-	UserId          int       `description:"用户id"`
+	UserId          int       `orm:"column(user_id);pk"`
 	OpenId          string    `description:"open_id"`
 	UnionId         string    `description:"union_id"`
 	Subscribe       string    `description:"是否关注"`
@@ -24,7 +24,7 @@ type WxUser struct {
 	Province        string    `description:"普通用户个人资料填写的省份"`
 	City            string    `description:"普通用户个人资料填写的城市"`
 	Country         string    `description:"国家,如中国为CN"`
-	SubscribeTime   time.Time `description:"关注时间"`
+	SubscribeTime   int       `description:"关注时间"`
 	Remark          string    `description:"备注"`
 	Headimgurl      string    `description:"用户头像,最后一个数值代表正方形头像大小(有0、46、64、96、132数值可选,0代表640*640正方形头像),用户没有头像时该项为空"`
 	Privilege       string    `description:"用户特权信息,json数组,如微信沃卡用户为(chinaunicom)"`
@@ -52,6 +52,7 @@ type WxUserItem struct {
 	Email       string `description:"邮箱"`
 	Headimgurl  string `description:"用户头像,最后一个数值代表正方形头像大小(有0、46、64、96、132数值可选,0代表640*640正方形头像),用户没有头像时该项为空"`
 	ApplyMethod int    `description:"0:未申请,1:已付费客户申请试用,2:非客户申请试用"`
+	FirstLogin  int    `description:"是否第一次登陆"`
 }
 
 func GetWxUserItemByUserId(userId int) (item *WxUserItem, err error) {
@@ -60,6 +61,18 @@ func GetWxUserItemByUserId(userId int) (item *WxUserItem, err error) {
 	return
 }
 
+func GetWxUserItemByOpenId(openId string) (item *WxUserItem, err error) {
+	sql := `SELECT * FROM wx_user WHERE open_id=? `
+	err = orm.NewOrm().Raw(sql, openId).QueryRow(&item)
+	return
+}
+
+func GetWxUserItemByUnionid(unionid string) (item *WxUserItem, err error) {
+	sql := `SELECT * FROM wx_user WHERE unionid=? `
+	err = orm.NewOrm().Raw(sql, unionid).QueryRow(&item)
+	return
+}
+
 type PermissionSearchKeyWord struct {
 	KeyWord string
 }
@@ -79,4 +92,34 @@ func GetUserIsMaxPermission(companyId int) (count int, err error) {
 	o := orm.NewOrm()
 	err = o.Raw(sql, companyId).QueryRow(&count)
 	return
-}
+}
+
+//添加用户信息
+func AddWxUser(item *WxUser) (err error) {
+	o := orm.NewOrm()
+	_, err = o.Insert(item)
+	return
+}
+
+/*
+ return response()->json(['code'=>'0',
+                                     'data'=>array(
+                                        'open_id'=>$open_id,
+                                        'rddp_access_token'=>$session_data->access_token,
+                                        'user_id'=>$userId,
+                                        'expires'=>$session_data->expire_time,
+                                        'first_login'=>$firstLogin,
+                                        'user_permission'=>$userPermission,
+                                      )
+                                    ]);
+*/
+
+type WxLoginResp struct {
+	Code          int
+	OpenId        string
+	Authorization string
+	UserId        int
+	Expires       time.Time
+	FirstLogin    int
+	UserPermission int
+}

+ 8 - 0
routers/router.go

@@ -38,6 +38,14 @@ func init() {
 				&controllers.ClassifyController{},
 			),
 		),
+		beego.NSNamespace("/wechat",
+			beego.NSInclude(
+				&controllers.WechatController{},
+			),
+			beego.NSInclude(
+				&controllers.WechatCommonController{},
+			),
+		),
 	)
 	beego.AddNamespace(ns)
 }

+ 2 - 0
services/user_permission.go

@@ -41,9 +41,11 @@ func CheckUserPermission(userId int) (status int, err error) {
 			status = 0
 		} else {
 			status = 40002
+			err = errors.New("非付费用户" + strconv.Itoa(userId))
 		}
 	} else {
 		status = 40001
+		err = errors.New("用户id错误")
 	}
 	return
 }

+ 140 - 0
services/wechat.go

@@ -0,0 +1,140 @@
+package services
+
+import (
+	"encoding/json"
+	"errors"
+	"fmt"
+	"hongze/hongze_api/models"
+	"hongze/hongze_api/utils"
+	"rdluck_tools/http"
+	"time"
+)
+
+type WxAccessToken struct {
+	AccessToken  string `json:"access_token"`
+	ExpiresIn    int    `json:"expires_in"`
+	RefreshToken string `json:"refresh_token"`
+	Openid       string `json:"openid"`
+	Scope        string `json:"scope"`
+	Errcode      string `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)
+	fmt.Println("requestUrl:", requestUrl)
+	result, err := http.Get(requestUrl)
+	if err != nil {
+		return nil, err
+	}
+	err = json.Unmarshal(result, &item)
+	return
+}
+
+type WxToken struct {
+	AccessToken string `json:"access_token"`
+	ExpiresIn   int    `json:"expires_in"`
+	Errcode     string `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)
+	return
+}
+
+func WxGetAccessToken() (accessToken string, err error) {
+	wxToken, err := models.GetWxToken()
+	if err != nil && err.Error() != utils.ErrNoRow() {
+		return
+	}
+	//wx_token 不存在
+	if wxToken == nil || (err != nil && err.Error() == utils.ErrNoRow()) {
+		token, err := WxGetToken()
+		if err != nil {
+			return accessToken, err
+		}
+		if token.Errcode != "" {
+			err = errors.New("获取access_token 失败 errcode:" + token.Errcode + " ;errmsg:" + token.Errmsg)
+			return "", err
+		}
+		expiresIn := time.Now().Add(time.Duration(token.ExpiresIn) * time.Second).Unix()
+		err = models.AddWxToken(token.AccessToken, expiresIn)
+		if err != nil {
+			err = errors.New("新增wx_token失败" + err.Error())
+			return accessToken, err
+		}
+		accessToken = token.AccessToken
+	} else {
+		if wxToken.ExpiresIn <= time.Now().Unix() {
+			token, err := WxGetToken()
+			if err != nil {
+				return accessToken, err
+			}
+			if token.Errcode != "" {
+				err = errors.New("获取access_token 失败 errcode:" + token.Errcode + " ;errmsg:" + token.Errmsg)
+				return "", err
+			}
+			expiresIn := time.Now().Add(time.Duration(wxToken.ExpiresIn) * time.Second).Unix()
+			err = models.UpdateWxToken(token.AccessToken, expiresIn, wxToken.Id)
+			if err != nil {
+				err = errors.New("修改wx_token失败" + err.Error())
+				return accessToken, err
+			}
+			accessToken = token.AccessToken
+		} else {
+			accessToken = wxToken.AccessToken
+		}
+	}
+	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     string `json:"errcode"`
+	Errmsg      string `json:"errmsg"`
+}
+
+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, utils.WxAppId, utils.WxAppSecret)
+	result, err := http.Get(requestUrl)
+	if err != nil {
+		return
+	}
+	err = json.Unmarshal(result, &item)
+	return
+}
+
+/*
+   public static function wxGetUserInfo($openid,$accessToken){
+       $url = "https://api.weixin.qq.com/cgi-bin/user/info?access_token={$accessToken}&openid={$openid}";
+       $html = @file_get_contents($url);
+       $result = json_decode($html, true);
+       return $result;
+   }
+*/