SoftPoS Android & Tap to pay on iPhone (MPOS)

MPOS means, Mobile Payments Of Shelf. Accept Card Present Transactions from an iPhone or an Android device.

Before you start:

1: You need a valid <<glossary:Merchant>> account, don't have it?

Signup via <https://signup.pay.nl>

2: Download the SoftPos APP from the store:

ProviderPackage nameDownload
Play Store (Android)PAY.POS<https://play.google.com/store/apps/details?id=com.paynl.softpos&pli=1>
Sunmi P-DevicesPAY.POS (h)Use the Sunmi store and search for PAY.POS to find the hardware version of our PAY.POS app.
Tap to Pay on iPhonePAY.POS<https://apps.apple.com/nl/app/pay-pos/id6468886450>

App Versions

Version Updates Release date .APK download for Android

v1.1.3

  • Dark mode improvements
  • Boot stability
  • Cloud Connect speed improvements and stability fixes
  • General settings menu performance update
  • Send logs via Inject
    **Android only **
  • Payment automatically retries after failed to read NFC
  • Dual screen support
  • Mifare support is here! (Via inject only)
    **Sunmi only **
  • Add support for Sunmi non-p non-cloud printers.

31-01-2025

v1.0.57

  • Service inject per payment docs
  • Fix where users would sometimes log out in the background on iOS
  • Sunmi P2_SMARTPAD numpad fixes
  • Sizing fixes on several devices
  • Dark mode
  • POS mode updates
  • Stability fixes

19-11-2024

download

v1.0.22

Tip mode deeplinks now supported, more info here

10-07-2024

N/A

v1.0.21

Fixed issue on co-branded cards (Bancontact with Visa Debit in relation to some issuers).

13-06-2024

download

v1.0.20

QR Code and Barcode scanning for quick activation.
Offline sync delay moved from 10 to 2 seconds.

11-06-2024

download

v1.0.19

Pin prompt cancelation status.
Minor fixes to prevent app crashes during usage.

30-05-2024

download

v1.0.18

Mitigated an issue that caused the application to exit when device is low on memory.

25-05-2024

N/A

V1.0.17

Fix memory usage issues, affecting older devices.

24-05-2024

N/A

V1.0.16

Enabled root Logging to check a memory leak

21-05-2024

N/A

V1.0.15

Resolve critical issue regarding retry payment
Improved logging

18-05-2024

N/A

V1.0.14

Added tip module and update the Offline PIN

12-05-2024

N/A


Send Logs

If you click 3 times on the LOGO of PAY (or whitelabel logo) on top in the Payment Application and the Logs will be send.


Sending logs through deeplink

You can send logs through a deeplink from your own app like so:

paycpoc://?transaction={"returnUrl":"https://google.com"}&command=sendLogs

The Flow


We suggest that you start within the application the merchant is using. This generates a simple transaction that can be send to your backend and to the SoftPos APP. You can also first start a payment in your backend and send the reference via the merchant application to the APP.


This application has two tasks. If it's opened without an inject, merchants can start payments in different flows, request the TIP module or activate options like offline processing or boot the DONO mode (simple option to get easy payments).

If the application is opened by an inject and the application is activated it reads the card data, encrypts the data and if a PINcode is needed, it will ask for the pin and encrypt that as well. It sends the data to the <<glossary:Transaction Gateway Unit>> where the transaction is routed via the different schemes to the Issuing bank where the payment is completed. If the Payment fails, we return to the original application or URL (via the returnUrl) where the next action can be performed.

After the payment we asynchronously send a data request to the <<glossary:Exchange URL>>. And transfer the Payment to the <<glossary:Global Management System>> where the reporting engine collects the necessary data to report, clear and settle the funds to your account.

📘

There is more in between!

Between the TGU and the issuing bank is more technology, like HSM's, different processing hosts and <<glossary:Card schemes>>. For this manual those steps are less informative. We get the card data, we route to touch the bank in the cheapest and most effective way.


Place the Button

Let's send an order (Inject)

The fastest way to start a payment is via the direct inject. You can start a transaction by sending it to the Pay. SoftPoS application.

Keep it simple at the start.

transaction = {
	"description": "Field 6.2 for EUR 30,02",
	"reference": "FIELD6.2",
	"returnUrl": "https:\/\/cpoc.buddy.nl",  // Or YOURAPP://UUID
		"amount": {
		"value": 123,
		"currency": "EUR"
	}
}

But you are allowed to use the full Order Object

