后端服务快速接入二维码功能

背景


考拉组件化后,为了简化编译流程,使用python实现了源码依赖编译构建平台,提供二维码扫码下载功能;考拉首页动态化搭建后台需要提供少码预览功能等。

二维码功能在后端开发中很常见,本文总结如何在后端项目中快速支持二维码,让自己的平台瞬间高大上。



python二维码生成


使用 qrcode 模块快速支持二维码

安装依赖

`pip install qrcode`

二维码处理

1
2
3
4
5
6
7
8
9
10
11
class QRCodeHandler(BaseHandler):
def get(self):
data = self.get_argument("data", None)
if data:
img = qrcode.make(data)
output = StringIO.StringIO()
img.save(output)
self.set_header("Content-Type", "image/png")
self.write(output.getvalue())
else:
self.write('请输入data参数')

注:更多高级用法请参看开发者官网–qrcode, 如二维码中添加应用图标等

配置接口

1
2
3
4
handlers = [
......
(r"/qrcode", QRCodeHandler),
]



spring 项目中二维码支持


添加依赖

1
2
3
4
5
6
7
8
9
10
<dependency>
<groupId>com.google.zxing</groupId>
<artifactId>javase</artifactId>
<version>3.2.1</version>
</dependency>
<dependency>
<groupId>com.google.zxing</groupId>
<artifactId>core</artifactId>
<version>3.2.1</version>
</dependency>

二维码处理工具类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
import com.google.zxing.*;
import com.google.zxing.client.j2se.BufferedImageLuminanceSource;
import com.google.zxing.client.j2se.MatrixToImageWriter;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.common.HybridBinarizer;

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;

public class QrcodeUtil {

/**
* 解析二维码解析
*/
public static String analyzeEncode(String path) {
String content = null;
BufferedImage image;
try {
image = ImageIO.read(new File(path));
LuminanceSource source = new BufferedImageLuminanceSource(image);
Binarizer binarizer = new HybridBinarizer(source);
BinaryBitmap binaryBitmap = new BinaryBitmap(binarizer);
Map<DecodeHintType, Object> hints = new HashMap<>();
hints.put(DecodeHintType.CHARACTER_SET, "UTF-8");
Result result = new MultiFormatReader().decode(binaryBitmap, hints);// 对图像进行解码
content = result.getText();
} catch (IOException | NotFoundException e) {
e.printStackTrace();
}
return content;
}

/**
* 生成二维码
*/
public static String getEncode(String content, int size) throws Exception {
if (size < 200) {
size = 200;
}
String projectPath = new File("").getAbsolutePath();
String filepath = projectPath + File.separator + "qrcode" + File.separator;
File f = new File(filepath);
if (!f.exists()) {
f.mkdirs();
}
String fileAbsolutePath = filepath + randomId() + ".png";
String format = "png";// 图像类型
Map<EncodeHintType, Object> hints = new HashMap<>();
hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");
BitMatrix bitMatrix = new MultiFormatWriter().encode(content,
BarcodeFormat.QR_CODE, size, size, hints);// 生成矩阵
Path path1 = Paths.get(fileAbsolutePath);
System.out.println(fileAbsolutePath);
MatrixToImageWriter.writeToPath(bitMatrix, format, path1);// 输出图像
return fileAbsolutePath;
}

private static String randomId() {
return UUID.randomUUID().toString().replaceAll("-", "") + "_" + new Date().getTime();
}
}

服务层接口定义

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
public interface IQrcodeService {

/**
* 用于生成二维码图片
*
* @param data 要生成二维码图片的内容,如文件地址等
* @param size 二维码图片尺寸(正方形)
* @return 二维码图片地址
*/
String generateQrcode(String data, int size);

/**
* 解析二维码内容
*
* @param path 二维码图片地址
* @return 二维码内容
*/
String analyzeQrcode(String path);

/**
* 删除存放在本地的二维码图片
*
* @param path 本地存储路径
* @return 是否删除成功
*/
boolean deleteQrcode(String path);
}

服务层实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
import org.springframework.stereotype.Service;

import java.io.File;

@Service
public class QrcodeService implements IQrcodeService {

@Override
public String generateQrcode(String data, int size) {
try {
return QrcodeUtil.getEncode(data, size);
} catch (Exception e) {
e.printStackTrace();
return "";
}
}

@Override
public String analyzeQrcode(String path) {
return QrcodeUtil.analyzeEncode(path);
}

@Override
public boolean deleteQrcode(String path) {
File file = new File(path);
if (file.exists()) {
return file.delete();
}
return false;
}
}

使用以上配置可简单快速实现二维码生成和二维码信息解码工作,实现方式仅作参考



总结

分别使用 pythonjava 实现二维码功能,方便今后快速集成。






文章目录
  1. 1. 背景
  2. 2. python二维码生成
    1. 2.1. 安装依赖
    2. 2.2. 二维码处理
    3. 2.3. 配置接口
  3. 3. spring 项目中二维码支持
    1. 3.1. 添加依赖
    2. 3.2. 二维码处理工具类
    3. 3.3. 服务层接口定义
    4. 3.4. 服务层实现
  4. 4. 总结