yaotian vor 8 Jahren
Ursprung
Commit
88f9b43499
6 geänderte Dateien mit 104 neuen und 72 gelöschten Zeilen
  1. 56 0
      mp/base/base.go
  2. 7 49
      mp/menu/menu.go
  3. 4 16
      mp/user/user.go
  4. 6 0
      server/context/access_token.go
  5. 31 1
      util/error.go
  6. 0 6
      wechat.go

+ 56 - 0
mp/base/base.go

@@ -0,0 +1,56 @@
+package base
+
+import (
+	"fmt"
+	"io/ioutil"
+	"net/http"
+	"strings"
+
+	"github.com/yaotian/gowechat/server/context"
+	"github.com/yaotian/gowechat/util"
+)
+
+//MpBase 微信公众号
+type MpBase struct {
+	*context.Context
+}
+
+//HTTPGetWithAccessToken http get
+func (c *MpBase) HTTPGetWithAccessToken(url string) (resp []byte, err error) {
+	retry := 1
+Do:
+	var accessToken string
+	accessToken, err = c.GetAccessToken()
+	if err != nil {
+		return
+	}
+
+	var target = ""
+	if strings.Contains(url, "?") {
+		target = fmt.Sprintf("%s&access_token=%s", url, accessToken)
+	} else {
+		target = fmt.Sprintf("%s?access_token=%s", url, accessToken)
+	}
+
+	var reponse *http.Response
+	reponse, err = http.Get(target)
+	if err != nil {
+		return
+	}
+	defer reponse.Body.Close()
+
+	resp, err = ioutil.ReadAll(reponse.Body)
+	err = util.CheckCommonError(resp)
+	if err == util.ErrUnmarshall {
+		return
+	}
+	if err != nil {
+		if retry > 0 {
+			retry--
+			c.CleanAccessTokenCache()
+			goto Do
+		}
+		return
+	}
+	return
+}

+ 7 - 49
mp/menu/menu.go

@@ -4,6 +4,7 @@ import (
 	"encoding/json"
 	"fmt"
 
+	"github.com/yaotian/gowechat/mp/base"
 	"github.com/yaotian/gowechat/server/context"
 	"github.com/yaotian/gowechat/util"
 )
