diff --git a/kashangwl/kashangwl.go b/kashangwl/kashangwl.go index 2b94da7d..0784dc18 100644 --- a/kashangwl/kashangwl.go +++ b/kashangwl/kashangwl.go @@ -1,12 +1,13 @@ package kashangwl import ( + "bytes" + "crypto/md5" + "encoding/hex" "encoding/json" - "fmt" "github.com/bitly/go-simplejson" - md52 "gopkg.in/dtapps/go-library.v2/md5" params2 "gopkg.in/dtapps/go-library.v2/params" - string2 "gopkg.in/dtapps/go-library.v2/string" + "io" "io/ioutil" "net/http" "sort" @@ -16,6 +17,12 @@ import ( const api = "http://www.kashangwl.com/api/" +// Parameter 参数 +type Parameter map[string]interface{} + +// ParameterEncode 参数 +type ParameterEncode []string + // KaShangWl 每次请求需传入以下参数 type KaShangWl struct { CustomerId int // 商家编号 @@ -23,26 +30,16 @@ type KaShangWl struct { } // Send 发送 http://cha.kashangwl.com/api-doc/ -func (w *KaShangWl) Send(msg interface{}, url string) (*simplejson.Json, error) { - // 当前时间戳(单位:秒) - timestamp := time.Now().UnixNano() / 1e6 +func (w *KaShangWl) Send(url string, param Parameter) (*simplejson.Json, error) { // 处理数据 - marshal, _ := json.Marshal(msg) - newJson, _ := simplejson.NewJson(marshal) - newJson.Set("customer_id", w.CustomerId) - newJson.Set("timestamp", timestamp) - signStr := sign(newJson, w.CustomerKey) - newJson.Set("sign", signStr) - j, e := newJson.MarshalJSON() - if e != nil { - return nil, e - } - resp, e := http.Post(api+url, "application/json", strings.NewReader(string(j))) + param.setRequestData(w) + // 请求 + resp, e := http.Post(api+url, "application/json", strings.NewReader(param.getRequestData())) if e != nil { return nil, e } defer resp.Body.Close() - + // 返回结果 body, _ := ioutil.ReadAll(resp.Body) respJson, err := simplejson.NewJson(body) if err != nil { @@ -52,21 +49,37 @@ func (w *KaShangWl) Send(msg interface{}, url string) (*simplejson.Json, error) } // md5(key + 参数1名称 + 参数1值 + 参数2名称 + 参数2值...) 加密源串应为{key}customer_id1192442order_id827669582783timestamp1626845767 -func sign(params *simplejson.Json, key string) string { - var dataParams string +func sign(params Parameter, customerKey string) string { // 参数按照参数名的字典升序排列 var keys []string - for k := range params.MustMap() { + for k := range params { keys = append(keys, k) } sort.Strings(keys) // 拼接 - dataParams = fmt.Sprintf("%s%s", dataParams, key) + query := bytes.NewBufferString(customerKey) for _, k := range keys { - dataParams = fmt.Sprintf("%s%s%s", dataParams, k, params2.GetParamsString(params.Get(k))) + query.WriteString(k) + query.WriteString(params2.GetParamsString(params[k])) } // MD5加密 - md5Str := md52.GetMD5Encode(dataParams) - str := string2.ToLower(md5Str) - return str + h := md5.New() + io.Copy(h, query) + return strings.ToLower(hex.EncodeToString(h.Sum(nil))) +} + +// 设置请求数据 +func (p Parameter) setRequestData(w *KaShangWl) { + // 当前时间戳(单位:秒) + timestamp := time.Now().UnixNano() / 1e6 + p["timestamp"] = timestamp + p["customer_id"] = w.CustomerId + // 设置签名 + p["sign"] = sign(p, w.CustomerKey) +} + +// 获取请求数据 +func (p Parameter) getRequestData() string { + j, _ := json.Marshal(p) + return string(j) } diff --git a/kashangwl/kashangwl_test.go b/kashangwl/kashangwl_test.go index 1f1cad60..5269f3cb 100644 --- a/kashangwl/kashangwl_test.go +++ b/kashangwl/kashangwl_test.go @@ -1,21 +1,21 @@ package kashangwl import ( - "gopkg.in/dtapps/go-library.v2/kashangwl/message" - "gopkg.in/dtapps/go-library.v2/kashangwl/url" + _url "gopkg.in/dtapps/go-library.v2/kashangwl/url" "log" "testing" ) func TestName(t *testing.T) { wl := KaShangWl{ - CustomerId: 0000000, - CustomerKey: "xxx", + CustomerId: 0, + CustomerKey: "", } - msg := message.Order{ - OrderId: 827669582783, + + param := Parameter{ + "order_id": 827669582783, } - send, err := wl.Send(msg, url.Order) + send, err := wl.Send(_url.Order, param) log.Printf("send:%s\n", send) if err != nil { t.Errorf("err:%v\n", err) diff --git a/kashangwl/message/message.go b/kashangwl/message/message.go deleted file mode 100644 index f1b8c0f1..00000000 --- a/kashangwl/message/message.go +++ /dev/null @@ -1,30 +0,0 @@ -package message - -type Product struct { - ProductId int `json:"product_id"` //true 商品编号 -} - -// ProductRechargeParams 获取商品的充值参数。 -type ProductRechargeParams struct { - ProductId int `json:"product_id"` //true 商品编号 -} - -// Buy 购买商品(不支持购买选号类型的商品) -type Buy struct { - ProductId int `json:"product_id"` //true 商品编号 - RechargeAccount string `json:"recharge_account"` //false 充值账号 - RechargeTemplateInputItems interface{} `json:"recharge_template_input_items"` //false 模板充值参数([1]见下方说明) - Quantity int `json:"quantity"` //true 购买数量 - NotifyUrl string `json:"notify_url"` //false 异步通知地址 - OuterOrderId string `json:"outer_order_id"` //false 外部订单号 -} - -// Order 获取单个订单信息 -type Order struct { - OrderId int64 `json:"order_id"` //true 订单号 -} - -// Customer 获取商家信息 -type Customer struct { - CustomerId int `json:"customer_id"` //true 商家编号 -} diff --git a/kashangwl/url/url.go b/kashangwl/url/url.go index 77be40c5..a5fa1d0a 100644 --- a/kashangwl/url/url.go +++ b/kashangwl/url/url.go @@ -1,9 +1,9 @@ -package url +package _url const ( - Product = "product" // 获取单个商品信息 - ProductRechargeParams = "product/recharge-params" // 获取商品的充值参数 - Buy = "buy" // 购买商品(不支持购买选号类型的商品) - Order = "order" // 获取单个订单信息 - Customer = "customer" // 获取商家信息 + Product = "product" // 获取单个商品信息 http://cha.kashangwl.com/api-doc/basic/product.html + ProductRechargeParams = "product/recharge-params" // 获取商品的充值参数 http://cha.kashangwl.com/api-doc/basic/product-recharge-params.html + Buy = "buy" // 购买商品(不支持购买选号类型的商品) http://cha.kashangwl.com/api-doc/basic/buy.html + Order = "order" // 获取单个订单信息 http://cha.kashangwl.com/api-doc/basic/order.html + Customer = "customer" // 获取商家信息 http://cha.kashangwl.com/api-doc/basic/customer.html ) diff --git a/library/go.go b/library/go.go index 4013e7ba..34d2377e 100644 --- a/library/go.go +++ b/library/go.go @@ -1,5 +1,5 @@ package library func Version() string { - return "2.0.2" + return "2.0.3" } diff --git a/pinduoduo/pinduoduo.go b/pinduoduo/pinduoduo.go index e2553e72..80b50782 100644 --- a/pinduoduo/pinduoduo.go +++ b/pinduoduo/pinduoduo.go @@ -31,14 +31,16 @@ type PinDuoDuo struct { } 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 {