商米收银管家

商米收银管家产品介绍

商米收银管家为SaaS软件提供一站式的支付解决方案。可受理微信、支付宝、支付宝人脸、银联钱包等扫码或刷脸支付方式。商米收银管家已对接多条支付通道。商米收银管家已适配商米全部机型。SaaS软件可通过调用商米收银管家,完成支付。仅需一次对接开发,即可便捷使用多条支付通道。

以下为相关开发文档和SDK,请根据实际调试设备下载使用

1)商米非金融收银台及接口文档(支持T系列、D系列、S系列、X系列、K系列、H系列、V系列、M系列、L系列的机型)

2)商米P系列设备收银台及接口文档(支持P1-4G、P2lite和P2机型)

3)商米收银管家云对云接口(目前支持查询、退款、微信小程序公众号支付和支付回调操作)

支付业务接入对接人:赵琨 18101811986

商米收银管家-业务对接FAQ

商米收银管家-技术对接FAQ

Sunmi收银demo

商米提供一个简易App来展示如何使用副屏,扫码,打印,电子秤,人脸支付等功能。支持台式收银系列(除T1,T1Mini),手持非金融系列,电子秤系列,K1

酒店自助发卡demo,包含身份证读取,发卡,指示灯控制

2.0.0 增加支付开关,增加自动安装支付宝刷脸支付app,合并版本

由于使用了GreenDao,下载使用时需要build一下生成daomaster和daosession

Sunmi收银demo介绍

T1设备请参考开发者文档上T1目录下的内容,这里不做介绍

参考代码在s 和main目录下

使用支付宝刷脸支付时,需使用商米收银台实现刷脸功能,具体请联系商米客服。

功能介绍:

1. 双屏功能:

商米双屏设备分 15.6寸大屏和10寸小屏,其中15.6寸副屏支持触控。有且仅当副屏为Presentation显示时才能获取触控。

双屏使用的是Presentation类来实现双屏异显:

首先是权限

创建一个类继承 Presentation

public class TextDisplay extends Presentation

获得真实存在的副屏

public Display getPresentationDisplays() {
DisplayManager mDisplayManager = (DisplayManager) getSystemService(Context.DISPLAY_SERVICE);
displays = mDisplayManager.getDisplays();
for (int i = 0; i < displays.length; i++) {
Log.e(TAG, “屏幕” + displays[i]);
if ((displays[i].getFlags() & Display.FLAG_SECURE) != 0
&& (displays[i].getFlags() & Display.FLAG_SUPPORTS_PROTECTED_BUFFERS) != 0
&& (displays[i].getFlags() & Display.FLAG_PRESENTATION) != 0) {
Log.e(TAG, “第一个真实存在的副屏屏幕” + displays[i]);
return displays[i];
}
}
return null;
}

显示副屏

textDisplay = new TextDisplay(this, getPresentationDisplays());
textDisplay.show();

既可实现在副屏显示页面

2.打印服务

商米打印服务是使用AIDL自行研发

其中 k1系列的打印服务和台式的有些许不同,连接方式如下

自助系列

private void connectKPrintService() {
Intent intent = new Intent();
intent.setPackage(“com.sunmi.extprinterservice”);
intent.setAction(“com.sunmi.extprinterservice.PrinterService”);
bindService(intent, connService, Context.BIND_AUTO_CREATE);
}
private ServiceConnection connService = new ServiceConnection() {
@Override
public void onServiceDisconnected(ComponentName name) {
extPrinterService = null;
}
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
extPrinterService = ExtPrinterService.Stub.asInterface(service);
}
};

台式与手持系列:

在gradle中

dependencies {
implementation’com.sunmi:printerlibrary:1.0.5’
}

兼容以前的aidl方式

privateSunmiPrinterServicewoyouService=null;//商米标准打印打印服务
//连接打印服务
privatevoidconnectPrintService(){
try{
InnerPrinterManager.getInstance().bindService(this,
innerPrinterCallback);
}catch(InnerPrinterExceptione){
e.printStackTrace();
}
}
privateInnerPrinterCallbackinnerPrinterCallback=newInnerPrinterCallback(){
@Override
protectedvoidonConnected(SunmiPrinterServiceservice){
woyouService=service;
}
@Override
protectedvoidonDisconnected(){
woyouService=null;
}
};

