...
Getting started with the Monnify Android SDK
First off, the The Monnify Android SDK allows you to accept payments from customers in your Android application via:
Card Payment
Bank Transfer
Steps to Implementation
1. Add Add the dependency for the Monnify SDK
To your root build.gradle file add:
Code Block | ||||
---|---|---|---|---|
| ||||
allprojects { repositories { google() mavenCentral() } } |
...
Code Block | ||||
---|---|---|---|---|
| ||||
dependencies { // ... implementation "com.monnify.android-sdk:monnify-android-sdk:1.1.2" } |
2. Create an instance of the Monnify SDK
KOTLIN
Code Block | ||||
---|---|---|---|---|
| ||||
class MainActivity : AppCompatActivity() { // ... var monnify = Monnify.instance override fun onCreate(savedInstanceState: Bundle?) { // ... } } |
JAVA
Code Block | ||||
---|---|---|---|---|
| ||||
class MainActivity extends AppCompatActivity { // ... private Monnify monnify = Monnify.Companion.getInstance(); @Override public void onCreate(Bundle savedInstanceState) { // ... } } |
3. Set your merchant API key, contract code and application mode
This is done in the onCreate() method of the Launch Activity. The merchant Api Key and contract code can be gotten from your Monnify account dashbard. The application mode should be either TEST or LIVE. The TEST mode works on a sandbox environment and payment can be simulated here. Remember to switch to ApplicationMode.LIVE when generating APKs for production
KOTLIN
Code Block | ||||
---|---|---|---|---|
| ||||
monnify.setApiKey("MY_MERCHANT_API_KEY7") monnify.setContractCode("111222333444555") monnify.setApplicationMode(ApplicationMode.TEST) |
JAVA
Code Block | ||||
---|---|---|---|---|
| ||||
monnify.setApiKey("MY_MERCHANT_API_KEY7"); monnify.setContractCode("111222333444555"); monnify.setApplicationMode(ApplicationMode.TEST); |
4. Set your merchant API key, contract code and application mode
This is done when the customer clicks perhaps on a 'Pay' button. The initializePayment() method requires the activity context, an object of the TransactionDetails class, request code, result key You are allowed to set the request code and request key yourself in order to have more control, and to prevent clashes with other args in the main app.
KOTLIN
Code Block | ||||
---|---|---|---|---|
| ||||
val transaction = TransactionDetails.Builder() .amount(BigDecimal("2000")) .currencyCode("NGN") .customerName("Customer Name") .customerEmail("mail.cus@tome.er") .paymentReference("PAYMENT_REF") .paymentDescription("Description of payment") .build() monnify.initializePayment( this@MainActivity, transaction, INITIATE_PAYMENT_REQUEST_CODE, KEY_RESULT) |
JAVA
Code Block | ||||
---|---|---|---|---|
| ||||
TransactionDetails transaction = new TransactionDetails.Builder() .amount(new BigDecimal("2000")) .currencyCode("NGN") .customerName("Customer Name") .customerEmail("mail.cus@tome.er") .paymentReference("PAYMENT_REF") .paymentDescription("Description of payment") .build(); monnify.initializePayment( MainActivity.this, transaction, INITIATE_PAYMENT_REQUEST_CODE, KEY_RESULT); |
5. Get the outcome of the payment attempt so that you can update application UI after payment gateway is closed.
This is done in the onActivityResult() method of your activity. Use the request code and data key passed in the initializePayment() method to get data returned by the SDK
KOTLIN
Code Block | ||||
---|---|---|---|---|
| ||||
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { super.onActivityResult(requestCode, resultCode, data) val monnifyTransactionResponse = data?.getParcelableExtra(KEY_RESULT) as MonnifyTransactionResponse var message = "" message = when(monnifyTransactionResponse.status) { Status.PENDING -> "Transaction not paid" Status.PAID -> "Customer paid exact amount" Status.OVERPAID -> "Customer paid more than expected amount." Status.PARTIALLY_PAID -> "Customer paid less than expected amount." Status.FAILED -> "Transaction completed unsuccessfully. This means no payment came in for Account Transfer method or attempt to charge card failed." Status.PAYMENT_GATEWAY_ERROR -> "Payment gateway error" } Toast.makeText(this@MainActivity, message, Toast.LENGTH_LONG).show() } |
JAVA
Code Block | ||||
---|---|---|---|---|
| ||||
@Override public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); MonnifyTransactionResponse monnifyTransactionResponse = (MonnifyTransactionResponse) data.getParcelableExtra(KEY_RESULT); if (monnifyTransactionResponse == null) return; String message = ""; switch (monnifyTransactionResponse.getStatus()) { case PENDING: { message = "Transaction not paid for."; break; } case PAID: { message = "Customer paid exact amount"; break; } case OVERPAID: { message = "Customer paid more than expected amount."; break; } case PARTIALLY_PAID: { message = "Customer paid less than expected amount."; break; } case FAILED: { message = "Transaction completed unsuccessfully. This means no payment came in for Account Transfer method or attempt to charge card failed."; break; } case PAYMENT_GATEWAY_ERROR: { message = "Payment gateway error"; break; } } Toast.makeText(MainActivity.this, message, Toast.LENGTH_LONG).show(); } |
...
Possible return types from the SDK and meanings below:
Type | Meaning |
---|---|
PENDING | Transaction not paid for. |
PAID | The customer paid exact amount |
OVERPAID | The customer paid more than the expected amount. |
PARTIALLY_PAID | The customer paid less than the expected amount. |
FAILED | Transaction completed unsuccessfully. This means no payment came in for Account Transfer method or attempt to charge card failed. |
PAYMENT_GATEWAY_ERROR | Payment tried but an error occurred on Monnify gateway |
Additional initializePayment parameters
Payment Methods specify transaction-level payment methods. Sub-Accounts are accounts that will receive settlement for the particular transaction being initialized. MetaData is map with single depth for any extra information you want to pass along with the transaction. See a sample below:
Kotlin
Code Block | ||
---|---|---|
| ||
transaction = TransactionDetails.Builder() //... .incomeSplitConfig( |
...
arrayListOf<SubAccountDetails>( SubAccountDetails("MFY_SUB_319452883968", 10.5f, BigDecimal("500"), true), SubAccountDetails("MFY_SUB_259811283666", 10.5f, BigDecimal("1000"), false) )) .metaData(hashMapOf( Pair("deviceType", "mobile_android"), Pair("ip", "127.168.22.98") // any other info )) .paymentMethods( |
...
arrayListOf<PaymentMethod>( add(PaymentMethod.CARD), add(PaymentMethod.ACCOUNT_TRANSFER) )) .build() |
JAVA
Code Block | ||
---|---|---|
| ||
TransactionDetails transaction = new TransactionDetails.Builder() //... .incomeSplitConfig(new |
...
ArrayList<SubAccountDetails>() {{ add(new SubAccountDetails("MFY_SUB_319452883968", 10.5f, new BigDecimal("500"), true)); add(new SubAccountDetails("MFY_SUB_259811283666", 10.5f, new BigDecimal("1000"), false)); }}) .metaData(new |
...
HashMap<String, |
...
String>() {{ put("deviceType", "mobile_android"); put("ip", "127.168.22.98"); // any other info }}) .paymentMethods(new |
...
ArrayList<PaymentMethod>() {{ add(PaymentMethod.CARD); add(PaymentMethod.ACCOUNT_TRANSFER); }}) .build(); |
...
Related Articles
Content by Label | ||||||
---|---|---|---|---|---|---|
|