Əgər WHMCS istifadə edirsinizsə, bunun əvəzinə WHMCS modulundan istifadə edin — bu səhifə qalan hər şey üçündür. İki seçim var, hər ikisi pulsuzdur və hər ikisi GPL-2.0-or-later lisenziyalıdır.
HostBill
WHMCS modulu ilə eyni altı əməliyyata malik hostinq modulu.
- Onu endirin və arxivdən çıxarın.
- Faylların
includes/modules/Hosting/zinn/class.zinn.php və includes/modules/Hosting/zinn/ZinnHostBillClient.php ünvanlarına yerləşməsi üçün zinn qovluğunu includes/modules/Hosting/ içinə yükləyin.
- Settings → Modules → Hosting bölməsinə keçin, Zinn Digital® modulunu aktivləşdirin və bağlantı əlavə edin:
- API address:
https://api.zinndigital.com
- API key: Zinn® API açarınız (
password sahəsidir, ona görə də HostBill onu şifrələnmiş şəkildə saxlayır)
- Məhsul üzərində Product line (məsələn,
mainstream), Stack (standart olaraq wordpress) və istəyə bağlı olaraq Application və PHP version təyin edin.
- Test connection düyməsini sıxın.
⛔ zinn qovluğunun adını dəyişməyin. HostBill-in yükləyicisi axtardığı sinfi qovluq adından əldə edir, buna görə də adı dəyişdirmək panelin siyahıya aldığı, lakin heç vaxt çağırmadığı bir modul yaradır.
Başqa hər şey — PHP müştərisi
Bir fayl, heç bir asılılıq yoxdur, panel tələbləri yoxdur. ZinnProvisioning.php faylını öz kod bazanıza əlavə edin və altı metodu çağırın.
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));
PHP yazmırsınız? Eyni çağırışlar API soraqçasında mövcuddur və siz onları istənilən mühitdən icra edə bilərsiniz.
API açarı
Yeddi icazə və artıq heç nə: org.create, org.read, sites.create, sites.view, sites.delete, reseller.view, reseller.provision.
⛔ reseller.manage deyil. Faktura panelinə daxil etdiyiniz açar ödəniş edilmədikdə müştərini dayandıra və sistemə daxil edə bilməlidir; o, sizin şəxsi ödəniş şlüzü məlumatlarınızı yenidən yaza bilməməlidir.
Pozulduqda xərc yaradan iki qayda
- Hesabı MÜŞTƏRİNİZƏ, saytı isə XİDMƏTİNİZƏ bağlayın. Müştərinin ikinci sifarişi artıq sahib olduğu hesaba daxil olmalıdır. Hər ikisini xidmətə bağlasanız, bir müştəri üç əlaqəsiz hesaba və üç ayrı idarəetmə panelinə sahib olacaqdır.
- Hər yaradılma zamanı obyekt üçün öz identifikatordan əldə edilmiş idempotensiya açarı göndərin. Hər bir faktura sistemi yenidən cəhd edir — şlüz geri çağırışı iki dəfə gəlir, administrator uğursuz təminatı yenidən icra edir, müştəri iki dəfə klikləyir. Bu olmadan, ikinci cəhd ikinci bir sayt yaradır və buna görə sizdən ödəniş tutulur. Hər iki modul və PHP müştərisi bunu sizin üçün yerinə yetirir; əgər API-ni birbaşa çağırırsınızsa,
Idempotency-Key göndərin.
Buraxılması asan olan üç sahə
Hər biri bütöv bir əməliyyatı sıradan çıxarır və birincidən başqa heç biri doğrulama xətası kimi görünmür — birinci isə ümumiyyətlə heç nə kimi görünür:
- ⛔⛔ Müştərinin ilk saytı təmin edilməzdən ƏVVƏL o, bir plana daxil edilməlidir, bu
POST /v1/reseller/clients/{orgId}/plan ilə icra olunur və onun subscription_id parametri POST /v1/sites sorğusuna ötürülür. Bu, oxunacaq heç bir xətası olmayan haldır. Yeni müştəri hesabı heç bir abunəliyə malik deyil və POST /v1/sites sorğusunda plan sahəsi yoxdur, buna görə də plansız təmin edilən sayt ümumiyyətlə heç bir plan daşımır: topdansatış çıxarışınız müştərilərinizin aktiv abunəlikləri əsasında tərtib edilir, beləliklə heç bir sətir əlavə edilmir və hostinq işlədiyi müddətcə Zinn® sizdən heç bir ödəniş tələb etmir; müştəriniz heç bir limit əldə etmir, buna görə də onların saytına heç bir kvota tətbiq olunmur; və təkmilləşdirmənin dəyişdirə biləcəyi heç bir şey yoxdur. Sifariş 201 qaytarır, sayt təmin edilir və mükəmməl şəkildə fəaliyyət göstərir. Hər iki tərəfdə heç nə bunlardan heç birini bildirmir.
Ardıcıllıq vacibdir: POST /v1/sites icra olunduğu anda mövcud olan istənilən abunəliyi qeydə alır, buna görə də sonradan təyin edilmiş plan geriyə qüvvə ilə tətbiq edilmir.
POST /v1/sites stack_type tələb edir. Bunu ötürün və heç bir sifariş uğurlu ola bilməz.
DELETE /v1/sites/{siteId} {"confirm_domain": "<the site's own domain>"} gövdəsini tələb edir — bu, dağıdıcı fel olduğu üçün daxil edilmiş bir təsdiqdir. Bunu ötürün və heç bir ləğvetmə uğurlu ola bilməz, nəticədə xidmət işləməyə davam edər və sizdən onun üçün ödəniş tutulmağa davam edər. Öz qeydinizdən istifadə etmək əvəzinə domeni GET /v1/reseller/services/{siteId} sorğusundan oxuyun: o, heç vaxt ləqəblə deyil, saytın öz ilkin domeni ilə müqayisə edilir.
Təkcə cümləni deyil, bütün xətanı oxuyun
Doğrulama imtinası mesajı qəsdən ümumidir — "Sorğu düzgün tərtib edilmişdi, lakin doğrulama uğursuz oldu." — çünki fəaliyyət tələb edən hissə sahəni və səbəbini göstərən details daxilindədir. Həm modullar, həm də PHP müştərisi bunu inzibatçınıza göstərdikləri mesaja əlavə edir. Əgər API-ni özünüz çağırırsınızsa, error.details hissəsini oxuyun; bəzi qeydlər cümlə deyil, sadə bir dəyər daşıyır və satıcı planınızda yer olmadıqda max_sites: 0 sizə bu şəkildə çatır.
İlk sifarişinizdən əvvəl
Müştərilərinizin aldığı saytlar sizin satıcı planınızın sayt limitinə daxil edilir, buna görə də içində yeri olan bir plana ehtiyacınız var. Əlaqə testi bunu aşkar edə bilməz — o, proqramınızı oxuyur və heç nə təmin etmir — beləliklə, hələ sata bilməyən saz bir hesab barədə məlumat verir. Limit olmadan verilən sifariş məhz bunu bildirən bir mesajla rədd edilir.
Yükləmənizi yoxlayın
Hər iki arxiv heç vaxt başqa yerə yönləndirilmədən, birbaşa öz host adımızdan TLS vasitəsilə təqdim olunur və onların SHA-256 yoxlama cəmləri yükləmələr səhifəsindəki yükləmə bağlantılarının yanında göstərilir.