3. 支付(支持 扫码支付,支付宝刷脸支付)

 推荐使用Sunmi收银台聚合支付。

详细使用方式和情况请联系商米技术支持秦昌盛
Phone: 18101767460 与业务支持赵琨 Phone:
18101811986

demo中只提供基础交易方式

初始化

PayMentPayPresenter payMentPayPresenter = new PayMentPayPresenter(mContext);

注册监听

payMentPayPresenter.init(callback);

开启刷脸支付

payMentPayPresenter.startFaceService(orderId, phoneNumber,money);

开启扫码支付

payMentPayPresenter.startPayCode(orderId, qrCode ,money);

关闭sunmi收银

payMentPayPresenter.destoryReceiver();

消息接收广播

public class ResultReceiver extends BroadcastReceiver {
private static final String TAG = “ResultReceiver”;
@Override
public void onReceive(Context context, Intent intent) {
if (“sunmi.payment.action.result”.equals(intent.getAction())) {
String responseStr = intent.getStringExtra(“response”);
Log.e(TAG, “response = “ + responseStr);
final PaymentResponse response = JSON.parseObject(responseStr, PaymentResponse.class);
if (“T00”.equals(response.resultCode)) {
aliResultCallback.onSuccess(response);
} else {
aliResultCallback.onFail(response);
}
}
}
private AliResultCallback aliResultCallback;
public void setResultCallback(AliResultCallback callback) {
this.aliResultCallback = callback;
}
public interface AliResultCallback {
void onSuccess(PaymentResponse response);
void onFail(PaymentResponse response);
}
}

支付宝刷脸支付QA

Q:使用源码编译的apk无法刷脸?
A:源码中的AlipaySmileModel文件中填入你在蚂蚁开放平台申请开通的参数之后,根据支付宝相关规定进行数据调整才可以直接使用支付宝刷脸功能

Q:如何使用支付宝刷脸支付功能?

A:您可以使用商米收银台调用刷脸功能。或直接在蚂蚁开放平台申请此功能,并且在商米开发者平台申请调用支付宝刷脸服务的权限。

Q:双屏机器如何使用刷脸支付?

A:直接使用商米收银台,收银台将同步支持最新版的支付宝刷脸功能。或者由第三方软件自主控制是否显示在副屏,需要调用zolozVerify方法时增加参数params.put("smile_mode", "1");

Q:调用刷脸报1070错误?

A:在设置-应用中找到simle软件,开启允许在其他应用上运行的权限。

4.电子秤

S2系列电子秤直接使用封装好的jar包 scale-service-lib.jar

//连接电子秤服务
private void connectScaleService() {
mScaleManager = ScaleManager.getInstance(this);
mScaleManager.connectService(new ScaleManager.ScaleServiceConnection() {
@Override
public void onServiceConnected() {
getScaleData();
}
@Override
public void onServiceDisconnect() {
}
});
}
//实时获取电子秤数据
private void getScaleData() {
try {
mScaleManager.getData(new ScaleCallback.Stub() {
@Override
public void getData(final int i, int i1, final int i2) throws RemoteException {
net = i;
// i = 净重量 单位 克 ,i1 = 皮重量 单位 克 ,i2 = 稳定状态 1 为稳定。具体其他状态请参考商米开发者文档
}
});
} catch (RemoteException e) {
e.printStackTrace();
}
}

5.扫码枪

扫码枪其实就是一个外接键盘,事件在dispatchKeyEvent中获取,二维码和条形码每一位都会触发一次该方法,有些扫码枪在输入完成后会主动多调用一次enter按键。

demo中提供一个简易的扫码监听方式:

