API Tiktok's API «Подпись» - это кошмар, и я не могу найти абсолютно никакой информации об этом, кроме их хромой документации, связанной ниже, где пример написан в «Голанг» - что бы ни было, черт возьми, лол < /p>
Я сумел собрать код шифрования в две строки PHP (см. Ниже), но запутанная часть для меня - шаг 5 из этих инструкций по подписанию, где он говорит о передаче тела: < /p>
", если заголовок запроса Content_type не является 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
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение