跳到主要内容
版本:1.1.1

PAX-串口数据交互文档-1.1.2

版本号编辑者更新时间更新内容
V1.0.0陈浩2024/10/14创建
V1.1.0房杨平2025/07/22数据使用JSON通信, 适用于收款程序1.2.4版本
V1.1.1房杨平2025/11/11规范参数传递, 增强SDK数据解析, 适用于收款程序1.2.5或更高版本
V1.1.2房杨平2026/02/25增加退款接口,网络超时返回处理状态, 适用于收款程序1.2.6或更高版本

功能描述

  • 串口初始化:设置串口参数并打开串口与设备建立连接。
  • 数据接收:通过回调接口接收从设备发送的数据。
  • 数据发送:向外部设备发送数据。

SDK下载

接口介绍

注意: 这里所有的接口参数都以JSON的格式,所有的接口请求和响应都应该包含公共参数信息。

公共请求参数信息

参数名类型是否必填描述
apiString接口
requestIdString调用方唯一请求流水号

公共响应参数信息

参数名类型是否必填描述
codeString业务响应码,定义业务处理结果状态(见下方响应码说明)
msgString业务响应描述信息,用于说明响应码对应的具体结果
dataObject数据对象
├─ requestIdString原样返回请求中的流水号,用于请求-响应匹配校验
├─ apiString接口
├─ snString终端SN

公共响应结构

{
"code": "00",
"msg": "SUCCESS",
"data": {
"requestId": "971dda25971dda25971dda25",
"sn": "247KCASL1947",
"api": "/sale",
"..."
}
}

响应码定义表

常量名类型说明
REQUEST"04"String表示请求已发出(待处理状态)
CONFIRM"03"String请求确认收到(已接收未处理)
PROCESSING"02"String正在处理中(含网络超时/未知错误,此时 msg 固定为 "The process timed out."
FAIL"01"String受理异常(业务失败,msg 为具体错误信息)
SUCCESS"00"String正常受理(业务成功)

说明(V1.1.2):交易类接口(消费、预授权、预授权完成/撤销/追加、退款、查询交易)在网络超时或未知错误时,POS 会返回 code="02"(PROCESSING)、msg="The process timed out.",便于上位机统一按「超时」处理;其他业务失败返回 code="01"(FAIL)及具体 msg


使用说明

初始化串口

    private void openSerialPort(Context context) {

String port = et_serial_port.getText().toString();
int baudRate = SerialPort.BAUDRATE.B9600.getBaudrate(); // 波特率
serialService = SerialSDKService.getInstance(context);
serialService.create(port, baudRate);
serialService.setListener(this); // 设置数据回调
/**
* 消息接收超时时间
* 超时时间为60S,发送消息后开始计时
* 到设定的超时时间没有收到响应则回调超时事件onError
* 0为不启动超时机制
*/
serialService.setTimeout(0);
serialService.open();
}

回调方法

    @Override
public void onDataReceived(String jsonString) {
Log.i(TAG, "onDataReceived: " + new JSONObject(jsonString));
}

@Override
public void onError(int errorCode, String errorMessage) {
Log.i(TAG, "onError: " + errorCode + " errorMessage:" + errorMessage);
}

发送数据

  JSONObject jsonObject = new JSONObject();
jsonObject.put("api", "/sign");
serialService.sendText(jsonObject.toString());

示例代码

以下是一个完整的示例代码,展示如何使用此 SDK:

public class MainActivity extends AppCompatActivity implements SerialListener  {
private SerialSDKService serialService;

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

serialService = SerialSDKService.getInstance(context);
serialService.create("/dev/ttyS2", 9600);
serialService.setListener(this);
/**
* 消息接收超时时间
* 超时时间为60S,发送消息后开始计时
* 到设定的超时时间没有收到响应则回调超时事件onError
* 0为不启动超时机制
*/
serialService.setTimeout(0);
serialService.open();

try {
JSONObject jsonObject = new JSONObject();
jsonObject.put("api", "/sale");
jsonObject.put("requestId", "requestId");
jsonObject.put("orderAmount", "1.00");
jsonObject.put("merchantSerialNo", UUID.randomUUID());
jsonObject.put("orderTitle", "Sale");
JSONArray detailsArray = new JSONArray();
detailsArray.put("coke * 2");
detailsArray.put("chip * 5");
jsonObject.put("orderDetails", detailsArray);
String jsonString = jsonObject.toString();
serialService.sendText(jsonString);
} catch (JSONException e) {
throw new RuntimeException(e);
}
}

@Override
public void onDataReceived(String jsonString) {
try {
Log.i(TAG, "onDataReceived result: " + new JSONObject(jsonString));
JSONObject jsonObject = new JSONObject(jsonString);
String code = jsonObject.optString("code");
String msg = jsonObject.optString("msg");
if(code.equals("00")) {
JSONObject data = jsonObject.optJSONObject("data");
if (data != null) {
String api = data.optString("api");
String requestId = data.optString("requestId");
String merchantSerialNo = data.optString("merchantSerialNo");
String transactionNo = data.optString("transactionNo");
Log.d("JSON", "api = " + api);

if (api.equals("/auth") && requestId.equals("requestId")) {
Log.i(TAG, "onDataReceived: Processing /auth return data");
/**
* 通知收款POS该笔交易确认收到
*/
JSONObject jsonObject = new JSONObject();
jsonObject.put("api", "/confirm");
jsonObject.put("merchantSerialNo", merchantSerialNo);
jsonObject.put("transactionNo", transactionNo);
serialService.sendText(jsonObject.toString());
}
}
}else {
Log.e(TAG, "onDataReceived: " + msg );
}
} catch (Exception e) {
e.printStackTrace();
}
}

@Override
public void onError(int errorCode, String errorMessage) {
Log.i(TAG, "onError: " + errorCode + " errorMessage:" + errorMessage);
}

@Override
protected void onDestroy() {
super.onDestroy();
serialService.close();
}
}

