搜索
查看
编辑修改
首页
UNITY
NODEJS
PYTHON
AI
GIT
PHP
GO
CEF3
JAVA
HTML
CSS
搜索
从前慢现在也慢
这个屌丝很懒,什么也没留下!
关注作者
热门标签
jquery
HTML
CSS
PHP
ASP
PYTHON
GO
AI
C
C++
C#
PHOTOSHOP
UNITY
iOS
android
vue
xml
爬虫
SEO
LINUX
WINDOWS
JAVA
MFC
CEF3
CAD
NODEJS
GIT
Pyppeteer
article
热门文章
1
架构师篇-14、大型汽车企业之OTD案例分析_otd工作流程案例
2
在conda虚拟环境下安装PyTorch-gpu版本_conda安装torch
3
【HarmonyOS】鸿蒙应用模块化实现_鸿蒙模块化
4
在你朋友圈刷屏的“AIGC”究竟是什么?今天一文带你全面了解_aigc是什么
5
数据结构——队列_stl 环形队列
6
展会回顾 | 聚焦嵌入式开发的测试工具,确保安全合规:静态代码分析Perforce Helix QAC&Klocwork、单元测试TESSY
7
面试自我介绍_面试qa自我介绍
8
一个命令巧妙查看git版本演变史_git log —oneline
9
Django学习(二)
10
5年专业研究,这份云原生安全指南请查收_云原生安全技术实践指南 pdf
当前位置:
article
> 正文
二维码生成以及扫一扫解析二维码原理_二维码解析出来是什么
作者:从前慢现在也慢 | 2024-08-05 16:05:51
赞
踩
二维码解析出来是什么
二维码生成以及扫一扫解析二维码原理
1、生成URL,确定要通过二维码传达的信息,也就是通过扫一扫可以获得地址和数据信息
1、// 得到随机数,用随机数得到签名,签名验证身份
String ranString = RandomStringUtils.randomAlphanumeric(10);
2、其他参数信息,在二维码中存储的信息非常有限,所有在微信,支付宝的二维码一般不带参数,而是只包含地址信息,在其地址中就包含相应的信息,微信或者支付宝
//在这一般上送标识字段不上送数据信息,状态字段用于判断什么状态下执行什么操作
String orderNo = "123456";
Map<String, String> maps = new HashMap<String, String>();
maps.put("orderNo", orderNo);
maps.put("xx", xx);
3、// 根据规则生成URL,这个URL就是存放到二维码中的数据
String url = generateUrl(ranString, maps);
System.out.println("生成后的URL为: " + url);
4、生成URL方法
// 扫描二维码需要访问的URL,如果是想访问自己的App,则把相应的APP地址放到二维码中
private static final String BASE_URL = "https://st1.tyest.com/app-server";
/**
* 生成二维码URL地址
* @param paramMaps
* 上送字段map
* @param RanSign
* 随机数
* @return
* @throws Exception
*/
public static String generateUrl(String RanSign, Map<String, String> paramMaps) {
String url = null;
String data = "";
try {
// 拼接业务信息字符串,需要上送的字段信息
for (Iterator<Entry<String, String>> it = paramMaps.entrySet()
.iterator(); it.hasNext();) {
Entry<String, String> entry = it.next();
String inputPartkey = entry.getKey();
String inputPart = entry.getValue();
data += inputPartkey + "=" + inputPart + "&";
}
// 对数据信息加密,可以加密,但是二维码存放不下aes加密后的数据,太大了
/*AES aes = new AES();
String HexString = aes.encrypt(data, AES_KEY);*/
//拼接的字符串多了&,类似data=XXX&sign=XXX
data=(String) data.subSequence(0, data.length()-1);
System.out.println("业务信息字符串: " + data);
// 对业务信息进行签名,得到签名信息,包含上送字段,这就是通过扫一扫后得到地址后面一串很长的字符串
String sign = SHA1.genSign(RanSign);
System.out.println("签名: " + sign);
// 后面的则是需要访问的具体的接口,以及需要上送的参数,上送字段可以选择是否加密
url = BASE_URL + "/test/testInterface?sign=" + sign + "&data=" + data;
} catch (Exception e) {
e.printStackTrace();
}
return url;
}
5、绘制二维码
// 根据URL生成二维码图片,把上面的URL以及参数信息写到二维码中,添加logo图片的路径
String logoPath = "D:\\testbail.png";
BufferedImage image = QrCodeImgUtil.qrCodeEncode(url, logoPath);
// 得到outputStream把数据信息写出来
OutputStream out = new FileOutputStream(new File("D:\\testbail.png"));
//把图片绘制到给出的画板上
ImageIO.write(image, "png", out);
System.out.println("图片生成完成");
System.out.println("ranString=" + ranString);
6、绘制方法,网上其实有很多的类似方法,不过还是说下吧
public static BufferedImage qrCodeEncode(String encodeddata,String logoPath)
throws IOException {
Qrcode qrcode = new Qrcode();
// 纠错级别(L 7%、M 15%、Q 25%、H 30%)和版本有关
qrcode.setQrcodeErrorCorrect('M');
qrcode.setQrcodeEncodeMode('B');
qrcode.setQrcodeVersion(7); // 设置Qrcode包的版本
byte[] d = encodeddata.getBytes("utf-8"); // 字符集
BufferedImage bi = new BufferedImage(width, height,
BufferedImage.TYPE_INT_RGB);
// 创建图层
Graphics2D g = bi.createGraphics();
g.setBackground(Color.WHITE); // 设置背景颜色(白色)
g.clearRect(0, 0, width, height); // 矩形 X、Y、width、height
g.setColor(Color.BLACK); // 设置图像颜色(黑色)
if (d.length > 0 && d.length < 123) {
boolean[][] b = qrcode.calQrcode(d);
for (int i = 0; i < b.length; i++) {
for (int j = 0; j < b.length; j++) {
if (b[j][i]) {
g.fillRect(j * 3 + 2, i * 3 + 2, 3, 3);
}
}
}
}
/* 添加logo图片 */
if(logoPath!=null){
int width_4 = width / 4;
int width_8 = width_4 / 2;
int height_4 = height / 4;
int height_8 = height_4 / 2;
Image img = ImageIO.read(new File(logoPath));
g.drawImage(img, width_4 + width_8, height_4 + height_8,width_4,height_4, null);
g.dispose();
bi.flush();
}
g.dispose(); // 释放此图形的上下文以及它使用的所有系统资源。调用 dispose 之后,就不能再使用 Graphics 对象
bi.flush(); // 刷新此 Image 对象正在使用的所有可重构的资源
return bi;
}
6、打开D:\\testbail.png生产的二维码图片,通过扫一扫可以得到如下的类似信息
https://st1.tyest.com/app-server/test/testInterface?sign=a094bb8f56bd2beac35949a76e2ca35dd6e69c87&orderNo=123456
这个就是我们常见的URL了,通过浏览器就可以访问了。
2、
二维码的解析:
1、代码解析二维码图片
//解析的二维码路径
String imgPath = "D:\\testbail.png";
File imageFile = new File(imgPath);
// 测试解析二维码图片内容
String decoderContent = QrCodeImgUtil.qrCodeDecode(imageFile);
System.out.println(decoderContent);
System.out.println("=========解码成功===========");
首先我们要知道,代码解析会解析图片上的所有信息,当然包括图片信息,
然而图片logo是外加入的,所以通过代码解析不了带有logo的二维码,这一点
我还没想到怎么做,有知道的
相关实现方法:
/**
* 解析二维码,返回解析内容
*
* @param imageFile
* @return
*/
public static String qrCodeDecode(File imageFile) {
String decodedData = null;
QRCodeDecoder decoder = new QRCodeDecoder();
BufferedImage image = null;
try {
image = ImageIO.read(imageFile);
} catch (IOException e) {
System.out.println("Error: " + e.getMessage());
}
try {
decodedData = new String(decoder.decode(new J2SEImage(image)),"utf-8");
} catch (DecodingFailedException dfe) {
System.out.println("Error: " + dfe.getMessage());
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return decodedData;
}
得到结果:
https://st1.tyest.com/app-server/test/testInterface?sign=d4b8ae6e19daf14fb8dbaac9ce6ce9bc6f8679f5&orderNo=123456
=========解码成功===========
2、通过扫一扫工具解析(最简单的一种解析方式)
3、扫描二维码背后的故事:
通过上面的方式我们生产了我们自己的二维码,通过扫一扫就可以访问我们自己的系统实现相应的功能,
在这里我们模拟实现一下
String sign = "82385294b5eee3adb2fcedcf0868a219e0e69e1f";
String data = "orderNo=123456";
String ranString ="GJ5U6PfwbyvA8WZxEJt8s7rKqYQzEl6v";
// 假设该方法就是我们定义的接口,而这两个参数正式通过扫一扫获得数据信息。模拟调接口
testInterface(ranString, sign, data);
private static void testInterface(String ranString, String sign, String data) {
// 首先我们验证签名信息,正确则继续,否则验证不通过,二维码有误,在这里我们就知道了,用支付宝或者微信扫描彼此的二维码,就会提示无效的二维码
// 就是因为在验签的时候失败了,就无法继续
if (SHA1.verifySign(ranString, sign)) {
// 验签成功
// 对数据信息解密,如果数据加密的话
AES aes = new AES();
try {
String deString = aes.decrypt(data, AES_KEY);
System.out.println(deString);
// 做相应的业务处理逻辑
} catch (CryptException e) {
e.printStackTrace();
}
} else {
//扫二维码验签失败,说明不是可处理的二维码
System.out.println("二维码有误!");
}
}
扫描二维码就是访问接口,和我们平时写的接口一样的道理,多看看就会明白。
在我的资源里上传了二维码的代码,有需要的支持下,有不当之处,望各位猿友之处,万分感谢。
通过此实例,相信对二维码有了进一步的认识。
每天努力一点,每天都在进步。
声明:
本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:
https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/933090
推荐阅读
article
Ubuntu20.04 解决
Docker
连接
超时
+
拉取
镜像
超时
+
VScode
docker
开发准备_...
对于首次安装
docker
的用户来说,会在
docker
网站上pull下来一个新的image,叫hello-world。看到...
赞
踩
article
国产
化
数据库
适配
(人大金仓)_
国产
数据库
适配
...
人大金仓
国产
化
适配
_
国产
数据库
适配
国产
数据库
适配
本文主要是为了记录在系统做
国产
化适...
赞
踩
article
大学生
网页
设计
作业
——11张精美
网页
html
+
css
+
javascript
+bootstarp...
HTML实例
网页
代码, 本实例适合于初学HTML的同学。该实例里面有设置了
css
的样式设置,有div的样式格局,这个实例...
赞
踩
article
图
神经网络
实战(17)——深度
图
生成
模型
_
神经网络
生成
模型
...
图
生成
是
生成
新
图
的技术,并且希望所
生成
的
图
具有真实世界中
图
的性质。由于传统
图
生成
方法缺乏表达能力,因此提出了更加灵活的基...
赞
踩
article
java
中
邮箱
格式
正则表达式
_
java
使用
正则表达式
判断
邮箱
格式
是否正确
的
方法...
本文实例讲述了
java
使用
正则表达式
判断
邮箱
格式
是否正确
的
方法。分享给大家供大家参考。具体如下:import
java
....
赞
踩
article
通用卡证信息高精度
识别
流程
OCR
文本
检测
文本
识别
身份证
银行卡_cv
身份证
顶点 4个 检...
这是一篇基于
OCR
技术的卡证类智能图像
识别
开发流程指引,囊括了目标
检测
,关键点定位,图像校正,
文本
检测
,
文本
识别
等多种技...
赞
踩
article
信创
国产化
解决方案_
信创
国产化
适配
方案...
据初步估算,到2023年,全球计算产业市场空间1.14万亿美元。中国计算产业市场空间1043亿美元,即7300亿元,接近...
赞
踩
article
Microsoft
Visual
Studio
× 出现错误
,
无去启动_出现错误
,
无法启动visua...
Microsoft
Visual
Studio
× 出现错误
,
无去启动_出现错误
,
无法启动
visual
studio
s...
赞
踩
article
【
Unity
-
Wwise
01
】部署
Wwise
到
Unity
以及基础
的
音乐播放操作_
unity
wwis...
Wwise
是一个比较好用
的
和音效师协作
的
中间件,在这里为方便自用短暂记录一些基础
的
操作。_
unity
wwise
unit...
赞
踩
article
搭建
日志
系统
ELK
(
一
)...
作为数据收集和处理的中间件,它支持多种数据源和灵活的数据处理插件,能够将非结构化
日志
数据转换为结构化格式,便于存储和查询...
赞
踩
article
从零开始
实现
大
语言
模型
(三):
Token
Embedding
与位置编码...
Embedding
是深度学习领域一种常用的类别特征数值化方法。在自然
语言
处理领域,
Embedding
用于将对自然
语言
文本...
赞
踩
article
【微知识】
Git
本地
新增一个
分支
后如何
p
u
sh
到远端?
git
p
u
sh
-
u
xxx
_
本地
分支
p...
使用 -
u
参数。_
本地
分支
p
u
sh
本地
分支
p
u
sh
快速...
赞
踩
article
springboot
整合
rabbitmq
_
springboot
整合
rabbitmq
...
springboot
整合
rabbitmq
其中,Sender 类使用 AmqpTemplate 发送消息,Receiver...
赞
踩
article
人工智能
大
模型
在
医疗
领域
的
应用
进展与前景_
医疗
健康
ai
医疗
大
模型
...
随着
人工智能
技术的进步和深度学习算法的发展,以及海量多模态数据的爆炸式增长,芯片、网络、算力等基础建设的持续增强,
大
模型
...
赞
踩
article
国产
数据库
人大
金仓
适配_
databaseidprovider
金仓
kingbase
...
kingbase
8 人大
金仓
_
databaseidprovider
金仓
kingbase
databaseidprovid...
赞
踩
article
C语言
入门 -
迷信
的
吴
医生
和机智
的
护士
_502数组不吉利...
问题:吴
医生
是个很
迷信
的
医生
,他认为与4相关
的
数字都会带来厄运,因此他拒绝为所有挂号单序号中有数字4,或序号能被4整除
的
...
赞
踩
article
hvv 前网安人必读
的
漏洞
清单(2024年)_
title
=
"
cve
-
2023
...
数字化浪潮席卷全球,安全
漏洞
的
发现和利用频率正以惊人
的
速度上升,尤其是工业自动化、绿色能源、财经领域、交通系统、国家防务...
赞
踩
article
Github
项目
分享——免费
的
编程
中文
书籍索引_
github
编程
书...
总结来说,面试成功=基础知识+
项目
经验+表达技巧+运气。我们无法控制运气,但是我们可以在别
的
地方花更多时间,每个环节都提...
赞
踩
article
【
VisualGLM
】
大
模型
之
VisualGLM
部署
...
大
模型
之
VisualGLM
部署
大
模型
之
VisualGLM
部署
大
模型
之
VisualGLM
部署
VisualGLM
...
赞
踩
article
《
书生
大
模型
实战
营
第
3期》基础岛
第
1关 :
书生
大
模型
全链路
开源
体系...
卓越的推理性能:在数学推理方面取得了同量级
模型
最优精度,超越了 Llama3 和 Gemma2-9B。有效支持百万字超长...
赞
踩
相关标签
docker
vscode
容器
数据库
html
css
javascript
课程设计
HTML学生个人网页设计
前端
网页设计作业
深度学习
图神经网络
神经网络
java中邮箱格式正则表达式
ocr
图像识别
机器学习
人工智能
算法
华为
microsoft
ide
unity
游戏引擎