在我们收到的增值税电子发票、普票、专票,包括现在深圳专有的区块链发票上,在其左上侧空白位置都会有一个二维码,通过这个二维码呢,我们可以获取到发票关键的几样要素信息:发票代码、发票号码、开票日期、金额、不含税金额、校验码、销售方纳税人识别号,其中校验码为增值税普通发票和增值税电子普通发票专有,销售方纳税人识别号是深圳电子普通发票专有。

PS:增值税普通发票(卷票)的二维码只包含发票代码、发票号码,不包含其它要素信息。

通过增值税专票、普票、电子普通发票的二维码,你可以扫描出如下结果:

//例子:01,04,1200153320,07041662,183.49,20151221,83623873463907646339,5080,

其含义解释如下:

//解释:01,04(01,04是普通发票,01,01是专用发票,01,10是电子发票),1200153320(发票代码),07041662(发票号码),183.49(不含税金额),20151221(开票日期),83623873463907646339(校验码),5080(未知含义,与航信确认过该字段可以自定义)

而通过深圳电子普通发票的二维码呢,你可能会扫描出两种结果:

//结果1,与增值税发票格式类似,但数据排列、部分数据有所差异
//01,10,144031909110,01034285,91440300708437873H,5.45,20190320,0053e0982be37e9763314b0c8a58b7c121e0b8b59b03bf3cae346ea8c7d2cbd7b4//结果2,是个Url地址,可以在浏览器中展示发票要素信息
//https://bcfp.shenzhen.chinatax.gov.cn/verify/scan?hash=007547b34bf2fa4dfadf9dd789f9b017b59bee8c563e1185232d66bc58b7c90a04&bill_num=05830164&total_amount=500


上图是两种结果对应的二维码,对于第二种结果,既然页面可以展示出发票要素信息,那么自然我们也就可以通过相应途径模拟请求后获得要素信息,通过F12开发者模式,略加观察,就可以发现真正获取发票要素信息的其实另有地址:

在增值税发票二维码的传统格式中,通过发票代码我们可以区分发票类型,当然如何区分需要专业的发票知识,你不懂也没关系,通过NumberValidators这个类库,我们可以很轻松的得出发票类型,至于深圳电子普通发票的Url格式,我更喜欢通过RestSharp来模拟请求,另外因为Url格式取到的发票日期是以时间戳格式返回,相关金额是以分为单位返回,所以需要做些额外的处理

