blob: d11fc1ef8b0b1545d4affa417b923720eb8f27a3 [file] [log] [blame]
zongqiang.zhangb8ab9b42015-07-10 17:45:20 +08001package main
2
3//swwebservice
4
5import (
6 "bytes"
7 "crypto/hmac"
8 "crypto/sha1"
9 "encoding/json"
qiaoweica037fa2015-07-10 18:31:53 +080010 "errors"
zongqiang.zhangb8ab9b42015-07-10 17:45:20 +080011 "fmt"
12 log "github.com/Sirupsen/logrus"
qiaoweica037fa2015-07-10 18:31:53 +080013 "io/ioutil"
zongqiang.zhangb8ab9b42015-07-10 17:45:20 +080014 "net"
15 "net/http"
16 "net/url"
17 "time"
18)
Tang Cheng32e32562015-07-08 17:08:03 +080019
20func dailTimeout(network, addr string) (net.Conn, error) {
zongqiang.zhangb8ab9b42015-07-10 17:45:20 +080021 // default_timeout := time.Duration(theSession.DefaultTimeout) * time.Second
22 default_timeout := time.Duration(3) * time.Second
Tang Cheng32e32562015-07-08 17:08:03 +080023 return net.DialTimeout(network, addr, default_timeout)
24}
25
26type WebSession struct {
27 AppId string
zongqiang.zhangb8ab9b42015-07-10 17:45:20 +080028 TermId string
29 Appsecret string
Tang Cheng32e32562015-07-08 17:08:03 +080030 BaseUrl string
31 DefaultTimeout int
32 session_key string
33}
34
zongqiang.zhangb8ab9b42015-07-10 17:45:20 +080035type MessageReader struct {
36 FuncNo int
37 ColumnNames []string
38 ColumnDescs []string
39 RowData [][]interface{}
40}
41
42type MessageWriter struct {
43 FuncNo int
44 Attributes map[string]string
45 ColumnNames []string
46 ColumnDescs []string
47 RowData [][]interface{}
48}
49
50func NewMessageWriter(funcno int) *MessageWriter {
51 return &MessageWriter{
52 FuncNo: funcno,
53 Attributes: make(map[string]string),
54 ColumnNames: make([]string, 0),
55 ColumnDescs: make([]string, 0)}
56}
57func (m *MessageWriter) SetAttr(name, value string) {
58 m.Attributes[name] = value
59}
60func (m *MessageWriter) AddCol(name, desc string) {
61 m.ColumnNames = append(m.ColumnNames, name)
62 m.ColumnDescs = append(m.ColumnDescs, desc)
63}
64func (m *MessageWriter) AddRow(data []string) {
65 // m.RowData[] = append(m.RowData)
66}
67
Tang Cheng32e32562015-07-08 17:08:03 +080068func (w *WebSession) DoGet(uri string, params map[string]string) (*http.Response, error) {
69 transport := http.Transport{Dial: dailTimeout}
70
71 client := http.Client{Transport: &transport}
72
73 full_url := w.BaseUrl + uri
74
75 vl := url.Values{}
zongqiang.zhangb8ab9b42015-07-10 17:45:20 +080076 // vl.Add("app_id", w.AppId)
77 // ts := w.GetTimestamp()
78 // vl.Add("timestamp", ts)
Tang Cheng32e32562015-07-08 17:08:03 +080079
80 if params != nil {
81 for k, v := range params {
82 vl.Add(k, v)
83 }
84 }
zongqiang.zhangb8ab9b42015-07-10 17:45:20 +080085 // vl.Add("sign", w.Sign(ts, vl.Encode()))
Tang Cheng32e32562015-07-08 17:08:03 +080086 full_url = full_url + "?" + vl.Encode()
qiaoweica037fa2015-07-10 18:31:53 +080087 fmt.Printf("url: %v\n", full_url)
Tang Cheng32e32562015-07-08 17:08:03 +080088 return client.Get(full_url)
89}
90
91func (w *WebSession) GetTimestamp() string {
92 t := time.Now()
93 return fmt.Sprintf("%04d%02d%02d%02d%02d%02d", t.Year(), t.Month(), t.Day(),
94 t.Hour(), t.Minute(), t.Second())
95}
96
zongqiang.zhangb8ab9b42015-07-10 17:45:20 +080097func (w *WebSession) Sign(message string) string {
98 // pridata := accesstoken + timestamp
99 mac := hmac.New(sha1.New, []byte(w.session_key))
100 mac.Write([]byte(message))
101 res := mac.Sum(nil)
102 // res := sha1.Sum([]byte(pridata))
103 return string(res[0:])
Tang Cheng32e32562015-07-08 17:08:03 +0800104}
105
106func (w *WebSession) DoPost(uri string, param map[string]string, json_data []byte) (*http.Response, error) {
107 transport := http.Transport{Dial: dailTimeout}
108 client := &http.Client{Transport: &transport}
109 vl := url.Values{}
110 vl.Add("app_id", w.AppId)
111 ts := w.GetTimestamp()
112 vl.Add("timestamp", ts)
zongqiang.zhangb8ab9b42015-07-10 17:45:20 +0800113 vl.Add("sign", w.Sign(ts+vl.Encode()))
Tang Cheng32e32562015-07-08 17:08:03 +0800114 if param != nil {
115 for k, v := range param {
116 vl.Add(k, v)
117 }
118 }
119 if json_data != nil {
120 vl.Add("request_data", string(json_data))
121 }
zongqiang.zhangb8ab9b42015-07-10 17:45:20 +0800122
Tang Cheng32e32562015-07-08 17:08:03 +0800123 full_url := w.BaseUrl + uri
124 log.Debugf("Url=%v", full_url)
125 r, err := client.Post(full_url, "application/x-www-form-urlencoded", bytes.NewReader([]byte(vl.Encode())))
126 if err != nil || r.StatusCode != 200 {
127 log.Errorf("Status=%v, err=%v", r, err)
128 }
129 return r, err
130}
131
132func (w *WebSession) Auth() error {
qiaoweica037fa2015-07-10 18:31:53 +0800133 token, err := w.getAuthToken()
134 if err != nil {
135 return err
136 }
137 err = w.getAppAccessKey(token)
138 if err != nil {
139 return err
140 }
Tang Cheng32e32562015-07-08 17:08:03 +0800141 return nil
142}
zongqiang.zhangb8ab9b42015-07-10 17:45:20 +0800143
144func NewSession(appid, appsecret, termid, baseurl string, timeout int) *WebSession {
145 return &WebSession{
146 AppId: appid,
147 Appsecret: appsecret,
148 TermId: termid,
149 BaseUrl: baseurl,
150 DefaultTimeout: timeout,
151 }
152}
153
qiaoweica037fa2015-07-10 18:31:53 +0800154func (w *WebSession) getAuthToken() (string, error) {
zongqiang.zhangb8ab9b42015-07-10 17:45:20 +0800155 type FormJson struct {
156 AppId string `json:"app_id"`
157 TermId string `json:"term_id"`
158 AccessToken string `json:"access_token"`
159 }
160
qiaoweica037fa2015-07-10 18:31:53 +0800161 uri := fmt.Sprintf("/yktapi/services/authservice/getauth/%v/getaccesstoken", w.AppId)
zongqiang.zhangb8ab9b42015-07-10 17:45:20 +0800162
163 params := make(map[string]string)
164 params["term_id"] = w.TermId
165 r, err := w.DoGet(uri, params)
166
167 if err != nil || r.StatusCode != 200 {
168 fmt.Println("here")
169 // log.Errorf("Status = %v, err = %v\n", r.StatusCode, err)
qiaoweica037fa2015-07-10 18:31:53 +0800170 return "", errors.New("请求失败")
zongqiang.zhangb8ab9b42015-07-10 17:45:20 +0800171 }
172
qiaoweica037fa2015-07-10 18:31:53 +0800173 body, err := ioutil.ReadAll(r.Body)
174 r.Body.Close()
zongqiang.zhangb8ab9b42015-07-10 17:45:20 +0800175
qiaoweica037fa2015-07-10 18:31:53 +0800176 s := &FormJson{}
177 err = json.Unmarshal(body, &s)
zongqiang.zhangb8ab9b42015-07-10 17:45:20 +0800178 if err != nil {
179 log.Errorf("json unmarshal err %v", err)
qiaoweica037fa2015-07-10 18:31:53 +0800180 return "", errors.New("解析失败")
zongqiang.zhangb8ab9b42015-07-10 17:45:20 +0800181 }
qiaoweica037fa2015-07-10 18:31:53 +0800182 return s.AccessToken, nil
zongqiang.zhangb8ab9b42015-07-10 17:45:20 +0800183}
qiaoweica037fa2015-07-10 18:31:53 +0800184func (w *WebSession) getAppAccessKey(token string) error {
zongqiang.zhangb8ab9b42015-07-10 17:45:20 +0800185 type FormJson struct {
qiaoweica037fa2015-07-10 18:31:53 +0800186 AppId string `json:"app_id"`
187 TermId string `json:"term_id"`
188 SessionKey string `json:"session_key"`
189 CardKey string `json:"card_key"`
zongqiang.zhangb8ab9b42015-07-10 17:45:20 +0800190 }
191
qiaoweica037fa2015-07-10 18:31:53 +0800192 uri := fmt.Sprintf("/yktapi/services/authservice/getauth/%v", w.AppId)
zongqiang.zhangb8ab9b42015-07-10 17:45:20 +0800193
194 params := make(map[string]string)
195 params["term_id"] = w.TermId
qiaoweica037fa2015-07-10 18:31:53 +0800196 params["access_token"] = token
zongqiang.zhangb8ab9b42015-07-10 17:45:20 +0800197 params["timestamp"] = w.GetTimestamp()
198 params["v"] = "1"
qiaoweica037fa2015-07-10 18:31:53 +0800199 params["sign"] = w.Sign(token + params["timestamp"])
200 params["sign_method"] = "HMAC"
zongqiang.zhangb8ab9b42015-07-10 17:45:20 +0800201
qiaoweica037fa2015-07-10 18:31:53 +0800202 r, err := w.DoGet(uri, params)
zongqiang.zhangb8ab9b42015-07-10 17:45:20 +0800203 if err != nil || r.StatusCode != 200 {
qiaoweica037fa2015-07-10 18:31:53 +0800204 log.Errorf(" err = %v\n", err)
205 return err
zongqiang.zhangb8ab9b42015-07-10 17:45:20 +0800206 }
zongqiang.zhangb8ab9b42015-07-10 17:45:20 +0800207
qiaoweica037fa2015-07-10 18:31:53 +0800208 body, err := ioutil.ReadAll(r.Body)
209 r.Body.Close()
210 // contents := make([]byte, r.ContentLength)
211 // r.Body.Read(contents)
212
213 s := &FormJson{}
214 err = json.Unmarshal(body, &s)
215 fmt.Printf("[%v]\n", string(body))
zongqiang.zhangb8ab9b42015-07-10 17:45:20 +0800216 if err != nil {
217 log.Errorf("json unmarshal err %v", err)
218 }
qiaoweica037fa2015-07-10 18:31:53 +0800219 w.session_key = s.SessionKey
220 return nil
zongqiang.zhangb8ab9b42015-07-10 17:45:20 +0800221}
222func (w *WebSession) PushTransdtl(msg MessageWriter) {
223 type FormJson struct {
224 }
zongqiang.zhang1b2d6482015-07-10 17:57:03 +0800225 // uri := fmt.Sprintf("/yktapi/services/ecardservice")
zongqiang.zhangb8ab9b42015-07-10 17:45:20 +0800226
zongqiang.zhang1b2d6482015-07-10 17:57:03 +0800227 // params := make(map[string]string)
228 // params["term_id"] = w.TermId
229 // params["access_token"] = w.AccessToken
230 // params["timestamp"] = w.GetTimestamp()
231 // signMsg := w.AppId + w.TermId + w.session_key + params["timestamp"]
232 // params["sign"] = w.Sign(signMsg)
233 // params["sign_method"] = "HMAC-SHA1"
234 // temp := json.Marshal(msg)
235 // params["funcdata"] = string(temp[0:])
236
237 // r, err := w.DoPost(uri, params, nil)
238 // if err != nil || r.StatusCode != 200 {
239 // log.Errorf("Status = %v, err = %v\n", r.StatusCode, err)
240 // return
241 // }
242 // if r.ContentLength == -1 {
243 // log.Error("no response")
244 // return
245 // }
246 // contents := make([]byte, r.ContentLength)
247 // r.Body.Read(contents)
248
249 // var s FormJson
250 // err = json.Unmarshal(contents, &s)
251 // if err != nil {
252 // log.Errorf("json unmarshal err %v", err)
253 // return
254 // }
255 // temp = s.
zongqiang.zhangb8ab9b42015-07-10 17:45:20 +0800256}
257
258func main() {
qiaoweica037fa2015-07-10 18:31:53 +0800259 websession := NewSession("10001", "", "100", "http://172.28.200.122:8080", 3)
zongqiang.zhangb8ab9b42015-07-10 17:45:20 +0800260 fmt.Println(websession.AppId)
qiaoweica037fa2015-07-10 18:31:53 +0800261 if err := websession.Auth(); err != nil {
262 fmt.Printf("Error : %v\n", err)
263 }
zongqiang.zhangb8ab9b42015-07-10 17:45:20 +0800264 // websession.GetAppAccessKey()
265
266}