The MTN Mobile Money SDK

Overview

mtn-mobilemoney-java-sdk

###Introduction

The MTN Mobile Money platform is currently available in 15 countries serving millions of subscribers. The platform processes at least $1b transaction volume monthly, and has thousands of providers integrated to the platform.

The MTN Mobile Money platform introduced the OpenAPI that serves as the central integration point to the platform, aimed at harmonizing integration processes across its footprints.

There are three main use case categories of the OpenAPI;

  1. Collections
  2. Disbursements
  3. Remittances

The following are the details of the use cases available on the MTN Mobile Money Open API;

  1. RequestToPay - This API is used in cases where you need a registered mobile money customer to make a payment, before/after a service, requiring authorization and consent from the customer. In this case, the customer is prompted about the transaction (most times via a USSD push), and on approval, the transaction is either in SUCCESSFUL, FAILED or PENDING state.

  2. Transfer - The use case allow you to transfer money from your provider account to a customer. In this case, a provider can use this service to exchange cash/service for e-money on the Mobile Money platform.

  3. AccountHolder Validation - The use case allows a third party application to verify and/or validate if an accountholder is active and able to receive funds. It however does not validate if the customer can receive an amount into the wallet.

  4. Get Balance - The API checks the default account balance of a registered account holder.

  5. Delivery Notification - The service provides an additional notification to the customer after a financial transaction is completed successfully.

Installation

The MTN Mobile Money Java SDK can be added as a library to your Java project as a JAR dependency.

####1 - Create API user (sandbox users)

   final MTNMobileMoney mtnMobileMoney = MTNMobileMoney.builder()
            .environment(Environment.SANDBOX)
            .build();
    final String apiUser = UUID.randomUUID().toString();
    mtnMobileMoney.user().createAPIUser(SUBSCRIPTION_KEY, CALLBACK_HOST, apiUser);

####2 - Create API Key

    final MTNMobileMoney mtnMobileMoney = MTNMobileMoney.builder()
            .environment(Environment.SANDBOX)
            .build(); 
    final String apiUser = UUID.randomUUID().toString();
    mtnMobileMoney.user().createAPIUser(SUBSCRIPTION_KEY, CALLBACK_HOST, apiUser);
    final ApiKey apiKey = mtnMobileMoney.user().createAPIKey(SUBSCRIPTION_KEY, apiUser);

####3 - Validate API User

    final MTNMobileMoney mtnMobileMoney = MTNMobileMoney.builder()
            .environment(Environment.SANDBOX)
            .build();
    final String apiUser = UUID.randomUUID().toString();
    mtnMobileMoney.user().createAPIUser(SUBSCRIPTION_KEY, CALLBACK_HOST, apiUser);
    Boolean validateStatus = mtnMobileMoney.user().validateApiUser(SUBSCRIPTION_KEY, apiUser);

####4 - Collections - access token

    final MTNMobileMoney mtnMobileMoney = MTNMobileMoney.builder()
            .environment(Environment.SANDBOX)
            .collectionSubscriptionKey(COLLECTION_SUBSCRIPTION_KEY)
            .build();
    final String apiUser = UUID.randomUUID().toString();
    mtnMobileMoney.user().createAPIUser(COLLECTION_SUBSCRIPTION_KEY, CALLBACK_HOST, apiUser);
    final ApiKey apiKey = mtnMobileMoney.user().createAPIKey(COLLECTION_SUBSCRIPTION_KEY, apiUser);
    final AccessToken accessToken = mtnMobileMoney.collections().requestAccessToken(apiUser, apiKey.getApiKey());

####5 - Collections - Request to pay

    final MTNMobileMoney mtnMobileMoney = MTNMobileMoney.builder()
            .environment(Environment.SANDBOX)
            .collectionSubscriptionKey(COLLECTION_SUBSCRIPTION_KEY)
            .build();

    final String apiUser = UUID.randomUUID().toString();
    mtnMobileMoney.user().createAPIUser(COLLECTION_SUBSCRIPTION_KEY, CALLBACK_HOST, apiUser);
    final ApiKey apiKey = mtnMobileMoney.user().createAPIKey(COLLECTION_SUBSCRIPTION_KEY, apiUser);
    final AccessToken accessToken = mtnMobileMoney.collections().requestAccessToken(apiUser, apiKey.getApiKey());

    final String transactionReference = UUID.randomUUID().toString();
    final RequestToPay requestToPay = new RequestToPay();
    requestToPay.setAmount("1000");
    requestToPay.setCurrency("EUR");
    requestToPay.setExternalId(transactionReference);
    requestToPay.setPayerMessage("Payment to payer");
    requestToPay.setPayerNote("Note to the payer");
    final Payer payer = new Payer();
    payer.setPartyId("1111111111");
    payer.setPartyIdType("MSISDN");
    requestToPay.setPayer(payer);


    mtnMobileMoney.collections().requestToPay(accessToken.getAccessToken(), requestToPay);

