云打印机对接说明

4. 开发对接API接口(方案一:回调方式)

特别声明:

为更好的保护合作伙伴的数据隐私,又能实现完整的订单打印过程,需要商米与合作伙伴共同努力一起实现。以下文档约定了云打印机通讯的两部分接口,一部分为商米云提供的API接口,提供给合作伙伴调用,以完成设备绑定相关和消息推送相关功能;一部分为合作伙伴需要开放给商米云打印机调用的API接口,以完成订单打印相关功能。

参数说明:

  1. 每个请求的参数包含两部分:公共参数和私有参数,详细请看以下对应说明。
  2. 传参方式为key-value方式,请求头加上“application/x-www-form-urlencoded”。
  3. 以下每个接口只列出私有参数和返回结果,其他请看请求和公共参数说明。
  4. 返回结果皆为json格式数据。

请求公共参数说明(所有请求都必须传递的参数):

请求参数名类型说明
signstring签名,参考下面签名生成方式。注意:sign必须全部32位大写MD5
app_idstring商米提供的app_id,申请开通通道时获得
msnstring设备SN号
timestampstringUnix时间戳(秒)

返回公共参数说明:

返回参数名类型说明
codeint返回码,参见常见错误码列表
data不指定数据类型和内容详见私有返回参数data,如果有错误,返回null
msgstring结果提示信息,如果有错误返回错误信息描述

公共请求参数sign生成说明:

签名算法:MD5

签名生成方式举例(此处以打印机绑定接口为例):
app_id:sm5b9b4daef3463 
msn:NT1234DF23456 
timestamp:1589277365 
shop_id:1

步骤1:以“key=value”格式,按参数名称ASCII字典顺序排序:
stringA=“app_id=sm5b9b4daef3463&msn=NT1234DF23456&shop_id=1×tamp=1589277365”;

步骤2:拼接的关键app_key,假定app_key是“dd3ac24736589ae17d333e362859bf4c”,那么
stringB=“app_id=sm5b9b4daef3463&msn=NT1234DF23456&shop_id=1×tamp=1589277365dd3ac24736589ae17d333e362859bf4c”

步骤3:对stringB进行MD5加密得到最终签名sign,即sign=MD5(stringB)。即sign=“946720303FEFF4516626A4431D2753CA”

以上参数值仅作为签名生成方式举例所用,实际签名生成所需参数值以实际情况为准

基于以上签名生成方式,其中私密参数app_id和app_Key,由商米科技统一分配。注意:签名sign必须全部32位大写MD5

常见错误码说明:

错误码说明
10000接口调用成功
20000服务不可用
20001授权失败
40001缺少所需参数
40002非法参数

此上为全局常见错误码说明,后续会继续补充。除公共错误码以外,具体业务错误码参见具体业务接口内容。

4.1 商米云API接口

基于合作伙伴数据隐私考虑,商米云不会直接获取打印数据,而是采用消息传递方式,由打印机直连合作伙伴云拉取所需数据进行打印。以下规范由商米云实现了几个基本功能接口,以完成设备绑定、订单消息通知、语音传递等相关功能。

请求URL地址:https://openapi.sunmi.com

API接口开发DEMO文档下载(PHP)

1)打印机绑定接口

接口名:

  • /v1/printer/printerAdd

请求方式:

  • POST

公共参数:

参数名类型说明
signstring签名,参考上面签名生成方式。注意:签名sign必须全部32位大写MD5
app_idstring商米提供的app_id
msnstring设备SN号
timestampstringUnix时间戳(秒)

私有参数:

参数名类型说明
shop_idstring合作伙伴名下的商户Id,最大长度小于32位字符。
此处的shop_id是相对于合作伙伴APP中店铺管理而言的店铺id号,并非商米的店铺。因为打印机一般需要绑定到店铺下,才能建立店铺和设备的对应关系,设备查询时也要依据店铺来查询设备的联网状态。这个shop_id由合作伙伴进行管理,传什么值商米就保存什么值。
shop_id是对合作伙伴名下设备进行分组管理的唯一条件,查询店铺设备状态列表时使用。若无店铺需关联可传””,那么设备状态列表结果集将只返回shop_id为空的设备,不会返回shop_id不为空的设备。