接口列表

签到

接口:/sign

签到并进行配置参数下载

请求参数

参数名类型是否必填描述
apiString接口

JAVA代码

JSONObject jsonObject = new JSONObject();
jsonObject.put("api", "/sign");
serialService.sendText(jsonObject.toString());

JSON

{
"api":"/sign",
}

响应参数

参数名类型描述
signStatusString签到状态 YES NO
merchantNoString商户号
defaultAmountString预授权金额
showCardSwipeButtonString是否显示刷卡按钮 SHOW HIDE

示例

{
"code":"00",
"msg":"SUCCESS",
"data":{
"api":"/sign",
"sn":"3080004570",
"signStatus":"YES",
"merchantNo":"4276000064",
"defaultAmount":"45.00",
"showButton":"SHOW",
}
}

查询签到信息

接口:/query/device/status

查询签到信息

请求参数

参数名类型是否必填描述
apiString接口

JAVA代码

JSONObject jsonObject = new JSONObject();
jsonObject.put("api", "/query/device/status");
serialService.sendText(jsonObject.toString());

JSON

{
"api":"/query/device/status",
}

响应参数

参数名类型描述
signStatusString签到状态 YES NO
merchantNoString商户号
defaultAmountString预授权金额
showCardSwipeButtonString是否显示刷卡按钮 SHOW HIDE

示例

{
"code":"00",
"msg":"SUCCESS",
"data":{
"api":"/query/device/status",
"sn":"3080004570",
"signStatus":"YES",
"merchantNo":"4276000064",
"defaultAmount":"45.00",
"showButton":"SHOW",
}
}

配置

接口:/config

配置POS参数

请求参数

参数名类型是否必填描述
apiString接口
defaultAmountString预授权金额

JAVA代码

JSONObject jsonObject = new JSONObject();
jsonObject.put("api", "/config");
jsonObject.put("defaultAmount", "15.00");
serialService.sendText(jsonObject.toString());

JSON

{
"api":"/config",
"defaultAmount":"15.00",
}

响应参数

参数名类型描述
signStatusString签到状态 YES NO
merchantNoString商户号
defaultAmountString预授权金额
showCardSwipeButtonString是否显示刷卡按钮 SHOW HIDE

示例

{
"code":"00",
"msg":"SUCCESS",
"data":{
"api":"/sign",
"sn":"3080004570",
"signStatus":"YES",
"merchantNo":"4276000064",
"defaultAmount":"15.00",
"showButton":"SHOW",
}
}

