Agar siz WHMCS'dan foydalansangiz, uning oʻrniga WHMCS modulidan foydalaning — bu sahifa qolgan barcha holatlar uchun moʻljallangan. Ikkita variant mavjud, ikkalasi ham bepul va ikkalasi ham GPL-2.0-or-later litsenziyasiga ega.
HostBill
WHMCS moduli kabi bir xil oltita amalga ega boʻlgan hosting moduli.
- Uni yuklab oling va arxivdan chiqaring.
zinn direktoriyasini includes/modules/Hosting/ ichiga yuklang, shunda fayllar quyidagi joyda boʻladi:
includes/modules/Hosting/zinn/class.zinn.php va includes/modules/Hosting/zinn/ZinnHostBillClient.php.
- Settings → Modules → Hosting boʻlimiga oʻting, Zinn Digital® modulini faollashtiring va ulanish qoʻshing:
- API address:
https://api.zinndigital.com
- API key: sizning Zinn® API kalitingiz (
password maydoni, shuning uchun HostBill uni shifrlangan holda saqlaydi)
- Mahsulotda Product line (masalan,
mainstream), Stack (standart boʻyicha wordpress), va ixtiyoriy ravishda Application hamda PHP version parametrlarini sozlang.
- Test connection tugmasini bosing.
⛔ zinn direktoriyasi nomini oʻzgartirmang. HostBill yuklagichi u qidirayotgan klassni katalog nomidan oladi, shuning uchun nomini oʻzgartirish panel roʻyxatga oladigan, ammo hech qachon chaqirmaydigan modulga olib keladi.
Qolgan barcha holatlar uchun — PHP mijoz
Bitta fayl, hech qanday bogʻliqliklarsiz, panellarga asoslanmagan. Oʻzingizning kodlar bazangizga ZinnProvisioning.php faylini joylashtiring va oltita metodni chaqiring.
require_once 'ZinnProvisioning.php';
$zinn = new ZinnProvisioning(getenv('ZINN_API_KEY'));
// Buyurtma toʻlanganda — MIJOZ boshiga bir marta, soʻngra XIZMAT boshiga bir marta:
$orgId = $zinn->account('customer-4211', 'Acme Ltd');
$siteId = $zinn->provision('service-9915', $orgId, 'acme.com', 'mainstream', 'wordpress');
// $orgId qiymatini mijozingiz uchun, $siteId qiymatini esa xizmatingiz uchun saqlang.
$zinn->suspend($siteId, 'INV-2026-114 unpaid'); // hisob-faktura toʻlanmay qoladi
$zinn->unsuspend($siteId); // ular toʻlov qilishadi
$zinn->terminate($siteId); // ular bekor qilishadi — oʻchirishni rejalashtiradi
// Ular "hostingimga kirish" tugmasini bosganda — uni sahifa renderida emas, aynan BOSISH paytida yarating:
header('Location: ' . $zinn->signInLink($siteId));
PHP yozmayapsizmi? Xuddi shu chaqiruvlar API maʼlumotnomasida mavjud va siz ularni har qanday tildan amalga oshirishingiz mumkin.
API kaliti
Yettita ruxsat va boshqa hech narsa emas: org.create, org.read, sites.create, sites.view, sites.delete, reseller.view, reseller.provision.
⛔ reseller.manage emas. Hisob-kitob paneliga kiritadigan kalitingiz toʻlov qilinmagani sababli mijozni toʻxtatib turishi va ularni tizimga kiritishi kerak; u oʻzingizning toʻlov shlyuzi hisob maʼlumotlaringizni qayta yozish imkoniyatiga ega boʻlmasligi kerak.
Buzilganda pul sarflanishiga olib keladigan ikkita qoida
- Hisobni MIJOZINGIZGA, saytni esa XIZMATINGIZGA bogʻlang. Mijozning ikkinchi buyurtmasi ular allaqachon ega boʻlgan hisobga tushishi kerak. Ikkalasini ham xizmatga bogʻlasangiz, bitta mijoz oʻzaro bogʻliq boʻlmagan uchta hisob va uchta alohida boshqaruv paneliga ega boʻlib qoladi.
- Har bir yaratishda oʻzingizning obyekt identifikatoringizdan olingan idempotensiya kalitini yuboring. Har bir toʻlov tizimi qayta urinib koʻradi — shlyuzdan qayta qoʻngʻiroq ikki marta keladi, administrator muvaffaqiyatsiz provizioningni qayta ishga tushiradi, mijoz ikki marta bosadi. Busiz ikkinchi urinish ikkinchi saytni yaratadi va sizdan buning uchun toʻlov olinadi. Ikkala modul va PHP mijoz buni siz uchun bajaradi; agar siz API'ni toʻgʻridan-toʻgʻri chaqirayotgan boʻlsangiz,
Idempotency-Key yuboring.
Qoldirib ketish oson boʻlgan uchta maydon
Ularning har biri butun bir amalni buzadi va validatsiya xatosidan boshqa hech narsa sifatida koʻrinmaydi — birinchisi bundan mustasno, u umuman hech narsa sifatida koʻrinadi:
- ⛔⛔ Mijozning birinchi sayti taqdim etilishidan OLDIN u tarif rejasiga kiritilishi shart, bu
POST /v1/reseller/clients/{orgId}/plan orqali amalga oshiriladi va uning subscription_id parametri POST /v1/sites ga uzatiladi. Bu hech qanday xatolik koʻrsatilmaydigan holatdir. Yangi mijoz hisobida hech qanday obuna boʻlmaydi va POST /v1/sites da tarif rejasi maydoni mavjud emas, shuning uchun usiz taqdim etilgan saytda umuman hech qanday tarif rejasi boʻlmaydi: sizning ulgurji hisob-kitobingiz mijozlaringizning faol obunalaridan shakllantiriladi, shu sababli hech qanday band kiritilmaydi va hosting ishlab turgan vaqt davomida Zinn® sizdan hech qanday haq undirmaydi; mijozingizga hech qanday limitlar oʻtmaydi, shu sababli ularning saytiga hech qanday kvota qoʻllanilmaydi; va tarifni oshirish orqali oʻzgartirish uchun hech narsa mavjud boʻlmaydi. Buyurtma 201 javobini qaytaradi, sayt taqdim etiladi va u mukammal ishlaydi. Ikkala tomonda ham hech narsa bu haqda xabar bermaydi.
Ketma-ketlik muhim ahamiyatga ega: POST /v1/sites ishga tushgan paytda mavjud boʻlgan har qanday obunani qayd etadi, shuning uchun keyinroq oʻrnatilgan tarif rejasi orqaga qarab tatbiq etilmaydi.
POST /v1/sites uchun stack_type talab qilinadi. Uni qoldirib ketsangiz, hech qanday buyurtma muvaffaqiyatli yakunlanmaydi.
DELETE /v1/sites/{siteId} uchun {"confirm_domain": "<the site's own domain>"} koʻrinishidagi tana (body) talab qilinadi — bu qoʻlda kiritiladigan tasdiqdir, chunki bu oʻchiruvchi amal hisoblanadi. Uni qoldirib ketsangiz, hech qanday bekor qilish muvaffaqiyatli yakunlanmaydi, natijada xizmat ishlashda davom etadi va sizdan uning uchun toʻlov olinishda davom etadi. Oʻzingizning qaydlaringizdan foydalanish oʻrniga domenni GET /v1/reseller/services/{siteId} orqali qayta oʻqing: u saytning taxallusiga emas, faqat oʻzining asosiy domeniga solishtiriladi.
Shunchaki jumlaning oʻzini emas, butun xatolikni oʻqing
Validatsiyadan oʻtmaganlik haqidagi xabar ataylab umumiy shaklda beriladi — "The request was well-formed but failed validation." — chunki amaliy ahamiyatga ega qismi details ichida joylashgan boʻlib, u maydon nomini va sababini koʻrsatadi. Ikkala modul ham, PHP mijozi ham uni administratoringizga koʻrsatadigan xabarga qoʻshib qoʻyadi. Agar API ga oʻzingiz murojaat qilayotgan boʻlsangiz, error.details ni oʻqing; baʼzi yozuvlar butun jumla oʻrniga faqat oddiy qiymatdan iborat boʻladi, masalan, dilerlik rejangizda joy qolmaganida sizga max_sites: 0 shu tarzda keladi.
Birinchi buyurtmangizdan oldin
Mijozlaringiz sotib oladigan saytlar sizning dilerlik rejangizdagi saytlar limitidan hisoblanadi, shuning uchun sizga boʻsh joyga ega reja kerak boʻladi. Ulanish testi buni aniqlay olmaydi — u dasturingizni oʻqiydi va hech narsa taqdim etmaydi — shu sababli u hali sotuvlarni amalga oshirolmaydigan soz holatdagi hisob haqida xabar beradi. Limitsiz berilgan buyurtma aynan shu haqda xabar beruvchi bildirishnoma bilan rad etiladi.
Yuklab olingan faylni tekshiring
Ikkala arxiv ham bizning oʻz xost nomimizdan TLS orqali uzatiladi, boshqa hech qayerga yoʻnaltirilmaydi va ularning SHA-256 nazorat summalari yuklab olish sahifasidagi yuklab olish havolalari yonida koʻrsatilgan.