####6 - Collections - Request to pay information

    final MTNMobileMoney mtnMobileMoney = MTNMobileMoney.builder()
            .environment(Environment.SANDBOX)
            .collectionSubscriptionKey(COLLECTION_SUBSCRIPTION_KEY)
            .build();
    //send a request to pay as in 5.
    final RequestToPay requestToPay = mtnMobileMoney.collections().getRequestToPayInformation(accessToken.getAccessToken(), transactionReference);

####7 - Collections - Account balance

    final MTNMobileMoney mtnMobileMoney = MTNMobileMoney.builder()
            .environment(Environment.SANDBOX)
            .collectionSubscriptionKey(COLLECTION_SUBSCRIPTION_KEY)
            .build();

    final String apiUser = UUID.randomUUID().toString();
    mtnMobileMoney.user().createAPIUser(COLLECTION_SUBSCRIPTION_KEY, CALLBACK_HOST, apiUser);
    final ApiKey apiKey = mtnMobileMoney.user().createAPIKey(COLLECTION_SUBSCRIPTION_KEY, apiUser);
    final AccessToken accessToken = mtnMobileMoney.collections().requestAccessToken(apiUser, apiKey.getApiKey());
    final Balance balance = mtnMobileMoney.collections().getAccountBalance(accessToken.getAccessToken());

####8 - Collections - Validate account holder

    final MTNMobileMoney mtnMobileMoney = MTNMobileMoney.builder()
            .environment(Environment.SANDBOX)
            .collectionSubscriptionKey(COLLECTION_SUBSCRIPTION_KEY)
            .build();

    final String apiUser = UUID.randomUUID().toString();
    mtnMobileMoney.user().createAPIUser(COLLECTION_SUBSCRIPTION_KEY, CALLBACK_HOST, apiUser);
    final ApiKey apiKey = mtnMobileMoney.user().createAPIKey(COLLECTION_SUBSCRIPTION_KEY, apiUser);
    final AccessToken accessToken = mtnMobileMoney.collections().requestAccessToken(apiUser, apiKey.getApiKey());
    Boolean validateAccountHolderStatus = mtnMobileMoney.collections().validateAccountHolder(accessToken.getAccessToken(), "4111111111", IdentityType.MSISDN);

####9 - Collections - Accountholder information

    final MTNMobileMoney mtnMobileMoney = MTNMobileMoney.builder()
            .environment(Environment.SANDBOX)
            .collectionSubscriptionKey(COLLECTION_SUBSCRIPTION_KEY)
            .build();

    final String apiUser = UUID.randomUUID().toString();
    mtnMobileMoney.user().createAPIUser(COLLECTION_SUBSCRIPTION_KEY, CALLBACK_HOST, apiUser);
    final ApiKey apiKey = mtnMobileMoney.user().createAPIKey(COLLECTION_SUBSCRIPTION_KEY, apiUser);
    final AccessToken accessToken = mtnMobileMoney.collections().requestAccessToken(apiUser, apiKey.getApiKey());
    final AccountHolderInfo accountHolderInfo = mtnMobileMoney.collections().getAccountHolderInfo(accessToken.getAccessToken(), "4111111111");