成功返回示例:

{
    "code": "10000",
    "data": null,
    "msg" : ""
}

成功返回参数说明:

参数名类型说明
datastring包含成功和失败信息

失败返回示例:

{
  "code": "10000",
  "data": {
     "subCode": "60001",
     "subMessage": "",
  },
  "msg":  "string"
}

失败错误码说明:

错误码说明
60001超出时间范围请求无效
60002sn号不存在
60003不属于该渠道设备
60004绑定失败
60007
绑定异常
60008设备已绑定,请检查是否已在商米助手绑定过,需在商米助手中解绑后才能执行本渠道绑定

2)打印机解绑接口

接口名:

  • /v1/printer/printerUnBind

请求方式:

  • POST

公共参数:

参数名类型说明
signstring签名,参考上面签名生成方式。注意:签名sign必须全部32位大写MD5
app_idstring商米提供的app_id
msnstring设备SN号
timestampstringUnix时间戳(秒)

私有参数:

参数名类型说明
shop_idstring合作伙伴名下的商户Id ,需要与绑定时一致

shop_id必传,否则无法将该打印机从该店铺下解绑

成功返回示例:

{
    "code": "10000",
    "data": null,
    "msg" : ""
}

成功返回参数说明:

参数名类型说明
datastring包含成功和失败信息

失败返回示例:

{
  "code": "10000",
  "data": {
     "subCode": "60001",
     "subMessage": "",
  },
  "msg":  "string"
}

失败错误码说明:

错误码说明
60001超出时间范围请求无效
60002sn号不存在
60003不属于该渠道设备
60005解绑失败

3)查询店铺下已绑定设备状态

接口名:

  • /v1/machine/queryBindMachine

请求方式:

  • POST

公共参数:

参数名类型说明
signstring签名,参考上面签名生成方式。注意:签名sign必须全部32位大写MD5
app_idstring商米提供的app_id
timestampstringUnix时间戳(秒)

私有参数:

参数名类型说明
shop_idstring合作伙伴商户Id ,需要与绑定时一致

成功返回示例:

{
    "code": "10000",
    "data": [
        {
            "is_online": "1", //1表示设备在线,0表示离线
            "msn": "N302D94D40068" //设备SN号
        }
    ],
    "msg": ""
}

成功返回参数说明:

参数名类型说明
dataObjectmsn:设备sn号;is_online:设备是否在线 1-在线 0-不在线

失败返回示例:

{
    "code": "10000",
    "data": {
       "subCode": "60001",
       "subMessage": "",
    },
    "msg": ""
}

失败错误码说明:

错误码说明
60001超出时间范围请求无效
60002sn号不存在
60003不属于该渠道设备
60006商户Id不存在

4)有新订单消息通知

接口名:

  • /v1/printer/newOrderNotice

请求方式:

  • POST

公共参数:

参数名类型说明
signstring签名,参考上面签名生成方式。注意:签名sign必须全部32位大写MD5
app_idstring商米提供的app_id
msnstring设备SN号
timestampstringUnix时间戳(秒)

私有参数:

参数名类型说明
hasOrderint1-有新的订单
orderIdstring订单Id (必填),用于按键重打订单时使用

成功返回示例:

{
    "code": "10000",
    "data": null,
    "msg" : ""
}

成功返回参数说明:

参数名类型说明
subDatastring包含成功和失败信息

失败返回示例:

{
    "code": "10000",
    "data": {
       "subCode": "60001",
       "subMessage": "",
    },
    "msg": ""
}

失败错误码说明:

错误码说明
60001超出时间范围请求无效
60002sn号不存在
60003不属于该渠道设备

5)语音内容推送

接口名:

  • /v1/printer/pushVoice

请求方式:

  • POST

公共参数:

参数名类型说明
signstring签名,参考上面签名生成方式。注意:签名sign必须全部32位大写MD5
app_idstring商米提供的app_id
msnstring设备SN号
timestampstringUnix时间戳(秒)

私有参数:

