Roc 3 anni fa
parent
commit
da307dd299

+ 1 - 1
controller/file.go

@@ -3,10 +3,10 @@ package controller
 import (
 	"fmt"
 	"github.com/gin-gonic/gin"
+	"hongze/hongze_yb/controller/response"
 	"io/ioutil"
 	"log"
 	"os/exec"
-	"hongze/hongze_yb/controller/response"
 	"strings"
 	"time"
 )

+ 2 - 0
controller/test.go

@@ -1,6 +1,7 @@
 package controller
 
 import (
+	"fmt"
 	"github.com/gin-gonic/gin"
 	"gorm.io/gorm"
 	"hongze/hongze_yb/controller/response"
@@ -20,6 +21,7 @@ func Test2(c *gin.Context) {
 	where := make(map[string]interface{})
 	where["mobile like"] = "11817023927%"
 	wxUserInfo, err := wx_user.GetByWhereMap(where)
+	fmt.Println(wxUserInfo)
 	if err != nil {
 		if err == gorm.ErrRecordNotFound {
 			response.Fail("获取失败,找不到该用户", c)

+ 32 - 2
controller/wechat/wechat.go

@@ -4,6 +4,7 @@ import (
 	"github.com/gin-gonic/gin"
 	"hongze/hongze_yb/controller/response"
 	"hongze/hongze_yb/services/wechat"
+	"hongze/hongze_yb/services/wx_app"
 )
 
 func GetQrCode(c *gin.Context) {
@@ -12,6 +13,35 @@ func GetQrCode(c *gin.Context) {
 }
 
 func GetUserInfo(c *gin.Context) {
-	wechat.GetUser()
-	response.OkData("获取成功", "qrCode", c)
+	openid := `oN0jD1S3P-FVosLhq-YiVOXldtRo`
+	userInfo, err := wechat.GetUserInfo(openid)
+	if err != nil {
+		response.Fail("获取失败,Err:"+err.Error(), c)
+		return
+	}
+	response.OkData("获取成功", userInfo, c)
+}
+
+func GetUserSession(c *gin.Context) {
+	code, _ := c.GetQuery("code")
+	//c.Sho
+	//fmt.Println(c.Request.)
+	userInfo, err := wx_app.GetSession(code)
+	if err != nil {
+		response.Fail("获取失败,Err:"+err.Error(), c)
+		return
+	}
+	response.OkData("获取成功", userInfo, c)
+}
+
+func Login(c *gin.Context) {
+	code, _ := c.GetQuery("code")
+	//c.Sho
+	//fmt.Println(c.Request.)
+	wxUserInfo, err := wx_app.GetSession(code)
+	if err != nil {
+		response.Fail("获取失败,Err:"+err.Error(), c)
+		return
+	}
+	response.OkData("获取成功", wxUserInfo, c)
 }

+ 10 - 11
core/log.go

@@ -17,14 +17,14 @@ import (
 const (
 	logDir      = "log"
 	logSoftLink = "latest_log"
-	module = "hongze_yb"
+	module      = "hongze_yb"
 )
 
 var (
 	defaultFormatter = ` %{time:2006/01/02 - 15:04:05.000} %{longfile} %{color:bold}▶ [%{level:.6s}] %{message}%{color:reset}`
 )
 
-func init(){
+func init() {
 	logConfig := global.CONFIG.Log
 	logger := oplogging.MustGetLogger(module)
 	var backends []oplogging.Backend
@@ -32,15 +32,14 @@ func init(){
 	registerStdout(logConfig, &backends)
 
 	//注册框架输出(日志文件)
-	fileWriter:=registerFile(logConfig,&backends)
-	if fileWriter != nil{
-		gin.DefaultWriter = io.MultiWriter(fileWriter,os.Stdout)
+	fileWriter := registerFile(logConfig, &backends)
+	if fileWriter != nil {
+		gin.DefaultWriter = io.MultiWriter(fileWriter, os.Stdout)
 	}
 	oplogging.SetBackend(backends...)
 	global.LOG = logger
 }
 
-
 func registerStdout(c config.Log, backends *[]oplogging.Backend) {
 	if c.Stdout != "" {
 		level, err := oplogging.LogLevel(c.Stdout)
@@ -61,9 +60,9 @@ func registerFile(c config.Log, backends *[]oplogging.Backend) io.Writer {
 		}
 
 		//日志保留时间
-		saveMaxTime := time.Duration(global.CONFIG.Log.SaveMaxDay) * 24*time.Hour
+		saveMaxTime := time.Duration(global.CONFIG.Log.SaveMaxDay) * 24 * time.Hour
 		//日志切割时间(每隔多久切割一次)
-		cuttingTime := time.Duration(global.CONFIG.Log.CuttingDay) * 24*time.Hour
+		cuttingTime := time.Duration(global.CONFIG.Log.CuttingDay) * 24 * time.Hour
 
 		//使用rotatelogs
 		fileWriter, err := rotatelogs.New(
@@ -71,10 +70,10 @@ func registerFile(c config.Log, backends *[]oplogging.Backend) io.Writer {
 			// 生成软链,指向最新日志文件
 			rotatelogs.WithLinkName(logSoftLink),
 			// 以下两个配置不能同时设置,一个是保留天数,一个是保留分拣份数
-			rotatelogs.WithMaxAge(saveMaxTime),	//日志保留多久,最小分钟为单位
+			rotatelogs.WithMaxAge(saveMaxTime), //日志保留多久,最小分钟为单位
 			//rotatelogs.WithRotationCount(5),        //number 默认7份 大于7份 或到了清理时间 开始清理
 			// time period of log file switching
-			rotatelogs.WithRotationTime(cuttingTime),	//rotate 最小为1分钟轮询。默认60s  低于1分钟就按1分钟来
+			rotatelogs.WithRotationTime(cuttingTime), //rotate 最小为1分钟轮询。默认60s  低于1分钟就按1分钟来
 		)
 		if err != nil {
 			fmt.Println(err)
@@ -116,4 +115,4 @@ func getLogFormatter(c config.Log, stdoutWriter bool) oplogging.Formatter {
 		pattern = strings.Replace(pattern, "%{longfile}", "", -1)
 	}
 	return oplogging.MustStringFormatter(pattern)
-}
+}

+ 1 - 0
init_serve/router.go

@@ -12,6 +12,7 @@ func InitRouter() (r *gin.Engine) {
 	gin.SetMode(global.CONFIG.Serve.RunMode)
 	// 1.创建路由
 	r = gin.Default()
+
 	// 2.绑定路由规则,执行的函数
 	// gin.Context,封装了request和response
 	r.GET("/ping", func(c *gin.Context) {

+ 1 - 2
main.go

@@ -2,7 +2,6 @@ package main
 
 import "hongze/hongze_yb/core"
 
-func main()  {
+func main() {
 	core.RunServe()
 }
-

+ 29 - 0
models/tables/wx_token/wx_token.go

@@ -1,5 +1,7 @@
 package wx_token
 
+import "hongze/hongze_yb/global"
+
 // WxToken [...]
 type WxToken struct {
 	AccessToken string `gorm:"column:access_token;type:varchar(512);not null" json:"accessToken"` //  微信token
@@ -22,3 +24,30 @@ var WxTokenColumns = struct {
 	ExpiresIn:   "expires_in",
 	ID:          "id",
 }
+
+// GetAccessToken 获取accessToken
+func GetAccessToken() (accessToken string, err error) {
+	err = global.DEFAULT_MYSQL.Table("wx_token").Select("access_token").Where("id =  ?", 0).Scan(&accessToken).Error
+	return
+}
+
+// GetById 根据id获取accessToken信息
+func GetById() (info WxToken, err error) {
+	err = global.DEFAULT_MYSQL.Where("id =  ?", 0).First(&info).Error
+	return
+}
+
+// SetAccessToken 设置accessToken
+func SetAccessToken(accessToken string, expiresIn int64) (err error) {
+	err = global.DEFAULT_MYSQL.Model(WxToken{}).Select("access_token").Where("id = 0 ").Updates(WxToken{
+		AccessToken: accessToken,
+		ExpiresIn:   expiresIn,
+	}).Error
+	return
+}
+
+// Update 更新对应字段数据
+func (wxToken *WxToken) Update(updateCols []string) (err error) {
+	err = global.DEFAULT_MYSQL.Model(wxToken).Select(updateCols).Updates(*wxToken).Error
+	return
+}

+ 13 - 1
models/tables/wx_user/query.go

@@ -8,7 +8,13 @@ import (
 
 // GetByMobile 根据手机号获取信息
 func GetByMobile(mobile string) (wxUser *WxUser, err error) {
-	err = global.MYSQL["report"].Where("mobile = ?", mobile).First(&wxUser).Error
+	err = global.DEFAULT_MYSQL.Where("mobile = ? ", mobile).First(&wxUser).Error
+	return
+}
+
+// GetByEmail 根据邮箱号号获取信息
+func GetByEmail(email string) (wxUser *WxUser, err error) {
+	err = global.DEFAULT_MYSQL.Where("email = ? ", email).First(&wxUser).Error
 	return
 }
 
@@ -22,3 +28,9 @@ func GetByWhereMap(where map[string]interface{}) (wxUser *WxUser, err error) {
 	err = global.DEFAULT_MYSQL.Where(cond, whereVal...).First(&wxUser).Error
 	return
 }
+
+// GetByUserId 根据user_id获取用户信息
+func GetByUserId(userId int) (wxUser *WxUser, err error) {
+	err = global.DEFAULT_MYSQL.Where("user_id =  ? ", userId).First(&wxUser).Error
+	return
+}

+ 2 - 1
routers/wechat.go

@@ -6,11 +6,12 @@ import (
 )
 
 func InitWechat(r *gin.Engine) {
-	rGroup := r.Group("test")
+	rGroup := r.Group("wechat")
 
 	{
 		rGroup.GET("/qrCode", wechat.GetQrCode)
 		rGroup.GET("/userInfo", wechat.GetUserInfo)
+		rGroup.GET("/session", wechat.GetUserSession)
 
 	}
 }

+ 45 - 11
services/wechat/wechat.go

@@ -4,9 +4,13 @@ import (
 	"fmt"
 	"github.com/silenceper/wechat/v2"
 	"github.com/silenceper/wechat/v2/cache"
+	"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/user"
 	"hongze/hongze_yb/global"
+	"hongze/hongze_yb/models/tables/wx_token"
+	"time"
 )
 
 var (
@@ -72,25 +76,55 @@ func GetWxChat() (officialAccount *officialaccount.OfficialAccount) {
 		Cache:          memory,
 	}
 	officialAccount = wc.GetOfficialAccount(conf)
+
+	wechatAccessToken := &WechatAccessToken{}
+	officialAccount.SetAccessTokenHandle(wechatAccessToken)
 	return
 }
-func GetUser() {
-	wechat := GetWxChat()
-	a := &WechatAccessToken{}
-	wechat.SetAccessTokenHandle(a)
-	user := wechat.GetUser()
-	userInfo, err := user.GetUserInfo("oN0jD1S3P-FVosLhq-YiVOXldtRo")
-	if err != nil {
-		fmt.Println("err:", err)
-	}
-	fmt.Println(userInfo)
+
+// GetUserInfo 获取微信用户详情
+func GetUserInfo(openid string) (userInfo *user.Info, err error) {
+	wechatClient := GetWxChat()
+	userClient := wechatClient.GetUser()
+	userInfo, err = userClient.GetUserInfo(openid)
 	return
 }
 
 type WechatAccessToken struct {
 }
 
+// GetAccessToken 获取accessToken
 func (wechat WechatAccessToken) GetAccessToken() (accessToken string, err error) {
-	accessToken = `51_419EOfFPrNWU4FvPI2RVbE-Dgde406YbT0SEpYGIoOXKrqXojpSvLjzXExESYYCEf_2VGwbNZAdmh1TimSgfa9YY-FOjx2gsFEulvonBPZW4KN_eu7Z5gXqlt3tCy7MQo7XnxXg-sFR3ihSTYDVjAIAKPH`
+	wxToken, err := wx_token.GetById()
+	if err != nil {
+		return
+	}
+	//如果300s就要过期了,那么就去刷新accessToken
+	if wxToken.ExpiresIn < time.Now().Unix()+300 {
+		tmpAccessToken, expires, tmpErr := getTokenFromServer(WxAppId, WxAppSecret)
+		if tmpErr != nil {
+			err = tmpErr
+			return
+		}
+
+		var updateCols = []string{"AccessToken", "ExpiresIn"}
+		wxToken.AccessToken = tmpAccessToken
+		wxToken.ExpiresIn = expires - 600 //快过期前10分钟就刷新掉
+		wxToken.Update(updateCols)
+	}
+	accessToken = wxToken.AccessToken
+	return
+}
+
+// getTokenFromServer 服务端获取accessToken
+func getTokenFromServer(appid, wxSecret string) (accessToken string, expires int64, err error) {
+	apiUrl := "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=%s&secret=%s"
+	resAccessToken, err := credential.GetTokenFromServer(fmt.Sprintf(apiUrl, appid, wxSecret))
+	if err != nil {
+		return
+	}
+
+	expires = resAccessToken.ExpiresIn
+	accessToken = resAccessToken.AccessToken
 	return
 }

+ 40 - 4
services/wx_app/wx_app.go

@@ -1,19 +1,37 @@
 package wx_app
 
 import (
+	"fmt"
 	wechat "github.com/silenceper/wechat/v2"
+	"github.com/silenceper/wechat/v2/cache"
 	"github.com/silenceper/wechat/v2/miniprogram"
+	"github.com/silenceper/wechat/v2/miniprogram/auth"
 	"github.com/silenceper/wechat/v2/miniprogram/config"
 )
 
+//微信小程序配置信息
+var (
+	WxId        string //微信原始ID
+	WxAppId     string
+	WxAppSecret string
+	WxPlatform  int //用户来源,需要入库,用来保存该用户来自哪个平台,默认是:1
+)
+
+func init() {
+	WxAppId = `wxb059c872d79b9967`
+	WxId = `gh_75abb562a946`
+	WxAppSecret = `1737c73e9f69a21de1a345b8f0800258`
+	WxPlatform = 6 //弘则研报来源
+}
+
 func GetWxApp() (miniprogram *miniprogram.MiniProgram) {
 	wc := wechat.NewWechat()
-	//memory := cache.NewMemory()
+	memory := cache.NewMemory()
 	//memory := cache.NewRedis(global.Redis)
 	cfg := &config.Config{
-		AppID:     "xxx",
-		AppSecret: "xxx",
-		//Cache:     memory,
+		AppID:     WxAppId,
+		AppSecret: WxAppSecret,
+		Cache:     memory,
 	}
 
 	miniprogram = wc.GetMiniProgram(cfg)
@@ -22,6 +40,24 @@ func GetWxApp() (miniprogram *miniprogram.MiniProgram) {
 	//miniprogram.GetAnalysis().GetAnalysisDailyRetain()
 }
 
+// GetSession 获取用户详情
+func GetSession(code string) (userInfo auth.ResCode2Session, err error) {
+	wechatClient := GetWxApp()
+	authClient := wechatClient.GetAuth()
+	fmt.Println("code:", code)
+	userInfo, err = authClient.Code2Session(code)
+	return
+}
+
+// GetSession 获取用户详情
+func GetUserInfo(code string) (userInfo auth.ResCode2Session, err error) {
+	wechatClient := GetWxApp()
+	authClient := wechatClient.GetAuth()
+	fmt.Println("code:", code)
+	userInfo, err = authClient.Code2Session(code)
+	return
+}
+
 //func GetCode() {
 //	codeParms := qrcode.QRCoder{
 //		Page:      "",

+ 3 - 0
utils/common.go

@@ -9,6 +9,7 @@ import (
 	"encoding/json"
 	"errors"
 	"fmt"
+	"gorm.io/gorm"
 	"image"
 	"image/png"
 	"io"
@@ -24,6 +25,8 @@ import (
 	"time"
 )
 
+var ErrNoRow = gorm.ErrRecordNotFound
+
 //随机数种子
 var rnd = rand.New(rand.NewSource(time.Now().UnixNano()))