提交 255d9542 authored 作者: 张立波's avatar 张立波

云众

上级 38abac8c
......@@ -5,20 +5,21 @@ import (
)
const (
Cloud = 1 //云仓
Jd = 2 //京东
Ali = 6 //阿里
Tm = 7 //天猫
Sn = 8 //苏宁
Gome = 10 //国美
Schl = 11 //盛创汇联
Wpc = 12 //唯品会
Ikc = 13 //爱库存
Dwd = 14 //好食期
Itao = 15 //淘特
Hdh = 16 //会订货
TmNew = 17 //新版天猫
AliNew = 18//精选1688
Cloud = 1 //云仓
Jd = 2 //京东
Ali = 6 //阿里
Tm = 7 //天猫
Sn = 8 //苏宁
Gome = 10 //国美
Schl = 11 //盛创汇联
Wpc = 12 //唯品会
Ikc = 13 //爱库存
Dwd = 14 //好食期
Itao = 15 //淘特
Hdh = 16 //会订货
TmNew = 17 //新版天猫
AliNew = 18 //精选1688
Yunzmall = 19
)
var (
......
package yunzmall
import (
"context"
"fmt"
"github.com/gogf/gf/container/garray"
"github.com/gogf/gf/crypto/gmd5"
"github.com/gogf/gf/crypto/gsha1"
"github.com/gogf/gf/encoding/gjson"
"github.com/gogf/gf/frame/g"
"github.com/gogf/gf/os/gtime"
"github.com/gogf/gf/text/gregex"
"github.com/gogf/gf/text/gstr"
"github.com/gogf/gf/util/gconv"
"github.com/gogf/gf/util/grand"
"sort"
"time"
)
type Client struct {
AppKey string
AppSecret string
AccessToken string
DB int
}
var server *Client
const Url = "https://supply.yunzmall.com/supplyapi"
const pkgName = "yunzmall"
const CacheKey = "yunzmall:token"
func New(req *Client) {
server = req
if server.DB == 0 {
server.DB = 10
}
}
// post 请求
func post(ctx context.Context, method string, params g.Map, xToken ...interface{}) (str string, err error) {
Start := gtime.TimestampMilli()
Request := g.Client().ContentJson()
var AppNonce = grand.S(16)
var AppTimestamp = gtime.TimestampStr()
Request.SetHeader("App-Nonce-Str", grand.S(16))
Request.SetHeader("App-Timestamp", gtime.TimestampStr())
if len(xToken) == 0 {
var token string
token, err = Token.Access(ctx)
if err != nil {
return
}
Request.SetHeader("x-token", token)
}
AppSign, err := sign(AppNonce, AppTimestamp, params)
if err != nil {
return
}
Request.SetHeader("App-Sign", AppSign)
resp, err := Request.
Timeout(time.Second*5).
Post(Url+method, params)
//resp.RawDump()
defer func() {
_ = resp.Close()
paramStr := gjson.New(params).MustToJsonString()
ctx = context.WithValue(ctx, "Method", "POST")
ctx = context.WithValue(ctx, "URI", method)
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
}
func sign(nonce string, timestamp string, param g.Map) (res string, err error) {
var keys []string
keys = append(keys, "App-Nonce-Str")
keys = append(keys, "App-Timestamp")
mewparam := gjson.New(param).Map()
mewparam["App-Timestamp"] = timestamp
mewparam["App-Nonce-Str"] = nonce
for k := range mewparam {
keys = append(keys, k)
}
sort.Strings(keys)
var array = garray.New()
for _, v := range keys {
array.Append(fmt.Sprintf("%s=%s", v, gconv.String(mewparam[v])))
}
array.Append(fmt.Sprintf("%s=%s", "appKey", server.AppKey))
array.Append(fmt.Sprintf("%s=%s", "appSecret", server.AppSecret))
var str = array.Join("&")
str, err = gregex.ReplaceString(`\s`, "", str)
if err != nil {
return
}
str = gsha1.Encrypt(str)
str = gmd5.MustEncryptString(str)
res = gstr.ToUpper(str)
return
}
type CommonRes struct {
Code int `json:"code"`
Msg string `json:"msg"`
}
差异被折叠。
差异被折叠。
package yunzmall
import (
"context"
"github.com/gogf/gf/encoding/gjson"
"github.com/gogf/gf/frame/g"
"github.com/gogf/gf/util/gconv"
)
type refundLogic struct {
}
var Refund = refundLogic{}
type RefundBeforeRes struct {
CommonRes
Data map[string]string `json:"data"`
}
func (s refundLogic) Before(ctx context.Context, req string) (res *RefundBeforeRes, err error) {
var method = "/app/afterSales/getAfterSalesTypeNameMap"
result, err := post(ctx, method, g.Map{
"order_item_id": req,
})
if err != nil {
return
}
err = gjson.New(result).Scan(&res)
return
}
type RefundDetailRes struct {
CommonRes
Data struct {
Id int `json:"id"`
Contacts string `json:"contacts"`
Tel string `json:"tel"`
Plane string `json:"plane"`
Country string `json:"country"`
Province int `json:"province"`
City int `json:"city"`
District int `json:"district"`
Address string `json:"address"`
AddressType []string `json:"address_type"`
IsDefault int `json:"is_default"`
SupplierId int `json:"supplier_id"`
ProvinceName struct {
Id int `json:"id"`
ParentId int `json:"parent_id"`
Name string `json:"name"`
Level int `json:"level"`
} `json:"province_name"`
CityName struct {
Id int `json:"id"`
ParentId int `json:"parent_id"`
Name string `json:"name"`
Level int `json:"level"`
} `json:"city_name"`
DistrictName struct {
Id int `json:"id"`
ParentId int `json:"parent_id"`
Name string `json:"name"`
Level int `json:"level"`
} `json:"district_name"`
Supplier struct {
Id int `json:"id"`
Name string `json:"name"`
Supplier string `json:"supplier"`
} `json:"supplier"`
} `json:"data"`
}
// Detail 详情
func (s refundLogic) Detail(ctx context.Context, req string) (res *RefundDetailRes, err error) {
var method = "/app/supplier/findShopAddressByOrderId"
result, err := post(ctx, method, g.Map{
"after_sales_id": req,
})
if err != nil {
return
}
err = gjson.New(result).Scan(&res)
return
}
// Reason 售后原因
func (s refundLogic) Reason(ctx context.Context, afterSaleType, isReceived int) (res *RefundDetailRes, err error) {
var method = "/app/afterSales/reason/list"
result, err := post(ctx, method, g.Map{
"after_sale_type": afterSaleType,
"is_received": isReceived,
})
if err != nil {
return
}
err = gjson.New(result).Scan(&res)
return
}
type RefundCreateReq struct {
OrderId int `json:"order_id,omitempty"` //订单id
ThirdOrderSn string `json:"third_order_sn,omitempty"` //采购端订单号
OrderItemId int `json:"order_item_id"` //子订单id
ReasonType int `json:"reason_type"` //售后原因
Description string `json:"description"` //描述
Reason string `json:"reason"` //售后原因是 其他的的时候填写
RefundType int `json:"refund_type"` //退款还是退货退款
IsReceived int `json:"is_received"` //是否收到货 1是0否
DetailImages []string `json:"detail_images,omitempty"` //图片凭证
RefundWay int `json:"refund_way,omitempty"` //退款方式
Num int `json:"num"` //退款商品个数
BarterSkuId int `json:"barter_sku_id,omitempty"` //换货中台规格id
BarterNum int `json:"barter_num,omitempty"` //换货数量
}
type RefundCreateRes struct {
CommonRes
Data int `json:"data"`
}
// Create 申请售后
func (s refundLogic) Create(ctx context.Context, req RefundCreateReq) (res *RefundCreateRes, err error) {
var method = "/app/afterSales/create"
result, err := post(ctx, method, gconv.Map(req))
if err != nil {
return
}
err = gjson.New(result).Scan(&res)
return
}
package yunzmall
import (
"context"
"github.com/gogf/gf/encoding/gjson"
"github.com/gogf/gf/frame/g"
"github.com/gogf/gf/util/gconv"
)
type storageLogic struct {
}
var Storage = storageLogic{}
// Add 添加选品库商品
func (s storageLogic) Add(ctx context.Context, req interface{}) (res *CommonRes, err error) {
var method = "/app/product/storage/addStorage"
result, err := post(ctx, method, g.Map{
"ids": gconv.Ints(req),
})
if err != nil {
return
}
err = gjson.New(result).Scan(&res)
return
}
// Delete 删除选品库商品
func (s storageLogic) Delete(ctx context.Context, req interface{}) (res *CommonRes, err error) {
var method = "/app/product/storage/deleteStorage"
result, err := post(ctx, method, g.Map{
"ids": gconv.Ints(req),
})
if err != nil {
return
}
err = gjson.New(result).Scan(&res)
return
}
package yunzmall
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"
)
type tokenLogic struct {
}
var Token = tokenLogic{}
type TokenGetRes struct {
Code int `json:"code"`
Data struct {
Token string `json:"token"`
ExpiresAt int64 `json:"expiresAt"`
} `json:"data"`
Msg string `json:"msg"`
}
func (s tokenLogic) Get(ctx context.Context) (res *TokenGetRes, err error) {
var method = "/app/application/getToken"
result, err := post(ctx, method, g.Map{
"app_key": server.AppKey,
"app_secret": server.AppSecret,
}, true)
if err != nil {
return
}
err = gjson.New(result).Scan(&res)
if err != nil {
return
}
return
}
func (s tokenLogic) Refresh(ctx context.Context) (res string, err error) {
var conn = g.Redis().Conn()
defer func() {
_ = conn.Close()
}()
_, _ = conn.DoVar("SELECT", server.DB)
var result *TokenGetRes
result, err = s.Get(ctx)
if err != nil {
err = gerror.New("获取token失败")
return
}
if result.Code != 0 {
err = gerror.New("获取token失败")
return
}
res = result.Data.Token
_, _ = conn.Do("HMSET", CacheKey, "Token", result.Data.Token, "ExpiresAt", result.Data.ExpiresAt)
return
}
type TokenCacheRes struct {
Token string
ExpiresAt int64
}
func (s tokenLogic) Access(ctx context.Context) (res string, err error) {
var conn = g.Redis().Conn()
defer func() {
_ = conn.Close()
}()
_, _ = conn.DoVar("SELECT", server.DB)
cache, _ := conn.DoVar("HGETALL", CacheKey)
g.Log().Line(true).Info(cache.String())
if cache.IsEmpty() {
return s.Refresh(ctx)
}
var cacheRes *TokenCacheRes
_ = gjson.New(cache).Scan(&cacheRes)
if cacheRes.ExpiresAt < gtime.TimestampMilli() {
return s.Refresh(ctx)
}
res = cacheRes.Token
return
}
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论