参数名类型说明
call_contentstring 需要语音播报的字符串,与call_url只能使用一个,无数据时传””
call_url string 需要设备播放的语音文件下载路径,与call_content只能使用一个,无数据时传””。文件格式只能为MP3或WAV格式(MP3要求16bit单声道8000Hz采样率。WAV要求16bit单声道8000Hz采样率)
expTimestampint语音消息有效截止Unix系统时间戳
cycleint语音播放次数,0 不提示,1 播报1次,3 播报3次,999 循环播放
delayint播报中间间隔时间,单位秒,默认2秒

成功返回示例:

{
    "code": "10000",
    "data": null,
    "msg" : ""
}

成功返回参数说明:

参数名类型说明
datastring包含成功和失败信息

失败返回示例:

{
    "code": "10000",
    "data": {
       "subCode": "60001",
       "subMessage": "",
    },
    "msg": ""
}

失败错误码说明:

错误码说明
60001超出时间范围请求无效
60002sn号不存在
60003不属于该渠道设备

4.2 合作伙伴云API接口

基于合作伙伴数据隐私考虑,商米云不会直接获取打印数据,而是采用消息传递方式,由打印机直连合作伙伴云拉取所需数据进行打印。以下规范由合作伙伴云实现几个基本功能接口,以完成打印机设备获取订单数据进行打印。

请求URL地址:为了让打印机设备能够直连合作伙伴云API接口实现订单打印功能,需要事先提供可以正常调用的URL地址给到商米云。

API接口开发DEMO文档下载(GO语言)

1)获取订单列表

接口名:

  • printTicket/getPrintTicketOrderId

请求方式:

  • GET

参数:

参数名类型说明
signstring签名,参考上面签名生成方式。注意:签名sign必须全部32位大写MD5
app_idstring商米提供的app_id
msnstring设备SN号
timeStampstringUnix时间戳(秒)

返回示例(json):

{
    "code":1,
    "data":["id","id","id","id","id"],
    "msg":""
}

返回参数:

参数名说明
code1代表请求成功,-1代表请求失败
data返回数据库中五条订单id集合,若请求失败data为null
msg若请求失败,msg返回error信息,请求成功则msg为””

备注:为保证打印不漏单,订单id列表依照时间顺序每次最多返回5条订单id集合列表。打印机会将所有订单id内容依次打印完成后,再请求该接口获取需打印订单id列表,直至该接口返回为空停止。

2)获取订单详情

接口名:

  • printTicket/getPrintTicketInfo

请求方式:

  • GET

参数:

参数名类型说明
signstring签名,参考上面签名生成方式。注意:签名sign必须全部32位大写MD5
app_idstring商米提供的app_id
msnstring设备SN号
timeStampstringUnix时间戳(秒)
orderIdstring订单id

返回示例(json):

{
    "code":1,
    "data":{
      "voiceCnt":1,  //语音播报次数
      "voice":"语音内容",  //语音播报内容,voice与voiceUrl内容只能使用一个,无数据时传""
      "voiceUrl":"http://xxx.xxx.xxx/playaudio.MP3",  //语音播报文件下载地址,voice与voiceUrl内容只能使用一个,无数据时传""。voice是内置语音播报的内容文本。voiceUrl为需要设备播放的语音文件,文件格式只能为MP3或WAV格式(MP3要求16bit单声道8000Hz采样率。WAV要求16bit单声道8000Hz采样率)
      "orderCnt":2,  //打印票据张数
      "data":"1B21306D4B8BD5310A",//使用ESCPOS指令字体倍高宽模式打印“测试1”内容,末尾还有一个回车指令
    },
    "msg":""
}

data说明:打印内容采用十六进制格式传输,所有文本内容采用UTF8编码。在内容中可以直接使用ESC/POS指令集控制打印,以获得所需的票据排版格式。

