diff --git a/webservice.go b/webservice.go
index 83e9780..49a8969 100644
--- a/webservice.go
+++ b/webservice.go
@@ -1,18 +1,69 @@
-package swwebservice
+package main
+
+//swwebservice
+
+import (
+	"bytes"
+	"crypto/hmac"
+	"crypto/sha1"
+	"encoding/json"
+	"fmt"
+	log "github.com/Sirupsen/logrus"
+	"net"
+	"net/http"
+	"net/url"
+	"time"
+)
 
 func dailTimeout(network, addr string) (net.Conn, error) {
-	default_timeout := time.Duration(theSession.DefaultTimeout) * time.Second
+	//	default_timeout := time.Duration(theSession.DefaultTimeout) * time.Second
+	default_timeout := time.Duration(3) * time.Second
 	return net.DialTimeout(network, addr, default_timeout)
 }
 
 type WebSession struct {
 	AppId          string
-	AppSecret      string
+	TermId         string
+	Appsecret      string
+	AccessToken    string
 	BaseUrl        string
 	DefaultTimeout int
 	session_key    string
 }
 
+type MessageReader struct {
+	FuncNo      int
+	ColumnNames []string
+	ColumnDescs []string
+	RowData     [][]interface{}
+}
+
+type MessageWriter struct {
+	FuncNo      int
+	Attributes  map[string]string
+	ColumnNames []string
+	ColumnDescs []string
+	RowData     [][]interface{}
+}
+
+func NewMessageWriter(funcno int) *MessageWriter {
+	return &MessageWriter{
+		FuncNo:      funcno,
+		Attributes:  make(map[string]string),
+		ColumnNames: make([]string, 0),
+		ColumnDescs: make([]string, 0)}
+}
+func (m *MessageWriter) SetAttr(name, value string) {
+	m.Attributes[name] = value
+}
+func (m *MessageWriter) AddCol(name, desc string) {
+	m.ColumnNames = append(m.ColumnNames, name)
+	m.ColumnDescs = append(m.ColumnDescs, desc)
+}
+func (m *MessageWriter) AddRow(data []string) {
+	//	m.RowData[] = append(m.RowData)
+}
+
 func (w *WebSession) DoGet(uri string, params map[string]string) (*http.Response, error) {
 	transport := http.Transport{Dial: dailTimeout}
 
@@ -21,16 +72,16 @@
 	full_url := w.BaseUrl + uri
 
 	vl := url.Values{}
-	vl.Add("app_id", w.AppId)
-	ts := w.GetTimestamp()
-	vl.Add("timestamp", ts)
+	//	vl.Add("app_id", w.AppId)
+	//	ts := w.GetTimestamp()
+	//	vl.Add("timestamp", ts)
 
 	if params != nil {
 		for k, v := range params {
 			vl.Add(k, v)
 		}
 	}
-	vl.Add("sign", w.Sign(ts, vl.Encode()))
+	//	vl.Add("sign", w.Sign(ts, vl.Encode()))
 	full_url = full_url + "?" + vl.Encode()
 	return client.Get(full_url)
 }
@@ -41,8 +92,13 @@
 		t.Hour(), t.Minute(), t.Second())
 }
 
-func (w *WebSession) Sign(timestamp, query_string string) string {
-	return "122123123"
+func (w *WebSession) Sign(message string) string {
+	//	pridata := accesstoken + timestamp
+	mac := hmac.New(sha1.New, []byte(w.session_key))
+	mac.Write([]byte(message))
+	res := mac.Sum(nil)
+	//	res := sha1.Sum([]byte(pridata))
+	return string(res[0:])
 }
 
 func (w *WebSession) DoPost(uri string, param map[string]string, json_data []byte) (*http.Response, error) {
@@ -52,7 +108,7 @@
 	vl.Add("app_id", w.AppId)
 	ts := w.GetTimestamp()
 	vl.Add("timestamp", ts)
-	vl.Add("sign", w.Sign(ts, vl.Encode()))
+	vl.Add("sign", w.Sign(ts+vl.Encode()))
 	if param != nil {
 		for k, v := range param {
 			vl.Add(k, v)
@@ -61,6 +117,7 @@
 	if json_data != nil {
 		vl.Add("request_data", string(json_data))
 	}
+
 	full_url := w.BaseUrl + uri
 	log.Debugf("Url=%v", full_url)
 	r, err := client.Post(full_url, "application/x-www-form-urlencoded", bytes.NewReader([]byte(vl.Encode())))
@@ -71,5 +128,113 @@
 }
 
 func (w *WebSession) Auth() error {
+
+	//	now := time.Now()
 	return nil
 }
+
+func NewSession(appid, appsecret, termid, baseurl string, timeout int) *WebSession {
+	return &WebSession{
+		AppId:          appid,
+		Appsecret:      appsecret,
+		TermId:         termid,
+		BaseUrl:        baseurl,
+		DefaultTimeout: timeout,
+	}
+}
+
+func (w *WebSession) GetAuthToken() {
+	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)
+
+	params := make(map[string]string)
+	params["term_id"] = w.TermId
+	r, err := w.DoGet(uri, params)
+
+	if err != nil || r.StatusCode != 200 {
+		fmt.Println("here")
+		//		log.Errorf("Status = %v, err = %v\n", r.StatusCode, err)
+		return
+	}
+
+	if r.ContentLength == -1 {
+		log.Error("no response")
+		return
+	}
+	contents := make([]byte, r.ContentLength)
+	r.Body.Read(contents)
+
+	var s FormJson
+	err = json.Unmarshal(contents, &s)
+	if err != nil {
+		log.Errorf("json unmarshal err %v", err)
+	}
+
+	w.AccessToken = s.AccessToken
+
+	return
+}
+func (w *WebSession) GetAppAccessKey() {
+	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"`
+	}
+
+	uri := fmt.Sprintf("/yktapi/services/authservice/getauth/%06d", w.AppId)
+
+	params := make(map[string]string)
+	params["term_id"] = w.TermId
+	params["access_token"] = w.AccessToken
+	params["timestamp"] = w.GetTimestamp()
+	params["v"] = "1"
+	params["sign"] = w.Sign(w.AccessToken + params["timestamp"])
+	params["sign_method"] = "HMAC-SHA1"
+
+	r, err := w.DoPost(uri, params, nil)
+	if err != nil || r.StatusCode != 200 {
+		log.Errorf("Status = %v, err = %v\n", r.StatusCode, 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)
+	if err != nil {
+		log.Errorf("json unmarshal err %v", err)
+	}
+	w.session_key = s.session_key
+	//keep card_keyl
+	return
+}
+func (w *WebSession) PushTransdtl(msg MessageWriter) {
+	type FormJson struct {
+	}
+	//	uri := fmt.Sprintf("/yktapi/services/authservice/getauth/%06d", w.AppId)
+
+	params := make(map[string]string)
+	params["term_id"] = w.TermId
+	params["access_token"] = w.AccessToken
+	params["timestamp"] = w.GetTimestamp()
+	signMsg := w.AppId + w.TermId + w.session_key + params["timestamp"]
+	params["sign"] = w.Sign(signMsg)
+	params["sign_method"] = "HMAC-SHA1"
+	//	params["funcdata"] = msg
+}
+
+func main() {
+	websession := NewSession("10001", "", "100", "172.28.200.122:8080", 3)
+	fmt.Println(websession.AppId)
+	websession.GetAuthToken()
+	//	websession.GetAppAccessKey()
+
+}
