PrestaShop 9 klaidos
You have requested a non-existent parameter "api_private_key" po PrestaShop atnaujinimo
PrestaShop 8.1 ir naujesnėms versijoms faile app/config/parameters.php reikia dviejų API raktų. Iš 1.7 ar 8.0 atnaujinta parduotuvė juos gauna iš atnaujinimo asistento. Jei tas žingsnis neįvyko, administravimas sustoja su šia klaida.
- Klaida
You have requested a non-existent parameter "api_private_key".- Pasirodo
- Atnaujinant iš 1.7 ar 8.0 į 8.1, 8.2 ar 9.x
- Dažniausiai randama
- app/config/parameters.php
Kas nutiko
Nuo 8.1 administravime yra OAuth2 serveris Admin API, o jo paslauga skaito du parametrus: api_private_key ir api_public_key. Naujas diegimas įrašo RSA raktų porą į app/config/parameters.php. Parduotuvė, pradėjusi nuo 1.7 ar 8.0, tokių raktų neturi.
Atnaujinant į 8.1 ar naujesnę su atnaujinimo asistentu (modulis autoupgrade), jo duomenų bazės žingsnis sukuria raktų porą su PHP OpenSSL plėtiniu ir įrašo ją į parameters.php. Jei po atnaujinimo raktų nėra, tas žingsnis nebuvo vykdytas arba nepavyko:
- atnaujinta kitu būdu: nauji failai nukopijuoti rankomis, naudota sena atnaujinimo asistento versija arba
parameters.phppo to atstatytas iš atsarginės kopijos; - PHP, kuriuo vyko atnaujinimas, neturėjo veikiančio OpenSSL. Atnaujinant komandine eilute tai gali būti ne tas pats PHP, kurį naudoja svetainė:
php -mturi rodytiopenssl.
Mūsų bandomojoje PrestaShop 9.2 parduotuvėje išėmus abu raktus administravimas grąžino klaidą 500 su lygiai šiuo pranešimu, o cache nebebuvo įmanoma sukurti.
Sprendimas
Viso atnaujinimo kartoti nereikia. Sukurkite raktų porą taip pat, kaip tai daro PrestaShop diegimo programa (2048 bitų RSA su openssl_pkey_new). Išsaugokite šį failą kaip gen-api-keys.php parduotuvės šakniniame aplanke:
<?php
// Adds the api_public_key / api_private_key pair that PrestaShop 8.1+ expects
// in app/config/parameters.php. Run once from the shop root: php gen-api-keys.php
$path = __DIR__ . '/app/config/parameters.php';
$p = require $path;
if (!empty($p['parameters']['api_private_key']) && !empty($p['parameters']['api_public_key'])) {
exit("Keys already present, nothing to do.\n");
}
$key = openssl_pkey_new(['private_key_bits' => 2048, 'private_key_type' => OPENSSL_KEYTYPE_RSA]);
if ($key === false) {
exit('OpenSSL could not create a key: ' . openssl_error_string() . "\n");
}
openssl_pkey_export($key, $private);
$p['parameters']['api_private_key'] = $private;
$p['parameters']['api_public_key'] = openssl_pkey_get_details($key)['key'];
copy($path, $path . '.bak');
file_put_contents($path, '<?php return ' . var_export($p, true) . ';');
echo "Keys added. Backup: app/config/parameters.php.bak\n";
Tada:
php gen-api-keys.php
rm -rf var/cache/prod var/cache/dev
rm gen-api-keys.php
Linux serveryje paleiskite kaip svetainės serverio vartotojas, kad parameters.php išliktų tas pats savininkas. Išbandėme 9.2.0 parduotuvėje: be raktų administravimas grąžino klaidą 500 su šiuo pranešimu, o paleidus skriptą ir išvalius cache vėl atsidarė.
Jei skriptas parašo OpenSSL could not create a key, to PHP OpenSSL plėtinys neveikia. Pirma sutvarkykite jį arba kreipkitės į hostingo įmonę. Nekopijuokite raktų poros iš kitos parduotuvės ar instrukcijos internete: privatus raktas pasirašo administravimo API žetonus, todėl kiekvienai parduotuvei reikia savo.
Kur dar pasitaiko
Kitos non-existent parameter klaidos iškart po atnaujinimo dažniausiai reiškia tą patį: atnaujinimas nebaigė nustatymų žingsnio. Tokiu atveju parametrus po vieną pridėti rankomis – ne tas kelias. Atstatykite atsarginę kopiją ir atnaujinkite iš naujo su naujausiu atnaujinimo asistentu, naudodami PHP su OpenSSL.