消费

接口: /sale

消费交易

请求参数说明

参数名类型是否必填描述
apiString接口
merchantSerialNoString商户交易流水号(需保证全局唯一性)
orderAmountString订单金额 (最小值为0.01,单位:元,两位小数)
orderTitleString订单标题
orderDetailsArray订单内容 ["coke * 2", "chip * "]
externalAdditionalDataString附加信息 JSON字符串

JAVA代码

JSONObject jsonObject = new JSONObject();
jsonObject.put("api", "/sale");
jsonObject.put("orderAmount", amount);
jsonObject.put("merchantSerialNo", UUID.randomUUID());
jsonObject.put("orderTitle", "Sale");
JSONArray detailsArray = new JSONArray();
detailsArray.put("coke * 2");
detailsArray.put("chip * 5");
jsonObject.put("orderDetails", detailsArray);
jsonObject.put("externalAdditionalData", "external data");
serialService.sendText(jsonObject.toString());

JSON

{
"api":"/sale",
"orderAmount":"1.00",
"merchantSerialNo":"5b58028a-7678-4f70-8a32-de0669e0d476",
"orderTitle":"Sale",
"orderDetails":["coke * 2","chip * 5"],
"externalAdditionalData":"external data",
}

响应参数

字段名类型字段名称说明
transactionNoString平台交易单号
merchantSerialNoString商户流水号
orderNoString平台订单号
cardNoString交易卡号, 666666****4444
cardBrandString卡品牌, 参考附录 cardBrand
cardNameString卡名称
transactionStatusString订单状态, 参考附录 transactionStatus
orderAmountString金额
currencyString币种
responseCodeString实时交易状态
responseMessageString实时交易状态信息
transactionTimeString交易时间

示例

 {
"code":"00",
"msg":"SUCCESS",
"data":{
"api":"/sale",
"sn":"3080004570",
"merchantSerialNo":"5b58028a-7678-4f70-8a32-de0669e0d476",
"transactionNo":"TK552EAAA85800000844363619614720",
"orderNo":"10220250722000011228",
"cardNo":"541375******8666",
"cardBrand":"02",
"cardName":"MasterCard",
"transactionStatus":"11",
"currency":"EUR",
"orderAmount":"1.00",
"responseCode":"000000",
"responseMessage":"OK",
"transactionTime":"2025-07-22T12:25:46.000+00:00"
}
}

预授权

接口: /auth

预授权交易,用于预授权冻结资金

请求参数说明
参数名类型是否必填描述
apiString接口
merchantSerialNoString商户交易流水号(需保证全局唯一性)
orderAmountString订单金额 (最小值为0.01,单位:元,两位小数)
orderTitleString订单标题
orderDetailsArray订单内容 ["coke * 2", "chip * "]
externalAdditionalDataString附加信息 JSON字符串

JAVA代码

JSONObject jsonObject = new JSONObject();
jsonObject.put("api", "/auth");
jsonObject.put("orderAmount", amount);
jsonObject.put("merchantSerialNo", UUID.randomUUID());
jsonObject.put("orderTitle", "Auth");
JSONArray detailsArray = new JSONArray();
detailsArray.put("coke * 2");
detailsArray.put("chip * 5");
jsonObject.put("orderDetails", detailsArray);
jsonObject.put("externalAdditionalData", "external data");
serialService.sendText(jsonObject.toString());

JSON

{
"api":"/auth",
"orderAmount":"1.00",
"merchantSerialNo":"5b58028a-7678-4f70-8a32-de0669e0d476",
"orderTitle":"Auth",
"orderDetails":["coke * 2","chip * 5"],
"externalAdditionalData":"external data",
}

响应参数

字段名类型字段名称说明
transactionNoString平台交易单号
merchantSerialNoString商户流水号
orderNoString平台订单号
cardNoString交易卡号, 666666****4444
cardBrandString卡品牌, 参考附录 cardBrand
cardNameString卡名称
transactionStatusString订单状态, 参考附录 transactionStatus
orderAmountString金额
currencyString币种
responseCodeString实时交易状态
responseMessageString实时交易状态信息
transactionTimeString交易时间

