All Activity
- Today
-
bambookitchenroll changed their profile photo
-
bambookitchenroll joined the community
-
bear started following Analytics tracking notification won't go away
-
Analytics tracking notification won't go away
bear replied to Evolve Web Hosting's topic in Troubleshooting Issues
Moving to another solution is one. š -
efisher started following Plesk Module Hotfix?
-
engr.arianarose joined the community
-
iwin88malaysia joined the community
- Yesterday
-
NRC joined the community
-
Analytics tracking notification won't go away
NRC replied to Evolve Web Hosting's topic in Troubleshooting Issues
This is a ploy! I have 4 licenses on two different servers, and the only way I have found to disable this annoying spyware is to allow it! Kinda feels like you are being forced into their data gathering. There should be a clear and functional OFF switch for this cr*p, running the setup wiz does bugger all, and the so-called off in the admin accounts is greyed out. Yes, my browser does block cookies, but there should be a hard-off at the server-side, not some BS cookies that you don't even know are actually doing anything. I find it really interesting that no one has posted a DB switch to turn this off, and WHMCS is always near silent on the matter. Where is the off switch? -
Marcus1234 joined the community
-
Bruno de Lima Costa started following WHMCS Connect Stop Works
-
Hello, The cPanel control panel was updated tonight, and WHMCS Connect functionality was cut off. Has anyone found a solution to get WHMCS Connect working again? Thank you, Bruno.
-
Bruno de Lima Costa joined the community
-
WHMPress joined the community
-
Ebin V Thomas started following Razorpay Payment Gateway for WHMCS and Plesk Module Hotfix?
-
Dear WHMCS, When will a new Plesk module be released that works with Plesk WHMCS 18.0.80? Ref: https://support.plesk.com/hc/en-us/articles/42276009318423-Unable-to-connect-to-Plesk-18-0-80-from-WHMCS-This-element-is-not-expected
-
aihealthcare joined the community
-
This module is inspired by Razorpay's official open-source razorpay-whmcs plugin, which we found to be full of long-standing bugs affecting real installations ā payments silently failing on modern PHP/WHMCS versions, incorrect amounts being credited to invoices, stale checkout sessions, and more. We rebuilt it: fixed the underlying bugs, hardened it for the latest WHMCS and PHP releases, and added functionality (refunds, dispute/chargeback handling, gateway fee tracking) the original never had. It has been tested on Ucartz's own WHMCS installation and on other WHMCS installations, across a range of payment scenarios (standard checkout, partial payments, late fees, refunds, webhooks). Features Full compatibility with WHMCS 9 and PHP 8.2ā8.3. Razorpay Standard Checkout using Razorpay's current recommended integration pattern. Accurate invoice crediting ā always reflects the amount actually captured by Razorpay for a transaction, never a stale or unrelated invoice value. Database-backed order tracking with safe fallback handling, so a payment attempt is never verified against a stale or incorrect order. Refunds initiated from the WHMCS admin area reach Razorpay, with configurable refund speed (normal / instant). Chargeback/dispute webhook handling ā a lost dispute automatically reverses the payment in WHMCS. Actual Razorpay gateway fee recorded against each transaction for reconciliation. Duplicate-transaction protection and signature verification hardened against replay/tampering. Bugs Fixed The official module had a number of serious, long-standing bugs. Here's everything that was wrong and how it was fixed. Payments failing outright on modern PHP / WHMCS Fatal error on PHP 7+: the callback and webhook handlers called mysql_fetch_assoc() / select_query()ā mysql_fetch_assoc() is a native PHP function that was removed from PHP core in PHP 7.0. WHMCS 9 requires PHP 8.2+, so this call would fatal-error on any modern install, breaking every payment. Replaced with proper database queries (Capsule ORM). TLS 1.1 forced on every API call to Razorpay: the SDK explicitly pinned the connection to TLS 1.1. TLS 1.1 is rejected by most gateways today ā PCI-DSS v4.0.1 requires TLS 1.2+ ā so this silently broke the underlying connection to Razorpay's API. Fixed to use TLS 1.2. Outdated vendored SDK: the bundled Razorpay SDK was version 2.8.1 with a HTTP library from 2015. Updated to the latest official release (2.9.3), keeping every other fix intact on top of it. Wrong amounts being credited to invoices The most serious bug: the payment callback credited invoices using the invoice's stored total, not the amount actually captured by Razorpay for that specific transaction. If a customer paid only a late fee, or made a partial payment, Razorpay correctly charged the smaller amount ā but WHMCS then credited the invoice's full original total regardless, silently over- or under-crediting the account. Fixed to always fetch and credit the exact amount Razorpay actually captured for that payment. Stale Razorpay order reuse: if a customer opened an invoice, left, and returned after a late fee or credit was applied, the module could reuse a cached Razorpay order created for the old (wrong) amount ā including silently reusing it if the API call to re-verify that order failed. Fixed to always create a fresh order whenever the current invoice balance no longer matches the existing order, or whenever that order can't be re-verified. Inconsistent amount rounding: order creation and the checkout form each rounded the same amount differently, causing floating-point "Amount Mismatch" errors. Both paths now round identically. receipt field type rejection: Razorpay's API requires the receipt field to be a string; WHMCS passes invoice IDs as integers, which Razorpay's API rejected outright with expected string but provided .... Fixed by explicitly casting receipt and currency to string. Checkout and signature verification Checkout button not working: the module used an old, auto-embedding <script data-*> checkout pattern that Razorpay's own current documentation says is unreliable ā Razorpay requires checkout.open() to be triggered by a direct user click. Rebuilt using Razorpay's current recommended Standard Checkout pattern (explicit button + click handler), which is the likely root cause of long-standing "Pay Now button does nothing" reports. Missing response fields: the checkout form only captured the payment ID from Razorpay's response, never the order ID or signature, so server-side signature verification had nothing to actually verify and would always fail. Fixed by capturing and submitting all three fields. Unreliable session-based verification: signature verification originally depended on a PHP session set when the invoice page was rendered. Under AJAX-driven "Make Payment" tabs, expired sessions, or 3DS/OTP delays, that session could be lost by the time the callback ran, breaking verification for an otherwise legitimate payment. Verification now prioritizes the order ID Razorpay's own checkout handler returns directly, falling back to the database and then session only if that's missing. Null-pointer risk: the database-backed order lookup could crash when no matching row existed instead of failing safely. No duplicate-transaction protection: neither the callback nor the webhook guarded against the same transaction being processed twice. Double slashes in redirect URLs: a trailing slash on the configured system URL produced broken //viewinvoice.php redirect links. Stored-XSS-shaped gap: client name/email and other dynamic values were concatenated directly into HTML/JS without escaping. Fixed with proper JSON/HTML escaping. Missing functionality No refund support: refunds initiated from the WHMCS admin area only updated the local WHMCS record ā they never actually reached Razorpay. Added real refund support via the SDK, with a configurable refund speed (normal / instant). Gateway fee never recorded: every transaction showed a hardcoded $0 fee, making it impossible to reconcile actual Razorpay settlement amounts. Now records the real fee (including tax) Razorpay deducts, matching the Razorpay Dashboard. Chargebacks/disputes silently ignored: Razorpay's dispute webhooks were never handled at all ā a lost chargeback left the invoice marked Paid and the service running with no reversal and no admin notification. Added full dispute webhook handling: disputes are logged for admin review while open, and a lost dispute automatically reverses the payment in WHMCS (invoice returns to unpaid, standard WHMCS overdue handling takes over). Wrong internal gateway name recorded: the module passed its human-readable display name ("Razorpay") instead of its internal system name to WHMCS's payment-recording function, causing the "Payment Method" column to show blank on the Transactions list and breaking other internal lookups keyed on the module name. Missing company name and other PHP 8 warnings: the checkout modal never showed the merchant's company name, and several $_GET/$_POST accesses and SDK-level deprecation notices were left unguarded on PHP 8.1+. All fixed. Installation Ensure your WHMCS installation is on WHMCS 9 (or WHMCS 6ā8) with PHP 8.2 or later. Download this repository. Upload the contents of the modules/ directory into your WHMCS installation's modules/ directory. Configuration Log into WHMCS as administrator (https://yourdomain.com/admin). Navigate to Setup ā Payments ā Payment Gateways. Choose Razorpay from the Activate dropdown and activate it. Enter your Razorpay Key Id and Key Secret. Optionally enable webhooks and set the Webhook Secret to match what you configure in the Razorpay Dashboard. Click Save Changes.
-
K n K Web Services started following My Name is Saleh!
-
Welcome aboard, Saleh! Awesome that you're diving into WHMCS and WordPress add-ons ā that's a great niche to specialize in. Quick tips: get yourself a staging WHMCS install so you're not testing against live sites, dig into the hooks system early (it'll save you headaches later), and keep an eye on the module queue/admin log when things act weird. Good luck getting started ā post here anytime, folks around here are pretty helpful.
- 1 reply
-
1
- Last week
-
lkitching started following Error processing cards (stripe) WHMCS 8.13.5 -
-
WS Ultimate Captcha Pro V2.0.0 is now available
wsa replied to wsa's topic in Commercial Modules and Addons
Changelog Version: 2.0.1 Fixed: CAPTCHA was blocking adding a domain to produc/service -
Error processing cards (stripe) WHMCS 8.13.5 -
bear replied to slim's topic in Troubleshooting Issues
Same question. We should not have to chase a patch, it should be something easy to find. Having to go to support generally takes a while to get help, where linking to the fix would resolve that and reduce tickets. -
Damo started following Error processing cards (stripe) WHMCS 8.13.5 -
-
Error processing cards (stripe) WHMCS 8.13.5 -
Damo replied to slim's topic in Troubleshooting Issues
Why are hot fixes no longer published here? -
Hi Dam I chose the Square Payment Gateway Module from Modules Stack. It makes integrating Square payments with WHMCS simple and helps streamline the payment process.
-
Error processing cards (stripe) WHMCS 8.13.5 -
slim replied to slim's topic in Troubleshooting Issues
Ok, WHMCS have fixed the issue for me - I can now process via the admin area after they applied the hotfix. Contact them to get it. -
Error processing cards (stripe) WHMCS 8.13.5 -
sol2010 replied to slim's topic in Troubleshooting Issues
Also have this issue. Matter is urgent -
Hello everyone! My name is Saleh, and I have over 10 years of experience as a front-end developer. I've always had a passion for PHP and Laravel. Recently, I decided to pursue a career as an independent developer, focusing on creating small add-ons for WHMCS and WordPress plugins. I would love to hear any advice or tips you have for beginners, as Iām eager to learn from your experiences!
-
ClicToom changed their profile photo
-
Trying to download ImportAssist from Marketplace (https://marketplace.whmcs.com/product/46-importassist ) Using Chrome: the download process just gets stuck, without any error message Using Edge: I got the error "ImportAssist_v1.5.3.69 (2).zip can't be downloaded securely" Using Opera or Tor: the download is completed successfully
-
There's a huge difference between PROFORMA invoice and invoice. The first one is a little more than a sheet of paper: you can issue it as necessary, numbering it or not, editing it, deleting it... it does not follows fiscal laws on invoicing, but just civil laws about contracts or document archiving. After a PROFORMA invoice has been paid, you issue the "real" invoice ( which, it's true, can't be edited, and often is also electronically registered in real time by a government system).
-
Error processing cards (stripe) WHMCS 8.13.5 -
bear replied to slim's topic in Troubleshooting Issues
Be great if there was a public facing way of seeing what those case numbers are. I have at least one I'd like to be able to track, but they don't. They could limit it to license holders if it's a concern over the public or something. Shame. -
Welcome to the community, Hassan! š WordPress + Elementor Pro is a solid combo, especially for clients who want speed and design flexibility without a full custom build. If you ever branch into hosting/WHMCS-adjacent work, feel free to reach out ā always good to have more WordPress folks around here.
-
Ticket attachments in staff email notifications
K n K Web Services replied to vikingo's topic in Using WHMCS
No, there's no native setting for this. WHMCS's own docs "ticket attachments are automatically included in the notification email sent to the client, but explicitly not forwarded to staff in ticket notification emails. That's by design, not a bug or misconfiguration on your end." Working fix ā EmailPreSend hook: This uses the EmailPreSend hook, which lets you inject file attachments into any outgoing email by returning an attachments array. Rather than reaching into the filesystem/DB directly (which breaks if you're on S3 or another external storage backend), it pulls the files through WHMCS's own GetTicket and GetTicketAttachment API actions, so it stays storage-agnostic: <?php add_hook('EmailPreSend', 1, function ($vars) { // Only touch ticket-related notification templates if (stripos($vars['messagename'], 'Support Ticket') === false) { return []; } $ticketId = $vars['relid']; if (!$ticketId) { return []; } $ticket = localAPI('GetTicket', ['ticketid' => $ticketId]); if ($ticket['result'] !== 'success') { return []; } $attachmentsOut = []; $pullAttachment = function ($replyId, $index) use ($ticketId) { $file = localAPI('GetTicketAttachment', [ 'ticketid' => $ticketId, 'replyid' => $replyId, 'index' => $index, ]); return $file['result'] === 'success' ? $file : null; }; // Original ticket message attachments (replyid 0) if (!empty($ticket['attachments']['attachment'])) { foreach ((array) $ticket['attachments']['attachment'] as $i => $att) { if ($file = $pullAttachment(0, $i)) { $attachmentsOut[] = [ 'filename' => $file['filename'], 'data' => base64_decode($file['data']), ]; } } } // Latest reply's attachments (covers reply notifications) if (!empty($ticket['replies']['reply'])) { $lastReply = end($ticket['replies']['reply']); if (!empty($lastReply['attachments'])) { foreach ($lastReply['attachments'] as $att) { if ($file = $pullAttachment($lastReply['replyid'], $att['index'])) { $attachmentsOut[] = [ 'filename' => $file['filename'], 'data' => base64_decode($file['data']), ]; } } } } return $attachmentsOut ? ['attachments' => $attachmentsOut] : []; }); Drop that in includes/hooks/. A couple of notes: The stripos($vars['messagename'], 'Support Ticket') filter is deliberately broad since the exact unique name for your staff-facing notification template can vary (custom departments, renamed templates, etc). If you want to scope it tighter, temporarily add logActivity($vars['messagename']); inside the hook, trigger a test ticket, and check Configuration > System Logs > Activity Log to see the exact name being fired ā then swap the stripos check for an exact match. This will also fire for the client-facing "Support Ticket Reply" template, but since clients already get their own attachments natively, this is redundant, not harmful ā just a marginal size bump. If that bothers you, add a check against $vars['to'] matching your admin email domain, but that's fragile if staff use personal addresses. Tested logic is based on the documented GetTicket/GetTicketAttachment API responses (attachment index + base64 data) ā should hold across supported WHMCS versions since it doesn't touch internal table structure directly. -
v1.2 (Jun 20, 2025) New Feature WD-2 - DNSSEC Integration WD-21 - Letsencrypt integration Improvement WD-24 - On new entry, using @ will translate the host filed to domain. Bug Fix WD-23 - (ADMIN) When updating NS record for root domain, the edit and delete button does not appear after save WD-22 - Fix bug with Clear DNS not clearing MX record