static void AnalyzeInvoice(){var list = new List<string>(){"01,04,031001800104,73381916,104.85,20180912,76748755340074061279,E7B,","01,10,144031909110,01034285,91440300708437873H,5.45,20190320,0053e0982be37e9763314b0c8a58b7c121e0b8b59b03bf3cae346ea8c7d2cbd7b4","https://bcfp.shenzhen.chinatax.gov.cn/verify/scan?hash=007547b34bf2fa4dfadf9dd789f9b017b59bee8c563e1185232d66bc58b7c90a04&bill_num=05830164&total_amount=500"};foreach (var data in list){if (data.StartsWith("01,"))//二维码的通用格式均以01开头{AnalyzeInvoiceWithOriginal(data);}else if (data.StartsWith("http", StringComparison.OrdinalIgnoreCase)){AnalyzeBlockchainInvoiceWithUrl(data);}else{Console.WriteLine("未知");}Console.WriteLine("************************************");}}static void AnalyzeInvoiceWithOriginal(string data){//data = "01,10,144031909110,01034285,91440300708437873H,5.45,20190320,0053e0982be37e9763314b0c8a58b7c121e0b8b59b03bf3cae346ea8c7d2cbd7b4";var arr = data.Split(',');if (arr.Length >= 8){var valid = NumberValidators.Invoices.Validators.VATCodeValidatorHelper.Validate(arr[2]);if (valid.IsValid){if (valid.Category == NumberValidators.Invoices.VATKind.Blockchain){Console.WriteLine(@"区块链电子普通发票二维码原始格式结果
发票代码:{0}
发票号码:{1}
开票时间:{2}
不含税金额:{3}
销售方纳税人识别号:{4}", arr[2], arr[3], arr[6], arr[5], arr[4]);}else{Console.WriteLine(@"增值税发票二维码原始格式结果
发票代码:{0}
发票号码:{1}
开票时间:{2}
不含税金额:{3}
发票类型:{4}", arr[2], arr[3], arr[5], arr[4], valid.Category);}}}else{Console.WriteLine("不是正确的发票格式");}}static void AnalyzeBlockchainInvoiceWithUrl(string qrUrl){//qrUrl = @"https://bcfp.shenzhen.chinatax.gov.cn/verify/scan?hash=007547b34bf2fa4dfadf9dd789f9b017b59bee8c563e1185232d66bc58b7c90a04&bill_num=05830164&total_amount=500";var qrUri = new Uri(qrUrl);if (!qrUri.Host.Equals("bcfp.shenzhen.chinatax.gov.cn", StringComparison.OrdinalIgnoreCase)){Console.WriteLine("不是深圳电子普通发票的域名");return;}var collection = HttpUtility.ParseQueryString(qrUri.Query);var url = $"{qrUri.Scheme}://{qrUri.Host}/dzswj/bers_ep_web/query_bill_detail";var restClient = new RestClient(url);var restRequest = new RestRequest(Method.POST);restRequest.AddParameter("bill_num", collection["bill_num"]);restRequest.AddParameter("total_amount", collection["total_amount"]);restRequest.AddParameter("tx_hash", collection["hash"]);var restResponse = restClient.Execute(restRequest);Console.WriteLine("区块链电子普通发票二维码Url格式服务端响应内容:");Console.WriteLine(restResponse.Content);var json = (JObject)JsonConvert.DeserializeObject(restResponse.Content);if (json["retcode"].ToString() == "0"){var record = json["bill_record"];var time = record.Value<long>("time");var dt = DateTimeOffset.FromUnixTimeSeconds(time).LocalDateTime;Console.WriteLine(@"区块链电子普通发票Url格式结果
发票代码:{0}
发票号码:{1}
开票时间:{2:yyyy-MM-dd HH:mm:ss}
不含税金额:{3}
销售方纳税人识别号:{4}", record["bill_code"], record["bill_num"], dt, record.Value<int>("amount") * 0.01m, record["seller_taxpayer_id"]);}else{Console.WriteLine("服务端响应错误:{0}", json["retmsg"]);}}

执行结果如下图

如何通过增值税(区块链)发票上的二维码获取发票要素信息相关推荐

  1. 【转】借助第三方支持https协议的存储实现自己网站上扫描二维码安装IOS APP

    使用plist安装,一般是企业级开发者账号不需要登录到APP STORE的IOS设备应用发布时所用到的技巧. 准备: *一台运行着OSX的苹果电脑,最新版的XCODE,用于导出ipa和plist 一个 ...

  2. vue二维码解码器(增加上传二维码之后弹窗预览)

    对之前的二维码解码器做的功能扩展, 增加上传成功时弹框显示二维码图片预览,弹框使用vant ui 实现 vanr ui 文档地址 https://youzan.github.io/vant/#/zh- ...

  3. Python识别二维码获取电子发票基本信息

    因工作需要,每月需要对大量的电子发票重命名,命名格式为发票代码_发票号码.pdf,几经尝试,发现同样是pdf格式的电子发票,使用pdfplumber读取出来的文字信息却有很大不同,一些通行费发票可以很 ...

  4. 防老人走失新方法:衣服上缝二维码 走失可扫码回家

    时下,"老人走失"已经成为一个不容忽视的社会问题.<中国老年人走失状况白皮书>显示, 每年全国走失老人约有50万人,在走失老人当中,65岁以上的占80%以上,走失的主要 ...

  5. QReader:Chrome 浏览器上的二维码阅读器

    在 Chrome 上利用扩展生成二维码不稀奇, QR Code Generator 这个扩展就可以实现,并且这样的扩展在 Chrome Web Store 随便一搜都能出现一大堆.但是,直接在 Chr ...

  6. 用STC单片机在TFT屏上显示二维码

    用STC8A单片机在TFT屏上显示二维码 概述 最近项目需要用单片机在TFT屏上显示二维码,将C++下显示二维码的代码经过改造,移值到C代码的单片机,成功运行,经多次测试能稳定运行,TFT屏显示部分, ...

  7. 在iOS上实现二维码功能

    如今二维码随处可见,无论是实物商品还是各种礼券都少不了二维码的身影.而手机等移动设备又成为二维码的一个很好的应用平台,不管是生成二维码还是扫码二维码. 下面介绍一下如何在苹果iOS设备上使用二维码: ...

  8. 在IOS上实现二维码扫描

    如今二维码随处可见,无论是实物商品还是各种礼券都少不了二维码的身影.而手机等移动设备又成为二维码的一个很好的应用平台,不管是生成二维码还是扫码二维码. 下面介绍一下如何在苹果iOS设备上使用二维码: ...

  9. Allegro在PCB上制作二维码和条形码操作指导

    Allegro在PCB上制作二维码和条形码操作指导 当我们需要在PCB放置一个二维码或者条形码的时候,可以不需要额外去贴标签,可以直接在PCB上制作,如下图 制作出来的二维码和条形码是可以直接用扫码程 ...

最新文章

  1. c#获取本地ip地址网关子网掩码_教你如何修改路由器LAN口IP地址的方法
  2. Elasticsearch之插件介绍及安装
  3. 保证一致性吗_RabbitMQ消息一致性:重要消息,请设置持久化
  4. 关于安装Ubuntu后触摸板无法使用的解决方案
  5. Linux学习笔记之系统路径和命令
  6. 贪吃蛇大作战游戏攻略
  7. java.lang.NoSuchMethodError: org.objectweb.asm.ClassVisitor.visit(IILjava/lang/String;Ljava/lang/Str
  8. python输入10个数字排序案例_介绍十个Python小案例,新手入门就在这里
  9. Hdu2795Billboard线段树
  10. Struts2的标签库(一)之控制标签
  11. verilog求倒数-ROM实现方法
  12. 帆软认证报表工程师FCRA试题
  13. Google Street View Data Set | 谷歌街景数据集 | 云盘分享 |
  14. USB数据采集卡:labjack T7、T7 Pro系列的技术特点
  15. 标签系列三:spring 中property解释以及property标签里面的属性
  16. 华硕笔记本官网驱动如何下载
  17. 给Mac设置定时关机、重启、睡眠
  18. 词向量与词向量拼接_nlp中的词向量对比:word2vec/glove/fastText/elmo/GPT/bert
  19. Docker--10张图带你深入理解Docker容器和镜像
  20. Kaggle赛题-Synthetic Financial Datasets For Fraud Detection

热门文章

  1. python中华氏度与摄氏度的转化_【Python】摄氏度与华氏度互相转化
  2. E.03.29 Afraid of Needles? Don’t Let It Keep You From a Covid-19 Vaccine.
  3. 关于小米MIX2S手机,搜不到蓝牙设备问题
  4. 卓越性能 の 军火库(非广告)
  5. jQuery仿京东左侧物品导航栏练习
  6. python抢票系统代码及解说_python抢票程序
  7. (window)C语言OCI的方式连接oracle
  8. qemu: PCI 设备模拟
  9. 云大博士计算机系的刘明,刘明(西南大学计算机与信息科学学院讲师)_百度百科...
  10. 51单片机中断与定时器计数器,基于普中科技教学视频学习记录