####10 - Collections - Request to Pay delivery notification

    final MTNMobileMoney mtnMobileMoney = MTNMobileMoney.builder()
            .environment(Environment.SANDBOX)
            .collectionSubscriptionKey(COLLECTION_SUBSCRIPTION_KEY)
            .build();

    final String apiUser = UUID.randomUUID().toString();
    mtnMobileMoney.user().createAPIUser(COLLECTION_SUBSCRIPTION_KEY, CALLBACK_HOST, apiUser);
    final ApiKey apiKey = mtnMobileMoney.user().createAPIKey(COLLECTION_SUBSCRIPTION_KEY, apiUser);
    final AccessToken accessToken = mtnMobileMoney.collections().requestAccessToken(apiUser, apiKey.getApiKey());

    final String transactionReference = UUID.randomUUID().toString();
    final RequestToPay requestToPay = new RequestToPay();
    requestToPay.setAmount("1000");
    requestToPay.setCurrency("EUR");
    requestToPay.setExternalId(transactionReference);
    requestToPay.setPayerMessage("Payment to payer");
    requestToPay.setPayerNote("Note to the payer");
    final Payer payer = new Payer();
    payer.setPartyId("1111111111");
    payer.setPartyIdType("MSISDN");
    requestToPay.setPayer(payer);

    Boolean requestToPayStatus = mtnMobileMoney.collections().requestToPay(accessToken.getAccessToken(), requestToPay);
    Boolean deliveryNotificationStatus = mtnMobileMoney.collections().deliveryNotification(accessToken.getAccessToken(),transactionReference,"Notification Message");

####10 - Disbursements - Create access token

    final MTNMobileMoney mtnMobileMoney = MTNMobileMoney.builder()
            .environment(Environment.SANDBOX)
            .disbursementSubscriptionKey(DISBURSEMENT_SUBSCRIPTION_KEY)
            .build();
    final String apiUser = UUID.randomUUID().toString();
    mtnMobileMoney.user().createAPIUser(DISBURSEMENT_SUBSCRIPTION_KEY, CALLBACK_HOST, apiUser);
    final ApiKey apiKey = mtnMobileMoney.user().createAPIKey(DISBURSEMENT_SUBSCRIPTION_KEY, apiUser);
    final AccessToken accessToken = mtnMobileMoney.disbursements().requestAccessToken(apiUser, apiKey.getApiKey());

####11 - Disbursements - Transfer

    final MTNMobileMoney mtnMobileMoney = MTNMobileMoney.builder()
            .environment(Environment.SANDBOX)
            .disbursementSubscriptionKey(DISBURSEMENT_SUBSCRIPTION_KEY)
            .build();

    final String apiUser = UUID.randomUUID().toString();
    mtnMobileMoney.user().createAPIUser(DISBURSEMENT_SUBSCRIPTION_KEY, CALLBACK_HOST, apiUser);
    final ApiKey apiKey = mtnMobileMoney.user().createAPIKey(DISBURSEMENT_SUBSCRIPTION_KEY, apiUser);
    final AccessToken accessToken = mtnMobileMoney.disbursements().requestAccessToken(apiUser, apiKey.getApiKey());

    final String transactionReference = UUID.randomUUID().toString();
    final Transfer transfer = new Transfer();
    transfer.setAmount("1");
    transfer.setCurrency("EUR");
    transfer.setExternalId(transactionReference);
    transfer.setPayerMessage("Payment to payer");
    transfer.setPayerNote("Note to the payer");
    final Payer payer = new Payer();
    payer.setPartyId("46733123454");
    payer.setPartyIdType("msisdn");
    transfer.setPayee(payer);

    Boolean transferStatus = mtnMobileMoney.disbursements().transfer(accessToken.getAccessToken(), transfer);

####12 - Disbursements - Transfer Info

    final MTNMobileMoney mtnMobileMoney = MTNMobileMoney.builder()
            .environment(Environment.SANDBOX)
            .disbursementSubscriptionKey(DISBURSEMENT_SUBSCRIPTION_KEY)
            .build();

    final String apiUser = UUID.randomUUID().toString();
    mtnMobileMoney.user().createAPIUser(DISBURSEMENT_SUBSCRIPTION_KEY, CALLBACK_HOST, apiUser);
    final ApiKey apiKey = mtnMobileMoney.user().createAPIKey(DISBURSEMENT_SUBSCRIPTION_KEY, apiUser);
    final AccessToken accessToken = mtnMobileMoney.disbursements().requestAccessToken(apiUser, apiKey.getApiKey());

    final String transactionReference = UUID.randomUUID().toString();
    final Transfer transfer = new Transfer();
    transfer.setAmount("1");
    transfer.setCurrency("EUR");
    transfer.setExternalId(transactionReference);
    transfer.setPayerMessage("Payment to payer");
    transfer.setPayerNote("Note to the payer");
    final Payer payer = new Payer();
    payer.setPartyId("46733123454");
    payer.setPartyIdType("MSISDN");
    transfer.setPayee(payer);

    Boolean transferStatus = mtnMobileMoney.disbursements().transfer(accessToken.getAccessToken(), transfer);
    final Transfer transferResponse = mtnMobileMoney.disbursements().getTransferInfo(accessToken.getAccessToken(),transactionReference);

