• 目录
  • 发票二维码的含义
  • 二维码
  • 扫描结果
  • 结果解析
  • 样例
  • 增值税电子普通发票:
  • 增值税专用发票:
  • 增值税普通发票:
  • JAVA生成发票二维码
  • 引入依赖
  • 字符串二维码或二维码读取
  • 二维码测试
  • 生成样例

发票二维码的含义

  • 二维码

从发票上截取的二维码

  • 扫描结果

01,10,011001800211,65651348,105.46,20180709,05903676700178588016,C62D,

  • 结果解析

  • 样例

  • 增值税电子普通发票:

01,10,011001800211,65651348,105.46,20180709,05903676700178588016,C62D,

该字符串以逗号分隔每一个属性值,从左到右依次是:

01:第一个属性值,尚未搞清楚含义;

10:第二个属性值,代表发票种类代码,10-增值税电子普通发票,04-增值税普通发票,01-增值税专用发票;

011001800211:第三个属性值,代表发票代码;

65651348:第四个属性值,代表发票号码;

105.46:第五个属性值,代表开票金额;

20180709:第六个属性值,代表开票日期,该值为2018年7月9日;

05903676700178588016:第七个属性值,代码发票校验码,我们都知道增值税专用发票是没有发票校验码的,没有则为空字符串;

C62D:第八个属性值,为CRC算法产生的机密信息;

  • 增值税专用发票:

01,01,1200154130,03630024,94339.62,20180721,,AE2D,  

其中"AE2D"为随机产生的机密信息;

  • 增值税普通发票:

01,04,011001800211,65651348,1105.46,20180709,05903676700178588016,C62D,  

其中"C62D"为CRC算法产生的机密信息;

JAVA生成发票二维码

引入依赖

     <dependency><groupId>QRCode</groupId><artifactId>qrcode</artifactId><version>1.0.0</version><scope>system</scope><systemPath>${project.basedir}/lib/QRCode.jar</systemPath></dependency>

字符串二维码或二维码读取

package com.bosssoft.cloud.coreservice.pdf.help;import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.UnsupportedEncodingException;import javax.imageio.ImageIO;import org.slf4j.Logger;
import org.slf4j.LoggerFactory;import com.swetake.util.Qrcode;import jp.sourceforge.qrcode.QRCodeDecoder;
import jp.sourceforge.qrcode.data.QRCodeImage;
import jp.sourceforge.qrcode.exception.DecodingFailedException;/*** Title: QRCodeUtil.java* * @author hmc* @date 2018年7月18日*       <p>*       Description:二维码生成工具*       </p>* */
public class QRCodeUtil {private static Logger logger = LoggerFactory.getLogger(QRCodeUtil.class);/*** 生成二维码,返回二维码图片字节数组* * @param encodeddata 要包装成二维码的字符串* @return* @throws IOException*/public static byte[] qrCodeEncode(String encodeddata) throws IOException {Qrcode qrcode = new Qrcode();qrcode.setQrcodeErrorCorrect('L');// 纠错级别(L 7%、M 15%、Q 25%、H 30%)和版本有关qrcode.setQrcodeEncodeMode('B');qrcode.setQrcodeVersion(7);// 设置Qrcode包的版本byte[] d = encodeddata.getBytes("GBK"); // 字符集BufferedImage bi = new BufferedImage(139, 139, BufferedImage.TYPE_INT_RGB);// createGraphics // 创建图层Graphics2D g = bi.createGraphics();g.setBackground(Color.WHITE); // 设置背景颜色(白色)g.clearRect(0, 0, 139, 139); // 矩形 X、Y、width、heightg.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);}}}}g.dispose(); // 释放此图形的上下文以及它使用的所有系统资源。调用 dispose 之后,就不能再使用 Graphics 对象bi.flush(); // 刷新此 Image 对象正在使用的所有可重构的资源// 输出ByteArrayOutputStream bos = new ByteArrayOutputStream();ImageIO.write(bi, "png", bos);bos.close();return bos.toByteArray();}/*** 解析二维码,返回解析内容* * @param imageFile* @return*/public static String qrCodeDecode(byte[] imageByte) {String decodedData = null;QRCodeDecoder decoder = new QRCodeDecoder();BufferedImage image = null;try {ByteArrayInputStream bais = new ByteArrayInputStream(imageByte);image = ImageIO.read(bais);bais.close();} catch (IOException e) {logger.error("二维码解析Error: " + e.getMessage());}try {decodedData = new String(decoder.decode(new MyQRCodeImage(image)), "GBK");} catch (DecodingFailedException dfe) {logger.error("Error: " + dfe.getMessage());} catch (UnsupportedEncodingException e) {logger.error("Error: " + e.getMessage());}return decodedData;}static class MyQRCodeImage implements QRCodeImage {BufferedImage image;public MyQRCodeImage(BufferedImage image) {this.image = image;}public int getWidth() {return image.getWidth();}public int getHeight() {return image.getHeight();}public int getPixel(int x, int y) {return image.getRGB(x, y);}}}

二维码测试

    @Testpublic void testQR() {String filePath = "D:\\practice\\targetQR.png";// 二维码内容
//        String encodeddata = "01,01,1200154130,03630024,94339.62,20180721,,C62D,";String encodeddata = "01,04,011001800211,65651348,1105.46,20180709,05903676700178588016,C62D,";
//        String encodeddata = "01,04,1100162320,80050866,189.62,20161221,50138840680157228141,A6F0,";byte[] qrCodeEncode = null;try {qrCodeEncode = QRCodeUtil.qrCodeEncode(encodeddata);writeFile(qrCodeEncode, filePath);} catch (IOException e) {e.printStackTrace();}// 解码String reText = QRCodeUtil.qrCodeDecode(qrCodeEncode);System.out.println(reText);}private void writeFile(byte[] bytes, String target) {File file = new File(target);try {if (!file.exists())file.createNewFile();FileOutputStream fos = new FileOutputStream(file);fos.write(bytes);fos.close();} catch (Exception e) {System.out.println("写入文件异常");e.printStackTrace();}}

后四位随机数生成方法

    /*** 电子发票生成二维码图片的规则* * @param* @return*/public static String generateEInvoiceQuickMarkStr(String invoiceCode,String invoiceNumber,String totalAmount,String invoiceDate,String checkCode) {StringBuilder builder = new StringBuilder("01,").append(InvoiceType.TAX_E_INVOICE.getType()).append(",").append(invoiceCode).append(",").append(invoiceNumber).append(",").append(totalAmount).append(",").append(invoiceDate).append(",").append(checkCode).append(",");return new StringBuilder(builder).append(Integer.toHexString(CRC16_MINIM(builder.toString().getBytes())).toUpperCase()).append(",").toString();}/*** CRC16_X25:多项式x15+x2+1(0x8005),初始值0x0000,低位在前,高位在后,结果与0x0000异或** @param buffer* @return*/public static int CRC16_MINIM(byte[] buffer) {int wCRCin = 0x0000; // initial value 65535int wCPoly = 0x8005; // 1000 0000 0000 0101for (byte b : buffer) {for (int i = 0; i < 8; i++) {boolean bit = ((b >> (7 - i) & 1) == 1);boolean c15 = ((wCRCin >> 15 & 1) == 1);wCRCin <<= 1;if (c15 ^ bit)wCRCin ^= wCPoly;}}wCRCin &= 0xffff;return wCRCin ^= 0x0000;}

生成样例

发票二维码含义, 及java生成二维码相关推荐

  1. java 生成二维码 QRCode、zxing 两种方式

    版权声明:本文为 testcs_dn(微wx笑) 原创文章,非商用自由转载-保持署名-注明出处,谢谢. https://blog.csdn.net/testcs_dn/article/details/ ...

  2. 二维码相关---java生成二维码名片,并且自动保存到手机通讯录中...

    二维码相关---java生成二维码名片,并且自动保存到手机通讯录中... 技术qq交流群:JavaDream:251572072 1.首先介绍一个api.   Zxing是Google提供的关于条码 ...

  3. java生成二维码打印到浏览器

    java生成二维码打印到浏览器 解决方法: pom.xml的依赖两个jar包: <!-- https://mvnrepository.com/artifact/com.google.zxing/ ...

  4. Java生成二维码带LOGO底部标题竖版字体

    前言 Java后端生成二维码 底部 侧面带有标题,可调节字号 参考文章 使用Java生成二维码图片(亲测) Reborn_YY使用Java生成二维码图片 图标素材库 Java后台生成图片,前台实现图片 ...

  5. java生成二维码,并在前端展示。

    java生成二维码,并在前端展示,扫码实现下载功能. 后端生成二维码以流的形式 前端接收二维码并展示 后端生成二维码以流的形式 这是以流的形式展示二维码.当然也可以以文件的格式,文件格式就是Path ...

  6. java生成二维码(链接生成二维码)

    Java二维码如何生成? awt.image.BufferedImage; import java.io.File; import javax.imageio.ImageIO; import com. ...

  7. java生成二维码到文件,java生成二维码转成BASE64

    java生成二维码到文件,java生成二维码转成BASE64 如题,利用java和第三方库,把指定的字符串生成二维码,并且把二维码保存成图片,转换成BASE64格式. 需要的jar文件: packag ...

  8. java生成二维码扫描跳转到指定的路径URL

    java生成二维码扫描跳转到指定的路径URL 导入依赖 <dependency><groupId>com.google.zxing</groupId><art ...

  9. Java 生成二维码 zxing生成二维码 条形码 服务端生成二维码 Java生成条形码

    Java 生成二维码 zxing生成二维码 条形码 服务端生成二维码 Java生成条形码 一.关于ZXing 1.ZXing是谷歌开源的支持二维码.条形码 等图形的生成类库:支持生成.和解码功能. G ...

最新文章

  1. kotlin与java对比
  2. OpenCV矩阵可视化工具包
  3. Linux 进阶笔记(一)
  4. [WinError 127] 找不到指定的程序
  5. 常见多媒体文件格式及视音频编解码总结
  6. 使用 dotnet format 格式化代码
  7. jsp实现网页的在线调查功能
  8. oracle 数据库由Linux平台向Windows平台迁移
  9. python定时器及数据库操作
  10. Commons-logging + Log4j 使用方法、常见问题
  11. [转载] 用pandas进行数据分析实战
  12. VS2010/VS2012/VS2015下openGL环境配置(转)
  13. FreeSwitch中,RGB颜色转换为YUV
  14. 最常用的GitHub—— Android 开源项目整理(精品)
  15. 三层交换机/路由器OSPF配置详解【华为eNSP实验】
  16. ThingJS 和three.js对比开发太空漫游技术!3D 可视化
  17. TN.STN液晶屏常见问题及解决办法
  18. MySQL插入数据时报错Cause: java.sql.SQLException: #HY000
  19. 操作系统——文件管理实验
  20. 数学机器人不解人意?

热门文章

  1. CNN进行非接触掌纹识别的改进过程
  2. 微搭中实现文件的下载
  3. 如何设置电信光猫?图解手把手教你(超级详细)
  4. 重装win10纯净版操作系统
  5. 参加大数据培开发训出来到底能拿多少薪水,加米谷告诉你
  6. 银汇通支付:第三方支付POS机备受商户青睐
  7. Linux Shell nohup命令
  8. “特殊值、类型和转换”学习笔记
  9. 未来地图,开启万物互联-华中雄
  10. Python爬取游戏英雄皮肤图片 王者+LOL