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:
Provider | Package name | Download |
---|---|---|
Play Store (Android) | PAY.POS | <https://play.google.com/store/apps/details?id=com.paynl.softpos&pli=1> |
Sunmi P-Devices | PAY.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 iPhone | PAY.POS | <https://apps.apple.com/nl/app/pay-pos/id6468886450> |
App Versions
Version | Updates | Release date | .APK download for Android |
---|---|---|---|
v1.1.3 |
|
31-01-2025 |
|
v1.0.57 |
|
19-11-2024 |
|
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 |
|
v1.0.20 |
QR Code and Barcode scanning for quick activation. |
11-06-2024 |
|
v1.0.19 |
Pin prompt cancelation status. |
30-05-2024 |
|
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 |
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
Field | Type | Description |
---|---|---|
enabled | boolean | Indicates if the tip mode should be offered to the end user. |
amountSettings | Array<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 locationIf
tipMode
is enabled, we will append a new object in the returnUrl calledamountInfo
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>>
<<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:
Field | Example value | Description |
---|---|---|
serviceId | SL-1234-1234 | The sales location ID you want to start the payment for. |
secret | 6ba7ef49e89c4178a1eabff5a7ab82d9 | The 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>
Field | Type | Description |
---|---|---|
orderId | MV-CODE | ID of the transaction in the processing unit |
statusAction | CHANGE / PAID / CANCEL / ERROR | Status of the transaction |
reference | Alphanummeric | Your reference of the transaction |
statusCode | 100 / -63 / -64 | Nummeric detailed reasoncode for statuus |
ticket | Plain text - Base 64 | Printable ticket for the cardholder |
activationCode | #### -####-#### | Code that is valid for 24 hours, to activate the terminal via the portal of API |
amountInfo | Plain text - Base 64 | Decodable 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 confirmationFor 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)
Version | Download link |
---|---|
1.0.33 | download .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.
- Open a terminal in the folder where the APK was downloaded.
- 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. - For the app to function properly and prevent tampering we unfortunately then need to disable all development options.
- Go back to the 'Developer Options'-settings page and uncheck USB Debugging.
- 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'. - Complete instructions within the app. When completed your device is able to accept contactless payments.
Updated 3 months ago