Tang Cheng | 26b9115 | 2015-07-22 12:26:52 +0800 | [diff] [blame^] | 1 | package swservice |
zongqiang.zhang | b8ab9b4 | 2015-07-10 17:45:20 +0800 | [diff] [blame] | 2 | |
| 3 | import ( |
| 4 | "bytes" |
| 5 | "crypto/hmac" |
| 6 | "crypto/sha1" |
Tang Cheng | 26b9115 | 2015-07-22 12:26:52 +0800 | [diff] [blame^] | 7 | "encoding/hex" |
zongqiang.zhang | b8ab9b4 | 2015-07-10 17:45:20 +0800 | [diff] [blame] | 8 | "encoding/json" |
qiaowei | ca037fa | 2015-07-10 18:31:53 +0800 | [diff] [blame] | 9 | "errors" |
zongqiang.zhang | b8ab9b4 | 2015-07-10 17:45:20 +0800 | [diff] [blame] | 10 | "fmt" |
| 11 | log "github.com/Sirupsen/logrus" |
qiaowei | ca037fa | 2015-07-10 18:31:53 +0800 | [diff] [blame] | 12 | "io/ioutil" |
zongqiang.zhang | b8ab9b4 | 2015-07-10 17:45:20 +0800 | [diff] [blame] | 13 | "net" |
| 14 | "net/http" |
| 15 | "net/url" |
| 16 | "time" |
| 17 | ) |
Tang Cheng | 32e3256 | 2015-07-08 17:08:03 +0800 | [diff] [blame] | 18 | |
| 19 | func dailTimeout(network, addr string) (net.Conn, error) { |
zongqiang.zhang | b8ab9b4 | 2015-07-10 17:45:20 +0800 | [diff] [blame] | 20 | // default_timeout := time.Duration(theSession.DefaultTimeout) * time.Second |
| 21 | default_timeout := time.Duration(3) * time.Second |
Tang Cheng | 32e3256 | 2015-07-08 17:08:03 +0800 | [diff] [blame] | 22 | return net.DialTimeout(network, addr, default_timeout) |
| 23 | } |
| 24 | |
| 25 | type WebSession struct { |
| 26 | AppId string |
zongqiang.zhang | b8ab9b4 | 2015-07-10 17:45:20 +0800 | [diff] [blame] | 27 | TermId string |
| 28 | Appsecret string |
Tang Cheng | 32e3256 | 2015-07-08 17:08:03 +0800 | [diff] [blame] | 29 | BaseUrl string |
| 30 | DefaultTimeout int |
| 31 | session_key string |
| 32 | } |
| 33 | |
| 34 | func (w *WebSession) DoGet(uri string, params map[string]string) (*http.Response, error) { |
| 35 | transport := http.Transport{Dial: dailTimeout} |
| 36 | |
| 37 | client := http.Client{Transport: &transport} |
| 38 | |
| 39 | full_url := w.BaseUrl + uri |
| 40 | |
| 41 | vl := url.Values{} |
Tang Cheng | 32e3256 | 2015-07-08 17:08:03 +0800 | [diff] [blame] | 42 | |
| 43 | if params != nil { |
| 44 | for k, v := range params { |
| 45 | vl.Add(k, v) |
| 46 | } |
| 47 | } |
Tang Cheng | 32e3256 | 2015-07-08 17:08:03 +0800 | [diff] [blame] | 48 | full_url = full_url + "?" + vl.Encode() |
| 49 | return client.Get(full_url) |
| 50 | } |
| 51 | |
| 52 | func (w *WebSession) GetTimestamp() string { |
| 53 | t := time.Now() |
| 54 | return fmt.Sprintf("%04d%02d%02d%02d%02d%02d", t.Year(), t.Month(), t.Day(), |
| 55 | t.Hour(), t.Minute(), t.Second()) |
| 56 | } |
| 57 | |
zongqiang.zhang | b8ab9b4 | 2015-07-10 17:45:20 +0800 | [diff] [blame] | 58 | func (w *WebSession) Sign(message string) string { |
Tang Cheng | 26b9115 | 2015-07-22 12:26:52 +0800 | [diff] [blame^] | 59 | mac := hmac.New(sha1.New, []byte(w.Appsecret)) |
zongqiang.zhang | b8ab9b4 | 2015-07-10 17:45:20 +0800 | [diff] [blame] | 60 | mac.Write([]byte(message)) |
| 61 | res := mac.Sum(nil) |
Tang Cheng | 26b9115 | 2015-07-22 12:26:52 +0800 | [diff] [blame^] | 62 | return hex.EncodeToString(res) |
Tang Cheng | 32e3256 | 2015-07-08 17:08:03 +0800 | [diff] [blame] | 63 | } |
| 64 | |
Tang Cheng | 26b9115 | 2015-07-22 12:26:52 +0800 | [diff] [blame^] | 65 | func (w *WebSession) DoPost(uri string, param map[string]string) (*http.Response, error) { |
Tang Cheng | 32e3256 | 2015-07-08 17:08:03 +0800 | [diff] [blame] | 66 | transport := http.Transport{Dial: dailTimeout} |
| 67 | client := &http.Client{Transport: &transport} |
Tang Cheng | 26b9115 | 2015-07-22 12:26:52 +0800 | [diff] [blame^] | 68 | param["app_id"] = w.AppId |
| 69 | param["term_id"] = w.TermId |
| 70 | param["sign_method"] = "HMAC" |
| 71 | param["session_key"] = w.session_key |
Tang Cheng | 32e3256 | 2015-07-08 17:08:03 +0800 | [diff] [blame] | 72 | ts := w.GetTimestamp() |
Tang Cheng | 26b9115 | 2015-07-22 12:26:52 +0800 | [diff] [blame^] | 73 | param["timestamp"] = ts |
| 74 | param["sign"] = w.Sign(w.AppId + w.TermId + w.session_key + ts) |
zongqiang.zhang | b8ab9b4 | 2015-07-10 17:45:20 +0800 | [diff] [blame] | 75 | |
Tang Cheng | 32e3256 | 2015-07-08 17:08:03 +0800 | [diff] [blame] | 76 | full_url := w.BaseUrl + uri |
| 77 | log.Debugf("Url=%v", full_url) |
Tang Cheng | 26b9115 | 2015-07-22 12:26:52 +0800 | [diff] [blame^] | 78 | data, err := json.Marshal(param) |
| 79 | if err != nil { |
| 80 | return nil, err |
| 81 | } |
| 82 | var r *http.Response |
| 83 | r, err = client.Post(full_url, "application/json", bytes.NewReader(data)) |
Tang Cheng | 32e3256 | 2015-07-08 17:08:03 +0800 | [diff] [blame] | 84 | if err != nil || r.StatusCode != 200 { |
| 85 | log.Errorf("Status=%v, err=%v", r, err) |
| 86 | } |
| 87 | return r, err |
| 88 | } |
| 89 | |
| 90 | func (w *WebSession) Auth() error { |
qiaowei | ca037fa | 2015-07-10 18:31:53 +0800 | [diff] [blame] | 91 | token, err := w.getAuthToken() |
| 92 | if err != nil { |
| 93 | return err |
| 94 | } |
| 95 | err = w.getAppAccessKey(token) |
| 96 | if err != nil { |
| 97 | return err |
| 98 | } |
Tang Cheng | 32e3256 | 2015-07-08 17:08:03 +0800 | [diff] [blame] | 99 | return nil |
| 100 | } |
zongqiang.zhang | b8ab9b4 | 2015-07-10 17:45:20 +0800 | [diff] [blame] | 101 | |
| 102 | func NewSession(appid, appsecret, termid, baseurl string, timeout int) *WebSession { |
| 103 | return &WebSession{ |
| 104 | AppId: appid, |
| 105 | Appsecret: appsecret, |
| 106 | TermId: termid, |
| 107 | BaseUrl: baseurl, |
| 108 | DefaultTimeout: timeout, |
| 109 | } |
| 110 | } |
| 111 | |
qiaowei | ca037fa | 2015-07-10 18:31:53 +0800 | [diff] [blame] | 112 | func (w *WebSession) getAuthToken() (string, error) { |
zongqiang.zhang | b8ab9b4 | 2015-07-10 17:45:20 +0800 | [diff] [blame] | 113 | type FormJson struct { |
| 114 | AppId string `json:"app_id"` |
| 115 | TermId string `json:"term_id"` |
| 116 | AccessToken string `json:"access_token"` |
| 117 | } |
| 118 | |
Tang Cheng | 26b9115 | 2015-07-22 12:26:52 +0800 | [diff] [blame^] | 119 | uri := fmt.Sprintf("/authservice/getauth/%v/getaccesstoken", w.AppId) |
zongqiang.zhang | b8ab9b4 | 2015-07-10 17:45:20 +0800 | [diff] [blame] | 120 | |
| 121 | params := make(map[string]string) |
| 122 | params["term_id"] = w.TermId |
| 123 | r, err := w.DoGet(uri, params) |
| 124 | |
| 125 | if err != nil || r.StatusCode != 200 { |
| 126 | fmt.Println("here") |
| 127 | // log.Errorf("Status = %v, err = %v\n", r.StatusCode, err) |
qiaowei | ca037fa | 2015-07-10 18:31:53 +0800 | [diff] [blame] | 128 | return "", errors.New("请求失败") |
zongqiang.zhang | b8ab9b4 | 2015-07-10 17:45:20 +0800 | [diff] [blame] | 129 | } |
| 130 | |
qiaowei | ca037fa | 2015-07-10 18:31:53 +0800 | [diff] [blame] | 131 | body, err := ioutil.ReadAll(r.Body) |
| 132 | r.Body.Close() |
zongqiang.zhang | b8ab9b4 | 2015-07-10 17:45:20 +0800 | [diff] [blame] | 133 | |
qiaowei | ca037fa | 2015-07-10 18:31:53 +0800 | [diff] [blame] | 134 | s := &FormJson{} |
| 135 | err = json.Unmarshal(body, &s) |
zongqiang.zhang | b8ab9b4 | 2015-07-10 17:45:20 +0800 | [diff] [blame] | 136 | if err != nil { |
| 137 | log.Errorf("json unmarshal err %v", err) |
qiaowei | ca037fa | 2015-07-10 18:31:53 +0800 | [diff] [blame] | 138 | return "", errors.New("解析失败") |
zongqiang.zhang | b8ab9b4 | 2015-07-10 17:45:20 +0800 | [diff] [blame] | 139 | } |
qiaowei | ca037fa | 2015-07-10 18:31:53 +0800 | [diff] [blame] | 140 | return s.AccessToken, nil |
zongqiang.zhang | b8ab9b4 | 2015-07-10 17:45:20 +0800 | [diff] [blame] | 141 | } |
qiaowei | ca037fa | 2015-07-10 18:31:53 +0800 | [diff] [blame] | 142 | func (w *WebSession) getAppAccessKey(token string) error { |
zongqiang.zhang | b8ab9b4 | 2015-07-10 17:45:20 +0800 | [diff] [blame] | 143 | type FormJson struct { |
qiaowei | ca037fa | 2015-07-10 18:31:53 +0800 | [diff] [blame] | 144 | AppId string `json:"app_id"` |
| 145 | TermId string `json:"term_id"` |
| 146 | SessionKey string `json:"session_key"` |
| 147 | CardKey string `json:"card_key"` |
zongqiang.zhang | b8ab9b4 | 2015-07-10 17:45:20 +0800 | [diff] [blame] | 148 | } |
| 149 | |
Tang Cheng | 26b9115 | 2015-07-22 12:26:52 +0800 | [diff] [blame^] | 150 | uri := fmt.Sprintf("/authservice/getauth/%v", w.AppId) |
zongqiang.zhang | b8ab9b4 | 2015-07-10 17:45:20 +0800 | [diff] [blame] | 151 | |
| 152 | params := make(map[string]string) |
| 153 | params["term_id"] = w.TermId |
qiaowei | ca037fa | 2015-07-10 18:31:53 +0800 | [diff] [blame] | 154 | params["access_token"] = token |
zongqiang.zhang | b8ab9b4 | 2015-07-10 17:45:20 +0800 | [diff] [blame] | 155 | params["timestamp"] = w.GetTimestamp() |
| 156 | params["v"] = "1" |
qiaowei | ca037fa | 2015-07-10 18:31:53 +0800 | [diff] [blame] | 157 | params["sign"] = w.Sign(token + params["timestamp"]) |
| 158 | params["sign_method"] = "HMAC" |
zongqiang.zhang | b8ab9b4 | 2015-07-10 17:45:20 +0800 | [diff] [blame] | 159 | |
qiaowei | ca037fa | 2015-07-10 18:31:53 +0800 | [diff] [blame] | 160 | r, err := w.DoGet(uri, params) |
zongqiang.zhang | b8ab9b4 | 2015-07-10 17:45:20 +0800 | [diff] [blame] | 161 | if err != nil || r.StatusCode != 200 { |
qiaowei | ca037fa | 2015-07-10 18:31:53 +0800 | [diff] [blame] | 162 | log.Errorf(" err = %v\n", err) |
| 163 | return err |
zongqiang.zhang | b8ab9b4 | 2015-07-10 17:45:20 +0800 | [diff] [blame] | 164 | } |
zongqiang.zhang | b8ab9b4 | 2015-07-10 17:45:20 +0800 | [diff] [blame] | 165 | |
qiaowei | ca037fa | 2015-07-10 18:31:53 +0800 | [diff] [blame] | 166 | body, err := ioutil.ReadAll(r.Body) |
| 167 | r.Body.Close() |
qiaowei | ca037fa | 2015-07-10 18:31:53 +0800 | [diff] [blame] | 168 | |
| 169 | s := &FormJson{} |
| 170 | err = json.Unmarshal(body, &s) |
zongqiang.zhang | b8ab9b4 | 2015-07-10 17:45:20 +0800 | [diff] [blame] | 171 | if err != nil { |
| 172 | log.Errorf("json unmarshal err %v", err) |
| 173 | } |
qiaowei | ca037fa | 2015-07-10 18:31:53 +0800 | [diff] [blame] | 174 | w.session_key = s.SessionKey |
| 175 | return nil |
zongqiang.zhang | b8ab9b4 | 2015-07-10 17:45:20 +0800 | [diff] [blame] | 176 | } |
Tang Cheng | 26b9115 | 2015-07-22 12:26:52 +0800 | [diff] [blame^] | 177 | |
| 178 | func (w *WebSession) CallYKTApi(request *MessageWriter) (*MessageReader, error) { |
| 179 | call_data := request.Serialize() |
| 180 | params := make(map[string]string) |
| 181 | params["funcdata"] = call_data |
| 182 | r, err := w.DoPost("/ecardservice/ecardapi", params) |
| 183 | |
| 184 | if err != nil || r.StatusCode != 200 { |
| 185 | log.Errorf(" err = %v\n", err) |
| 186 | return nil, err |
zongqiang.zhang | b8ab9b4 | 2015-07-10 17:45:20 +0800 | [diff] [blame] | 187 | } |
zongqiang.zhang | b8ab9b4 | 2015-07-10 17:45:20 +0800 | [diff] [blame] | 188 | |
Tang Cheng | 26b9115 | 2015-07-22 12:26:52 +0800 | [diff] [blame^] | 189 | body, err := ioutil.ReadAll(r.Body) |
| 190 | r.Body.Close() |
| 191 | return NewMessageReader(body), nil |
zongqiang.zhang | b8ab9b4 | 2015-07-10 17:45:20 +0800 | [diff] [blame] | 192 | } |