区块链电子发票二维码内容解析(Java版)

2 篇文章 0 订阅
2 篇文章 0 订阅

背景:

之前做过一个微信小程序扫描发票二维码,记录发票内容。日前公司财务收到了一种新的发票(区块链电子发票),之前的小程序解析不了这种新的二维码。

 

区块链电子发票是由深圳税务局和腾讯公司合作完成的一款创新型产品,详情大家可以去百度一下 ^_^。

这款电子发票的二维码内容和传统发票的二维码不太一致;

传统发票的二维码内容,大家可以参考一下我之前写的博客,具体链接如下:传送门

区块链电子发票的二维码返回的一个具体的 url(参数已替换成伪值):

https://bcfp.shenzhen.chinatax.gov.cn/verify/scan?hash=...xxx...&bill_num=...xxx...&total_amount=...xxx...

打开可以看到详细的发票信息(比传统的发票二维码多了一些信息):

 

查看页面的请求信息,我们可以看到具体的页面内容是通过如下请求得到的:

// 请求路劲:
https://bcfp.shenzhen.chinatax.gov.cn/dzswj/bers_ep_web/query_bill_detail

// 参数:
bill_num
total_amount
tx_hash

//对应的值就是URL中的三个参数的值

bill_num
total_amount
hash //(这个参数名和上面不一样,注意一下)

 

下面我们只要通过后台访问该链接,就能得到我们想要的内容了,话不多说,直接上代码,这里我使用的是 RestTemplate,大家可以自行根据自己的喜欢使用不同的方法进行访问:

// 首先,区分是哪种类型的二维码
if (invoiceStr.startsWith("01")) {
	getTraditionalInvoiceVo(invoiceStr);
} else if (invoiceStr.startsWith("https")) {
	getBlockChainInvoiceRecordVo(invoiceStr);
} else {
	...
}

// getBlockChainInvoiceRecordVo

{
    final String host = "bcfp.shenzhen.chinatax.gov.cn";
    try {
	    URI uri = new URI(invoiceStr);
	    HashMap paraMap = HttpUtils.getUrlPara(uri.getQuery());
	    if (!host.equalsIgnoreCase(uri.getHost()) || paraMap == null) return null;

	    String url = uri.getScheme() + "://" + uri.getHost() + "/dzswj/bers_ep_web/query_bill_detail";

	    RestTemplate restTemplate = new RestTemplate();
	    HttpHeaders headers = new HttpHeaders();
	    headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
	    headers.setContentType(MediaType.APPLICATION_JSON_UTF8);

	    JSONObject postParameters = new JSONObject();
	    postParameters.put("bill_num", paraMap.get("bill_num").toString());
	    postParameters.put("total_amount", paraMap.get("total_amount").toString());
	    postParameters.put("tx_hash", paraMap.get("hash").toString());
	    HttpEntity<String> entity = new HttpEntity<String>(postParameters.toJSONString(), headers);

	    ResponseEntity<JSONObject> response = restTemplate.exchange(url, HttpMethod.POST, entity, JSONObject.class);
	    if (response == null || !"200".equals(response.getStatusCode().toString()))
		    return null;

	    LinkedHashMap<Object, Object> billRecord = (LinkedHashMap) response.getBody().get("bill_record");

        // billRecord.get("") 拿出想要的数据,这里的金额需要注意一下
        // 取出来的具体值需要 * 0.01,才是我们需要的值
        // bill_code
        // bill_num
        // amount:不含税总金额
        // tax_amount:税额
        // total_amount:总金额(含税)
        // time
        // seller_name
        // seller_taxpayer_id
        // buyer_name


    } catch (URISyntaxException e) {
	    return null;
    }
}

// HttpUtils.getUrlPara 
    public static HashMap<String, String> getUrlPara(String query) {
        if (StringUtils.isBlank(query)) return null;

        HashMap<String, String> paraMap = new HashMap<>();
        String[] paraArr = query.split("&");
        for (String item : paraArr) {
            int index = item.indexOf("=");
            if (index == -1) continue;
            String paraName = item.substring(0, index).toLowerCase();
            String paraValue = item.substring(index + 1);

            paraMap.put(paraName, paraValue);
        }
        return paraMap;
    }

如上述描述有误,请留言指出,我会及时修正,谢谢~

 

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
从开票企业和受票方的角度,纳税人切实体验到了区块链电子发票带来的便捷与高效。 一是降低了企业营商成本。企业开票无需采购税控专用设备,无需管理人员且无需定期清理税控设备存储,财务人员少跑税务机关,开票管理流程极大优化。 *税控机是一种具有法律严肃性和不可破坏性的带有计税功能的收款机,不仅是商业企业经营管理的得力助手,也是税务人员常驻店内采集销售数据的执法代表。它内部装有自动记录但不能更改和抹掉的计税存储器,记录着每日的营业数据和应纳税额,是向纳税机关纳税的凭据。它采用特殊"铅封"手段固定在机器内部,除税务和专职注册维修人员外任何人不能打开。* 二是提高了企业办公效率。报销是企业财务管理的重要环节,财务人员可以基于区块链电子发票,一键完成发票的验真,验重工作,在线上快速完成报销的审核工作。 三是利好中小微企业。区块链电子发票为企业提供了个性化的开票服务,大型企业可自主接入税务区块链电子发票接口系统后进行开票,中小企业可通过微信商户平台开通微信回执开票功能,无需进行抄报税流程,也不需在再为购票往返税务局,只需要使用手机或者联通互联网的计算机即可实现开票。 四是消费后自主获取、支付即开发票,开票即报销,以及流程的操作体验获得了消费者良好的口碑。 对于监管方而言,发票是税务机关控制税源、征收税款的重要依据,长期以来,税务机关为了防控发票风险,建立了严密且繁琐的发票管理体系。区块链技术应用于发票场景,有利于简化发票管理流程,解决税务机关发票管理成本和增强税务机关获取涉税信息的能力。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值