ყველა პროდუქტი

uBill SMS — WHMCS

ავტომატური SMS ინვოისზე, შეკვეთაზე, ტიკეტსა და სერვისზე — WHMCS-ის 12 მოვლენა, მიწოდების ქრონოლოგია და WHMCS-ის საკუთარ Notifications-ში ჩაშენება.

Hello Div

პროექტის ნაწილი: uBill

კატეგორია პლაგინი / მოდული
პლატფორმა WHMCS 8.13+ / 9.x · PHP 8.2–8.3
ვერსია 1.0.0
მიწოდება ZIP არქივი · 49.6 KB

რას აკეთებს

თითოეული მოვლენა ცალკე ირთვება და საკუთარი შაბლონი აქვს.

მოვლენა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-ს არ ტეხს — გამონაკლისი იჭერა და ჟურნალში იწერება; ინვოისის გამოწერა ან ტიკეტის პასუხი არ ჩავარდება.
  • ჩუმი ჩავარდნა არ არსებობს — ყოველ უარს ჟურნალში მიზეზი უწერია.

მოთხოვნები

რარამდენი
WHMCS8.13 (LTS) ან 9.x
PHP8.2 ან 8.3 — WHMCS-ის საკუთარი შეზღუდვაა
ionCube Loaderსავალდებულო (WHMCS დაშიფრულია)
გაფართოებებიcurl, mbstring
uBillანგარიში API გასაღებითა და დამტკიცებული გამგზავნის სახელით

uBill გაგზავნას მხოლოდ თეთრ სიაში შეყვანილი IP-დან უშვებს — სერვერის მისამართი uBill-ის კაბინეტში უნდა დაამატო.


  1. არქივი WHMCS-ის ფესვში გაშალე — შიგთავსი უკვე modules/… სტრუქტურისაა.
  2. Setup → Addon Modules → uBill SMS → Activate. გააქტიურება სწორედ ღილაკით უნდა მოხდეს: WHMCS მოდულის hook-ებს მხოლოდ ამის შემდეგ კითხულობს.
  3. იქვე შეავსე API გასაღები და გამგზავნი (brandID).
  4. Addons → uBill SMS → შემოწმება — თუ ბალანსი დაბრუნდა, კავშირი მუშაობს. იქვე გაგზავნე სატესტო SMS.
  5. შაბლონები — ჩართე ის მოვლენები, რომლებზეც შეტყობინება გინდა.

პირველ ჯერზე სასარგებლოა სატესტო რეჟიმი: შეტყობინება ჟურნალში ჩაიწერება, ბალანსი კი არ იხარჯება.


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 ₾

გადახდის შემდეგ ჩამოტვირთვის ბმულს ელფოსტაზე მიიღებთ.

შეფასებები

შეფასებას ტოვებს მხოლოდ მყიდველი — შედი ანგარიშში და შეიძინე პროდუქტი.

ამ პროდუქტს შეფასება ჯერ არ აქვს — პირველი შენ დაწერე.