private StringBuilder sb = new StringBuilder();
private Handler myHandler = new Handler();
@Override
public boolean dispatchKeyEvent(KeyEvent event) {
int action = event.getAction();
switch (action) {
case KeyEvent.ACTION_DOWN:
int unicodeChar = event.getUnicodeChar();
sb.append((char) unicodeChar);
Log.e(TAG, “扫码===“ + event.getKeyCode() + “ “ + sb.toString());
if (event.getKeyCode() == KeyEvent.KEYCODE_VOLUME_UP) {
return super.dispatchKeyEvent(event);
}
if (event.getKeyCode() == KeyEvent.KEYCODE_VOLUME_DOWN) {
return super.dispatchKeyEvent(event);
}
if (event.getKeyCode() == KeyEvent.KEYCODE_BACK) {
return super.dispatchKeyEvent(event);
}
if (event.getKeyCode() == KeyEvent.KEYCODE_MENU) {
return super.dispatchKeyEvent(event);
}
if (event.getKeyCode() == KeyEvent.KEYCODE_HOME) {
return super.dispatchKeyEvent(event);
}
if (event.getKeyCode() == KeyEvent.KEYCODE_POWER) {
return super.dispatchKeyEvent(event);
}
final int len = sb.length();
myHandler.postDelayed(new Runnable() {
@Override
public void run() {
if (len != sb.length()) return;
Log.e(TAG, “isQRcode”);
if (sb.length() › 0) {
//Do something
sb.setLength(0);
}
}
}, 200);
return true;
default:
break;
}
return super.dispatchKeyEvent(event);
}

扫码底座

扫码底座

功能介绍

  1. USB接口扩展
  2. 充电
  3. 扫码

使用demo下载

扫码头引擎(红外线扫码)

扫码头引擎(红外扫码)

软件编程请参考:   用户指南

1.      可识别的码

不同的扫码头支持的码类型不同

新大陆二维扫码头支持的码类型:

code128,uccean128,ean8,ean13,upce,upca,itf,matrix,code39,codabar,code93,isbn,

industrial25,standard25,Plessey,code11,msiplessey,pdf417,qr,datamatrix,hanxin

斑马二维扫码头支持的码类型:

auspostal,Aztec,chinese25,codabar,code11,code128,code39,code93, itf, pdf417,

compositeab,composite,uccean128,ean8,ean13,issnean,isbn,upca,upce,upce1,

matrix,discrete25,msiplessey,gs1databar, qr,datamatrix,hanxin,maxi, isbt128,korea35,uspostnet,usplanet,ukpostal,japanpostal

新大陆/鹰捷支持的码类型:

ISSN EAN,MIS-Plessey,Standard 2 of 5,Industrial 2 of 5,ISBN,Code 11,Code 93,Codabar,Code 39,Matrix 2 of 5,Interleaved 2 of 5(ITF),UPC-A,UPC-E,EAN13,EAN8,UCC-EAN128,Code128

选择可识别的码:

用户可在设置界面中选择开启或关闭制定识别码,默认开启全部识别码。

        

2.      编码方式

用户可在设置中进行输出编码的设置

默认utf8

可选UTF-8,GBK,ISO-8859-1,SHITF-JIS

3.      提示方式

用户可在设置中进行提示方式设置

默认打开声音提示和震动提示

4.      输出方式

用户可在设置中进行扫码结果的输出方式设置

默认选中模拟键盘方式输出,默认自动补回车

默认开启广播输出

5.      触发模式

用户可在设置中选择触发模式

默认短按触发扫码,扫码成功后扫码头自动熄灭

新大陆扫码头和斑马扫码头在短按触发,连续扫码选项表现的现象不同

当机器为新大陆扫码头,并且选中了短按触发,连续扫码后,扫码头会自动进入连续扫码模式,扫码头会常亮一段时间后熄灭,然后又重新亮起开始扫描,如此循环

当机器为斑马扫码头,并且选中了短按触发,连续扫码后,机器会自动进入连续扫码模式,扫码头会常亮,除非再次按下扫码键,否则扫码头灯光不会熄灭,且相同的码只会输出一次。

—————————————————————————————————————-

6.     Q&A

常见问题:

1,问:如何对接扫码头

答:为了方便开发者,商米把扫码头做成了一个免开发的设备。一般用户无需针对扫码头做开发即可获取扫码内容

2,问:如何获取扫码结果

答:商米提供了3中数据输出方式,

1),模拟键盘:会把扫码结果模拟成按键事件,会自动输出到焦点框文本,用户可以通过获取焦点框内容或者监听按键事件来获取扫码结果;2),直接填充:会把扫码结果拷贝到粘贴版,会自动输出到焦点框文本,相比较与模拟键盘输出方式,直接填充的输出速度更快;3),广播输出:会把扫码结果作为广播发送,用户可以监听广播来获取扫码结果。

3,问:连续扫码结果不一致

答:输入法会影响扫码输入结果,已知百度小米版输入法会影响扫码结果输出,可更换谷歌拼音输入法。

4,问:扫码结果比较慢

