1. 微信小程序NFC开发基础
最近在开发智能门禁系统时,我发现很多开发者对微信小程序的NFC功能使用存在不少困惑。特别是针对MifareClassic M1卡的操作,网上资料比较零散。今天我就把自己在实际项目中积累的经验完整分享出来,手把手带你搞定M1卡的认证与数据读写。
微信小程序的NFC API其实封装得相当友好,但有几个关键点需要注意:首先,你的手机必须支持NFC功能;其次,系统NFC开关需要打开;最后,小程序必须获得用户授权才能使用NFC。我在第一次开发时就因为没注意这些基础条件,调试了半天才发现是手机NFC没开启。
MifareClassic M1卡是市面上最常见的IC卡之一,广泛用于门禁、公交卡等场景。它的存储结构就像一栋16层的公寓楼,每层有4个房间(块),每个房间能存放16字节数据。特别要注意的是每层的最后一个房间(块3)存放着重要的钥匙和门禁规则 - 这就是我们后面要重点操作的密钥块。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. M1卡存储结构详解
2.1 扇区与块的组织方式
M1卡的存储结构可以用"小区-楼栋-房间"来形象理解。整个小区有16栋楼(扇区),每栋楼有4个房间(块),每个房间能放16个字节的数据。其中:
- 块0-2:普通住户房间,存放用户数据
- 块3:物业办公室,存放两把钥匙(Key A和Key B)和门禁规则(访问控制位)
实际开发中,我们最常操作的是块0-2的用户数据区。比如在会员卡系统中,块0可以存会员ID,块1存积分,块2存有效期。但要注意,每个扇区的块3是特殊的,它决定了这个扇区的安全规则。
2.2 访问控制位的安全机制
块3的6-9字节存放的访问控制位就像小区的门禁规则,决定了:
- 哪些钥匙能开哪些门(Key A/B的权限)
- 能不能修改门禁规则本身
- 数据块是可读可写还是只读
举个例子,如果控制位设置成Key A只能读不能写,那么即使用户知道Key A,也无法修改数据。我在开发门禁系统时就遇到过,客户提供的测试卡控制位设置得非常严格,导致写入总是失败,后来才发现需要同时提供Key A和Key B才能完成完整操作。
3. 小程序NFC环境搭建
3.1 初始化NFC适配器
在微信小程序中使用NFC功能,首先要初始化适配器。这里有个坑要注意:必须确保用户已经授权NFC权限,否则会静默失败。我建议在onLoad生命周期里就初始化:
javascript复制let adapter = null;
Page({
onLoad() {
// 检查NFC支持情况
if (!wx.getNFCAdapter) {
this.showToast('当前版本不支持NFC功能');
return;
}
adapter = wx.getNFCAdapter();
this.startDiscovery();
},
startDiscovery() {
adapter.startDiscovery({
success: () => {
console.log('NFC适配器启动成功');
this.registerEvents();
},
fail: (err) => {
let msg = 'NFC启动失败
