About Us Solutions Business Type Contacts Support

mPOS SDK for Android and Java

Build Status

SDK provides fast, easy integration with mPOS readers in mobile apps.


  • Runs both on Android and Java
  • MSR, EMV Contact, EMV Contactless transactions
  • Signature or PIN based transactions
  • Remote key injection
  • Remote firmware update
  • Remote mPOS configuration
  • Certified with OpenWay. The first mobile POS Chip&PIN solution in Russia - http://www.openwaygroup.com/news_card.jsp?dcion=908&rgn=1&lng=1
  • Custom LCD messages for all stages (Miura only)
  • Unified API for all readers
  • Implemented PaynetEasy Server API https://payneteasy.com/support/documents/introduction-mpos-integration.html
  • Many transaction types: sale, preauthorization, capture, cancel, reversal, partial reversal and etc.

Supported Readers


All terminals support remote configuration and firmware update.

  • Miura Shutle (M006), Miura M007, Miura M010. Supports MSR, Contact, Contactless transactions. With or without PIN. Remote keys injection, remote configuration and remote MPI and OS update
  • Spire Spm2
  • Verifone Vx820 (usb, rs232, ethernet)
  • PAX SP30 (usb, rs232, ethernet)
  • Telpo TPS900, Кассатка Мини

Deprecated from the 1st of January 2015

  • GD Seed: Integrated with the official SDK
  • GD Seed: Own SDK. With memory and performance optimization.
  • ID Tech Unimag II: Integrated with the official SDK
  • ID Tech Unimag II: Own SDK. Memory and performance optimization. Extends supported phone models.
  • Bluebamboo P25


  • Datecs DRD50, DRD10
  • Datecs MPED400, Bluepad 50
  • Wizar POS

Only for integration or test

  • TEST - emulates Miura Shuttle events. You can use it on emulators.


The SDK includes a maven repository - http://paynet-qa.clubber.me/reader/maven/

We'll walk you through integration and usage.

Sign up for PaynetEasy account

  • You'll need to contact to payneteasy.com for merchant login.


  • Supports target deployment of Android from 2.2.
  • Or Oracle JVM (tested on 1.8)

Setup maven

Add the repository to your pom.xml

    <name>reader repo</name>

Setup gradle

Add to your repositories section

repositories {
    maven { url "https://jitpack.io" }
    maven { url "http://paynet-qa.clubber.me/reader/maven" }

Add to your dependencies

dependencies {
    def readerVersion = // check the latest version at https://github.com/payneteasy/reader-example/wiki/Changelog
    compile 'com.payneteasy.android.reader:api:' + readerVersion
    compile ('com.payneteasy.android.reader:lib:' + readerVersion)

    compile 'com.payneteasy.android.reader.readers:readers-common-bluetooth:' + readerVersion
    compile ('com.payneteasy.android.reader.readers:readers-miura:' + readerVersion) {
        exclude group:'junit', module:'junit'

You can find the full gradle example at https://github.com/payneteasy/reader-example-gradle

For Bluetooth Readers (Android)

Add to your AndroidManifest.xml

    <uses-permission android:name="android.permission.BLUETOOTH"/>
    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>

For USB terminals (Android)

Add new file res/xml/device_filter.xml

<?xml version="1.0" encoding="utf-8"?>

    <!-- 0x1234 / 0x0101  PAX / S80 -->
    <usb-device vendor-id="4660" product-id="257" class="255" subclass="0" protocol="0"/>

    <!-- 0x11CA / 0x0219  VeriFone Inc / Trident USB Device 1.1 / bInterfaceClass = 10 CDC Data -->
    <usb-device vendor-id="4554" product-id="537" class="10" subclass="0" protocol="0"/>


Add to your AndroidManifest.xml to any activity element:

        <action android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" />
    <meta-data  android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" android:resource="@xml/device_filter" />

Add to the activity:

public class MainActivity extends Activity {

    private final UsbPermissionResolver usbPermissionResolver = new UsbPermissionResolver();

    protected void onCreate(Bundle savedInstanceState) {
        usbPermissionResolver.checkPermission(getIntent(), this);

    protected void onNewIntent(Intent intent) {
        usbPermissionResolver.checkPermission(intent, this);

    protected void onDestroy() {

Please see this commit for more information https://github.com/payneteasy/reader-example-gradle/commit/2aa02c47f38cef4f3a673e98fc5d5ecb98720656

For Miura (Java)

Please see the example app-2 how to run and assemble the application for Miura Readers to run on JVM.

app-3-webstart shows how to run the application from a browser via Java WebStart:

  • Linux https://www.youtube.com/watch?v=rLSx3SrkMqA
  • Mac OS X - https://www.youtube.com/watch?v=OgdUfHqBvmI
  • Windows - https://www.youtube.com/watch?v=I6PPO-j9KSk

Sample Code

Implement the IReaderPresenter interface

    public ProcessingContinuation onCard(BankCard bankCard) {

        setStatus("onCard: %s", bankCard);

        return ProcessingContinuation.Builder
                .processingBaseUrl  ( Config.SERVER_BASE_URL)
                .merchantLogin      ( Config.MERCHANT_LOGIN )
                .merchantControlKey ( Config.MERCHANT_KEY   )
                .merchantEndPointId ( Config.END_POINT_ID   )
                .orderDescription   ( "test description"    )
                .orderInvoiceNumber ( "invoice-"+System.currentTimeMillis())
                .orderMerchantData  ( "custom merchant data for a internal use")
                .customerPhone      ( "+7 499 918-64-41"    )
                .customerEmail      ( "[email protected]" )
                .customerCountry    ( "RUS"                 )
                .listener(new IProcessingStageListener() {
                    public void onStageChanged(ProcessingStageEvent aEvent) {
                        setStatus("processing: %s", aEvent);


    public void onReaderSerialNumber(String aKsn) {
        setStatus("onReaderSerialNumber: %s", aKsn);

    public void cardReaderStateChanged(CardReaderEvent cardReaderEvent) {
        setStatus("cardReaderStateChanged: %s", cardReaderEvent);

    public void onCardError(CardError cardError) {
        setStatus("onCardError: %s", cardError);

    public void onReaderNotSupported(CardReaderProblem aProblem) {
        setStatus("onReaderNotSupported: %s", aProblem);

    public void onAudioData(short[] shorts, int i) {
        // for visualization

    public ConfigurationContinuation onConfiguration() {
        return new ConfigurationContinuation.Builder()
                .configDir              ( new File(activity.getFilesDir(), "miura-config"))
                .configurationBaseUrl   ( Config.SERVER_CONFIG_URL  )
                .merchantLogin          ( Config.MERCHANT_LOGIN     )
                .merchantControlKey     ( Config.MERCHANT_KEY       )
                .merchantEndPointId     ( Config.END_POINT_ID       )

Note: Fill the Config.MERCHANT_LOGIN, Config.MERCHANT_KEY, Config.END_POINT_ID with your own values.

Starts the Reader Manager

CardReaderInfo cardReader = CardReaderInfo.TEST;
BigDecimal amount = new BigDecimal(1);
String currency = "RUB";

SimpleCardReaderPresenter presenter = new SimpleCardReaderPresenter(this, statusView);
cardReaderManager = CardReaderFactory.findManager(this, cardReader, presenter, amount, currency, null);

Deal with cardReaderManager:

  • ICardReaderManager.startSaleSession() starts a sale session
  • ICardReaderManager.stopSession() - stops a session and releases resources


Menu - +
Navigation < >
We use cookies What does it mean?

Payneteasy uses cookies to improve its perfomance and enhance your user experience