更改web验证方式为jwt方式,添加定时更新jwt功能
diff --git a/webservice.go b/webservice.go
index 5d0c750..91b3209 100644
--- a/webservice.go
+++ b/webservice.go
@@ -3,7 +3,7 @@
 import (
 	"bytes"
 	"crypto/hmac"
-	"crypto/sha1"
+	"crypto/sha256"
 	"crypto/tls"
 	"encoding/hex"
 	"encoding/json"
@@ -42,7 +42,10 @@
 	// DefaultTimeout default time
 	DefaultTimeout     int
 	sessionKey         string
+	jwt                string
+	expiredAt          int64
 	sslVerify          bool
+	startTime          int64
 	httpConnectionPool sync.Pool
 }
 
@@ -121,7 +124,6 @@
 	timeout int) (*resty.Response, error) {
 
 	fullURL := w.BaseURL + uri
-
 	resty.SetTimeout(time.Duration(timeout) * time.Second)
 	resp, err := resty.R().
 		SetQueryParams(params).
@@ -138,7 +140,7 @@
 
 // SignWithKey sign with key
 func (w *WebSession) SignWithKey(key, message string) string {
-	mac := hmac.New(sha1.New, []byte(key))
+	mac := hmac.New(sha256.New, []byte(key))
 	mac.Write([]byte(message))
 	res := mac.Sum(nil)
 	return hex.EncodeToString(res)
@@ -187,7 +189,6 @@
 	param["sign"] = w.Sign(w.AppID + w.TermID + w.sessionKey + ts)
 
 	fullURL := w.BaseURL + uri
-
 	r, err := resty.R().
 		SetHeader("Content-Type", "application/json").
 		SetBody(param).
@@ -230,7 +231,6 @@
 	if !certs.AppendCertsFromPEM(ca) {
 		return nil, ErrBadCAPEM
 	}
-
 	resty.SetTLSClientConfig(&tls.Config{
 		InsecureSkipVerify: true,
 		RootCAs:            certs,
@@ -250,14 +250,14 @@
 	type FormJSON struct {
 		AppID       string `json:"app_id"`
 		TermID      string `json:"term_id"`
-		AccessToken string `json:"access_token"`
+		AccessToken string `json:"token"`
 	}
 
-	uri := fmt.Sprintf("/authservice/getauth/%v/getaccesstoken", w.AppID)
+	uri := "/auth/gettoken"
 
 	params := make(map[string]string)
-	params["term_id"] = w.TermID
-	r, err := w.doGet(uri, params, 5)
+	params["appid"] = w.AppID
+	r, err := w.doGet(uri, params, 10)
 
 	if err != nil {
 		return "", err
@@ -267,7 +267,6 @@
 	}
 
 	body := r.Body()
-
 	s := &FormJSON{}
 	err = json.Unmarshal(body, &s)
 	if err != nil {
@@ -283,19 +282,19 @@
 		TermID     string `json:"term_id"`
 		SessionKey string `json:"session_key"`
 		CardKey    string `json:"card_key"`
+		Jwt        string `json:"jwt"`
+		ExpiredAt  string `json:"expiredAt"`
 	}
 
-	uri := fmt.Sprintf("/authservice/getauth/%v", w.AppID)
+	uri := "/auth/authentication"
 
 	params := make(map[string]string)
-	params["term_id"] = w.TermID
-	params["access_token"] = token
+	params["appid"] = w.AppID
 	params["timestamp"] = w.GetTimestamp()
-	params["v"] = "1"
-	params["sign"] = w.Sign(token + params["timestamp"])
-	params["sign_method"] = "HMAC"
+	params["sign"] = w.Sign(token)
+	params["sign_method"] = "HMAC-SHA256"
 
-	r, err := w.doGet(uri, params, 5)
+	r, err := w.doGet(uri, params, 10)
 	if err != nil {
 		log.Errorf("err = %v\n", err)
 		return err
@@ -314,7 +313,46 @@
 		log.Errorf("json unmarshal err %v", err)
 		return err
 	}
-	w.sessionKey = s.SessionKey
+	w.jwt = s.Jwt
+	//JWT is valid for 20 minutes
+	w.expiredAt = 20 * 60
+	w.startTime = time.Now().Unix()
+	return nil
+}
+
+func (w *WebSession) updateJwt() error {
+	type FormJSON struct {
+		AppID string `json:"app_id"`
+		Jwt   string `json:"jwt"`
+	}
+	nowTime := time.Now().Unix()
+	if nowTime-w.startTime >= w.expiredAt {
+		uri := "/auth/refresh"
+
+		params := make(map[string]string)
+		params["appid"] = w.AppID
+
+		fullURL := w.BaseURL + uri
+		log.Debugf("CallService: %v", fullURL)
+		r, err := resty.R().
+			SetHeader("Authorization", "Bearer "+w.jwt).
+			Get(fullURL)
+		if err != nil || r.StatusCode() != 200 {
+			log.Errorf("Status=%v, err=%v", r.StatusCode(), err)
+			return err
+		}
+
+		body := r.Body()
+
+		s := &FormJSON{}
+		err = json.Unmarshal(body, &s)
+		if err != nil {
+			log.Errorf("json unmarshal err %v", err)
+			return err
+		}
+		w.jwt = s.Jwt
+		w.startTime = nowTime
+	}
 	return nil
 }
 
@@ -351,10 +389,14 @@
 }
 
 // CallService2 call epay service
-func (w *WebSession) CallService2(path string, params map[string]interface{}, timeout int,
-	signField ...string) (response *ServiceResponse, err error) {
+func (w *WebSession) CallService2(path string, params map[string]interface{},
+	timeout int, signField ...string) (response *ServiceResponse, err error) {
 	err = nil
 
+	if err = w.updateJwt(); err != nil {
+		log.Errorf("updateJwt err = %v", err)
+		return
+	}
 	formData := make(map[string]string)
 	if params != nil {
 		for k, v := range params {
@@ -366,20 +408,10 @@
 	ts := w.GetTimestamp()
 	formData["timestamp"] = ts
 
-	signData := ""
-	for _, k := range signField {
-		if v, ok := formData[k]; ok {
-			signData += v
-		}
-	}
-	signData += ts + w.sessionKey
-	log.Debugf("Sign: key[%v] data[%v]\n", w.sessionKey, signData)
-	formData["sign_method"] = "HMAC"
-	formData["sign"] = w.SignWithKey(w.AppSecret, signData)
-
 	fullURL := w.BaseURL + path
-	log.Debugf("CallService: %v\n", fullURL)
+	log.Debugf("CallService: %v", fullURL)
 	r, err := resty.R().
+		SetHeader("Authorization", "Bearer "+w.jwt).
 		SetHeader("Accept", "application/json").
 		SetFormData(formData).
 		Post(fullURL)
@@ -389,7 +421,7 @@
 	}
 
 	if r.StatusCode() != 200 {
-		log.Errorf("Request Error %v\n", r.StatusCode())
+		log.Errorf("Request Error %v", r.StatusCode())
 		err = fmt.Errorf("Request Error, StatusCode : %v", r.StatusCode())
 		return
 	}