refactor(utility): 重构 tmall API 调用逻辑- 引入 retry 包实现请求重试机制

- 优化错误处理,使用 gerror 包进行错误封装
- 统一请求响应处理,使用指针类型进行空值判断
-调整变量命名,提高代码可读性
This commit is contained in:
danial
2024-11-02 15:54:01 +08:00
parent 0fccd94c16
commit c64382c2c4
3 changed files with 121 additions and 77 deletions

View File

@@ -4,6 +4,8 @@ import (
"context"
"encoding/json"
"errors"
"github.com/duke-git/lancet/v2/pointer"
"github.com/duke-git/lancet/v2/retry"
"github.com/gogf/gf/v2/errors/gerror"
"github.com/gogf/gf/v2/os/glog"
"github.com/gogf/gf/v2/os/gtime"
@@ -23,18 +25,22 @@ func (c *InnerClient) OAuth2Login(ctx context.Context, code string) (res *tmallM
return
}
cli := topsdk.NewDefaultTopClient(cfg.AppKey, cfg.AppSecret, cfg.Gateway, 1000*60*5, 1000*60*5)
retResponse, err := ability304.NewAbility304(&cli).TaobaoTopAuthTokenCreate(&request.TaobaoTopAuthTokenCreateRequest{
Code: &code,
})
if retResponse == nil || err != nil {
err = errors.Join(err, gerror.New("淘宝授权错误"))
return
resp := new(response.TaobaoTopAuthTokenCreateResponse)
if err2 := retry.Retry(func() error {
resp, err = ability304.NewAbility304(&cli).TaobaoTopAuthTokenCreate(&request.TaobaoTopAuthTokenCreateRequest{
Code: &code,
})
if pointer.IsNil(resp) || resp.RequestId == "" || err != nil {
err = gerror.New(err.Error())
}
return err
}, retry.Context(ctx), retry.RetryTimes(5)); err2 != nil {
return nil, errors.Join(err, gerror.New("淘宝授权错误"))
}
glog.Info(ctx, "淘宝授权结果", retResponse)
glog.Info(ctx, "淘宝授权结果", resp)
res = &tmallModel.OAuthResponse{}
if err2 := json.Unmarshal([]byte(retResponse.TokenResult), &res); err2 == nil {
if err2 := json.Unmarshal([]byte(resp.TokenResult), &res); err2 == nil {
_ = cache.NewCache().Set(ctx, cache.TMallGameThirdPartyCacheKeyTMall, *res, time.Duration(res.ExpiresIn)*gtime.S)
} else {
}
return
}
@@ -46,17 +52,17 @@ func (c *InnerClient) OAuth2TokenRefresh(ctx context.Context, refreshToken strin
}
//重试次数
retResponse := &response.TaobaoTopAuthTokenRefreshResponse{}
for range 5 {
if err2 := retry.Retry(func() error {
cli := topsdk.NewDefaultTopClient(cfg.AppKey, cfg.AppSecret, cfg.Gateway, 1000*60*5, 1000*60*5)
retResponse, err = ability304.NewAbility304(&cli).TaobaoTopAuthTokenRefresh(&request.TaobaoTopAuthTokenRefreshRequest{
RefreshToken: &refreshToken,
})
if err == nil || retResponse != nil {
break
if pointer.IsNil(retResponse) || retResponse.RequestId == "" || err != nil {
err = gerror.New(err.Error())
}
}
if retResponse == nil || err != nil {
return nil, errors.Join(err, gerror.New("淘宝授权错误"))
return err
}, retry.Context(ctx), retry.RetryTimes(5)); err2 != nil {
return nil, errors.Join(err, gerror.New("淘宝刷新token错误"))
}
res = &tmallModel.OAuthResponse{}
if err = json.Unmarshal([]byte(retResponse.TokenResult), &res); err == nil {

View File

@@ -5,6 +5,7 @@ import (
"errors"
"fmt"
"github.com/duke-git/lancet/v2/pointer"
"github.com/duke-git/lancet/v2/retry"
"github.com/gogf/gf/v2/errors/gerror"
"github.com/gogf/gf/v2/util/gconv"
"kami/utility/integration/tmall"
@@ -20,14 +21,18 @@ func (c *InnerClient) TradeRatesAdd(ctx context.Context, oid int64) (isSucceed b
if err != nil {
return
}
cli := topsdk.NewDefaultTopClient(cfg.AppKey, cfg.AppSecret, cfg.Gateway, 1000*60*5, 1000*60*5)
result, err := defaultability.NewDefaultability(&cli).TaobaoTraderateExplainAdd(&request.TaobaoTraderateExplainAddRequest{
Oid: gconv.PtrInt64(oid),
Reply: gconv.PtrString("买家爽快💐💐💐"),
}, sessionInfo.AccessToken)
if pointer.IsNil(result) || err != nil {
err = errors.Join(err, gerror.New("淘宝授权错误"))
return
if err2 := retry.Retry(func() error {
cli := topsdk.NewDefaultTopClient(cfg.AppKey, cfg.AppSecret, cfg.Gateway, 1000*60*5, 1000*60*5)
result, err2 := defaultability.NewDefaultability(&cli).TaobaoTraderateExplainAdd(&request.TaobaoTraderateExplainAddRequest{
Oid: gconv.PtrInt64(oid),
Reply: gconv.PtrString("买家爽快💐💐💐"),
}, sessionInfo.AccessToken)
if pointer.IsNil(result) || result.RequestId == "" || err2 != nil {
err2 = errors.Join(err2, gerror.New("淘宝授权错误"))
}
return err2
}, retry.Context(ctx), retry.RetryTimes(5)); err2 != nil {
return isSucceed, errors.Join(err, gerror.New("淘宝评价错误"))
}
isSucceed = true
return
@@ -40,15 +45,19 @@ func (c *InnerClient) SendImageMsg(ctx context.Context, oid int64) (isSucceed bo
if err != nil {
return
}
cli := topsdk.NewDefaultTopClient(cfg.AppKey, cfg.AppSecret, cfg.Gateway, 1000*60*5, 1000*60*5)
result, err := defaultability.NewDefaultability(&cli).TaobaoTmcMessageProduce(&request.TaobaoTmcMessageProduceRequest{
Content: gconv.PtrString(fmt.Sprintf("{\"tid\":2895732958732,\"seller_nick\":\"helloworld\"}")),
Topic: nil,
MediaContent: nil,
}, sessionInfo.AccessToken)
if pointer.IsNil(result) || err != nil {
err = errors.Join(err, gerror.New("淘宝授权错误"))
return
if err2 := retry.Retry(func() error {
cli := topsdk.NewDefaultTopClient(cfg.AppKey, cfg.AppSecret, cfg.Gateway, 1000*60*5, 1000*60*5)
result, err2 := defaultability.NewDefaultability(&cli).TaobaoTmcMessageProduce(&request.TaobaoTmcMessageProduceRequest{
Content: gconv.PtrString(fmt.Sprintf("{\"tid\":2895732958732,\"seller_nick\":\"helloworld\"}")),
Topic: nil,
MediaContent: nil,
}, sessionInfo.AccessToken)
if pointer.IsNil(result) || err2 != nil {
err2 = errors.Join(err, gerror.New("淘宝授权错误"))
}
return err2
}, retry.Context(ctx), retry.RetryTimes(5)); err2 != nil {
return isSucceed, errors.Join(err, gerror.New("淘宝图片消息错误"))
}
isSucceed = true
return

View File

@@ -4,6 +4,7 @@ import (
"context"
"errors"
"github.com/duke-git/lancet/v2/pointer"
"github.com/duke-git/lancet/v2/retry"
"github.com/gogf/gf/v2/errors/gerror"
"github.com/gogf/gf/v2/util/gconv"
"kami/utility/integration/tmall"
@@ -12,6 +13,7 @@ import (
"topsdk/ability648"
"topsdk/ability648/domain"
"topsdk/ability648/request"
"topsdk/ability648/response"
"topsdk/util"
)
@@ -23,14 +25,19 @@ func (c *InnerClient) TBMallTradeGet(ctx context.Context, tid int) (res *domain.
if err != nil {
return
}
cli := topsdk.NewDefaultTopClient(cfg.AppKey, cfg.AppSecret, cfg.Gateway, 1000*60*5, 1000*60*5)
result, err := ability648.NewAbility648(&cli).TaobaoTradeGet(&request.TaobaoTradeGetRequest{
Tid: gconv.PtrInt64(tid),
Fields: &[]string{"tid", "buyer_nick", "type", "status", "buyer_memo", "payment", "end_time", "created", "seller_rate", "buyer_rate", "total_fee", "pay_time", "end_time", "modified", "consign_time", "buyer_memo", "seller_memo", "alipay_no", "buyer_message"},
}, sessionInfo.AccessToken)
if pointer.IsNil(result) || err != nil {
err = errors.Join(err, gerror.New("天猫订单获取错误"))
return
result := new(response.TaobaoTradeGetResponse)
if err2 := retry.Retry(func() error {
cli := topsdk.NewDefaultTopClient(cfg.AppKey, cfg.AppSecret, cfg.Gateway, 1000*60*5, 1000*60*5)
result, err = ability648.NewAbility648(&cli).TaobaoTradeGet(&request.TaobaoTradeGetRequest{
Tid: gconv.PtrInt64(tid),
Fields: &[]string{"tid", "buyer_nick", "type", "status", "buyer_memo", "payment", "end_time", "created", "seller_rate", "buyer_rate", "total_fee", "pay_time", "end_time", "modified", "consign_time", "buyer_memo", "seller_memo", "alipay_no", "buyer_message"},
}, sessionInfo.AccessToken)
if pointer.IsNil(result) || result.RequestId == "" || err != nil {
err = errors.Join(err, gerror.New("天猫订单获取错误"))
}
return err
}, retry.Context(ctx), retry.RetryTimes(5)); err2 != nil {
return nil, errors.Join(err, gerror.New("天猫订单获取错误"))
}
return &result.Trade, nil
}
@@ -47,17 +54,22 @@ func (c *InnerClient) GetTradeGetListByCreatedTime(ctx context.Context, tradeSta
var pageNo int64 = 1
hasNext := true
for hasNext {
result, err2 := ability648.NewAbility648(&cli).TaobaoTradesSoldGet(&request.TaobaoTradesSoldGetRequest{
StartCreated: &startCreated,
Fields: &[]string{"tid", "type", "status", "payment", "oid", "orders"},
PageNo: &pageNo,
Status: gconv.PtrString(tradeStatus),
PageSize: gconv.PtrInt64(100),
UseHasNext: gconv.PtrBool(true),
}, sessionInfo.AccessToken)
if pointer.IsNil(result) || err2 != nil {
err = gerror.Wrap(err2, "淘宝授权错误")
return
result := new(response.TaobaoTradesSoldGetResponse)
if err2 := retry.Retry(func() error {
result, err = ability648.NewAbility648(&cli).TaobaoTradesSoldGet(&request.TaobaoTradesSoldGetRequest{
StartCreated: &startCreated,
Fields: &[]string{"tid", "type", "status", "payment", "oid", "orders"},
PageNo: &pageNo,
Status: gconv.PtrString(tradeStatus),
PageSize: gconv.PtrInt64(100),
UseHasNext: gconv.PtrBool(true),
}, sessionInfo.AccessToken)
if pointer.IsNil(result) || result.RequestId == "" || err != nil {
err = gerror.Wrap(err, "淘宝授权错误")
}
return err
}, retry.Context(ctx), retry.RetryTimes(5)); err2 != nil {
return tradeList, errors.Join(err, gerror.New("淘宝授权错误"))
}
hasNext = result.HasNext
pageNo++ // 页码+1
@@ -78,18 +90,23 @@ func (c *InnerClient) GetTradeGetListByCreatedTimeAndRateStatus(ctx context.Cont
var pageNo int64 = 1
hasNext := true
for hasNext {
result, err2 := ability648.NewAbility648(&cli).TaobaoTradesSoldGet(&request.TaobaoTradesSoldGetRequest{
StartCreated: &startCreated,
Fields: &[]string{"tid", "type", "status", "payment", "oid", "orders"},
PageNo: &pageNo,
RateStatus: gconv.PtrString(rateStatus),
Status: gconv.PtrString(tradeStatus),
PageSize: gconv.PtrInt64(100),
UseHasNext: gconv.PtrBool(true),
}, sessionInfo.AccessToken)
if pointer.IsNil(result) || err2 != nil {
err = gerror.Wrap(err2, "淘宝授权错误")
return
result := new(response.TaobaoTradesSoldGetResponse)
if err2 := retry.Retry(func() error {
result, err = ability648.NewAbility648(&cli).TaobaoTradesSoldGet(&request.TaobaoTradesSoldGetRequest{
StartCreated: &startCreated,
Fields: &[]string{"tid", "type", "status", "payment", "oid", "orders"},
PageNo: &pageNo,
RateStatus: gconv.PtrString(rateStatus),
Status: gconv.PtrString(tradeStatus),
PageSize: gconv.PtrInt64(100),
UseHasNext: gconv.PtrBool(true),
}, sessionInfo.AccessToken)
if pointer.IsNil(result) || result.RequestId == "" || err != nil {
err = gerror.Wrap(err, "淘宝授权错误")
}
return err
}, retry.Context(ctx), retry.RetryTimes(5)); err2 != nil {
return tradeList, errors.Join(err, gerror.New("淘宝授权错误"))
}
hasNext = result.HasNext
pageNo++ // 页码+1
@@ -105,12 +122,18 @@ func (c *InnerClient) VirtualDelivery(ctx context.Context, tid int64) (isSucceed
if err != nil {
return
}
var result *response.TaobaoLogisticsDummySendResponse
cli := topsdk.NewDefaultTopClient(cfg.AppKey, cfg.AppSecret, cfg.Gateway, 1000*60*5, 1000*60*5)
result, err := ability648.NewAbility648(&cli).TaobaoLogisticsDummySend(&request.TaobaoLogisticsDummySendRequest{
Tid: &tid,
}, sessionInfo.AccessToken)
if pointer.IsNil(result) || err != nil {
return
if err2 := retry.Retry(func() error {
result, err = ability648.NewAbility648(&cli).TaobaoLogisticsDummySend(&request.TaobaoLogisticsDummySendRequest{
Tid: &tid,
}, sessionInfo.AccessToken)
if pointer.IsNil(result) || result.RequestId == "" || err != nil {
err = errors.Join(err, gerror.New("淘宝授权错误"))
}
return err
}, retry.Context(ctx), retry.RetryTimes(5)); err2 != nil {
return isSucceed, errors.Join(err, gerror.New("淘宝授权错误"))
}
isSucceed = *result.Shipping.IsSuccess
return
@@ -123,15 +146,21 @@ func (c *InnerClient) TradeRatesGet(ctx context.Context, tid int64) (tradeRate [
if err != nil {
return
}
cli := topsdk.NewDefaultTopClient(cfg.AppKey, cfg.AppSecret, cfg.Gateway, 1000*60*5, 1000*60*5)
result, err := ability648.NewAbility648(&cli).TaobaoTraderatesGet(&request.TaobaoTraderatesGetRequest{
RateType: gconv.PtrString("give"),
Role: gconv.PtrString("buyer"),
Tid: &tid,
PageSize: gconv.PtrInt64(150),
}, sessionInfo.AccessToken)
if pointer.IsNil(result) || err != nil {
return
var result *response.TaobaoTraderatesGetResponse
if err2 := retry.Retry(func() error {
cli := topsdk.NewDefaultTopClient(cfg.AppKey, cfg.AppSecret, cfg.Gateway, 1000*60*5, 1000*60*5)
result, err = ability648.NewAbility648(&cli).TaobaoTraderatesGet(&request.TaobaoTraderatesGetRequest{
RateType: gconv.PtrString("give"),
Role: gconv.PtrString("buyer"),
Tid: &tid,
PageSize: gconv.PtrInt64(150),
}, sessionInfo.AccessToken)
if pointer.IsNil(result) || result.RequestId == "" || err != nil {
err = errors.Join(err, gerror.New("淘宝授权错误"))
}
return err
}, retry.Context(ctx), retry.RetryTimes(5)); err2 != nil {
return tradeRate, errors.Join(err, gerror.New("淘宝授权错误"))
}
tradeRate = result.TradeRates
return