Browse Source

update wechat token from cache

ls 8 months ago
parent
commit
6f07764ade
3 changed files with 72 additions and 1 deletions
  1. 0 1
      cache/redis.go
  2. 65 0
      wechat/client.go
  3. 7 0
      wechat/structure.go

+ 0 - 1
cache/redis.go

@@ -179,7 +179,6 @@ func (c RedisCache) Subscribe(channels string, cb func(channel string, message s
 		cb(msg.Channel, msg.Payload, nil)
 		msg, err = pubsub.ReceiveMessage()
 	}
-
 	cb("", "", err)
 	return err
 }

+ 65 - 0
wechat/client.go

@@ -20,6 +20,10 @@ func keyToken(appid string) string {
 	return "wechat:client:token:" + appid
 }
 
+func keyTicket(appid string) string {
+	return "wechat:client:ticket:" + appid
+}
+
 // NewClient new client
 func NewClient(appID, appSecret, token, encodingAESKey string) *Client {
 	key := keyC(appID)
@@ -57,6 +61,12 @@ func (wc *Client) getToken() (token string, err error) {
 			return
 		}
 	}
+
+	token, err = wc.upToken(key, now)
+	return
+}
+
+func (wc *Client) upToken(key string, now int64) (token string, err error) {
 	uri := BaseURL + "/cgi-bin/token?"
 
 	args := url.Values{}
@@ -83,7 +93,32 @@ func (wc *Client) getToken() (token string, err error) {
 	return
 }
 
+// 更新公众号 access_token
+func (wc *Client) UpdateToken() (token string, err error) {
+	key := keyC(wc.AppID)
+	token, err = wc.upToken(key, time.Now().Unix())
+	return
+}
+
 func (wc *Client) getTicket(now int64) (ticket string, err error) {
+	key := keyTicket(wc.AppID)
+
+	if wc.UseCacheToken {
+		var ct ClientTicket
+		s := ``
+		s, err = cache.Get(key)
+		if err != nil {
+			return
+		}
+		err = json.Unmarshal([]byte(s), &ct)
+		if err != nil {
+			return
+		}
+		ticket = ct.Ticket
+		return
+	}
+
+	//now := time.Now().Unix()
 	var jq *myth.JSONQuery
 	if wc.LastTicketTime > 0 {
 		if now-wc.LastTicketTime < TicketExpires {
@@ -110,6 +145,36 @@ func (wc *Client) getTicket(now int64) (ticket string, err error) {
 	return
 }
 
+func (wc *Client) upTicket(now int64) (ticket string, err error) {
+	key := keyTicket(wc.AppID)
+	var jq *myth.JSONQuery
+	args := url.Values{}
+	args.Add("access_token", wc.AccessToken)
+	args.Add("type", "jsapi")
+
+	uri := BaseURL + "/cgi-bin/ticket/getticket?"
+	uri += args.Encode()
+	if jq, err = getJSON(uri); err == nil {
+		ticket, err = jq.String(`ticket`)
+		wc.LastTicketTime = now
+		wc.Ticket = ticket
+
+		var ct ClientTicket
+		ct.AppID = wc.AppID
+		ct.LastTicketTime = now
+		ct.Ticket = ticket
+		bs, _ := json.Marshal(ct)
+		cache.Set(key, string(bs), 0)
+	}
+	return
+}
+
+// 更新公众号 js ticket
+func (wc *Client) UpdateTicket() (ticket string, err error) {
+	ticket, err = wc.upTicket(time.Now().Unix())
+	return
+}
+
 // TokenUseCache token from cache
 func (wc *Client) TokenUseCache(ok bool) {
 	wc.UseCacheToken = ok

+ 7 - 0
wechat/structure.go

@@ -29,6 +29,13 @@ type ClientToken struct {
 	LastTokenTime int64  `json:"last_token_time"`
 }
 
+// ClientTicket wechat client js ticket
+type ClientTicket struct {
+	AppID          string `json:"appid"`
+	Ticket         string `json:"ticket"`
+	LastTicketTime int64  `json:"last_token_time"`
+}
+
 // MiniClient wechat mini
 type MiniClient struct {
 	AppID     string `json:"appid"`