Le richieste API di Weydub utilizzano le intestazioni AppKey e AppSign. Conserva AppSecret esclusivamente lato server.
Struttura della richiesta
| Elemento | Valore |
|---|---|
| URL di base | https://api.zhaoli.com |
| Protocollo | HTTPS |
| Metodo | POST per le chiamate API documentate |
| Codifica | UTF-8 |
| Tipo di contenuto | application/json |
| Corpo della richiesta | JSON, serializzato in forma compatta per ottenere firme stabili |
Intestazioni
Content-Type: application/json
AppKey: your_app_key
AppSign: computed_signatureAppSecret non viene mai inviato come intestazione o campo del corpo. Viene utilizzato esclusivamente sul tuo server per calcolare AppSign.
Formula della firma
AppSign = md5(md5(request_body) + AppSecret)La firma deve essere calcolata sul corpo JSON esattamente come viene trasmesso in rete. Per ottenere firme stabili, serializza JSON senza spazi aggiuntivi.
Se un endpoint consente un corpo vuoto, firma l'esatta sequenza di byte che invii. Nella maggior parte delle integrazioni, per le chiamate senza corpo è preferibile inviare {} e firmare {}.
Endpoint senza firma
L'endpoint enum non richiede la firma:
POST /v-w-c/enum/query2Utilizzalo per recuperare enumerazioni dinamiche relative a lingue e stati, come sourceLang, Lang, ProcessStatus e ImageTaskStatus.
Funzione ausiliaria Python per la firma
import hashlib
import json
def signed_body_and_headers(payload: dict, app_key: str, app_secret: str):
body = json.dumps(payload, ensure_ascii=False, separators=(",", ":"))
body_md5 = hashlib.md5(body.encode("utf-8")).hexdigest()
app_sign = hashlib.md5((body_md5 + app_secret).encode("utf-8")).hexdigest()
return body, {
"Content-Type": "application/json",
"AppKey": app_key,
"AppSign": app_sign,
}Funzione ausiliaria Node per la firma
import crypto from "node:crypto";
export function signedBodyAndHeaders(payload, appKey, appSecret) {
const body = JSON.stringify(payload);
const bodyMd5 = crypto.createHash("md5").update(body).digest("hex");
const appSign = crypto.createHash("md5").update(bodyMd5 + appSecret).digest("hex");
return {
body,
headers: {
"Content-Type": "application/json",
AppKey: appKey,
AppSign: appSign,
},
};
}Modello cURL
Utilizza il tuo backend per calcolare AppSign, quindi invia esattamente il corpo usato per il calcolo:
curl -X POST "https://api.zhaoli.com/v-w-c/gateway/ve/work/status" \
-H "Content-Type: application/json" \
-H "AppKey: $WEYDUB_APP_KEY" \
-H "AppSign: $WEYDUB_APP_SIGN" \
--data '{"idWorks":[488026661]}'Firma dei callback
Quando Weydub invia un callback, questo include:
Callback-Sign: computed_callback_signatureVerifica i callback con la stessa formula, utilizzando il corpo non elaborato della richiesta di callback:
expected = md5(md5(raw_callback_body) + AppSecret)Confronta expected con Callback-Sign. Rifiuta o metti in quarantena i payload dei callback che non superano la verifica.
Errori comuni
- Firmare JSON con una formattazione leggibile, ma inviare JSON in formato compatto.
- Modificare il payload dopo la firma.
- Utilizzare modalità di escape delle stringhe diverse tra la firma e l'invio.
- Firmare un oggetto in memoria anziché i byte finali inviati tramite HTTP.
- Dimenticare che
extraOptions,wyVoiceParam,videoInpaintMasks,downloadInfoe ilresultdel redo potrebbero dover rimanere stringhe JSON compatte all'interno del corpo JSON esterno. - Inserire le credenziali nel codice frontend.
- Condividere
AppSecretcon estensioni del browser, applicazioni lato client, screenshot, log o prompt pubblici.
Regole per gli agenti
- Leggere le credenziali da variabili di ambiente o da un gestore di segreti.
- Non mostrare mai
AppSecret. - Non scrivere mai le credenziali nei file di esempio generati.
- Quando si producono esempi eseguibili, utilizzare segnaposto o variabili di ambiente.
- Durante il debug di un errore di firma, confrontare i byte del corpo e gli hash non segreti del corpo senza visualizzare i segreti.
- Verificare
Callback-Signper i gestori di webhook.