transaction = {
	"serviceId": "SL-1234-1234",
	"description": "Field 6.2 for EUR 30,02",
	"reference": "FIELD6.2",
	"returnUrl": "https:\/\/cpoc.buddy.nl",  // Or YOURAPP://UUID
	"exchangeUrl": "https:\/\/demo.pay.nl\/exchange.php",
	"amount": {
		"value": 4321,
		"currency": "EUR"
	},
	"integration": {
		"testMode": true
	},
	"customer": {
		"firstName": "John",
		"lastName": "Doe",
		"phone": "0031612345678",
		"birthDate": "1999-02-15",
		"gender": "m",
		"email": "[email protected]",
		"ipAddress": "213.126.82.230",
		"trust": 5,
		"reference": "NL87654321",
		"company": {
			"countryCode": "nl",
			"coc": "12345678",
			"vat": "NL0123456789",
			"name": "CompanyName"
		}
	},
	"order": {
		"countryCode": "NL",
		"deliveryDate": "2022-12-30",
		"invoiceDate": "2022-12-30",
		"deliveryAddress": {
			"firstName": "John",
			"lastName": "Doe",
			"streetName": "Deliverylane",
			"streetNumber": "70",
			"streetNumberExtension": "A",
			"zipCode": "5678CD",
			"city": "Amsterdam",
			"countryCode": "NL"
		},
		"invoiceAddress": {
			"firstName": "Samanta",
			"lastName": "Doe - Jones",
			"streetName": "Invoicestreet",
			"streetNumber": "2",
			"streetNumberExtension": "B",
			"zipCode": "SW36LQ",
			"city": "London",
			"countryCode": "GB"
		},
		"products": [{
			"id": "TEST_01",
			"description": "Caramels sweet roll",
			"type": "article",
			"price": {
				"value": 1,
				"currency": "EUR"
			},
			"quantity": 2,
			"vatCode": "H"
		}, {
			"id": "TEST_02",
			"description": "Cookie tart sugar",
			"type": "article",
			"price": {
				"value": 3,
				"currency": "EUR"
			},
			"quantity": 1,
			"vatCode": "H"
		}, {
			"id": "TEST_03",
			"description": "Lollipop chocolate bar",
			"type": "article",
			"price": {
				"value": 1,
				"currency": "EUR"
			},
			"quantity": 5,
			"vatCode": "H"
		}]
	},
	"notification": {
		"type": "email",
		"recipient": "[email protected]"
	},
	"stats": {
		"object": "POS System",
		"info": "Campagne 99",
		"tool": "Google",
		"extra1": "Customer 6985615",
		"extra2": "Invoice 21.3695",
		"extra3": "Shop Amsterdam"
	}
}

Branding the SoftPoS app

To change the icon and the colour you can send an image (JPG or PNG format) in base64. To change the colours of the loading icons and the buttons youcan also send in buttonTextColor

<a href='paycpoc://?data=ab9c9a73-d986-ce76-1937-508381ac626e&layout={
    "icon": "data:image/png;base64,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",
    "buttonTextColor": "F75513"
  }'>Link to the APP
</a>

Ask the customer for a tip through Inject

It is also possible to provide the user with an option to leave a tip. To do this you have to slightly alter your inject request:

{
  "description": "Field 6.2 for EUR 30,02",
  "reference": "FIELD6.2",
  "returnUrl": "https:\/\/cpoc.buddy.nl",  // Or YOURAPP://UUID
  "amount": {
    "value": 123,
    "currency": "EUR"
  },
  "integration": {
    "tipMode":{ 
      "enabled":true,
      "amountSettings": [2.33, 15.6, 20.2]
    }},
  }
}

We added the integration -> tipMode section to the transaction object. If you set the enabled property to true the user will be asked if they want to leave a tip.

tipMode fields

FieldTypeDescription
enabledbooleanIndicates if the tip mode should be offered to the end user.
amountSettingsArray<number>An array containing slots for tip options. (Limited at 3 slots for now). The value is a percentage and limited to a value between 0 and 100

Custom tip percentage options

For now we offer three slots (as a maximum) for you to provide the user with custom tip options. See integration-> tipMode-> amountSettings each of these values is a percentage with a maximum value of 100 and minimum of 0.

Example:

📘

The tipMode will change the return location

If tipModeis enabled, we will append a new object in the returnUrl called amountInfo the appended value will look something like this:

amountInfo=eyJwYXltZW50Ijp7ImFtb3VudCI6MjQwMCwiY3VycmVuY3kiOiJFVVIifSwidGlwIjp7ImFtb3VudCI6NDg1LCJjdXJyZW5jeSI6IkVVUiJ9fQ==

The object is base64 if you decode this you'll get this JSON format:

{
   "payment":{
      "amount":2400,
      "currency":"EUR"
   },
   "tip":{
      "amount":485,
      "currency":"EUR"
   }
}

Injecting payments from another <<glossary:serviceId>>

You can provide Softpos with an alternate sales location than the one that is currently activated.

paycpoc://?transaction=<PARTIAL_TRANSACTION_OBJECT>&authorization=<AUTH_CODE>&service={"serviceId": "SL-XXXX-XXXX", "secret": "<SECRET>"}

To set this up you require two elements:

FieldExample valueDescription
serviceIdSL-1234-1234The sales location ID you want to start the payment for.
secret6ba7ef49e89c4178a1eabff5a7ab82d9The secret you retrieve from the sales location

Copy these values and fill them in the deeplink, so this service would be:

paycpoc://?transaction=<PARTIAL_TRANSACTION_OBJECT>&authorization=<AUTH_CODE>&service={"serviceId": "SL-1233-1233", "secret": "abc23230sdfsabasd03..."}

