为什么需要二维码生成API
上个月帮一个线下零售客户做微信小程序的会员系统,需要在电子会员卡上嵌入二维码。一开始我打算用前端库(qrcode.js)在浏览器端生成,但发现效果不理想——生成的二维码分辨率不够,印刷出来扫不出来。
后来改用后端API生成,问题迎刃而解。API生成的二维码不仅分辨率高,还能嵌入Logo、自定义颜色、支持SVG矢量格式,印刷效果非常好。
这篇文章整理了我在项目中用到的几款免费二维码API,以及从基础到高级的完整用法。
免费二维码API有哪些选择
市面上提供二维码生成服务的API不少,但真正免费且好用的并不多。我测试了以下四款:
| API名称 | 免费额度 | 最大尺寸 | Logo嵌入 | 自定义颜色 | SVG支持 |
|---------|---------|---------|---------|-----------|--------|
| QR Server API | 无限制 | 1000x1000 | ✅ | ✅ | ✅ |
| QuickChart QR | 无限制 | 2000x2000 | ✅ | ✅ | ✅ |
| QR Code Generator API | 无限制 | 1000x1000 | ❌ | ✅ | ❌ |
| goQR.me | 无限制 | 1000x1000 | ❌ | ✅ | ❌ |
推荐选择:QR Server API(api.qrserver.com)和 QuickChart QR(quickchart.io/qr)。 这两个都不限调用次数,支持Logo嵌入和SVG格式,功能最全面。
基础用法:生成一个简单二维码
最简单的二维码生成只需要一个参数——你要编码的内容。
#
JavaScript调用
// 生成包含URL的二维码
const url = 'https://free-api-hub.com';
const qrImageUrl = `https://api.qrserver.com/v1/create-qr-code/?size=300x300&data=${encodeURIComponent(url)}`;
// 在HTML中使用
const img = document.createElement('img');
img.src = qrImageUrl;
img.alt = 'QR Code';
document.body.appendChild(img);
#Python调用
import requests
from urllib.parse import quote
url = "https://free-api-hub.com"
qr_url = f"https://api.qrserver.com/v1/create-qr-code/?size=300x300&data={quote(url)}"
# 下载二维码图片
response = requests.get(qr_url)
with open("qrcode.png", "wb") as f:
f.write(response.content)
print("二维码已保存为 qrcode.png")
#cURL调用
curl -o qrcode.png "https://api.qrserver.com/v1/create-qr-code/?size=300x300&data=https%3A%2F%2Ffree-api-hub.com"
就这么简单,不需要API Key,不需要注册,直接调用就能生成。
进阶用法:定制二维码样式
默认的黑白二维码太单调了。QR Server API提供了丰富的定制选项。
#自定义颜色
// 深蓝色前景 + 浅灰色背景
const qrUrl = 'https://api.qrserver.com/v1/create-qr-code/' +
'?size=300x300' +
'&data=https://free-api-hub.com' +
'&color=1a365d' + // 前景色(深蓝)
'&bgcolor=f7fafc'; // 背景色(浅灰)
颜色参数支持十六进制格式,不需要加#号。
#嵌入Logo
这是最实用的功能之一。在二维码中间放一个Logo,既能提升品牌识别度,又不影响扫码功能。
const logoUrl = 'https://free-api-hub.com/logo.png';
const qrUrl = 'https://api.qrserver.com/v1/create-qr-code/' +
'?size=400x400' +
'&data=https://free-api-hub.com' +
`&logo=${encodeURIComponent(logoUrl)}` +
'&logosize=80';
注意:Logo尺寸建议设为二维码总尺寸的20%-25%。太大会影响扫码成功率。
#SVG矢量格式
如果你需要印刷用的高质量二维码,SVG格式比PNG更好——它是矢量的,放大后不会失真。
// 生成SVG格式二维码
const qrUrl = 'https://api.qrserver.com/v1/create-qr-code/' +
'?size=500x500' +
'&data=https://free-api-hub.com' +
'&format=svg' +
'&margin=10';
QR Server API支持png、svg、jpg、gif四种输出格式。
实战案例:批量生成会员二维码
下面是一个完整的实战场景——为1000个会员批量生成带Logo的二维码。
import requests
import os
from urllib.parse import quote
def generate_member_qr(member_id, name, output_dir="qr_codes"):
"""为单个会员生成二维码"""
os.makedirs(output_dir, exist_ok=True)
# 二维码内容:会员ID + 姓名
qr_data = f"MEMBER:{member_id}:{name}"
# API参数
params = {
"size": "400x400",
"data": qr_data,
"format": "png",
"color": "1a365d",
"bgcolor": "ffffff",
"logo": "https://free-api-hub.com/logo.png",
"logosize": "80",
"margin": "10",
"ecc": "H" # 高纠错级别,保证嵌入Logo后仍能扫出
}
response = requests.get(
"https://api.qrserver.com/v1/create-qr-code/",
params=params
)
if response.status_code == 200:
filepath = os.path.join(output_dir, f"member_{member_id}.png")
with open(filepath, "wb") as f:
f.write(response.content)
return filepath
else:
print(f"生成失败: {member_id}, HTTP {response.status_code}")
return None
# 批量生成
members = [
{"id": "M001", "name": "张三"},
{"id": "M002", "name": "李四"},
# ... 更多会员
]
for member in members:
result = generate_member_qr(member["id"], member["name"])
if result:
print(f"已生成: {result}")
#纠错级别选择
二维码有四个纠错级别(L/M/Q/H),级别越高,容错能力越强,但二维码也越复杂。
| 级别 | 容错能力 | 适用场景 |
|------|---------|---------|
| L(低) | 7% | 二维码内容短,不需要嵌入Logo |
| M(中) | 15% | 一般用途,推荐默认选择 |
| Q(较高) | 25% | 需要嵌入小Logo |
| H(高) | 30% | 需要嵌入较大Logo,印刷场景 |
重要提醒: 如果你的二维码要嵌入Logo,一定要用H级别。我之前用M级别嵌入Logo后,部分安卓手机扫不出来,换成H级别就好了。
性能优化技巧
#1. 客户端缓存
如果二维码内容不变(比如固定URL),可以在前端缓存生成的二维码图片:
// 使用localStorage缓存二维码
async function getQRCode(data) {
const cacheKey = `qr_${data}`;
const cached = localStorage.getItem(cacheKey);
if (cached) {
return cached; // 返回缓存的base64图片
}
const response = await fetch(
`https://api.qrserver.com/v1/create-qr-code/?size=300x300&data=${encodeURIComponent(data)}`
);
const blob = await response.blob();
const base64 = await blobToBase64(blob);
localStorage.setItem(cacheKey, base64);
return base64;
}
#2. 服务端预生成
对于已知的内容(比如商品链接),可以在服务端预生成并存储,避免每次请求都调用API:
// Node.js预生成示例
const fs = require('fs');
const path = require('path');
async function preGenerateQR(data, filename) {
const response = await fetch(
`https://api.qrserver.com/v1/create-qr-code/?size=300x300&data=${encodeURIComponent(data)}&format=png`
);
const buffer = Buffer.from(await response.arrayBuffer());
const filepath = path.join('./static/qr', filename);
fs.writeFileSync(filepath, buffer);
return filepath;
}
#3. 使用CDN加速
QR Server API本身就有CDN加速,但你也可以把预生成的二维码图片放到自己的CDN上,进一步降低延迟。
二维码在不同场景的最佳实践
电子名片:使用vCard格式编码,包含姓名、电话、邮箱。尺寸建议300x300,纠错级别M。
BEGIN:VCARD
VERSION:3.0
N:张;三
TEL:+86-138-0000-0000
EMAIL:[email protected]
END:VCARD
WiFi连接:编码WiFi配置信息,扫一下就能连网。
const wifiData = 'WIFI:T:WPA;S:MyNetworkName;P:MyPassword;;';
const qrUrl = `https://api.qrserver.com/v1/create-qr-code/?data=${encodeURIComponent(wifiData)}&size=300x300`;
支付链接:编码支付页面URL,注意使用HTTPS确保安全性。
活动签到:为每个参与者生成唯一二维码,内容包含活动ID和用户ID,服务端验证后完成签到。
常见问题
Q: 二维码内容有长度限制吗?
有。QR Code最多能存储4296个字母数字字符或2953个字节。实际使用中,建议内容不超过500个字符,否则二维码会过于复杂,影响扫码速度和成功率。
Q: 二维码的颜色对比度有要求吗?
前景色和背景色之间需要有足够的对比度。建议对比度至少4.5:1(WCAG AA标准)。浅色背景+深色前景是最安全的选择。不要用相近的颜色组合,比如深蓝背景+紫色前景,这种很难扫出来。
Q: 生成的二维码有效期多久?
二维码本身没有有效期,只要内容不变就能一直使用。但如果二维码编码的是一个URL,而那个URL对应的页面已经下线,那二维码就失效了。所以建议在二维码系统中加入版本管理。
总结
免费二维码API的功能远比大多数人想象的强大。从简单的URL编码到带Logo的品牌二维码,从单张生成到批量处理,API方案比前端库更灵活、质量更高。
核心建议:印刷场景用SVG格式+H纠错级别,网页展示用PNG格式+M纠错级别就够了。所有二维码API都可以在Free API Hub上找到完整的文档和在线测试工具,建议先测试再接入。