我的小程序目标是通过NFC功能,读写NFC卡,在注册回调函数后,无法被回调,现象是贴卡后,系统会弹出选择使用NFC的应用的对话框,若选择微信,则会跳转到微信公交卡页面,提示“卡片类型不符”,图片如下:
我的“读NFC卡”方法代码如下:
NFCReadCard: function(){
let _this = this
let adapter = wx.getNFCAdapter()
console.log(adapter)
adapter.onDiscovered(function (res){
console.log('读到卡片了', res);
//console.log(res.techs);
if(res.techs.includes(adapter.tech.nfcA)){
console.log('发现'+adapter.tech.nfcA+'卡');
let nfcA = adapter.getNfcA();
app.nfcA = nfcA;
nfcA.connect({
success: function(res){
console.log('设备已连接', res)
nfcA.transceive({
data:new ArrayBuffer(0),
success: function(res){
console.log('发送数据成功, 接收数据如下:', res);
},
fail: function(err){
console.log('发送数据失败', err);
}
})
},
fail: function(err){
console.log('设备联接错误', err);
}
});
}
})
}
你好,要注册监听需要先调startDiscovery
https://developers.weixin.qq.com/miniprogram/dev/api/device/nfc/NFCAdapter.startDiscovery.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
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); if(res.techs.includes(adapter.tech.nfcA)){ console.log('发现'+adapter.tech.nfcA+'卡'); let nfcA = adapter.getNfcA(); app.nfcA = nfcA; nfcA.connect({ success: function(res){ console.log('设备已连接', res) nfcA.transceive({ data:new ArrayBuffer(0), success: function(res){ console.log('发送数据成功, 接收数据如下:', res); }, fail: function(err){ console.log('发送数据失败', err); } }) }, fail: function(err){ console.log('设备联接错误', err); } }); } }) }}) }
能不能问一下小米手机的连读问题,(miui12.0.6及12.0.8)小程序读完之后,要是NFC卡一直贴着手机就会一直连读(是手机自带的读NFC连读)一直跳这个如图的页面,不打开小程序的话不会这样,是贴一下读一下。代码是参考的回答里边的代码。
银行卡能失败,身份证没反应
<view class="intro" bindtap="onNfc">欢迎使用代码片段,可在控制台查看代码片段的说明和文档</view> const app = getApp() Page({ nfc: null, onLoad: function () { }, onHide() { if (this.nfc) { this.nfc.stopDiscovery() } }, onNfc(){ console.log('我点击了') // let nfc; // if(!this.nfc){ // nfc = wx.getNFCAdapter() // this.nfc = nfc; // } // function discoverHandler(res) { // console.log('discoverHandler',res) // if (res.techs.includes(nfc.tech.ndef)) { // console.log(res.messages) // const ndef = nfc.getNdef() // ndef.writeNdefMessage({ // uris: [''], // complete(res) { // console.log('res:', res) // } // }) // return // } // if (res.techs.includes(nfc.tech.nfcA)) { // const nfcA = nfc.getNFCA() // nfcA.transceive({ // data: new ArrayBuffer(0), // complete(res) { // console.log('res:', res) // } // }) // return // } // } // nfc.onDiscovered(discoverHandler) // nfc.startDiscovery({ // success(res){ // console.log('discover:', res) // }, // fail(err) { // console.log('failed to discover:', err) // } // }) let _this = this let adapter ; if (!this.adapter) { adapter = wx.getNFCAdapter() } adapter.startDiscovery({success:(e)=>{ console.log('开始监听贴卡',e) adapter.onDiscovered(function (res){ console.log('读到卡片了', res); console.log(res.techs); if(res.techs.includes(adapter.tech.nfcA)){ console.log('发现'+adapter.tech.nfcA+'卡'); let nfcA = adapter.getNfcA(); app.nfcA = nfcA; nfcA.connect({ success: function(res){ console.log('设备已连接', res) nfcA.transceive({ data:new ArrayBuffer(0), success: function(res){ console.log('发送数据成功, 接收数据如下:', res); }, fail: function(err){ console.log('发送数据失败', err); } }) }, fail: function(err){ console.log('设备联接错误', err); } }); } }) }}) } })
同问,读取不到信息
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);
if(res.techs.includes(adapter.tech.nfcA)){
console.log('发现'+adapter.tech.nfcA+'卡');
let nfcA = adapter.getNfcA();
app.nfcA = nfcA;
nfcA.connect({
success: function(res){
console.log('设备已连接', res)
nfcA.transceive({
data:new ArrayBuffer(0),
success: function(res){
console.log('发送数据成功, 接收数据如下:', res);
},
fail: function(err){
console.log('发送数据失败', err);
}
})
},
fail: function(err){
console.log('设备联接错误', err);
}
});
}
})
}})
}