Егер сіз WHMCS жүйесін пайдалансаңыз, оның орнына WHMCS модулін қолданыңыз — бұл бет қалған жағдайлардың барлығына арналған. Екі нұсқа бар, екеуі де тегін және екеуі де GPL-2.0-or-later лицензиясына ие.
HostBill
WHMCS нұсқасындағыдай алты әрекеті бар хостинг модулі.
- Оны жүктеп алып, мұрағаттан шығарыңыз.
zinn каталогын includes/modules/Hosting/ ішіне жүктеңіз, сонда файлдар мына мекенжайларға түседі:
includes/modules/Hosting/zinn/class.zinn.php және includes/modules/Hosting/zinn/ZinnHostBillClient.php.
- Settings → Modules → Hosting бөліміне өтіп, Zinn Digital® модулін белсендіріңіз және байланыс қосыңыз:
- API address:
https://api.zinndigital.com
- API key: сіздің Zinn® API кілтіңіз (
password өрісі, сондықтан HostBill оны шифрланған түрде сақтайды)
- Өнімде Product line (мысалы,
mainstream), Stack (әдепкі бойынша wordpress), сондай-ақ қалауыңыз бойынша Application және PHP version мәндерін орнатыңыз.
- Test connection түймесін басыңыз.
⛔ zinn каталогының атауын өзгертпеңіз. HostBill жүктеуіші өзі іздейтін класты каталог атауынан туындатады, сондықтан атауды өзгерту панель тізімдейтін, бірақ ешқашан шақырмайтын модульге әкеледі.
Қалған барлық жағдайлар үшін — PHP клиенті
Бір файл, тәуелділіктер жоқ, панельге қатысты ешқандай болжамдар жоқ. ZinnProvisioning.php файлын жеке код базаңызға салыңыз және алты әдісті шақырыңыз.
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-де жазбайсыз ба? Дәл сол шақырулар API анықтамалығында бар және сіз оларды кез келген құрал арқылы орындай аласыз.
API кілті
Жеті рұқсат және одан артық емес: org.create, org.read, sites.create, sites.view, sites.delete, reseller.view, reseller.provision.
⛔ reseller.manage емес. Биллинг панеліне енгізетін кілт төлем жасамағаны үшін клиентті тоқтата алуы және оның жүйеге кіруін қамтамасыз ете алуы керек; ол сіздің жеке төлем шлюзінің тіркелгі деректерін қайта жаза алмауы тиіс.
Бұзылған жағдайда шығын әкелетін екі ереже
- Тіркелгіні өз ТҰТЫНУШЫҢЫЗҒА (CUSTOMER), ал сайтты ҚЫЗМЕТІҢІЗГЕ (SERVICE) байланыстырыңыз. Тұтынушының екінші тапсырысы оның бар тіркелгісіне түсуі керек. Екеуін де қызметке байланыстырсаңыз, бір тұтынушы бір-бірімен байланысы жоқ үш тіркелгіге және үш бөлек басқару панеліне ие болады.
- Нысан үшін өзіңіздің сәйкестендіргішіңізден (id) алынған идемпотенттілік кілтін әрбір жасау кезінде жіберіңіз. Кез келген биллинг жүйесі қайта әрекет жасайды — шлюздің кері шақыруы екі рет келеді, әкімші сәтсіз орындалуды қайта іске қосады, тұтынушы түймені екі рет басады. Ол болмаса, екінші әрекет екінші сайтты жасайды және сізге оның төлемі есептеледі. Екі модуль де және PHP клиенті де мұны сіз үшін орындайды; егер сіз API-ді тікелей шақырып жатсаңыз,
Idempotency-Key мәнін жіберіңіз.
Ұмытып кету оңай үш өріс
Олардың әрқайсысы тұтас әрекетті бұзады және олардың ешқайсысы тексеру қатесінен басқа ешнәрсе ретінде көрінбейді — тек біріншісінен басқа, ол мүлдем ешнәрсе ретінде көрінбейді:
- ⛔⛔ Клиенттің алғашқы сайты дайындалмас БҰРЫН, оған тарифтік жоспар бекітілуі тиіс: бұл
POST /v1/reseller/clients/{orgId}/plan арқылы жасалады және оның subscription_id мәні POST /v1/sites сұрауына беріледі. Бұл ешқандай қатені көрсетпейтін жағдай. Жаңа клиенттік тіркелгіде ешқандай жазылым болмайды және POST /v1/sites сұрауында жоспар өрісі жоқ, сондықтан онсыз дайындалған сайтта мүлдем жоспар болмайды: сіздің көтерме есеп-шотыңыз клиенттеріңіздің белсенді жазылымдары негізінде жасалады, сондықтан ешқандай жол қосылмайды және хостинг жұмыс істеп тұрған уақытта Zinn® сізге ешқандай төлем салмайды; клиентіңіз ешқандай лимитті иеленбейді, сондықтан олардың сайтына квота қолданылмайды; сондай-ақ жаңарту кезінде өзгертетін ештеңе болмайды. Тапсырыс 201 жауабын қайтарады, сайт дайындалады және мінсіз қызмет көрсетеді. Екі жақта да бұл туралы ешқандай мәлімет хабарланбайды.
Орындалу реті маңызды: POST /v1/sites сұрауы орындалған сәтте қандай жазылым болса, соны жазып алады, сондықтан одан кейін орнатылған жоспар өткен уақытқа кері әсер етіп бекітілмейді.
POST /v1/sites сұрауына stack_type қажет. Оны өткізіп жіберсеңіз, ешқандай тапсырыс сәтті орындалмайды.
DELETE /v1/sites/{siteId} сұрауына {"confirm_domain": "<the site's own domain>"} түріндегі дене қажет — бұл жою әрекеті болғандықтан, қолмен енгізілген растау талап етіледі. Оны өткізіп жіберсеңіз, күшін жою әрекеті сәтті орындалмайды, нәтижесінде қызмет жұмысын жалғастыра береді және оған шот ұсыныла береді. Өз жазбаңызды пайдаланудың орнына, доменді GET /v1/reseller/services/{siteId} арқылы қайта оқып алыңыз: ол ешқашан лақап атпен емес, сайттың негізгі доменімен салыстырылады.
Тек сөйлемді ғана емес, бүкіл қатені толық оқыңыз
Валидациядан бас тарту туралы хабарлама әдейі жалпылама беріледі — "The request was well-formed but failed validation." — өйткені нақты әрекетке қажетті бөлік өрісті және оның себебін көрсететін details ішінде болады. Модульдер де, PHP клиенті де оны әкімшіңізге көрсететін хабарламаның соңына қосады. Егер API-ді өзіңіз шақырып жатсаңыз, error.details бөлімін оқыңыз; кейбір жазбаларда сөйлемнің орнына жалаң мән болады, мысалы, риселлер жоспарыңызда бос орын болмаған кезде сізге max_sites: 0 осылай жетеді.
Алғашқы тапсырысыңыздың алдында
Клиенттеріңіз сатып алатын сайттар сіздің риселлер жоспарыңыздың сайт лимитінен есептеледі, сондықтан сізге бос орны бар жоспар қажет. Қосылымды тексеру мұны анықтай алмайды — ол бағдарламаңызды оқиды және ештеңе дайындамайды — сондықтан ол әлі сата алмайтын, бірақ күйі жақсы тіркелгіні хабарлайды. Лимитсіз берілген тапсырыс дәл осыны көрсететін хабарламамен қабылданбайды.
Жүктеп алынған файлды тексеріңіз
Екі архив те біздің жеке хост атауымыздан TLS арқылы ұсынылады, ешқашан басқа жерге қайта бағытталмайды және олардың SHA-256 бақылау сомалары жүктеулер бетіндегі жүктеп алу сілтемелерінің жанында көрсетілген.