如何通過增值稅(區塊鏈)發票上的二維碼獲取發票要素信息

在我們收到的增值稅電子發票、普票、專票,包括現在深圳專有的區塊鏈發票上,在其左上側空白位置都會有一個二維碼,通過這個二維碼呢,我們可以獲取到發票關鍵的幾樣要素信息:發票代碼、發票號碼、開票日期、金額、不含稅金額、校驗碼、銷售方納稅人識別號,其中校驗碼爲增值稅普通發票和增值稅電子普通發票專有,銷售方納稅人識別號是深圳電子普通發票專有。

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"]);
            }
        }

執行結果如下圖
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章