共享单车扫码功能实现详解
更新: 6/6/2026 字数: 0 字 时长: 0 分钟
面向前端 / 全栈开发者的科普向技术解读。共享单车的"扫一扫开锁"看似简单,背后却有两套截然不同的技术路线。本文把它们的原理、流程、实现和踩坑点讲清楚。
一、整体概览:两条技术路线

用户的操作几乎一样:打开 App → 扫车上的二维码 → 车锁弹开。但"扫码之后到底是谁去开的锁",有两种完全不同的实现:
方案一:不需要蓝牙(云端联网解锁) 手机把开锁请求发给云端服务器,服务器再通过移动网络把开锁指令下发给车锁。手机和车锁之间没有任何直接连接,全靠云端中转。这要求车锁自身内置物联网模块(SIM 卡/通信芯片),能独立连上移动网络。
方案二:需要蓝牙(手机直连车锁) 手机先连云端确认身份、拿到"钥匙",然后通过蓝牙直接和车锁通信,把开锁指令近距离传给车锁。
核心差异:方案一让车锁自己联网,方案二让手机当中间人。两者在通信方式、硬件依赖、用户体验上区别明显——下面分别拆解。
二维码里通常只存了一个车辆编号(或一个指向编号的短链),它本身不含开锁密码。真正的开锁逻辑,都发生在扫码之后的网络通信里。
二、方案一:不需要蓝牙的云端联网解锁

技术架构:手机 ↔ 云端服务器 ↔ 车锁(三方都靠网络连接,车锁内置物联网模块独立联网)。
核心流程(手机和车锁从不直接对话,全程云端中转):
- 扫码取编号:手机扫二维码,解析出车辆编号(如
BIKE_88001)。 - 请求上云:手机通过互联网,把"我要开
BIKE_88001"的请求发给云端服务器。 - 校验与下发:服务器核对用户身份、押金/余额、订单等是否正常;通过后,经移动网络(4G/NB-IoT)把开锁指令推送给那把车锁。
- 车锁执行:车锁的物联网模块收到指令,驱动锁舌弹开,并把"已开锁"状态回传给云端。
- 闭环确认:云端确认开锁成功,通知手机 App 显示"开锁成功,开始计费"。
手机 ──互联网──► 云端服务器 ──移动网络──► 车锁
(校验身份/订单) (执行开锁)
▲ │
└──────── 开锁成功通知 ◄── 状态回传 ◄────────┘通俗解释:NB-IoT / 4G 是车锁里那张"SIM 卡"用的网络,让车锁能像手机一样自己上网。整个过程手机只是"按下按钮",真正动手开锁的是云端指挥下的车锁本身。
优点:用户无需开蓝牙、无需靠得很近,操作最简单;只要有网,远程也能操作。 短板:强依赖网络——地库、信号弱的区域可能开锁慢甚至失败;车锁需常驻联网,通信流量费 + 物联网模块成本较高。
三、方案二:需要蓝牙的手机直连车锁

技术架构:手机 ↔ 云端服务器(拿钥匙)+ 手机 ↔ 车锁(蓝牙近距离直连开锁)。车锁主要靠蓝牙模块与手机通信,对车锁自身联网能力要求低。
核心流程(手机先拿钥匙,再用蓝牙近场开锁):
- 扫码取编号:手机扫码解析出车辆编号。
- 云端发钥匙:手机连云端核对身份/订单,云端校验通过后**下发一段加密的"开锁凭证(钥匙)"**给手机。
- 蓝牙连车:手机打开蓝牙,搜索并连接到附近的目标车锁(蓝牙是近距离通信,通常几米内)。
- 近场开锁:手机通过蓝牙把开锁凭证直接发给车锁,车锁本地校验凭证合法后弹开。
- 结果回传:开锁结果可由车锁通过蓝牙告诉手机,再由手机(或车锁)上报云端,开始计费。
手机 ──互联网──► 云端(校验身份)──► 下发加密钥匙 ──► 手机
手机 ──蓝牙直连──► 车锁(本地校验钥匙 → 弹开)通俗解释:好比物业先给你一张"门禁卡"(云端发的钥匙),你拿着卡走到门口(蓝牙连接),刷卡开门(本地校验)。门锁不需要时刻联网,只要能被刷卡识别就行。
优点:开锁指令走蓝牙、响应快;即使当前网络很弱,只要事先拿到了钥匙,靠近车也能开锁,弱网/地库体验更好;车锁可少联网,省电省流量、成本更低。 短板:用户必须开启蓝牙并靠近车辆(几米内),否则连不上;蓝牙连接偶有失败需重试,对授权引导和异常处理要求更高。
四、两种方案怎么选

