BSS HostKhaneh

قیمت دامنه (انبار پسوند — مثل WHMCS Domain Pricing)

← بازگشت به راهنما

قیمت دامنه (انبار پسوند — مثل WHMCS Domain Pricing)



> version: 1.15 | last_updated: 2026-09-29 | audience: admin

مسیر UI



**پنل شرکت** → تنظیمات → **قیمت دامنه** (`/panel/domain-tlds`)

نیاز به لایسنس خانوادهٔ **فروش دامنه** (`domain`).

فروشگاه مشتری (فاز ۲)



  • `/domains` — جستجو + WHOIS + قیمت ماتریس → [`docs/customer/domain-lookup.md`](../customer/domain-lookup.md)

  • `/domains/checkout` — ثبت سفارش با `priceIrr` و سال انتخابی

  • پیش‌نیاز: یک محصول کاتالوگ از نوع **دامنه** (دسته خودکار)


  • فاز ۳ — رجیسترار واقعی



    پس از پرداخت، `DomainModule` دیگر فقط شبیه‌سازی نمی‌کند. در **سرورهای بیرونی** وقتی نوع اتصال را **دامنه** می‌گذارید، کمبوباکس رجیسترار می‌آید و بعد فقط فیلدهای همان رجیسترار نمایش داده می‌شود. همان سرور را به پسوند وصل کنید (`provisioning_server_id` + در صورت نیاز `auto_register`).

    | درایور | کاربرد | فیلدهای مهم اتصال |
    |--------|--------|-------------------|
    | `api_ir` | `.ir` از طریق [api.ir / WebAlfa](https://www.api.ir/web-service/وب-سرویس-ثبت-دامنه-ir/) | `api_key`, `holder`, `admin`, `tech`, `bill`, `ns1`… |

    **خروجی شبکهٔ `api_ir`:** میزبان پیش‌فرض `api.webalfa.net` است (نه `.ir`). باید **مستقیم** از سرور BSS برود، نه از SOCKS/HTTP پروکسی خارجی (`PROVISIONING_FOREIGN_HTTP_PROXY`). در `OutboundHttpProxy` برای `api.webalfa.net` / `.webalfa.net` / `api.ir` bypass فعال است و پروکسی محیطی هم قطع می‌شود. اگر DNS داخلی ایران برای `api.webalfa.net` مقدار NXDOMAIN داد، روی سرور در `/etc/hosts` بنویسید: `5.144.130.137 api.webalfa.net`. گواهی فعلی آن میزبان مشکل دارد؛ کلاینت پیش‌فرض SSL را سخت‌گیرانه verify نمی‌کند (`verify_ssl=true` در کانفیگ سرور اگر بعداً درست شد).

    **وضعیت ۱۴۰۴/۰۹:** رکورد DNS عمومی `api.webalfa.net` حذف شده و IP قدیمی فقط صفحهٔ هاستینگ (`linux37` / HTML 404) برمی‌گرداند — وب‌سرویس WebAlfa از سمت آن‌ها بالا نیست. تا وقتی آدرس API جدید نداده‌اند، ثبت از صف با پیام «endpoint … در دسترس نیست» می‌ماند؛ یا API URL جدید را در سرور دامنه بگذارید یا رجیسترار را به `systemnic` عوض کنید.
    | `systemnic` | `.ir` از طریق SystemNIC (SOAP) | `api_user`, `api_pass`, شناسه‌های IRNIC، NS |
    | `resellerclub` | gTLD بین‌المللی (LogicBoxes) | `auth_userid`, `api_key`, `customer_id`, `contact_id`, NS |
    | `opensrs` | OpenSRS XML | `username`, `api_key`, contact کامل، NS |
    | `joker` | Joker DMAPI | `username`, `password`, `owner_c`…، NS |
    | `onlinenic` | OnlineNIC API4 | `user`, `apikey`, `password`, `registrant`, NS |

  • اگر `auto_register` روی پسوند خاموش باشد، ثبت فقط در صف دستی می‌ماند (بدون تماس رجیسترار).

  • Sandbox سرور: برای درایورهایی که OTE دارند به endpoint تست می‌رود؛ برای `api_ir`/`systemnic` بدون OTE جدا، تماس زنده زده نمی‌شود و نتیجهٔ `sandbox_skip` برمی‌گردد.

  • تمدید دامنه از فروشگاه همان اشتراک موجود را جلو می‌برد (اشتراک تکراری ساخته نمی‌شود) و اکشن `renew` را به رجیسترار می‌فرستد.


  • مسیر کد: `modules/Provisioning/Registrars/` + کلاینت‌ها در `modules/Provisioning/Clients/*DomainClient.php`.

    مدیریت بعد از فروش (پورتال)



    صفحهٔ مدیریت دامنه برای اشتراک‌های `domain`: NS / EPP / قفل / WHOIS privacy — سرویس `DomainServiceManagementService`. API زنده روی همهٔ درایورها (با محدودیت‌های .ir و SystemNIC unlock-only). جزئیات مشتری: [`docs/customer/domain-lookup.md`](../customer/domain-lookup.md).

    اکشن دسته‌ای روی لیست پسوند



    پس از انتخاب چند ردیف:

    | اکشن | کار |
    |------|-----|
    | سرور / ثبت خودکار | `provisioning_server_id` + `auto_register` |
    | Grace / Redemption | روز و هزینه (فقط فیلدهای پرشده) |
    | فعال / غیرفعال کردن | `is_active` |

    پیشنهاد جستجو



    روی هر پسوند تیک **پیشنهاد در جستجو** (`suggest_on_search`) هست و از لیست هم عوض می‌شود. اگر روشن باشد، پایین نتیجهٔ `/domains` همان پسوند هم استعلام WHOIS می‌شود. اگر خاموش باشد، فقط وقتی مشتری خودش همان پسوند را بنویسد بررسی می‌شود. پسوندهای موجود پیش‌فرض روشن می‌مانند.

    هم‌ترازی با WHMCS



    | WHMCS Domain Pricing | BSS |
    |----------------------|-----|
    | لیست TLD | `domain_tlds` |
    | Register / Renew / Transfer × ۱–۱۰ سال | `domain_tld_prices.amount` |
    | ارز | `domain_tlds.currency` = `IRR` یا `USD` |
    | خالی / `-1` = غیرفعال | همان |
    | Grace / Redemption | روز + هزینه روی TLD (همان `currency`) |
    | Auto Registration | `auto_register` + سرور `domain` |
    | DNS / Email / ID Protection | فلگ روی TLD |
    | ایجاد دسته‌ای | دکمه **ایجاد دسته‌ای** + **نمونه Excel** |
    | Registrar API | فاز ۳ ✅ — درایورهای بالا |
    | Registrar TLD Sync (کشیدن قیمت از رجیسترار) | هنوز خارج از فاز ۳ |
    | Lookup / WHOIS / checkout مشتری | فاز ۲ ✅ — ثبت + انتقال + تمدید |

    ارز ریال / دلار



  • روی هر پسوند فیلد **واحد قیمت** (`currency`)

  • اگر `USD` باشد، اعداد ماتریس **و** هزینه‌های Grace / Redemption دلاری ذخیره می‌شوند (فقط در پنل ادمین)

  • برای مشتری و فاکتور: همیشه **ریال** از `priceIrr()` / `graceFeeIrr()` / `redemptionFeeIrr()` با `UsdIrrRateService` — مبلغ دلاری خام در فروشگاه نمایش داده نمی‌شود

  • هنگام **ایجاد/ویرایش** پسوند دلاری: `ensureUsableRate` نرخ روز را در صورت نیاز از TGJU تازه می‌کند؛ اگر نرخ ذخیره‌شده نسبت به خام خراب باشد، از خام ترمیم می‌شود

  • اگر نرخ دلار تنظیم نباشد، قیمت سال‌ها خالی می‌ماند و پیام «نرخ دلار … تنظیم نشده» دیده می‌شود (نه «رایگان»)


  • ایجاد دسته‌ای (Excel)



  • دکمه **نمونه Excel** → فایل `domain-tlds-sample.xlsx`

  • ستون اجباری: `extension` — ستون `currency` = `IRR` یا `USD`

  • قیمت‌ها: `register_1y` / `renew_1y` / `transfer_1y` … تا `_10y`

  • دکمه **ایجاد دسته‌ای** → آپلود یا چسباندن

  • گزینه‌ها: رد تکراری / به‌روزرسانی موجود


  • بدون هدر: `extension, register_1y, renew_1y, transfer_1y [, is_active]`

    سرویس: [`DomainTldImportService`](../../modules/ProductCatalog/Services/DomainTldImportService.php)

    مدل داده



  • `domain_tlds` — پسوند + `currency`

  • `domain_tld_prices` — `(action, years, amount)` در واحد همان پسوند

  • [`DomainPricingService`](../../modules/ProductCatalog/Services/DomainPricingService.php): `price()` خام، `priceIrr()` / `graceFeeIrr()` / `redemptionFeeIrr()` ریال مشتری