Sample code for 30+ languages & platforms
Delphi DLL Requires Chilkat v11.0.0+

TikTok Shop Get Categories

See more TikTok Shop Examples

An example showing how to use a TikTok Shops access token in an API call.

Chilkat Delphi DLL Downloads

Delphi DLL
var
success: Boolean;
http: HCkHttp;
jsonToken: HCkJsonObject;
queryParams: HCkJsonObject;
dt: HCkDateTime;
ascending: Boolean;
caseSensitive: Boolean;
appSecret: PWideChar;
path: PWideChar;
sb: HCkStringBuilder;
numParams: Integer;
i: Integer;
crypt: HCkCrypt2;
sig: PWideChar;
resp: HCkHttpResponse;
json: HCkJsonObject;
id: PWideChar;
is_leaf: Boolean;
local_name: PWideChar;
parent_id: PWideChar;
j: Integer;
count_j: Integer;
strVal: PWideChar;
code: Integer;
message: PWideChar;
request_id: PWideChar;
count_i: Integer;

begin
success := False;

//  This example assumes the Chilkat API to have been previously unlocked.
//  See Global Unlock Sample for sample code.

http := CkHttp_Create();

//  It is assumed we previously obtained an OAuth2 access token.
//  This example loads the JSON access token file 
//  saved by this example: Get TikTok Shop OAuth2 Access Token
//  or refrehsed by this example: Get TikTok Shop Refresh OAuth2 Access Token
jsonToken := CkJsonObject_Create();
success := CkJsonObject_LoadFile(jsonToken,'qa_data/tokens/tiktok-shops.json');
if (success <> True) then
  begin
    Memo1.Lines.Add('Failed to load tiktok-shops.json');
    Exit;
  end;

//  Replace values in all caps with your specific values.
//  SHOP_CIPHER and SHOP_ID are returned from this example: Get Authorized Shops
queryParams := CkJsonObject_Create();
CkJsonObject_UpdateString(queryParams,'app_key','APP_KEY');
CkJsonObject_UpdateString(queryParams,'shop_cipher','SHOP_CIPHER');
CkJsonObject_UpdateString(queryParams,'shop_id','SHOP_ID');
dt := CkDateTime_Create();
CkJsonObject_UpdateString(queryParams,'timestamp',CkDateTime__getAsUnixTimeStr(dt,False));
CkJsonObject_UpdateInt(queryParams,'version',202309);

//  Sort the JSON members by member name, in ascending order (A-Z), case sensitive..
ascending := True;
caseSensitive := True;
CkJsonObject_Sort(queryParams,ascending,caseSensitive);

appSecret := 'APP_SECRET';
path := '/product/202309/categories';

//  Build the StringToSign
sb := CkStringBuilder_Create();
CkStringBuilder_Append(sb,appSecret);
CkStringBuilder_Append(sb,path);
numParams := CkJsonObject_getSize(queryParams);
i := 0;
while i < numParams do
  begin
    CkStringBuilder_Append(sb,CkJsonObject__nameAt(queryParams,i));
    CkStringBuilder_Append(sb,CkJsonObject__stringAt(queryParams,i));
    i := i + 1;
  end;

CkStringBuilder_Append(sb,appSecret);

crypt := CkCrypt2_Create();
CkCrypt2_putHashAlgorithm(crypt,'SHA256');
CkCrypt2_putMacAlgorithm(crypt,'HMAC');
CkCrypt2_putEncodingMode(crypt,'hex_lower');
CkCrypt2_SetMacKeyString(crypt,appSecret);

sig := CkCrypt2__macStringENC(crypt,CkStringBuilder__getAsString(sb));

CkJsonObject_UpdateString(queryParams,'access_token',CkJsonObject__stringOf(jsonToken,'data.access_token'));
CkJsonObject_UpdateString(queryParams,'sign',sig);

CkHttp_SetRequestHeader(http,'x-tts-access-token',CkJsonObject__stringOf(jsonToken,'data.access_token'));
CkHttp_SetRequestHeader(http,'content-type','application/json');

resp := CkHttpResponse_Create();
success := CkHttp_HttpParams(http,'GET','https://open-api.tiktokglobalshop.com/product/202309/categories',queryParams,resp);
if (success = False) then
  begin
    Memo1.Lines.Add(CkHttp__lastErrorText(http));
    Exit;
  end;

json := CkJsonObject_Create();
CkHttpResponse_GetBodyJson(resp,json);

Memo1.Lines.Add(IntToStr(CkHttpResponse_getStatusCode(resp)));

code := CkJsonObject_IntOf(json,'code');
message := CkJsonObject__stringOf(json,'message');
request_id := CkJsonObject__stringOf(json,'request_id');
i := 0;
count_i := CkJsonObject_SizeOfArray(json,'data.categories');
while i < count_i do
  begin
    CkJsonObject_putI(json,i);
    id := CkJsonObject__stringOf(json,'data.categories[i].id');
    is_leaf := CkJsonObject_BoolOf(json,'data.categories[i].is_leaf');
    local_name := CkJsonObject__stringOf(json,'data.categories[i].local_name');
    Memo1.Lines.Add('local_name: ' + local_name);
    parent_id := CkJsonObject__stringOf(json,'data.categories[i].parent_id');
    j := 0;
    count_j := CkJsonObject_SizeOfArray(json,'data.categories[i].permission_statuses');
    while j < count_j do
      begin
        CkJsonObject_putJ(json,j);
        strVal := CkJsonObject__stringOf(json,'data.categories[i].permission_statuses[j]');
        j := j + 1;
      end;

    i := i + 1;
  end;

CkHttp_Dispose(http);
CkJsonObject_Dispose(jsonToken);
CkJsonObject_Dispose(queryParams);
CkDateTime_Dispose(dt);
CkStringBuilder_Dispose(sb);
CkCrypt2_Dispose(crypt);
CkHttpResponse_Dispose(resp);
CkJsonObject_Dispose(json);