小程序官方文档
developers.weixin.qq.com/miniprogram…
基本流程
以往NFC-A卡片写入apdu指令为例
- 调用wx.getNFCAdapter()获取NFC适配器实例
- 调用NFCAdapter.onDiscovered(function callback)注册贴卡监听回调
- 调用NFCAdapter.startDiscovery(Object object)开始监听贴卡
- 贴卡,onDiscovered回调
- 根据onDiscovered回调res对象的techs字段匹配到卡片支持NFC-A标准
- 通过NFCAdapter.getNfcA()获取NfcA实例
- 使用NfcA实例进行读写
- 调用NfcA.connect()和NFC卡片建立连接
- 调用NfcA.transceive(Object object)往NFC卡片写入apdu指令并接收卡片返回数据
- 读写完毕,调用NfcA.close()断开连接
- 调用NFCAdapter.stopDiscovery(Object object)结束监听贴卡
apdu指令大全
好像是不久之前才有的新特性 ,官方demo跑不通,网上没源码 ,自己整理了能跑通的 但是获取到的是个arraybuffer ,不知道怎么解读 ,下面是源码
//文档地址
//https://developers.weixin.qq.com/miniprogram/dev/framework/device/nfc.html
//代码:
//#ifdef MP-WEIXIN
NFCReadCard: function() {
let _this = this
let adapter = wx.getNFCAdapter()
console.log(adapter)
adapter.startDiscovery({
success: (e) => {
console.log('开始贴卡了', e)
adapter.onDiscovered(function(res) {
console.log('读到卡片了', res);
//console.log(res.techs);
//首先将字符串转为16进制 这里发送APDU指令
// let str = 'GET CHALLENGE'
// let val = ""
// for (let i = 0; i < str.length; i++) {
// if (val === '') {
// val = str.charCodeAt(i).toString(16)
// } else {
// val += ',' + str.charCodeAt(i).toString(16)
// }
// }
// //将16进制转化为ArrayBuffer
// let arrbuf = new Uint8Array(val.match(/[\da-f]{2}/gi).map(function (h) {
// return parseInt(h, 16)
// })).buffer;
let arrbuf = _this.strToArrayBuffer('GET DATA') //字符串转ArrayBuffer 发送IC卡adpu指令 详情百度IC卡adpu
//let arrbuf = res.id
if (res.techs.includes(adapter.tech.nfcA)) {
console.log('发现' + adapter.tech.nfcA + '卡');
let nfcA = adapter.getNfcA();
//app.nfcA = nfcA;
nfcA.connect({
success: function(resA) {
console.log('设备已连接A', resA)
nfcA.transceive({
data: arrbuf,
success: function(resAA) {
console.log('发送数据成功A, 接收数据如下:', resAA);
console.log(_this.arrayBuffertoStr(resAA.data))
debugger
},
fail: function(errAA) {
console.log('发送数据失败A', errAA);
}
})
},
fail: function(errA) {
console.log('设备联接错误A', errA);
}
});
}
})
}
})
},
//#endif