背景: 由于各种厂商不同,有些厂商写卡有一下其他不支持的地方。所以由客户端读取扇区。网上参数很不详细,这边的经验希望能帮到大家。
- 前端-安卓读取
- 前端-sdk(我这边对接的是feishu,应该类似于小程序) 资料好难找,看网上只有部分小程序的,基本上都不符合。下面是我们这边已经实现的。注释里有代码说明
安卓读取扇区
这个对于前端来说就是纯方法的调用 直接上代码
//sassApp 代码基于vueconnectWebViewJavascriptBridge(callback) {if (window.WebViewJavascriptBridge) { return callback(WebViewJavascriptBridge); }if (window.WVJBCallbacks) { return window.WVJBCallbacks.push(callback); }window.WVJBCallbacks = [callback];var WVJBIframe = document.createElement('iframe');WVJBIframe.style.display = 'none';WVJBIframe.src = 'https://__bridge_loaded__';document.documentElement.appendChild(WVJBIframe);setTimeout(function () { document.documentElement.removeChild(WVJBIframe) }, 0)},connectWebViewJavascriptBridgeNfc() {let that = this// 方法由按照提供that.connectWebViewJavascriptBridge((bridge) => {bridge.callHandler('triggerNewlandCard', (responseData) => {});bridge.registerHandler("receiveNFC", function (data, responseCallback) {console.log("安卓读取扇区返回的data", data)}}}
前端-SDK
let adapter = window.htonejssdk.nfc.getNFCAdapter();
adapter.startDiscovery({success(res) {adapter.onDiscovered((res => {// 获取卡号uidsconst uidList = Array.from(new Uint8Array(res.uid));let mifareClassic = adapter.getMifareClassic()mifareClassic.connect({success(res2) {console.log('mifareClassic.transceive connect', res2)// 0x60-认证指令 0x03-扇区 uidList-卡ids 0xff x 6-秘钥mifareClassic.transceive({data: new Uint8Array([0x60, 0x03, ...uidList, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff]).buffer,success(res3) {// 0x30-读取指令 0x30-扇区(这里需要和认证扇区保持一致,不然会报错)mifareClassic.transceive({data: new Uint8Array([0x30, 0x03]).buffer,success(res4) {let cardInfo = Array.from(new Uint8Array(res4.data));// 获取到卡的Array信息-转16进制(补0)---- 其他约定处理},fail(err4) {console.log(`mifareClassic.transceive fail 0x30: ${JSON.stringify(err4)}`)}})},fail(err3) {console.log(`mifareClassic.transceive fail 0x60: ${JSON.stringify(err3)}`)}})},fail(err) {console.log(`mifareClassic.connect fail: ${JSON.stringify(res)}`)}})))}
})