```
//PHP代码示例:  

$str = chr(27). chr(33). chr(48). "南国超市". chr(27). chr(33). chr(0). chr(0x0A);  //chr(27). chr(33). chr(48)是ESC/POS指令的字体效果倍高宽;chr(27). chr(33). chr(0)是ESC/POS指令的字体效果标准大小;0A是换行
$str = $str. "台号:01       工号:01". chr(0x0A);
$str = $str. "时间:12:45:28". chr(0x0A);
$str = $str. "单号:00554789713585". chr(0x0A);
$str = $str. "商品名称     单价*数量       金额". chr(0x0A);
$str = $str. "--------------------------------". chr(0x0A);
$str = $str. "百事利精装糖果  7. 00*1      7. 00". chr(0x0A);
$str = $str. "旺旺雪饼        8. 00*1      8. 00". chr(0x0A);
$str = $str. "可口可乐        2. 50*1      2. 50". chr(0x0A);
$str = $str. "喜之朗果冻     10. 00*1     10. 00". chr(0x0A);
$str = $str. "巧克力饼干     10. 00*1     10. 00". chr(0x0A);
$str = $str. "--------------------------------". chr(0x0A);
$str = $str. "总件数:5          总计RMB: 27. 00". chr(0x0A);
$str = $str. chr(0x0A);
$str = $str. chr(27). chr(33). chr(16). "      谢谢惠顾欢迎下次光临". chr(27). chr(33). chr(0). chr(0x0A);//显示效果是字体倍高;0A是换行

$data = bin2hex(strToUtf8($str));  //$data为:1b2130e58d97e59bbde8b685e5b8821b21000ae58fb0e58fb73a303120202020202020e5b7a5e58fb73a30310ae697b6e997b43a31323a34353a32380ae58d95e58fb73a30303535343738393731333538350ae59586e59381e5908de7a7b020202020202020202020202020e58d95e4bbb72ae695b0e9878f202020202020e98791e9a29d0a2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d0ae799bee4ba8be588a9e7b2bee8a385e7b396e69e9c2020202020202020372e30302a312020202020202020372e30300ae697bae697bae99baae9a5bc2020202020202020202020202020382e30302a312020202020202020382e30300ae58fafe58fa3e58fafe4b9902020202020202020202020202020322e35302a312020202020202020322e35300ae5969ce4b98be69c97e69e9ce586bb202020202020202020202031302e30302a312020202020202031302e30300ae5b7a7e5858be58a9be9a5bce5b9b2202020202020202020202031302e30302a312020202020202031302e30300a2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d0ae680bbe4bbb6e695b02020342e303020202020202020202020e680bbe8aea1524d4220202020202032372e30300a0a1b2110202020202020e8b0a2e8b0a2e683a0e9a1bee6aca2e8bf8ee4b88be6aca1e58589e4b8b41b21000a

//该方法判断字符串内容是否是UTF8编码,如果是直接返回,如果不是则将字符串转换为UTF8编码
function strToUtf8($str){
    $encode = mb_detect_encoding($str, array("ASCII",'UTF-8',"GB2312","GBK",'BIG5'));
    if($encode == 'UTF-8'){
        return $str;
    }else{
        return mb_convert_encoding($str, 'UTF-8', $encode);
    }
}
```

返回参数:

参数名说明
code1 代表请求成功,-1代表请求失败
data 返回订单内容,若请求失败data为null;请求成功则返回:voiceCnt为语音播报次数,voice为语音播报内容,orderCnt为打印票据张数,data为订单打印数据
msg若请求失败,msg返回error信息,请求成功则msg为””

云打印机因为具有重打订单功能,该接口需要允许状态已经标记为打印成功的订单,仍然允许打印机根据订单ID请求订单详情,以完成重打动作。

3)更新订单状态

接口名:

  • printTicket/updatePrintTicketStatus

请求方式:

  • GET

参数:

参数名类型说明
signstring签名,参考上面签名生成方式。注意:签名sign必须全部32位大写MD5
app_idstring商米提供的app_id
msnstring设备SN号
timeStampstringUnix时间戳(秒)
orderIdstring订单id
statusint状态 1:订单打印成功、0:订单打印失败、-1:订单json格式错误、-2:data字段内容为空

返回示例(json):

{
    "code":1,
    "data":"success",
    "msg":""
}

返回参数:

参数名说明
code1 代表请求成功,-1代表请求失败
data成功返回“success”,失败返回“fail”
msg若请求失败,msg返回error信息,请求成功则msg为””