API Tiktok's API «Подпись» - это кошмар, и я не могу найти абсолютно никакой информации об этом, кроме их хромой документации, связанной ниже, где пример написан в «Голанг» - что бы ни было, черт возьми, лол < /p>
Мне удалось собрать код шифрования в две строки PHP (см. Ниже), но запутанная часть для меня - шаг 5 из этих инструкций по подписи, где он говорит О передаче корпуса: < /p>
", если контент заголовка запроса_тип не является Multipart /Form-Data, добавьте корпус к концу" < /p>
< /blockquote>
тело? Какое тело ?? Из запроса скручивания я еще даже не сделал ??? Я так потерян на этом шаге, но это необходимо для получения запросов, по -видимому, и, вероятно, почему моя подпись всегда возвращается как недействительная от API. com/docv2/page/64f199709495ef0281851fd0
php код, где $ input является конкатенированной строкой в соответствии с документацией, без призрачной части «корпуса» на шаге 5.
$hmac = hash_hmac('sha256', $input, $secretKey, true);
$urlSafeEncoded = urlencode(rtrim(strtr(base64_encode($hmac), '+/', '-_'), '='));
Надеюсь, кто -то здесь имеет опыт работы с этим хаосом и может понять, что они означают под телом.
Используя пример почтальона в Docs API, я могу получить призыв к работе. Они предоставляют фрагменты кода JavaScript и Golang для создания подписи в почтальоне. Я хотел бы опубликовать их код и мой PHP -код здесь для сравнения, если кто -то сможет увидеть то, чего мне может не хватать в моем коде PHP, пожалуйста, и спасибо! (работает!) < /p>
// Replace secret with your own
var secret = "c4bb0b4d6ad7407cb53e6bc038a3074b15fc53b0"
function objKeySort(obj) {
var newKey = Object.keys(obj).sort()
var newObj = {}
for (var i = 0; i < newKey.length; i++) {
newObj[newKey] = obj[newKey]
}
return newObj
}
function getEnvVar(k) {
var v = pm.variables.get(k)
if (v != null) {
return v
}
v = pm.environment.get(k)
if (v != null) {
return v
}
v = pm.globals.get(k)
if (v != null) {
return v
}
return null
}
var ts = Date.parse(new Date()) / 1000
pm.variables.set("timestamp", ts)
calSign = function(secret) {
var ts = getEnvVar("timestamp")
var queryParam = pm.request.url.query.members
var param = {}
for (var item in queryParam) {
if (queryParam[item].key == "timestamp") {
v = ts
} else {
var v = queryParam[item].value
if (v == null || v == "{{" + queryParam[item].key + "}}") {
v = getEnvVar(queryParam[item].key)
}
}
param[queryParam[item].key] = v
}
delete param["sign"];
delete param["access_token"]
var sortedObj = objKeySort(param)
var signstring = secret + pm.request.url.getPath()
for (var key in sortedObj) {
signstring = signstring + key + sortedObj[key]
}
signstring = signstring + secret
sign = CryptoJS.HmacSHA256(signstring, secret).toString()
return sign
}
var sign = calSign(secret)
pm.variables.set("sign", sign)
< /code>
Код подписи Golang (работает!) < /p>
import (
"crypto/hmac"
"crypto/sha256"
"encoding/hex"
"sort"
)
/**
** path: API path, for example /api/orders
** queries: Extract all query param EXCEPT 'sign','access_token',query param,not body
** secret: App secter
**/
func generateSHA256(path string, queries map[string]string, secret string) string{
//Reorder the params based on alphabetical order.
keys := make([]string, len(queries))
idx := 0
for k, _ := range queries{
keys[idx] = k
idx++
}
sort.Slice(keys, func(i, j int) bool {
return keys < keys[j]
})
//Concat all the param in the format of {key}{value} and append the request path to the beginning
input := path
for _, key := range keys{
input = input + key + queries[key]
}
//Wrap string generated in up with app_secret.
input = secret + input + secret
//Encode the digest byte stream in hexadecimal and use sha256 to generate sign with salt(secret)
h := hmac.New(sha256.New, []byte(secret))
// error log
if _, err := h.Write([]byte(input)); err != nil{
// todo: log error
return ""
}
return hex.EncodeToString(h.Sum(nil))
}
< /code>
php code (не работает!) < /p>
public function encrypt_sign($vars)
{
$qstring = '';
ksort($vars['qvars']);
if (count($vars['qvars']) > 0) {
foreach ($vars['qvars'] as $k=>$v) {
if ($k != 'sign') {
$qstring .= $k.$v;
}
}
}
//add body of request here!?! what body, its a get request!
//$qstring = $qstring.{request body};
$qstring = $this->tiktok_app_secret . $qstring . $this->tiktok_app_secret;
$sign = $this->encryptForUrl($qstring, $this->tiktok_app_secret);
return $sign;
}
public function encryptForUrl($input, $secretKey)
{
$hmac = hash_hmac('sha256', $input, $secretKey, true);
$urlSafeEncoded = urlencode(rtrim(strtr(base64_encode($hmac), '+/', '-_'), '='));
return $urlSafeEncoded;
}
Подробнее здесь: https://stackoverflow.com/questions/779 ... -pass-with
Используя партнерский API и PHP от Tiktok, как вы создаете подпись для передачи с вызовами API? ⇐ Php
Кемеровские программисты php общаются здесь
1740105629
Anonymous
API Tiktok's API «Подпись» - это кошмар, и я не могу найти абсолютно никакой информации об этом, кроме их хромой документации, связанной ниже, где пример написан в «Голанг» - что бы ни было, черт возьми, лол < /p>
Мне удалось собрать код шифрования в две строки PHP (см. Ниже), но запутанная часть для меня - шаг 5 из этих инструкций по подписи, где он говорит О передаче корпуса: < /p>
", если контент заголовка запроса_тип не является Multipart /Form-Data, добавьте корпус к концу" < /p>
< /blockquote>
тело? Какое тело ?? Из запроса скручивания я еще даже не сделал ??? Я так потерян на этом шаге, но это необходимо для получения запросов, по -видимому, и, вероятно, почему моя подпись всегда возвращается как недействительная от API. com/docv2/page/64f199709495ef0281851fd0
php код, где $ input является конкатенированной строкой в соответствии с документацией, без призрачной части «корпуса» на шаге 5.
$hmac = hash_hmac('sha256', $input, $secretKey, true);
$urlSafeEncoded = urlencode(rtrim(strtr(base64_encode($hmac), '+/', '-_'), '='));
Надеюсь, кто -то здесь имеет опыт работы с этим хаосом и может понять, что они означают под телом.
Используя пример почтальона в Docs API, я могу получить призыв к работе. Они предоставляют фрагменты кода JavaScript и Golang для создания подписи в почтальоне. Я хотел бы опубликовать их код и мой PHP -код здесь для сравнения, если кто -то сможет увидеть то, чего мне может не хватать в моем коде PHP, пожалуйста, и спасибо! (работает!) < /p>
// Replace secret with your own
var secret = "c4bb0b4d6ad7407cb53e6bc038a3074b15fc53b0"
function objKeySort(obj) {
var newKey = Object.keys(obj).sort()
var newObj = {}
for (var i = 0; i < newKey.length; i++) {
newObj[newKey[i]] = obj[newKey[i]]
}
return newObj
}
function getEnvVar(k) {
var v = pm.variables.get(k)
if (v != null) {
return v
}
v = pm.environment.get(k)
if (v != null) {
return v
}
v = pm.globals.get(k)
if (v != null) {
return v
}
return null
}
var ts = Date.parse(new Date()) / 1000
pm.variables.set("timestamp", ts)
calSign = function(secret) {
var ts = getEnvVar("timestamp")
var queryParam = pm.request.url.query.members
var param = {}
for (var item in queryParam) {
if (queryParam[item].key == "timestamp") {
v = ts
} else {
var v = queryParam[item].value
if (v == null || v == "{{" + queryParam[item].key + "}}") {
v = getEnvVar(queryParam[item].key)
}
}
param[queryParam[item].key] = v
}
delete param["sign"];
delete param["access_token"]
var sortedObj = objKeySort(param)
var signstring = secret + pm.request.url.getPath()
for (var key in sortedObj) {
signstring = signstring + key + sortedObj[key]
}
signstring = signstring + secret
sign = CryptoJS.HmacSHA256(signstring, secret).toString()
return sign
}
var sign = calSign(secret)
pm.variables.set("sign", sign)
< /code>
Код подписи Golang (работает!) < /p>
import (
"crypto/hmac"
"crypto/sha256"
"encoding/hex"
"sort"
)
/**
** path: API path, for example /api/orders
** queries: Extract all query param EXCEPT 'sign','access_token',query param,not body
** secret: App secter
**/
func generateSHA256(path string, queries map[string]string, secret string) string{
//Reorder the params based on alphabetical order.
keys := make([]string, len(queries))
idx := 0
for k, _ := range queries{
keys[idx] = k
idx++
}
sort.Slice(keys, func(i, j int) bool {
return keys[i] < keys[j]
})
//Concat all the param in the format of {key}{value} and append the request path to the beginning
input := path
for _, key := range keys{
input = input + key + queries[key]
}
//Wrap string generated in up with app_secret.
input = secret + input + secret
//Encode the digest byte stream in hexadecimal and use sha256 to generate sign with salt(secret)
h := hmac.New(sha256.New, []byte(secret))
// error log
if _, err := h.Write([]byte(input)); err != nil{
// todo: log error
return ""
}
return hex.EncodeToString(h.Sum(nil))
}
< /code>
php code (не работает!) < /p>
public function encrypt_sign($vars)
{
$qstring = '';
ksort($vars['qvars']);
if (count($vars['qvars']) > 0) {
foreach ($vars['qvars'] as $k=>$v) {
if ($k != 'sign') {
$qstring .= $k.$v;
}
}
}
//add body of request here!?! what body, its a get request!
//$qstring = $qstring.{request body};
$qstring = $this->tiktok_app_secret . $qstring . $this->tiktok_app_secret;
$sign = $this->encryptForUrl($qstring, $this->tiktok_app_secret);
return $sign;
}
public function encryptForUrl($input, $secretKey)
{
$hmac = hash_hmac('sha256', $input, $secretKey, true);
$urlSafeEncoded = urlencode(rtrim(strtr(base64_encode($hmac), '+/', '-_'), '='));
return $urlSafeEncoded;
}
Подробнее здесь: [url]https://stackoverflow.com/questions/77903176/using-tiktoks-partner-api-and-php-how-do-you-create-the-signature-to-pass-with[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия