首页 > 编程语言 >对接诺诺电子发票(Java)

对接诺诺电子发票(Java)

时间:2024-05-08 18:02:02浏览次数:32  
标签:map Java String getString invoiceMap 诺诺 put 发票 resources

沙箱环境:

url: https://sandbox.nuonuocs.cn/open/v1/services
appKey: SD63236305
appSecret: SDDED2523BED4643
下载诺诺的SDK:SDK下载

引入项目:

 

服务实现层代码:

// 创建发票信息表
@Override
public InvoiceDto create(Invoice resources){
resources.setId(snowflake.nextIdStr());
if (InvoiceConstants.InvoiceType.ELECTRONIC.getCode().equals(resources.getInvoiceType())){
// 电子发票
JSONObject result = JSONObject.parseObject(makeInvoice());
String newResult = result.getString("result");
JSONObject invoiceResult = JSONObject.parseObject(newResult);
// 获取发票流水号
String serialNos = invoiceResult.getString("invoiceSerialNum");
resources.setSerialNo(serialNos);
Map<String, String> invoiceMap = getInvoiceUrlByInvoiceSerialNum(serialNos);
System.out.println("Map::::::" + invoiceMap);
resources.setStatus(invoiceMap.get("status"));
if (invoiceMap.get("status").equals(SUCCESS_CODE)){
resources.setInvoiceNo(invoiceMap.get("invoiceNo"));
resources.setInvoiceCode(invoiceMap.get("invoiceCode"));
// 将日期格式转化
String invoiceTime = invoiceMap.get("invoiceTime");
LocalDateTime time = LocalDateTimeUtil.of(Long.valueOf(invoiceTime));
String format = LocalDateTimeUtil.format(time, DatePattern.NORM_DATETIME_PATTERN);
resources.setInvoiceTime(format);
resources.setImgUrl(invoiceMap.get("imgUrl"));
resources.setPdfUrl(invoiceMap.get("pdfUrl"));
}
}else if (InvoiceConstants.InvoiceType.PAPERY.getCode().equals(resources.getInvoiceType())){
// 纸质发票
resources.setStatus(SUCCESS_CODE);
}
return invoiceMapper.toDto(invoiceRepository.save(resources));
}
// 对接诺诺的开票接口
public String makeInvoice(){
String taxNum = "339901999999142"; //企业税号
String method = "nuonuo.ElectronInvoice.requestBillingNew";
// 沙箱环境下token可以为空
String token = "";
String content = "{\"order\":"
// 发票明细
+ "{\"invoiceDetail\":[" + "{"
// 税率
+ "\"taxRate\":\"" + 0.13 + "\","
// 发票行性质:0,正常行;1,折扣行;2,被折扣行
+ "\"invoiceLineProperty\":\"" + 0 + "\","
// 商品名
+ "\"goodsName\":\"" + "物业费"+ "\","
+ "\"goodsCode\":\"" + "3040801"+ "\","
// 不含税金额
+ "\"taxExcludedAmount\":\"" + 1 + "\","
// 单价含税标志 0 不含税 1 含税
+ "\"withTaxFlag\":\"" + 0 + "\","
// 数量
+ "\"num\":\"" + 1 + "\","
// 税额 [不含税金额] * [税率] = [税额]
+ "\"tax\":\"" + 0.13 + "\","
// 单位
+ "\"unit\":\"" + "" + "\","
// 扣除额,差额征税时填写
+ "\"deduction\":\"" + 0 + "\","
// 单价(精确到小数点后8位)
+ "\"price\":\"" + 1 + "\"}],"
// 购方名称 Y
+ "\"buyerName\":\"" + "测试名称" + "\","
// 购方地址 N
+ "\"buyerAddress\":\"" + "测试地址" + "\","
// 购方税号(企业要填,个人可为空) N
+ "\"buyerTaxNum\":\"" + "123456789000000000" + "\","
// 开票类型:1:蓝票;2:红票
+ "\"invoiceType\":\"" + 1 + "\","
// 发票种类
+ "\"invoiceLine\":\"" + "p" + "\","
// 清单标志:非清单:0;清单:1,默认:0,电票固定为0
+ "\"listFlag\":\"" + 0 + "\","
// 推送方式:-1,不推送;0,邮箱;1,手机(默认);2,邮箱、手机
+ "\"pushMode\":\"" + 2 + "\","
// 购方手机(开票成功会短信提醒购方,不受推送方式影响) Y
+ "\"buyerPhone\":\"" + "****" + "\","
// 邮箱地址,沙箱环境也可以发送
+ "\"email\":\"" + "1234@qq.com" + "\","
// 开票员id(诺诺系统中的id) N
+ "\"clerkId\":\"" + "ceshi" + "\","
+ "\"payer\":\"" + "nickname" + "\","
// 销方银行账号和开户行地址
+ "\"salerAccountr\":\"" + "测试银行测试支行120200590990432278" + "\","
+ "\"salerAddressr\":\"" + "测试地址" + "\","
// 订单号(每个企业唯一) Y
+ "\"orderNo\":\"" + "20230205112" + "\","
// 销方电话
+ "\"salerTelr\":\"" + "0731-168168168" + "\","
// 订单时间 Y
+ "\"invoiceDate\":\"" + "2016-01-13 12:30:00" + "\","
// 开票员 Y
+ "\"clerk\":\"" + "ceshi" + "\","
// 分机号(只能为空或者数字)
+ "\"extensionNumber\":\"" + "0" + "\","
// 销方税号
+ "\"salerTaxNum\":\"" + "339901999999142" + "\""+
"}}";
String senid = UUID.randomUUID().toString().replace("-", ""); // 唯一标识,由企业自己生成32位随机码
// 接口调用
NNOpenSDK sdk = NNOpenSDK.getIntance();
String json = sdk.sendPostSyncRequest(url, senid, appKey, appSecret, token,taxNum, method, content);
// 响应报文解析
System.out.println("\n\n\n【API请求】");
System.out.println(json);
JSONObject newJson = JSONObject.parseObject(json);
if (!newJson.getString("code").equals(APPLY_SUCCESS_CODE)){
// 开票申请失败
throw new BadRequestException(newJson.getString("describe"));
}
return json;
}
// 发票开完后的查询接口
@Override
public Map<String, String> getInvoiceUrlByInvoiceSerialNum(String invoiceSerialNum) {
String taxnum = "339901999999142";//授权企业税号, 商户填""
String method = "nuonuo.ElectronInvoice.queryInvoiceResult";
String token = "";
Map<String, String> map = new HashMap<>();
NNOpenSDK sdk = NNOpenSDK.getIntance();
String content = "{" + "\"serialNos\":[" + invoiceSerialNum + "]" + "}";
String senid = UUID.randomUUID().toString().replace("-", "");
String result = sdk.sendPostSyncRequest(url, senid, appKey, appSecret, token, taxnum, method, content);
System.out.println(result);
JSONObject newresult = JSONObject.parseObject(result);
String code = newresult.getString("code");
String describe = newresult.getString("describe");
map.put("code", code);
if (code.equals(APPLY_SUCCESS_CODE)) {
JSONArray eventInfoData = (JSONArray) newresult.get("result");
JSONObject jsonArray = eventInfoData.getJSONObject(0);
String status = jsonArray.getString("status");
String statusMsg = jsonArray.getString("statusMsg");
map.put("status", status);
map.put("statusMsg", statusMsg);
if (status.equals(SUCCESS_CODE)) {
map.put("imgUrl", jsonArray.getString("imgUrls"));
map.put("pdfUrl", jsonArray.getString("pdfUrl"));
map.put("invoiceCode",jsonArray.getString("invoiceCode"));
map.put("invoiceNo",jsonArray.getString("invoiceNo"));
map.put("invoiceTime",jsonArray.getString("invoiceTime"));
}
return map;
} else {
map.put("statusMsg", describe);
}
return map;
}

 