答:如果选择了模拟按键输出模式,按键间隔时间会影响输出速度,设置为0为最快速度。(默认0)

5,问:需要兼容摄像头扫码和扫码头扫码

答:L2斑马扫码头与摄像头不可同时开启,用户可以判断机型来区分商米设备和其他设备,在商米设备上使用侧键扫码

6,问:软件触发扫码

答:可参考L2用户指南 中的aidl接口,扫码服务提供了软触发的接口。

7,问:扫描中文二维码出现乱码

答:解析带中文的二维码需要把 输出编码 匹配 二维码中中文的编码格式,比如二维码的中文“你好”的编号格式为UTF-8,扫码头输出编码也需要设置UTF-8才能正确输出“你好”,否则将会输出乱码。

外接USB串口设备

USB、串口设备使用说明文档

1. 简介:

外设接口 LAN 口,钱箱口, usb2.0 口,串口,耳机孔等通用通信接口。
本文主要介绍钱箱口,usb 口和串口的使用方式。

2.接口说明

1)钱箱口:钱箱口使用RJ12接口。 开发者可以通过向钱箱口发送数据来控制钱箱。
钱箱开发者文档及资源文件
2)串口: 串口使用 RJ11 接口。 开发者可以通过串口的数据发送来控制外设。 商米设备的RJ11为四线,不支持硬流控(部分外设默认开启硬件流控,这些设备无法通过RJ11连接商米主机)。
由于安全考虑,不支持串口节点遍历,但可以直接打开端口进行通信 (
T1,T1mini:机器底座串口的节点路径/dev/ttyHSL1,
T2,S2,T2lite,X2,T2mini:/dev/ttyHSL3,
N1、D2、D1s单屏:/dev/ttyS1,
N1、D2、D1s双屏:/dev/ttyS3) 
串口参考demo ,JNI参考
16001521077720_
通信文档事例:Jaynes 串口电子秤通信文档(不同电子秤通信协议需参考每家厂商提供的 文档)
3) USB 口: 支持 USB2.0 协议的 USB 设备。
USB 通信开发者文档   

SunmiOS支持的USB转串口芯片列表

目前支持的USB转串口芯片有:CH341、FT系列、PL2303、CP210X系列

插入USB转串口线或者板子会生成:/dev/ttyUSERx节点,其中x:表示序号0,1,2,3…..

