因工作需要,需要实现通过NFC标签拉起微信小程序,小程序文档:https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/NFC.html
1、 申请【NFC调起小程序】能力
1.1 在小程序后台 【行为能力->硬件设备】 添加设备;
注:添加设备时需要填写的品牌名称、生产厂商我填的是小程序基本信息中所归属的公司(我填其他的会审核不通过);
1.2 审核通过后给设备申请设备能力;
注:一机一码model_id能使用多次,一型一码model_id只能使用一次;
2、 申请 URL Schem;
2.1 把申请到的schema url写入NFC标签中;
注:网上有一些能直接识别NFC标签并写入schema url的小程序可直接使用;由于我的需求是打开小程序并能区分每个NFC标签,因此我使用的是一机一码,并自己实现写入schema url的功能;
3、实现写入schema url功能;
3.1 获取NFC实例并监听 Tag;
this.nfc = wx.getNFCAdapter()
this.listener = (res)=> {
const id = new Uint8Array(res.id)
this.connectNfc(res)
this.nfc.onDiscovered(this.listener)
this.nfc.startDiscovery({
fail(err) {
console.log('failed to discover:', err)
connectNfc(res){
const NFCTab = this.nfc.getNdef()
NFCTab.connect({
success: () => {
fail: error => {
wx.showToast({
title: '连接设备失败',
icon: 'error'
console.log("nfc-getNdef-error:",error)
3.1 生成schema url并写入NFC标签;
async getPayloadUrl(){
if(!this.data.nfcId){
return wx.showToast({
title: '请把NFC标签对准NFC感应区',
icon:"none"
let res = await getAccessToken();
let {wxPath,query,modelId,sn} = this.data;
if(res.result_code == 'success'){
let access_token = res.access_token;
let params = {
"jump_wxa":{ path:wxPath,query },
"model_id":modelId,
if(sn){
params.sn = sn
wx.request({
url: 'https://api.weixin.qq.com/wxa/generatenfcscheme?access_token='+access_token,
method:"POST",
data:params,
success: res => {
if(res.data.openlink){
this.nfcWriteNdefMessage(res.data.openlink)
}else{
console.log(res.data.errmsg)
fail: err => {
console.log(999,err)
nfcWriteNdefMessage(loadUrl){
const records = [
id: this.str2ab('mini-ios'),
tnf: 1,
type: this.str2ab('U'),
payload: this.str2ab(loadUrl, [0])
id: this.str2ab('mini-android'),
tnf: 4,
type: this.str2ab('android.com:pkg'),
payload: this.str2ab('com.tencent.mm')
this.setData({
schemaUrl:loadUrl
const NFCTab = this.nfc.getNdef()
NFCTab.writeNdefMessage({
records: records,
success: res => {
wx.showToast({
title: '写入成功',
console.log(res);
fail: error => {
wx.showToast({
title: '写入失败,请确保nfc标签卡片贴着手机',
icon:"error"
console.error(error);
});
str2ab (text, extraBytes) {
const uriStr = encodeURIComponent(text)
const bytes = []
for (let i = 0; i < uriStr.length; i++) {
const code = uriStr.charAt(i)
if (code === '%') {
const hex = uriStr.slice(i + 1, i + 3)
const hexVal = parseInt(hex, 16)
bytes.push(hexVal)
i += 2
} else {
bytes.push(code.charCodeAt(0))
if (extraBytes) {
bytes.unshift(...extraBytes)
return new Uint8Array(bytes).buffer
天线上的 SCL 到 Bean 上的 A1
天线上的 SDA 到 Bean 上的 A0
Bean 使用它的纽扣电池为自己供电,天线由带有 DC-DC 升压模块的 AAA 电池供电,使 1.5V 至 5V
不要忘记将所有接地连接在一起!
如果没有检测到任何东西,它会使灯变为红色,如果检测到标签但不是正确的标签,则为蓝色,如果检测到正确的标签(如 myuid 变量中所定义),则使灯变为绿色。
它似乎在一段时间后超时,但我认为这是我最终必须弄清楚的图书馆问题。
这里有一个视频
#### 设备需求
确保使用的设备具备NFC功能,并已安装最新版微信客户端。对于苹果手机而言,至少需要iPhone XS及以上型号的支持;而对于安卓设备,则大多数现代智能手机都兼容此特性。值得注意的是,在实际操作过程中,只有当屏幕处于解锁状态时才可激活该功能,而且如果当前正在使用系统自带的钱包应用、相机或是开启了飞行模式的话,那么这项服务将会被暂时禁用。
#### 开发指南
在技术层面上实现这一目标涉及几个重要环节:
- **权限申请**:首先要在`app.json`文件里声明所需的API列表,加入如下配置项以便获取必要的权限:
```json
"permission": {
"scope.nfc": {
"desc": "用于读取NFC标签"
- **监听事件**:接着是在具体的小程序页面内编写JavaScript代码片段以响应来自NFC硬件的消息。下面给出了一段简单的例子用来展示怎样设置一个监听器等待接收到来自于附近感应区域内的卡片信号并作出反应:
```javascript
Page({
onLoad() {
const that = this;
wx.onNFCReaderStart((res) => {
console.log('NFC reader started', res);
// 当检测到有效NFC标签时调用的方法
function onDetected(nfcTagInfo){
let url = nfcTagInfo.schemeUrl; // 获取scheme URL
if(url.startsWith("weixin://")){
// 解析URL参数并跳转至相应界面
wx.navigateTo({url});
}else{
console.warn(`Unsupported scheme: ${url}`);
try {
wx.startNFCReader({
success(res) {console.log('startNFCReader Success', res)},
fail(err){console.error('Failed to start NFC Reader:', err)}
wx.onNFCTagDiscovered(onDetected); // 注册发现新标签后的回调函数
} catch (error) {
console.error(error.message);
wx.stopNFCReader({
success(){
console.log('Stopped NFC reader');
fail(err){
console.error('Error stopping NFC reader:',err);
unload(){
wx.offNFCTagDiscovered(); // 移除之前注册过的所有关于发现新标签的通知处理器
上述代码展示了如何启动和停止NFC阅读器以及定义了一个处理接收到的数据(即从NFC标签上读取的信息)的方式。一旦成功解析出了有效的WeChat Scheme链接地址之后就会导航到指定的目标页面上去。