Sunmi收银demo

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

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

SunmiHotel下载

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);
}