| 对比维度 | 方案一:不用蓝牙(云端联网) | 方案二:用蓝牙(手机直连) |
|---|---|---|
| 通信方式 | 手机→云端→车锁,全程网络中转 | 手机连云端拿钥匙 + 蓝牙近场开锁 |
| 硬件依赖 | 车锁需内置物联网模块(4G/NB-IoT)+ SIM | 车锁主要需蓝牙模块,联网要求低 |
| 网络依赖 | 强依赖实时联网,弱网/地库易失败 | 拿到钥匙后弱网也能开,抗网络波动 |
| 响应速度 | 受网络延迟影响,可能稍慢 | 蓝牙近场直传,响应快 |
| 用户前提 | 有网即可,无需靠近、无需开蓝牙 | 须开蓝牙并靠近车辆(几米内) |
| 成本 | 流量费 + 模块成本较高 | 省电省流量,成本较低 |
选型建议:
- 追求操作最简、远程可控,且能接受联网成本 → 偏向方案一。
- 投放区域常有弱网/地库、想降本省电 → 偏向方案二。
- 实际工程中,成熟厂商多采用蓝牙为主、联网解锁为兜底的混合方案:优先蓝牙快速开锁,蓝牙连不上时自动切换云端联网开锁,兼顾速度与成功率。
五、开发实现要点与注意事项

无论哪种方案,落地时都要重点关注以下几点:
1. 安全验证:严防伪造开锁指令 开锁凭证必须加密 + 带时效 + 一次性,绝不能让二维码或链接里直接出现"开锁密码"。常见做法:
- 二维码只放车辆编号,开锁凭证由服务器动态下发;
- 凭证带时间戳和随机数(nonce),过期或重放即作废;
- 车锁端对凭证做签名校验,防止被中间人伪造。
2. 开锁状态必须回传确认(闭环) 不能"发了指令就当成功"。务必让车锁把真实开锁结果回传,前端据此显示成功/失败,并触发计费。否则会出现"提示开锁成功但车没开"的投诉。
3. 网络异常与弱网兜底
- 方案一:设置合理超时与重试,超时给出"信号弱,请稍后重试或换辆车"的友好提示;
- 方案二:处理蓝牙连接失败、配对超时,必要时自动降级到联网解锁。
4. 蓝牙权限与引导(方案二专属) 前端需检测蓝牙是否开启、是否授权定位权限(部分系统扫蓝牙需定位权限),并给出清晰的开启引导;连接失败要有重试和明确提示,避免用户卡在"转圈"。
5. 订单与计费一致性 开锁成功 = 订单开始、计费开始;还车锁车 = 订单结束、停止计费。要保证开锁/关锁事件与订单状态严格对应,避免漏计费或重复计费。
6. 幂等与防重复开锁 用户可能连点多次开锁。后端要做幂等处理(同一订单重复请求只生效一次),避免重复扣费或锁状态错乱。
一页速记
- 用户操作一致:扫码 → 开锁;差异在"谁去开锁"。
- 方案一(无蓝牙):手机→云端→车锁,车锁自己联网;操作最简,但强依赖网络、成本高。
- 方案二(蓝牙):手机连云端拿钥匙 + 蓝牙近场开锁;响应快、抗弱网、成本低,但须开蓝牙并靠近。
- 混合方案:蓝牙为主、联网兜底,是工程中的常见最优解。
- 共性要点:凭证加密防伪造、状态回传闭环、弱网兜底、权限引导、计费一致、幂等防重复。