Skip to main content

ECR via App to App

Inter-App Communication

Complete the order collection through the App-to-App method.

The App to App channel carries the ECR Interface Protocol messages between a client App and the Wonder mPOS app (wondermpos).


1. Communication Format​

Communication is performed by invoking the Wonder mPOS app via an Android Deep Link:

1. Request format:
wondermpos://public/payment?version={version}&action={Action}&data={encodedData}&callback={encodedCallback}

2. Response format:
{callback}?version={version}&action={Action}&data={encodedData}

Example: merchantpos://public/payment/result?version={version}&action={Action}&data={encodedData}

2. Data formatting instance​


// 1. Request data example
/*
Pin Code: pinCode2 (OvSdpyD2FoUNR5rNyte41QqZzR1Y4DVN)
Encrypt the original data:
{
"header": {
"requestID": "2c7f32e1-b9e4-4b34-96cc-15c51289f69b",
"clientDeviceSN": "126498561093",
"timestamp": "2025-11-12T10:11:04+00:00"
}
}
*/

const deviceInfoRequestBodyJson = {
"version": "2.0",
"action": "DeviceInfo",
"data": "LzskNnsYgifR+ZjuXVjPDfT2Nw3YhbA4OAmT2yBBFgR39Q5TjSrnaW44czmmBcVlr2GL327sHk62o5FMXsqyxUNJC0uq1hEgp1gTzxzLYNnkwqbb7NeSFfdscqReOPiOMbY7rWN6sjfoVpVbTKSEVYmhZAVx10TrzSPE7w63pHNZl6utlzkcZNVwZSQO6qqkXtAGbKtryxZ1J0VA8mIt80aDKqEpECYICV1twM6gHgw="
};

const data = deviceInfoRequestBodyJson.data;
const encodedData = encodeURIComponent(data);
// LzskNnsYgifR%2BZjuXVjPDfT2Nw3YhbA4OAmT2yBBFgR39Q5TjSrnaW44czmmBcVlr2GL327sHk62o5FMXsqyxUNJC0uq1hEgp1gTzxzLYNnkwqbb7NeSFfdscqReOPiOMbY7rWN6sjfoVpVbTKSEVYmhZAVx10TrzSPE7w63pHNZl6utlzkcZNVwZSQO6qqkXtAGbKtryxZ1J0VA8mIt80aDKqEpECYICV1twM6gHgw%3D

wondermpos://public/payment?version=2.0&action=DeviceInfo&data=LzskNnsYgifR%2BZjuXVjPDfT2Nw3YhbA4OAmT2yBBFgR39Q5TjSrnaW44czmmBcVlr2GL327sHk62o5FMXsqyxUNJC0uq1hEgp1gTzxzLYNnkwqbb7NeSFfdscqReOPiOMbY7rWN6sjfoVpVbTKSEVYmhZAVx10TrzSPE7w63pHNZl6utlzkcZNVwZSQO6qqkXtAGbKtryxZ1J0VA8mIt80aDKqEpECYICV1twM6gHgw%3D&callback=merchantpos%3A%2F%2Fpublic%2Fpayment%2Fresult



// 2. Response data example
/*
Pin Code: pinCode2 (OvSdpyD2FoUNR5rNyte41QqZzR1Y4DVN)
Encrypt the original data:
{
"header": {
"responseID": "2c7f32e1-b9e4-4b34-96cc-15c51289f69b",
"serverDeviceSN": "NEXGO-N96-1170270945",
"timestamp": "2025-11-12T10:12:04+00:00"
},
"body": {
"deviceStatus": "Free",
"networkStatus": "Connected",
"softwareVersion": "1.0.0(188)",
"businessID": "ff467f02-5b69-45f3-81aa-bffcca55fe8f"
}
}
*/

