From ab39efe8d0a38378a31a43d023539f2c684f759d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E5=85=89=E6=98=A5?= Date: Thu, 22 Jul 2021 01:41:49 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E6=8B=BC=E5=A4=9A=E5=A4=9A?= =?UTF-8?q?=E6=9C=8D=E5=8A=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- params/params.go | 27 ++++++----- pinduoduo/pinduoduo.go | 93 +++++++++++++++++++++++++++++++++++++ pinduoduo/pinduoduo_test.go | 23 +++++++++ pinduoduo/type/type.go | 6 +++ redis/redis_test.go | 2 +- service/ddk/Ddk.go | 2 +- service/ddk/Ddk_test.go | 7 ++- string/string.go | 4 ++ 8 files changed, 144 insertions(+), 20 deletions(-) create mode 100644 pinduoduo/pinduoduo.go create mode 100644 pinduoduo/pinduoduo_test.go create mode 100644 pinduoduo/type/type.go diff --git a/params/params.go b/params/params.go index c56fedf9..72cc368b 100644 --- a/params/params.go +++ b/params/params.go @@ -2,8 +2,8 @@ package params import ( "encoding/json" + "github.com/nilorg/sdk/convert" "net/url" - "strconv" ) type Params map[string]interface{} @@ -39,19 +39,18 @@ func (p Params) GetQuery() string { return u.Encode() } -func GetParamsString(i interface{}) string { - switch v := i.(type) { +func GetParamsString(src interface{}) string { + switch src.(type) { case string: - return v - case []byte: - return string(v) - case int: - return strconv.Itoa(v) - case bool: - return strconv.FormatBool(v) - default: - bytes, _ := json.Marshal(v) - return string(bytes) + return src.(string) + case int, int8, int32, int64: + case uint8, uint16, uint32, uint64: + case float32, float64: + return convert.ToString(src) } - return "" + data, err := json.Marshal(src) + if err != nil { + panic(err) + } + return string(data) } diff --git a/pinduoduo/pinduoduo.go b/pinduoduo/pinduoduo.go new file mode 100644 index 00000000..e2553e72 --- /dev/null +++ b/pinduoduo/pinduoduo.go @@ -0,0 +1,93 @@ +package pinduoduo + +import ( + "bytes" + "crypto/md5" + "encoding/hex" + "github.com/bitly/go-simplejson" + params2 "gopkg.in/dtapps/go-library.v2/params" + "io" + "io/ioutil" + "net/http" + "net/url" + "sort" + "strconv" + "strings" + "time" +) + +const api = "https://gw-api.pinduoduo.com/api/router" + +// Parameter 参数 +type Parameter map[string]interface{} + +// ParameterEncode 参数 +type ParameterEncode []string + +// PinDuoDuo 公共请求参数 +type PinDuoDuo struct { + ClientId string //必填 POP分配给应用的client_id + ClientSecret string //必填 POP分配给应用的client_secret +} + +func (d *PinDuoDuo) Send(method string, param Parameter) (*simplejson.Json, error) { + param["type"] = method + param.setRequestData(d) + resp, err := http.Post(api, "application/x-www-form-urlencoded;charset=utf-8", strings.NewReader(param.getRequestData())) + if err != nil { + return nil, err + } + defer resp.Body.Close() + + body, _ := ioutil.ReadAll(resp.Body) + respJson, err := simplejson.NewJson(body) + if err != nil { + return nil, err + } + return respJson, nil +} + +// 签名数据 +func sign(params Parameter, clientSecret string) string { + // 参数按照参数名的字典升序排列 + var keys []string + for k := range params { + keys = append(keys, k) + } + sort.Strings(keys) + // 拼接参数 + query := bytes.NewBufferString(clientSecret) + for _, k := range keys { + query.WriteString(k) + query.WriteString(params2.GetParamsString(params[k])) + } + query.WriteString(clientSecret) + // MD5加密 + h := md5.New() + io.Copy(h, query) + // 把二进制转化为大写的十六进制 + return strings.ToUpper(hex.EncodeToString(h.Sum(nil))) +} + +// 设置请求数据 +func (p Parameter) setRequestData(d *PinDuoDuo) { + hh, _ := time.ParseDuration("8h") + loc := time.Now().UTC().Add(hh) + p["timestamp"] = strconv.FormatInt(loc.Unix(), 10) + p["client_id"] = d.ClientId + p["data_type"] = "JSON" + p["version"] = "v1" + // 设置签名 + p["sign"] = sign(p, d.ClientSecret) +} + +// 获取请求数据 +func (p Parameter) getRequestData() string { + // 公共参数 + args := url.Values{} + // 请求参数 + for key, val := range p { + args.Set(key, params2.GetParamsString(val)) + } + return args.Encode() +} diff --git a/pinduoduo/pinduoduo_test.go b/pinduoduo/pinduoduo_test.go new file mode 100644 index 00000000..06a1164e --- /dev/null +++ b/pinduoduo/pinduoduo_test.go @@ -0,0 +1,23 @@ +package pinduoduo + +import ( + _type "gopkg.in/dtapps/go-library.v2/pinduoduo/type" + "log" + "testing" +) + +func TestName(t *testing.T) { + duo := PinDuoDuo{ + ClientId: "", + ClientSecret: "", + } + param := Parameter{ + "keyword": "小米", + } + send, err := duo.Send(_type.GoodsSearch, param) + log.Printf("send:%v\n", send) + if err != nil { + t.Errorf("错误:%v", err) + return + } +} diff --git a/pinduoduo/type/type.go b/pinduoduo/type/type.go new file mode 100644 index 00000000..37dd17af --- /dev/null +++ b/pinduoduo/type/type.go @@ -0,0 +1,6 @@ +package _type + +const ( + GoodsPidGenerate = "pdd.ddk.goods.pid.generate" + GoodsSearch = "pdd.ddk.goods.search" // 多多进宝商品查询 https://jinbao.pinduoduo.com/third-party/api-detail?apiName=pdd.ddk.goods.search +) diff --git a/redis/redis_test.go b/redis/redis_test.go index 1ac5ea38..b0a9586f 100644 --- a/redis/redis_test.go +++ b/redis/redis_test.go @@ -11,7 +11,7 @@ func TestName(t *testing.T) { // 连接 err := InitRedis("127.0.0.1", 6379, "", 2) if err != nil { - panic(err) + t.Errorf("err:%v", err) } jsonSimpleJson() } diff --git a/service/ddk/Ddk.go b/service/ddk/Ddk.go index 934d746d..ed3fb964 100644 --- a/service/ddk/Ddk.go +++ b/service/ddk/Ddk.go @@ -146,7 +146,7 @@ func (p Parameter) getRequestData() string { // 获取签名 func getSign(params Parameter) string { // 获取Key - keys := []string{} + var keys []string for k := range params { keys = append(keys, k) } diff --git a/service/ddk/Ddk_test.go b/service/ddk/Ddk_test.go index c9f62626..57653f65 100644 --- a/service/ddk/Ddk_test.go +++ b/service/ddk/Ddk_test.go @@ -1,7 +1,7 @@ package ddk import ( - "fmt" + "log" "testing" ) @@ -11,7 +11,6 @@ func init() { } func TestName(t *testing.T) { - fmt.Println("Hello World") res, err := Execute("pdd.ddk.goods.recommend.get", Parameter{ "limit": 10, "channel_type": 3, @@ -21,9 +20,9 @@ func TestName(t *testing.T) { "Y9v2lh2s6e1GWdnxwfbZF9sHlepFWs13_JmF4wnW72", }, }) + log.Printf("res:%#v\n", res) if err != nil { - fmt.Printf("错误:%#v\n", err) + t.Errorf("错误:%#v\n", err) } - fmt.Printf("结果:%#v\n", res) } diff --git a/string/string.go b/string/string.go index 714c7d2a..1d360357 100644 --- a/string/string.go +++ b/string/string.go @@ -16,3 +16,7 @@ func HmacSha256Hex(key, strToSign string) string { func ToLower(str string) string { return strings.ToLower(str) } + +func ToUpper(str string) string { + return strings.ToUpper(str) +}