You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
jcook-sdk/api/rest/base.go

141 lines
3.0 KiB

package rest
import (
"encoding/json"
"fmt"
"git.oa00.com/go/jcook-sdk/util/http"
"git.oa00.com/go/jcook-sdk/util/security"
"github.com/mitchellh/mapstructure"
"net/url"
"strings"
"time"
)
type Requester interface {
GetApiName() string
GetRespObj() interface{}
GetRespName() string
}
const UnKnow = "UnKnow"
type SkuParam struct {
SkuID string `json:"skuId"`
SkuPrice float64 `json:"skuPrice"`
Quantity uint `json:"quantity"`
SkuName string `json:"skuName"`
}
type Address struct {
CityID uint `json:"cityId"`
CountyID uint `json:"countyId"`
ProvinceID uint `json:"provinceId"`
TownID uint `json:"townId"`
FullAddress string `json:"fullAddress"`
AddressDetail string `json:"addressDetail"`
}
type CtpProtocol struct {
AppKey string `json:"appKey"`
ChannelID uint `json:"channelId"`
CustomerID uint `json:"customerId"`
TraceID string `json:"traceId"`
OpName string `json:"opName"`
}
type Response struct {
Result struct {
ErrCode uint `json:"errCode"`
ErrMsg string `json:"errMsg"`
Success bool `json:"success"`
Data interface{} `json:"data"`
} `json:"result"`
}
const (
PAppKey = "app_key"
PApi = "method"
PAccessToken = "access_token"
PVersion = "v"
PFormat = "format"
PTimestamp = "timestamp"
PSign = "sign"
PJsonParamKey = "360buy_param_json"
PCode = "code"
PSubCode = "sub_code"
PMsg = "msg"
PSubMsg = "sub_msg"
Rest = "https://api.jd.com/routerjson"
Version = "2.0"
Format = "json"
ResponseSuffix = "_responce"
)
type Client struct {
AppKey string
AppSecret string
AccessKey string
OpName string
Debug bool
}
func NewClient(appKey, AppSecret, AccessKey, OpName string, debug bool) *Client {
return &Client{
AppKey: appKey,
AppSecret: AppSecret,
AccessKey: AccessKey,
OpName: OpName,
Debug: debug,
}
}
func (c *Client) Exec(r Requester) (interface{}, error) {
j, _ := json.Marshal(&r)
jsonParams := string(j)
t := time.Now().Format("2006-01-02 15:04:05")
data := map[string]string{
PAppKey: c.AppKey,
PApi: r.GetApiName(),
PAccessToken: c.AccessKey,
PVersion: Version,
PFormat: Format,
PTimestamp: t,
PJsonParamKey: jsonParams,
}
sign := security.Md5OrderlyWithSecret(c.AppSecret, data)
data[PSign] = sign
params := url.Values{}
for key, value := range data {
params.Add(key, value)
}
resp, err := http.JGet(Rest, params, nil)
if err != nil {
return nil, err
}
if !strings.Contains(string(resp), r.GetRespName()) {
return nil, fmt.Errorf("system err: %s", string(resp))
}
//fmt.Println(string(resp))
var temp map[string]interface{}
err = json.Unmarshal(resp, &temp)
if err != nil {
return nil, err
}
if c.Debug {
fmt.Println(temp)
}
result := temp[r.GetRespName()]
response := r.GetRespObj()
if err = mapstructure.Decode(result, &response); err != nil {
return nil, err
}
return response, err
}