bin/mfreadersdk.jar 接口库文件
api.chm sdk接口手册
MPOS安卓SDK接口说明V1.0.1_新版.pdf 开发接口说明文档
ReaderDemo1 Demo工程, Android Studio版本
Android Studio
将bin/androidstudio/目录中的所有文件拷贝至工程目录下,覆盖合并原有libs,src两个目录
Eclipse
将bin/eclipse/目录中的所有文件拷贝至工程目录下,覆盖合并原有libs目录
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
初始化,在Activity上使用Controler.Init初始化
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Controler.Init(this, CONNECTMODE.BLUETOOTH ,0);
}
@Override
protected void onDestroy() {
Controler.Destory();
super.onDestroy();
}
初始化完成后,启动一个辅助线程,执行连接设备,刷卡,等阻塞式操作
new Thread(new Runnable() {
@Override
public void run() {
//音频设备传""
//蓝牙设备传mac地址
//可以通过BluetoothAdapter.getDefaultAdapter().getBondedDevices();获得
Controler.connectPos("8C:DE:52:9B:F5:97");
if( Controler.posConnected() ) {
...
//执行MPOS读卡流程
ReadCardResult ret = Controler.ReadCard(param);
...
}
Controler.disconnectPos();
}
}).start();
连接成功之后,可以调用ReadCard执行标准流程,示例代码如下:
ReadCardParam param = new ReadCardParam();
//设置金额 单位分
param.setAmount(100);
//设置交易类型
param.setTransType( TRANSTYPE.FUNC_SALE);
//执行MPOS读卡流程
ReadCardResult ret = Controler.ReadCard(param);
//操作结果
StringBuilder sb = new StringBuilder();
sb.append( "通讯结果:" + ret.commResult.toDisplayName() + "\n" );
sb.append( "用卡类型:" + ret.getCartTypeName() + "\n" );
sb.append( "是否FallBack:" + (ret.fallback ? "是":"否") + "\n" );
sb.append( "主账号:" + ret.pan + "\n" );
sb.append( "卡有效期:" + ret.expData + "\n" );
sb.append( "服务代码:" + ret.serviceCode + "\n" );
sb.append( "二磁道长度:" + ret.track2Len + "\n" );
sb.append( "磁道二信息:" + ret.track2 + "\n" );
sb.append( "三磁道长度:" + ret.track3Len + "\n" );
sb.append( "磁道三信息:" + ret.track3 + "\n" );
sb.append( "数据随机数:" + ret.randomdata + "\n" );
sb.append( "卡片序列号:" + ret.pansn + "\n" );
sb.append( "IC卡数据:" + ret.icData + "\n" );
sb.append( "PIN长度:" + ret.pinLen + "\n" );
sb.append( "PIN密文:" + ret.pinblock + "\n" );
如需要取消操作,调用调用`Controler.CancelComm():
@Override
public void onBackPressed() {
Controler.CancelComm();
}
关于 Init() Destroy() connectPos() disconnectPos() 使用说明
Init Destroy 应用活动期内只需要执行一次就够了,需要确保在主线程上调用
通常app的 第一个Activity 中onCreate中调用Init,onDestroy中调用Destroy
connectPos disconnectPos可多次调用
通常交易开始前connectPos,交易完成后disconnectPos
应用退出时,务必要调用一下Destroy,确保资源释放,以免下次启动应用出错
接口中 ResetPos(), CancelComm() disconnectPos()的区别?
disconnectPos() 断开与刷卡器连接
ResetPos() 复位刷卡器,让刷卡器处于可接受命令的状态
CancelComm() 退出阻塞的接口,app端直接不等待退出,刷卡还是处在操作状态
建议用法:
连接成功后 准备交易前执行一下Controler.ResetPos()
交易完成后 不再与刷卡器通讯时,执行Controler.disconnectPos()
刷卡器处在处理命令状态,app端需要强制退出操作时执行CancelComm()
通常情况下次做交易前需要执行一次Controler.ResetPos(),确保终端处在可接受命令的状态
接口中 Calpin() InputPin()的区别?
Calpin(); 将App端输入的PIN明文,送到终端加密,获取PIN密文
InputPin(); 用户直接在刷卡器(如M60B)终端上输入密码,获取PIN密文
这两个函数需要在签到时将工作密钥下载到终端,否则需要App来处理密码相关操作
DEMO读取不到IC卡的信息,IC卡卡号读取流程,EMV都读取不到数据?
没有下载IC卡参数,无法正常读取IC卡
IC公钥下载(CAPK),IC参数下载(AID)都执行后,再使用银行卡进行测试
读设备信息中的电池状态返回值是什么意思?
0 没电关机
1 电量低(电量紧张)
2 电量中(正常)
3 电量高(电量充足)
4 电量满
5 正在充电状态
长时间操作函数(如ReadCard)的处理方式?
SDK函数都是阻塞式线程的,建议在非UI线程中调用
调用处理函数OpenCardReader后,等待正确刷卡后返回,否则超时后返回
刷卡时,刷卡器会亮红灯,正确刷卡后会变为绿灯
如果需要强制退出,可在另一个线程(通常是UI线程)上执行一下CancelComm()
SDK中的函数哪些是直接返回,可以在UI线程上调用的?
Init //sdk初始化
Destory //sdk资源清理
SDKVer //获取sdk版本号
CancelComm //取消等待操作
GetMode //获取连接模式
工作密钥下载组包方式 LoadWorkKey
byte[] data 共60 字节:
KVC 为对应密钥明文对16个0x00加密的结果 前4个字节
签到返回的:
1.40个字节 WORKKEYTYPE.DOUBLE
PinKey(16) + PKVC(4) + MacKey(16) + MKVC(4)
2.60个字节 WORKKEYTYPE.DOUBLEMAG
PinKey(16) + PKVC(4) + MacKey(16) + MKVC(4) + TraceKey(16) + TKVC(4)
其他情况:
情况1: PinKey(16) MacKey(8) TraceKey(16)
PinKey(16) + PKVC(4) + MacKey(8) + MacKey(8) + MKVC(4) + TraceKey(16) + TKVC(4)
情况2: PinKey(16) MacKey(8) TraceKey(无)
PinKey(16) + PKVC(4) + MacKey(8) + MacKey(8) + MKVC(4) + PinKey(16) + PKVC(4)
情况3: PinKey(16) MacKey(无) TraceKey(无)
PinKey(16) + PKVC(4) + PinKey(16) + PKVC(4) + PinKey(16) + PKVC(4)