java:实现用户扫码二维码自动跳转指定链接功能
近来接到要实现链接转二维码的需求,通过提供二维码给用户,让用户扫描后自动访问指定的H5页面,从而实现业务流转,这样的功能其实在其他很多场景也会用到,比如资产管理系统中,扫码资产二维码,从而实现库存盘点、自动入库、自动出库等功能今天就这类需求场景,给大家做一个讲解示例
0. 引言
近来接到要实现链接转二维码的需求,通过提供二维码给用户,让用户扫描后自动访问指定的H5页面,从而实现业务流转,这样的功能其实在其他很多场景也会用到,比如资产管理系统中,扫码资产二维码,从而实现库存盘点、自动入库、自动出库等功能
今天就这类需求场景,给大家做一个讲解示例
1. 需求分析
首先这类场景,我们先把需求简化,其实根本是要客户访问某个链接,比如库存盘点的功能链接,但是又要与具体的实体绑定,比如要知道这个是对应到具体某一个资产的,但其实只是加一个参数就行了,比如 http://host/assets/check?no=123456
, 其中“123456”就是资产编号,这样就对应上了。
也有不是与具体物品绑定的,而是与账号、用户等虚拟信息绑定的场景,比如某一类app推广场景,用户可以生成自己的推广二维码,扫码了二维码注册的新用户,奖励就会算到这个用户的账户中。这种场景就需要和用户绑定,但转换成链接也很好理解,比如http://host/user/invite?userId=123456
,这里的userId就是分享二维码的用户的id, 这样只要新用户在访问这个链接是,就能记录是谁推广的
如上,我们的需求定义清楚了,就是要用户访问指定的链接,并且链接上可能会带上一定的参数,而这个链接的展现形式就不是直接显示给链接了,而是以二维码的形式展现。
那我们的核心诉求,就变成了指定的链接转换成二维码。那么,我们来看如何实现
2. 二维码的实质
二维码(QR码)是一种二维图形编码技术,它可以将包含数据的信息以模块化的方式编码成黑白像素点组成的矩阵图案。这些图案可以被扫描设备(如手机相机)捕捉并解码,将其中的数据恢复出来。
实质上,二维码是一种特定的编码方式,可以表示数字、文本、链接、图像
等各种类型的数据。
二维码的工作原理基于计算机视觉和图像处理技术。当扫描设备读取二维码时,它首先会通过光源照亮二维码,然后使用感光器记录反射回的光线。这些原始图像数据经过图像预处理、边缘检测和图像分析等步骤后,被转换为数字信号并进行解码,从而恢复出原始的数据。
3. zxing工具实现
在java中,我们可以利用谷歌开源的zxing
工具包来实现二维码的生成
zxing源码地址:https://github.com/zxing/zxing
1、引入jar包
<dependency>
<groupId>com.google.zxing</groupId>
<artifactId>core</artifactId>
<version>3.3.0</version>
</dependency>
2、创建工具类
public class QRcodeUtil {
private static final String CHARSET = "utf-8";
private static final String FORMAT_NAME = "JPG";
// 二维码尺寸
private static final int QRCODE_SIZE = 300;
/**
* 生成二维码图片
* @param url 扫描二维码跳转地址
* @return
* @throws Exception
*/
public static BufferedImage createImage(String url) throws Exception {
Hashtable hints = new Hashtable();
hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);
hints.put(EncodeHintType.CHARACTER_SET, CHARSET);
hints.put(EncodeHintType.MARGIN, 1);
BitMatrix bitMatrix = new MultiFormatWriter().encode(url, BarcodeFormat.QR_CODE, QRCODE_SIZE, QRCODE_SIZE,
hints);
int width = bitMatrix.getWidth();
int height = bitMatrix.getHeight();
BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
for (int x = 0; x < width; x++) {
for (int y = 0; y < height; y++) {
image.setRGB(x, y, bitMatrix.get(x, y) ? 0xFF000000 : 0xFFFFFFFF);
}
}
return image;
}
/**
* 输出二维码
* @param url 扫描二维码跳转地址
* @param response
* @throws Exception
*/
public static void encode(String url, HttpServletResponse response)
throws Exception {
BufferedImage image = createImage(url);
ImageIO.write(image, FORMAT_NAME, response.getOutputStream());
}
}
3、创建实现转换的接口
@GetMapping("code")
public void qrcode(String url, HttpServletResponse response) throws Exception {
QRcodeUtil.encode(url, response);
}
4、测试,访问该生成二维码的接口:http://localhost:8092/orders/code?url=http://www.baidu.com
这里我测试生成的链接是百度的,你可以根据自己的需求调整为自己的。需要注意的是,生成的链接一定要带上http://
或https://
表明这是链接,而不是一段文字
生成的二维码如下所示
手机扫码,正常跳转百度,测试通过
总结
至此,针对生成二维码的功能就结束了,通过它我们可以实现各种便捷的交互功能,更多的拓展,大家可以动手尝试
更多推荐
所有评论(0)