1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
package wpc
import (
"context"
"crypto/hmac"
"crypto/md5"
"encoding/hex"
"github.com/gogf/gf/container/garray"
"github.com/gogf/gf/encoding/gjson"
"github.com/gogf/gf/frame/g"
"github.com/gogf/gf/os/gtime"
"github.com/gogf/gf/text/gstr"
"github.com/gogf/gf/util/gconv"
"net/url"
"time"
)
type Config struct {
ApiUrl string
AppKey string
UserNumber string
AppSecret string
AccessToken string
}
type QueryParam struct {
AccessToken string `json:"accessToken"`
AppKey string `json:"appKey"`
Format string `json:"format"`
Method string `json:"method"`
Service string `json:"service"`
Timestamp int64 `json:"timestamp"`
Version string `json:"version"`
}
var server *Config
const service = "com.vip.wpc.ospservice.vop.WpcVopOspService"
const version = "1.0.0"
const format = "json"
const pkgName = "wpc"
func New(config *Config) {
server = config
return
}
func getQueryParam(method string) (res *QueryParam) {
return &QueryParam{
Service: service,
Method: method,
Version: version,
Timestamp: gtime.Timestamp(),
Format: format,
AppKey: server.AppKey,
AccessToken: server.AccessToken,
}
}
func sign(param *QueryParam, req string) string {
Map := gjson.New(param).Map()
var keys = garray.NewStrArray()
for k := range Map {
keys.Append(k)
}
keys.Sort()
var signStr string
u := url.Values{}
for _, v := range keys.Slice() {
if val := gconv.String(Map[v]); val != "" {
signStr += v
signStr += val
u.Set(v, val)
}
}
signStr += req
h := hmac.New(md5.New, []byte(server.AppSecret))
h.Write([]byte(signStr))
u.Set("sign", gstr.ToUpper(hex.EncodeToString(h.Sum([]byte("")))))
return u.Encode()
}
func post(ctx context.Context, method string, req interface{}) (res string, err error) {
Start := gtime.TimestampMilli()
var Query = getQueryParam(method)
paramStr := gjson.New(req).MustToJsonString()
Url := server.ApiUrl + "?" + sign(Query, paramStr)
Request := g.Client()
Request.SetHeader("Content-Type", "application/json")
resp, err := Request.Timeout(time.Second*5).Post(Url, gjson.New(req).MustToJsonString())
defer func() {
_ = resp.Close()
ctx = context.WithValue(ctx, "Method", "POST")
ctx = context.WithValue(ctx, "URI", method)
if err != nil {
g.Log().Ctx(ctx).Cat(pkgName).Cat("error").Infof("参数【%v】错误【%v】响应时间【%v】", paramStr, err.Error(), gtime.TimestampMilli()-Start)
} else {
g.Log().Ctx(ctx).Cat(pkgName).Infof("参数【%v】响应【%v】响应时间【%v】", paramStr, res, gtime.TimestampMilli()-Start)
}
}()
res = resp.ReadAllString()
return
}