uBill SMS — WHMCS
ავტომატური SMS ინვოისზე, შეკვეთაზე, ტიკეტსა და სერვისზე — WHMCS-ის 12 მოვლენა, მიწოდების ქრონოლოგია და WHMCS-ის საკუთარ Notifications-ში ჩაშენება.
პროექტის ნაწილი: uBill
რას აკეთებს
თითოეული მოვლენა ცალკე ირთვება და საკუთარი შაბლონი აქვს.
| მოვლენა | WHMCS-ის hook | ვის მიდის |
|---|---|---|
| ინვოისი გამოიწერა | InvoiceCreated | კლიენტს |
| ინვოისი გადახდილია | InvoicePaid | კლიენტს |
| ვადაგადაცილების შეხსენება | InvoicePaymentReminder | კლიენტს |
| ინვოისი გაუქმდა | InvoiceCancelled | კლიენტს |
| შეკვეთა მიღებულია | AfterShoppingCartCheckout | კლიენტს |
| რეგისტრაცია | ClientAdd | კლიენტს |
| ტიკეტზე პასუხი გაეცა | TicketAdminReply | კლიენტს |
| სერვისი შეჩერდა / აღდგა | AfterModuleSuspend / AfterModuleUnsuspend | კლიენტს |
| ახალი შეკვეთა | AfterShoppingCartCheckout | ადმინს |
| ახალი ტიკეტი | TicketOpen | ადმინს |
| გადახდა შემოვიდა | InvoicePaid | ადმინს |
WHMCS-ს ორი სხვადასხვა ჩასაბმელი წერტილი აქვს და სწორი პასუხი ორივეა:
- Addon module — მთავარი სხეული: შაბლონები, ჟურნალი, ბალანსი, სატესტო გაგზავნა და ზემოთ ჩამოთვლილი 12 მოვლენა.
- Notification Provider — WHMCS-ის საკუთარ „Notifications" წესებში ჩნდება, სადაც ადმინი თავად აწყობს პირობებს და SMS-ს თავის ნომერზე იღებს.
მეორე პირველს ცვლის კი არა, ავსებს.
ეს არ არის „დაიწერა და აწყობილად გამოიყურება". მოდული დაყენდა WHMCS 9.0.7-ზე (Ubuntu 24.04, PHP 8.3 + ionCube, Apache, MariaDB) და გაიარა სრული ციკლი: ნამდვილი კლიენტი → ნამდვილი ინვოისი → გადახდა → hook → SMS მივიდა, მიწოდების სტატუსიც დაბრუნდა.
ცოცხალმა ტესტმა ორი ისეთი ხარვეზი დაიჭირა, რომელსაც ჩვეულებრივი ტესტი ვერ იპოვიდა — ორივე გასწორებულია:
- WHMCS 9-ს სისტემური მისამართი
Domain-ში აქვს და არაSystemURL-ში; ამის გამო callback-ის მისამართი ცარიელი გამოდიოდა. - WHMCS მოდულის
hooks.php-ს მხოლოდ მაშინ კითხულობს, თუ ის „Activate"-ით გააქტიურდა — ბაზიდან ხელით ჩართვისას hook-ები ჩუმად არ იტვირთება.
ამას ემატება 121 ავტომატური ტესტი, რომელთაგან ნაწილი სტრუქტურას ამოწმებს: არარსებულ hook-ს WHMCS ჩუმად უგულებელყოფს — შეცდომა არსად ჩანს, SMS კი არასოდეს გადის. ტესტი სწორედ ამას იჭერს.
ქართული ტექსტი GSM-7 ანბანში არ ჯდება და UCS-2-ით იგზავნება — ერთი SMS 160-ის ნაცვლად 70 სიმბოლოა. მოდული ყოველი შაბლონის ქვეშ იქვე გიწერს კოდირებას, სიმბოლოების რაოდენობასა და სეგმენტებს.
ტიკეტის შეტყობინებას ინვოისის ჯამი არ ეძლევა და პირიქით — ასე ადმინი ვერ ჩასვამს ველს, რომელიც იმ მოვლენაზე ცარიელი იქნებოდა.
- ყველგან:
{client}{first_name}{last_name}{phone}{email}{company}{site}{date} - ინვოისი:
{invoice_num}{total}{currency}{due_date}{status}{invoice_url} - ტიკეტი:
{ticket_mask}{subject}{department}{priority} - სერვისი:
{product}{domain}{service_id} - შეკვეთა:
{order_num}{total}{currency}
ინვოისის სტატუსი და ტიკეტის პრიორიტეტი WHMCS-ში ინგლისურად ინახება — SMS-ში ავტომატურად ქართულად გადადის („Unpaid" → „გადაუხდელი").
uBill-ის ანგარიშის მოთხოვნა მხოლოდ სტატუსს აბრუნებს, დროის გარეშე — ოპერატორის ნამდვილი დრო callback-ში მოდის. მოდულს თან ახლავს callback-ის მიმღები, ამიტომ ჟურნალში სამივე საფეხური თავისი დროით ჩანს:
გადავეცით uBill-ს 27.08.2026 13:33:04
ოპერატორმა გააგზავნა 27.08.2026 13:33:09
აბონენტს მიუვიდა 27.08.2026 13:33:14თუ callback ვერ შემოვა (მაგალითად, ინსტანცია IP-ითაა დაკეტილი), სტატუსი ყოველდღიური cron-ის გამოკითხვით მაინც განახლდება — ოღონდ ტილდით, რადგან ეს ჩვენი შემჩნევის მომენტია და არა ოპერატორის. მიახლოებითს ზუსტად არ ვასაღებთ.
uBill-ის უარი ხშირად კონკრეტულ მიზეზს შეიცავს. მოდული მას არ ყლაპავს: ქართული ახსნის გვერდით ოპერატორის ორიგინალი ტექსტიც წერია.
uBill-მა სერვერის IP არ დაუშვა. ეს მისამართი uBill-ის კაბინეტში
თეთრ სიაში უნდა შეიყვანო. (185.189.209.100 IP address is not allowed)ანუ ჩანს არა მარტო „რაღაც ვერ გამოვიდა", არამედ რომელი მისამართი დაამატო.
- API გასაღები კოდში არსად წერია — WHMCS-ის საკუთარ „Configure" ეკრანზე ინახება, დახურულ ველში.
- ყველა SQL მომზადებული მოთხოვნაა —
WHMCS\Database\Capsule, პირდაპირი SQL არსად. - CSRF საკუთარი გვაქვს. WHMCS მოდულის ავტორს ამისთვის დოკუმენტირებულ ფუნქციას არ სთავაზობს (არსებობს ღია feature request-იც), ამიტომ ტოკენი HMAC-ით ითვლება ადმინის id-ზე, დროის ფანჯარასა და მოდულის საიდუმლოზე. სესიაში არაფერი ინახება.
- callback-ის გასაღები ცალკეა — API-ის გასაღები URL-ში არასოდეს გადის.
- SMS-ის ჩავარდნა WHMCS-ს არ ტეხს — გამონაკლისი იჭერა და ჟურნალში იწერება; ინვოისის გამოწერა ან ტიკეტის პასუხი არ ჩავარდება.
- ჩუმი ჩავარდნა არ არსებობს — ყოველ უარს ჟურნალში მიზეზი უწერია.
მოთხოვნები
| რა | რამდენი |
|---|---|
| WHMCS | 8.13 (LTS) ან 9.x |
| PHP | 8.2 ან 8.3 — WHMCS-ის საკუთარი შეზღუდვაა |
| ionCube Loader | სავალდებულო (WHMCS დაშიფრულია) |
| გაფართოებები | curl, mbstring |
| uBill | ანგარიში API გასაღებითა და დამტკიცებული გამგზავნის სახელით |
uBill გაგზავნას მხოლოდ თეთრ სიაში შეყვანილი IP-დან უშვებს — სერვერის მისამართი uBill-ის კაბინეტში უნდა დაამატო.
- არქივი WHMCS-ის ფესვში გაშალე — შიგთავსი უკვე
modules/…სტრუქტურისაა. - Setup → Addon Modules → uBill SMS → Activate. გააქტიურება სწორედ ღილაკით უნდა მოხდეს: WHMCS მოდულის hook-ებს მხოლოდ ამის შემდეგ კითხულობს.
- იქვე შეავსე API გასაღები და გამგზავნი (brandID).
- Addons → uBill SMS → შემოწმება — თუ ბალანსი დაბრუნდა, კავშირი მუშაობს. იქვე გაგზავნე სატესტო SMS.
- შაბლონები — ჩართე ის მოვლენები, რომლებზეც შეტყობინება გინდა.
პირველ ჯერზე სასარგებლოა სატესტო რეჟიმი: შეტყობინება ჟურნალში ჩაიწერება, ბალანსი კი არ იხარჯება.
Addon module სრული ქართული ინტერფეისით, Notification Provider, uBill-ის თვითკმარი კლიენტი (Composer არ სჭირდება — WHMCS-ის vendor/-თან გაზიარება კლასების შეჯახებას იწვევს), მიწოდების callback-ის მიმღები, ჟურნალის ცხრილი და ავტომატური ტესტები.
რა განახლდა — ვერსია 1.0.0
1.0.0
პირველი გამოშვება.
- 12 მოვლენა: ინვოისი, შეკვეთა, ტიკეტი, სერვისი, რეგისტრაცია
- ცალკე შაბლონი და ჩამრთველი თითოეულზე, ველების ჯგუფებით
- WHMCS Notification Provider — საკუთარ Notifications წესებში ჩნდება
- ჟურნალი მიწოდების ქრონოლოგიით და callback-ის მიმღები
- სატესტო რეჟიმი: ჟურნალი ივსება, ბალანსი არ იხარჯება
- გადამოწმებულია ცოცხალ WHMCS 9.0.7-ზე
220.00 ₾