示例

 {
"code":"00",
"msg":"SUCCESS",
"data":{
"api":"/auth",
"sn":"3080004570",
"merchantSerialNo":"5b58028a-7678-4f70-8a32-de0669e0d476",
"transactionNo":"TK552EAAA85800000844363619614720",
"orderNo":"10220250722000011228",
"cardNo":"541375******8666",
"cardBrand":"02",
"cardName":"MasterCard",
"transactionStatus":"11",
"currency":"EUR",
"orderAmount":"1.00",
"responseCode":"000000",
"responseMessage":"OK",
"transactionTime":"2025-07-22T12:25:46.000+00:00"
}
}

预授权完成

接口: /auth/capture

预授权完成,用于将预授权转为消费交易

请求参数说明
参数名类型是否必填描述
apiString接口
merchantSerialNoString商户交易流水号(需保证全局唯一性)
originalTransactionNoString原平台交易单号: transactionNo
orderAmountString订单金额 (最小值为0.01,单位:元,两位小数)

JAVA代码

JSONObject jsonObject = new JSONObject();
jsonObject.put("api", "/auth/capture");
jsonObject.put("orderAmount", amount);
jsonObject.put("merchantSerialNo", UUID.randomUUID());
jsonObject.put("originalTransactionNo", "TK552EAAA85800000844363619614720");
serialService.sendText(jsonObject.toString());

JSON

{
"api":"/auth/capture",
"orderAmount":"1.00",
"merchantSerialNo":"5b58028a-7678-4f70-8a32-de0669e0d476",
"originalTransactionNo":"TK552EAAA85800000844363619614720"
}

响应参数

字段名类型字段名称说明
transactionNoString平台交易单号
merchantSerialNoString商户流水号
orderNoString平台订单号
transactionStatusString订单状态, 参考附录 transactionStatus
orderAmountString金额
currencyString币种
responseCodeString实时交易状态
responseMessageString实时交易状态信息
transactionTimeString交易时间

示例

 {
"code":"00",
"msg":"SUCCESS",
"data":{
"api":"/auth/capture",
"sn":"3080004570",
"merchantSerialNo":"5b58028a-7678-4f70-8a32-de0669e0d476",
"transactionNo":"TK552EAAA85800000844363619614720",
"orderNo":"10220250722000011228",
"transactionStatus":"11",
"currency":"EUR",
"orderAmount":"1.00",
"responseCode":"000000",
"responseMessage":"OK",
"transactionTime":"2025-07-22T12:25:46.000+00:00"
}
}

预授权撤销

接口: /auth/revoke

撤销预授权交易,撤销成功后,预授权金额将被释放

请求参数说明
参数名类型是否必填描述
apiString接口
merchantSerialNoString商户交易流水号(需保证全局唯一性)
originalTransactionNoString原平台交易单号: transactionNo

JAVA代码

JSONObject jsonObject = new JSONObject();
jsonObject.put("api", "/auth/revoke");
jsonObject.put("merchantSerialNo", UUID.randomUUID());
jsonObject.put("originalTransactionNo", "TK552EAAA85800000844363619614720");
serialService.sendText(jsonObject.toString());

JSON

{
"api": "/auth/revoke",
"merchantSerialNo": "5b58028a-7678-4f70-8a32-de0669e0d476",
"originalTransactionNo": "TK552EAAA85800000844363619614720"
}

响应参数

字段名类型字段名称说明
transactionNoString平台交易单号
merchantSerialNoString商户流水号
orderNoString平台订单号
transactionStatusString订单状态, 参考附录 transactionStatus
orderAmountString金额
currencyString币种
responseCodeString实时交易状态
responseMessageString实时交易状态信息
transactionTimeString交易时间

示例

 {
"code":"00",
"msg":"SUCCESS",
"data":{
"api":"/auth/revoke",
"sn":"3080004570",
"merchantSerialNo":"5b58028a-7678-4f70-8a32-de0669e0d476",
"transactionNo":"TK552EAAA85800000844363619614720",
"orderNo":"10220250722000011228",
"transactionStatus":"11",
"currency":"EUR",
"orderAmount":"1.00",
"responseCode":"000000",
"responseMessage":"OK",
"transactionTime":"2025-07-22T12:25:46.000+00:00"
}
}

退款

接口: /refund

请求参数说明

