MOMO.rs is a Rust library for the MOMO payment gateway.
Installation
[]
= "0.1.8"
or you can use cargo add
cargo add mtnmomo
Skipping Integration Tests
This library includes integration tests that require access to the MTN MoMo API. To skip these tests during development, you can use the skip-integration-tests feature:
# Run unit tests only (skip integration tests)
# Or use the make command
To run the full integration tests (requires MTN MoMo API credentials):
# Run all tests including integration tests
# or
MTN Mobile Money API
This package provides for an easy way to connect to MTN MoMo API, it provides for the following products:
- Collection
- Disbursements
- Remittance
- Provisioning in case of sandbox environment
how to use:
use Momo;
use Uuid;
use dotenv;
use env;
async
After initializing the Momo struct, you can then use the collection, disbursement or remittance methods to initialize the respective products. The products have methods that you can use to interact with the API. For example, to request a payment from a customer, you can use the request_to_pay method of the Collection product.
important notes:
mtnmomo::Momo::new_with_provisioning is used to initialize the Momo struct with the sandbox environment.
mtnmomo::Momo::new is used to initialize the Momo struct with the production environment.
example making a request to pay:
use ;
use Uuid;
use dotenv;
use env;
async
The above code will request a payment of 100 EUR from the customer with the phone number "46733123450" (MTN sandbox test number). In the sandbox environment, this test number will simulate a successful payment. The customer will receive a prompt on their phone to confirm the payment. If the customer confirms the payment, the payment will be processed and the customer will receive a confirmation message. If the customer declines the payment, the payment will not be processed and the customer will receive a message informing them that the payment was declined.
Testing with MTN Sandbox
When using the sandbox environment, you should use MTN's predefined test phone numbers:
46733123450- Successful payment46733123451- Payment rejection46733123452- Payment expiry46733123453- Ongoing payment46733123454- Delayed payment (succeeds after 30 seconds)
Callback Server
This library includes a standalone callback server (momo-callback-server) for handling MTN MoMo webhooks. The callback server runs on port 8500 (localhost only) and processes payment notifications from MTN MoMo API. For production deployments, TLS is handled by a reverse proxy like Caddy2.
Installation
The callback server is now a separate crate that can be used as both a standalone binary and a library:
[]
= "0.1.8"
Or add it to your existing project:
[]
= "0.1.8"
= "0.1.8"
Using as a Standalone Binary
To use the callback server as a standalone service:
# Clone the repository
# Build the server
# Run the server
The server will start on http://127.0.0.1:8500.
Using as a Library
You can also integrate the callback server directly into your application:
use ;
use StreamExt;
async
Callback URLs
When making API calls, use your callback server URLs through your reverse proxy:
// For payments
let callback_url = "https://your-domain.com/collection_request_to_pay";
let result = collection.request_to_pay.await;
// For disbursements
let callback_url = "https://your-domain.com/disbursement_deposit_v1";
let result = disbursement.deposit.await;
Available Endpoints
The callback server provides endpoints for all MTN MoMo services:
-
Collection:
POST/PUT /collection_request_to_payPOST/PUT /collection_request_to_withdraw_v1POST/PUT /collection_request_to_withdraw_v2POST/PUT /collection_invoicePOST/PUT /collection_paymentPOST/PUT /collection_preapproval
-
Disbursements:
POST/PUT /disbursement_deposit_v1POST/PUT /disbursement_deposit_v2POST/PUT /disbursement_refund_v1POST/PUT /disbursement_refund_v2POST/PUT /disbursement_transfer
-
Remittances:
POST/PUT /remittance_cash_transferPOST/PUT /remittance_transfer
-
Health Check:
GET /health
Caddy2 Reverse Proxy Configuration
For production deployments, use Caddy2 as a reverse proxy to handle TLS termination. Caddy2 automatically provisions and renews TLS certificates from Let's Encrypt.
- Install Caddy2:
# For Ubuntu/Debian
|
|
- Create a Caddyfile:
# /etc/caddy/Caddyfile
your-domain.com {
reverse_proxy 127.0.0.1:8500
}
- Start Caddy:
With this configuration:
- Caddy2 will automatically obtain a TLS certificate for
your-domain.com - All HTTPS traffic to
your-domain.comwill be forwarded to the callback server on port 8500 - The callback server receives plain HTTP traffic but clients connect via HTTPS
Testing with Caddy2
For local testing with a custom domain, you can use Caddy2 with a hosts file entry:
- Add an entry to your hosts file:
# /etc/hosts
- Create a Caddyfile for local testing:
# /etc/caddy/Caddyfile
test.domain.com {
reverse_proxy 127.0.0.1:8500
tls internal
}
- Restart Caddy:
Now you can access your callback server at https://test.domain.com with a valid TLS certificate (internal CA for local testing).
Features
- 📡 Complete Callback Coverage: Handles all MTN MoMo callback types
- 🩺 Health Monitoring: Built-in health check endpoint for load balancers
- 🛡️ Production Ready: Graceful shutdown, structured logging, comprehensive error handling
- 🔧 Library and Binary: Can be used as both a standalone binary and a library component
- 🔌 Stream-based Processing: Process callbacks as a stream for easy integration
- 🔒 TLS with Caddy2: Production-ready TLS termination with automatic certificate management