####13 - Disbursements - Account Balance

    final MTNMobileMoney mtnMobileMoney = MTNMobileMoney.builder()
            .environment(Environment.SANDBOX)
            .disbursementSubscriptionKey(DISBURSEMENT_SUBSCRIPTION_KEY)
            .build();

    final String apiUser = UUID.randomUUID().toString();
    mtnMobileMoney.user().createAPIUser(DISBURSEMENT_SUBSCRIPTION_KEY, CALLBACK_HOST, apiUser);
    final ApiKey apiKey = mtnMobileMoney.user().createAPIKey(DISBURSEMENT_SUBSCRIPTION_KEY, apiUser);
    final AccessToken accessToken = mtnMobileMoney.disbursements().requestAccessToken(apiUser, apiKey.getApiKey());
    final Balance balance = mtnMobileMoney.disbursements().getAccountBalance(accessToken.getAccessToken());

####14 - Disbursements - Account holder information

    final MTNMobileMoney mtnMobileMoney = MTNMobileMoney.builder()
            .environment(Environment.SANDBOX)
            .disbursementSubscriptionKey(DISBURSEMENT_SUBSCRIPTION_KEY)
            .build();

    final String apiUser = UUID.randomUUID().toString();
    mtnMobileMoney.user().createAPIUser(DISBURSEMENT_SUBSCRIPTION_KEY, CALLBACK_HOST, apiUser);
    final ApiKey apiKey = mtnMobileMoney.user().createAPIKey(DISBURSEMENT_SUBSCRIPTION_KEY, apiUser);
    final AccessToken accessToken = mtnMobileMoney.disbursements().requestAccessToken(apiUser, apiKey.getApiKey());
    final AccountHolderInfo accountHolderInfo = mtnMobileMoney.disbursements().getAccountHolderInfo(accessToken.getAccessToken(), "4111111111");

####15 - Remittance - Create access token

    final MTNMobileMoney mtnMobileMoney = MTNMobileMoney.builder()
            .environment(Environment.SANDBOX)
            .remittanceSubscriptionKey(REMITTANCE_SUBSCRIPTION_KEY)
            .build();
    final String apiUser = UUID.randomUUID().toString();
    mtnMobileMoney.user().createAPIUser(REMITTANCE_SUBSCRIPTION_KEY, CALLBACK_HOST, apiUser);
    final ApiKey apiKey = mtnMobileMoney.user().createAPIKey(REMITTANCE_SUBSCRIPTION_KEY, apiUser);
    final AccessToken accessToken = mtnMobileMoney.remittances().requestAccessToken(apiUser, apiKey.getApiKey());

####16 - Remittance - Transfer

    final MTNMobileMoney mtnMobileMoney = MTNMobileMoney.builder()
            .environment(Environment.SANDBOX)
            .remittanceSubscriptionKey(REMITTANCE_SUBSCRIPTION_KEY)
            .build();

    final String apiUser = UUID.randomUUID().toString();
    mtnMobileMoney.user().createAPIUser(REMITTANCE_SUBSCRIPTION_KEY, CALLBACK_HOST, apiUser);
    final ApiKey apiKey = mtnMobileMoney.user().createAPIKey(REMITTANCE_SUBSCRIPTION_KEY, apiUser);
    final AccessToken accessToken = mtnMobileMoney.remittances().requestAccessToken(apiUser, apiKey.getApiKey());

    final String transactionReference = UUID.randomUUID().toString();
    final Transfer transfer = new Transfer();
    transfer.setAmount("1");
    transfer.setCurrency("EUR");
    transfer.setExternalId(transactionReference);
    transfer.setPayerMessage("Payment to payer");
    transfer.setPayerNote("Note to the payer");
    final Payer payer = new Payer();
    payer.setPartyId("46733123454");
    payer.setPartyIdType("msisdn");
    transfer.setPayee(payer);

    Boolean transferStatus = mtnMobileMoney.remittances().transfer(accessToken.getAccessToken(), transfer);

