diff --git a/webservice.go b/webservice.go
index b226af8..d11fc1e 100644
--- a/webservice.go
+++ b/webservice.go
@@ -7,8 +7,10 @@
 	"crypto/hmac"
 	"crypto/sha1"
 	"encoding/json"
+	"errors"
 	"fmt"
 	log "github.com/Sirupsen/logrus"
+	"io/ioutil"
 	"net"
 	"net/http"
 	"net/url"
@@ -25,7 +27,6 @@
 	AppId          string
 	TermId         string
 	Appsecret      string
-	AccessToken    string
 	BaseUrl        string
 	DefaultTimeout int
 	session_key    string
@@ -83,6 +84,7 @@
 	}
 	//	vl.Add("sign", w.Sign(ts, vl.Encode()))
 	full_url = full_url + "?" + vl.Encode()
+	fmt.Printf("url: %v\n", full_url)
 	return client.Get(full_url)
 }
 
@@ -128,8 +130,14 @@
 }
 
 func (w *WebSession) Auth() error {
-
-	//	now := time.Now()
+	token, err := w.getAuthToken()
+	if err != nil {
+		return err
+	}
+	err = w.getAppAccessKey(token)
+	if err != nil {
+		return err
+	}
 	return nil
 }
 
@@ -143,14 +151,14 @@
 	}
 }
 
-func (w *WebSession) GetAuthToken() {
+func (w *WebSession) getAuthToken() (string, error) {
 	type FormJson struct {
 		AppId       string `json:"app_id"`
 		TermId      string `json:"term_id"`
 		AccessToken string `json:"access_token"`
 	}
 
-	uri := fmt.Sprintf("/yktapi/services/authservice/getauth/%06d/getaccesstoken", w.AppId)
+	uri := fmt.Sprintf("/yktapi/services/authservice/getauth/%v/getaccesstoken", w.AppId)
 
 	params := make(map[string]string)
 	params["term_id"] = w.TermId
@@ -159,62 +167,57 @@
 	if err != nil || r.StatusCode != 200 {
 		fmt.Println("here")
 		//		log.Errorf("Status = %v, err = %v\n", r.StatusCode, err)
-		return
+		return "", errors.New("请求失败")
 	}
 
-	if r.ContentLength == -1 {
-		log.Error("no response")
-		return
-	}
-	contents := make([]byte, r.ContentLength)
-	r.Body.Read(contents)
+	body, err := ioutil.ReadAll(r.Body)
+	r.Body.Close()
 
-	var s FormJson
-	err = json.Unmarshal(contents, &s)
+	s := &FormJson{}
+	err = json.Unmarshal(body, &s)
 	if err != nil {
 		log.Errorf("json unmarshal err %v", err)
+		return "", errors.New("解析失败")
 	}
-
-	w.AccessToken = s.AccessToken
-
-	return
+	return s.AccessToken, nil
 }
-func (w *WebSession) GetAppAccessKey() {
+func (w *WebSession) getAppAccessKey(token string) error {
 	type FormJson struct {
-		AppId       string `json:"app_id"`
-		TermId      string `json:"term_id"`
-		session_key string `json:"session_key"`
-		card_key    string `json:"card_key"`
+		AppId      string `json:"app_id"`
+		TermId     string `json:"term_id"`
+		SessionKey string `json:"session_key"`
+		CardKey    string `json:"card_key"`
 	}
 
-	uri := fmt.Sprintf("/yktapi/services/authservice/getauth/%06d", w.AppId)
+	uri := fmt.Sprintf("/yktapi/services/authservice/getauth/%v", w.AppId)
 
 	params := make(map[string]string)
 	params["term_id"] = w.TermId
-	params["access_token"] = w.AccessToken
+	params["access_token"] = token
 	params["timestamp"] = w.GetTimestamp()
 	params["v"] = "1"
-	params["sign"] = w.Sign(w.AccessToken + params["timestamp"])
-	params["sign_method"] = "HMAC-SHA1"
+	params["sign"] = w.Sign(token + params["timestamp"])
+	params["sign_method"] = "HMAC"
 
-	r, err := w.DoPost(uri, params, nil)
+	r, err := w.DoGet(uri, params)
 	if err != nil || r.StatusCode != 200 {
-		log.Errorf("Status = %v, err = %v\n", r.StatusCode, err)
+		log.Errorf(" err = %v\n", err)
+		return err
 	}
-	if r.ContentLength == -1 {
-		log.Error("no response")
-	}
-	contents := make([]byte, r.ContentLength)
-	r.Body.Read(contents)
 
-	var s FormJson
-	err = json.Unmarshal(contents, &s)
+	body, err := ioutil.ReadAll(r.Body)
+	r.Body.Close()
+	//	contents := make([]byte, r.ContentLength)
+	//	r.Body.Read(contents)
+
+	s := &FormJson{}
+	err = json.Unmarshal(body, &s)
+	fmt.Printf("[%v]\n", string(body))
 	if err != nil {
 		log.Errorf("json unmarshal err %v", err)
 	}
-	w.session_key = s.session_key
-	//keep card_keyl
-	return
+	w.session_key = s.SessionKey
+	return nil
 }
 func (w *WebSession) PushTransdtl(msg MessageWriter) {
 	type FormJson struct {
@@ -253,9 +256,11 @@
 }
 
 func main() {
-	websession := NewSession("10001", "", "100", "172.28.200.122:8080", 3)
+	websession := NewSession("10001", "", "100", "http://172.28.200.122:8080", 3)
 	fmt.Println(websession.AppId)
-	websession.GetAuthToken()
+	if err := websession.Auth(); err != nil {
+		fmt.Printf("Error : %v\n", err)
+	}
 	//	websession.GetAppAccessKey()
 
 }
