private String getTradeNoByOutTradeNo(String outTradeNo, BigDecimal refundMoney) { StringBuffer result = new StringBuffer(); URL U = null; BufferedReader in = null; String tradeNo = null; String sign = null; Map<String, String> sParaTemp = new HashMap(); sParaTemp.put("out_trade_no", outTradeNo); sParaTemp.put("trade_no", null); sParaTemp.put("service", "single_trade_query"); sParaTemp.put("partner", AlipayConfig.partner); sParaTemp.put("_input_charset", AlipayConfig.input_charset); Map<String, String> sPara = AlipayCore.paraFilter(sParaTemp); // 生成签名结果 sign = AlipayCore.buildMysign(sPara); try { // String url = "https://www.alipay.com/cooperate/gateway.do?" + String url = AlipayService.ALIPAY_GATEWAY_NEW + "_input_charset=utf-8" + "&sign=" + sign + "&_input_charset=utf-8" + "&sign_type=MD5" + "&service=single_trade_query" + "&partner=" + AlipayConfig.partner + "&out_trade_no=" + outTradeNo; U = new URL(url); URLConnection connection = U.openConnection(); connection.connect(); in = new BufferedReader(new InputStreamReader(connection.getInputStream())); String line; while ((line = in.readLine()) != null) { result.append(line); // System.out.println("-------------------\n" + new String(line.getBytes("gbk"), "utf-8")); } StringReader sr = new StringReader(new String(result.toString().getBytes("gbk"), "utf-8")); BufferedReader br = new BufferedReader(sr); try { JAXBContext jaxbContext = JAXBContext.newInstance("net.shopin.alipay.entity"); Unmarshaller unMarshaller = jaxbContext.createUnmarshaller(); SchemaFactory schemaFactory = SchemaFactory.newInstance("http://www.w3.org/2001/XMLSchema"); Schema schema = schemaFactory.newSchema( new File( PropertiesUtil.getProperties( "alipay.schema.refundfastpay.path", "E:/上品/支付宝批量退货/java/refund_fastpay_by_platform_nopwd_jsp_utf8/src/net/shopin/alipay/entity/singleTradeQuery.xsd"))); unMarshaller.setSchema(schema); Alipay alipay = (Alipay) unMarshaller.unmarshal(U); if (alipay.getIsSuccess().equals("T")) { // tradeNo = alipay.getResponse().get(0).getTrade().get(0).getTradeNo(); tradeNo = alipay.getResponse().getTrade().getTradeNo(); // 校验是否超过三个月 // 校验Money BigDecimal totalFee = new BigDecimal(alipay.getResponse().getTrade().getTotalFee()); // 总金额 BigDecimal toBuyerFee = new BigDecimal( StringUtils.isNotEmpty(alipay.getResponse().getTrade().getToBuyerFee()) ? alipay.getResponse().getTrade().getToBuyerFee() : "0"); // 退款金额 BigDecimal leftMoney = totalFee.subtract(toBuyerFee); if (leftMoney.compareTo(refundMoney) == -1) { // 剩下的钱小于退款金额 tradeNo = PropertiesUtil.getProperties( "alipay.interface.returncode.outoftotalfee", "OUTOFTOTALFEE") + tradeNo; } } return tradeNo; } catch (JAXBException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (SAXException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (RuntimeException e) { // TODO Auto-generated catch block e.printStackTrace(); } finally { // br.close(); } } catch (MalformedURLException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } finally { try { in.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } return null; }
@Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // 转发处理 StringBuffer json = new StringBuffer(); String methodCall = req.getParameter("methodCall"); if (methodCall.equals("getResultDetailByBatchNo")) { // 通过原来的批量退款批次号获取退款详情 if (req.getParameter("batchNo") == null) { json.append("{success:false,msg:'参数[原批量退款批次号]不能为空'}"); } else { Map resultDetails = refundFastpayService.getResultDetailByBatchNo(req.getParameter("batchNo")); if (CollectionUtils.isEmpty(resultDetails)) { json.append( "{success:false,msg:'原批量退款批次号为:" + req.getParameter("batchNo") + "的批量退款信息不存在'}"); } else { json.append("{success:true,data:{"); json.append("batchNo:'" + resultDetails.get("batchNo") + "',"); json.append("batchNum:'" + resultDetails.get("batchNum") + "',"); json.append("batchData:'" + resultDetails.get("batchData") + "',"); json.append( "refundDate:'" + DateUtil.formatDate( (Date) resultDetails.get("refundDate"), "yyyy-MM-dd HH:mm:ss") + "',"); json.append("isSuccess:'" + resultDetails.get("isSuccess") + "',"); json.append( "successNum:'" + (resultDetails.get("successNum") != null ? resultDetails.get("successNum") : "") + "',"); json.append( "resultDetails:'" + (resultDetails.get("resultDetails") != null ? resultDetails.get("resultDetails") : "") + "',"); json.append( "relation:'" + (resultDetails.get("relation") != null ? resultDetails.get("relation") : "") + "',"); json.append( "totalRefund:'" + (resultDetails.get("totalRefund") != null ? resultDetails.get("totalRefund") : "") + "'"); json.append("},msg:'获取原批量退款批次号为:" + req.getParameter("batchNo") + "的批量退款信息成功!'}"); } } resp.setContentType("text/html;charset=utf-8"); resp.getWriter().write(json.toString()); resp.getWriter().close(); return; } else if (methodCall.equals("batchRefundImport")) { // 批量退款导入 // 解析文件 String realPath = null; String filePath = null; Result result = null; try { DiskFileItemFactory factory = new DiskFileItemFactory(); boolean isMutipart = ServletFileUpload.isMultipartContent(req); if (isMutipart) { ServletFileUpload upload = new ServletFileUpload(factory); List fileItems = upload.parseRequest(req); Iterator iterator = fileItems.iterator(); while (iterator.hasNext()) { FileItem fi = (FileItem) iterator.next(); if (!fi.isFormField()) { String fileName = fi.getName(); if (fileName == null || "".equals(fileName)) break; String suffix = fileName.substring(fileName.lastIndexOf(".")); String systemFileName = "upload-" + System.currentTimeMillis() + suffix; filePath = PropertiesUtil.getProperties("fileUploadPath", "D:/data/upload/") + systemFileName; // realPath = req.getSession().getServletContext().getRealPath("/") + filePath; realPath = filePath; try { File uploadedFile = new File(realPath); fi.write(uploadedFile); result = processRefundFastpayExcel(realPath); if (!result.isSuccess()) { // 失败 RequestDispatcher rd = req.getRequestDispatcher("/refund/result.jsp"); req.setAttribute("result", result); rd.forward(req, resp); } else { // 成功 req.getSession(true).setAttribute("result", result); resp.sendRedirect(req.getContextPath() + "/refund/success.jsp"); } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } } } } catch (FileUploadException e) { // TODO Auto-generated catch block e.printStackTrace(); } } else if (methodCall.equals("batchRefundApply")) { // 批量退款申请 // 解析文件 String realPath = null; String filePath = null; Result result = null; String applyUser = null; String applyRemark = null; try { DiskFileItemFactory factory = new DiskFileItemFactory(); boolean isMutipart = ServletFileUpload.isMultipartContent(req); if (isMutipart) { ServletFileUpload upload = new ServletFileUpload(factory); List fileItems = upload.parseRequest(req); Iterator iterator = fileItems.iterator(); while (iterator.hasNext()) { FileItem fi = (FileItem) iterator.next(); if (!fi.isFormField()) { String fileName = fi.getName(); if (fileName == null || "".equals(fileName)) break; String suffix = fileName.substring(fileName.lastIndexOf(".")); String systemFileName = "upload-" + System.currentTimeMillis() + suffix; filePath = PropertiesUtil.getProperties("fileUploadPath", "D:/data/upload/") + systemFileName; // realPath = req.getSession().getServletContext().getRealPath("/") + filePath; realPath = filePath; File uploadedFile = new File(realPath); fi.write(uploadedFile); } else { String name = fi.getFieldName(); String value = fi.getString(); // 在enctype="multipart/form-data") 情况下,form表单的数据通过流传递,且在Tomcat服务器下,默认使用ISO-8859-1编码 value = new String(value.getBytes("ISO-8859-1"), "UTF-8"); if (name.equals("applyUser")) { applyUser = value; } if (name.equals("applyRemark")) { applyRemark = value; } } } try { // 简单校验,提交申请applyId为null result = processRefundFastpayApplyExcel(realPath, true, null, applyUser, applyRemark); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } } catch (FileUploadException e) { result.setMsg("附件上传失败导致申请失败!"); } catch (Exception e) { result.setMsg("服务器端异常导致申请失败!"); } if (!result.isSuccess()) { // 失败 RequestDispatcher rd = req.getRequestDispatcher("/refund/result.jsp"); req.setAttribute("result", result); rd.forward(req, resp); } else { // 成功 req.getSession(true).setAttribute("result", result); resp.sendRedirect(req.getContextPath() + "/refund/success.jsp"); } } else if (methodCall.equals("searchRefundFastpayApplyList")) { // 查询申请列表 int currentPage = Integer.valueOf(req.getParameter("currentPage").toString()); int startRecord = currentPage == 1 ? 0 : ((currentPage - 1) * Integer.valueOf(req.getParameter("pageSize").toString())); int totalPage = 0; if (req.getParameter("flag").toString().equals("0")) { startRecord = 0; } Map resultDetails = refundFastpayService.searchRefundFastpayApplyList( req.getParameter("startDate").toString(), req.getParameter("endDate").toString(), Integer.valueOf(req.getParameter("applyStatus").toString()), req.getParameter("applyUser").toString(), Boolean.valueOf(req.getParameter("isSignUser")), startRecord, Integer.valueOf(req.getParameter("pageSize").toString())); for (Map map : ((List<Map>) resultDetails.get("data"))) { json.append("{'id':'"); json.append(map.get("id")).append("','applyNo':'"); json.append(map.get("applyNo")).append("','batchNo':'"); json.append(map.get("batchNo")).append("','filepath':'"); json.append(map.get("filepath")).append("','applyStatus':'"); json.append(map.get("applyStatus")).append("','applyUser':'******','applyTime':'"); json.append(map.get("applyTime")).append("','applyRemark':'"); json.append(map.get("applyRemark")).append("','auditUser':'******','auditTime':'"); json.append(map.get("auditTime")).append("','auditRemark':'"); json.append(map.get("auditRemark")).append("','importUser':'******','importTime':'"); json.append(map.get("importTime")).append("','importRemark':'"); json.append(map.get("importRemark")).append("'"); json.append("},"); } if (json.toString().endsWith(",")) { json = new StringBuffer(json.substring(0, json.length() - 1)); } totalPage = (Integer.valueOf(resultDetails.get("rowCount").toString()) == 0 ? 1 : (Integer.valueOf(resultDetails.get("rowCount").toString()) + Integer.valueOf(req.getParameter("pageSize").toString()) - 1) / Integer.valueOf(req.getParameter("pageSize").toString())); json = new StringBuffer( "{success: true,rowCount:'" + resultDetails.get("rowCount") + "',data:[" + json + "],currentPage:'" + currentPage + "',totalPage:'" + totalPage + "'}"); resp.setContentType("text/html;charset=utf-8"); resp.getWriter().write(json.toString()); resp.getWriter().close(); return; } else if (methodCall.equals("auditRefundFastpayApply")) { // 审批 Result result = null; result = refundFastpayService.auditRefundFastpay( req.getParameter("applyId"), req.getParameter("auditUser"), // new String(req.getParameter("auditRemark").getBytes("iso-8859-1"), "UTF-8"), // req.getParameter("auditRemark"), HttpUtil.ConverUnicode(req.getParameter("auditRemark")), // reuncode Integer.valueOf(req.getParameter("applyStatus").toLowerCase())); if (result.isSuccess()) { json.append("{success:true}"); } else { json.append("{success:false, msg:'" + result.getMsg() + "'}"); } resp.setContentType("text/html;charset=utf-8"); resp.getWriter().write(json.toString()); resp.getWriter().close(); return; } else if (methodCall.equals("importRefundFastpayApply")) { // 导入 Result result = null; // 简单校验,提交申请applyId为null result = processRefundFastpayApplyExcel( null, false, req.getParameter("applyId"), req.getParameter("importUser"), // req.getParameter("importRemark") HttpUtil.ConverUnicode(req.getParameter("importRemark"))); if (result.isSuccess()) { json.append("{success:true}"); } else { json.append("{success:false, msg:'" + result.getMsg() + "'}"); } resp.setContentType("text/html;charset=utf-8"); resp.getWriter().write(json.toString()); resp.getWriter().close(); return; } else if (methodCall.equals("downloadFile")) { // 下载 Map map = refundFastpayService.getApplyDetailByBatchNo(req.getParameter("applyId")); String filePath = map.get("filepath").toString(); File dbFile = new File(filePath); FileInputStream fileIn = null; fileIn = new FileInputStream(dbFile); String contentType; contentType = "application/x-xls"; resp.setContentType(contentType); resp.setHeader( "Content-Disposition", "filename=" + filePath.substring(filePath.indexOf("upload-"))); byte[] buffer = new byte[1024 * 512]; while (true) { int bytes = fileIn.read(buffer); if (bytes == -1) { break; } resp.getOutputStream().write(buffer, 0, bytes); } resp.getOutputStream().flush(); resp.getOutputStream().close(); fileIn.close(); return; } /*else if(methodCall.equals("test")){ test(); }*/ }
private Result processRefundFastpayExcel(String realPath) { // TODO Auto-generated method stub Set<String> repetFilter = new HashSet(); // 过滤重复 Workbook book = null; StringBuffer msg = new StringBuffer(); Result result = new Result(); // 2011112421847473^0.01^NOT_THIS_PARTNERS_TRAD int batchNum = 0; StringBuffer batchData = new StringBuffer(); StringBuffer relation = new StringBuffer(); BigDecimal totalRefund = new BigDecimal(0); // 退款总金额 boolean hasError = false; try { try { book = Workbook.getWorkbook(new File(realPath)); } catch (BiffException e) { e.printStackTrace(); result.setMsg("导入文件读取失败,请重新导入或者联系开发人员!<br>"); return result; } catch (IOException e) { e.printStackTrace(); result.setMsg("导入文件读取失败,请重新导入或者联系开发人员!<br>"); return result; } Sheet sheet = book.getSheet(0); int count = sheet.getRows(); // 生成批量退款笔数及退款数据集 if (count <= 2) { // 没有数据 result.setMsg("没有数据!"); return result; } else if (count >= (Integer.valueOf(PropertiesUtil.getProperties("alipay.batchNumLimit", "1000")) .intValue() + 2)) { // 超出最大笔数 result.setMsg( "支付宝即时到账批量退款,最大支持" + PropertiesUtil.getProperties("alipay.batchNumLimit", "1000") + "笔!"); return result; } else { // 校验合法性 for (int i = 1; i < count - 1; i++) { // 最后一行是合计 Cell[] cells = sheet.getRow(i); String outTradeNo = cells[Integer.valueOf(PropertiesUtil.getProperties("outTradeNOIndex", "0"))] .getContents() .trim(); if (!repetFilter.contains(outTradeNo)) { repetFilter.add(outTradeNo); } else { msg.append( "EXCEL第" + i + "行(不包含表头部分)数据-单品订单号[" + outTradeNo + "]在导入文件的前面部分已经出现请合并为一条退款记录!<br/>"); hasError = true; } // 校验money String totalFee = cells[Integer.valueOf(PropertiesUtil.getProperties("totalFeeIndex", "0"))] .getContents() .trim(); totalRefund = totalRefund.add(new BigDecimal(totalFee)); String tradeNo = getTradeNoByOutTradeNo(outTradeNo, new BigDecimal(totalFee)); // 校验tradeNo逻辑 if (tradeNo == null) { msg.append("EXCEL第" + i + "行(不包含表头部分)数据-单品订单号[" + outTradeNo + "]获取支付宝交易号失败!<br/>"); hasError = true; } else if (tradeNo.indexOf( PropertiesUtil.getProperties( "alipay.interface.returncode.outoftotalfee", "OUTOFTOTALFEE")) == 0) { msg.append("EXCEL第" + i + "行(不包含表头部分)数据-单品订单号[" + outTradeNo + "]退款总金额大于当前可退款金额!<br/>"); hasError = true; } else { // 拼接relation (商家订单号1^支付宝交易号1#商家订单号2^支付宝交易号2) relation.append(outTradeNo).append("^").append(tradeNo); if (i < count - 2) { relation.append("#"); } } String remark = PropertiesUtil.getProperties("refundRemark", "上品折扣支付宝退款"); // 处理逻辑 batchNum++; batchData.append(tradeNo + "^" + totalFee + "^" + remark); if (i < count - 2) { batchData.append("#"); } } } if (hasError) { result.setMsg(msg.toString()); return result; } result = refundFastpayService.processRefundFastpayExcel( batchNum, batchData.toString(), realPath, relation.toString(), totalRefund); } catch (RuntimeException e) { e.printStackTrace(); result.setMsg("服务端异常,导致导入文件读取失败,请联系开发人员!<br>" + e.getMessage()); } finally { book.close(); } return result; }