参数名类型是否必填描述
apiString接口 /refund
merchantSerialNoString商户交易流水号(需保证全局唯一性)
originalTransactionNoString原平台交易单号(transactionNo)
orderAmountString退款金额(最小值为 0.01,单位:元,两位小数)

JSON

{
"api": "/refund",
"orderAmount": "1.00",
"merchantSerialNo": "5b58028a-7678-4f70-8a32-de0669e0d476",
"originalTransactionNo": "TK552EAAA85800000844363619614720"
}

响应参数

字段名类型字段名称说明
transactionNoString平台交易单号
merchantSerialNoString商户流水号
orderNoString平台订单号
transactionStatusString订单状态, 参考附录 transactionStatus
orderAmountString金额
currencyString币种
responseCodeString实时交易状态
responseMessageString实时交易状态信息
transactionTimeString交易时间

示例

 {
"code":"00",
"msg":"SUCCESS",
"data":{
"api":"/refund",
"sn":"3080004570",
"merchantSerialNo":"5b58028a-7678-4f70-8a32-de0669e0d476",
"transactionNo":"TK552EAAA85800000844363619614720",
"orderNo":"10220250722000011228",
"transactionStatus":"11",
"currency":"EUR",
"orderAmount":"1.00",
"responseCode":"000000",
"responseMessage":"OK",
"transactionTime":"2025-07-22T12:25:46.000+00:00"
}
}

预授权追加

接口: /auth/incremental

增加预授权金额

请求参数
参数名类型是否必填描述
apiString接口
merchantSerialNoString商户交易流水号(需保证全局唯一性)
originalTransactionNoString原平台交易单号: transactionNo
orderAmountString订单金额 (最小值为0.01,单位:元,两位小数)

JAVA代码

JSONObject jsonObject = new JSONObject();
jsonObject.put("api", "/auth/incremental");
jsonObject.put("orderAmount", amount);
jsonObject.put("merchantSerialNo", UUID.randomUUID());
jsonObject.put("originalTransactionNo", "TK552EAAA85800000844363619614720");
serialService.sendText(jsonObject.toString());

JSON

{
"api":"/auth/incremental",
"orderAmount":"1.00",
"merchantSerialNo":"5b58028a-7678-4f70-8a32-de0669e0d476",
"originalTransactionNo":"TK552EAAA85800000844363619614720"
}

响应参数

字段名类型字段名称说明
transactionNoString平台交易单号
merchantSerialNoString商户流水号
orderNoString平台订单号
transactionStatusString订单状态, 参考附录 transactionStatus
orderAmountString金额
currencyString币种
responseCodeString实时交易状态
responseMessageString实时交易状态信息
transactionTimeString交易时间

示例

 {
"code":"00",
"msg":"SUCCESS",
"data":{
"api":"/auth/incremental",
"sn":"3080004570",
"merchantSerialNo":"5b58028a-7678-4f70-8a32-de0669e0d476",
"transactionNo":"TK552EAAA85800000844363619614720",
"orderNo":"10220250722000011228",
"transactionStatus":"11",
"currency":"EUR",
"orderAmount":"1.00",
"responseCode":"000000",
"responseMessage":"OK",
"transactionTime":"2025-07-22T12:25:46.000+00:00"
}
}

交易确认

接口: /confirm

收到交易结果后通知POS确认收到交易结果,确认成功后,POS将不再收到该笔交易的后续通知

请求参数说明

参数名类型是否必填描述
apiString接口
transactionNoString确认该笔平台交易单号收到
merchantSerialNoString确认此商户交易流水号收到

JAVA代码

JSONObject jsonObject = new JSONObject();
jsonObject.put("api", "/confirm");
jsonObject.put("merchantSerialNo", "5b58028a-7678-4f70-8a32-de0669e0d476");
jsonObject.put("transactionNo", "TK552EAAA85800000844363619614720");
serialService.sendText(jsonObject.toString());

JSON

{
"api": "/confirm",
"merchantSerialNo": "5b58028a-7678-4f70-8a32-de0669e0d476",
"transactionNo": "TK552EAAA85800000844363619614720"
}

响应参数

字段名类型字段名称说明
transactionNoString平台交易单号
merchantSerialNoString商户流水号