const deviceInfoResponseBodyJson =
{
"version": "2.0",
"action": "DeviceInfo",
"data": "ZhnFiGfiT5Oir46CtHaQbVpegL5pRkNELxhOdN+XbqzIiaUmoimyxD3VYspmdNhyy2ZoOsrDZGvNhOxp/5/Cf21XBb2j8P8Gl/eMV7yHafjvqhoYGQY+m2PoYYAwBsWH0XDmbti+rfg7VQFFvHBoOqnfYmktcSJzHjm5hX4qyUMQdNWeTF4e+pkZ3jvTTLvdzMZlrMjwXOMxE1ikrbR6sgCV2cFx2Lrdvlh8gJdE6SM35CZna88X/s/tMPe2w32Lh0ou2eHKlARBuCG69KxEp7RpBQtw9+PDrzX7u4bL13V6b6LZJnejuwIsbxIz0yAPr6eApB41Vr6pELCXOyh1zRoxlF8RN5c8AhYE5NrSLCcvMOwZxvGjihrePAjO7vJFivowjoIwYMad1H31uLCIGrjOoD2JEycnpDWuGyRZcgU="
};

const data = deviceInfoResponseBodyJson.data;
const encodedData = encodeURIComponent(data);
// ZhnFiGfiT5Oir46CtHaQbVpegL5pRkNELxhOdN%2BXbqzIiaUmoimyxD3VYspmdNhyy2ZoOsrDZGvNhOxp%2F5%2FCf21XBb2j8P8Gl%2FeMV7yHafjvqhoYGQY%2Bm2PoYYAwBsWH0XDmbti%2Brfg7VQFFvHBoOqnfYmktcSJzHjm5hX4qyUMQdNWeTF4e%2BpkZ3jvTTLvdzMZlrMjwXOMxE1ikrbR6sgCV2cFx2Lrdvlh8gJdE6SM35CZna88X%2Fs%2FtMPe2w32Lh0ou2eHKlARBuCG69KxEp7RpBQtw9%2BPDrzX7u4bL13V6b6LZJnejuwIsbxIz0yAPr6eApB41Vr6pELCXOyh1zRoxlF8RN5c8AhYE5NrSLCcvMOwZxvGjihrePAjO7vJFivowjoIwYMad1H31uLCIGrjOoD2JEycnpDWuGyRZcgU%3D

merchantpos://public/payment/result?version=2.0&action=DeviceInfo&data=ZhnFiGfiT5Oir46CtHaQbVpegL5pRkNELxhOdN%2BXbqzIiaUmoimyxD3VYspmdNhyy2ZoOsrDZGvNhOxp%2F5%2FCf21XBb2j8P8Gl%2FeMV7yHafjvqhoYGQY%2Bm2PoYYAwBsWH0XDmbti%2Brfg7VQFFvHBoOqnfYmktcSJzHjm5hX4qyUMQdNWeTF4e%2BpkZ3jvTTLvdzMZlrMjwXOMxE1ikrbR6sgCV2cFx2Lrdvlh8gJdE6SM35CZna88X%2Fs%2FtMPe2w32Lh0ou2eHKlARBuCG69KxEp7RpBQtw9%2BPDrzX7u4bL13V6b6LZJnejuwIsbxIz0yAPr6eApB41Vr6pELCXOyh1zRoxlF8RN5c8AhYE5NrSLCcvMOwZxvGjihrePAjO7vJFivowjoIwYMad1H31uLCIGrjOoD2JEycnpDWuGyRZcgU%3D

3. Interface Protocol​

3.1 Pair​

3.2 Ack​

3.3 Unpair​

3.4 Device Info​

3.5 Sale​

3.6 Abort​

3.7 Void​

3.8 Refund​

3.9 Query Transaction Status​

3.10 Sale Directly (to do)​

3.11 PreAuth (to do)​

3.12 Capture (to do)​

3.13 Print​

3.13 CustomPrint​

  • Action: CustomPrint
  • Pin Code: pinCode2

Request "data.body" structure​

VariableTypeRequiredDescription
printUrlStringYURI provided by the third-party application for retrieving the print content.
Example:​

