Используя партнерский API и PHP от Tiktok, как вы создаете подпись для передачи с вызовами API?Php

Кемеровские программисты php общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Используя партнерский API и PHP от Tiktok, как вы создаете подпись для передачи с вызовами API?

Сообщение Anonymous »

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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Php»