Przeglądaj źródła

Merge branch 'master' into yb/1.1

hsun 3 lat temu
rodzic
commit
67e399b117

+ 14 - 7
controller/response/base.go

@@ -17,9 +17,10 @@ var (
 )
 
 type ResultData struct {
-	Code int         `json:"code" description:"状态码"`
-	Msg  string      `json:"msg" description:"提示信息"`
-	Data interface{} `json:"data" description:"返回数据"`
+	Code   int         `json:"code" description:"状态码"`
+	Msg    string      `json:"msg" description:"提示信息"`
+	Data   interface{} `json:"data" description:"返回数据"`
+	ErrMsg string      `json:"-" description:"错误信息,不用返回给前端,只是做日志记录"`
 }
 
 func result(code int, resultData ResultData, c *gin.Context) {
@@ -35,6 +36,11 @@ func result(code int, resultData ResultData, c *gin.Context) {
 	logSlice = append(logSlice, fmt.Sprint("Url:", c.Request.RequestURI))
 	logSlice = append(logSlice, fmt.Sprint("Token:", token))
 	logSlice = append(logSlice, fmt.Sprint("resultData:", string(jsonByte)))
+
+	//记录错误日志
+	if resultData.ErrMsg != "" {
+		logSlice = append(logSlice, fmt.Sprint("ErrMsg:", resultData.ErrMsg))
+	}
 	global.LOG.Info(strings.Join(logSlice, ";"))
 
 	//测试环境,数据不进行加密
@@ -106,11 +112,12 @@ func CustomData(code int, msg string, data interface{}, c *gin.Context) {
 }
 
 // TokenError token异常
-func TokenError(data interface{}, message string, c *gin.Context) {
+func TokenError(data interface{}, message, errMsg string, c *gin.Context) {
 	resultData := ResultData{
-		Code: TOKEN_ERROR_CODE,
-		Msg:  message,
-		Data: data,
+		Code:   TOKEN_ERROR_CODE,
+		Msg:    message,
+		Data:   data,
+		ErrMsg: errMsg,
 	}
 	result(200, resultData, c)
 }

+ 23 - 0
controller/wechat/wechat.go

@@ -138,3 +138,26 @@ func GetEncryptInfo(c *gin.Context) {
 		Mobile: newUserInfo.Mobile,
 	}, c)
 }
+
+// GetWxJsConf
+// @Title 微信获取签名接口
+// @Description 微信获取签名接口
+// @Param   Url   query   string  true       "url地址"
+// @Success 200 {object} models.WechatSign
+// @router /getWxJsConf [get]
+func GetWxJsConf(c *gin.Context) {
+	getUrl := c.DefaultQuery("Url", "")
+	jsConf, err := wechat.GetJsConfig(getUrl)
+	if err != nil {
+		response.Fail("获取失败,Err:"+err.Error(), c)
+		return
+	}
+	//resp := new(models.WechatSign)
+	//resp.AppId = utils.WxAppId
+	//resp.NonceStr = nonceString
+	//resp.Timestamp = timestamp
+	//resp.Url = getUrl
+	//resp.Signature = signature
+	//jsConf.AppID
+	response.OkData("获取成功", jsConf, c)
+}

+ 1 - 1
middleware/cors.go

@@ -12,7 +12,7 @@ func Cors() gin.HandlerFunc {
 
 		c.Header("Access-Control-Allow-Origin", "*")
 		//c.Header("Access-Control-Allow-Origin", c.Request.Referer())
-		c.Header("Access-Control-Allow-Headers", "Content-Type,AccessToken,X-CSRF-Token, Authorization, Token,X-Token,X-User-Id\"")
+		c.Header("Access-Control-Allow-Headers", "Content-Type,AccessToken,X-CSRF-Token, Authorization, Token,X-Token,X-User-Id")
 		c.Header("Access-Control-Allow-Methods", "POST, GET, OPTIONS,DELETE,PUT")
 		c.Header("Access-Control-Expose-Headers", "Content-Length, Access-Control-Allow-Origin, Access-Control-Allow-Headers, Content-Type")
 		c.Header("Access-Control-Allow-Credentials", "true")

+ 8 - 8
middleware/token.go

@@ -18,24 +18,24 @@ func Token() gin.HandlerFunc {
 			}
 		}
 		if token == "" {
-			response.TokenError(nil, "未登录或非法访问", c)
+			response.TokenError(nil, "未登录或非法访问", "未登录或非法访问", c)
 			c.Abort()
 			return
 		}
 		sessionInfo, err := session.GetTokenByToken(token)
 		if err != nil {
 			if err == utils.ErrNoRow {
-				response.TokenError(nil, "信息已变更,请重新登陆!", c)
+				response.TokenError(nil, "信息已变更,请重新登陆!", "找不到对应session", c)
 				c.Abort()
 				return
 			}
-			response.TokenError(nil, "网络异常,请稍后重试!", c)
+			response.TokenError(nil, "网络异常,请稍后重试!", err.Error(), c)
 			c.Abort()
 			return
 		}
 
 		if sessionInfo == nil {
-			response.TokenError(nil, "网络异常,请稍后重试1038!", c)
+			response.TokenError(nil, "网络异常,请稍后重试1038!", "找不到对应session", c)
 			c.Abort()
 			return
 		}
@@ -47,7 +47,7 @@ func Token() gin.HandlerFunc {
 			userInfo = tmpUserInfo
 			err = tmpErr
 		} else {
-			response.TokenError(nil, "数据异常!", c)
+			response.TokenError(nil, "数据异常!", "openid为空", c)
 			c.Abort()
 			return
 		}
@@ -55,18 +55,18 @@ func Token() gin.HandlerFunc {
 		if err != nil {
 			//用户openid查询出来发现没有绑定用户
 			if err == services.ERR_USER_NOT_BIND {
-				response.TokenError(nil, "信息已变更,请重新登陆1058!", c)
+				response.TokenError(nil, "信息已变更,请重新登陆1058!", err.Error(), c)
 				c.Abort()
 				return
 			}
 			//没有找到记录
 			if err == utils.ErrNoRow {
-				response.TokenError(nil, "信息已变更,请重新登陆2064!", c)
+				response.TokenError(nil, "信息已变更,请重新登陆2064!", err.Error(), c)
 				c.Abort()
 				return
 			}
 
-			response.TokenError(nil, "网络异常,请稍后重试3069!", c)
+			response.TokenError(nil, "网络异常,请稍后重试3069!", err.Error(), c)
 			c.Abort()
 			return
 		}

+ 7 - 7
middleware/token_no_login.go

@@ -18,24 +18,24 @@ func TokenNoLogin() gin.HandlerFunc {
 			}
 		}
 		if token == "" {
-			response.TokenError(nil, "未登录或非法访问", c)
+			response.TokenError(nil, "未登录或非法访问", "token为空", c)
 			c.Abort()
 			return
 		}
 		sessionInfo, err := session.GetTokenByToken(token)
 		if err != nil {
 			if err == utils.ErrNoRow {
-				response.TokenError(nil, "信息已变更,请重新登陆!", c)
+				response.TokenError(nil, "信息已变更,请重新登陆!", "找不到session", c)
 				c.Abort()
 				return
 			}
-			response.TokenError(nil, "网络异常,请稍后重试!", c)
+			response.TokenError(nil, "网络异常,请稍后重试!", err.Error(), c)
 			c.Abort()
 			return
 		}
 
 		if sessionInfo == nil {
-			response.TokenError(nil, "网络异常,请稍后重试!", c)
+			response.TokenError(nil, "网络异常,请稍后重试!", "session为空", c)
 			c.Abort()
 			return
 		}
@@ -47,7 +47,7 @@ func TokenNoLogin() gin.HandlerFunc {
 			userInfo = tmpUserInfo
 			err = tmpErr
 		} else {
-			response.TokenError(nil, "数据异常!", c)
+			response.TokenError(nil, "数据异常!", "openid为空", c)
 			c.Abort()
 			return
 		}
@@ -56,12 +56,12 @@ func TokenNoLogin() gin.HandlerFunc {
 		if err != nil && err != services.ERR_USER_NOT_BIND {
 			//没有找到记录
 			if err == utils.ErrNoRow {
-				response.TokenError(nil, "信息已变更,请重新登陆!", c)
+				response.TokenError(nil, "信息已变更,请重新登陆!", err.Error(), c)
 				c.Abort()
 				return
 			}
 
-			response.TokenError(nil, "网络异常,请稍后重试!", c)
+			response.TokenError(nil, "网络异常,请稍后重试!", err.Error(), c)
 			c.Abort()
 			return
 		}

+ 6 - 0
models/tables/user_record/query.go

@@ -25,3 +25,9 @@ func GetUserThirdRecordByUserId(userId int) (item *UserRecord, err error) {
 	err = global.DEFAULT_MYSQL.Where("user_id = ? ", userId).Order("user_record_id asc").First(&item).Error
 	return
 }
+
+// GetFirstByUnionID 根据用户UnionID获取最小平台的用户关系(已经绑定了user_id的)
+func GetFirstByUnionID(unionID string) (item *UserRecord, err error) {
+	err = global.DEFAULT_MYSQL.Where("union_id = ? and user_id>0", unionID).Order("create_platform asc").First(&item).Error
+	return
+}

+ 1 - 0
routers/wechat.go

@@ -20,5 +20,6 @@ func InitWechat(r *gin.Engine) {
 	rGroup2 := r.Group("wechat").Use(middleware.TokenNoLogin())
 	{
 		rGroup2.POST("/getEncryptInfo", wechat.GetEncryptInfo)
+		rGroup2.GET("/getWxJsConf", wechat.GetWxJsConf)
 	}
 }

+ 58 - 2
services/user/user.go

@@ -170,6 +170,62 @@ func GetWxUserItemByUnionId(unionId string, platform int) (userInfo UserInfo, er
 	return
 }
 
+// GetFirstWxUserItemByUnionId 根据用户unionid获取最小平台的用户信息(已经绑定了user_id的)
+func GetFirstWxUserItemByUnionId(unionId string) (userInfo UserInfo, err error) {
+	// 获取用户信息
+	userRecord, userRecordErr := user_record.GetFirstByUnionID(unionId)
+	if userRecordErr != nil {
+		if userRecordErr == utils.ErrNoRow {
+			err = ERR_NO_USER_RECORD
+			return
+		} else {
+			err = userRecordErr
+			return
+		}
+	}
+
+	// 该union在系统中没有关联关系
+	if userRecord == nil {
+		err = ERR_NO_USER_RECORD
+		return
+	}
+
+	// 该openid没有绑定用户
+	if userRecord.UserID <= 0 {
+		err = ERR_USER_NOT_BIND
+		item := new(wx_user.WxUser)
+		//格式化返回用户数据
+		userInfo = formatWxUserAndUserRecord(item, userRecord)
+		return
+	}
+
+	item, wxUserErr := wx_user.GetByUserId(userRecord.UserID)
+	if wxUserErr != nil {
+		err = wxUserErr
+
+		// 如果是找不到数据,那么可能是该用户被删除了,但是user_record没有删除对应的关系
+		if wxUserErr == utils.ErrNoRow {
+			// 用户被删除了,但是user_record没有删除对应的关系,那么去解除绑定
+			userUnbindErr := user_record.UnBindUserRecordByUnionId(unionId, int(userRecord.CreatePlatform))
+			if userUnbindErr != nil {
+				err = userUnbindErr
+				return
+			}
+			// 返回状态为用户未绑定
+			err = ERR_USER_NOT_BIND
+			item := new(wx_user.WxUser)
+			// 格式化返回用户数据
+			userInfo = formatWxUserAndUserRecord(item, userRecord)
+			return
+		}
+		return
+	}
+	// 格式化返回用户数据
+	userInfo = formatWxUserAndUserRecord(item, userRecord)
+
+	return
+}
+
 // formatWxUserAndUserRecord 通过用户 关系表记录  和  用户记录  格式化返回 用户数据
 func formatWxUserAndUserRecord(wxUser *wx_user.WxUser, userRecord *user_record.UserRecord) (userInfo UserInfo) {
 	wxUser.OpenID = userRecord.OpenID
@@ -228,8 +284,8 @@ QUERY_WX_USER:
 		//插入成功后,需要重新查询该用户,并进入下面的逻辑
 		goto QUERY_WX_USER
 	} else if wxUserErr == ERR_USER_NOT_BIND {
-		// 未绑定则去查询是否为弘则研究公众号用户,有相应的手机号邮箱信息则自动绑定
-		platformUser, platformErr := GetWxUserItemByUnionId(unionId, 1)
+		// 未绑定则去查询unionId是否已经绑定了用户(其他平台,不区分平台),有相应的手机号邮箱信息则自动绑定
+		platformUser, platformErr := GetFirstWxUserItemByUnionId(unionId)
 		if platformErr == nil {
 			// 当公众号用户存在时
 			if platformUser.Mobile != "" || platformUser.Email != "" {

+ 24 - 13
services/wechat/wechat.go

@@ -7,6 +7,7 @@ import (
 	"github.com/silenceper/wechat/v2/credential"
 	"github.com/silenceper/wechat/v2/officialaccount"
 	"github.com/silenceper/wechat/v2/officialaccount/config"
+	"github.com/silenceper/wechat/v2/officialaccount/js"
 	"github.com/silenceper/wechat/v2/officialaccount/user"
 	"hongze/hongze_yb/global"
 	"hongze/hongze_yb/models/tables/wx_token"
@@ -34,7 +35,7 @@ var (
 	WxPublicSecretXzs                     string //查研观向小助手公众号
 )
 
-func init() {
+func initConf() {
 	if global.CONFIG.Serve.RunMode == "debug" {
 		WxAppId = "wx9b5d7291e581233a"
 		WxAppSecret = "f4d52e34021eee262dce9682b31f8861"
@@ -50,22 +51,24 @@ func init() {
 
 		WxMsgTemplateIdAskByUser = `qfNuops-sKrfIkbA7U97A7gSrX03mUpoEpJksRUdloo`
 	} else {
-		//WxAppId = "wx4a844c734d8c8e56"
-		//WxAppSecret = "26c586e7ccb3c575433f0f37797b3eeb"
-		//WxId = "gh_b67e0049fb8c"
-		//TemplateIdByProduct = "Cp2wF8gvBtxyWV4DeYuI172oqwyYXVRSm3AyJO42d84"
-		//TemplateRedirectUrl = "https://ficc.hzinsights.com/reportdtl?id="
-		//DayReportTemplateRedirectUrl = "https://report.hzinsights.com/#/allindex/" //晨报模板跳转url
-		//TemplateIdByCompanyApply = "ZKcOfNIWBpwHJxpptufHIK1mp2nIwkT3cxub-35cFqI"
-		//TemplateCompanyApplyRedirectUrl = "https://ficc.hzinsights.com/approval/approval/list"
-		//WxMsgTemplateIdActivityChangeApply = "dYg6iHooRq74PyCXmw_Ns7qdJZmbtLoKS2p2FKeaXl0"
-		////销售跨部门领取客户通知
-		//TemplateIdByCompanyReceive = "A5fV-XWBcu-LIj_W-tBiOJ-D39a9WDd9GOB0WGbpoBg"
-		//TemplateCompanyApplyRedirectUrl = "https://ficc.hzinsights.com/approval/approval/list"
+		WxAppId = "wx4a844c734d8c8e56"
+		WxAppSecret = "26c586e7ccb3c575433f0f37797b3eeb"
+		WxId = "gh_b67e0049fb8c"
+		TemplateIdByProduct = "Cp2wF8gvBtxyWV4DeYuI172oqwyYXVRSm3AyJO42d84"
+		TemplateRedirectUrl = "https://ficc.hzinsights.com/reportdtl?id="
+		DayReportTemplateRedirectUrl = "https://report.hzinsights.com/#/allindex/" //晨报模板跳转url
+		TemplateIdByCompanyApply = "ZKcOfNIWBpwHJxpptufHIK1mp2nIwkT3cxub-35cFqI"
+		TemplateCompanyApplyRedirectUrl = "https://ficc.hzinsights.com/approval/approval/list"
+		WxMsgTemplateIdActivityChangeApply = "dYg6iHooRq74PyCXmw_Ns7qdJZmbtLoKS2p2FKeaXl0"
+		//销售跨部门领取客户通知
+		TemplateIdByCompanyReceive = "A5fV-XWBcu-LIj_W-tBiOJ-D39a9WDd9GOB0WGbpoBg"
+		TemplateCompanyApplyRedirectUrl = "https://ficc.hzinsights.com/approval/approval/list"
 	}
 }
 
 func GetWxChat() (officialAccount *officialaccount.OfficialAccount) {
+	initConf() //初始化参数
+
 	wc := wechat.NewWechat()
 	memory := cache.NewMemory()
 	conf := &config.Config{
@@ -90,6 +93,14 @@ func GetUserInfo(openid string) (userInfo *user.Info, err error) {
 	return
 }
 
+// GetJsConfig 获取公众号jsConfig
+func GetJsConfig(signUrl string) (jsConf *js.Config, err error) {
+	wechatClient := GetWxChat()
+	j := wechatClient.GetJs()
+	jsConf, err = j.GetConfig(signUrl)
+	return
+}
+
 type WechatAccessToken struct {
 }