This project integrates with the Mpesa API, providing functionality to trigger payments, validate them, register payment notification URLs, and handle USSD push requests and other requests.
π mpesa-java-docs-et.vercel.app/
- Secure and fullly manged authentication and access token mangement.
- Predefined, ready to use data models like
UssdPushRequest,RegisterUrlRequest,C2BPaymentValidationRequestand more.
- Supports both synchronous and asynchronous API calls for optimal performance.
- Customizable http
Clientfor making HTTP requests to the M-Pesa API.
- Automatic validation for request integrity and error handling.
- Includes tests using MockWebServer for simulating API responses and also contain for actual integration tests.
- Java 11 or higher.
- Maven for dependency management.
- Mpesa API credentials (consumer key, consumer secret).
To integrate Mpesa Payment API into your project, follow these steps:
-
Clone the repository:
git clone https://github.com/dere7/mpesa-sdk.git cd mpesa-sdk -
Install dependencies: For Maven:
mvn install -Dgroups=mocked # This runs only mock tests then install locally
<dependency>
<groupId>io.github.dere7</groupId>
<artifactId>mpesa-sdk</artifactId>
<version>1.1</version>
</dependency>// Create Mpesa instance without configuration
Mpesa mpesa = new Mpesa("test_consumer_key", "test_consumer_secret");
UssdPushRequest request = UssdPushRequest.builder()
.merchantRequestId("4354354351")
.businessShortCode("174379")
.passkey("passkey")
.transactionType("CustomerPayBillOnline")
.amount("10000")
.partyA("600982")
.partyB("600000")
.phoneNumber("251708374149")
.transactionDesc("Monthly Unlimited Package")
.callBackUrl("https://example.com/callback")
.accountReference("34q5125")
.build();
UssdPushResponse response = mpesa.triggerUssdPush(request);
System.out.println(response.getResponseDescription());// Create Mpesa instance with configuration
Configuration config = Configuration.builder()
.baseUrl("https://apisandbox.safaricom.et")
.logLevel(Level.ALL)
.build();
Mpesa mpesa = new Mpesa("test_consumer_key", "test_consumer_secret", config);
UssdPushRequest request = UssdPushRequest.builder()
.merchantRequestId("4354354351")
.businessShortCode("174379")
.password("password")
.timestamp("20250104135017")
.transactionType("CustomerPayBillOnline")
.amount("10000")
.partyA("600982")
.partyB("600000")
.phoneNumber("251708374149")
.transactionDesc("Monthly Unlimited Package")
.callBackUrl("https://example.com/callback")
.accountReference("34q5125")
.build();
UssdPushResponse response = mpesa.triggerUssdPush(request);
System.out.println(response.getResponseDescription());UssdPushRequest request = UssdPushRequest.builder()
.merchantRequestId("4354354351")
.businessShortCode("174379")
.passkey("passkey")
.transactionType("CustomerPayBillOnline")
.amount("10000")
.partyA("600982")
.partyB("600000")
.phoneNumber("251708374149")
.transactionDesc("Monthly Unlimited Package")
.callBackUrl("https://example.com/callback")
.accountReference("34q5125")
.build();
mpesa.triggerUssdPushAsync(request,
response -> {
System.out.println(response.getResponseDescription());
},
error -> {
System.out.println("Error callback should not be invoked");
});- You can create your custom http client and use it to make requests to the API.
// Create a custom client
public class ClientImpl implements Client {
@Override
<T> ResponseClient sendSyncRequest(RequestClient<T> requestClient) {
// YOUR IMPLEMENTATION HERE
};
@Override
<T> void sendAsyncRequest(RequestClient<T> requestClient, CallbackClient callbackClient, CallbackErrorClient callbackErrorClient){
// YOUR IMPLEMENTATION HERE
}
}
// Create Mpesa instance with custom client
Mpesa mpesa = new Mpesa("test_consumer_key", "test_consumer_secret");
mpesa.setClient(new ClientImpl());-
triggerUssdPushTriggers a USSD push request (synchronous).UssdPushResponse response = mpesa.triggerUssdPush(ussdPushRequest);
-
registerPaymentNotificationUrlRegisters a payment notification URL (synchronous).RegisterUrlResponse response = mpesa.registerPaymentNotificationUrl(registerUrlRequest, apiKey);
-
validatePaymentValidates a payment (synchronous).ValidationConfirmationResponse response = mpesa.validatePayment(validationRequest);
-
confirmPaymentConfirms a payment after validation.ValidationConfirmationResponse response = mpesa.confirmPayment(validationRequest);
-
simulatePaymentsimulate a transaction after validation.SimulateResponse response = mpesa.simulatePayment(simulateRequest);
-
payOutPerforms a business-to-customer (B2C) payment (synchronous).SuccessResponse response = mpesa.payOut(payOutRequest);
-
transactionStatusQueries the status of a transaction (synchronous).SuccessResponse response = mpesa.transactionStatus(transactionStatusRequest);
-
transactionReversalReverses a transaction (synchronous).SuccessResponse response = mpesa.transactionReversal(transactionReversalRequest);
-
accountBalanceQueries the balance of the shortcode (synchronous).SuccessResponse response = mpesa.accountBalance(accountBalanceRequest);
For each synchronous method, there is an equivalent asynchronous method. These accept success and error callbacks as parameters:
-
USSD Push
mpesa.triggerUssdPushAsync(ussdPushRequest, response -> System.out.println("Success: " + response), error -> System.err.println("Error: " + error));
-
Payment Notification URL Registration
mpesa.registerPaymentNotificationUrlAsync(registerUrlRequest, apiKey, response -> System.out.println("Success: " + response), error -> System.err.println("Error: " + error));
-
Payment Validation
mpesa.validatePaymentAsync(validationRequest, response -> System.out.println("Validation successful."), error -> System.err.println("Validation failed."));
-
Simulate transaction
SimulateResponse response = mpesa.simulatePayment(simulateRequest); mpesa.simulatePaymentAsync(simulateRequest, response -> System.out.println("initaited simulated transaction"), error -> System.err.println("cannot initiate simulated transaction."));
-
B2C Payment
mpesa.payOutAsync(payOutRequest, response -> System.out.println("Payment successful."), error -> System.err.println("Payment failed."));
-
Transaction Status
mpesa.transactionStatusAsync(transactionStatusRequest, response -> System.out.println("Transaction successful."), error -> System.err.println("Transaction query failed."));
-
Transaction Reversal
mpesa.transactionReversalAsync(transactionReversalRequest, response -> System.out.println("Reversal successful."), error -> System.err.println("Reversal failed."));
-
Account Balance
mpesa.accountBalanceAsync(accountBalanceRequest, response -> System.out.println("Balance fetched."), error -> System.err.println("Failed to fetch balance."));
connectionTimeout: The request timeout in milliseconds (default:5000).maxRetries: The number of times to retry a request in case of failure (default:1).retryOnConnectionFailure: Whether to retry a request in case of connection failure (default:false).baseUrl: The base URL of the M-Pesa API (default:https://apisandbox.safaricom.et).logLevel: Log level for selectively displaying logs (default:Level.SEVERE).
- Errors are raised as
MpesaApiExceptionwith descriptive messages for troubleshooting.
- Asynchronous Handling: Supports non-blocking requests for better performance.
- Logging: Logs API requests and responses for debugging.