blob: 5e9183aa17da6a3b07ce2edd30420fab351b5f59 [file] [log] [blame]
Tang Cheng26b91152015-07-22 12:26:52 +08001package swservice
zongqiang.zhangb8ab9b42015-07-10 17:45:20 +08002
3import (
zongqiang.zhangb8ab9b42015-07-10 17:45:20 +08004 "crypto/hmac"
5 "crypto/sha1"
Tang Chengf8716aa2015-08-19 10:20:40 +08006 "crypto/tls"
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"
qiaoweica037fa2015-07-10 18:31:53 +080011 "io/ioutil"
zongqiang.zhangb8ab9b42015-07-10 17:45:20 +080012 "net"
13 "net/http"
14 "net/url"
Tang Chengf16121a2015-07-27 13:46:14 +080015 "strconv"
Tang Chengf8716aa2015-08-19 10:20:40 +080016 "strings"
Tang Cheng78513ea2015-10-28 14:32:02 +080017 "sync"
zongqiang.zhangb8ab9b42015-07-10 17:45:20 +080018 "time"
Tang Chenga412d202016-01-27 09:24:53 +080019
20 log "github.com/Sirupsen/logrus"
21 "github.com/franela/goreq"
zongqiang.zhangb8ab9b42015-07-10 17:45:20 +080022)
Tang Cheng32e32562015-07-08 17:08:03 +080023
Tang Chenge29065c2016-07-14 12:29:42 +080024// WebSession web session object
Tang Cheng32e32562015-07-08 17:08:03 +080025type WebSession struct {
Tang Chenge29065c2016-07-14 12:29:42 +080026 // AppId app id
27 AppID string
28 // TermId term id
29 TermID string
30 // Appsecret secret
31 AppSecret string
32 // BaseUrl base url
33 BaseURL string
34 // DefaultTimeout default time
Tang Cheng78513ea2015-10-28 14:32:02 +080035 DefaultTimeout int
Tang Chenge29065c2016-07-14 12:29:42 +080036 sessionKey string
37 sslVerify bool
Tang Cheng78513ea2015-10-28 14:32:02 +080038 httpConnectionPool sync.Pool
Tang Cheng32e32562015-07-08 17:08:03 +080039}
40
Tang Chenge29065c2016-07-14 12:29:42 +080041func safeGetJSONInt(value interface{}) int {
Tang Chengf16121a2015-07-27 13:46:14 +080042 if value == nil {
43 return 0
44 }
45 s := fmt.Sprintf("%v", value)
Tang Chenge29065c2016-07-14 12:29:42 +080046 i, err := strconv.Atoi(s)
47 if err != nil {
Tang Chengf16121a2015-07-27 13:46:14 +080048 return 0
Tang Chengf16121a2015-07-27 13:46:14 +080049 }
Tang Chenge29065c2016-07-14 12:29:42 +080050 return i
Tang Chengf16121a2015-07-27 13:46:14 +080051}
52
Tang Chenge29065c2016-07-14 12:29:42 +080053// ServiceResponse service response object
Tang Chengf16121a2015-07-27 13:46:14 +080054type ServiceResponse struct {
Tang Chenge29065c2016-07-14 12:29:42 +080055 // RetCode return code
Tang Chengf16121a2015-07-27 13:46:14 +080056 RetCode int
Tang Chenge29065c2016-07-14 12:29:42 +080057 // RetMsg return message
58 RetMsg string
59 // Result return data
60 Result map[string]interface{}
Tang Chengf16121a2015-07-27 13:46:14 +080061}
62
Tang Chenge29065c2016-07-14 12:29:42 +080063// NewServiceResponseFromJSON parse json response data
64func NewServiceResponseFromJSON(jsonData interface{}) *ServiceResponse {
65 if jsonData == nil {
Tang Chengf16121a2015-07-27 13:46:14 +080066 return nil
67 }
68 res := &ServiceResponse{}
Tang Chenge29065c2016-07-14 12:29:42 +080069 res.Result = jsonData.(map[string]interface{})
70 res.RetCode = safeGetJSONInt(res.Result["retcode"])
Tang Chengf16121a2015-07-27 13:46:14 +080071 res.RetMsg = res.GetStrValue("retmsg")
72 return res
73}
Tang Chenge29065c2016-07-14 12:29:42 +080074
75// GetIntValue get int value
Tang Chengf16121a2015-07-27 13:46:14 +080076func (r *ServiceResponse) GetIntValue(name string) int {
Tang Chenge29065c2016-07-14 12:29:42 +080077 return safeGetJSONInt(r.Result[name])
Tang Chengf16121a2015-07-27 13:46:14 +080078}
79
Tang Chenge29065c2016-07-14 12:29:42 +080080// GetStrValue get string value
Tang Chengf16121a2015-07-27 13:46:14 +080081func (r *ServiceResponse) GetStrValue(name string) string {
Tang Chenge29065c2016-07-14 12:29:42 +080082 s, ok := r.Result[name]
83 if ok {
Tang Chengf16121a2015-07-27 13:46:14 +080084 return fmt.Sprintf("%v", s)
Tang Chengf16121a2015-07-27 13:46:14 +080085 }
Tang Chenge29065c2016-07-14 12:29:42 +080086 return ""
Tang Chengf16121a2015-07-27 13:46:14 +080087}
88
Tang Chenge29065c2016-07-14 12:29:42 +080089// GetInterfaceValue get value as interface
zongqiang.zhang134f4182016-06-14 15:23:22 +080090func (r *ServiceResponse) GetInterfaceValue(name string) interface{} {
Tang Chenge29065c2016-07-14 12:29:42 +080091 s, ok := r.Result[name]
92 if ok {
zongqiang.zhang134f4182016-06-14 15:23:22 +080093 return s
zongqiang.zhang134f4182016-06-14 15:23:22 +080094 }
Tang Chenge29065c2016-07-14 12:29:42 +080095 return nil
zongqiang.zhang134f4182016-06-14 15:23:22 +080096}
Tang Chenge29065c2016-07-14 12:29:42 +080097
98// GetFloatValue get float value
Tang Chengf16121a2015-07-27 13:46:14 +080099func (r *ServiceResponse) GetFloatValue(name string) float64 {
100 if s, ok := r.Result[name]; ok {
101 t := fmt.Sprintf("%v", s)
Tang Chenge29065c2016-07-14 12:29:42 +0800102 f, err := strconv.ParseFloat(t, 64)
103 if err != nil {
Tang Chengf16121a2015-07-27 13:46:14 +0800104 return 0.0
Tang Chengf16121a2015-07-27 13:46:14 +0800105 }
Tang Chenge29065c2016-07-14 12:29:42 +0800106 return f
Tang Chengf16121a2015-07-27 13:46:14 +0800107 }
Tang Chenge29065c2016-07-14 12:29:42 +0800108 return 0.0
Tang Chengf16121a2015-07-27 13:46:14 +0800109}
110
Tang Chenge29065c2016-07-14 12:29:42 +0800111// DoGet send GET request
Tang Cheng32e32562015-07-08 17:08:03 +0800112func (w *WebSession) DoGet(uri string, params map[string]string) (*http.Response, error) {
Tang Cheng78513ea2015-10-28 14:32:02 +0800113 transport := w.httpConnectionPool.Get().(*http.Transport)
114 defer w.httpConnectionPool.Put(transport)
115 client := &http.Client{Transport: transport, Timeout: time.Duration(3) * time.Second}
Tang Cheng32e32562015-07-08 17:08:03 +0800116
Tang Chenge29065c2016-07-14 12:29:42 +0800117 fullURL := w.BaseURL + uri
Tang Cheng32e32562015-07-08 17:08:03 +0800118
119 vl := url.Values{}
Tang Cheng32e32562015-07-08 17:08:03 +0800120
121 if params != nil {
122 for k, v := range params {
123 vl.Add(k, v)
124 }
125 }
Tang Chenge29065c2016-07-14 12:29:42 +0800126 fullURL = fullURL + "?" + vl.Encode()
Tang Chengf16121a2015-07-27 13:46:14 +0800127 // fmt.Printf("%v\n", full_url)
Tang Chenge29065c2016-07-14 12:29:42 +0800128 return client.Get(fullURL)
Tang Cheng32e32562015-07-08 17:08:03 +0800129}
130
Tang Chenge29065c2016-07-14 12:29:42 +0800131// GetTimestamp get time stamp format 20160103133455
Tang Cheng32e32562015-07-08 17:08:03 +0800132func (w *WebSession) GetTimestamp() string {
133 t := time.Now()
134 return fmt.Sprintf("%04d%02d%02d%02d%02d%02d", t.Year(), t.Month(), t.Day(),
135 t.Hour(), t.Minute(), t.Second())
136}
137
Tang Chenge29065c2016-07-14 12:29:42 +0800138// SignWithKey sign with key
Tang Chengf16121a2015-07-27 13:46:14 +0800139func (w *WebSession) SignWithKey(key, message string) string {
140 mac := hmac.New(sha1.New, []byte(key))
zongqiang.zhangb8ab9b42015-07-10 17:45:20 +0800141 mac.Write([]byte(message))
142 res := mac.Sum(nil)
Tang Cheng26b91152015-07-22 12:26:52 +0800143 return hex.EncodeToString(res)
Tang Cheng32e32562015-07-08 17:08:03 +0800144}
Tang Chenge29065c2016-07-14 12:29:42 +0800145
146// Sign sign data
Tang Chengf16121a2015-07-27 13:46:14 +0800147func (w *WebSession) Sign(message string) string {
Tang Chenge29065c2016-07-14 12:29:42 +0800148 return w.SignWithKey(w.AppSecret, message)
Tang Chengf16121a2015-07-27 13:46:14 +0800149}
Tang Cheng32e32562015-07-08 17:08:03 +0800150
Tang Chenge29065c2016-07-14 12:29:42 +0800151func newTransport(baseurl string, sslVerify bool) *http.Transport {
Tang Chengf8716aa2015-08-19 10:20:40 +0800152 var transport http.Transport
Tang Cheng78513ea2015-10-28 14:32:02 +0800153 if strings.HasPrefix(baseurl, "https://") {
Tang Cheng0b9abf12015-08-20 09:55:32 +0800154 var b bool
Tang Chenge29065c2016-07-14 12:29:42 +0800155 if sslVerify {
Tang Cheng0b9abf12015-08-20 09:55:32 +0800156 b = false
157 } else {
158 b = true
159 }
Tang Cheng78513ea2015-10-28 14:32:02 +0800160 transport = http.Transport{MaxIdleConnsPerHost: 0,
Tang Cheng91665852015-08-29 22:17:20 +0800161 TLSClientConfig: &tls.Config{InsecureSkipVerify: b},
Tang Cheng78513ea2015-10-28 14:32:02 +0800162 TLSHandshakeTimeout: time.Duration(1) * time.Second,
Tang Cheng91665852015-08-29 22:17:20 +0800163 Dial: func(network, addr string) (net.Conn, error) {
164 default_timeout := time.Duration(1) * time.Second
165 return net.DialTimeout(network, addr, default_timeout)
166 }}
Tang Cheng78513ea2015-10-28 14:32:02 +0800167 } else if strings.HasPrefix(baseurl, "http://") {
168 transport = http.Transport{MaxIdleConnsPerHost: 0,
Tang Cheng91665852015-08-29 22:17:20 +0800169 Dial: func(network, addr string) (net.Conn, error) {
170 default_timeout := time.Duration(1) * time.Second
171 return net.DialTimeout(network, addr, default_timeout)
172 }}
Tang Chengf8716aa2015-08-19 10:20:40 +0800173 }
Tang Cheng78513ea2015-10-28 14:32:02 +0800174 log.Debugf("创建新连接")
175 return &transport
Tang Chengf16121a2015-07-27 13:46:14 +0800176}
Tang Chengf8716aa2015-08-19 10:20:40 +0800177
Tang Chenge29065c2016-07-14 12:29:42 +0800178// DoPost send POST request
Tang Chenga412d202016-01-27 09:24:53 +0800179func (w *WebSession) DoPost(uri string, param map[string]string) (*goreq.Response, error) {
Tang Chenge29065c2016-07-14 12:29:42 +0800180 param["app_id"] = w.AppID
181 param["term_id"] = w.TermID
Tang Cheng26b91152015-07-22 12:26:52 +0800182 param["sign_method"] = "HMAC"
Tang Chenge29065c2016-07-14 12:29:42 +0800183 param["session_key"] = w.sessionKey
Tang Cheng32e32562015-07-08 17:08:03 +0800184 ts := w.GetTimestamp()
Tang Cheng26b91152015-07-22 12:26:52 +0800185 param["timestamp"] = ts
Tang Chenge29065c2016-07-14 12:29:42 +0800186 param["sign"] = w.Sign(w.AppID + w.TermID + w.sessionKey + ts)
zongqiang.zhangb8ab9b42015-07-10 17:45:20 +0800187
Tang Chenge29065c2016-07-14 12:29:42 +0800188 fullURL := w.BaseURL + uri
Tang Cheng26b91152015-07-22 12:26:52 +0800189 data, err := json.Marshal(param)
190 if err != nil {
191 return nil, err
192 }
Tang Chenga412d202016-01-27 09:24:53 +0800193 var r *goreq.Response
194 r, err = goreq.Request{
Tang Chenge29065c2016-07-14 12:29:42 +0800195 Uri: fullURL,
Tang Chenga412d202016-01-27 09:24:53 +0800196 Method: "POST",
197 ContentType: "application/json",
198 Body: data,
199 Timeout: time.Duration(3) * time.Second}.Do()
Tang Cheng32e32562015-07-08 17:08:03 +0800200 if err != nil || r.StatusCode != 200 {
201 log.Errorf("Status=%v, err=%v", r, err)
202 }
203 return r, err
204}
205
Tang Chenge29065c2016-07-14 12:29:42 +0800206// Auth authorization
Tang Cheng32e32562015-07-08 17:08:03 +0800207func (w *WebSession) Auth() error {
qiaoweica037fa2015-07-10 18:31:53 +0800208 token, err := w.getAuthToken()
209 if err != nil {
210 return err
211 }
212 err = w.getAppAccessKey(token)
213 if err != nil {
214 return err
215 }
Tang Cheng32e32562015-07-08 17:08:03 +0800216 return nil
217}
zongqiang.zhangb8ab9b42015-07-10 17:45:20 +0800218
Tang Chenge29065c2016-07-14 12:29:42 +0800219// NewSession new session object
Tang Cheng0b9abf12015-08-20 09:55:32 +0800220func NewSession(appid, appsecret, termid, baseurl string, timeout int, sslVerify bool) *WebSession {
zongqiang.zhangb8ab9b42015-07-10 17:45:20 +0800221 return &WebSession{
Tang Chenge29065c2016-07-14 12:29:42 +0800222 AppID: appid,
223 AppSecret: appsecret,
224 TermID: termid,
225 BaseURL: baseurl,
zongqiang.zhangb8ab9b42015-07-10 17:45:20 +0800226 DefaultTimeout: timeout,
Tang Chenge29065c2016-07-14 12:29:42 +0800227 sslVerify: sslVerify,
Tang Cheng78513ea2015-10-28 14:32:02 +0800228 httpConnectionPool: sync.Pool{New: func() interface{} {
229 return newTransport(baseurl, sslVerify)
230 }}}
zongqiang.zhangb8ab9b42015-07-10 17:45:20 +0800231}
232
qiaoweica037fa2015-07-10 18:31:53 +0800233func (w *WebSession) getAuthToken() (string, error) {
zongqiang.zhangb8ab9b42015-07-10 17:45:20 +0800234 type FormJson struct {
Tang Chenge29065c2016-07-14 12:29:42 +0800235 AppID string `json:"app_id"`
236 TermID string `json:"term_id"`
zongqiang.zhangb8ab9b42015-07-10 17:45:20 +0800237 AccessToken string `json:"access_token"`
238 }
239
Tang Chenge29065c2016-07-14 12:29:42 +0800240 uri := fmt.Sprintf("/authservice/getauth/%v/getaccesstoken", w.AppID)
zongqiang.zhangb8ab9b42015-07-10 17:45:20 +0800241
242 params := make(map[string]string)
Tang Chenge29065c2016-07-14 12:29:42 +0800243 params["term_id"] = w.TermID
zongqiang.zhangb8ab9b42015-07-10 17:45:20 +0800244 r, err := w.DoGet(uri, params)
245
Tang Chengf8716aa2015-08-19 10:20:40 +0800246 if err != nil {
zongqiang.zhangb8ab9b42015-07-10 17:45:20 +0800247 // log.Errorf("Status = %v, err = %v\n", r.StatusCode, err)
Tang Chengf8716aa2015-08-19 10:20:40 +0800248 return "", err
249 }
250 if r.StatusCode != 200 {
qiaoweica037fa2015-07-10 18:31:53 +0800251 return "", errors.New("请求失败")
zongqiang.zhangb8ab9b42015-07-10 17:45:20 +0800252 }
253
qiaoweica037fa2015-07-10 18:31:53 +0800254 body, err := ioutil.ReadAll(r.Body)
Tang Cheng91665852015-08-29 22:17:20 +0800255 defer r.Body.Close()
zongqiang.zhangb8ab9b42015-07-10 17:45:20 +0800256
qiaoweica037fa2015-07-10 18:31:53 +0800257 s := &FormJson{}
258 err = json.Unmarshal(body, &s)
zongqiang.zhangb8ab9b42015-07-10 17:45:20 +0800259 if err != nil {
260 log.Errorf("json unmarshal err %v", err)
qiaoweica037fa2015-07-10 18:31:53 +0800261 return "", errors.New("解析失败")
zongqiang.zhangb8ab9b42015-07-10 17:45:20 +0800262 }
qiaoweica037fa2015-07-10 18:31:53 +0800263 return s.AccessToken, nil
zongqiang.zhangb8ab9b42015-07-10 17:45:20 +0800264}
Tang Chenge29065c2016-07-14 12:29:42 +0800265
qiaoweica037fa2015-07-10 18:31:53 +0800266func (w *WebSession) getAppAccessKey(token string) error {
zongqiang.zhangb8ab9b42015-07-10 17:45:20 +0800267 type FormJson struct {
Tang Chenge29065c2016-07-14 12:29:42 +0800268 AppID string `json:"app_id"`
269 TermID string `json:"term_id"`
qiaoweica037fa2015-07-10 18:31:53 +0800270 SessionKey string `json:"session_key"`
271 CardKey string `json:"card_key"`
zongqiang.zhangb8ab9b42015-07-10 17:45:20 +0800272 }
273
Tang Chenge29065c2016-07-14 12:29:42 +0800274 uri := fmt.Sprintf("/authservice/getauth/%v", w.AppID)
zongqiang.zhangb8ab9b42015-07-10 17:45:20 +0800275
276 params := make(map[string]string)
Tang Chenge29065c2016-07-14 12:29:42 +0800277 params["term_id"] = w.TermID
qiaoweica037fa2015-07-10 18:31:53 +0800278 params["access_token"] = token
zongqiang.zhangb8ab9b42015-07-10 17:45:20 +0800279 params["timestamp"] = w.GetTimestamp()
280 params["v"] = "1"
qiaoweica037fa2015-07-10 18:31:53 +0800281 params["sign"] = w.Sign(token + params["timestamp"])
282 params["sign_method"] = "HMAC"
zongqiang.zhangb8ab9b42015-07-10 17:45:20 +0800283
qiaoweica037fa2015-07-10 18:31:53 +0800284 r, err := w.DoGet(uri, params)
Tang Cheng55814742015-09-08 17:24:05 +0800285 if r != nil {
286 defer r.Body.Close()
287 }
zongqiang.zhang134f4182016-06-14 15:23:22 +0800288 if err != nil {
289 log.Errorf("err = %v\n", err)
qiaoweica037fa2015-07-10 18:31:53 +0800290 return err
zongqiang.zhangb8ab9b42015-07-10 17:45:20 +0800291 }
zongqiang.zhang134f4182016-06-14 15:23:22 +0800292 if r.StatusCode != 200 {
293 log.Errorf(" errcode = %v\n", r.StatusCode)
294 return errors.New(fmt.Sprintf("code %v", r.StatusCode))
295 }
zongqiang.zhangb8ab9b42015-07-10 17:45:20 +0800296
qiaoweica037fa2015-07-10 18:31:53 +0800297 body, err := ioutil.ReadAll(r.Body)
qiaoweica037fa2015-07-10 18:31:53 +0800298
299 s := &FormJson{}
300 err = json.Unmarshal(body, &s)
zongqiang.zhangb8ab9b42015-07-10 17:45:20 +0800301 if err != nil {
302 log.Errorf("json unmarshal err %v", err)
zongqiang.zhang134f4182016-06-14 15:23:22 +0800303 return err
zongqiang.zhangb8ab9b42015-07-10 17:45:20 +0800304 }
Tang Chenge29065c2016-07-14 12:29:42 +0800305 w.sessionKey = s.SessionKey
qiaoweica037fa2015-07-10 18:31:53 +0800306 return nil
zongqiang.zhangb8ab9b42015-07-10 17:45:20 +0800307}
Tang Cheng26b91152015-07-22 12:26:52 +0800308
Tang Chenge29065c2016-07-14 12:29:42 +0800309// CallYKTApi call ykt api function
Tang Cheng26b91152015-07-22 12:26:52 +0800310func (w *WebSession) CallYKTApi(request *MessageWriter) (*MessageReader, error) {
Tang Chenge29065c2016-07-14 12:29:42 +0800311 callData := request.Serialize()
Tang Cheng26b91152015-07-22 12:26:52 +0800312 params := make(map[string]string)
Tang Chenge29065c2016-07-14 12:29:42 +0800313 params["funcdata"] = callData
Tang Cheng26b91152015-07-22 12:26:52 +0800314 r, err := w.DoPost("/ecardservice/ecardapi", params)
315
Tang Cheng55814742015-09-08 17:24:05 +0800316 if r != nil {
317 defer r.Body.Close()
318 }
Tang Chengf16121a2015-07-27 13:46:14 +0800319 if err != nil {
Tang Cheng26b91152015-07-22 12:26:52 +0800320 log.Errorf(" err = %v\n", err)
321 return nil, err
zongqiang.zhangb8ab9b42015-07-10 17:45:20 +0800322 }
zongqiang.zhangb8ab9b42015-07-10 17:45:20 +0800323
Tang Chengf16121a2015-07-27 13:46:14 +0800324 if r.StatusCode != 200 {
325 return nil, errors.New(fmt.Sprintf("Request StatusCode:%v", r.StatusCode))
326 }
327
Tang Cheng26b91152015-07-22 12:26:52 +0800328 body, err := ioutil.ReadAll(r.Body)
Tang Cheng26b91152015-07-22 12:26:52 +0800329 return NewMessageReader(body), nil
zongqiang.zhangb8ab9b42015-07-10 17:45:20 +0800330}
Tang Chengf16121a2015-07-27 13:46:14 +0800331
Tang Chenge29065c2016-07-14 12:29:42 +0800332// CallService call epay service
Tang Chengf16121a2015-07-27 13:46:14 +0800333func (w *WebSession) CallService(path string, params map[string]interface{},
Tang Chenge29065c2016-07-14 12:29:42 +0800334 signField []string, timeout int) (response *ServiceResponse, err error) {
Tang Chengf16121a2015-07-27 13:46:14 +0800335
Tang Chenge29065c2016-07-14 12:29:42 +0800336 return w.CallService2(path, params, timeout, signField...)
Tang Chengf16121a2015-07-27 13:46:14 +0800337}
338
Tang Chenge29065c2016-07-14 12:29:42 +0800339// CallService2 call epay service
Tang Chengf16121a2015-07-27 13:46:14 +0800340func (w *WebSession) CallService2(path string, params map[string]interface{}, timeout int,
Tang Chenge29065c2016-07-14 12:29:42 +0800341 signField ...string) (response *ServiceResponse, err error) {
Tang Chengf16121a2015-07-27 13:46:14 +0800342 err = nil
Tang Chenge29065c2016-07-14 12:29:42 +0800343 params["app_id"] = w.AppID
344 params["term_id"] = w.TermID
Tang Chengf16121a2015-07-27 13:46:14 +0800345 ts := w.GetTimestamp()
346 params["timestamp"] = ts
347
348 vl := &url.Values{}
349 for k, v := range params {
350 vl.Set(k, fmt.Sprintf("%v", v))
351 }
352
353 sign_data := ""
Tang Chenge29065c2016-07-14 12:29:42 +0800354 for _, k := range signField {
Tang Chengf16121a2015-07-27 13:46:14 +0800355 if v, ok := params[k]; ok {
356 sign_data += fmt.Sprintf("%v", v)
357 }
358 }
Tang Chenge29065c2016-07-14 12:29:42 +0800359 sign_data += ts + w.sessionKey
Tang Chengf16121a2015-07-27 13:46:14 +0800360 vl.Set("sign_method", "HMAC")
Tang Chenge29065c2016-07-14 12:29:42 +0800361 log.Debugf("Sign: key[%v] data[%v]\n", w.sessionKey, sign_data)
362 vl.Set("sign", w.SignWithKey(w.AppSecret, sign_data))
Tang Chengf16121a2015-07-27 13:46:14 +0800363
Tang Chenge29065c2016-07-14 12:29:42 +0800364 full_url := w.BaseURL + path
Tang Chengf16121a2015-07-27 13:46:14 +0800365 log.Debugf("CallService: %v\n", full_url)
Tang Chenga412d202016-01-27 09:24:53 +0800366 var r *goreq.Response
367 r, err = goreq.Request{
368 Uri: full_url,
369 Accept: "application/json",
370 ContentType: "application/x-www-form-urlencoded",
371 Method: "POST",
372 Timeout: time.Duration(timeout) * time.Second,
373 Body: vl.Encode()}.Do()
Tang Chengf16121a2015-07-27 13:46:14 +0800374 if err != nil {
375 log.Errorf("Status=%v, err=%v", r, err)
376 return
377 }
378 if r.StatusCode != 200 {
379 log.Errorf("Request Error %v\n", r.StatusCode)
380 err = errors.New(fmt.Sprintf("Request Error, StatusCode : %v", r.StatusCode))
381 return
382 }
Tang Chenga412d202016-01-27 09:24:53 +0800383 if r.Body != nil {
384 defer r.Body.Close()
385 }
Tang Chengf16121a2015-07-27 13:46:14 +0800386 body, err := ioutil.ReadAll(r.Body)
Tang Chengf16121a2015-07-27 13:46:14 +0800387 var s interface{}
388 err = json.Unmarshal(body, &s)
389 if err != nil {
390 log.Errorf("json unmarshal err %v", err)
391 return
392 }
Tang Chenge29065c2016-07-14 12:29:42 +0800393 response = NewServiceResponseFromJSON(s)
Tang Chengf16121a2015-07-27 13:46:14 +0800394 return
395}