ماژول Zinn Digital® دکمههای خود WHMCS را به اقداماتی واقعی روی پلتفرم ما تبدیل میکند. با ثبت یک سفارش، میزبانی مشتری شما آمادهسازی میشود. سیستم خودکار فاکتورهای معوق WHMCS آن را تعلیق میکند. با علامتگذاری فاکتور بهعنوان پرداختشده، رفع تعلیق میشود. لغو سرویس، حذف آن را زمانبندی میکند. و مشتری شما یک دکمهٔ Log in to hosting panel در ناحیه کاربری خود دریافت میکند که او را مستقیماً وارد سیستم مینماید.
این ماژول رایگان است، تحت مجوز GPL-2.0-or-later منتشر شده، و هیچ مسیر دسترسی ویژهای به پلتفرم ما ندارد: هر فراخوانی که انجام میدهد یک اندپوینت مستندسازیشده است که خودتان نیز میتوانید با کلید API اختصاصی خود آن را فراخوانی کنید.
پیش از شروع
شما به دو چیز نیاز دارید، و مورد دوم اغلب نادیده گرفته میشود.
۱. یک حساب نمایندگی Zinn® با یک برنامهٔ فعال. در zinndigital.com ثبتنام کنید و امکان نمایندگی را فعال نمایید. ۲. یک پلن نمایندگی با سهمیهٔ مجاز سایت. سایتهایی که مشتریان شما سفارش میدهند از سهمیهٔ پلن شما کسر میشود، بنابراین به پلنی نیاز دارید که ظرفیت خالی داشته باشد.
⚠️ گزینهٔ Test Connection نمیتواند به شما بگوید که آیا یک سفارش موفقیتآمیز خواهد بود یا خیر. این گزینه برنامهٔ شما را میخواند و هیچ چیزی را آمادهسازی نمیکند، بنابراین یک حساب سالم و active را گزارش میدهد که هنوز نمیتواند چیزی بفروشد. اگر اولین سفارش شما با خطای "This organization has no hosting plan, so it cannot host a site yet" ناموفق شد، علت همین است — پلن نمایندگی خود را خریداری کرده یا ارتقا دهید و سفارش را دوباره ثبت کنید. ماژول هیچ مشکلی ندارد.
۱. ایجاد کلید API
در داشبورد Zinn® خود، بخش API keys را باز کنید و کلیدی دقیقاً با این یازده مجوز بسازید:
| مجوز | دلیل نیاز به آن |
|---|
org.create | باز کردن حساب Zinn® مشتری شما در اولین سفارش او. |
org.read | خواندن حسابهای مشتریان شما. |
sites.create | آمادهسازی سایت. |
sites.view | خواندن اطلاعات یک سرویس و میزان مصرف آن. |
sites.delete | حذف کامل سرویس (Terminate). |
reseller.view | فهرست کردن مواردی که فروختهاید، و خواندن دیسک و پهنای باند. |
reseller.provision | تعلیق، رفع تعلیق، ورود مشتری به سیستم، تعیین پلن و تغییر پکیج او. |
billing.view | خواندن هزینهٔ ارتقا پیش از انجام آن. |
sites.manage | پاکسازی حافظهٔ پنهان و تهیهٔ نسخهٔ پشتیبان از طریق دکمهها. |
sites.panel_access | تغییر رمز عبور مدیر WordPress. |
hosting.php.manage | تغییر نسخهٔ PHP هنگام ارتقا یا تنزیل پلن. |
⛔ مجوز reseller.manage را اعطا نکنید. کلیدی که در یک پنل صورتحساب الصاق میشود باید بتواند دسترسی مشتری را به دلیل عدم پرداخت معلق کند و او را وارد سیستم نماید. این کلید نباید بتواند اطلاعات درگاه پرداخت خود شما را بخواند و بازنویسی کند. مجوز reseller.provision به همین منظور ایجاد شده است تا مجبور نباشید مجوز گستردهتر را اعطا کنید. ⛔ مجوز org.create اختیاری نیست. بدون آن، ماژول میتواند حسابهای شما را بخواند اما نمیتواند حسابی باز کند؛ بنابراین Test Connection موفقیتآمیز خواهد بود ولی اولین سفارش با خطای 403 مواجه میشود. ⛔⛔ کل جدول را اعطا کنید، و توجه داشته باشید که Test Connection در صورت عدم اعطای آنها نمیتواند این موضوع را به شما اطلاع دهد. این گزینه برنامهٔ نمایندگی شما را میخواند و هیچ چیزی را آمادهسازی نمیکند، بنابراین برای کلیدی که هر یک از این موارد را کم دارد نیز وضعیت سبز نشان میدهد. در عوض، ماهها بعد، با خطای 403 از سوی یک مشتری در همان عملیاتی که مجوز مربوط به آن کم بوده مواجه خواهید شد.
۲. نصب ماژول
۱. ماژول را دانلود کنید و فایل فشرده را باز نمایید. ۲. پوشهٔ zinn را در محل نصب WHMCS خود آپلود کنید تا فایل ماژول در مسیر modules/servers/zinn/zinn.php قرار گیرد.
⛔ نام پوشه حتماً باید zinn باشد. WHMCS نام توابع ماژول آمادهسازی را از روی نام پوشهٔ آن استخراج میکند، بنابراین تغییر نام آن به zinn-whmcs یا zinndigital باعث میشود WHMCS ماژول را فهرست کند و به شما اجازهٔ انتخاب آن را بدهد، اما هرگز آن را فراخوانی نکند — بدون اینکه هیچ خطایی در هیچ جا ثبت شود. فایل فشرده از قبل با نام درست استخراج میشود؛ فقط نام آن را تغییر ندهید.
۳. افزودن سرور
در WHMCS به مسیر: Configuration → System Settings → Servers → Add New Server بروید.
- Name: هر نامی، مثلاً
Zinn Digital®
- Hostname:
api.zinndigital.com
- Type:
Zinn Digital®
- Password: کلید API شما از مرحلهٔ ۱
⛔ کلید در فیلد Password قرار میگیرد که WHMCS آن را بهصورت رمزگذاریشده ذخیره میکند. آن را در فیلدهای تنظیمات محصول (product configuration options) قرار ندهید — آن فیلدها بهصورت متن ساده در پایگاه داده ذخیره میشوند و برای تمام مدیران قابل مشاهده هستند، و این شناسه میتواند میزبانی مشتریان شما را ایجاد یا نابود کند.
روی Test Connection کلیک کنید. این دکمه بهجای صرفاً بررسی پر بودن فیلدها، یک فراخوانی واقعی انجام داده و پاسخ پلتفرم ما را گزارش میدهد.
۴. ایجاد محصول
به مسیر Configuration → System Settings → Products/Services بروید، سپس Module Settings را روی سروری که به تازگی اضافه کردهاید تنظیم کنید. فیلدها عبارتند از:
| فیلد | الزامی | توضیح |
|---|
| Product line | بله | خط محصول Zinn® که میفروشید — mainstream (WordPress مدیریتشده)، footprint_free، wordpress، linux، cloud، agency، app_hosting، ai_hosting، lms_hosting، managed_database، vector_hosting، zinn_compute، fleet_linux، fleet_enterprise، mail یا reseller. |
| Stack | بله | آنچه راهاندازی میشود: wordpress (پیشفرض)، woocommerce، php، static، node، one_click، headless_cms، nextcloud یا owncloud. |
| Application | خیر | فقط برای استکهای one_click و headless_cms — اینکه کدام برنامه نصب شود. تعیین برنامه روی هر استک دیگری رد میشود، زیرا آن استک از قبل تعیین میکند که چه چیزی نصب گردد. |
| PHP version | خیر | مثلاً 8.3. برای استفاده از پیشفرض خط محصول، آن را خالی بگذارید. نسخهای که خط محصول ارائه نمیدهد همراه با فهرست نسخههای پشتیبانیشده رد خواهد شد. |
| Plan code | بله | پلن Zinn® که این محصول میفروشد. مسیر GET /v1/reseller/prices پلنهای شما را فهرست میکند. سفارش بدون آن رد میشود — هشدار زیر را ببینید. |
| Billing interval | خیر | monthly (پیشفرض) یا annual — دورهای که فاکتور عمدهفروشی شما برای این مشتری بر اساس آن صادر میشود. مبلغی که از مشتری خود دریافت میکنید روی محصول WHMCS تنظیم میشود و تحت تأثیر این گزینه نیست. |
⛔⛔ کد پلن (Plan code) الزامی است، و سفارش بدون آن عمداً رد میشود. تا تاریخ 2026-09-01 این فیلد جنبهٔ نمایشی داشت و هیچ چیزی آن را نمیخواند، بنابراین ماژول میزبانیای را سفارش میداد که اصلاً هیچ پلنی نداشت — و تمام پیامدهای آن بیصدا رخ میداد. صورتحساب عمدهفروشی شما از روی اشتراکهای فعال مشتریانتان ساخته میشود، بنابراین ردیفی برای این سرویس وجود نداشت و مادامی که فعال بود هیچ مبلغی برای شما فاکتور نمیشد؛ مشتری شما هیچ سهمیهای دریافت نمیکرد، در نتیجه هیچ سهمیهٔ دیسک یا فایلی روی سایت او اعمال نمیشد؛ و گزینهٔ Change Package هیچ چیزی برای تغییر نداشت، بنابراین ارتقایی که فروخته بودید قابل انجام نبود. با این حال، سایت در تمام این مدت بدون مشکل آمادهسازی شده و به کار خود ادامه میداد.
اکنون ماژول در عوض چنین سفارشی را رد میکند، زیرا هیچ پلن امنی وجود ندارد که ماژول بتواند حدس بزند: یک حدس ممکن است میزبانی را روی پلنی آمادهسازی کند که شما انتخاب نکردهاید و شاید قیمتی برای آن تعیین ننمودهاید، و — برخلاف رد سفارش که بلافاصله آن را مشاهده میکنید — این موضوع تازه هنگام صدور صورتحساب مشخص میشد، اگر اصلاً مشخص میشد.
گزینهٔ Auto Setup را روی هر حالتی که ترجیح میدهید تنظیم کنید — ماژول بر اساس شناسهٔ سرویس WHMCS خاصیت خودتوان (idempotent) دارد، بنابراین تلاش مجدد برای آمادهسازی، همان سایت قبلی را بازمیگرداند نه اینکه هزینهٔ سایت دومی را برای شما فاکتور کند.
عملکرد هر یک از اقدامات WHMCS
| اقدام WHMCS | آنچه در سمت ما رخ میدهد |
|---|
| Create | حساب Zinn® مشتری را ایجاد میکند (یا از حساب موجود استفاده مینماید) و سایت او را آمادهسازی میکند. |
| Suspend | سایت را به دلیل عدم پرداخت معلق میکند. محتوا حفظ میشود؛ هیچ چیزی حذف نمیگردد. |
| Unsuspend | تعلیق اعمالشده از جانب شما را لغو میکند. |
| Terminate | حذف سایت را با یک دورهٔ مهلت زمانبندی میکند. تاریخ در ناحیه کاربری نمایش داده میشود. |
| Usage update | اطلاعات دیسک و پهنای باند را روی تمام سرویسها، روزی یک بار بهروزرسانی میکند. |
| Log in to hosting panel | یک لینک ورود یکبارمصرف را مستقیماً به پنل مشتری شما باز میکند. |
| Change Package | سرویس را ارتقا یا تنزیل میدهد. پکیج را تغییر میدهد، و در صورتی که محصول جدید نسخهٔ PHP مشخصی داشته باشد آن را نیز تغییر میدهد. |
| Change Password | رمز عبور مدیر WordPress را تنظیم میکند. این کادر روی استکهایی که چنین حسابی ندارند ظاهر نمیشود. |
| Renew | تأیید میکند که سرویس همچنان وجود دارد. میزبانی Zinn® پیوسته است، بنابراین دورهٔ زمانی از راه دوری برای تمدید وجود ندارد. |
| Sync Usage / Purge Cache / Take Backup | دکمههایی در صفحهٔ مدیریت سرویس. مشتری شما دکمههای Purge Cache و Take Backup را در ناحیه کاربری خود دریافت میکند. |
| Service tab | وضعیت، پلن، دیسک، پهنای باند، هرگونه حذف زمانبندیشده، و اینکه چه کسی تعلیق را اعمال کرده است. |
| Import | تابع ListAccounts تمام صفحات را میخواند، بنابراین واردسازی اطلاعات نمیتواند بیصدا در صفحهٔ اول متوقف شود. |
ارتقاها: چه کسی از چه کسی هزینه دریافت میکند
از مشتری شما هرگز توسط Zinn®، چه در هنگام سفارش و چه در هنگام ارتقا، هزینهای دریافت نمیشود. شما صورتحساب را از طریق WHMCS برای آنها صادر میکنید؛ ما صورتحساب را برای شما، در صورتحساب عمدهفروشیتان صادر میکنیم. بنابراین یک Change Package دسترسیهای مشتری و ردیف مربوطه را در صورتحساب بعدی شما تغییر میدهد، و با هیچ کارت بانکی سر و کار ندارد — WHMCS پیش از این پول مشتری شما را دریافت کرده و محاسبات تناسبی (proration) خود را انجام داده است.
سرویس دوم یک مشتری. در صورتی که روی همان پلن باشد، سایت دیگری تحت سهمیهٔ مجاز همان پلن خواهد بود، و مورد دیگری اضافه نمیشود. در صورت انتخاب یک پلن متفاوت، سفارش رد میشود: جایگزین کردن پلن فعال باعث میشود یکی از دو سرویس بدون صورتحساب باقی بماند. یا هر دو را روی یک پلن بفروشید، یا مشتری را بهعنوان یک رکورد مشتری مجزا در WHMCS تعریف کنید.
گزینهٔ Change Password فقط برای WordPress وجود دارد. میزبانی Zinn® یک "رمز عبور سرویس" واحد ندارد — مشتری شما با دکمهٔ ورود به پنل خود دسترسی پیدا میکند — و یک سایت php یا static هیچ حساب کاربری برنامهای برای تغییر دادن ندارد. WHMCS بهجای نمایش کادری که کارایی ندارد، آن را کاملاً پنهان میکند.
سه پاسخی که نباید آنها را به دو حالت تقلیل دهید
- گزینهٔ Unsuspend میتواند با یک پاسخ رد مواجه شود. این بدان معناست که سایت توسط تیم بررسی تخلفات (abuse) ما
تعلیق شده است، نه توسط شما، و هیچ پنل صورتحسابی مجاز به رفع تعلیق آن نیست. پیام سیستم این موضوع را بیان میکند؛ بهجای تلاش مجدد، آن را به مدیر خود نشان دهید.
- گزینهٔ Terminate یک حذف را زمانبندی میکند، نه اینکه فوراً آن را انجام دهد. تاریخ در قالب
pending_deletion_at بازگردانده میشود و ناحیه کاربری آن را نشان میدهد. اینکه به مشتری بگویید دادههایش از بین رفته در حالی که هنوز نرفته است، بدتر از این است که چیزی به او نگویید.
- میزان دیسک و پهنای باند میتواند نامشخص (unknown) باشد، و نامشخص بودن به معنای صفر نیست. زمانی که نتوانستهایم
میزان مصرف را بخوانیم، ماژول بهجای نوشتن عدد 0، مقدار را دستنخورده باقی میگذارد — در غیر این صورت WHMCS یک نوار مصرف خالیِ گمراهکننده را برای سایتی که هیچ آماری از آن نداریم به مشتری شما نشان میدهد.
عیبیابی
گزینهٔ Test Connection موفقیتآمیز است اما اولین سفارش با خطای مجوز مواجه میشود. کلید API فاقد مجوز org.create است. ماژول باید بتواند پیش از ایجاد سایت مشتری، حساب او را باز کند.
یک سفارش با این پیام که سازمان فاقد پلن میزبانی است ناموفق میشود. پلن نمایندگی شما سهمیهٔ سایت خالی ندارد، یا هنوز پلنی تهیه نکردهاید. بخش پیش از شروع در بالا را ببینید.
یک سفارش با ذکر نام استک ناموفق میشود. فیلد Stack روی محصول خالی است یا نام موردی را دارد که ما آن را ارائه نمیدهیم. آن را روی wordpress قرار دهید مگر اینکه قصد فروش چیز دیگری را داشته باشید.
فرآیندهای لغو سرویس (Cancellations) با خطا مواجه میشوند. اطمینان حاصل کنید که از ماژول نسخهٔ 1.0.0 یا بالاتر استفاده میکنید. نسخههای قبلی هیچ تأییدیهٔ حذفی ارسال نمیکردند و هر درخواست حذف رد میشد، که باعث میشد سرویس فعال مانده و هزینه بتراشد.
پاسخ ردی که نام یک فیلد را ذکر میکند. خطاهای اعتبارسنجی ما نام فیلد و دلیل آن را داخل قلاب بعد از پیام ذکر میکنند، مثلاً (php_version: 7.2 is not offered on this product line). این بخش، همان بخش قابل اقدام است — جملهٔ قبل از آن عمداً بهصورت عمومی نوشته شده است.
تأیید صحت فایل دانلودشده
تمامی فایلهای آرشیو از طریق پروتکل امن TLS و از نام دامنهٔ خود ما ارائه میشوند و هرگز به یک میزبان شخص ثالث هدایت نمیگردند. چکسام SHA-256 آن در کنار لینک دانلود در صفحهٔ دانلودها درج شده است. پس از دانلود، آن را مقایسه کنید:
- در macOS یا Linux: عبارت
shasum -a 256 zinn-whmcs-1.0.0.zip
- در Windows: عبارت
certutil -hashfile zinn-whmcs-1.0.0.zip SHA256
از WHMCS استفاده نمیکنید؟
یک ماژول HostBill و یک کلاینت تکفایلی PHP برای سایر سیستمها وجود دارد که هر دو رایگان بوده و هر دو در همان صفحهٔ دانلودها قرار دارند. تمام اندپوینتهایی که این ماژولها استفاده میکنند در مرجع API آمده است.