Payment for Taximeter
1. Overview
2. Processes and communications
2.1 The interaction process between taxi meters and payment terminals
-
Full-journey connection process

-
Just the payment process

3. Interface Protocol
3.1 Pair
After the customer device acquires the 6-digit pairing code, it uses the "Pair" protocol for pairing. After the Wonder terminal receives a pairing request, it will return a UUID identifier, which will be used by the "Ack" protocol.
- Action: Pair
- Pin Code: pinCode1
Request "data.body" structure
| Variable | Type | Required | Description |
|---|---|---|---|
| pairUuid | UUID | Y | Pair the uuid identifier |
Example:
/*
Pin Code: pinCode1
Encrypt the original data:
{
"header": {
"requestID": "9c07d8d7-2a43-4a29-9c6d-6b8d8f7d44e5",
"clientDeviceSN": "126498561093",
"timestamp": "2025-11-12T10:11:04+00:00"
},
"body": {
"pairUuid": "3f37e6c0-bf6e-4c00-b1fa-b2bd5e1d6a3b"
}
}
*/
{
"version": "2.0",
"action": "Pair",
"data": "Xowq7OE2W5opvZCRVUMTuUkhCIURnLrj6U1BeW5iQ6RmJ3sw8oMepO9Win/DfxOJjoS4M8yxpklebbT04WWk8hPtG0r+PcQPMtAAfVGFjQHQ3z3lb+e//7lIe7F+z5G3my9BH04n1UCJ5+6QtEO6dj9JZCC7Zi50928TkHr7UwtnKW8V4WJQ8oPtgCbRRPwNg+Jd6U9bhJum6+lzMHutHU4OWegk/CkzfMdiE30aL6c0k9Zvqx+dDinu1zOSlnBAuoZ+G/wt0jc7mIQOAYQmESLg3ltpGO0uA75jyfutFzIoPWL30w/L1k41IgCTdbmG"
}
Response "data.body" structure
| Variable | Type | Required | Description |
|---|---|---|---|
| pairUuid | UUID | Y | Pair the uuid identifier |
| ackUuid | UUID | Y | Ack the uuid identifier |
| pinCode | String | Y | In the test code, it is pinCode2, which is used in the Ack interface and the business interface |
Example:
/*
Pin Code: pinCode1
Encrypt the original data:
{
"header": {
"responseID": "9c07d8d7-2a43-4a29-9c6d-6b8d8f7d44e5",
"serverDeviceSN": "NEXGO-N96-1170270945",
"timestamp": "2025-11-12T10:12:04+00:00"
},
"body": {
"pairUuid": "3f37e6c0-bf6e-4c00-b1fa-b2bd5e1d6a3b",
"ackUuid": "4d366618-49cf-4f93-bd23-25388a573b0c",
"pinCode": "OvSdpyD2FoUNR5rNyte41QqZzR1Y4DVN"
}
}
*/
{
"version": 2.0,
"action": "Pair",
"data": "cuLRC5h/7cArYnQcja3IUwSVqD2QdyWbaJE+HtVuuQDb43k9Z/n+6NltHpfDNHypVL7kDsylIzx1w+ux3N5vPac3RlLt/S8G+OZCQv2+CbjNMUhNvpty7b+AOrGRtYyZnA0Yl+NYqE2sSy5aS40jptWMbzqC7LhsV0P5+gL/GeSjufjVDhKcu7zaupfNs4W6d0YL3OAyVnCRNPc+nlAot3lUTCNGLvBIiAO0xcBNJA3HJHPSL0Rjqprlyv5DIFrk/RZW+dLJYKh3iJ1O72RklqADt5APyA1pmKaZZ5HpRDctBAFn7whu9y+LIqbzbvxGXX5dqeP36rLzNWHmCNWiqs5NLpP7wC4AnmkeGhbgZD/6kJryRhCOqMGChZPocfcyQCGQ0qHOdoonuDq5GaetbOfrWC80HR/j4uopt2IzsSA2W75E/ystFMWUWWOIJ+TZ"
}
3.2 Ack
After the client terminal initiates the pairing, it will receive an "ackUuid" identifier. This protocol needs to carry the "ackUuid" identifier to confirm that the pairing has been successful.
- Action: Ack
- Pin Code: pinCode2
Request "data.body" structure
| Variable | Type | Required | Description |
|---|---|---|---|
| ackUuid | UUID | Y | The Wonder device will use this UUID to confirm whether the pairing was successful |
Example:
/*
Pin Code: pinCode2 (OvSdpyD2FoUNR5rNyte41QqZzR1Y4DVN)
Encrypt the original data:
{
"header": {
"requestID": "73a95cfe-b0f1-42b3-82d1-5a640f61e359",
"clientDeviceSN": "126498561093",
"timestamp": "2025-11-12T10:11:04+00:00"
},
"body": {
"ackUuid": "4d366618-49cf-4f93-bd23-25388a573b0c"
}
}
*/
{
"version": "2.0",
"action": "Ack",
"data": "gAKskQC/gIG+4J8DjBJ4o9DE8QAIOCUtPHWuxxtBhDgvKqjm+6g4BNHZEsEVcp2y96QEDYLii2ZVAH17NRvkLOIAm9DAvr41a1WkpC+ersXr45MmusaAGI0BrrwKLzpyNDJZO2YNEua1FmXJLx6zmjHMTIJLoMYcZ9iKXueByTJ6LE47UuX6Cw9sNrO1zIgChHWEYUxa+MWCeisJMxpA2tNbCoW42UrJFR2BRcfEXtZT3jUD1Othi3N95WoonY3lPg7S3HSxZR2W/RBrjhyoluuBBRC/E8eq2QM3Qiwoi39Gwo7XmGbAzLL1zeUCluX7"
}
Response "data.body" structure
| Variable | Type | Required | Description |
|---|---|---|---|
| deviceStatus | String | Y | Payment device transaction status: Free / Busy Free: The current device is idle and available for new transactions; Busy: The current device is occupied with an ongoing transaction and is not available for other transactions at the moment. |
| networkStatus | String | Y | The current network connection status of the payment device: Connected / Disconnected |
| softwareVersion | String | Y | The software version of the payment device |
| businessID | String | Y | The response ID in the response Header is derived from the request ID in the request header. |
Example:
/*
Pin Code: pinCode2 (OvSdpyD2FoUNR5rNyte41QqZzR1Y4DVN)
Encrypt the original data:
{
"header": {
"responseID": "73a95cfe-b0f1-42b3-82d1-5a640f61e359",
"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"
}
}
*/
{
"version": 2.0,
"action": "Ack",
"data": "WhG2+UXymcJrg6Y47Kh2RJsSEoyWYswggTmCrJo9dh0eiW1zcQRwTErIaXqHw6p37JYBKYEjqzWWm8J6LNHfRgVTdkogaE+GFTlJGReZZ0w9J0sc6Rspl1hqF8UDlL08DsZmFnrQosIZMNzGTneA8w5Yje7kM6rPxgT8MmKQ6Y4+wROVCPC9misHhpfP2bB/vxnzpeHIs1xU2jS9toSfa/HC8Ji7tAHEZmCDKgQ6ixTobVfJmwyjsU1oJEprUSRG5N3aq32Rx4at8LWvOREXXeFRAzoI1IcUQ8SvHWpBfQFUVPsWiJEMSQTQ2X2+Z6ftLV7OfYOYtbdWjws27j0cqvyPwUAR4L7GvUp4JS4VYx/+vVCV/YMd/B3KlBoq0Q/jZVLV5inmLr+uDq7e28jOBt6o0bQDQcB46YsNyxqThv8="
}
3.3 Device Info
- Action: DeviceInfo
- Pin Code: pinCode2
Request "data.body" structure
This request has no body
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"
}
}
*/
{
"version": "2.0",
"action": "DeviceInfo",
"data": "WwmSblb3+HikHsB72o+sUgMLsIjA2lwH2nEM56OA8Fdg40p5L06OCFiDv98YhgDOagUsdrX4+30Xfb2rsuz430JlvoNUMqgr9KGjHLmKm+SdbJP3SoHKTJ6c971e4I9uko/5oE5XqQG2bP0CZ58uCFTErK6UoYfvk1e2vkU13bJiUf83/LXOPHkUZ6zqWws4AyOHk8wHDBk1zNTIzMKjfwg+YeY5aR4XaYhCcQqPsHY="
}
Response "data.body" structure
| Variable | Type | Required | Description |
|---|---|---|---|
| deviceStatus | String | Y | Payment device transaction status: Free / Busy Free: The current device is idle and available for new transactions; Busy: The current device is occupied with an ongoing transaction and is not available for other transactions at the moment. |
| networkStatus | String | Y | The current network connection status of the payment device: Connected / Disconnected |
| softwareVersion | String | Y | The software version of the payment device |
| businessID | String | Y | The response ID in the response Header is derived from the request ID in the request header. |
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"
}
}
*/
{
"version": "2.0",
"action": "DeviceInfo",
"data": "AWeTM/UeQ1EpFwPHPEZV3FmA1oawkgPlowNopFdd0BzC51HIzlr+ln88sl3jHTAnyt9XHeTn9AItX/Z6HJ9Io8PfFRD8Su202M2v5s9Hk19SQ7Sbb5Nt3BHo5DUYZ2+JZypd4faG6sfoICgyHXFnET4feZIN90gN5nw1rM13L7mQ/6IHdlJE5KrVqA4BnPnskpv1VWwhftjTBkn/2d6yxpTB2PefJNxz3m0k6pFghfAAQgAjvcpmamf6vG9zG+h08pgMSa9T8Gy3OlpjioM3JplmwxV3IuMAvHki0OByFFZDL0MkhmQKmfVNsmQHjbgiZgmVvbM+5mxbyo+cJJRExjwdSbjKL5yChFng7Z0NWbY45kVbd1SX2hfOx5osUG+oUBgq8JuLVaqX+CiUi9FOOVlEChxXHHwAomb7ec7PLpA="
}
3.4 SyncTravelData
- Action: SyncTravelData
- Pin Code: pinCode2
Request "data.body" structure
| Variable | Type | Required | Description |
|---|---|---|---|
| sequence | Int | Y | The communication serial number needs to be increased by 1 for each request |
| referenceID | String | Y | The order ID of the travel transaction |
| plateNumber | String | Y | The vehicle plate number |
| waitingTime | Int | Y | The waiting time of the travel transaction in seconds |
| totalMileage | Float | Y | The total mileage of the travel transaction in kilometers |
| validMileage | Float | Y | The valid mileage of the travel transaction in kilometers |
| startedAt | Long | Y | The timestamp(milliseconds) when the taxi travel began |
| fee | Float | Y | The fee of the travel transaction in cents |
| additionalFee | Float | Y | The additional fee of the travel transaction in cents |
| amount | Float | Y | The amount of the travel transaction in cents |
| unpaidAmount | Float | Y | The current unpaid transaction amount |
| currency | String | Y | The currency of the travel transaction, Example: HKD / USD / RMB |
Response "data.body" structure
This request has no body
3.5 Sale
- Action: Sale
- Pin Code: pinCode2
Request "data.body" structure
| Variable | Type | Required | Description |
|---|---|---|---|
| sequence | Int | Y | The communication serial number needs to be increased by 1 for each request |
| referenceID | String | Y | The order ID of the travel transaction |
| plateNumber | String | Y | The vehicle plate number |
| waitingTime | Int | Y | The waiting time of the travel transaction in seconds |
| totalMileage | Float | Y | The total mileage of the travel transaction in kilometers |
| validMileage | Float | Y | The valid mileage of the travel transaction in kilometers |
| startedAt | Long | Y | The timestamp(milliseconds) when the taxi travel began |
| pausedAt | Long | Y | The timestamp(milliseconds) when the taxi travel paused |
| fee | Float | Y | The fee of the travel transaction in cents |
| additionalFee | Float | Y | The additional fee of the travel transaction in cents |
| amount | Float | Y | The amount of the travel transaction in cents |
| unpaidAmount | Float | Y | The current unpaid transaction amount |
| currency | String | Y | The currency of the travel transaction, Example: HKD / USD / RMB |
| countdown | Int | Y | After the countdown ends (seconds), it will jump to the home page. If you don't send it, it won't jump automatically. You need to send the action: End |
Response "data.body" structure
| Variable | Type | Required | Description |
|---|---|---|---|
| status | String | Y | Response status: Success / Failed / Pending |
| errorCode | String | Y | |
| errorMessage | String | Y | |
| referenceID | String | N | The order ID of the customer's transaction |
| currency | String | N | Example: HKD / USD / RMB |
| amount | String | N | Sale amount |
| paymentMethod | String | N | Payment method |
| paymentEntryType | String | N | Payment entries, Example: contactless |
| rrn | String | N | Receiver Reference Number |
| brn | String | N | Bindo Reference Number |
| transactionType | String | N | Transaction type: Sale / PreAuth / Void / Refund |
| transactionTime | Datetime | N | Transaction Time |
| creditCard | Object | N | |
| creditCard.panPrefix6Digits | String | Y | First 6 digits of the credit card number |
| creditCard.panLast4Digits | String | Y | Last 4 digits of the credit card number |
| creditCard.consumerIdentify | String | Y | Consumer identify, e.g. Card Number, Open ID, etc. |
Example 1:
When the status is Pending
/*
Pin Code: pinCode2 (OvSdpyD2FoUNR5rNyte41QqZzR1Y4DVN)
Encrypt the original data:
{
"header": {
"responseID": "5debf769-49d7-4c9b-b6f4-8a9d90e1a874",
"serverDeviceSN": "NEXGO-N96-1170270945",
"timestamp": "2025-11-12T10:12:04+00:00"
},
"body": {
"status": "Pending",
"errorCode": "",
"errorMessage": ""
}
}
*/
{
"version": "2.0",
"action": "Sale",
"data": "47eAPdQm49haEV/irNbuHtU0PRDZaG172uuEidAb/dYUBNyyvms2hWg7PVR2UrEW37LEmyyCL/uxEnDGD1NE+dKuGUQxY58jLsDN35GkX9aSHhpVAInWErO3rfvqemvqynayMjZR9uxILsohZK3hqW7ytKBj+rZ/+3aLXT3JejWPfXyguEwrJuQiG2gngGA4Bg/1OJbi0+Ozkz88Zlv5s2H6eBqnlJcf3doXX2cI/1H3CP4YWBYGZImHsGwRCjKMlX5P1652xO68KMCxjg4Bq/EVrWXcXDFasf35/gFZ8pImKmffk7EQQ7UO1T/ObNRb"
}
Example 2:
When the status is Failed
/*
Pin Code: pinCode2 (OvSdpyD2FoUNR5rNyte41QqZzR1Y4DVN)
Encrypt the original data:
{
"header": {
"responseID": "5debf769-49d7-4c9b-b6f4-8a9d90e1a874",
"serverDeviceSN": "NEXGO-N96-1170270945",
"timestamp": "2025-11-12T10:12:04+00:00"
},
"body": {
"status": "Failed",
"errorCode": "5xxxx",
"errorMessage": "The equipment is being traded"
}
}
*/
{
"version": "2.0",
"action": "Sale",
"data": "UAwjxUyIc43RYiSJ/jf0Ny8/fl6ZefNWPMkJAab+wEZCtyCnRJmC1JTQlOvV8aWcqqWm4RGTrZIwMBY+wY8x2+uXo1tzmb4B4+rmenr3gb2sWOrkYZQBJNS9gZ/XqnM0MJXYPHRpGRD+v1Kx2Gf/GTPWsvpKoZrnOkj3B0BiEIeSyOOPmEx4wtV3v0UnNBzgcOQTvzxWPi8mwQhBfxYvWPx9OYtkdgu5nJzVfYlbZrB0Z4VvY/OppKM2mDVh4Z47plJ9/qP9FoYZ1H7Zj6bdSuD+g8x/84vbWjwtjFF75oBPIlDuLqQ+l/sWJGHE461QuYY+fVH4N70Xgti7T21S6ZG7DIWQUuacaZC/5HTkC4o="
}
Example 3:
When the status is Success
/*
Pin Code: pinCode2 (OvSdpyD2FoUNR5rNyte41QqZzR1Y4DVN)
Encrypt the original data:
{
"header": {
"responseID": "5debf769-49d7-4c9b-b6f4-8a9d90e1a874",
"serverDeviceSN": "NEXGO-N96-1170270945",
"timestamp": "2025-11-12T10:12:04+00:00"
},
"body": {
"status": "Success",
"errorCode": "",
"errorMessage": "",
"currency": "HKD",
"amount": "10.20",
"paymentMethod": "visa",
"paymentEntryType": "contactless",
"rrn": "3263492852830699521",
"brn": "3263492852495159296",
"transactionStatus": "Success",
"transactionTime": "2023-06-30T09:08:52+00:00",
"creditCard": {
"panPrefix6Digits": "555555",
"panLast4Digits": "1234",
"consumerIdentify": "xxxxxxx"
}
}
}
*/
{
"version": "2.0",
"action": "Sale",
"data": "2mSc6KHe/yrgBhnafQ9mME9Sv+o6dMqcuYCvxBtnUf6fwjSfp2uPwhp4sRkYEzbjIUHjHMXlDSFxA9y4mMofUb17c9Ch3MwBu0N7LjaZzJuh1XPwejYQDTzcF9X2YsmvlbrRCRgx1ItFus45LuSv6pf+xiUs5d6I6E+QCP40IquvaX2PcTcBnUEpvwjM0zaP85vZZ0hGqvWGow2akWQ/JgsL4mp7rl1fOD2NGPeI+uXXbH72X9zrKyr6sLHgwToiujzgXJhnOOrecOcBSpXa+LyE0wZ4NF2DWpN1VwarF7Ij0JJaapRjcEZNkBTFmKP50OlYSQMws5tyeoUanCvlMBd53Z/jmH/QyGkYFAKQN+sy1NYzWx1pmgUtOX9+yNpFcmnzO1FKqj+CZzpn65SQiC+179iBWpAa4ZKuZRdeQpooSP62BrMCKatZJp86W2gTsOGQf9t7SmaRMswykISuDhcf2X1VGPotbwRVBJgk7AmR83wy0tJ22cibqp3Jz1t7DcpRmImUDF6w7+6YsTN+0WxUkzqOf6cjgpgF9HFNu/6NRaD10WdWTlbUjuCsymfh7OE24VknAlJbnrfJBJkBUznTxD5dIXOmlZcLpj/umkG4FXPvlKgTq22QQzZsDcBQr9oP6E4BCdGgCEqHaPD4saDZ0VqYvFp4b8hvkJwpX1bbMpM7Q58/0O2RBZomLGa90zoWaLkIu0rJI18bwf3CtR4Uoj05yhf+9SeCL49gYh8="
}
3.6 End
- Action: End
- Pin Code: pinCode2
Request "data.body" structure
This request has no body
Response "data.body" structure
| Variable | Type | Required | Description |
|---|---|---|---|
| status | String | Y | Response status: Success / Failed / Pending |
| errorCode | String | Y | |
| errorMessage | String | Y |
3.7 Query Transaction Status
- Action: TransactionStatus
- Pin Code: pinCode2
Request "data.body" structure
| Variable | Type | Required | Description |
|---|---|---|---|
| targetReferenceID | String | Y | The reference ID that was carried during the transaction made at that time. |
Example:
/*
Pin Code: pinCode2 (OvSdpyD2FoUNR5rNyte41QqZzR1Y4DVN)
Encrypt the original data:
{
"header": {
"requestID": "18fd2b62-6f65-40f2-8b94-88ef32f07a3f",
"clientDeviceSN": "126498561093",
"timestamp": "2025-11-12T10:11:04+00:00"
},
"body": {
"targetReferenceID": "f8b13b22-16ca-4a87-95a4-df4bebf09ee1"
}
}
*/
{
"version": 2.0,
"action": "TransactionStatus",
"data": "FHpalD2bjhxLTHXWD8dS1RwzDftl5IpTlpF77Oi6PRkSHh3cNZOJNLDmlp/JIhyTAKMbHaoSBRhr/WnFg54fNdp7pR5LaQHdIRhrYYbOdZjY4LKM4ws4FZrZEjbcG+rLdjDX6CJmazwKVMFPADO6uT40i8FJXegd3TsPyK9GlcX6BBPTIT77fAFJjpcOUbZxFysLbbJSmxjHwI7TjoLojhKogCNFhOdt4k3dilo4Mx9V2J27fupLtSm09BLcsHu3uJqZ/O9DZeLzWLUAp/Lz7omAqz7wSKPI+/AULbhiVkq9zSGdlcxuxfqAhE7ZNsvd"
}
Response "data.body" structure
| Variable | Type | Required | Description |
|---|---|---|---|
| status | String | Y | Response status: Success / Failed / Pending |
| errorCode | String | Y | |
| errorMessage | String | Y | |
| ... | Any | Y | It is consistent with the returned information of the current query transaction type |
Example:
/*
Pin Code: pinCode2 (OvSdpyD2FoUNR5rNyte41QqZzR1Y4DVN)
Encrypt the original data:
{
"header": {
"responseID": "18fd2b62-6f65-40f2-8b94-88ef32f07a3f",
"serverDeviceSN": "NEXGO-N96-1170270945",
"timestamp": "2025-11-12T10:12:04+00:00"
},
"body": {
"status": "Success",
"errorCode": "",
"errorMessage": "",
"currency": "HKD",
"amount": "10.20",
"paymentMethod": "visa",
"paymentEntryType": "contactless",
"rrn": "3263492852830699521",
"brn": "3263492852495159296",
"transactionStatus": "Success",
"transactionTime": "2023-06-30T09:08:52+00:00",
"creditCard": {
"panPrefix6Digits": "555555",
"panLast4Digits": "1234",
"consumerIdentify": "xxxxxxx"
}
}
}
*/
{
"version": 2.0,
"action": "8KvgJ6wV9eBS4kk9pFyRYSWtSrYnqBpxgCnAf/Yr1oZv2uvDsLcMNrov+mCJFF4fdJmmJ4X+gYO7j6I6Oq39W/UlHWkAczMCLuh9242a8TOqf7cVRypDttT8HfBQXrlA/ZM8iC1DvFQr1xvgBk+vqXpXDTWpGNvGr2rYBOuOLwvcnsfGwD5xeGZ1xxICDE67ty09AyO5yIvNmYrhJAt5i1YNsOSfssET/2rFgoJuE7mcsn2ZPf0iFhq3aYeDaE8psGX6729Uo58OsiNt7vE+tZA+a0pzFeYcTL1ivE9h1pou+oP/LjvyBNlX7zGnUtD5CpKclNtmtW4uJAHUP37vnnUiHbEIZ792GyYsR/f6DYYXKT5a37DpKB7UgczxgIYHRbfM8c1XCNGnVz0ZzK1Z4AdT3keDgoZEgxOPfURQtpH/uk+KtpjUsZWOwJDnBMhvYj6/OYOVS2Sv8A/NKmD4gi/Mf2N1ZGNF2nmlrSWB4WPbTCky4J5eMnqFG1aKRSYmuVrNE3XeXg9JZk/EtCj9V6R7jcvc3xozxXMftLBffkxixs1pxE2aIZrxMGNb4WgX8goAWoe9mYP6HyuLuodxxhSMFqoLc1fKUEkNTuDiawLt9T74aT4mq5Uetrb2St+JG37xzbAKGu3KT0rs91Pp+l9FGcjWkHhMyqprUv+89BApzwelTdLuEgE/+VmSIb4kXKi9bIjqmrsH3pRgQe3pT6uMiV1sOsof18HAN/XhQvI="
}