####17 - Remittance - Transfer information

    final MTNMobileMoney mtnMobileMoney = MTNMobileMoney.builder()
            .environment(Environment.SANDBOX)
            .remittanceSubscriptionKey(REMITTANCE_SUBSCRIPTION_KEY)
            .build();

    final String apiUser = UUID.randomUUID().toString();
    mtnMobileMoney.user().createAPIUser(REMITTANCE_SUBSCRIPTION_KEY, CALLBACK_HOST, apiUser);
    final ApiKey apiKey = mtnMobileMoney.user().createAPIKey(REMITTANCE_SUBSCRIPTION_KEY, apiUser);
    final AccessToken accessToken = mtnMobileMoney.remittances().requestAccessToken(apiUser, apiKey.getApiKey());

    final String transactionReference = UUID.randomUUID().toString();
    final Transfer transfer = new Transfer();
    transfer.setAmount("1");
    transfer.setCurrency("EUR");
    transfer.setExternalId(transactionReference);
    transfer.setPayerMessage("Payment to payer");
    transfer.setPayerNote("Note to the payer");
    final Payer payer = new Payer();
    payer.setPartyId("46733123454");
    payer.setPartyIdType("MSISDN");
    transfer.setPayee(payer);

    Boolean transferStatus = mtnMobileMoney.remittances().transfer(accessToken.getAccessToken(), transfer);
    if(transferStatus){
        final Transfer transfer = mtnMobileMoney.remittances().getTransferInfo(accessToken.getAccessToken(),transactionReference);
    }

####18 - Remittance - Account balance

    final MTNMobileMoney mtnMobileMoney = MTNMobileMoney.builder()
            .environment(Environment.SANDBOX)
            .remittanceSubscriptionKey(REMITTANCE_SUBSCRIPTION_KEY)
            .build();

    final String apiUser = UUID.randomUUID().toString();
    mtnMobileMoney.user().createAPIUser(REMITTANCE_SUBSCRIPTION_KEY, CALLBACK_HOST, apiUser);
    final ApiKey apiKey = mtnMobileMoney.user().createAPIKey(REMITTANCE_SUBSCRIPTION_KEY, apiUser);
    final AccessToken accessToken = mtnMobileMoney.remittances().requestAccessToken(apiUser, apiKey.getApiKey());
    final Balance balance = mtnMobileMoney.remittances().getAccountBalance(accessToken.getAccessToken());

####19 - Remittance - Account holder information

    final MTNMobileMoney mtnMobileMoney = MTNMobileMoney.builder()
            .environment(Environment.SANDBOX)
            .remittanceSubscriptionKey(REMITTANCE_SUBSCRIPTION_KEY)
            .build();

    final String apiUser = UUID.randomUUID().toString();
    mtnMobileMoney.user().createAPIUser(REMITTANCE_SUBSCRIPTION_KEY, CALLBACK_HOST, apiUser);
    final ApiKey apiKey = mtnMobileMoney.user().createAPIKey(REMITTANCE_SUBSCRIPTION_KEY, apiUser);
    final AccessToken accessToken = mtnMobileMoney.remittances().requestAccessToken(apiUser, apiKey.getApiKey());
    final AccountHolderInfo accountHolderInfo = mtnMobileMoney.remittances().getAccountHolderInfo(accessToken.getAccessToken(), "4111111111");
You might also like...

React native wrapper for Jitsi Meet SDK Library that rely on the native view (Activity / ViewController)

react-native-jitsi-meet-sdk React native wrapper for Jitsi Meet SDK Library. This Library implements the Jitsi SDK with a native activity on the Andro

May 2, 2022

Sportheca Mobile DEV Week - Simulador de Partidas 🎲

Sportheca Mobile DEV Week - Simulador de Partidas 🎲

Sportheca Mobile DEV Week - Simulador de Partidas 🎲 Projeto desenvolvido no bootcamp Sportheca da DIO. Desenvolvimento Mobile Nativo Para Android Obj

Aug 5, 2022

DSMovie is a full stack web and mobile application built during Spring React Week, an event organized by DevSuperior

DSMovie is a full stack web and mobile application built during Spring React Week, an event organized by DevSuperior

projeto-DSMovie Sobre o projeto DSMovie é uma aplicação full stack web e mobile construída durante a Semana Spring React, evento organizado pela DevSu

Apr 18, 2022

This is the official theme SDK for the FairPlayer Music Player for Android.

This is the official theme SDK for the FairPlayer Music Player for Android.

FairPlayer - Themes SDK This is the official theme SDK for the FairPlayer Music Player for Android. You can download the most recent version of FairPl

