收藏
回答

NFCAdapter.onDiscovered无法获取NFC数据,被系统拦截,应如何设置?

我的小程序目标是通过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);

          }

        });

      }

    })

  }


回答关注问题邀请回答
收藏

6 个回答

  • 社区技术运营专员--许涛
    社区技术运营专员--许涛
    2020-12-22

    你好,要注册监听需要先调startDiscovery

    https://developers.weixin.qq.com/miniprogram/dev/api/device/nfc/NFCAdapter.startDiscovery.html


    2020-12-22
    有用
    回复 3
    • Sensi
      Sensi
      2022-01-04
      注册监听已调startDiscovery,但是调起微信支付时,还是会被系统拦截
      2022-01-04
      回复
    • 路在远方。
      路在远方。
      2023-04-18
      你好,根据楼下的方法,我这边最后返回的是13011该怎么解决
      2023-04-18
      回复
    • [社会社会]
      [社会社会]
      02-20回复路在远方。
      你好,我也是报13011,你是怎么解决的
      02-20
      回复
  • .云天明
    .云天明
    2021-01-30
    //#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
    
    2021-01-30
    有用 2
    回复 1
    • 王子成.
      王子成.
      2021-02-02
      您好, adpu指令 还是报错 13017是怎么回事
      2021-02-02
      回复
  • 吃菜花的猪
    吃菜花的猪
    2020-12-23
      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({
                successfunction(res){
                  console.log('设备已连接', res)
                  nfcA.transceive({
                    data:new ArrayBuffer(0),
                    successfunction(res){
                      console.log('发送数据成功, 接收数据如下:', res);
                    },
                    failfunction(err){
                      console.log('发送数据失败', err);
                    }
                  })
                },
                failfunction(err){
                  console.log('设备联接错误', err);
                }
              });
            }
          })
        }})
      }
    
    
    2020-12-23
    有用 1
    回复 3
    • Darryl
      Darryl
      2021-03-17
      你这读取的是A卡吧,如果我要读取身份证是B卡吧,是不是将nfcA换成nfcB呢?
      2021-03-17
      2
      回复
    • Darryl
      Darryl
      2021-03-18
      我想知道安卓手机NFC到底能不能读取二代身份证信息?
      2021-03-18
      回复
    • 路在远方。
      路在远方。
      2023-04-18
      data:new ArrayBuffer(0)这里面的0是由什么控制的,按照你的写法到最后报错13011
      2023-04-18
      回复
  • DDDDDD
    DDDDDD
    2021-04-23

    能不能问一下小米手机的连读问题,(miui12.0.6及12.0.8)小程序读完之后,要是NFC卡一直贴着手机就会一直连读(是手机自带的读NFC连读)一直跳这个如图的页面,不打开小程序的话不会这样,是贴一下读一下。代码是参考的回答里边的代码。

    2021-04-23
    有用
    回复 2
    • 噔噔』
      噔噔』
      2023-05-19
      请问这个问题解决了吗?
      2023-05-19
      回复
    • 数学课代表
      数学课代表
      08-21回复噔噔』
      定义一个开关
      08-21
      回复
  • 徐海兵
    徐海兵
    2021-04-08

    银行卡能失败,身份证没反应

    <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);
                }
              });
            }
          })
        }})
      }
    })
    
    
    
    2021-04-08
    有用
    回复
  • 0.0
    0.0
    2020-12-23

    同问,读取不到信息

    2020-12-23
    有用
    回复 18
    • 吃菜花的猪
      吃菜花的猪
      2020-12-23
      你好,我按照楼上运营专员的方法,试了一下,可以与卡片通讯了,你可以试一下。
      2020-12-23
      回复
    • 0.0
      0.0
      2020-12-23回复吃菜花的猪
      你好,请问有读成功吗?我报的是{errMsg: transceive:fail:system internal error, errCode: 13017}
      2020-12-23
      1
      回复
    • 吃菜花的猪
      吃菜花的猪
      发表于移动端
      2020-12-23回复0.0
      我读成功了
      2020-12-23
      回复
    • 0.0
      0.0
      2020-12-23回复吃菜花的猪
      同学,可以分享下代码链接吗?我被这个卡两天了
      2020-12-23
      回复
    • 吃菜花的猪
      吃菜花的猪
      2020-12-23回复0.0
      2020-12-23
      2
      回复
    查看更多(13)
登录 后发表内容
问题标签