ប្រសិនបើអ្នកដំណើរការ 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៖ កូនសោ API Zinn® របស់អ្នក (ប្រអប់បញ្ចូល
password ដូច្នេះ HostBill រក្សាទុកវាដោយការអ៊ិនគ្រីប)
- នៅលើផលិតផល សូមកំណត់ Product line (ឧទាហរណ៍
mainstream), Stack (ជាលំនាំដើម wordpress) ហើយតាមជម្រើស Application និង PHP version។
- ចុច Test connection។
⛔ កុំប្តូរឈ្មោះថត zinn។ កម្មវិធីផ្ទុករបស់ HostBill ទាញយក class ដែលវាស្វែងរកពីឈ្មោះថត ដូច្នេះការប្តូរឈ្មោះនឹងបង្កើតម៉ូឌុលមួយដែលផ្ទាំងបញ្ជីបង្ហាញ ប៉ុន្តែមិនដែលហៅប្រើឡើយ។
អ្វីៗផ្សេងទៀត — កម្មវិធី PHP client
ឯកសារមួយ គ្មានភាពអាស្រ័យ គ្មានការសន្មតផ្ទាំងគ្រប់គ្រង។ គ្រាន់តែទម្លាក់ ZinnProvisioning.php ទៅក្នុង codebase ផ្ទាល់ខ្លួនរបស់អ្នក ហើយហៅវិធីសាស្ត្រចំនួនប្រាំមួយ។
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 ទេ។ កូនសោដែលអ្នកបិទភ្ជាប់ទៅក្នុងផ្ទាំងចេញវិក្កយបត្រ គួរតែអាចផ្អាកអតិថិជនសម្រាប់ការមិនបង់ប្រាក់ និងចូលគណនីឱ្យពួកគេបាន។ វាមិនគួរអាចសរសេរជាន់លើព័ត៌មានសម្ងាត់ច្រកទូទាត់ប្រាក់ផ្ទាល់ខ្លួនរបស់អ្នកបានឡើយ។
វិធានពីរដែលនាំឱ្យខាតបង់ប្រាក់នៅពេលត្រូវបានបំពាន
- កំណត់កូនសោគណនីនៅលើ អតិថិជន របស់អ្នក និងគេហទំព័រនៅលើ សេវាកម្ម របស់អ្នក។ ការបញ្ជាទិញលើកទីពីររបស់អតិថិជនត្រូវតែធ្លាក់ចូលទៅក្នុងគណនីដែលពួកគេមានរួចហើយ។ ប្រសិនបើកំណត់កូនសោទាំងពីរលើសេវាកម្ម អតិថិជនម្នាក់នឹងទទួលបានគណនីដែលមិនទាក់ទងគ្នាបី និងផ្ទាំងគ្រប់គ្រងដាច់ដោយឡែកពីគ្នាបី។
- ផ្ញើកូនសោ idempotency លើរាល់ការបង្កើត ដែលទាញយកពីលេខសម្គាល់ផ្ទាល់ខ្លួនរបស់អ្នកសម្រាប់ធាតុនោះ។ រាល់ប្រព័ន្ធចេញវិក្កយបត្រតែងតែព្យាយាមឡើងវិញ — ការហៅត្រឡប់របស់ច្រកទូទាត់ប្រាក់មកដល់ពីរដង អ្នកគ្រប់គ្រងដំណើរការផ្តល់សេវាដែលបរាជ័យឡើងវិញ អតិថិជនចុចពីរដង។ បើគ្មានវាទេ ការព្យាយាមលើកទីពីរនឹងបង្កើតគេហទំព័រទីពីរ ហើយអ្នកនឹងត្រូវគិតប្រាក់សម្រាប់វា។ ទាំងម៉ូឌុល និង PHP client ធ្វើកិច្ចការនេះសម្រាប់អ្នក។ ប្រសិនបើអ្នកកំពុងហៅ 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} ទាមទារ body `{"confirm_domain": "<the site's own
domain>"}** — ការវាយបញ្ជាក់ ពីព្រោះនេះជាកិរិយាសព្ទបំផ្លិចបំផ្លាញ។ ប្រសិនបើខកខានមិនបានបញ្ជាក់ទេ នោះគ្មាន ការលុបចោលណាមួយអាចជោគជ័យឡើយ ដូច្នេះសេវាកម្មនៅតែបន្តដំណើរការ ហើយអ្នកនៅតែត្រូវបានគេគិតប្រាក់ដដែល។ សូមទាញយកដូមេនត្រឡប់មកវិញពី GET /v1/reseller/services/{siteId}` ជាជាងការប្រើប្រាស់ កំណត់ត្រាផ្ទាល់ខ្លួនរបស់អ្នក៖ វាត្រូវបានយកទៅប្រៀបធៀបជាមួយដូមេនចម្បងផ្ទាល់របស់គេហទំព័រ ហើយមិនដែលយកទៅប្រៀបធៀបជាមួយឈ្មោះក្លែងក្លាយ (alias) ឡើយ។
សូមអានកំហុសទាំងមូល មិនមែនត្រឹមតែប្រយោគមួយនោះទេ
សារបដិសេធលើការផ្ទៀងផ្ទាត់ គឺត្រូវបានបង្កើតឡើងជាទូទៅដោយចេតនា — "The request was well-formed but failed validation." — ពីព្រោះផ្នែកពាក់កណ្តាលដែលអាចអនុវត្តសកម្មភាពបានគឺស្ថិតនៅក្នុង details ដែលបញ្ជាក់អំពីឈ្មោះវាល និង មូលហេតុ។ ទាំងម៉ូឌុល និង PHP client បន្ថែមវាទៅក្នុងសារដែលពួកគេបង្ហាញដល់អ្នកគ្រប់គ្រងរបស់អ្នក។ ប្រសិនបើអ្នក កំពុងហៅប្រើប្រាស់ API ដោយផ្ទាល់ សូមអាន error.details។ ធាតុមួយចំនួនបង្ហាញតម្លៃទទេជាជាង ប្រយោគ ដែលនោះជាមូលហេតុ max_sites: 0 ត្រូវបានផ្ញើមកកាន់អ្នក នៅពេលដែលគម្រោងតំណាងចែកចាយរបស់អ្នកគ្មានទំហំទំនេរ។
មុនពេលការបញ្ជាទិញដំបូងរបស់អ្នក
គេហទំព័រដែលអតិថិជនរបស់អ្នកទិញ ត្រូវបានរាប់បញ្ចូលក្នុងកូតាគេហទំព័រនៃគម្រោងតំណាងចែកចាយរបស់អ្នក ដូច្នេះអ្នកត្រូវការ គម្រោងដែលមានទំហំទំនេរ។ ការធ្វើតេស្តការតភ្ជាប់មិនអាចរកឃើញបញ្ហានេះបានទេ — វាអានកម្មវិធីរបស់អ្នក និង មិនផ្តល់សេវាកម្មអ្វីទាំងអស់ — ដូច្នេះវារាយការណ៍អំពីគណនីដែលមានដំណើរការល្អ ប៉ុន្តែមិនទាន់អាចលក់បាននៅឡើយ។ ការបញ្ជាទិញដែលបានធ្វើឡើង ដោយគ្មានកូតា នឹងត្រូវបានបដិសេធជាមួយនឹងសារដែលបញ្ជាក់យ៉ាងច្បាស់អំពីបញ្ហានោះ។
ផ្ទៀងផ្ទាត់ការទាញយករបស់អ្នក
បណ្ណសារទាំងពីរត្រូវបានបម្រើតាមរយៈ TLS ពី hostname ផ្ទាល់ខ្លួនរបស់យើង ដោយមិនដែលត្រូវបានបញ្ជូនបន្តទៅកន្លែងផ្សេងឡើយ ព្រមទាំង មានលេខកូដត្រួតពិនិត្យ SHA-256 ត្រូវបានបង្ហាញនៅក្បែរតំណភ្ជាប់ទាញយកនៅលើ downloads page។