Jan 31, 2022

Android application made during an introduction class to mobile application development.

Reflex Revolution Android application made during an introduction class to mobile application development. Contributors Hailey Savoie Carter Moore Fre

Aug 27, 2022

Light Chinese Bible is a Mobile app created by Android and SQLite.

About Light Chinese Bible Light Chinese Bible is a Mobile app created by Android and SQLite. It allows you to read the bible on your phone or devices

Feb 10, 2022

On-device, Offline Spleeter Solution For Mobile

On-device, Offline Spleeter Solution For Mobile

Spleeter for Mobile On-device, Offline Spleeter Solution For Android & iOS Spleeter is Deezer source separation library with pretrained models written

Dec 24, 2022

The world's top-level live sdk...

目录结构说明 本目录包含 Android 版 移动直播 SDK 的Demo 源代码,主要演示接口如何调用以及最基本的功能。 ├─ MLVB-API-Example // MLVB API Example,包括直播推流,直播播放,互动直播 | ├─ App //

Jan 5, 2023

Alibaba Cloud Dedicated KMS Transfer SDK for Java can help Java developers to migrate from the KMS keys to the Dedicated KMS keys.

Alibaba Cloud Dedicated KMS Transfer SDK for Java Alibaba Cloud Dedicated KMS Transfer SDK for Java can help Java developers to migrate from the KMS k

May 12, 2022
Owner
null
☁ Tencent Cloud IM Server SDK in Java | 腾讯云 IM 服务端 SDK Java 版

Tencent Cloud IM Server SDK in Java The Tencent Cloud IM Server SDK for Java enables Java developers to easily work with Tencent Cloud IM. Requirement

Doocs 64 Dec 23, 2022
Transfer Service app to transfer money between source and destination account

transferserviceapp Transfer Service app to transfer money between source and destination account H2 Console available at : http://localhost:8080/h2-co

null 1 Oct 21, 2021
React Native wrapper around Indy SDK Java and Objective-C wrappers.

React Native Indy SDK React Native Indy SDK wrapper. Installation with npm: $ npm install indy-sdk-react-native --save with Yarn: $ yarn add indy-sdk-

Hyperledger 21 Dec 5, 2022
Experimental Discord Mobile Rich Presence (Android)

MRPC Experimental Discord Mobile Rich Presence (Android) How does it work? It's pretty simple. Connect to the Discord Gateway as a normal Discord Clie

Duy Tran Khanh 41 Dec 25, 2022
This is a Food Delivery Mobile Application. Build Using React Native

Ax Food Delivery Service This is a Food Delivery Mobile Application build using ?????????? ???????????? ?? Installation Clone this repository git clon

Mindula Dilthushan Manamperi 13 Jul 14, 2022
OpenAPI Generator allows generation of API client libraries (SDK generation), server stubs, documentation and configuration automatically given an OpenAPI Spec (v2, v3)

OpenAPI Generator Master (5.4.x): 6.0.x (6.0.x): ⭐ ⭐ ⭐ If you would like to contribute, please refer to guidelines and a list of open tasks. ⭐ ⭐ ⭐ ‼️

OpenAPI Tools 14.8k Dec 30, 2022
AndroidHiddenApiBypass - Bypass restrictions on non-SDK interfaces

AndroidHiddenApiBypass Bypass restrictions on non-SDK interfaces. Why AndroidHiddenApiBypass? Pure Java: no native code used. Reliable: does not rely

LSPosed 903 Jan 6, 2023
Aplikasi Android "MovieApp" untuk memenuhi salah satu syarat Ujian Akhir Semester mata kuliah Pengembangan Aplikasi Mobile UIN Sunan Gunung Djati Bandung.

MovieApp Kelompok No Way Home, berikut list anggota-nya: Fakhri Faishal Rochdiana (1197050040) Muhamad Taopik (1197050081) Naufal Rizqullah (119705009

Muhamad Taopik 9 Dec 22, 2022
A Sentry SDK for Java, Android and other JVM languages.

Bad software is everywhere, and we're tired of it. Sentry is on a mission to help developers write better software faster, so we can get back to enjoy

Sentry 912 Dec 28, 2022
Cross-platform framework for building truly native mobile apps with Java or Kotlin

Cross-platform framework for building truly native mobile apps with Java or Kotlin. Write Once Run Anywhere support for iOS, Android, Desktop & Web.

Codename One 1.4k Jan 5, 2023