Getting Started with Android
To get a copy of our SDK, please contact our partner team at [email protected]
Check Your TriPos SDK Version
In order to support newer versions of Android, we have an updated version of the PaySimple SDK that relies on TriPos SDK version 3.0.0 (the older version relied on version 1.5.0). If the TriPos SDK that was provided to you is named "triposmobilesdk-v3-release.aar" you are on version 3.0.0; otherwise, if the SDK is named "triposmobilesdk-release.aar" you are on version 1.5.0. Aside from updating the AAR and dependencies as shown below, there should be no breaking changes when upgrading to version 3.0.0.
Minimum and Maximum Supported Android Version
TriPos SDK v1: min Android 8.0 API 26; max Android 12 API 31
TriPos SDK v3: min Android 10 API 29; max Android 13 API 33
Import Libraries
Import Libraries
- Create folder named libs in base project directory.
- Copy and paste both provided aar's in libs folder.
- In your app level gradle file (Module: project.yourappname) add dependencies.
Gradle example for TriPos SDK version 1.5.0
apply plugin: 'com.android.application'
apply plugin: 'realm-android'
buildscript {
repositories {
jcenter()
google()
}
dependencies {
classpath 'com.android.tools.build:gradle:7.0.4'
classpath "io.realm:realm-gradle-plugin:4.2.0"
}
}
android {
compileSdk 31
defaultConfig {
applicationId "com.paysimple.TestApp"
minSdk 26
targetSdk 31
versionCode 1
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_11
targetCompatibility JavaVersion.VERSION_11
}
buildToolsVersion '31.0.0'
}
dependencies {
implementation 'androidx.appcompat:appcompat:1.3.1'
implementation 'com.google.android.material:material:1.4.0'
implementation 'androidx.constraintlayout:constraintlayout:2.1.1'
implementation 'androidx.legacy:legacy-support-v4:1.0.0'
testImplementation 'junit:junit:4.+'
androidTestImplementation 'androidx.test.ext:junit:1.1.3'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
implementation 'com.android.volley:volley:1.2.1'
implementation 'com.google.code.gson:gson:2.8.9'
//tripos dependencies
implementation 'com.google.dagger:dagger:2.11'
implementation 'org.apache.commons:commons-lang3:3.5'
implementation 'commons-io:commons-io:2.5'
implementation files('../libs/paysimpleandroidsdk-release.aar')
implementation files('../libs/triposmobilesdk-release.aar')
}
Gradle example for TriPos SDK version 3.0.0
apply plugin: 'com.android.application'
apply plugin: 'realm-android'
buildscript {
repositories {
jcenter()
google()
}
dependencies {
classpath 'com.android.tools.build:gradle:7.4.2'
classpath "io.realm:realm-gradle-plugin:10.10.1"
}
}
android {
compileSdk 34
defaultConfig {
applicationId "com.paysimple.TestApp"
minSdk 29
targetSdk 33
versionCode 1
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
debuggable false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
packagingOptions {
resources.excludes.add("META-INF/*")
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
buildToolsVersion '31.0.0'
}
dependencies {
implementation 'androidx.constraintlayout:constraintlayout:2.1.1'
androidTestImplementation 'androidx.test.ext:junit:1.1.3'
implementation 'com.android.volley:volley:1.2.1'
//tripos dependencies
implementation 'org.apache.logging.log4j:log4j-api:2.17.1'
implementation 'org.apache.logging.log4j:log4j-core:2.17.1'
implementation 'com.google.dagger:dagger:2.45'
implementation 'org.apache.commons:commons-lang3:3.12.0'
implementation 'commons-io:commons-io:2.11.0'
implementation group: 'commons-validator', name: 'commons-validator', version: '1.7'
implementation 'com.google.code.gson:gson:2.9.0'
implementation 'androidx.appcompat:appcompat:1.6.1'
implementation 'androidx.legacy:legacy-support-v4:1.0.0'
implementation 'androidx.recyclerview:recyclerview:1.3.2'
implementation 'com.google.android.material:material:1.9.0'
testImplementation 'junit:junit:4.13.2'
androidTestImplementation('androidx.test.espresso:espresso-core:3.4.0', { exclude group: 'com.android.support', module: 'support-annotations' })
implementation 'org.simpleframework:simple-xml:2.7.1'
implementation 'com.squareup.okhttp3:logging-interceptor:4.10.0'
implementation 'com.squareup.okhttp3:okhttp:4.10.0'
implementation 'com.squareup.retrofit2:retrofit:2.9.0'
implementation 'com.squareup.retrofit2:converter-gson:2.9.0'
implementation files('../libs/paysimpleandroidsdk-release.aar')
implementation files('../libs/triposmobilesdk-v3-release.aar')
//stripe dependencies
implementation "com.stripe:stripeterminal-localmobile:3.2.1"
implementation "com.stripe:stripeterminal-core:3.2.1"
implementation files('../libs/EverCommercePaymentsAndroidSdk-release.aar')
// MS App Center
def appCenterSdkVersion = '4.3.1'
implementation "com.microsoft.appcenter:appcenter-analytics:${appCenterSdkVersion}"
implementation "com.microsoft.appcenter:appcenter-crashes:${appCenterSdkVersion}"
}
task prepareKotlinBuildScriptModel {
}
task wrapper(type: Wrapper){
gradleVersion = '7.4.2'
}
Processing a Sale Example
Here's a simplified version of completing a sale within a single Android activity. Use your device's name, copy and paste client token, and create a TextView named "textView" and a button with onClick set to payment.
package com.paysimpleandroid.sdktest;
import android.Manifest;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import com.google.gson.Gson;
import com.paysimpleandroid.paysimpleandroidsdk.IPaysimpleBBPOS;
import com.paysimpleandroid.paysimpleandroidsdk.PsDeviceType;
import com.paysimpleandroid.paysimpleandroidsdk.PsEnvironment;
import com.paysimpleandroid.paysimpleandroidsdk.bbpos.DeviceState;
import com.paysimpleandroid.paysimpleandroidsdk.bbpos.PaysimpleBBPOS;
import com.paysimpleandroid.paysimpleandroidsdk.bbpos.PaysimpleSDKError;
import com.paysimpleandroid.paysimpleandroidsdk.bbpos.PaysimpleSDKResponse;
import com.paysimpleandroid.paysimpleandroidsdk.bbpos.PaysimpleSaleRequest;
import com.paysimpleandroid.paysimpleandroidsdk.bbpos.PaysimpleSaleResponse;
import com.paysimpleandroid.paysimpleandroidsdk.bbpos.PsEnums.PsAmountConfirmationType;
import com.paysimpleandroid.paysimpleandroidsdk.bbpos.PsListeners.PsDeviceInteractionListener;
import com.paysimpleandroid.paysimpleandroidsdk.bbpos.PsListeners.PsListener;
import java.math.BigDecimal;
public class MainActivity extends AppCompatActivity implements PsListener, PsDeviceInteractionListener {
IPaysimpleBBPOS paysimpleBBPOS;
private TextView responseView;
String clientToken = "";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
responseView = findViewById(R.id.textView);
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION,
Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.BLUETOOTH_CONNECT, Manifest.permission.BLUETOOTH_SCAN}, 1);
paysimpleBBPOS = PaysimpleBBPOS.getInstance(this, PsEnvironment.QA1, PsDeviceType.BbposEmv);
paysimpleBBPOS.subscribeToListener(this);
paysimpleBBPOS.subscribeToDeviceInteractionListener(this);
new Thread(() -> {
PaysimpleSDKResponse res = paysimpleBBPOS.initializeAndConnect(clientToken, "CHB202044007347");
}).start();
}
public void payment(View view) {
if (paysimpleBBPOS.isDeviceConnected()) {
new Thread(() -> {
try {
//Include all fees here
BigDecimal amount = BigDecimal.valueOf(Math.random() * 100).setScale(2,
BigDecimal.ROUND_DOWN);
PaysimpleSaleRequest saleRequest = new PaysimpleSaleRequest(amount);
paysimpleBBPOS.processSale(clientToken, saleRequest);
} catch (Exception e) {
e.printStackTrace();
}
}).start();
}
}
@Override
public void updateResponse(Double aDouble, String... strings) {
runOnUiThread(() -> responseView.setText(strings[0]));
}
@Override
public void onError(PaysimpleSDKError paysimpleSDKError) {
runOnUiThread(() -> responseView.setText(new Gson().toJson(paysimpleSDKError)));
}
@Override
public void onDeviceEvent(DeviceState deviceState, String s) {
runOnUiThread(() -> responseView.setText(s + " " + deviceState.name()));
}
@Override
public void onPaymentResponse(PaysimpleSaleResponse paysimpleSaleResponse) {
runOnUiThread(() -> responseView.setText(new Gson().toJson(paysimpleSaleResponse)));
}
@Override
public void onAmountConfirmation(PsAmountConfirmationType psAmountConfirmationType, BigDecimal bigDecimal, PsConfirmAmountListener psConfirmAmountListener) {
psConfirmAmountListener.psConfirmAmount(true);
}
@Override
public void onPromptUserForCard(String s) {
runOnUiThread(() -> responseView.setText(s));
}
@Override
public void onDisplayText(String s) {
runOnUiThread(() -> responseView.setText(s));
}
@Override
public void onRemoveCard() {
runOnUiThread(() -> responseView.setText("Remove Card"));
}
@Override
public void onCardRemoved() {
runOnUiThread(() -> responseView.setText("Card Removed"));
}
}
Updated 4 months ago