After the Payment

We will load the returnUrl. This can be a website or another application installed on the device.

returnUrl: <<https://www.yourdomain.com>

FieldTypeDescription
orderIdMV-CODEID of the transaction in the processing unit
statusActionCHANGE / PAID / CANCEL / ERRORStatus of the transaction
referenceAlphanummericYour reference of the transaction
statusCode100 / -63 / -64Nummeric detailed reasoncode for statuus
ticketPlain text - Base 64Printable ticket for the cardholder
activationCode#### -####-####Code that is valid for 24 hours, to activate the terminal via the portal of API
amountInfoPlain text - Base 64Decodable JSON string with the different objects that sum up to the total paid amount

Example CHANGE button:

<https://www.yourdomain.com?orderId=1985773695Xe163a&statusAction=CHANGE&statusCode=0&reference={order.reference}&ticket=BASE64>

<<glossary:Payer>> clicked the 'Change' button

APP-DEEPLINK://?statusAction=CHANGE&reference={order.reference}

Terminal is not activated

APP-DEEPLINK://?statusAction=ACTIVATE&reference={order.reference}&activationCode=####-####-####

Terminal is not ready due to techical problems

APP-DEEPLINK://?statusAction=ERROR&reference={order.reference}

Declined transaction by the Payment Method or bank

APP-DEEPLINK://?orderId=1985773695Xe163a&statusAction=CANCEL&statusCode=-64&reference={order.reference}&ticket=BASE64

Completed transaction by the Payment Method or bank

APP-DEEPLINK://?orderId=1985773695Xe163a&statusAction=PAID&statusCode=100&reference={order.reference}&ticket=BASE64

Completed transaction in offline mode

APP-DEEPLINK://?statusAction=OFFLINE&reference={order.reference}

If you receive this deeplink this means the payment was not able to be processed because of no internet connection on the terminal. The transaction will be processed later when internet connection resumes.

Note: in an OFFLINE scenario we don't have an orderId and ticket

Completed transaction by the Payment Method or bank with TipMode = true

APP-DEEPLINK://?orderId=1985773695Xe163a&statusAction=PAID&statusCode=100&reference={order.reference}&ticket=BASE64&amountInfo=BASE64


📘

The Exchange and payment confirmation

For Softpos transactions, you should take the payment state of the return URL. The exchange is send asynchronous to you backend. This can take longer than the transaction is completed.


Don't bother about PIN codes

Payments that are authorised by the customer on a device (like a smartwatch), no pincode is needed, not even for higher amounts. For amounts up untill some tressholds we will always first try to receive the funds without the PIN code, based on the brand of the card that is used. Sometimes the issuing bank will request to secure the transaction with a PIN-code. We will open up a pincode challenge window within the softpos application. If the pincode is providedby the customer, we will then retry the transaction. If the payment is completed (even if we needed a two-step verification via PIN), you will get back control of the flow after that second option.

🚧

Why is the pinpad is scrambled?

Because softpos can be installed on a regular consumer devices instead of secure and certified devices like payment terminals the schemes rules require us to scramble the pinpad. We know it's not a great experience, but we also know that only 4% of all our transactions are PIN-required. That's a small effort for extra security and people are more and more getting used to it. Data shows 98% of entered pincodes is right the first time. Not a bad result!

Offline PIN

If you use <<glossary:MAT>> to process payments when there is temporary no internet, you need to test the flow from End2End with the OFFLINE deeplink

Completed transaction in offline mode

APP-DEEPLINK://?statusAction=OFFLINE&reference={order.reference}



Requirements

  • The Pay. SoftPoS app only runs on Android devices.
  • The app should have the latest Android Security Patch installed within the last 3 months. Older security patches might not work.
  • The device should have a NFC reader and NFC capabilities exposed to the Pay SoftPoS app.
  • The user must accept all permission requests made by the app.

Store installation (Google Play Store)

We recommend downloading the Pay SoftPoS app through Google's Play Store. This way you will receive automated updates with bug-fixes and new features.

<https://play.google.com/store/apps/details?id=com.paynl.softpos&hl=nl>

Manual installation (APK)

VersionDownload link
1.0.33download .apk

For a manual installation of the Pay SoftPoS app follow these instructions. Please note that you will not get automated updates.

Currently there is no publicly available APK. Use the manual installation (APK) method when requested to do so by Pay.

Assuming you've acquired a copy of the SoftPoS app you need to go to the download folder locate your .apk.


  1. Open a terminal in the folder where the APK was downloaded.
  2. Execute the following command:
    adb install -i com.android.vending .\[version].apk
    Note: com.android.vending is required otherwise the app will throw sideloading errors and will not function on your android device.
  3. For the app to function properly and prevent tampering we unfortunately then need to disable all development options.
  4. Go back to the 'Developer Options'-settings page and uncheck USB Debugging.
  5. Then disable developer options entirely. This is usually the button on top.
    13 Start the app from your app launcher by search for 'Pay' or 'CPOC'.
  6. Complete instructions within the app. When completed your device is able to accept contactless payments.