<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.4.1</version>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpcore</artifactId>
<version>4.4.1</version>
</dependency>


————————————————

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

原文链接:https://blog.csdn.net/qq_52217182/article/details/129012900

标签:map,Java,String,getString,invoiceMap,诺诺,put,发票,resources
From: https://www.cnblogs.com/fswhq/p/18086981

相关文章

  • Java护照识别接口开发示例、文字识别、证件识别
    护照是我们出国旅行时所必要的证件之一,他是我国公民去外国的旅行和工作的时候所代表的一个合法的身份证件。在护照上面也有不少关于我们个人身份的信息,而手动去录入如此多的身份信息这绝对是灾难。不仅证件,有的场景还需要录入很多文字信息。翔云API可识别图片上的身份证、护......
  • Java实名认证API、婚恋网实名认证
    中国网络婚恋交友行业发展近20年,电脑端网络婚恋服务已经较为成熟,商业模式也较为完善。但随着移动互联网的快速发展,移动端成为婚恋交友企业核心用户新的来源渠道。网络婚恋交友移动端人群覆盖规模逐渐超过电脑端人群,标志着以移动端为主导的婚恋交友服务正式来临,整体行业迎来了......
  • javaScript之局部变量,全局变量与局部作用域,全局作用域
    前端开发工作者,最需要学习的一门语言就是JavaScript了吧,其实学习大部分编程语言都是从基本的语法知识开始人门的。什么语句、变量、数据类型、对象、函数...今天本文就简单说明javaScript变量中的一个小小的知识点,其实在后面的最开始工作编程中我也是常常容易出现bug的一个点。......
  • Java面向对象04——三大特性之多态
    多态1、什么是多态在Java中,多态是面向对象编程中的一个重要概念,它允许不同类型的对象对同一方法进行不同的实现。具体来说,多态性指的是通过父类的引用变量来引用子类的对象,从而实现对不同对象的统一操作。2、多态实现的条件在Java中,要实现多态性,就必须满足以下条件:继承关......
  • java.lang.NoSuchMethodError的不明崩溃问题
    1)java.lang.NoSuchMethodError的不明崩溃问题2)微信小游戏有可行的分析Mono内存的方法吗3)游戏运行中,从对象池里拿Item时动态设置物体锚点,导致DC成倍增加4)ScriptableBuildPipeline打包ScritptableObject报错这是第384篇UWA技术知识分享的推送,精选了UWA社区的热门话题,涵盖了UWA......
  • Cannot resolve method 'and(java.util.function.Predicate<java.lang.String>)
    springboot整合knife4j报错,提示找不到该方法,用的knife4j依赖是最新版本解决方法:将knife4j版本进行降级处理,这里采用2.0.4......
  • 为javaweb项目中的所有jsp页面设置相同字符集
    配置web.xml文件<?xmlversion="1.0"encoding="UTF-8"?><web-appxmlns="https://jakarta.ee/xml/ns/jakartaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="https://jakarta.ee/......
  • 蛇形变量名(nake_case)速转驼峰变量名(camelCase)__Java
    最近遇到当JavaBean不遵循驼峰命名规则时,使用反射赋值失败。但是我的类中属性个数非常多(一个一个改也太恼火了),因此写了个将蛇形变量名转驼峰变量名的方法,在此分享出来供大家使用。publicstaticvoidconvertToCamelCase(Objectobj){Class<?>clazz=obj.getClas......
  • Matplot3D for JAVA 【V5.0】发布 :一个纯JAVA开发的数学科学数据可视化组件,JAVA 三维
    ​ Matplot3DforJAVA概述 在数据科学和工程领域,数据可视化是理解和交流复杂信息的关键工具。如果您是一位Java开发者,寻找一个强大的、本地化的三维图形绘图库,那么Matplot3DforJAVA(V5.0)值得你关注。该组件旨在为Java开发者提供类似于Python中Matplotlib的三维绘图功能,让Jav......
  • java虚拟机内存结构——类加载器,运行时数据区,执行引擎,本地方法接口。《深入理解JAVA虚
    ##类加载器类加载器当Java程序需要使用某个类时,类加载子系统负责找到对应的.class文件,并将其加载到JVM的方法区中每一个类加载器,都拥有一个独立的类名称空间。只有在这两个类是由同一个类加载器加载的前提下才有意义##运行时数据区###线程共享####堆:内......