Skip to content

Commit 4f1acb5

Browse files
committed
feat(tiktokshop): 新增 FBT 相关接口
1 parent 8290570 commit 4f1acb5

23 files changed

Lines changed: 1844 additions & 0 deletions

docs/TikTokGlobalShop/Basic_ModelDefinition.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,13 @@ Notes: The following catalog is consistent with the catalog structure of [TikTok
109109
- Fulfillment Upload Delivery File: `FulfillmentUploadFile`
110110
- Fulfillment Upload Delivery Image: `FulfillmentUploadImage`
111111
- Update Package Delivery Status: `FulfillmentBatchUpdatePackagesDeliveryStatus`
112+
- Fulfillment By TikTok (FBT)
113+
- Get FBT Merchant Onboarded Regions: `FBTGetMerchantOnboardedRegions`
114+
- Get FBT Warehouse List: `FBTGetWarehouses`
115+
- Get Inbound Order: `FBTGetInboundOrders`
116+
- Search FBT Inventory: `FBTGetInventories`
117+
- Search FBT Inventory Record: `FBTGetInventoryRecords`
118+
- Search Goods Info: `FBTGetGoods`
112119
- Logistics
113120
- Get Warehouse List: `LogisticsGetWarehouses`
114121
- Get Global Seller Warehouse: `LogisticsGetGlobalWarehouses`
Lines changed: 150 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,150 @@
1+
using System;
2+
using System.Net.Http;
3+
using System.Threading;
4+
using System.Threading.Tasks;
5+
using Flurl.Http;
6+
7+
namespace SKIT.FlurlHttpClient.ByteDance.TikTokGlobalShop
8+
{
9+
public static class TikTokShopClientExecuteFBTExtensions
10+
{
11+
/// <summary>
12+
/// <para>异步调用 [GET] /fbt/{version}/merchants/onboarded_regions 接口。</para>
13+
/// <para>
14+
/// REF: <br/>
15+
/// <![CDATA[ https://partner.tiktokshop.com/docv2/page/670d583a1ce48d030862011f ]]>
16+
/// </para>
17+
/// </summary>
18+
/// <param name="client"></param>
19+
/// <param name="request"></param>
20+
/// <param name="cancellationToken"></param>
21+
/// <returns></returns>
22+
public static async Task<Models.FBTGetMerchantOnboardedRegionsResponse> ExecuteFBTGetMerchantOnboardedRegionsAsync(this TikTokShopClient client, Models.FBTGetMerchantOnboardedRegionsRequest request, CancellationToken cancellationToken = default)
23+
{
24+
if (client is null) throw new ArgumentNullException(nameof(client));
25+
if (request is null) throw new ArgumentNullException(nameof(request));
26+
27+
IFlurlRequest flurlReq = client
28+
.CreateFlurlRequest(request, HttpMethod.Get, "fbt", request.ApiVersion, "merchants", "onboarded_regions");
29+
30+
return await client.SendFlurlRequesAsJsontAsync<Models.FBTGetMerchantOnboardedRegionsResponse>(flurlReq, data: request, cancellationToken: cancellationToken).ConfigureAwait(false);
31+
}
32+
33+
/// <summary>
34+
/// <para>异步调用 [GET] /fbt/{version}/warehouses 接口。</para>
35+
/// <para>
36+
/// REF: <br/>
37+
/// <![CDATA[ https://partner.tiktokshop.com/docv2/page/670d588b192d3d0308430d56 ]]>
38+
/// </para>
39+
/// </summary>
40+
/// <param name="client"></param>
41+
/// <param name="request"></param>
42+
/// <param name="cancellationToken"></param>
43+
/// <returns></returns>
44+
public static async Task<Models.FBTGetWarehousesResponse> ExecuteFBTGetWarehousesAsync(this TikTokShopClient client, Models.FBTGetWarehousesRequest request, CancellationToken cancellationToken = default)
45+
{
46+
if (client is null) throw new ArgumentNullException(nameof(client));
47+
if (request is null) throw new ArgumentNullException(nameof(request));
48+
49+
IFlurlRequest flurlReq = client
50+
.CreateFlurlRequest(request, HttpMethod.Get, "fbt", request.ApiVersion, "warehouses");
51+
52+
return await client.SendFlurlRequesAsJsontAsync<Models.FBTGetWarehousesResponse>(flurlReq, data: request, cancellationToken: cancellationToken).ConfigureAwait(false);
53+
}
54+
55+
/// <summary>
56+
/// <para>异步调用 [GET] /fbt/{version}/inbound_orders 接口。</para>
57+
/// <para>
58+
/// REF: <br/>
59+
/// <![CDATA[ https://partner.tiktokshop.com/docv2/page/670d585aa88d11032480e0fc ]]>
60+
/// </para>
61+
/// </summary>
62+
/// <param name="client"></param>
63+
/// <param name="request"></param>
64+
/// <param name="cancellationToken"></param>
65+
/// <returns></returns>
66+
public static async Task<Models.FBTGetInboundOrdersResponse> ExecuteFBTGetInboundOrdersAsync(this TikTokShopClient client, Models.FBTGetInboundOrdersRequest request, CancellationToken cancellationToken = default)
67+
{
68+
if (client is null) throw new ArgumentNullException(nameof(client));
69+
if (request is null) throw new ArgumentNullException(nameof(request));
70+
71+
IFlurlRequest flurlReq = client
72+
.CreateFlurlRequest(request, HttpMethod.Get, "fbt", request.ApiVersion, "inbound_orders")
73+
.SetQueryParam("ids", string.Join(",", request.InboundOrderIdList));
74+
75+
return await client.SendFlurlRequesAsJsontAsync<Models.FBTGetInboundOrdersResponse>(flurlReq, data: request, cancellationToken: cancellationToken).ConfigureAwait(false);
76+
}
77+
78+
/// <summary>
79+
/// <para>异步调用 [POST] /fbt/{version}/inventory/search 接口。</para>
80+
/// <para>
81+
/// REF: <br/>
82+
/// <![CDATA[ https://partner.tiktokshop.com/docv2/page/670d5868c78b9802f796ab81 ]]>
83+
/// </para>
84+
/// </summary>
85+
/// <param name="client"></param>
86+
/// <param name="request"></param>
87+
/// <param name="cancellationToken"></param>
88+
/// <returns></returns>
89+
public static async Task<Models.FBTGetInventoriesResponse> ExecuteFBTGetInventoriesAsync(this TikTokShopClient client, Models.FBTGetInventoriesRequest request, CancellationToken cancellationToken = default)
90+
{
91+
if (client is null) throw new ArgumentNullException(nameof(client));
92+
if (request is null) throw new ArgumentNullException(nameof(request));
93+
94+
IFlurlRequest flurlReq = client
95+
.CreateFlurlRequest(request, HttpMethod.Post, "fbt", request.ApiVersion, "inventory", "search")
96+
.SetQueryParam("page_size", request.PageSize)
97+
.SetQueryParam("page_token", request.PageToken);
98+
99+
return await client.SendFlurlRequesAsJsontAsync<Models.FBTGetInventoriesResponse>(flurlReq, data: request, cancellationToken: cancellationToken).ConfigureAwait(false);
100+
}
101+
102+
/// <summary>
103+
/// <para>异步调用 [POST] /fbt/{version}/inventory_records/search 接口。</para>
104+
/// <para>
105+
/// REF: <br/>
106+
/// <![CDATA[ https://partner.tiktokshop.com/docv2/page/670d584ba83c5f030f3071e4 ]]>
107+
/// </para>
108+
/// </summary>
109+
/// <param name="client"></param>
110+
/// <param name="request"></param>
111+
/// <param name="cancellationToken"></param>
112+
/// <returns></returns>
113+
public static async Task<Models.FBTGetInventoryRecordsResponse> ExecuteFBTGetInventoryRecordsAsync(this TikTokShopClient client, Models.FBTGetInventoryRecordsRequest request, CancellationToken cancellationToken = default)
114+
{
115+
if (client is null) throw new ArgumentNullException(nameof(client));
116+
if (request is null) throw new ArgumentNullException(nameof(request));
117+
118+
IFlurlRequest flurlReq = client
119+
.CreateFlurlRequest(request, HttpMethod.Post, "fbt", request.ApiVersion, "inventory_records", "search")
120+
.SetQueryParam("page_size", request.PageSize)
121+
.SetQueryParam("page_token", request.PageToken);
122+
123+
return await client.SendFlurlRequesAsJsontAsync<Models.FBTGetInventoryRecordsResponse>(flurlReq, data: request, cancellationToken: cancellationToken).ConfigureAwait(false);
124+
}
125+
126+
/// <summary>
127+
/// <para>异步调用 [POST] /fbt/{version}/goods/search 接口。</para>
128+
/// <para>
129+
/// REF: <br/>
130+
/// <![CDATA[ https://partner.tiktokshop.com/docv2/page/670d587d6921310398a3af3d ]]>
131+
/// </para>
132+
/// </summary>
133+
/// <param name="client"></param>
134+
/// <param name="request"></param>
135+
/// <param name="cancellationToken"></param>
136+
/// <returns></returns>
137+
public static async Task<Models.FBTGetGoodsResponse> ExecuteFBTGetGoodsAsync(this TikTokShopClient client, Models.FBTGetGoodsRequest request, CancellationToken cancellationToken = default)
138+
{
139+
if (client is null) throw new ArgumentNullException(nameof(client));
140+
if (request is null) throw new ArgumentNullException(nameof(request));
141+
142+
IFlurlRequest flurlReq = client
143+
.CreateFlurlRequest(request, HttpMethod.Post, "fbt", request.ApiVersion, "goods", "search")
144+
.SetQueryParam("page_size", request.PageSize)
145+
.SetQueryParam("page_token", request.PageToken);
146+
147+
return await client.SendFlurlRequesAsJsontAsync<Models.FBTGetGoodsResponse>(flurlReq, data: request, cancellationToken: cancellationToken).ConfigureAwait(false);
148+
}
149+
}
150+
}
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
using System.Collections.Generic;
2+
3+
namespace SKIT.FlurlHttpClient.ByteDance.TikTokGlobalShop.Models
4+
{
5+
/// <summary>
6+
/// <para>表示 [POST] /fbt/{version}/goods/search 接口的请求。</para>
7+
/// </summary>
8+
public class FBTGetGoodsRequest : TikTokShopRequest
9+
{
10+
/// <summary>
11+
/// 获取或设置 API 版本号。
12+
/// <para>默认值:202409</para>
13+
/// </summary>
14+
[Newtonsoft.Json.JsonIgnore]
15+
[System.Text.Json.Serialization.JsonIgnore]
16+
public override int ApiVersion { get; set; } = 202409;
17+
18+
/// <summary>
19+
/// 获取或设置货物 ID 列表。
20+
/// </summary>
21+
[Newtonsoft.Json.JsonProperty("goods_ids")]
22+
[System.Text.Json.Serialization.JsonPropertyName("goods_ids")]
23+
public IList<string>? GoodsIdList { get; set; }
24+
25+
/// <summary>
26+
/// 获取或设置商家自定义货物标识符列表。
27+
/// </summary>
28+
[Newtonsoft.Json.JsonProperty("reference_codes")]
29+
[System.Text.Json.Serialization.JsonPropertyName("reference_codes")]
30+
public IList<string>? ReferenceCodeList { get; set; }
31+
32+
/// <summary>
33+
/// 获取或设置商品 ID 列表。
34+
/// </summary>
35+
[Newtonsoft.Json.JsonProperty("product_ids")]
36+
[System.Text.Json.Serialization.JsonPropertyName("product_ids")]
37+
public IList<string>? ProductIdList { get; set; }
38+
39+
/// <summary>
40+
/// 获取或设置 SKU ID 列表。
41+
/// </summary>
42+
[Newtonsoft.Json.JsonProperty("sku_ids")]
43+
[System.Text.Json.Serialization.JsonPropertyName("sku_ids")]
44+
public IList<string>? SKUIdList { get; set; }
45+
46+
/// <summary>
47+
/// 获取或设置分页每页数量。
48+
/// <para>默认值:10</para>
49+
/// </summary>
50+
[Newtonsoft.Json.JsonIgnore]
51+
[System.Text.Json.Serialization.JsonIgnore]
52+
public int PageSize { get; set; } = 10;
53+
54+
/// <summary>
55+
/// 获取或设置分页游标。
56+
/// </summary>
57+
[Newtonsoft.Json.JsonIgnore]
58+
[System.Text.Json.Serialization.JsonIgnore]
59+
public string? PageToken { get; set; }
60+
}
61+
}

0 commit comments

Comments
 (0)