沙箱环境
url: https://sandbox.nuonuocs.cn/open/v1/services appKey: SD63236305 appSecret: SDDED2523BED4643
第一,首先进入诺诺官网,完成注册登录。
第二,点击文档中心->开发者文档,点击常用工具->进入SDK中心引入依赖。
第三,点击文档中心->API文档,点击发票查询->点击开票结果查询接口
第四,完成InvoiceTokenController的编写->开发票
@PostMapping("addInvoice1") // 对接诺诺的开票接口 public String makeInvoice(@RequestParam String orderNos){ String method = "nuonuo.ElectronInvoice.requestBillingNew"; // 沙箱环境下token可以为空 String token = ""; String content = "{\"order\":" // 发票明细 + "{\"invoiceDetail\":[" + "{" // 税率 + "\"taxRate\":\"" + InvoiceConstants.TAX_RATE + "\"," // 发票行性质:0,正常行;1,折扣行;2,被折扣行 + "\"invoiceLineProperty\":\"" + InvoiceConstants.INVOICE_LINE_PROPERTY+ "\"," + "\"selfCode\":\"" + "服务" + "\"," //服务名 + "\"listName\":\"" + "企业" + "\"," //产品类型 + "\"specType\":\"" + InvoiceConstants.SPEC_TYPE + "\"," // 商品名 + "\"goodsName\":\"" + "水费"+ "\"," + "\"goodsCode\":\"" + "3040801"+ "\"," // 不含税金额 + "\"taxExcludedAmount\":\"" + 1 + "\"," // 单价含税标志 0 不含税 1 含税 + "\"withTaxFlag\":\"" + InvoiceConstants.WITH_TAX_FLAG + "\"," // 数量 + "\"num\":\"" + 1 + "\"," // 税额 [不含税金额] * [税率] = [税额] + "\"tax\":\"" + InvoiceConstants.TAX + "\"," // 单位 + "\"unit\":\"" + "无锡极客" + "\"," // 扣除额,差额征税时填写 + "\"deduction\":\"" + 0 + "\"," // 单价(精确到小数点后8位) + "\"price\":\"" + 1 + "\"}]," // 购方名称 Y + "\"buyerName\":\"" + "无锡极客信息技术有限公司" + "\"," // 购方地址 N + "\"buyerAddress\":\"" + "江苏省无锡市新吴区无锡极客营" + "\"," // 购方税号(企业要填,个人可为空) N + "\"buyerTaxNum\":\"" + "1111111111" + "\"," // 开票类型:1:蓝票;2:红票 + "\"invoiceType\":\"" + InvoiceConstants.INVOICE_TYPE + "\"," // 发票种类 + "\"invoiceLine\":\"" + InvoiceConstants.INVOICE_LINE + "\"," // 清单标志:非清单:0;清单:1,默认:0,电票固定为0 + "\"listFlag\":\"" + InvoiceConstants.LIST_FLAG + "\"," // 推送方式:-1,不推送;0,邮箱;1,手机(默认);2,邮箱、手机 + "\"pushMode\":\"" + InvoiceConstants.PUSH_MODE + "\"," // 购方手机(开票成功会短信提醒购方,不受推送方式影响) Y + "\"buyerPhone\":\"" + "****" + "\"," // 邮箱地址,沙箱环境也可以发送 + "\"email\":\"" + "1234@qq.com" + "\"," // 开票员id(诺诺系统中的id) N + "\"clerkId\":\"" + "1" + "\"," + "\"payer\":\"" + "aaa" + "\"," // 销售方银行账号和开户行地址 + "\"salerAccount\":\"" + InvoiceConstants.TEST_SALER_ACCOUNT + "\"," + "\"salerAddress\":\"" + InvoiceConstants.TEST_SALER_ADDRESS + "\"," // 订单号(每个企业唯一) Y + "\"orderNo\":\"" + orderNos + "\"," // 销方电话 + "\"salerTelr\":\"" + InvoiceConstants.TEST_SALER_TEL + "\"," // 订单时间 Y + "\"invoiceDate\":\"" + "2016-01-13 12:30:00" + "\"," // 开票员 Y + "\"clerk\":\"" + "张三" + "\"," //复核 + "\"checker\":\"" + "张三" + "\"," //收款人 + "\"payee\":\"" + "张三" + "\"," // 分机号(只能为空或者数字) + "\"extensionNumber\":\"" + "0" + "\"," // 销方税号 + "\"salerTaxNum\":\"" + "339901999999142" + "\""+ "}}"; String senid = UUID.randomUUID().toString().replace("-", ""); // 唯一标识,由企业自己生成32位随机码 // 接口调用 NNOpenSDK sdk = NNOpenSDK.getIntance(); String result = sdk.sendPostSyncRequest(InvoiceConstants.TEST_URL, senid, InvoiceConstants.TEST_APP_KEY, InvoiceConstants.TEST_APP_SECRET, token, InvoiceConstants.TEST_SALER_TAX_NUM,InvoiceConstants.APPLY_METHOD, content); return result; }
查询发票
@GetMapping("selectInvoice" )//orderNos 订单编号 serialNos 发票流水号 public String selectInvoice(@RequestParam String orderNos,String serialNos) { //是否需要提供明细 String isOfferInvoiceDetail = "1"; NNOpenSDK sdk = NNOpenSDK.getIntance(); String token = ""; String content ="{" + "isOfferInvoiceDetail:" + isOfferInvoiceDetail + "," + "orderNos:" + orderNos + "," + "serialNos:" + serialNos +"}"; System.out.println(content); String senid = UUID.randomUUID().toString().replace("-", ""); //查询发票/ 参数/ 沙箱请求地址 senid/ appKey【消息体】 授权码【消息头】 token 查询发票的API方法名 String result = sdk.sendPostSyncRequest(InvoiceConstants.TEST_URL, senid, InvoiceConstants.TEST_APP_KEY, InvoiceConstants.TEST_APP_SECRET, token, InvoiceConstants.TAX_NUM, InvoiceConstants.APPLY_METHOD1, content); return result; }
第五,在apifox上面完成测试