提交 39fd6e02 authored 作者: limeng's avatar limeng

有赞

上级 5b2717f4
package yz
import (
"context"
"github.com/gogf/gf/encoding/gjson"
"github.com/gogf/gf/frame/g"
"github.com/gogf/gf/os/gtime"
"github.com/gogf/gf/util/gconv"
"time"
"fmt"
"bytes"
"net/http"
"log"
"io"
"os"
"io/ioutil"
"mime/multipart"
)
type Config struct {
ApiUrl string
GetTokenUrl string
AppKey string
AppSecret string
GrantId string
}
type CommonRes struct {
Success bool `json:"success"`
Code string `json:"code"`
Message string `json:"message"`
TraceId string `json:"trace_id"`
}
type client struct {
*Config
AccessToken string
}
var server *client
const CacheKey = "yz:token"
const pkgName = "yz"
const authorizeType = "silent"
func New(config *Config) {
_ = gconv.Scan(config, &server)
return
}
//post 请求
func (s *client) post(ctx context.Context, method string, params g.Map) (str string, err error) {
Start := gtime.TimestampMilli()
Request := g.Client()
Request.SetHeader("Content-Type", "application/json")
url := method + "?access_token=" + server.AccessToken
resp, err := Request.Timeout(time.Second*5).Post(url, params)
fmt.Println(url)
defer func() {
_ = resp.Close()
paramStr := gjson.New(params).MustToJsonString()
ctx = context.WithValue(ctx, "Method", "POST")
ctx = context.WithValue(ctx, "URI", url)
if err != nil {
g.Log().Ctx(ctx).Cat(pkgName).Cat("error").Infof("参数【%v】错误【%v】响应时间【%v ms】", paramStr, err.Error(), gtime.TimestampMilli()-Start)
} else {
g.Log().Ctx(ctx).Cat(pkgName).Infof("参数【%v】响应【%v】响应时间【%v ms】", paramStr, str, gtime.TimestampMilli()-Start)
}
}()
if err != nil {
return
}
str = resp.ReadAllString()
return
}
//post 请求
func (s *client) postImg(ctx context.Context, method string, params string) (str string, err error) {
g.Dump(89876)
Start := gtime.TimestampMilli()
url := method + "?access_token=" + server.AccessToken
client := http.Client{}
bodyBuf := &bytes.Buffer{}
bodyWrite := multipart.NewWriter(bodyBuf)
g.Dump(898761)
file, err := os.Open(params)
g.Dump(8987612)
defer file.Close()
if err != nil {
g.Dump(66666)
log.Println("err")
}
// file 为key
g.Dump(89876123)
fileWrite, err := bodyWrite.CreateFormFile("image", params)
_, err = io.Copy(fileWrite, file)
g.Dump(898761234)
if err != nil {
g.Dump(777777)
log.Println("err")
}
bodyWrite.Close() //要关闭,会将w.w.boundary刷写到w.writer中
// 创建请求
g.Dump(8987612345)
contentType := bodyWrite.FormDataContentType()
req, err := http.NewRequest(http.MethodPost, url, bodyBuf)
if err != nil {
g.Dump(888888)
log.Println("err")
}
// 设置头
g.Dump(8987612346)
req.Header.Set("Content-Type", contentType)
resp, err := client.Do(req)
if err != nil {
g.Dump(99999)
log.Println("err")
}
g.Dump(8987612347)
defer func() {
_ = resp.Body.Close()
paramStr := gjson.New(params).MustToJsonString()
ctx = context.WithValue(ctx, "Method", "POST")
ctx = context.WithValue(ctx, "URI", url)
if err != nil {
g.Dump(123456)
g.Log().Ctx(ctx).Cat(pkgName).Cat("error").Infof("参数【%v】错误【%v】响应时间【%v ms】", paramStr, err.Error(), gtime.TimestampMilli()-Start)
} else {
g.Log().Ctx(ctx).Cat(pkgName).Infof("参数【%v】响应【%v】响应时间【%v ms】", paramStr, str, gtime.TimestampMilli()-Start)
}
}()
g.Dump(89876123478)
b, err := ioutil.ReadAll(resp.Body)
if err != nil {
g.Dump(999999888)
log.Println("err")
}
g.Dump(8987612347889)
str = string(b)
return
}
// requestApi 请求
func (s *client) requestApi(ctx context.Context, method string, businessParams g.Map) (str string, err error) {
params, err := s.createPostRequest(ctx, businessParams)
if err != nil {
return
}
urlMethod := s.ApiUrl + method
str, err = s.post(ctx, urlMethod, params)
return
}
// requestApi 请求
func (s *client) requestApiImg(ctx context.Context, method string, businessParams string) (str string, err error) {
_, err = s.createPostRequest(ctx, nil)
if err != nil {
return
}
urlMethod := s.ApiUrl + method
str, err = s.postImg(ctx, urlMethod, businessParams)
return
}
func (s *client) createPostRequest(ctx context.Context, businessParams g.Map) (res g.Map, err error) {
err = s.getAccessToken(ctx)
if err != nil {
return
}
res = g.Map{
"token": s.AccessToken,
}
if businessParams != nil {
for k, v := range businessParams {
res[k] = v
}
}
return
}
package yz
import (
"context"
"encoding/json"
"github.com/gogf/gf/encoding/gjson"
"github.com/gogf/gf/util/gconv"
"github.com/gogf/gf/frame/g"
)
type goodsJD struct {
}
var Goods = goodsJD{}
type AddGoodsReq struct {
Param AddGoodsParam `json:"param"`
}
type ItemDeliveryParam struct {
Postage int `json:"postage"`
DeliverySetting DeliverySetting `json:"delivery_setting"`
}
type DeliverySetting struct {
Express bool `json:"express"`
}
type SkuList struct {
SkuProps []SkuProps `json:"sku_props"`
Price int `json:"price"`
MaxGuidePrice int `json:"max_guide_price"`
CostPrice int `json:"cost_price"`
SkuNo int `json:"sku_no"`
StockNum int `json:"stock_num"`
}
type SkuProps struct {
PropValueName string `json:"prop_value_name"`
PropName string `json:"prop_name"`
PropNameId int `json:"prop_name_id"`
PropValueId int `json:"prop_value_id"`
}
type SkuValueProps struct {
Name string `json:"name"`
ImgId int `json:"img_id"`
Id int `json:"id"`
}
type ItemPriceParam struct {
Origin int `json:"origin"`
CostPrice int `json:"cost_price"`
Price int `json:"price"`
}
type AddGoodsParam struct {
ItemId int `json:"item_id"`
NodeKdtId int `json:"node_kdt_id"`
ItemDeliveryParam ItemDeliveryParam `json:"item_delivery_param"`
ItemWeight int `json:"item_weight"`
ItemNo int `json:"item_no"`
SkuList []SkuList `json:"sku_list"`
Desc string `json:"desc"`
ImageIds []int64 `json:"image_ids"`
SkuValueProps []SkuValueProps `json:"sku_value_props"`
ItemType int `json:"item_type"`
ItemPriceParam ItemPriceParam `json:"item_price_param"`
Title string `json:"title"`
IsDisplay int `json:"is_display"`
Quantity int `json:"quantity"`
HideStock int `json:"hide_stock"`
}
type AddGoodsRes struct {
CommonRes
Data struct {
ItemId int `json:"item_id"`
Alias string `json:"alias"`
} `json:"data"`
}
type UplpadImgReq struct {
Image string `json:"image"`
}
// type UplpadImgRes struct {
// CommonRes
// Data struct {
// ImageId int64 `json:"image_id"`
// } `json:"data"`
// }
type UplpadImgRes struct {
TraceId string `json:"trace_id"`
Code int `json:"code"`
Data struct {
KdtId int `json:"kdt_id"`
ImageUrl string `json:"image_url"`
Width int `json:"width"`
ImageId int64 `json:"image_id"`
Height int `json:"height"`
} `json:"data"`
Success bool `json:"success"`
Message string `json:"message"`
}
// 添加商品
func (*goodsJD) AddGoods(ctx context.Context, req *AddGoodsReq) (res *AddGoodsRes, err error) {
// g.Dump(11111111,req)
// return
method := "youzan.item.add/1.0.1"
param := gconv.Map(req)
result, err := server.requestApi(ctx, method, param)
if err != nil {
return
}
err = gjson.New(result).Scan(&res)
return
}
// 编辑商品
func (*goodsJD) UpdateGoods(ctx context.Context, req *AddGoodsReq) (res *AddGoodsRes, err error) {
method := "youzan.item.incremental.update/1.0.1"
param := gconv.Map(req)
result, err := server.requestApi(ctx, method, param)
if err != nil {
return
}
err = json.Unmarshal([]byte(result), &res)
return
}
// 图片上传
func (*goodsJD) UploadImg(ctx context.Context, req *UplpadImgReq) (res *UplpadImgRes, err error) {
method := "youzan.materials.storage.platform.img.upload/3.0.0"
//param := gconv.Map(req)
//param = map[string]interface{}{
// "image" : req.Image,
//}
result, err := server.requestApiImg(ctx, method, req.Image)
if err != nil {
g.Dump("111111123",err)
return
}
err = json.Unmarshal([]byte(result), &res)
g.Dump("11111112344444",err)
return
}
//type UpDateStockReq struct {
// Quantity string `json:"quantity"`
// ItemId string `json:"item_id"`
// SkuId string `json:"sku_id"`
// Type string `json:"type"`
//}
//type UpDateStockRes struct {
// Code int `json:"code"`
// Data struct {
// IsSuccess bool `json:"is_success"`
// } `json:"data"`
// Success bool `json:"success"`
// Message string `json:"message"`
//}
//// 图片上传
//func (*goodsJD) UpDateStock(ctx context.Context, req *UpDateStockReq) (res *UpDateStockRes, err error) {
// method := "youzan.item.quantity.update/3.0.0"
// param := gconv.Map(req)
// result, err := server.requestApi(ctx, method, param)
// if err != nil {
// return
// }
// err = json.Unmarshal([]byte(result), &res)
// return
//}1
\ No newline at end of file
package yz
import (
"context"
"errors"
"github.com/gogf/gf/encoding/gjson"
"github.com/gogf/gf/frame/g"
"github.com/gogf/gf/os/gtime"
"github.com/gogf/gf/util/gconv"
"github.com/gogf/gf/util/gutil"
)
type getAccessTokenRes struct {
*CommonRes
Data *accessToken `json:"data"`
}
type accessToken struct {
Expires int64 `json:"expires"`
Scope string `json:"scope"`
AccessToken string `json:"access_token"`
AuthorityId string `json:"authority_id"`
}
//getAccessToken 获取token
func (s *client) getAccessToken(ctx context.Context) (err error) {
var token *accessToken
conn := g.Redis().Ctx(ctx).Conn()
defer func() {
_ = conn.Close()
}()
_, _ = conn.DoVar("SELECT", 10)
cache, _ := conn.DoVar("HGETALL", CacheKey)
if !cache.IsEmpty() {
_ = cache.Scan(&token)
if token.Expires > gtime.TimestampMilli() {
s.AccessToken = token.AccessToken
return
}
return s.refreshToken(ctx, token)
}
var params = g.Map{
"client_id": s.AppKey,
"client_secret": s.AppSecret,
"authorize_type": authorizeType,
"grant_id": s.GrantId,
"refresh": false,
}
result, err := s.post(ctx, server.GetTokenUrl, params)
if err != nil {
return
}
var jdRes *getAccessTokenRes
_ = gjson.New(result).Scan(&jdRes)
if jdRes == nil {
err = errors.New("authorize failed,empty response")
return
}
if !jdRes.Success {
err = errors.New(jdRes.Message)
return
}
_, _ = conn.Do("HMSET", append(g.Slice{CacheKey}, gutil.MapToSlice(gconv.Map(jdRes.Data))...)...)
s.AccessToken = jdRes.Data.AccessToken
return
}
//refreshToken 刷新token
func (s *client) refreshToken(ctx context.Context, req *accessToken) (err error) {
_, err = g.Redis().DoVar("DEL", CacheKey)
var params = g.Map{
"client_id": s.AppKey,
"client_secret": s.AppSecret,
"authorize_type": "silent",
"grant_id": s.ApiUrl,
"refresh": true,
}
result, err := s.post(ctx, s.GetTokenUrl, params)
if err != nil {
return
}
var jdRes *getAccessTokenRes
err = gjson.New(result).Scan(&jdRes)
if err != nil {
return
}
if jdRes == nil {
return
}
if !jdRes.Success {
err = errors.New(jdRes.Message)
return
}
conn := g.Redis().Ctx(ctx).Conn()
defer func() {
_ = conn.Close()
}()
_, _ = conn.DoVar("SELECT", 10)
_, _ = conn.Do("HMSET", append(g.Slice{CacheKey}, gutil.MapToSlice(gconv.Map(jdRes.Data))...)...)
s.AccessToken = jdRes.Data.AccessToken
return
}
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论