/*
Pin Code: pinCode2 (OvSdpyD2FoUNR5rNyte41QqZzR1Y4DVN)
Encrypt the original data:
{
"header": {
"requestID": "0f7d24de-76fc-46f8-861b-2d0d31a2dd9e",
"clientDeviceSN": "126498561093",
"timestamp": "2025-11-12T10:11:04+00:00"
},
"body": {
"printUrl": "content://com.partner.pos.fileprovider/images/custom_print.png"
}
}
*/

{
"version": "2.0",
"action": "CustomPrint",
"data": "FXChidZ5/yPgfhnVIoE4i8BZkfWh7kMkmMOGsFEGK9Gj32nxaNDuqh+J2jmQSnc+WEwf+RcWsY8Stn3wcx1NAkoA5NNxbSXHSSMv0JFD7q1lnjX28oQ29BMC6RDKUpZ3EZtz2SbwGiWKiA4qOqhVpXbMiVrFH19IBIEzNAPtv4qwcWjvzsMKufSWiOV4IV+7lbmuZo2kPgBdo1b/nJiCin6gx5MQDL4LAcdcLFr/XVxFYdXqqzn+wO/Rl0hBQiJMkA7ozF1ZcfJwTnov5nhTLWgS2nKs1v2Cyk3Dt2Cqehm7aX6yrM2E7ru93B7Wscm2D1bWqKaykqSY+6WtUFQDlg=="
}

Response "data.body" structure​

VariableTypeRequiredDescription
statusStringYResponse status: Success / Failed
Example:​

/*
Pin Code: pinCode2 (OvSdpyD2FoUNR5rNyte41QqZzR1Y4DVN)
Encrypt the original data:
{
"header": {
"responseID": "0f7d24de-76fc-46f8-861b-2d0d31a2dd9e",
"serverDeviceSN": "NEXGO-N96-1170270945",
"timestamp": "2025-11-12T10:12:04+00:00"
},
"body": {
"status": "Success"
}
}
*/

{
"version": "2.0",
"action": "CustomPrint",
"data": "D2LufBjIL2Ugtuzm1Sm/WA5lShz72MGcCGS8yVvlFX7cgdFS+eLszx9R3y0+wW0/4OWW1NZybyqKlGrOi+vDyerbLrkKC2XtMFOYQ4q1F88qrOIapsDfj0b3/jnhPrKwRML4YJeVGIS1BE5rDsBHADTGoQ/gYj+XAskMXLLJuvhlVdEMOPqP3hp4u1LmGRuIyIVAgMzXPf9+Eb2D1bii4bzyTRBFTHibsN5580VTIhZ90Owhm1oMhnjstryQ/uhIJUTa1je33nCPosW4s0+jXw=="
}
tip

Android Integration Note​

Important: When printUrl is a local content:// URI provided through Android FileProvider, the calling application must grant Wonder mPOS read access to the URI.

The Intent must include:

Intent.FLAG_GRANT_READ_URI_PERMISSION

The URI permission should also be granted through ClipData / grantUriPermission as required by the Android implementation.

Without URI read permission, Wonder mPOS may receive the printUrl but will not be able to access the print content.

Android Example:​

val deeplink = "wondermpos://public/payment?version=2.0&action=CustomPrint&..."

val intent = Intent(Intent.ACTION_VIEW, Uri.parse(deeplink)).apply {
setPackage(WONDER_MPOS_PACKAGE)
addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
addFlags(Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION)

clipData = ClipData.newUri(contentResolver, "printUrl", printUri)
type = "image/png"
}

grantUriPermission(
WONDER_MPOS_PACKAGE,
printUri,
Intent.FLAG_GRANT_READ_URI_PERMISSION
)

startActivity(intent)

Notes​

  • CustomPrint is an independent App-to-App action and is not part of Sale / Void / Refund.
  • The print content is provided by the third party through printUrl.
  • If printUrl uses an Android content:// URI, the calling application must grant Wonder mPOS URI read permission.
  • Supported print content formats and size limitations should follow the final implementation confirmed by Development.
  • For detailed printer hardware specifications, please contact the technical support team for assistance.