使用USB转串口时请勿使用USB调试线,二者互斥,只能同时使用一个功能 
3.1 获取 USB 设备的 PID/VID:
方法1:java代码
try { //获得外接USB输入设备的信息 Process p=Runtime.getRuntime().exec(“cat /proc/bus/input/devices”); BufferedReader in = new BufferedReader(new InputStreamReader(p.getInputStream())); String line = null; while((line = in.readLine())!= null){ } String deviceInfo = line.trim(); //对获取的每行的设备信息进行过滤,获得自己想要的。 } catch (Exception e) { // TODO: handle exception e.printStackTrace(); } *deviceinfo中包含每个设备的pid和vid*
方法2:adb命令
 adb shell cat /proc/bus/input/devices 
3.2 通用 USB 外设HID设备默认支持 HID 协议设备(鼠标键盘扫码枪等),可即插即用。 
HID 扫码枪
HID扫码枪可即插即用:连接商米设备,在商米设备上打开一个可编辑框并获取焦点,扫码。此时编辑框应该被输入条码或者二维码内容。
从代码获取扫码内容可参考USB 外设通信谷歌开发者文档
U盘
支持的U盘格式: FAT32:可读可写;NTFS:可读不可写 ;exFAT:不支持
摄像头
商米支持 USB UVC 摄像头 (如LogitechC170,C100,C525)

Demo

源码
商米读写器侧边栏可接入商米读卡器(刷卡槽接口)
商米读卡器包含两部分,一部分为磁条卡刷卡,磁条卡刷卡可参考商米读卡器开发包和读卡器demo。另一部分为nfc,nfc为android原生接口,可参考android nfc开发文档
商米读卡器开发包
商米读卡器demo
商米读卡器demo源码
第三方通用读写器商米目前已经支持四款第三方usb通用读写器,开发者可参考商米提供的demo做读卡写卡操作。上海亿矽智能科技有限公司UM002读卡器深圳市德卡科技有限公司T10读写器(需支持android版本,电源充电版)香港龙杰智能卡有限公司ACR1281U-C1读写器香港龙杰智能卡有限公司ACR1281U-K1读写器

开发文档2.0

通用读写器demo

通用读写器demo源码

打印和客显

打印机和LCD客显文档

1.内置/一体机打印开发文档

打印简介

连接方式:蓝牙(蓝牙设备名:InnerPrinter),AIDL、JS桥。第三方APP可以通过连接内置打印机进行打印业务。商米打印机包含的功能:58和80mm两种打印规格的热敏打印机,切刀(部分机器),钱箱(部分机器),客显(部分机器)

商米的打印功能接口基本都是复用的,根据机型不同会略有区别文档适用的机型:V系列(V1),P系列(P1,P1-4G等),V1S系列,T系列(T1,T2等),S系列(S2等),Mini系列(T1mini等)。

    • 开发

打印机兼容ESC&POS指令,但与标准ESC&POS指令有略微区别。开发者可以参考内置打印机开发文档来了解打印机的工作模式和接口调用方式,通过指令文档了解商米支持的escpos指令集 内置打印机开发文档 | ESCPOS指令文档

如果需要对不同机型的打印功能做兼容,我们提供了一种远程导入的方案,用户无需在项目中放入AIDL资源,仅需在gradle中增加依赖即可在不同机型上使用同样的代码实现打印。具体细节可参考打印服务兼容方案说明文档

    • *android

商米提供打印demo和源码,支持常用打印功能,如:打印二维码,打印条码,打印图片,打印各国语言的文字,打印表格等。demo支持蓝牙和aidl两种连接方式。开发者在开发打印功能时需要对不同的商米设备适配不同的AIDL文件。AIDL下载        PS:demo仅支持商米内置打印机,外部蓝牙串口网络USB打印机不适用此demo,自助机打印方式请参考本文下方《自助机打印文档》内置打印demo: 打印Demo 源码

    • *网页/JS

商米提供一个简易版的通过JS的方式调用打印机的demo,开发者可参考demo来通过网络调用打印机。JS打印demo: eclipse Demo  |  Android Studio Demo如果用户需要把网页端的内容通过商米打印机打印出来,除了通过js的方式,还可以通过android原生打印功能实现,商米提供了一个打印插件支持。用户可以通过商米应用市场搜索Sunmiprinterplugin,下载并安装后,即可通过浏览器的打印功能来打印网页内容。

    • *其他工具

从应用市场下载随印,可支持屏幕截图打印和相机拍摄打印,有黑白和抖动灰度两种打印方式可选(现已支持V1设备)。

  • 自助机打印文档

自助机打印文档适用于SunmiK1

自助机打印开发文档|自助机打印AIDL文档资源

2.外配打印机开发文档

目前支持打印机:NT210 usb打印机

外配打印机开发文档

3.客显

客显sunmiT1mini有顾客显示器,开发者可以参考客显开发文档来使用客显。

客显开发文档 | 客显DEMO

摄像头扫码

扫码

针对商米设备,商米提供了扫码组件和SO库,能够更快的识别二维码和条形码。

目前支持的扫码类型包括如下:

1. 一维码:EAN-8, EAN-13, UPC-A, UPC-E, Codabar, Code39, Code93, Code128, ISBN10, ISBN13, DataBar, DataBar Expanded, Interleaved 2 of 5

2. 二维码:QR Code , PDF417

商米的扫码组件和so库仅支持在商米设备上使用。

T1mini/T2mini摄像头的调用方式:用户可直接使用android提供的摄像头调用api对摄像头进行操作。

T1mini/T2mini摄像头(如果用户把手持机器的扫码功能移植到T1mini/T2mini上,需要调整分辨率和显示界面的大小)

横屏demo    竖屏demo

商米提供了一个简单的demo来演示如何在chrome中打开摄像头

网页调用摄像头demo

电子秤

电子秤

主机型 S2
量程 15Kg
分度数(精度等级) 3000(C3)
检定分度值 e=d=2/5g
蠕变(%FS/30min) ±0.0167
安全过载(%FS) 150
破坏过载(%FS) 300
工作温度(℃) 0-40℃
电子水平校准 支持
精度 <6Kg 精度0.002Kg;6Kg到15Kg精度 0.005Kg

电子秤使用指南

Sunmi收银demo来展示如何使用副屏,扫码,打印,电子秤,人脸支付等功能