示例

 {
"code":"00",
"msg":"SUCCESS",
"data":{
"api":"/confirm",
"sn":"3080004570",
"merchantSerialNo":"5b58028a-7678-4f70-8a32-de0669e0d476",
"transactionNo":"TK552EAAA85800000844363619614720"
}
}


查询交易

接口: /query/transaction

查询交易结果(按平台交易单号或商户流水号查询)

请求参数说明
参数名类型是否必填描述
apiString接口 /query/transaction
merchantSerialNoString商户交易流水号
transactionNoString平台交易单号(与 merchantSerialNo 至少填其一)

JAVA代码

JSONObject jsonObject = new JSONObject();
jsonObject.put("api", "/query/transaction");
jsonObject.put("merchantSerialNo", "5b58028a-7678-4f70-8a32-de0669e0d476");
jsonObject.put("transactionNo", "TK552EAAA85800000844363619614720");
serialService.sendText(jsonObject.toString());

JSON

{
"api": "/query/transaction",
"merchantSerialNo": "5b58028a-7678-4f70-8a32-de0669e0d476",
"transactionNo": "TK552EAAA85800000844363619614720"
}

响应参数

字段名类型字段名称说明
transactionNoString平台交易单号
merchantSerialNoString商户流水号
orderNoString平台订单号
cardNoString交易卡号, 666666****4444
cardBrandString卡品牌, 参考附录 cardBrand
cardNameString卡名称
transactionStatusString订单状态, 参考附录 transactionStatus
orderAmountString金额
currencyString币种
responseCodeString实时交易状态
responseMessageString实时交易状态信息
transactionTimeString交易时间

查询结果说明

情况codemsg
查询成功"00"成功,data 中为交易详情
交易不存在"01"Transaction does not exist
查询超时"02"The process timed out.

示例(成功)

 {
"code":"00",
"msg":"SUCCESS",
"data":{
"api":"/query/transaction",
"sn":"3080004570",
"merchantSerialNo":"5b58028a-7678-4f70-8a32-de0669e0d476",
"transactionNo":"TK552EAAA85800000844363619614720",
"orderNo":"10220250722000011228",
"cardNo":"541375******8666",
"cardBrand":"02",
"cardName":"MasterCard",
"transactionStatus":"11",
"currency":"EUR",
"orderAmount":"1.00",
"responseCode":"000000",
"responseMessage":"OK",
"transactionTime":"2025-07-22T12:25:46.000+00:00"
}
}

设置营业

接口:/open/business

设置营业后可以进行交易操作

请求参数

参数名类型是否必填描述
apiString接口

JAVA代码

JSONObject jsonObject = new JSONObject();
jsonObject.put("api", "/open/business");
serialService.sendText(jsonObject.toString());

JSON

{
"api":"/open/business",
}

响应参数

参数名类型描述
businessStatusString营业状态 OPEN CLOSE

示例

{
"code":"00",
"msg":"SUCCESS",
"data":{
"api":"/open/business",
"sn":"3080004570",
"businessStatus":"1OPEN",
}
}

设置停业

接口:/stop/business

设置停业后不能进行交易操作

请求参数

参数名类型是否必填描述
apiString接口

JAVA代码

JSONObject jsonObject = new JSONObject();
jsonObject.put("api", "/stop/business");
serialService.sendText(jsonObject.toString());

JSON

{
"api":"/stop/business",
}

响应参数

参数名类型描述
businessStatusString营业状态 OPEN CLOSE

示例

{
"code":"00",
"msg":"SUCCESS",
"data":{
"api":"/stop/business",
"sn":"3080004570",
"businessStatus":"CLOSE",
}
}

查询营业状态

接口:/query/business/status

查询当前设备是否可以进行交易操作

请求参数

参数名类型是否必填描述
apiString接口

JAVA代码

JSONObject jsonObject = new JSONObject();
jsonObject.put("api", "/query/business/status");
serialService.sendText(jsonObject.toString());

JSON

{
"api":"/query/business/status",
}

响应参数

参数名类型描述
businessStatusString营业状态 OPEN CLOSE

示例

{
"code":"00",
"msg":"SUCCESS",
"data":{
"api":"/query/business/status",
"sn":"3080004570",
"businessStatus":"OPEN",
}
}