- 
                Notifications
    You must be signed in to change notification settings 
- Fork 192
MPESA Express
Simple use cases with MPESA Express (STKPush) will look something like this:
//For Sandbox Mode
Daraja daraja = Daraja.with(CONSUMER_KEY, CONSUMER_SECRET, new DarajaListener<AccessToken>() {
            @Override
            public void onResult(@NonNull AccessToken accessToken) {
                Log.i(MainActivity.this.getClass().getSimpleName(), accessToken.getAccess_token());
            }
            @Override
            public void onError(String error) {
                Log.e(MainActivity.this.getClass().getSimpleName(), error);
            }
        });
//For Production Mode
Daraja daraja = Daraja.with(CONSUMER_KEY, CONSUMER_SECRET, Env.PRODUCTION, new DarajaListener<AccessToken>() {
            @Override
            public void onResult(@NonNull AccessToken accessToken) {
                Log.i(MainActivity.this.getClass().getSimpleName(), accessToken.getAccess_token());
            }
            @Override
            public void onError(String error) {
                Log.e(MainActivity.this.getClass().getSimpleName(), error);
            }
        });Notice the Env.SANDBOX is OPTIONAL. Daraja uses SANDBOX as the Default Mode. To switch to Production Mode, pass the Env.PRODUCTION and let Daraja do the rest!
This initializes Daraja and also generates a Token to be used for further requests. This should be done in your Application onCreate Method, to allow Daraja generate the Authorization Token as early as possible.
With the Token generated, create a LNMExpress Object, to be able to pass it to the sendSTKPush method as shown below. Replace with actual values.
LNMExpress lnmExpress = new LNMExpress(
                "BUSINESS_SHORT_CODE",
                "PASS_KEY",
                "AMOUNT",
                "PARTY_A",
                "PARTY_B",
                "PHONE_NUMBER",
                "CALLBACK_URL",
                "ACCOUNT_REFERENCE",
                "TRANSACTION_DESCRIPTION"
        );You can now request an STKPush with ease.Just call the sendSTKPush as shown here:
//For both Sandbox and Production Mode
button.setOnClickListener(v -> daraja.sendSTKPush(lnmExpress,
                new DarajaListener<LNMResult>() {
                    @Override
                    public void onResult(@NonNull LNMResult lnmResult) {
                        Log.i(MainActivity.this.getClass().getSimpleName(), lnmResult.ResponseDescription);
                    }
                    @Override
                    public void onError(String error) {
                        Log.i(MainActivity.this.getClass().getSimpleName(), error);
                    }
                }
        ));This sanitizes all the data, as required by Safaricom before making a request for the STKPush. You only need to pass the parameters and Daraja will do the rest!
The following table highlights the requirements needed by Daraja, as described in the Safaricom Developer API Page
| Name | Description | Parameter Type | Possible Values | 
|---|---|---|---|
| BusinessShortCode | The organization shortcode used to receive the transaction | Numeric | Shortcode (6 digits) | 
| Passkey | Lipa Na Mpesa Online PassKey | Alpha-Numeric | |
| Amount | The amount to be transacted | Numeric | 100 | 
| PartyA | The entity sending the funds | Numeric | MSISDN (12 digits) | 
| PartyB | The organization receiving the funds | Numeric | Shortcode (6 digits) | 
| PhoneNumber | The MSISDN sending the funds | Numeric | MSISDN (12 digits) | 
| CallBackURL | Call Back URL | URL | https://ip or domain:port/path | 
| AccountReference | Account Reference | Alpha-Numeric | Any combinations of letters and numbers | 
| TransactionDesc | Description of the transaction | String | any string of less then 20 characters | 
Get the Pass Key Here : https://developer.safaricom.co.ke/test_credentials
Make a simple Daraja request as shown in the code sample below. First, make sure your import these dependencies (or let Android Studio auto-import), and initialize a few configurations
import com.twigafoods.daraja.Daraja;
import com.twigafoods.daraja.DarajaListener;
import com.twigafoods.daraja.model.AccessToken;
import com.twigafoods.daraja.model.LNMExpress;
import com.twigafoods.daraja.model.LNMResult;
import butterknife.BindView;
import butterknife.ButterKnife;
public class MainActivity extends AppCompatActivity {
    @BindView(R.id.editTextPhoneNumber)
    EditText editTextPhoneNumber;
    @BindView(R.id.sendButton)
    Button sendButton;
    //Declare Daraja :: Global Variable
    Daraja daraja;
    String phoneNumber;Inside your onCreate Method, set up Initialize Daraja as shown below:
@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                WindowManager.LayoutParams.FLAG_FULLSCREEN);
        setContentView(R.layout.activity_main);
        ButterKnife.bind(this);
        //Init Daraja
        //TODO :: REPLACE WITH YOUR OWN CREDENTIALS  :: THIS IS SANDBOX DEMO
        daraja = Daraja.with("EG6TJgOCyuVGHKUeJs0uLXKsLCANRjbo", "4F3tAlRZ4OzNZt0Y", new DarajaListener<AccessToken>() {
            @Override
            public void onResult(@NonNull AccessToken accessToken) {
                Log.i(MainActivity.this.getClass().getSimpleName(), accessToken.getAccess_token());
                Toast.makeText(MainActivity.this, "TOKEN : " + accessToken.getAccess_token(), Toast.LENGTH_SHORT).show();
            }
            @Override
            public void onError(String error) {
                Log.e(MainActivity.this.getClass().getSimpleName(), error);
            }
        });Make the Daraja STKPush request with ease now:
//TODO :: THIS IS A SIMPLE WAY TO DO ALL THINGS AT ONCE!!! DON'T DO THIS :)
        sendButton.setOnClickListener(v -> {
            //Get Phone Number from User Input
            phoneNumber = editTextPhoneNumber.getText().toString().trim();
            if (TextUtils.isEmpty(phoneNumber)) {
                editTextPhoneNumber.setError("Please Provide a Phone Number");
                return;
            }
            //TODO :: REPLACE WITH YOUR OWN CREDENTIALS  :: THIS IS SANDBOX DEMO
            LNMExpress lnmExpress = new LNMExpress(
                    "174379",
                    "bfb279f9aa9bdbcf158e97dd71a467cd2e0c893059b10f78e6b72ada1ed2c919",  //https://developer.safaricom.co.ke/test_credentials
                    "100",
                    "254708374149",
                    "174379",
                    phoneNumber,
                    "http://mycallbackurl.com/checkout.php",
                    "001ABC",
                    "Goods Payment"
            );
            daraja.sendSTKPush(lnmExpress,
                    new DarajaListener<LNMResult>() {
                        @Override
                        public void onResult(@NonNull LNMResult lnmResult) {
                            Log.i(MainActivity.this.getClass().getSimpleName(), lnmResult.ResponseDescription);
                        }
                        @Override
                        public void onError(String error) {
                            Log.i(MainActivity.this.getClass().getSimpleName(), error);
                        }
                    }
            );
        });The whole process looks similar to these screenshots:
 
 
Twiga Foods Engineering Team Open Source Projects