@@ -20,7 +21,7 @@ const (
 
 //Menu struct
 type Menu struct {
-	*context.Context
+	base.MpBase
 }
 
 //reqMenu 设置菜单请求数据
@@ -147,48 +148,19 @@ func (menu *Menu) SetMenu(buttons []*Button) error {
 
 //GetMenu 获取菜单配置
 func (menu *Menu) GetMenu() (resMenu ResMenu, err error) {
-	var accessToken string
-	accessToken, err = menu.GetAccessToken()
-	if err != nil {
-		return
-	}
-	uri := fmt.Sprintf("%s?access_token=%s", menuGetURL, accessToken)
 	var response []byte
-	response, err = util.HTTPGet(uri)
+	response, err = menu.HTTPGetWithAccessToken(menuGetURL)
 	if err != nil {
 		return
 	}
 	err = json.Unmarshal(response, &resMenu)
-	if err != nil {
-		return
-	}
-	if resMenu.ErrCode != 0 {
-		err = fmt.Errorf("GetMenu Error , errcode=%d , errmsg=%s", resMenu.ErrCode, resMenu.ErrMsg)
-		return
-	}
 	return
 }
 
 //DeleteMenu 删除菜单
-func (menu *Menu) DeleteMenu() error {
-	accessToken, err := menu.GetAccessToken()
-	if err != nil {
-		return err
-	}
-	uri := fmt.Sprintf("%s?access_token=%s", menuDeleteURL, accessToken)
-	response, err := util.HTTPGet(uri)
-	if err != nil {
-		return err
-	}
-	var commError util.CommonError
-	err = json.Unmarshal(response, &commError)
-	if err != nil {
-		return err
-	}
-	if commError.ErrCode != 0 {
-		return fmt.Errorf("GetMenu Error , errcode=%d , errmsg=%s", commError.ErrCode, commError.ErrMsg)
-	}
-	return nil
+func (menu *Menu) DeleteMenu() (err error) {
+	_, err = menu.HTTPGetWithAccessToken(menuDeleteURL)
+	return
 }
 
 //AddConditional 添加个性化菜单
@@ -275,25 +247,11 @@ func (menu *Menu) MenuTryMatch(userID string) (buttons []Button, err error) {
 
 //GetCurrentSelfMenuInfo 获取自定义菜单配置接口
 func (menu *Menu) GetCurrentSelfMenuInfo() (resSelfMenuInfo ResSelfMenuInfo, err error) {
-	var accessToken string
-	accessToken, err = menu.GetAccessToken()
-	if err != nil {
-		return
-	}
-	uri := fmt.Sprintf("%s?access_token=%s", menuSelfMenuInfoURL, accessToken)
 	var response []byte
-	response, err = util.HTTPGet(uri)
+	response, err = menu.HTTPGetWithAccessToken(menuSelfMenuInfoURL)
 	if err != nil {
 		return
 	}
-	fmt.Println(string(response))
 	err = json.Unmarshal(response, &resSelfMenuInfo)
-	if err != nil {
-		return
-	}
-	if resSelfMenuInfo.ErrCode != 0 {
-		err = fmt.Errorf("GetCurrentSelfMenuInfo Error , errcode=%d , errmsg=%s", resSelfMenuInfo.ErrCode, resSelfMenuInfo.ErrMsg)
-		return
-	}
 	return
 }

+ 4 - 16
mp/user/user.go

@@ -4,6 +4,7 @@ import (
 	"encoding/json"
 	"fmt"
 
+	"github.com/yaotian/gowechat/mp/base"
 	"github.com/yaotian/gowechat/server/context"
 	"github.com/yaotian/gowechat/util"
 )
@@ -14,7 +15,7 @@ const (
 
 //User 用户管理
 type User struct {
-	*context.Context
+	base.MpBase
 }
 
 //NewUser 实例化
@@ -46,26 +47,13 @@ type Info struct {
 
 //GetUserInfo 获取用户基本信息
 func (user *User) GetUserInfo(openID string) (userInfo *Info, err error) {
-	var accessToken string
-	accessToken, err = user.GetAccessToken()
-	if err != nil {
-		return
-	}
-
-	uri := fmt.Sprintf("%s?access_token=%s&openid=%s&lang=zh_CN", userInfoURL, accessToken, openID)
+	url := fmt.Sprintf("%s?openid=%s&lang=zh_CN", userInfoURL, openID)
 	var response []byte
-	response, err = util.HTTPGet(uri)
+	response, err = user.HTTPGetWithAccessToken(url)
 	if err != nil {
 		return
 	}
 	userInfo = new(Info)
 	err = json.Unmarshal(response, userInfo)
-	if err != nil {
-		return
-	}
-	if userInfo.ErrCode != 0 {
-		err = fmt.Errorf("GetUserInfo Error , errcode=%d , errmsg=%s", userInfo.ErrCode, userInfo.ErrMsg)
-		return
-	}
 	return
 }

+ 6 - 0
server/context/access_token.go

@@ -50,6 +50,12 @@ func (ctx *Context) GetAccessToken() (accessToken string, err error) {
 	return
 }
 
+//CleanAccessTokenCache clean cache
+func (ctx *Context) CleanAccessTokenCache() {
+	accessTokenCacheKey := fmt.Sprintf("access_token_%s", ctx.AppID)
+	ctx.Cache.Delete(accessTokenCacheKey)
+}
+
 //GetAccessTokenFromServer 强制从微信服务器获取token
 func (ctx *Context) GetAccessTokenFromServer() (resAccessToken ResAccessToken, err error) {
 	url := fmt.Sprintf("%s?grant_type=client_credential&appid=%s&secret=%s", AccessTokenURL, ctx.AppID, ctx.AppSecret)

+ 31 - 1
util/error.go

@@ -1,7 +1,37 @@
 package util
 
-// CommonError 微信返回的通用错误json
+import (
+	"encoding/json"
+	"errors"
+	"fmt"
+)
+
+var ErrUnmarshall error = errors.New("Json Unmarshal Error")
+
+//CommonError 微信返回的错误信息
 type CommonError struct {
 	ErrCode int64  `json:"errcode"`
 	ErrMsg  string `json:"errmsg"`
 }
+
+func NewCommonError(code int64, msg string) *CommonError {
+	return &CommonError{ErrCode: code, ErrMsg: msg}
+}
+
+func (e *CommonError) Error() string {
+	return e.ErrMsg
+}
+
+//CheckCommonError check CommonError
+func CheckCommonError(jsonData []byte) error {
+	var errmsg CommonError
+	if err := json.Unmarshal(jsonData, &errmsg); err != nil {
+		return ErrUnmarshall
+	}
+
+	if errmsg.ErrCode != 0 {
+		return fmt.Errorf("Error , errcode=%d , errmsg=%s", errmsg.ErrCode, errmsg.ErrMsg)
+	}
+
+	return nil
+}

+ 0 - 6
wechat.go

@@ -5,7 +5,6 @@ import (
 	"sync"
 
 	"github.com/astaxie/beego/cache"
-	"github.com/yaotian/gowechat/mch/pay"
 	"github.com/yaotian/gowechat/server"
 	"github.com/yaotian/gowechat/server/context"
 	"github.com/yaotian/gowechat/util"
@@ -77,8 +76,3 @@ func (wc *Wechat) GetServer(req *http.Request, writer http.ResponseWriter) *serv
 	wc.Context.Writer = writer
 	return server.NewServer(wc.Context)
 }
-
-//GetPay get pay
-func (wc *Wechat) GetPay() *pay.Pay {
-	return pay.NewPay(wc.Context)
-}