合并
diff --git a/Gopkg.toml b/Gopkg.toml
new file mode 100644
index 0000000..78f98ab
--- /dev/null
+++ b/Gopkg.toml
@@ -0,0 +1,38 @@
+# Gopkg.toml example
+#
+# Refer to https://golang.github.io/dep/docs/Gopkg.toml.html
+# for detailed Gopkg.toml documentation.
+#
+# required = ["github.com/user/thing/cmd/thing"]
+# ignored = ["github.com/user/project/pkgX", "bitbucket.org/user/project/pkgA/pkgY"]
+#
+# [[constraint]]
+# name = "github.com/user/project"
+# version = "1.0.0"
+#
+# [[constraint]]
+# name = "github.com/user/project2"
+# branch = "dev"
+# source = "github.com/myfork/project2"
+#
+# [[override]]
+# name = "github.com/x/y"
+# version = "2.4.0"
+#
+# [prune]
+# non-go = false
+# go-tests = true
+# unused-packages = true
+
+
+[[constraint]]
+ name = "github.com/Sirupsen/logrus"
+ version = "1.3.0"
+
+[prune]
+ go-tests = true
+ unused-packages = true
+
+[[constraint]]
+ name = "gopkg.in/resty.v1"
+ version = "1.11.0"
diff --git a/go.mod b/go.mod
index aa7a343..db006bb 100644
--- a/go.mod
+++ b/go.mod
@@ -6,5 +6,5 @@
github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8
github.com/sirupsen/logrus v1.3.0
golang.org/x/text v0.3.0 // indirect
- gopkg.in/resty.v1 v1.11.0 // indirect
+ gopkg.in/resty.v1 v1.11.0
)
diff --git a/go.sum b/go.sum
index 6ea7118..55816e9 100644
--- a/go.sum
+++ b/go.sum
@@ -10,8 +10,10 @@
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
golang.org/x/crypto v0.0.0-20180904163835-0709b304e793 h1:u+LnwYTOOW7Ukr/fppxEb1Nwz0AtPflrblfvUudpo+I=
golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
+golang.org/x/net v0.0.0-20181220203305-927f97764cc3 h1:eH6Eip3UpmR+yM/qI9Ijluzb1bNv/cAU/n+6l8tRSis=
golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33 h1:I6FyU15t786LL7oL/hn43zqTuEGr4PN7F4XJ1p4E3Y8=
golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
+gopkg.in/resty.v1 v1.11.0 h1:z5nqGs/W/h91PLOc+WZefPj8rRZe8Ctlgxg/AtbJ+NE=
gopkg.in/resty.v1 v1.11.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo=
diff --git a/webservice.go b/webservice.go
index abf2a17..abcc94d 100644
--- a/webservice.go
+++ b/webservice.go
@@ -1,6 +1,7 @@
package swservice
import (
+ "bytes"
"crypto/hmac"
"crypto/sha1"
"crypto/tls"
@@ -8,10 +9,8 @@
"encoding/json"
"errors"
"fmt"
- "io/ioutil"
"net"
"net/http"
- "net/url"
"strconv"
"strings"
"sync"
@@ -19,8 +18,8 @@
"crypto/x509"
+ "gopkg.in/resty.v1"
log "github.com/sirupsen/logrus"
- "github.com/franela/goreq"
)
var (
@@ -28,6 +27,8 @@
ErrBadCAPEM = errors.New("不正确的PEM文件")
)
+var connectionTimeout = time.Duration(500) * time.Millisecond
+
// WebSession web session object
type WebSession struct {
// AppId app id
@@ -115,23 +116,17 @@
return 0.0
}
-// DoGet send GET request
-func (w *WebSession) DoGet(uri string, params map[string]string,
- timeout int) (*goreq.Response, error) {
+// doGet send GET request
+func (w *WebSession) doGet(uri string, params map[string]string,
+ timeout int) (*resty.Response, error) {
fullURL := w.BaseURL + uri
- vl := url.Values{}
-
- if params != nil {
- for k, v := range params {
- vl.Add(k, v)
- }
- }
- fullURL = fullURL + "?" + vl.Encode()
- return goreq.Request{Uri: fullURL,
- Method: "GET",
- Timeout: time.Duration(timeout) * time.Second}.Do()
+ resty.SetTimeout(time.Duration(timeout) * time.Second)
+ resp, err := resty.R().
+ SetQueryParams(params).
+ Get(fullURL)
+ return resp, err
}
// GetTimestamp get time stamp format 20160103133455
@@ -181,8 +176,8 @@
return &transport
}
-// DoPost send POST request
-func (w *WebSession) DoPost(uri string, param map[string]string) (*goreq.Response, error) {
+// doPost send POST request
+func (w *WebSession) doPost(uri string, param map[string]string) (*resty.Response, error) {
param["app_id"] = w.AppID
param["term_id"] = w.TermID
param["sign_method"] = "HMAC"
@@ -192,19 +187,13 @@
param["sign"] = w.Sign(w.AppID + w.TermID + w.sessionKey + ts)
fullURL := w.BaseURL + uri
- data, err := json.Marshal(param)
- if err != nil {
- return nil, err
- }
- var r *goreq.Response
- r, err = goreq.Request{
- Uri: fullURL,
- Method: "POST",
- ContentType: "application/json",
- Body: data,
- Timeout: time.Duration(3) * time.Second}.Do()
- if err != nil || r.StatusCode != 200 {
- log.Errorf("Status=%v, err=%v", r, err)
+
+ r, err := resty.R().
+ SetHeader("Content-Type", "application/json").
+ SetBody(param).
+ Post(fullURL)
+ if err != nil || r.StatusCode() != 200 {
+ log.Errorf("Status=%v, err=%v", r.StatusCode(), err)
}
return r, err
}
@@ -224,9 +213,6 @@
// NewSession new session object
func NewSession(appid, appsecret, termid, baseurl string, timeout int, sslVerify bool) *WebSession {
- if transport, ok := goreq.DefaultTransport.(*http.Transport); ok {
- transport.TLSClientConfig = nil
- }
return &WebSession{
AppID: appid,
AppSecret: appsecret,
@@ -234,9 +220,7 @@
BaseURL: baseurl,
DefaultTimeout: timeout,
sslVerify: sslVerify,
- httpConnectionPool: sync.Pool{New: func() interface{} {
- return newTransport(baseurl, sslVerify)
- }}}
+ }
}
// NewSessionWithCA new session ca
@@ -246,9 +230,11 @@
if !certs.AppendCertsFromPEM(ca) {
return nil, ErrBadCAPEM
}
- if transport, ok := goreq.DefaultTransport.(*http.Transport); ok {
- transport.TLSClientConfig = &tls.Config{RootCAs: certs}
- }
+
+ resty.SetTLSClientConfig(&tls.Config{
+ InsecureSkipVerify: true,
+ RootCAs: certs,
+ })
return &WebSession{
AppID: appID,
@@ -271,17 +257,16 @@
params := make(map[string]string)
params["term_id"] = w.TermID
- r, err := w.DoGet(uri, params, 5)
+ r, err := w.doGet(uri, params, 5)
if err != nil {
return "", err
}
- if r.StatusCode != 200 {
+ if r.StatusCode() != 200 {
return "", errors.New("请求失败")
}
- body, err := ioutil.ReadAll(r.Body)
- defer r.Body.Close()
+ body := r.Body()
s := &FormJSON{}
err = json.Unmarshal(body, &s)
@@ -310,20 +295,18 @@
params["sign"] = w.Sign(token + params["timestamp"])
params["sign_method"] = "HMAC"
- r, err := w.DoGet(uri, params, 5)
- if r != nil {
- defer r.Body.Close()
- }
+ r, err := w.doGet(uri, params, 5)
if err != nil {
log.Errorf("err = %v\n", err)
return err
}
- if r.StatusCode != 200 {
- log.Errorf(" errcode = %v\n", r.StatusCode)
- return fmt.Errorf("code %v", r.StatusCode)
+
+ if r.StatusCode() != 200 {
+ log.Errorf(" errcode = %v\n", r.StatusCode())
+ return fmt.Errorf("code %v", r.StatusCode())
}
- body, err := ioutil.ReadAll(r.Body)
+ body := r.Body()
s := &FormJSON{}
err = json.Unmarshal(body, &s)
@@ -340,22 +323,18 @@
callData := request.Serialize()
params := make(map[string]string)
params["funcdata"] = callData
- r, err := w.DoPost("/ecardservice/ecardapi", params)
- if r != nil {
- defer r.Body.Close()
- }
+ r, err := w.doPost("/ecardservice/ecardapi", params)
if err != nil {
log.Errorf(" err = %v\n", err)
return nil, err
}
- if r.StatusCode != 200 {
- return nil, fmt.Errorf("Request StatusCode:%v", r.StatusCode)
+ if r.StatusCode() != 200 {
+ return nil, fmt.Errorf("Request StatusCode:%v", r.StatusCode())
}
- body, err := ioutil.ReadAll(r.Body)
- return NewMessageReader(body), nil
+ return NewMessageReader(r.Body()), nil
}
// CallService call epay service
@@ -365,58 +344,61 @@
return w.CallService2(path, params, timeout, signField...)
}
+// SetConnectionTimeout set global connection timeout
+func SetConnectionTimeout(ms int) {
+ connectionTimeout = time.Duration(ms) * time.Millisecond
+ resty.SetTimeout(connectionTimeout)
+}
+
// CallService2 call epay service
func (w *WebSession) CallService2(path string, params map[string]interface{}, timeout int,
signField ...string) (response *ServiceResponse, err error) {
err = nil
- params["app_id"] = w.AppID
- params["term_id"] = w.TermID
- ts := w.GetTimestamp()
- params["timestamp"] = ts
- vl := &url.Values{}
- for k, v := range params {
- vl.Set(k, fmt.Sprintf("%v", v))
+ formData := make(map[string]string)
+ if params != nil {
+ for k, v := range params {
+ formData[k] = fmt.Sprintf("%v", v)
+ }
}
+ formData["app_id"] = w.AppID
+ formData["term_id"] = w.TermID
+ ts := w.GetTimestamp()
+ formData["timestamp"] = ts
signData := ""
for _, k := range signField {
- if v, ok := params[k]; ok {
- signData += fmt.Sprintf("%v", v)
+ if v, ok := formData[k]; ok {
+ signData += v
}
}
signData += ts + w.sessionKey
- vl.Set("sign_method", "HMAC")
log.Debugf("Sign: key[%v] data[%v]\n", w.sessionKey, signData)
- vl.Set("sign", w.SignWithKey(w.AppSecret, signData))
+ formData["sign_method"] = "HMAC"
+ formData["sign"] = w.SignWithKey(w.AppSecret, signData)
fullURL := w.BaseURL + path
log.Debugf("CallService: %v\n", fullURL)
- var r *goreq.Response
- r, err = goreq.Request{
- Uri: fullURL,
- Accept: "application/json",
- ContentType: "application/x-www-form-urlencoded",
- Method: "POST",
- Timeout: time.Duration(timeout) * time.Second,
- Body: vl.Encode()}.Do()
+ r, err := resty.R().
+ SetHeader("Accept", "application/json").
+ SetFormData(formData).
+ Post(fullURL)
if err != nil {
log.Errorf("Status=%v, err=%v", r, err)
return
}
- if r != nil && r.Body != nil {
- defer r.Body.Close()
- }
- if r.StatusCode != 200 {
- log.Errorf("Request Error %v\n", r.StatusCode)
- err = fmt.Errorf("Request Error, StatusCode : %v", r.StatusCode)
+ if r.StatusCode() != 200 {
+ log.Errorf("Request Error %v\n", r.StatusCode())
+ err = fmt.Errorf("Request Error, StatusCode : %v", r.StatusCode())
return
}
- body, err := ioutil.ReadAll(r.Body)
var s interface{}
- err = json.Unmarshal(body, &s)
+ decoder := json.NewDecoder(bytes.NewBuffer(r.Body()))
+ decoder.UseNumber() // 此处能够保证bigint的精度
+ err = decoder.Decode(&s)
+ // err = json.Unmarshal(r.Body(), &s)
if err != nil {
log.Errorf("json unmarshal err %v", err)
return
diff --git a/webservice_test.go b/webservice_test.go
index 00393a2..4c3cb08 100644
--- a/webservice_test.go
+++ b/webservice_test.go
@@ -1,6 +1,7 @@
package swservice
import (
+ "fmt"
"testing"
)
@@ -37,16 +38,38 @@
)
func TestUseHTTP(t *testing.T) {
- uri := "http://vb-docker:8443/epayapi/services"
+ uri := "http://ykt.supwisdom.com:9116/epayapi/services"
session := NewSession(appID, appSecret, termID, uri, 3, true)
err := session.Auth()
if err != nil {
t.Errorf("Auth Error: %v", err)
}
+
+ r, err := session.CallService2("/common/servicecheck",
+ make(map[string]interface{}), 3)
+ if err != nil {
+ t.Errorf("Request Error: %v", err)
+ } else {
+ fmt.Printf("hostdatetime: %v\n", r.GetStrValue("hostdatetime"))
+ }
+
+ r, err = session.CallService2("/v5/manage/pos/gettoken",
+ map[string]interface{}{
+ "devphyid": "30000004",
+ }, 3, "devphyid")
+
+ if err != nil {
+ t.Errorf("Request Error: %v", err)
+ } else if r.GetIntValue("retcode") != 0 {
+ t.Errorf("get device token error, ret=%v", r.GetIntValue("retcode"))
+ } else {
+ fmt.Printf("ret=%v, devtoken: %v\n", r.GetIntValue("retcode"),
+ r.GetStrValue("devtoken"))
+ }
}
func TestUseHTTPS(t *testing.T) {
- uri := "https://vb-docker:8443/epayapi/services"
+ uri := "https://ykt.supwisdom.com/epayapi/services"
session, err := NewSessionWithCA(appID, appSecret, termID, uri, 3, []byte(caPEM))
if err != nil {
t.Error("New Session , ", err)
@@ -60,7 +83,7 @@
}
func TestUseSecureHTTPS(t *testing.T) {
- uri := "https://www.baidu.com"
+ uri := "https://ykt.supwisdom.com/epayapi/services"
session := NewSession(appID, appSecret, termID, uri, 3, true)
err := session.Auth()
if err != nil {