Browse Source

wechat response use JSONQuery

ls 5 years ago
parent
commit
38b477d728
5 changed files with 62 additions and 38 deletions
  1. 6 5
      json.go
  2. 13 13
      wechat/client.go
  3. 12 10
      wechat/mini.go
  4. 29 10
      wechat/request.go
  5. 2 0
      wechat/structure.go

+ 6 - 5
json.go

@@ -40,16 +40,17 @@ type JSONQuery struct {
 }
 
 // NewJSONQuery creates a new JSONQuery obj from []byte.
-func NewJSONQuery(data []byte) *JSONQuery {
+func NewJSONQuery(data []byte) (jq *JSONQuery, err error) {
 	obj := map[string]interface{}{}
 	// bytes.NewReader(data) strings.NewReader(jsonstring)
 	dec := json.NewDecoder(bytes.NewReader(data))
-	dec.Decode(&obj)
+	err = dec.Decode(&obj)
+	if err != nil {
+		return
+	}
 
-	jq := new(JSONQuery)
 	jq.data = obj
-
-	return jq
+	return
 }
 
 // Bool extracts a bool the JSONQuery

+ 13 - 13
wechat/client.go

@@ -41,10 +41,12 @@ func (wc *Client) getToken() (token string, err error) {
 	args.Add("secret", wc.AppSecret)
 
 	uri += args.Encode()
-	var res Response
-	if res, err = getJSON(uri); err == nil {
+	var jq *myth.JSONQuery
+	if jq, err = getJSON(uri); err == nil {
 		wc.LastTokenTime = now
-		wc.AccessToken = res.AccessToken
+		var accessToken string
+		accessToken, err = jq.String(`access_token`)
+		wc.AccessToken = accessToken
 		token = wc.AccessToken
 		key := key(wc.AppID)
 		cache.Store(key, wc)
@@ -73,7 +75,7 @@ func (wc Client) GetCodeURL(redirectURL, state string) (uri string) {
 
 // GetOpenID 获取 OpenID
 // /sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code
-func (wc Client) GetOpenID(code string) (res Response, err error) {
+func (wc Client) GetOpenID(code string) (jq *myth.JSONQuery, err error) {
 	uri := BaseURL + "/sns/oauth2/access_token?"
 
 	if wc.AccessToken, err = wc.getToken(); err != nil {
@@ -87,7 +89,7 @@ func (wc Client) GetOpenID(code string) (res Response, err error) {
 	args.Add("grant_type", "authorization_code")
 
 	uri += args.Encode()
-	res, err = getJSON(uri)
+	jq, err = getJSON(uri)
 
 	return
 }
@@ -165,7 +167,7 @@ func (wc Client) GetMaterial(mtype string, offset, count int) (res Material, err
 }
 
 func (wc *Client) getTicket(now int64) (ticket string, err error) {
-	var res Response
+	var jq *myth.JSONQuery
 	if wc.LastTicketTime > 0 {
 		if now-wc.LastTokenTime < TokenExpires {
 			ticket = wc.Ticket
@@ -179,15 +181,13 @@ func (wc *Client) getTicket(now int64) (ticket string, err error) {
 
 	uri := BaseURL + "/cgi-bin/ticket/getticket?"
 	uri += args.Encode()
-	if res, err = getJSON(uri); err == nil {
-		fmt.Println(res)
+	if jq, err = getJSON(uri); err == nil {
+		ticket, err = jq.String(`ticket`)
 		wc.LastTicketTime = now
-		wc.Ticket = res.Ticket
+		wc.Ticket = ticket
 
 		key := key(wc.AppID)
 		cache.Store(key, wc)
-
-		ticket = res.Ticket
 	}
 
 	return
@@ -228,7 +228,7 @@ func (wc Client) GetSignPackage(uri, nonceStr string) (sign SignPackage, err err
 
 // SendTemplateMessage send template message
 // POST /cgi-bin/message/template/send?access_token=ACCESS_TOKEN
-func (wc Client) SendTemplateMessage(template TemplateMessage) (res Response, err error) {
+func (wc Client) SendTemplateMessage(template TemplateMessage) (jq *myth.JSONQuery, err error) {
 	uri := BaseURL + "/cgi-bin/message/template/send?"
 
 	if wc.AccessToken, err = wc.getToken(); err != nil {
@@ -242,6 +242,6 @@ func (wc Client) SendTemplateMessage(template TemplateMessage) (res Response, er
 	if err != nil {
 		return
 	}
-	res, err = postJSON(uri, data)
+	jq, err = postJSON(uri, data)
 	return
 }

+ 12 - 10
wechat/mini.go

@@ -5,6 +5,8 @@ import (
 	"time"
 
 	"encoding/json"
+
+	"git.chuangxin1.com/cx/myth"
 )
 
 func keyMini(appid string) string {
@@ -33,9 +35,9 @@ func (mc *MiniClient) GetMiniOpenID(frm FormCode) (openid string, err error) {
 	args.Add("js_code", frm.Code)
 
 	uri += args.Encode()
-	var res Response
-	if res, err = getJSON(uri); err == nil {
-		openid = res.OpenID
+	var jq *myth.JSONQuery
+	if jq, err = getJSON(uri); err == nil {
+		openid, err = jq.String(`openid`)
 	}
 	return
 }
@@ -57,10 +59,10 @@ func (mc *MiniClient) getToken() (token string, err error) {
 	args.Add("secret", mc.AppSecret)
 
 	uri += args.Encode()
-	var res Response
-	if res, err = getJSON(uri); err == nil {
+	var jq *myth.JSONQuery
+	if jq, err = getJSON(uri); err == nil {
 		mc.LastTokenTime = now
-		mc.AccessToken = res.AccessToken
+		mc.AccessToken, err = jq.String(`access_token`)
 		token = mc.AccessToken
 		key := keyMini(mc.AppID)
 		cache.Store(key, mc)
@@ -93,7 +95,7 @@ func (mc *MiniClient) TemplateList(offset, count int) (body []byte, err error) {
 }
 
 // TemplateSend /cgi-bin/message/wxopen/template/send
-func (mc *MiniClient) TemplateSend(template MiniTemplateMessage) (res Response, err error) {
+func (mc *MiniClient) TemplateSend(template MiniTemplateMessage) (jq *myth.JSONQuery, err error) {
 	uri := BaseURL + "/cgi-bin/message/wxopen/template/send?"
 
 	if mc.AccessToken, err = mc.getToken(); err != nil {
@@ -107,13 +109,13 @@ func (mc *MiniClient) TemplateSend(template MiniTemplateMessage) (res Response,
 	if err != nil {
 		return
 	}
-	res, err = postJSON(uri, data)
+	jq, err = postJSON(uri, data)
 
 	return
 }
 
 // UniformSend /cgi-bin/message/wxopen/template/uniform_send
-func (mc *MiniClient) UniformSend(template MiniUniformMessage) (res Response, err error) {
+func (mc *MiniClient) UniformSend(template MiniUniformMessage) (jq *myth.JSONQuery, err error) {
 	uri := BaseURL + "/cgi-bin/message/wxopen/template/uniform_send?"
 
 	if mc.AccessToken, err = mc.getToken(); err != nil {
@@ -127,7 +129,7 @@ func (mc *MiniClient) UniformSend(template MiniUniformMessage) (res Response, er
 	if err != nil {
 		return
 	}
-	res, err = postJSON(uri, data)
+	jq, err = postJSON(uri, data)
 
 	return
 }

+ 29 - 10
wechat/request.go

@@ -25,26 +25,45 @@ func checkErrorWithBody(msg myth.HTTPMessage) (body []byte, err error) {
 	return
 }
 
-func checkError(msg myth.HTTPMessage) (res Response, err error) {
+func checkError(msg myth.HTTPMessage) (jq *myth.JSONQuery, err error) {
 	if msg.StatusCode == 200 {
-		err = json.Unmarshal(msg.Body, &res)
+		jq, err = myth.NewJSONQuery(msg.Body)
+		if err != nil {
+			return
+		}
+		var code int
+		code, err = jq.Int(`errcode`)
 		if err == nil {
-			if res.ErrCode != ErrReqOk {
-				err = errors.New(res.ErrMsg)
+			if code == ErrReqOk {
+				return
+			}
+			var msg string
+			msg, err = jq.String("errmsg")
+			if err != nil {
+				return
 			}
+			err = errors.New(msg)
 		}
+		/*
+			err = json.Unmarshal(msg.Body, &res)
+			if err == nil {
+				if res.ErrCode != ErrReqOk {
+					err = errors.New(res.ErrMsg)
+				}
+			}
+			// */
 	} else {
 		err = errors.New(`HTTP StatusCode not 200`)
 	}
 	return
 }
 
-func getJSON(uri string) (res Response, err error) {
+func getJSON(uri string) (jq *myth.JSONQuery, err error) {
 	var msg myth.HTTPMessage
 	if msg, err = myth.Get(uri, "", "", map[string]string{}); err != nil {
 		return
 	}
-	res, err = checkError(msg)
+	jq, err = checkError(msg)
 	return
 }
 
@@ -57,7 +76,7 @@ func getBody(uri string) (body []byte, err error) {
 	return
 }
 
-func postXML(url string, data []byte) (res Response, err error) {
+func postXML(url string, data []byte) (jq *myth.JSONQuery, err error) {
 	var (
 		msg     myth.HTTPMessage
 		headers = make(map[string]string)
@@ -70,11 +89,11 @@ func postXML(url string, data []byte) (res Response, err error) {
 	if err != nil {
 		return
 	}
-	res, err = checkError(msg)
+	jq, err = checkError(msg)
 	return
 }
 
-func postJSON(url string, data []byte) (res Response, err error) {
+func postJSON(url string, data []byte) (jq *myth.JSONQuery, err error) {
 	var (
 		msg     myth.HTTPMessage
 		headers = make(map[string]string)
@@ -87,7 +106,7 @@ func postJSON(url string, data []byte) (res Response, err error) {
 	if err != nil {
 		return
 	}
-	res, err = checkError(msg)
+	jq, err = checkError(msg)
 	return
 }
 

+ 2 - 0
wechat/structure.go

@@ -33,6 +33,7 @@ type ResponseMsg struct {
 	ErrMsg  string `json:"errmsg"`
 }
 
+/*
 // Response response
 type Response struct {
 	ErrCode int    `json:"errcode"`
@@ -66,6 +67,7 @@ type Response struct {
 	// mini get openid by code
 	SessionKey string `json:"session_key"`
 }
+// */
 
 // Message message
 type Message struct {