blob: 732f8be205be627145feb4c9f5c4d16d48ebd75f [file] [log] [blame]
Tang Cheng26b91152015-07-22 12:26:52 +08001package swservice
zongqiang.zhangb8ab9b42015-07-10 17:45:20 +08002
3import (
4 "bytes"
5 "crypto/hmac"
6 "crypto/sha1"
Tang Cheng26b91152015-07-22 12:26:52 +08007 "encoding/hex"
zongqiang.zhangb8ab9b42015-07-10 17:45:20 +08008 "encoding/json"
qiaoweica037fa2015-07-10 18:31:53 +08009 "errors"
zongqiang.zhangb8ab9b42015-07-10 17:45:20 +080010 "fmt"
11 log "github.com/Sirupsen/logrus"
qiaoweica037fa2015-07-10 18:31:53 +080012 "io/ioutil"
zongqiang.zhangb8ab9b42015-07-10 17:45:20 +080013 "net"
14 "net/http"
15 "net/url"
16 "time"
17)
Tang Cheng32e32562015-07-08 17:08:03 +080018
19func dailTimeout(network, addr string) (net.Conn, error) {
zongqiang.zhangb8ab9b42015-07-10 17:45:20 +080020 // default_timeout := time.Duration(theSession.DefaultTimeout) * time.Second
21 default_timeout := time.Duration(3) * time.Second
Tang Cheng32e32562015-07-08 17:08:03 +080022 return net.DialTimeout(network, addr, default_timeout)
23}
24
25type WebSession struct {
26 AppId string
zongqiang.zhangb8ab9b42015-07-10 17:45:20 +080027 TermId string
28 Appsecret string
Tang Cheng32e32562015-07-08 17:08:03 +080029 BaseUrl string
30 DefaultTimeout int
31 session_key string
32}
33
34func (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 Cheng32e32562015-07-08 17:08:03 +080042
43 if params != nil {
44 for k, v := range params {
45 vl.Add(k, v)
46 }
47 }
Tang Cheng32e32562015-07-08 17:08:03 +080048 full_url = full_url + "?" + vl.Encode()
49 return client.Get(full_url)
50}
51
52func (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.zhangb8ab9b42015-07-10 17:45:20 +080058func (w *WebSession) Sign(message string) string {
Tang Cheng26b91152015-07-22 12:26:52 +080059 mac := hmac.New(sha1.New, []byte(w.Appsecret))
zongqiang.zhangb8ab9b42015-07-10 17:45:20 +080060 mac.Write([]byte(message))
61 res := mac.Sum(nil)
Tang Cheng26b91152015-07-22 12:26:52 +080062 return hex.EncodeToString(res)
Tang Cheng32e32562015-07-08 17:08:03 +080063}
64
Tang Cheng26b91152015-07-22 12:26:52 +080065func (w *WebSession) DoPost(uri string, param map[string]string) (*http.Response, error) {
Tang Cheng32e32562015-07-08 17:08:03 +080066 transport := http.Transport{Dial: dailTimeout}
67 client := &http.Client{Transport: &transport}
Tang Cheng26b91152015-07-22 12:26:52 +080068 param["app_id"] = w.AppId
69 param["term_id"] = w.TermId
70 param["sign_method"] = "HMAC"
71 param["session_key"] = w.session_key
Tang Cheng32e32562015-07-08 17:08:03 +080072 ts := w.GetTimestamp()
Tang Cheng26b91152015-07-22 12:26:52 +080073 param["timestamp"] = ts
74 param["sign"] = w.Sign(w.AppId + w.TermId + w.session_key + ts)
zongqiang.zhangb8ab9b42015-07-10 17:45:20 +080075
Tang Cheng32e32562015-07-08 17:08:03 +080076 full_url := w.BaseUrl + uri
77 log.Debugf("Url=%v", full_url)
Tang Cheng26b91152015-07-22 12:26:52 +080078 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 Cheng32e32562015-07-08 17:08:03 +080084 if err != nil || r.StatusCode != 200 {
85 log.Errorf("Status=%v, err=%v", r, err)
86 }
87 return r, err
88}
89
90func (w *WebSession) Auth() error {
qiaoweica037fa2015-07-10 18:31:53 +080091 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 Cheng32e32562015-07-08 17:08:03 +080099 return nil
100}
zongqiang.zhangb8ab9b42015-07-10 17:45:20 +0800101
102func 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
qiaoweica037fa2015-07-10 18:31:53 +0800112func (w *WebSession) getAuthToken() (string, error) {
zongqiang.zhangb8ab9b42015-07-10 17:45:20 +0800113 type FormJson struct {
114 AppId string `json:"app_id"`
115 TermId string `json:"term_id"`
116 AccessToken string `json:"access_token"`
117 }
118
Tang Cheng26b91152015-07-22 12:26:52 +0800119 uri := fmt.Sprintf("/authservice/getauth/%v/getaccesstoken", w.AppId)
zongqiang.zhangb8ab9b42015-07-10 17:45:20 +0800120
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)
qiaoweica037fa2015-07-10 18:31:53 +0800128 return "", errors.New("请求失败")
zongqiang.zhangb8ab9b42015-07-10 17:45:20 +0800129 }
130
qiaoweica037fa2015-07-10 18:31:53 +0800131 body, err := ioutil.ReadAll(r.Body)
132 r.Body.Close()
zongqiang.zhangb8ab9b42015-07-10 17:45:20 +0800133
qiaoweica037fa2015-07-10 18:31:53 +0800134 s := &FormJson{}
135 err = json.Unmarshal(body, &s)
zongqiang.zhangb8ab9b42015-07-10 17:45:20 +0800136 if err != nil {
137 log.Errorf("json unmarshal err %v", err)
qiaoweica037fa2015-07-10 18:31:53 +0800138 return "", errors.New("解析失败")
zongqiang.zhangb8ab9b42015-07-10 17:45:20 +0800139 }
qiaoweica037fa2015-07-10 18:31:53 +0800140 return s.AccessToken, nil
zongqiang.zhangb8ab9b42015-07-10 17:45:20 +0800141}
qiaoweica037fa2015-07-10 18:31:53 +0800142func (w *WebSession) getAppAccessKey(token string) error {
zongqiang.zhangb8ab9b42015-07-10 17:45:20 +0800143 type FormJson struct {
qiaoweica037fa2015-07-10 18:31:53 +0800144 AppId string `json:"app_id"`
145 TermId string `json:"term_id"`
146 SessionKey string `json:"session_key"`
147 CardKey string `json:"card_key"`
zongqiang.zhangb8ab9b42015-07-10 17:45:20 +0800148 }
149
Tang Cheng26b91152015-07-22 12:26:52 +0800150 uri := fmt.Sprintf("/authservice/getauth/%v", w.AppId)
zongqiang.zhangb8ab9b42015-07-10 17:45:20 +0800151
152 params := make(map[string]string)
153 params["term_id"] = w.TermId
qiaoweica037fa2015-07-10 18:31:53 +0800154 params["access_token"] = token
zongqiang.zhangb8ab9b42015-07-10 17:45:20 +0800155 params["timestamp"] = w.GetTimestamp()
156 params["v"] = "1"
qiaoweica037fa2015-07-10 18:31:53 +0800157 params["sign"] = w.Sign(token + params["timestamp"])
158 params["sign_method"] = "HMAC"
zongqiang.zhangb8ab9b42015-07-10 17:45:20 +0800159
qiaoweica037fa2015-07-10 18:31:53 +0800160 r, err := w.DoGet(uri, params)
zongqiang.zhangb8ab9b42015-07-10 17:45:20 +0800161 if err != nil || r.StatusCode != 200 {
qiaoweica037fa2015-07-10 18:31:53 +0800162 log.Errorf(" err = %v\n", err)
163 return err
zongqiang.zhangb8ab9b42015-07-10 17:45:20 +0800164 }
zongqiang.zhangb8ab9b42015-07-10 17:45:20 +0800165
qiaoweica037fa2015-07-10 18:31:53 +0800166 body, err := ioutil.ReadAll(r.Body)
167 r.Body.Close()
qiaoweica037fa2015-07-10 18:31:53 +0800168
169 s := &FormJson{}
170 err = json.Unmarshal(body, &s)
zongqiang.zhangb8ab9b42015-07-10 17:45:20 +0800171 if err != nil {
172 log.Errorf("json unmarshal err %v", err)
173 }
qiaoweica037fa2015-07-10 18:31:53 +0800174 w.session_key = s.SessionKey
175 return nil
zongqiang.zhangb8ab9b42015-07-10 17:45:20 +0800176}
Tang Cheng26b91152015-07-22 12:26:52 +0800177
178func (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.zhangb8ab9b42015-07-10 17:45:20 +0800187 }
zongqiang.zhangb8ab9b42015-07-10 17:45:20 +0800188
Tang Cheng26b91152015-07-22 12:26:52 +0800189 body, err := ioutil.ReadAll(r.Body)
190 r.Body.Close()
191 return NewMessageReader(body), nil
zongqiang.zhangb8ab9b42015-07-10 17:45:20 +0800192}