Pokud používáte WHMCS, použijte raději modul WHMCS — tato stránka je pro vše ostatní. K dispozici jsou dvě možnosti, obě bezplatné a obě pod licencí GPL-2.0-or-later.
HostBill
Hostingový modul se stejnými šesti akcemi jako ten pro WHMCS.
- Stáhněte si jej a rozbalte.
- Nahrajte adresář
zinn do includes/modules/Hosting/, aby se soubory nacházely v includes/modules/Hosting/zinn/class.zinn.php a includes/modules/Hosting/zinn/ZinnHostBillClient.php.
- Nastavení → Moduly → Hosting, aktivujte Zinn Digital® a přidejte připojení:
- Adresa API:
https://api.zinndigital.com
- Klíč API: váš klíč API pro Zinn® (pole typu
password, takže jej HostBill ukládá šifrovaně)
- U produktu nastavte Produktová řada (např.
mainstream), Stack (ve výchozím nastavení wordpress) a volitelně Aplikace a Verze PHP.
- Stiskněte Otestovat připojení.
⛔ Nepřejmenovávejte adresář zinn. Zavaděč systému HostBill odvozuje třídu, kterou hledá, z názvu adresáře, takže přejmenování vytvoří modul, který panel sice zobrazí, ale nikdy nezavolá.
Cokoli jiného — klient PHP
Jeden soubor, žádné závislosti, žádné předpoklady o panelu. Vložte ZinnProvisioning.php do své vlastní kódové základny a volejte šest metod.
require_once 'ZinnProvisioning.php';
$zinn = new ZinnProvisioning(getenv('ZINN_API_KEY'));
// When an order is paid — once per CUSTOMER, then once per SERVICE:
$orgId = $zinn->account('customer-4211', 'Acme Ltd');
$siteId = $zinn->provision('service-9915', $orgId, 'acme.com', 'mainstream', 'wordpress');
// Store $orgId against your customer and $siteId against your service.
$zinn->suspend($siteId, 'INV-2026-114 unpaid'); // an invoice goes unpaid
$zinn->unsuspend($siteId); // they pay
$zinn->terminate($siteId); // they cancel — schedules a deletion
// When they click "log in to my hosting" — mint it on the CLICK, never on page render:
header('Location: ' . $zinn->signInLink($siteId));
Nepíšete v PHP? Stejná volání naleznete v referenční příručce k API a můžete je provést odkudkoli.
Klíč API
Sedm oprávnění a nic víc: org.create, org.read, sites.create, sites.view, sites.delete, reseller.view, reseller.provision.
⛔ Nikoli reseller.manage. Klíč, který vkládáte do fakturačního panelu, by měl mít možnost pozastavit klienta z důvodu nezaplacení a přihlásit jej; neměl by mít možnost přepisovat přihlašovací údaje k vaší vlastní platební bráně.
Dvě pravidla, jejichž porušení stojí peníze
- Navište účet na svého ZÁKAZNÍKA a web na svou SLUŽBU. Druhá objednávka zákazníka musí skončit v účtu, který již má. Pokud navážete obojí na službu, jeden zákazník skončí se třemi nesouvisejícími účty a třemi samostatnými ovládacími panely.
- Při každém vytvoření odešlete klíč idempotence odvozený z vašeho vlastního ID dané položky. Každý fakturační systém provádí opakované pokusy — zpětné volání brány dorazí dvakrát, správce znovu spustí neúspěšné zřízení, zákazník dvakrát klikne. Bez něj druhý pokus vytvoří druhý web a ten vám bude naúčtován. Oba moduly i klient PHP to dělají za vás; pokud voláte API přímo, pošlete
Idempotency-Key.
Tři pole, která lze snadno vynechat
Každé z nich rozbije celé sloveso a žádné se neprojeví jinak než jako chyba validace — s výjimkou prvního, které se neprojeví vůbec nijak:
- ⛔⛔ Klient musí být zařazen do plánu PŘEDTÍM, než je zřízen jeho první web, a to pomocí
POST /v1/reseller/clients/{orgId}/plan, přičemž jeho subscription_id se předá do POST /v1/sites. Toto je případ, kdy se nezobrazí žádná chyba k přečtení. Nový klientský účet neobsahuje žádné předplatné a POST /v1/sites nemá žádné pole pro plán, takže web zřízený bez něj nemá vůbec žádný plán: Váš velkoobchodní výpis se vytváří z aktivních předplatných Vašich klientů, takže se nevytvoří žádná položka a Zinn® Vám neúčtuje vůbec nic po celou dobu běhu hostingu; Váš klient nezíská žádné příděly, takže na jeho web není uplatněna žádná kvóta; a upgrade nemá co změnit. Objednávka vrátí 201, web se zřídí a funguje naprosto bezchybně. Ani jedna strana o ničem z toho neinformuje.
Na pořadí záleží: POST /v1/sites zaznamená jakékoli předplatné existující v okamžiku jeho spuštění, takže dodatečně nastavený plán se nepřiřadí retroaktivně.
POST /v1/sites vyžaduje stack_type. Pokud jej vynecháte, žádná objednávka nemůže uspět.
DELETE /v1/sites/{siteId} vyžaduje tělo zprávy {"confirm_domain": "<the site's own domain>"} — ručně zadané potvrzení, protože se jedná o destruktivní operaci. Pokud jej vynecháte, žádné zrušení nemůže uspět, takže služba poběží dál a Vám bude i nadále účtována. Načtěte doménu zpět z GET /v1/reseller/services/{siteId} místo použití vlastního záznamu: porovnává se s vlastní primární doménou webu a nikdy ne s aliasem.
Přečtěte si celou chybu, nejen větu
Zpráva o odmítnutí při validaci je záměrně obecná — „The request was well-formed but failed validation.“ — protože prakticky využitelná část je v details, kde je uveden název pole a důvod. Jak moduly, tak PHP klient ji připojují ke zprávě, kterou zobrazují Vašemu administrátorovi. Pokud voláte API sami, přečtěte si error.details; některé položky obsahují pouze samotnou hodnotu namísto věty, což je způsob, jakým k Vám dorazí max_sites: 0, když Váš resellerský plán nemá žádné volné místo.
Před Vaší první objednávkou
Weby, které si Vaši klienti zakoupí, se započítávají do povoleného počtu webů Vašeho resellerského plánu, takže potřebujete plán s volnou kapacitou. Test připojení toto nedokáže detekovat — přečte Váš program a nic nezřídí — takže nahlásí bezproblémový účet, který však zatím nemůže prodávat. Objednávka zadaná bez volné kapacity je odmítnuta se zprávou, která přesně toto uvádí.
Ověřte své stažení
Oba archivy jsou poskytovány přes TLS z našeho vlastního hostitele, nikdy nejsou přesměrovány jinam, a jejich kontrolní součty SHA-256 jsou uvedeny vedle odkazů ke stažení na downloads page.