This commit is contained in:
richboo111
2022-10-14 17:03:57 +08:00
22 changed files with 608 additions and 22 deletions

View File

@@ -0,0 +1,16 @@
package tiktok_api
import "testing"
var token = `{"access_token":"60f530b2-9ab6-4723-b487-c094918f0d21","expires_in":1666257163,"scope":"SCOPE","shop_id":"","shop_name":"小时达开放平台对接专用店","refresh_token":"1220666a-5e88-458c-a8c0-06d949fbbd3f","authority_id":""}`
var a = New("7136048270014416392", "c397aa9f-3927-47c4-8cfe-4d84e02602e0", token)
// 查询售后单详情
func TestAfsOrder(t *testing.T) {
a.QueryAfsOrderDetail("7154266161041899779", true)
}
// 同意/拒绝售后单
func TestAggreOrNotAggreAfs(t *testing.T) {
//a.AfterSaleOperate()
}

View File

@@ -9,13 +9,6 @@ import (
"time"
)
const (
CallbackSuccessCode = 0
CallbackSuccess = "success"
CallbackFailCode = 1000
CallbackFail = "fail"
)
type API struct {
appKey string
appSecret string
@@ -72,7 +65,7 @@ func (a *API) CreateToken(code string) (*doudian_sdk.CreateTokenData, error) {
doudian_sdk.GlobalConfig.AppKey = a.appKey
doudian_sdk.GlobalConfig.AppSecret = a.appSecret
buildParam := &doudian_sdk.BuildAccessTokenParam{
Code: code, // 定死还是自动获取
Code: code,
ShopId: 0,
Config: nil,
}

View File

@@ -2,6 +2,8 @@ package tiktok_api
import (
"fmt"
order_getSettleBillDetailV3_request "git.rosy.net.cn/baseapi/platformapi/tiktok_shop/sdk-golang/api/order_getSettleBillDetailV3/request"
order_logisticsAdd_request "git.rosy.net.cn/baseapi/platformapi/tiktok_shop/sdk-golang/api/order_logisticsAdd/request"
"git.rosy.net.cn/baseapi/utils"
"git.rosy.net.cn/jx-callback/globals"
"testing"
@@ -29,7 +31,8 @@ func TestQueryOrderDetail(t *testing.T) {
func TestRefaseToken(t *testing.T) {
a := New("7136048270014416392", "c397aa9f-3927-47c4-8cfe-4d84e02602e0", "")
a.CreateToken("41155cd5-d30f-4075-9c44-b75ffa1a84ee")
a.CreateToken("bb52688c-7bca-4b64-8747-5258a9a6ba33")
// {"access_token":"a1746210-a8a3-4497-a87b-09d1f10dbb95","expires_in":1665652230,"scope":"SCOPE","shop_id":"","shop_name":"小时达开放平台对接专用店","refresh_token":"c1cf8d88-0983-4f2a-b969-3746fae6b0cd","authority_id":""}
//{"access_token":"37f41ac7-49ac-4848-a0ee-ea86bb0dfd9f","expires_in":519389,"scope":"SCOPE","shop_id":"","shop_name":"抖店开放平台测试专用店","refresh_token":"3dd8f638-fdf1-46e7-b974-88df382f03c6","authority_id" :""}
}
@@ -37,3 +40,53 @@ func TestTimeNow(t *testing.T) {
h, m, s := time.Now().Clock()
fmt.Println(h, m, s)
}
func TestSendGoods(t *testing.T) {
param := &order_logisticsAdd_request.OrderLogisticsAddParam{
OrderId: "4989178132980723098",
Company: "",
CompanyCode: "chengdouruoxi",
LogisticsCode: "4989178132980723098111",
IsRefundReject: false,
IsRejectRefund: false,
SerialNumberList: nil,
AddressId: 0,
StoreId: 63114504,
}
a.OrderDelivering(param)
}
// 创建物流token
func TestCreateExpss(t *testing.T) {
a := NewExpress("7152420904331429407", "cc7ba367-2394-4cbb-81c6-26f0e929d1c6", "")
a.CreateToken()
}
// 同意退货申请
func TestReturnGoodsToWareHouseSuccess(t *testing.T) {
token := `{"access_token":"60f530b2-9ab6-4723-b487-c094918f0d21","expires_in":1666257163,"scope":"SCOPE","shop_id":"","shop_name":"小时达开放平台对接专用店","refresh_token":"1220666a-5e88-458c-a8c0-06d949fbbd3f","authority_id":""}`
a := New("7136048270014416392", "c397aa9f-3927-47c4-8cfe-4d84e02602e0", token)
a.ReturnGoodsToWareHouseSuccess("7154200345302827303")
}
// 获取订单结算信息
func TestGetSettleBillDetailV3(t *testing.T) {
token := `{"access_token":"60f530b2-9ab6-4723-b487-c094918f0d21","expires_in":1666257163,"scope":"SCOPE","shop_id":"","shop_name":"小时达开放平台对接专用店","refresh_token":"1220666a-5e88-458c-a8c0-06d949fbbd3f","authority_id":""}`
a := New("7136048270014416392", "c397aa9f-3927-47c4-8cfe-4d84e02602e0", token)
a.GetSettleBillDetailV3(&order_getSettleBillDetailV3_request.OrderAddressModifyParam{
Size: 100,
StartTime: "2022-10-07 00:00:00",
EndTime: "2022-10-14 00:00:00",
//OrderId: "4980573848886616007",
ProductId: "",
PayType: "",
FlowType: "",
TimeType: "1",
StartIndex: "",
})
}
// 多订单同一个物流包裹
func TestLogisticsAddSinglePack(t *testing.T) {
a.LogisticsAddSinglePack()
}

View File

@@ -0,0 +1,160 @@
package tiktok_api
import (
"encoding/json"
"errors"
logistics_indTrackPush_reqeust "git.rosy.net.cn/baseapi/platformapi/tiktok_shop/sdk-golang/api/logistics_indTrackPush/request"
token_create_request "git.rosy.net.cn/baseapi/platformapi/tiktok_shop/sdk-golang/api/token_create/request"
token_create_response "git.rosy.net.cn/baseapi/platformapi/tiktok_shop/sdk-golang/api/token_create/response"
doudian_sdk "git.rosy.net.cn/baseapi/platformapi/tiktok_shop/sdk-golang/core"
"git.rosy.net.cn/baseapi/utils"
"git.rosy.net.cn/jx-callback/globals"
"sync"
"time"
)
type APIExpress struct {
appKey string
appSecret string
accessToken string
refreshToken string
expiresIn int64 // 当前时间的七天内为有效期
locker sync.RWMutex
accessTokenObj *doudian_sdk.AccessToken // 存储数据库
}
func NewExpress(appKey, appSecret, accessToken string) *APIExpress {
var access *doudian_sdk.AccessToken
doudian_sdk.GlobalConfig.AppKey = appKey
doudian_sdk.GlobalConfig.AppSecret = appSecret
if accessToken != "" {
if err := json.Unmarshal([]byte(accessToken), &access); err != nil {
globals.SugarLogger.Debug("accessToken init err :", err)
return nil
}
api := &APIExpress{
appKey: appKey,
appSecret: appSecret,
accessToken: access.AccessToken,
refreshToken: access.RefreshToken,
expiresIn: access.ExpiresIn,
accessTokenObj: access,
}
if access.ExpiresIn < time.Now().Unix() {
api.RefreshToken()
}
return api
}
return &APIExpress{
appKey: appKey,
appSecret: appSecret,
}
}
// CreateToken 创建token只有第一次授权或者更新授权才需要,其他时候直接刷新就可以啦
func (a *APIExpress) CreateToken() (*token_create_response.TokenCreateData, error) {
request := token_create_request.New()
param := request.GetParams()
param.Code = ""
param.GrantType = "authorization_self"
param.AuthId = TiktokExpressCode
param.AuthSubjectType = "WuLiuShang"
response, err := request.Execute(nil)
if err != nil {
return nil, err
}
if response.Code != RequestSuccessCode {
return nil, errors.New(response.SubMsg)
}
a.accessTokenObj.CreateTokenData = doudian_sdk.CreateTokenData{
AccessToken: response.Data.AccessToken,
ExpiresIn: time.Now().Unix() + response.Data.ExpiresIn,
Scope: response.Data.Scope,
ShopId: utils.Int64ToStr(response.Data.ShopId),
ShopName: response.Data.ShopName,
RefreshToken: response.Data.RefreshToken,
AuthorityId: response.Data.AuthorityId,
}
return response.Data, nil
}
// RefreshToken 刷新token
func (a *APIExpress) RefreshToken() (*doudian_sdk.CreateTokenData, error) {
doudian_sdk.GlobalConfig.AppKey = a.appKey
doudian_sdk.GlobalConfig.AppSecret = a.appSecret
refresh := doudian_sdk.NewRefreshTokenRequest()
refresh.GetParam().RefreshToken = a.refreshToken
refresh.GetParam().GrantType = "refresh_token"
createToken, err := refresh.Execute(a.accessTokenObj)
if err != nil {
return nil, err
}
if createToken.Code != RequestSuccessCode {
return nil, errors.New(createToken.SubMsg)
}
a.accessToken = createToken.Data.AccessToken
a.refreshToken = createToken.Data.RefreshToken
a.expiresIn = time.Now().Unix() + createToken.Data.ExpiresIn
globals.SugarLogger.Debug("===============data", createToken.Data)
// 不要
createToken.Data.ExpiresIn = a.expiresIn
strData, _ := json.Marshal(createToken.Data)
a.accessTokenObj.CreateTokenData = createToken.Data
globals.SugarLogger.Debug("=========", string(strData))
return &createToken.Data, nil
}
// OrderStatusAndPsInfo 三方配送同步骑手位置信息
// 抖音物流信息和抖音小时达完全区分开(这边的appKey和APPSecret完全不同于小时达)
func (a *APIExpress) OrderStatusAndPsInfo(param map[string]interface{}) error {
// 组合参数
request := logistics_indTrackPush_reqeust.New()
psInfo := &logistics_indTrackPush_reqeust.LogisticsIndTrackPushParam{
CurTime: utils.Time2Str(time.Now()),
Company: TiktokExpressCode,
TraceMsgs: nil,
AuthorityId: "",
}
traceMsgs := make([]logistics_indTrackPush_reqeust.TraceMsgList, 0, 1)
traceMsg := logistics_indTrackPush_reqeust.TraceMsgList{
TrackNo: param["third_carrier_order_id"].(string),
Traces: []logistics_indTrackPush_reqeust.TracesList{
{
Opcode: "ORDER_RECEIVED",
OpTime: utils.Time2TimeStr(time.Now()),
Content: param["logistics_context"].(string),
Rider: logistics_indTrackPush_reqeust.ReiderInfo{
Name: param["courier_name"].(string),
Mobile: param["courier_phone"].(string),
},
ThirdPartyCompany: TiktokExpressCode,
ExceptionCode: "",
ExceptionDesc: "",
CancelCode: "",
CancelDesc: "",
},
},
}
traceMsgs = append(traceMsgs, traceMsg)
psInfo.TraceMsgs = traceMsgs
request.Param = psInfo
if a.accessTokenObj == nil || a.accessTokenObj.CreateTokenData.AccessToken == "" {
a.CreateToken()
} else if a.accessTokenObj.CreateTokenData.ExpiresIn < time.Now().Unix() {
a.RefreshToken()
}
result, err := request.Execute(a.accessTokenObj)
if err != nil {
return err
}
if result.Code != RequestSuccessCode {
return errors.New(result.SubMsg)
}
return nil
}

View File

@@ -3,6 +3,7 @@ package tiktok_api
import (
"encoding/json"
"errors"
"fmt"
"git.rosy.net.cn/baseapi"
address_list_request "git.rosy.net.cn/baseapi/platformapi/tiktok_shop/sdk-golang/api/address_list/request"
afterSale_applyMarketAfterSale_request "git.rosy.net.cn/baseapi/platformapi/tiktok_shop/sdk-golang/api/afterSale_ApplyMarketAfterSale/request"
@@ -14,6 +15,7 @@ import (
afterSale_rejectReasonCodeList_response "git.rosy.net.cn/baseapi/platformapi/tiktok_shop/sdk-golang/api/afterSale_rejectReasonCodeList/response"
afterSale_returnGoodsToWareHouseSuccess_request "git.rosy.net.cn/baseapi/platformapi/tiktok_shop/sdk-golang/api/afterSale_returnGoodsToWareHouseSuccess/request"
order_logisticsAdd_request "git.rosy.net.cn/baseapi/platformapi/tiktok_shop/sdk-golang/api/order_logisticsAdd/request"
order_logisticsAddSinglePack_request "git.rosy.net.cn/baseapi/platformapi/tiktok_shop/sdk-golang/api/order_logisticsAddSinglePack/request"
order_orderDetail_request "git.rosy.net.cn/baseapi/platformapi/tiktok_shop/sdk-golang/api/order_orderDetail/request"
order_orderDetail_response "git.rosy.net.cn/baseapi/platformapi/tiktok_shop/sdk-golang/api/order_orderDetail/response"
order_searchList_request "git.rosy.net.cn/baseapi/platformapi/tiktok_shop/sdk-golang/api/order_searchList/request"
@@ -273,7 +275,7 @@ func (a *API) ReturnGoodsToWareHouseSuccess(afsOrderId string) error {
result, err := request.Execute(a.accessTokenObj)
if err != nil {
return err
return err // 202210141114300102101071350D6F3847
}
if result.Code != RequestSuccessCode {
return errors.New(result.SubMsg)
@@ -595,7 +597,34 @@ func (a *API) GetCallbackOrderId(msgId string, data interface{}) (string, *Callb
return "", &CallbackResponse{Code: CallbackSuccessCode, Msg: CallbackSuccess}
}
// OrderStatusAndPsInfo 三方配送同步骑手位置信息
func (a *API) OrderStatusAndPsInfo(param map[string]interface{}) error {
// OrderDelivering 订单发货
func (a *API) OrderDelivering(param *order_logisticsAdd_request.OrderLogisticsAddParam) error {
request := order_logisticsAdd_request.New()
request.Param = param
result, err := request.Execute(a.accessTokenObj)
if err != nil {
return err
}
if result.Code != RequestSuccessCode {
return errors.New(result.SubMsg)
}
return nil
}
// LogisticsAddSinglePack 支持多个订单发同一个物流包裹
func (a *API) LogisticsAddSinglePack() {
request := order_logisticsAddSinglePack_request.New()
request.Param.OrderIdList = []string{"4989180160180927898"}
request.Param.ShippedOrderInfo = []order_logisticsAddSinglePack_request.ShippedOrderInfoItem{
{ShippedOrderId: "4989180160180927898", ShippedNum: 1},
}
request.Param.LogisticsCode = "4989180160180927898fake"
request.Param.RequestId = "1267250f-8b9d-4d9e-9fad-0cd9629c83de"
request.Param.CompanyCode = "dajiangwangluo"
request.Param.StoreId = 63114504
data, err := request.Execute(a.accessTokenObj)
fmt.Println(data)
fmt.Println(err)
}

View File

@@ -1,6 +1,14 @@
package tiktok_api
const RequestSuccessCode = 10000
const TiktokExpressCode = "chengduruoxi"
const (
CallbackSuccessCode = 0
CallbackSuccess = "success"
CallbackFailCode = 1000
CallbackFail = "fail"
)
// 订单消息回调类型(正向订单)
const (

View File

@@ -0,0 +1,22 @@
package tiktok_api
import (
order_getSettleBillDetailV3_request "git.rosy.net.cn/baseapi/platformapi/tiktok_shop/sdk-golang/api/order_getSettleBillDetailV3/request"
"git.rosy.net.cn/baseapi/utils"
"git.rosy.net.cn/jx-callback/globals"
)
// GetSettleBillDetailV3 商家结算账单
// 已结算的订单才会有数据数据T+1生成建议第二天15点之后查询。如因任务积压导致延迟的情况建议重试。
// 1、推荐使用start_index方式查询
func (a *API) GetSettleBillDetailV3(param *order_getSettleBillDetailV3_request.OrderAddressModifyParam) {
request := order_getSettleBillDetailV3_request.New()
request.Param = param
result, err := request.Execute(a.accessTokenObj)
if err != nil {
return
}
globals.SugarLogger.Debugf("======:%s", utils.Format4Output(result, false))
globals.SugarLogger.Debugf("======:%s", err)
}

View File

@@ -37,6 +37,7 @@ func (a *API) UpdateSkuStock(param *sku_syncStock_request.SkuSyncStockParam) err
request := sku_syncStock_request.New()
request.Param = param
resp, err := request.Execute(a.accessTokenObj)
globals.SugarLogger.Debug("======/sku/syncStock:%s", utils.Format4Output(resp, false))
if err != nil {
return err
}
@@ -116,7 +117,7 @@ func (a *API) CreateStoreCommodity(skuParam *product_addV2_request.ProductAddV2P
return nil, err
}
globals.SugarLogger.Debug("=========", utils.Format4Output(result, false))
globals.SugarLogger.Debug("=========/product/addV2", utils.Format4Output(result, false))
if result.Code != RequestSuccessCode {
return nil, errors.New(result.SubMsg)
}

View File

@@ -232,10 +232,7 @@ func TestGetSkuDetail(t *testing.T) {
// 查询商品详情本地商品id
func TestGetSkuDetailLocalId(t *testing.T) {
token := `{"access_token":"a1746210-a8a3-4497-a87b-09d1f10dbb95","expires_in":1665652230,"scope":"SCOPE","shop_id":"","shop_name":"小时达开放平台对接专用店","refresh_token":"c1cf8d88-0983-4f2a-b969-3746fae6b0cd","authority_id":""}`
a := New("7136048270014416392", "c397aa9f-3927-47c4-8cfe-4d84e02602e0", token)
data, err := a.GetSkuDetail("", "")
data, err := a.GetSkuDetail("3576767557912375101", "")
fmt.Println(err)
globals.SugarLogger.Debugf("====%s", utils.Format4Output(data, false))
}

View File

@@ -47,7 +47,7 @@ func TestUploadImg(t *testing.T) {
}
func TestRefundToken(t *testing.T) {
token := `{"access_token":"a1746210-a8a3-4497-a87b-09d1f10dbb95","expires_in":1665652252,"scope":"SCOPE","shop_id":"","shop_name":"小时达开放平台对 接专用店","refresh_token":"c1cf8d88-0983-4f2a-b969-3746fae6b0cd","authorit y_id":""}`
token := `{"access_token":"a1746210-a8a3-4497-a87b-09d1f10dbb95","expires_in":1665652230,"scope":"SCOPE","shop_id":"","shop_name":"小时达开放平台对接专用店","refresh_token":"c1cf8d88-0983-4f2a-b969-3746fae6b0cd","authority_id":""}`
a := New("7136048270014416392", "c397aa9f-3927-47c4-8cfe-4d84e02602e0", token)
a.RefreshToken()