提交 0d1a279a authored 作者: 张立波's avatar 张立波

jst

上级 a21be20e
package jst
import (
"context"
"github.com/gogf/gf/container/garray"
"github.com/gogf/gf/crypto/gmd5"
"github.com/gogf/gf/encoding/gjson"
"github.com/gogf/gf/frame/g"
"github.com/gogf/gf/os/gtime"
"github.com/gogf/gf/text/gstr"
"github.com/gogf/gf/util/gconv"
"time"
)
type Config struct {
AppKey string
AppSecret string
ApiUrl string
Env bool
}
type CommonReq struct {
AppKey string `json:"app_key"`
AccessToken string `json:"access_token"`
Timestamp string `json:"timestamp"`
Charset string `json:"charset"`
Version string `json:"version"`
Biz string `json:"biz"`
}
type CommonRes struct {
Msg string `json:"msg"`
Code int `json:"code"`
RequestId string `json:"request_id"`
}
const (
CacheKey = "jst:token"
PkgName = "jst"
Test = "https://dev-apijushuitan.com/"
Pro = "https://openapi.jushuitan.com/"
)
var server *Config
func New(req *Config) {
if req.Env {
req.ApiUrl = Test
} else {
req.ApiUrl = Pro
}
server = req
}
func post(ctx context.Context, method string, req interface{}) (res string, err error) {
Start := gtime.TimestampMilli()
Url := server.ApiUrl + method
request := gjson.New(req)
err = request.Set("version", 2)
err = request.Set("sign", sign(request.Map()))
if err != nil {
return
}
Request := g.Client()
Request.SetHeader("Content-Type", "application/x-www-form-urlencoded")
resp, err := Request.Timeout(time.Second*5).Post(Url, request.Map())
defer func() {
_ = resp.Close()
paramStr := request.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】", paramStr, err.Error(), gtime.TimestampMilli()-Start)
} else {
g.Log().Ctx(ctx).Cat(PkgName).Infof("参数【%v】响应【%v】响应时间【%v】", paramStr, res, gtime.TimestampMilli()-Start)
}
}()
res = resp.ReadAllString()
return
}
func sign(req interface{}) (res string) {
param := gconv.MapStrStr(req)
var keys = garray.NewStrArray()
for key := range param {
keys.Append(key)
}
for _, key := range keys.Sort().Slice() {
if key == "sign" {
continue
}
res += key
res += param[key]
}
return gstr.ToLower(gmd5.MustEncryptString(server.AppSecret + res))
}
func newBody(ctx context.Context) (res *CommonReq, err error) {
token, err := Token.Get(ctx)
if err != nil {
return
}
res = &CommonReq{
AppKey: server.AppKey,
AccessToken: token,
Timestamp: gtime.TimestampStr(),
Charset: "utf-8",
Version: "2",
}
return
}
package jst
import (
"context"
"github.com/gogf/gf/encoding/gjson"
)
type categoryLogic struct {
}
var Category = categoryLogic{}
type CategoryQueryReq struct {
Index int `json:"page_index"` //第几页
Size int `json:"page_size"` //每页记录数
Begin string `json:"modified_begin,omitempty"` //修改开始时间 2020-01-1218:34:13
End string `json:"modified_end,omitempty"` //修改结束时间 2020-01-1218:34:13
CId []string `json:"c_ids,omitempty"` //类目id集合
PId []string `json:"parent_c_ids,omitempty"` //父级类目id集合
}
type CategoryQueryRes struct {
CommonRes
Data struct {
Datas interface{} `json:"datas"`
RequestId interface{} `json:"requestId"`
PageIndex int `json:"page_index"`
HasNext bool `json:"has_next"`
DataCount int `json:"data_count"`
PageCount int `json:"page_count"`
PageSize int `json:"page_size"`
} `json:"data"`
}
func (s *categoryLogic) Query(ctx context.Context, req CategoryQueryReq) (res *CategoryQueryRes, err error) {
var method = "open/category/query"
body, err := newBody(ctx)
if err != nil {
return
}
body.Biz = gjson.New(req).MustToJsonString()
result, err := post(ctx, method, body)
if err != nil {
return
}
err = gjson.New(result).Scan(&res)
return
}
package jst
import (
"context"
"github.com/gogf/gf/encoding/gjson"
)
type shopLogic struct {
}
var Shop = shopLogic{}
type ShopQueryReq struct {
Index int `json:"page_index"` //第几页
Size int `json:"page_size"` //每页记录数
ID []int `json:"shop_ids,omitempty"` //店铺编码
}
type ShopQueryRes struct {
CommonRes
}
func (s *shopLogic) Query(ctx context.Context, req ShopQueryReq) (res *ShopQueryRes, err error) {
var method = "open/category/query"
body, err := newBody(ctx)
if err != nil {
return
}
body.Biz = gjson.New(req).MustToJsonString()
result, err := post(ctx, method, body)
if err != nil {
return
}
err = gjson.New(result).Scan(&res)
return
}
package jst
import (
"context"
"github.com/gogf/gf/encoding/gjson"
)
type supplierLogic struct {
}
var Supplier = supplierLogic{}
type SupplierQueryReq struct {
PageNum int `json:"page_num"` //页数
PageSize int `json:"page_size"` //每页数量,最大100
SupplierCoId string `json:"supplier_co_id,omitempty"` //供应商编号
Status int `json:"status,omitempty"` //合作状态-0:待授权;1:待审核;2:合作中;3:已拒绝;4:已终止
CoName string `json:"co_name,omitempty"` //供应商名称
}
type SupplierQueryRes struct {
CommonRes
Data struct {
Total int `json:"total"`
SupplierVos []struct {
SupplierCoId string `json:"supplier_co_id"`
CoName string `json:"co_name"`
Status int `json:"status"`
} `json:"supplier_vos"`
} `json:"data"`
}
func (s *supplierLogic) Query(ctx context.Context, req SupplierQueryReq) (res *SupplierQueryRes, err error) {
var method = "open/api/company/inneropen/partner/channel/querymysupplier"
body, err := newBody(ctx)
if err != nil {
return
}
body.Biz = gjson.New(req).MustToJsonString()
result, err := post(ctx, method, body)
if err != nil {
return
}
err = gjson.New(result).Scan(&res)
return
}
type SupplierGoodsReq struct {
SupplierCoId string `json:"supplier_co_id"`
PageNum int `json:"page_num"`
PageSize int `json:"page_size"`
SkuType string `json:"sku_type,omitempty"`
EndTime string `json:"end_time,omitempty"`
StockEnd int `json:"stock_end,omitempty"`
ItemName string `json:"item_name,omitempty"`
BrandName string `json:"brand_name,omitempty"`
StyleCodes string `json:"style_codes,omitempty"`
ChildItemCodes string `json:"child_item_codes,omitempty"`
AscOrDesc bool `json:"asc_or_desc,omitempty"`
StartTime string `json:"start_time,omitempty"`
ItemCodes string `json:"item_codes,omitempty"`
StockStart int `json:"stock_start,omitempty"`
SkuCode string `json:"sku_code,omitempty"`
OrderByKey int `json:"order_by_key,omitempty"`
}
type SupplierGoodsRes struct {
CommonRes
Data struct {
Total int `json:"total"`
HasNext bool `json:"has_next"`
List []struct {
ItemCode string `json:"item_code"`
Created string `json:"created"`
Weight float64 `json:"weight"`
StyleCode string `json:"style_code"`
BrandName string `json:"brand_name"`
ItemName string `json:"item_name"`
SupplyPrice float64 `json:"supply_price"`
Pic string `json:"pic"`
SalePrice float64 `json:"sale_price"`
StockStr string `json:"stock_str"`
PropertiesValue string `json:"properties_value"`
BasePrice float64 `json:"base_price"`
Stock int `json:"stock"`
} `json:"list"`
} `json:"data"`
}
func (s *supplierLogic) Goods(ctx context.Context, req SupplierGoodsReq) (res *SupplierGoodsRes, err error) {
var method = "open/api/goods/inneropen/supplier/goods/querydiserpgoodsdata"
body, err := newBody(ctx)
if err != nil {
return
}
body.Biz = gjson.New(req).MustToJsonString()
result, err := post(ctx, method, body)
if err != nil {
return
}
err = gjson.New(result).Scan(&res)
return
}
package jst
import (
"context"
"github.com/gogf/gf/encoding/gjson"
"github.com/gogf/gf/errors/gerror"
"github.com/gogf/gf/frame/g"
"github.com/gogf/gf/os/gtime"
"github.com/gogf/gf/util/gconv"
"github.com/gogf/gf/util/grand"
"github.com/gogf/gf/util/gutil"
)
type tokenLogic struct {
}
var Token = tokenLogic{}
type TokenInitReq struct {
AppKey string `json:"app_key"`
Timestamp string `json:"timestamp"`
GrantType string `json:"grant_type"`
Charset string `json:"charset"`
Code string `json:"code"`
}
type TokenInitRes struct {
CommonRes
Data struct {
AccessToken string `json:"access_token"`
ExpiresIn int64 `json:"expires_in"`
RefreshToken string `json:"refresh_token"`
Scope string `json:"scope"`
} `json:"data"`
}
func (s *tokenLogic) Init(ctx context.Context) (res *TokenInitRes, err error) {
var method = "openWeb/auth/getInitToken"
var request = TokenInitReq{
AppKey: server.AppKey,
Timestamp: gtime.TimestampStr(),
GrantType: "authorization_code",
Charset: "utf-8",
Code: grand.S(6),
}
result, err := post(ctx, method, request)
if err != nil {
return
}
err = gjson.New(result).Scan(&res)
if err != nil {
return
}
conn := g.Redis().Ctx(ctx).Conn()
defer func() {
_ = conn.Close()
}()
_, _ = conn.DoVar("SELECT", 10)
var token = new(TokenCache)
token.AccessToken = res.Data.AccessToken
token.RefreshToken = res.Data.RefreshToken
token.Expires = gtime.Timestamp() + res.Data.ExpiresIn
_, _ = conn.Do("HMSET", append(g.Slice{CacheKey}, gutil.MapToSlice(gconv.Map(token))...)...)
return
}
type TokenRefreshReq struct {
AppKey string `json:"app_key"`
Timestamp string `json:"timestamp"`
GrantType string `json:"grant_type"`
Charset string `json:"charset"`
Code string `json:"code"`
RefreshToken string `json:"refresh_token"`
Scope string `json:"scope"`
}
type TokenRefreshRes struct {
CommonRes
Data struct {
AccessToken string `json:"access_token"`
ExpiresIn int64 `json:"expires_in"`
RefreshToken string `json:"refresh_token"`
Scope string `json:"scope"`
} `json:"data"`
}
func (s *tokenLogic) Refresh(ctx context.Context, req string) (res *TokenRefreshRes, err error) {
var method = "openWeb/auth/refreshToken"
var request = TokenRefreshReq{
AppKey: server.AppKey,
Timestamp: gtime.TimestampStr(),
GrantType: "refresh_token",
Charset: "utf-8",
Code: grand.S(6),
RefreshToken: req,
Scope: "all",
}
result, err := post(ctx, method, request)
if err != nil {
return
}
err = gjson.New(result).Scan(&res)
if err != nil {
return
}
if res.Code != 0 {
err = gerror.New("获取token失败")
return
}
conn := g.Redis().Ctx(ctx).Conn()
defer func() {
_ = conn.Close()
}()
_, _ = conn.DoVar("SELECT", 10)
var token = new(TokenCache)
token.AccessToken = res.Data.AccessToken
token.RefreshToken = res.Data.RefreshToken
token.Expires = gtime.Timestamp() + res.Data.ExpiresIn
_, _ = conn.Do("HMSET", append(g.Slice{CacheKey}, gutil.MapToSlice(gconv.Map(token))...)...)
return
}
type TokenCache struct {
AccessToken string
RefreshToken string
Expires int64
}
func (s *tokenLogic) Get(ctx context.Context) (res string, err error) {
var token *TokenCache
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.Timestamp() {
res = token.AccessToken
return
} else {
var refresh *TokenRefreshRes
refresh, err = s.Refresh(ctx, token.RefreshToken)
if err != nil {
return
}
res = refresh.Data.AccessToken
return
}
}
var init *TokenInitRes
init, err = s.Init(ctx)
if err != nil {
return
}
res = init.Data.AccessToken
return
}
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论