搜索
查看
编辑修改
首页
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
【Dopi Micropython 视觉AI应用开发教程】【实验4】获取摄像头数据_micropython 网络摄像头
2
linux安装搜狗输入法后无法输入中文_linux搜狗输入法无法输入中文
3
MySQL-DATE_FORMAT()函数_mysql日期格式化函数
4
黑马头条(学习笔记)
5
2024年前端最全js数组去重的10种有效方法 vue 数组去重,阿里前端一面_前端数组去重
6
GPT实战系列-LangChain的Prompt提示模版构建_gpt prompt模板
7
Solana之旅3:PoH_solona 共识机制
8
Java二分查找算法
9
【AI人工智能】文心智能体 - 你的专属车牌设计师
10
算法竞赛入门经典(第二版)第三章习题_dna consensus string 卜东波
当前位置:
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
阿里
EchoMimic
:
在线
生成语音匹配的数字人头
_
echomimic
在线
...
之前介绍过,现在有一个免费开源的。
_
echomimic
在线
echomimic
在线
&...
赞
踩
article
24|
Stable
Diffusion
:最热门的
开源
AI
画图工具_
开源
ai
绘图...
上一讲,我们一起体验了 CLIP 这个多模态的模型。在这个模型里,我们已经能够把一段文本和对应的图片关联起来了。看到文本...
赞
踩
article
一位
软件测试
工程师
的
六年
工作
经验分享...
不知不觉已经从事
软件测试
六年了,2016年毕业到进入外包公司外包给微软做
软件测试
, 到现在加入著名
的
外企。六年
的
时间过得...
赞
踩
article
深入洞察
人脸识别
:
InsightFace
项目
解析与
应用
...
深入洞察
人脸识别
:
InsightFace
项目
解析与
应用
项目
地址:https://gitcode.com/deepinsi...
赞
踩
article
基于
FPGA
的数字
信号处理
(
20
)
--
半
减器
和
全
减器
...
基于
FPGA
的数字
信号处理
(
20
)
--
半加器和
全
减器
基于
FPGA
的数字
信号处理
(
20
)
--
半
减器
和
全
减器
...
赞
踩
article
设置
MobaXterm
免密
登录
_
mobaxterm
每次
打开
都
要
输
密码
...
MobaXterm
有记住
密码
功能,连接远程主机不会提示
密码
,使用方便。这对大多数人来说已经足够,对无
密码
登录
(密钥
登录
)...
赞
踩
article
秘塔
AI
搜索
:
如何
在亿万数据海洋中,高效捕捞“宝藏
知识
”?_
秘塔
ai
...
在信息爆炸的时代,我们每天都在海量的数据中寻找着答案。你是否曾感到困惑,当面对
搜索
引擎返回的成千上万条结果时,
如何
避开广...
赞
踩
article
使用
Gmapping
算法
建图与A*
路径
规划
算法
导航的智能小车,
GUI
界面显示
_
路径
规划
gazebo...
本文介绍了如何在Gazebo环境中构建一个带有激光雷达的智能小车模型,通过ROS系统实现键盘控制,并利用
Gmapping
...
赞
踩
article
【
人工智能
】想要入坑
机器
学习
?这是MIT在读博士
的
AI心得_ai 2000
年
左右
的
convex
算法
...
作者:Tom Silver
机器
之心编译随着
人工智能
技术
的
火热,越来越多
的
年
轻学者正准备投身其中,开启自己
的
研究之路。和...
赞
踩
article
C++
LeetCode
刷题常用
函数
_
c++
的常用
leetcode
函数
...
C++中的algorithm、numeric库中有几个常用的模板
函数
,以下将其归纳总结一下(swap,reverse,s...
赞
踩
article
音频
质量
评价
体系那些事...
前言近年来,线上音视频的产品形态和应用场景越来越丰富,疫情更加速了许多行业线下转线上的布局,音视频技术也越来越受到各大厂...
赞
踩
article
常见
垃圾
收集
算法
(
4种)_
垃圾
回收
算法
...
几种常见的
垃圾
收集
算法
的核心思想。 1.Mark-Sweep
(
标记-清除)
算法
这是最基础的
垃圾
回收
算法
,之所以说它...
赞
踩
article
Java
判断账号
邮箱
输入
的
是否正确
的
简单案例
,
华为高级
java
面试题
_
java
控制台
输入一个
邮箱
...
文章介绍了
Java
编程基础测试类Test01和一个针对
Java
工程师
的
面试技巧与学习资源分享
,
包括《2024年最新Jav...
赞
踩
article
软件测试
面试题
:你
为什么
选择
软件测试
行业
?
_
为什么
想
从事
软件测试
行业
...
你
为什么
选择
软件测试
行业
?因为之前了解
软件测试
这个
行业
,觉得他的发展前景很好。个人简介我是一名测试兼开发工程师,目前25...
赞
踩
article
开发与集成:
身份证
识别
OCR
接口
的
全面指南_前端做
ocr
身份证
识别
...
身份证
识别
OCR
接口是一种基于人工智能和机器学习
的
技术,用于自动
识别
和提取
身份证
上
的
文字信息,如姓名、
身份证
号码、性别、...
赞
踩
article
线性规划
(
Linear
Programming
,
LP)...
线性规划
(
Linear
Programming
,
LP)是一种数学方法和算法
,
用于在一组线性不等式的约束下
,
找到线性目标函...
赞
踩
article
Studio
One
6
Professional
for Mac v
6.6
.1
音乐创作
编辑软件 ...
PreSonus
Studio
One
6
Professional
是一款功能强大的音乐制作软件,它为
音乐创作
者、制作...
赞
踩
article
Tomcat
服务
安全
加固和优化_
tomcat
加固使用
安全
的
http
请求(3)_
linxu
系统
中tom...
pomimport(1)编辑 /conf/server.xml,找到如下行( 为
Tomcat
的工作目录):(2)将此...
赞
踩
article
Android
ContentProvider
的使用_如何在
androidmanifest
.xml中...
`
ContentProvider
`是
Android
中的一个组件,用于实现应用程序之间的数据共享。它提供了一种标准化的接口...
赞
踩
article
git
commit
提交
信息
里一般分为哪几种
类型
_
git
commit
类型
...
在项目开发中,对于 Git
commit
提交
信息
的分类可以帮助团队更好地理解代码的变更内容和目的。这些
类型
可以在 co...
赞
踩
相关标签
人工智能
开源
阿里云
stable diffusion
自动化测试
程序员
软件测试
功能测试
职场经验
程序人生
单元测试
fpga开发
xilinx
IC
信号处理
DSP
网络
jvm
oracle
chatgpt
AI大模型
算法
python
c++