{"id":392628,"date":"2026-10-29T14:05:02","date_gmt":"2026-10-29T14:05:02","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/camptix-shashura-mobile-money\/"},"modified":"2026-10-30T17:50:49","modified_gmt":"2026-10-30T17:50:49","slug":"shashura-mobile-money-for-camptix","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/shashura-mobile-money-for-camptix\/","author":23592717,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.0.4","stable_tag":"1.0.4","tested":"7.1.4","requires":"5.8","requires_php":"7.4","requires_plugins":null,"header_name":"Shashura Mobile Money for CampTix","header_author":"Techdom Digital Solutions","header_description":"Accept MTN and Airtel Mobile Money (Uganda) in CampTix through the Shashura gateway.","assets_banners_color":"","last_updated":"2026-10-30 17:50:49","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"","header_author_uri":"https:\/\/techdom.io","rating":0,"author_block_rating":0,"active_installs":0,"downloads":106,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.0.2":{"tag":"1.0.2","author":"cipherwave","date":"2026-10-29 14:04:42","revision":3773101},"1.0.3":{"tag":"1.0.3","author":"cipherwave","date":"2026-10-30 05:14:48","revision":3774399},"1.0.4":{"tag":"1.0.4","author":"cipherwave","date":"2026-10-30 17:50:49","revision":3775816}},"upgrade_notice":{"1.0.4":"<p>Security hardening: the API endpoint can no longer be redirected via site settings (removes the &quot;API Base URL&quot; field). Also adds buyer-facing decline reasons, safer handling of wrong-amount payments and refunds. Recommended for all sites.<\/p>","1.0.3":"<p>Payment pages now show the real MTN\/Airtel logos by default (filter-overridable). Plugin credits also updated: Techdom Digital Solutions, Cipherwave Software Limited.<\/p>","1.0.2":"<p>&quot;Powered by Shashura&quot; is now opt-in (off by default); internal naming made more distinctive. No action needed unless you want the credit link, which you can now turn on in the payment settings.<\/p>","1.0.1":"<p>Plugin renamed to Shashura Mobile Money for CampTix; no functional changes.<\/p>","1.0.0":"<p>Initial release.<\/p>"},"ratings":[],"assets_icons":[],"assets_banners":[],"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.0.2","1.0.3","1.0.4"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3773101,"resolution":"1","location":"assets","locale":"","width":1164,"height":1724},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3774399,"resolution":"2","location":"assets","locale":"","width":6472,"height":2644},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3774399,"resolution":"3","location":"assets","locale":"","width":1608,"height":2187}},"screenshots":{"1":"Payment configuration under CampTix \u2192 Setup \u2192 Payment: credentials, environment selection, and live connection status.","2":"The buyer-facing checkout flow, from entering a mobile number through to the CampTix ticket page.","3":"An optional \"Powered by Shashura\" footer, shown here on the PIN-approval step. Off by default; the site administrator can turn it on from the payment settings."}},"plugin_section":[],"plugin_tags":[37364,15609,141805,37360,289631],"plugin_category":[],"plugin_contributors":[289480,241048],"plugin_business_model":[],"class_list":["post-392628","plugin","type-plugin","status-publish","hentry","plugin_tags-airtel","plugin_tags-camptix","plugin_tags-mobile-money","plugin_tags-mtn","plugin_tags-shashura","plugin_contributors-cipherwave","plugin_contributors-ssebuwufumoses","plugin_committers-cipherwave"],"banners":[],"icons":{"svg":false,"icon":"https:\/\/s.w.org\/plugins\/geopattern-icon\/shashura-mobile-money-for-camptix.svg","icon_2x":false,"generated":true},"screenshots":[{"src":"https:\/\/ps.w.org\/shashura-mobile-money-for-camptix\/assets\/screenshot-1.png?rev=3773101","caption":"Payment configuration under CampTix \u2192 Setup \u2192 Payment: credentials, environment selection, and live connection status."},{"src":"https:\/\/ps.w.org\/shashura-mobile-money-for-camptix\/assets\/screenshot-2.png?rev=3774399","caption":"The buyer-facing checkout flow, from entering a mobile number through to the CampTix ticket page."},{"src":"https:\/\/ps.w.org\/shashura-mobile-money-for-camptix\/assets\/screenshot-3.png?rev=3774399","caption":"An optional \"Powered by Shashura\" footer, shown here on the PIN-approval step. Off by default; the site administrator can turn it on from the payment settings."}],"raw_content":"<!--section=description-->\n<p>Shashura Mobile Money for CampTix adds MTN and Airtel Mobile Money as a payment option for CampTix, the WordPress event ticketing plugin used by WordCamp and community events. It is built for organisers selling tickets in Uganda who need a payment method their attendees already use day to day. This plugin is developed and maintained by Techdom Digital Solutions and is not affiliated with, or endorsed by, the CampTix project.<\/p>\n\n<p>A Shashura merchant account is required to use this plugin. Sign up or log in at <a href=\"https:\/\/shashura.com\">https:\/\/shashura.com<\/a>.<\/p>\n\n<p>The plugin connects CampTix to the Shashura Mobile Money API and handles the full collection lifecycle: number verification, the PIN push to the buyer's phone, settlement confirmation, and reconciliation. It runs against either Shashura's Sandbox or Production environment, and endpoint overrides are controlled by trusted deployment code, never per-site settings. See ENDPOINT-POLICY.md for migration and development testing.<\/p>\n\n<h4>How a payment works<\/h4>\n\n<ol>\n<li>The buyer selects Mobile Money at checkout and enters their MTN or Airtel number.<\/li>\n<li>The number is verified against the network before anything is charged, and the registered account name is shown to the buyer for confirmation.<\/li>\n<li>A PIN prompt is pushed to the buyer's phone for the exact order total.<\/li>\n<li>The plugin confirms the payment with Shashura directly rather than trusting the browser or an incoming webhook on their own. Both only trigger a check; only a status enquiry whose reference and amount match the order can mark it paid.<\/li>\n<li>Once confirmed, the buyer is taken to their CampTix ticket page and receives CampTix's standard confirmation email.<\/li>\n<\/ol>\n\n<h4>Reliability and safety<\/h4>\n\n<ul>\n<li>Every payment prompt on an order is tracked and reconciled, including ones approved after a buyer tried more than once.<\/li>\n<li>A duplicate payment on the same order is detected and flagged to the site administrator for a manual refund, rather than accepted or dropped silently.<\/li>\n<li>Incoming webhooks are verified against an HMAC-SHA256 signature. Unsigned, forged, oversized or mismatched-environment events are rejected.<\/li>\n<li>A per-order lock stops the webhook, the buyer's browser, an order cancellation and CampTix's own timeout sweep from recording conflicting outcomes for the same order at the same time.<\/li>\n<li>A payment approved after an order was cancelled or timed out is still recognised and completes the order.<\/li>\n<li>Works with both current CampTix (2.x) and CampTix 1.4.x, using the reconciliation strategy appropriate to each.<\/li>\n<\/ul>\n\n<h4>Requirements<\/h4>\n\n<ul>\n<li>CampTix, with the ticket currency set to UGX.<\/li>\n<li>A Shashura merchant account with an app configured for Mobile Money collections, and its Client ID, Client Secret and Webhook Secret.<\/li>\n<li>A publicly reachable site, with the server's outbound IP whitelisted on the Shashura app, so callbacks and settlement can reach the plugin.<\/li>\n<\/ul>\n\n<h3>Getting Your Shashura API Credentials<\/h3>\n\n<p>This plugin needs three values from your Shashura merchant account: a Client ID, a Client Secret, and a Webhook Secret. All three are issued from the Apps page of your Shashura merchant dashboard.<\/p>\n\n<ol>\n<li>Log in to your Shashura merchant dashboard at <a href=\"https:\/\/shashura.com\">https:\/\/shashura.com<\/a> and open the Apps page. If you don't have an account yet, sign up there first.<\/li>\n<li>Click Create App and give it a name, such as your event site's name. Shashura generates a Sandbox credential pair and a Production credential pair for the app at the same time, along with a Webhook Signing Secret, so there is no separate step to request production access later.<\/li>\n<li>The Apps page lists each Client ID against its environment:\n\n<ul>\n<li>Client ID: SANDBOX begins with <code>TID_<\/code>. Use this, with its matching Client Secret, while Environment is set to Sandbox in this plugin.<\/li>\n<li>Client ID: PRODUCTION begins with <code>PID_<\/code>. Use this, with its matching Client Secret, once Environment is switched to Production.<\/li>\n<li>Client Secret is hidden by default. Use the reveal icon to display it on screen, or the regenerate icon to issue a new one. Regenerating immediately invalidates the previous secret, so update this plugin's settings straight after.<\/li>\n<\/ul><\/li>\n<li>Copy the Client ID and Client Secret for the environment you are configuring into this plugin's Payment settings.<\/li>\n<li>Reveal the Webhook Signing Secret (begins with <code>whsec_<\/code>) on the same Apps page and copy it into this plugin's Webhook Secret field.<\/li>\n<li>Copy the webhook URL this plugin displays under its Webhook Secret field and paste it into the Callback URL field for the same app on the Apps page.<\/li>\n<li>Ask Shashura to whitelist your server's outbound IP address for this app, so callbacks and settlement checks are accepted.<\/li>\n<\/ol>\n\n<p>Because each app holds both a Sandbox and a Production credential pair, going live does not require creating a new app; only switching this plugin's Environment setting to Production and swapping in the Production Client ID and Secret from the same Apps page.<\/p>\n\n<h3>External services<\/h3>\n\n<p>This plugin connects to the Shashura Mobile Money API to collect ticket payments. This is required functionality: without it, the plugin cannot verify mobile numbers, push PIN prompts, or confirm payment, since Mobile Money collection can only happen through a licensed Mobile Money aggregator.<\/p>\n\n<p>What is sent, and when:<\/p>\n\n<ul>\n<li>Number verification: when a buyer enters a mobile number at checkout, that number is sent to Shashura to look up the registered account name on the MTN\/Airtel network, shown to the buyer for confirmation before anything is charged.<\/li>\n<li>Payment request: once the buyer confirms, the mobile number, the order total, and an order reference are sent to Shashura to push a PIN prompt to the buyer's phone.<\/li>\n<li>Status confirmation: after a prompt is sent, this plugin asks Shashura directly whether the referenced payment succeeded (and Shashura also notifies this plugin via a signed webhook). No card numbers, mobile money PINs, or other site data are sent.<\/li>\n<li>These calls happen only when a buyer actually attempts a Mobile Money payment at checkout, never on a page load with no checkout activity.<\/li>\n<\/ul>\n\n<p>This service is provided by Shashura (operated by Techdom Digital Solutions): <a href=\"https:\/\/shashura.com\/terms\">Terms of Service<\/a>, <a href=\"https:\/\/shashura.com\/privacy\">Privacy Policy<\/a>.<\/p>\n\n<p>A Shashura merchant account, with an app's Client ID and Client Secret, is required to use this plugin. See \"Getting Your Shashura API Credentials\" above.<\/p>\n\n<h3>Additional Information<\/h3>\n\n<h4>About Shashura<\/h4>\n\n<p>Shashura is a Mobile Money payment gateway for Uganda, settling payments through MTN and Airtel Mobile Money. A Shashura merchant account is required to use this plugin. Sign up or log in at <a href=\"https:\/\/shashura.com\">https:\/\/shashura.com<\/a>.<\/p>\n\n<h4>Privacy<\/h4>\n\n<p>Against each paid order, this plugin stores the payer's registered name, a masked mobile number, the mobile network, and the Shashura transaction reference, for reconciliation and support. Full, unmasked phone numbers and names are included in WordPress's own Tools \u2192 Export Personal Data and Erase Personal Data tools, so data-subject requests are handled through core WordPress, not a separate process. This plugin never handles or stores card numbers, mobile money PINs, or Shashura account credentials.<\/p>\n\n<h4>Support<\/h4>\n\n<p>For help with a Shashura account, API credentials, or a specific payment, contact Shashura support through the merchant dashboard at <a href=\"https:\/\/shashura.com\">https:\/\/shashura.com<\/a>. For issues with this plugin itself, use this plugin's support forum on WordPress.org.<\/p>\n\n<h4>Testing<\/h4>\n\n<p>An automated end-to-end suite (92 checks) has been run against WordPress with both current CampTix (2.x) and CampTix 1.4.x, covering the full payment lifecycle: KYC errors, underpayment, wrong reference, forged or replayed webhooks, double approval, telco rejection, token expiry, cancel races, concurrent webhook and browser settlement, the timeout sweep, rate limits, and privacy export\/erase. An independent security review of the code and a live test deployment was also carried out, with every finding fixed and covered by the test suite.<\/p>\n\n<h4>Credits<\/h4>\n\n<ul>\n<li><strong>Developed and maintained by:<\/strong> Techdom Digital Solutions (<a href=\"https:\/\/techdom.io\">https:\/\/techdom.io<\/a>)<\/li>\n<li><strong>Contributors:<\/strong> Cipherwave Software Limited (<a href=\"https:\/\/cipherwavesolutions.com\">https:\/\/cipherwavesolutions.com<\/a>), Moses Ssebuwufu (<a href=\"https:\/\/profiles.wordpress.org\/ssebuwufumoses\/\">ssebuwufumoses<\/a> on WordPress.org, <a href=\"https:\/\/github.com\/ssebuwufumoses\">@ssebuwufumoses<\/a> on GitHub)<\/li>\n<li><strong>Trademarks:<\/strong> The MTN MoMo and Airtel Money logos in <code>assets\/images<\/code> are trademarks of MTN and Airtel.<\/li>\n<\/ul>\n\n<h4>Developer Filters<\/h4>\n\n<p>The following filters are available to adjust plugin behaviour from a theme or another plugin:<\/p>\n\n<ul>\n<li><code>shasmomo_lookups_per_ip<\/code> (default 20): number verification checks allowed per visitor IP per hour.<\/li>\n<li><code>shasmomo_lookups_alert<\/code> (default 300): site-wide number verification checks per hour that trigger an admin email.<\/li>\n<li><code>shasmomo_client_ip<\/code>: overrides the IP address used for rate limiting.<\/li>\n<li><code>shasmomo_accent_color<\/code> (default #1d4ed8): accent colour used on the payment pages.<\/li>\n<li><code>shasmomo_http_timeout<\/code> (default 25): timeout, in seconds, for calls to the Shashura API.<\/li>\n<li><code>shasmomo_base_url<\/code> (default https:\/\/shashura.com\/api\/v1): trusted deployment override requiring HTTPS and WordPress safe HTTP validation. Per-site endpoint settings are ignored.<\/li>\n<\/ul>\n\n<!--section=installation-->\n<ol>\n<li>Install and activate CampTix. Under Tickets \u2192 Setup \u2192 General, set the ticket currency to UGX.<\/li>\n<li>Upload the plugin zip file under Plugins \u2192 Add New \u2192 Upload Plugin, then activate it.<\/li>\n<li>Go to Tickets \u2192 Setup \u2192 Payment and open the Mobile Money (MTN \/ Airtel) section:\n\n<ul>\n<li>Set Enabled to Yes.<\/li>\n<li>Enter the Client ID and Client Secret from your Shashura app (see \"Getting Your Shashura API Credentials\" below).<\/li>\n<li>Choose Sandbox while testing. Switch to Production only when ready to take real payments.<\/li>\n<li>Enter the Webhook Secret shown on your Shashura app. Mobile Money is not offered at checkout until this is set.<\/li>\n<li>API endpoints are controlled by trusted deployment code; see ENDPOINT-POLICY.md.<\/li>\n<\/ul><\/li>\n<li>Copy the webhook URL shown under Webhook Secret and set it as the Callback URL on the matching app in your Shashura dashboard.<\/li>\n<li>Ask Shashura to whitelist your server's outbound IP address for that app. Requests from an IP that is not whitelisted are rejected.<\/li>\n<li>Save your settings. The Connection line confirms whether the credentials authenticate successfully.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"which%20currencies%20are%20supported%3F\"><h3>Which currencies are supported?<\/h3><\/dt>\n<dd><p>Uganda Shillings (UGX) only, matching Shashura's Mobile Money coverage.<\/p><\/dd>\n<dt id=\"does%20this%20plugin%20process%20refunds%3F\"><h3>Does this plugin process refunds?<\/h3><\/dt>\n<dd><p>Yes. Use CampTix's own \"Refund\" button on the attendee screen \u2014 full, partial, and refund-all are all supported. Only the amount the organizer actually received is reversed; Shashura's processing fee is not refunded. The attendee gets the refunded amount back on the same phone number that paid.<\/p><\/dd>\n<dt id=\"what%20happens%20if%20a%20buyer%20closes%20the%20browser%20tab%20after%20approving%20the%20pin%20prompt%3F\"><h3>What happens if a buyer closes the browser tab after approving the PIN prompt?<\/h3><\/dt>\n<dd><p>The payment still settles. Shashura's webhook, and CampTix's own timeout check on CampTix 2.x, both ask Shashura directly whether the order was paid, independently of whether the buyer's browser is still open.<\/p><\/dd>\n<dt id=\"can%20i%20switch%20between%20sandbox%20and%20production%20while%20orders%20are%20still%20open%3F\"><h3>Can I switch between Sandbox and Production while orders are still open?<\/h3><\/dt>\n<dd><p>Avoid it. A prompt sent under one environment cannot be checked while the plugin is configured for the other. It stays in a waiting state, never shown as failed, until the environment is switched back.<\/p><\/dd>\n<dt id=\"where%20do%20i%20see%20what%20happened%20on%20a%20specific%20order%3F\"><h3>Where do I see what happened on a specific order?<\/h3><\/dt>\n<dd><p>Open the attendee's edit screen under Tickets \u2192 Attendees. The CampTix log on that screen records every check, error, amount mismatch or duplicate-payment warning for that order.<\/p><\/dd>\n<dt id=\"can%20this%20connect%20to%20a%20shashura%20deployment%20other%20than%20the%20public%20default%3F\"><h3>Can this connect to a Shashura deployment other than the public default?<\/h3><\/dt>\n<dd><p>Yes. A trusted deployment operator can set SHASMOMO_BASE_URL or use shasmomo_base_url. Per-site URL settings are ignored. See ENDPOINT-POLICY.md.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.0.4<\/h4>\n\n<ul>\n<li>Hardened the API endpoint: removed the per-site \"API Base URL\" setting entirely (including silently clearing any previously saved value). The endpoint is now fixed to Shashura's public API unless explicitly overridden by trusted deployment code (a <code>SHASMOMO_BASE_URL<\/code> constant in <code>wp-config.php<\/code>), never by a site's saved settings \u2014 closing a path where a compromised or tampered settings save could have redirected API credentials to another server. All requests now go through WordPress's safe HTTP transport, which blocks requests to private\/internal network addresses.<\/li>\n<li>The buyer now sees a specific reason when a payment is declined (not enough balance, wrong PIN, cancelled, timed out, etc.) instead of a generic \"declined or expired\" message.<\/li>\n<li>A payment collected for the wrong amount is no longer treated as a failed payment. It's held for reconciliation instead: the buyer is told not to pay again, the order is never auto-cancelled, and the site administrator is emailed once with the details needed to resolve it.<\/li>\n<li>Refunds are now confirmed, not assumed. CampTix is only told a refund succeeded once Shashura confirms the customer's phone actually received the money \u2014 a reversed ledger entry with an unconfirmed or failed payout now holds the order for manual reconciliation instead of silently reporting success. Concurrent or repeated refund clicks on the same order are blocked while one is in progress.<\/li>\n<li>A refund payout that resolves after the fact (the common case for MTN, which confirms asynchronously) now automatically clears that reconciliation hold once Shashura confirms delivery, instead of requiring a manual check.<\/li>\n<\/ul>\n\n<h4>1.0.3<\/h4>\n\n<ul>\n<li>The buyer-facing payment pages now show the actual MTN MoMo and Airtel Money logos instead of a coloured badge with the network name. A site without permission to use the official logos can restore the plain badge, or supply its own image, through the <code>shasmomo_network_logo<\/code> filter.<\/li>\n<li>Updated plugin credits: now developed and maintained by Techdom Digital Solutions. Added Cipherwave Software Limited and Moses Ssebuwufu as contributors.<\/li>\n<\/ul>\n\n<h4>1.0.2<\/h4>\n\n<ul>\n<li>Added refund support: CampTix's \"Refund\" button (single, partial, and refund-all) now works through the Shashura API. The attendee's money is sent back to the phone that paid; Shashura's processing fee is not refunded.<\/li>\n<li>The \"Powered by Shashura\" credit link on buyer-facing payment pages is now off by default and only shown if the site administrator explicitly turns it on in the payment settings.<\/li>\n<li>Renamed internal functions, classes, defines and filters from the generic \"ctx_shashura\"\/\"CTX_Shashura\" prefix to a more distinctive \"shasmomo\"\/\"Shasmomo\" prefix, to avoid clashing with other plugins.<\/li>\n<li>Fixed the plugin header's License field to a format reliably recognised by the Plugin Check tool.<\/li>\n<\/ul>\n\n<h4>1.0.1<\/h4>\n\n<ul>\n<li>Renamed from \"CampTix Shashura Mobile Money\" to \"Shashura Mobile Money for CampTix\" to avoid implying official affiliation with the CampTix project.<\/li>\n<li>Documented the plugin's use of the Shashura Mobile Money API under \"External services\".<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>Initial release. MTN and Airtel Mobile Money collection for CampTix via the Shashura API, with number verification, webhook and status-enquiry reconciliation, duplicate-payment detection, and support for both CampTix 2.x and 1.4.x.<\/li>\n<\/ul>","raw_excerpt":"Accept MTN and Airtel Mobile Money for CampTix ticket sales in Uganda, settled through the Shashura payment gateway. Not affiliated with or endorsed b \u2026","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/392628","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=392628"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/cipherwave"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=392628"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=392628"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=392628"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=392628"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=392628"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=392628"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}