package trenditapi
import (
"crypto/md5"
"encoding/json"
"fmt"
"git.rosy.net.cn/baseapi/platformapi"
"git.rosy.net.cn/baseapi/utils"
"io/ioutil"
r "math/rand"
"net/http"
"strconv"
"strings"
"sync"
"time"
)
type API struct {
locker sync.RWMutex
accessToken string
appID string
appSecret string
client *http.Client
config *platformapi.APIConfig
}
func New(appID, appSecret string, config ...*platformapi.APIConfig) *API {
curConfig := platformapi.DefAPIConfig
if len(config) > 0 {
curConfig = *config[0]
}
return &API{
appID: appID,
appSecret: appSecret,
client: &http.Client{Timeout: curConfig.ClientTimeout},
config: &curConfig,
}
}
//生成BaseReq
func (a *API) GenBaseReq(bizParams interface{}) *BaseReq {
//生成通用参数
uid := utils.Time2Str(time.Now()) + RandString()
timestamp := utils.Int64ToStr(time.Now().Unix())
return &BaseReq{
AppID: a.appID,
Uid: uid,
STime: timestamp,
Sign: a.sign(uid, timestamp, "bizParams"),
}
}
//生成随机字符串
func RandString() string {
bytes := make([]byte, 16)
for i := 0; i < 16; i++ {
b := r.Intn(26) + 65
bytes[i] = byte(b)
}
return string(bytes)
}
func (a *API) sign(uid, timestamp string, param string) (sign string) {
aa := uid + a.appID + timestamp + a.appSecret + param
return fmt.Sprintf("%x", md5.Sum([]byte(aa)))
}
func (a *API) HttpPostJson(url string, data interface{}) *TIResponse {
//序列化参数
b, err := json.Marshal(&data)
if err != nil {
var msg = fmt.Sprintf("json serialize err:%+v", err)
fmt.Println(msg)
result := TIResponse{
HttpStatusCode: 500,
}
return &result
}
fullUrl := utils.GenerateGetURL(BaseUrl, url, nil)
request, err := http.NewRequest(http.MethodPost, fullUrl, strings.NewReader(string(b)))
client := &http.Client{}
timestamp := utils.Int64ToStr(time.Now().Unix())
uid := timestamp + RandString()
sign := a.sign(uid, timestamp, string(b))
request.Header.Set("Content-Type", "application/json;charset=UTF-8")
request.Header.Set("appid", a.appID)
request.Header.Set("uid", uid)
request.Header.Set("stime", timestamp)
request.Header.Set("sign", sign)
resp, err := client.Do(request)
//resp, err := http.Post(utils.GenerateGetURL(BaseUrl, url, nil), "application/json;charset=UTF-8", bytes.NewBuffer(b))
if err != nil {
fmt.Println(err)
}
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
var msg = fmt.Sprintf("post json error:%+v", err)
fmt.Println(msg)
}
result := TIResponse{
HttpStatusCode: resp.StatusCode,
}
var content BaseResp
err = json.Unmarshal(body, &content)
if err == nil {
result.BaseRes = &content
} else {
var msg = fmt.Sprintf("unmarshal body failed, error:%+v", err)
fmt.Println(msg)
}
return &result
}
func StrRepeat(str string, repeatTimes int) string {
return strings.Repeat(str, repeatTimes)
}
func CalcAsciiLenForPrint(data string) int {
return len(data)
}
func FormatPrintOrderItemBig(foodName string, quantity int, price float64) string {
orderNameEmpty := StrRepeat(" ", 8)
quantityStr := strconv.Itoa(quantity)
temprice := price / 100
priceStr := fmt.Sprintf("%.2f", temprice)
subtotalStr := fmt.Sprintf("%.2f", utils.Int2Float64(quantity)*temprice)
result := `` + foodName + "
"
result += `` + orderNameEmpty + "x" + quantityStr + ` `
result += `` + "¥" + priceStr + ` `
result += `` + "¥" + subtotalStr + ``
//result += "
"
return result
}
func FormatPrintOrderItem(foodName string, quantity int, price float64) string {
orderNameEmpty := StrRepeat(" ", 8)
quantityStr := strconv.Itoa(quantity)
temprice := price / 100
priceStr := fmt.Sprintf("%.2f", temprice)
subtotalStr := fmt.Sprintf("%.2f", utils.Int2Float64(quantity)*temprice)
result := foodName + "
"
result += orderNameEmpty + "x" + quantityStr + ` `
result += "¥" + priceStr + ` `
result += "¥" + subtotalStr
result += "
"
return result
}