package com.sp2p.action.front; import java.io.PrintWriter; import java.io.UnsupportedEncodingException; import java.math.BigDecimal; import java.net.URLDecoder; import java.net.URLEncoder; import java.sql.SQLException; import java.util.Date; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import javax.servlet.http.HttpServletResponse; import com.hehenian.biz.common.account.dataobject.AccountUserDo; import org.apache.commons.lang.StringUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.struts2.ServletActionContext; import com.shove.Convert; import com.shove.config.AlipayConfig; import com.shove.data.DataException; import com.shove.services.AlipayService; import com.shove.util.AlipayNotify; import com.shove.util.SqlInfusion; import com.shove.web.action.BasePageAction; import com.shove.web.util.ServletUtils; import com.sp2p.constants.IConstants; import com.sp2p.service.RechargeService; import com.sp2p.service.SelectedService; import com.sp2p.service.SendMessageService; import com.sp2p.service.UserService; import com.sp2p.service.admin.FundManagementService; import com.sp2p.util.DateUtil; public class OnlinePaymentAction extends BaseFrontAction{ private static Log log = LogFactory.getLog(OnlinePaymentAction.class); private RechargeService rechargeService; private String urlParam = "";// 接口拼接的参数 private SelectedService selectedService; private SendMessageService sendMessageService; private UserService userService; private FundManagementService fundManagementService; public FundManagementService getFundManagementService() { return fundManagementService; } public void setFundManagementService(FundManagementService fundManagementService) { this.fundManagementService = fundManagementService; } public SelectedService getSelectedService() { return selectedService; } public void setSelectedService(SelectedService selectedService) { this.selectedService = selectedService; } public SendMessageService getSendMessageService() { return sendMessageService; } public void setSendMessageService(SendMessageService sendMessageService) { this.sendMessageService = sendMessageService; } public String getUrlParam() { return urlParam; } public void setUrlParam(String urlParam) { this.urlParam = urlParam; } public RechargeService getRechargeService() { return rechargeService; } public void setRechargeService(RechargeService rechargeService) { this.rechargeService = rechargeService; } // 在线充值 public String alipayPayment() throws Exception { AccountUserDo user = (AccountUserDo) session().getAttribute(IConstants.SESSION_USER); String money = SqlInfusion.FilteSqlInfusion(request("money")); if (StringUtils.isBlank(money)) {// 判断是否为空 return INPUT; } BigDecimal moneyDecimal; try { moneyDecimal = new BigDecimal(money); } catch (RuntimeException e) { return INPUT; } int temp = moneyDecimal.compareTo(new BigDecimal("0.01"));// 最小金额为0.01元 if (temp < 0) { return INPUT; } long userId = user.getId(); // 生成订单 paramMap.put("rechargeMoney", moneyDecimal + ""); paramMap.put("userId", userId + ""); paramMap.put("result", "0"); paramMap.put("addTime", DateUtil.dateToString(new Date())); //ip地址 String ipAddress = ServletUtils.getRemortIp(); paramMap.put("ipAddress", ipAddress); Map<String,String> result = rechargeService.addRecharge(paramMap,2);//调用存储过程 int nunber = Convert.strToInt(result.get("result"),-1); if ( nunber!= -1) { Map<String, String> map = rechargeService .getRechargeDetail(nunber); String html = createUrl(map.get("rechargeNumber"), "在线充值", result + "_" + userId, moneyDecimal);// paymentId_orderId_userId:支付类型(在线支付/在线充值)_订单编号/_用户编号 this.response().setContentType("text/html"); response().setCharacterEncoding("utf-8"); PrintWriter out = response().getWriter(); out.println("<HTML>"); out.println(" <HEAD><TITLE>sender</TITLE></HEAD>"); out.println(" <BODY>"); out.print(html); out.println(" </BODY>"); out.println("</HTML>"); out.flush(); out.close(); return null; } else { createHelpMessage("支付失败!", "返回首页", "index.do"); return null; } } private String createUrl(String out_trade_no, String body, String extraCommonParam, BigDecimal money) throws Exception { log.info("12"); // 组装接口参数,并进行加密 Map<String, String> sPara = new HashMap<String, String>(); sPara.put("_input_charset", AlipayConfig.input_charset); sPara.put("subject", "桂林市合和年信贷充值编号:" + out_trade_no); sPara.put("total_fee", money.toString() + ""); sPara.put("service", "create_direct_pay_by_user"); sPara.put("notify_url", AlipayConfig.notify_url); sPara.put("partner", AlipayConfig.partner); sPara.put("seller_email", AlipayConfig.seller_email); sPara.put("out_trade_no", out_trade_no); sPara.put("payment_type", "1"); sPara.put("return_url", AlipayConfig.return_url); extraCommonParam = com.shove.security.Encrypt.encryptSES( extraCommonParam, AlipayConfig.ses_key); extraCommonParam = URLEncoder.encode(extraCommonParam, "utf-8"); sPara.put("extra_common_param", extraCommonParam); String html = AlipayService.create_direct_pay_by_user(sPara); return html; } // 回调方法:明 public String alipayReceive() throws Exception { log.info("alipayReceive"); Map<String, String> params = new HashMap<String, String>();// // trade_no订单流水号 // notify_time支付回调时间 Map requestParams = request().getParameterMap(); for (Iterator iter = requestParams.keySet().iterator(); iter.hasNext();) { String name = (String) iter.next(); String[] values = (String[]) requestParams.get(name); String valueStr = ""; for (int i = 0; i < values.length; i++) { valueStr = (i == values.length - 1) ? valueStr + values[i] : valueStr + values[i] + ","; } params.put(name, valueStr); } boolean verify_result = AlipayNotify.verify(params);// 验证参数是否是支付宝那边返回过来的。 if (!verify_result) { createHelpMessage("支付失败!", "返回首页", "index.do"); } String extra_common_param = request("extra_common_param");// 获得参数信息 // 支付类型_订单编号/金钱_用户编号 if (StringUtils.isBlank(extra_common_param)) { createHelpMessage("支付失败!", "返回首页", "index.do"); } extra_common_param = URLDecoder.decode(extra_common_param, "utf-8"); extra_common_param = com.shove.security.Encrypt.decryptSES( extra_common_param, AlipayConfig.ses_key); String[] extraCommonParam = extra_common_param.split("_"); if (extraCommonParam == null || extraCommonParam.length != 2) { // 通过"_"进行截取,判断是否符合规范 createHelpMessage("支付失败!", "返回首页", "index.do"); } String sellerEmail = SqlInfusion.FilteSqlInfusion(request("seller_email"));// 商户邮箱 if (!sellerEmail.equals(AlipayConfig.seller_email)) {// 比较商户邮箱看是否符合 createHelpMessage("支付失败!", "返回首页", "index.do"); } String paynumber = URLDecoder.decode(SqlInfusion.FilteSqlInfusion(request("trade_no")), "utf-8"); // 支付宝编号 String notify_time = URLDecoder.decode(SqlInfusion.FilteSqlInfusion(request("notify_time")), "utf-8");// 支付宝编号 String paybank = null;// 支付银行 if (StringUtils.isBlank(paybank)) {// 如果没有银行编号说明是支付宝直接支付的 paybank = "支付宝余额支付"; } String buyer_email = URLDecoder.decode(SqlInfusion.FilteSqlInfusion(request("buyer_email")), "utf-8");// 支付银行 String buyer_id = URLDecoder.decode(SqlInfusion.FilteSqlInfusion(request("buyer_id")), "utf-8");// 支付银行 Map<String, Object> map = new HashMap<String, Object>(); map.put("extraCommonParam", extraCommonParam); map.put("total_fee", new BigDecimal(SqlInfusion.FilteSqlInfusion(request("total_fee")))); map.put("paynumber", paynumber); map.put("bankName", paybank); map.put("buyer_email", buyer_email); map.put("buyer_id", buyer_id); map.put("notify_time", notify_time); int returnId =-1; try { returnId = rechargeService.userPay(map); } catch (SQLException e) { log.error(e); e.printStackTrace(); throw e; } catch (DataException e) { log.error(e); e.printStackTrace(); throw e; } HttpServletResponse httpServletResponse = ServletActionContext .getResponse(); httpServletResponse.setCharacterEncoding("utf-8"); PrintWriter pw = httpServletResponse.getWriter(); String msg = ""; if (returnId < 0) { pw.println("fail"); if (returnId == -1) { msg = "用户不存在"; } else if (returnId == -2) { msg = "支付号错误"; } else if (returnId == -3) { msg = "此笔支付记录已经被处理过"; } else if (returnId == -4) { msg = "充值金额与本地记录中的金额不一致"; } else if (returnId == -5) { msg = "充值金额错误"; } else if (returnId == -6) { msg = "支付详细不存在"; } else if (returnId == -7) { msg = "订单支付明细,状态修改失败。"; } else { msg = "操作错误!"; } createHelpMessage(msg, "返回首页", "index.do"); }else{ //根据用户的通知设置,进行邮件、短信、站内信的通知 Long userId = Convert.strToLong(extraCommonParam[1], -1);// 获得用户编号 sendMessage(userId,Convert.strToDouble(request("total_fee"),0),0); //------------------ } msg = "交易成功!"; pw.println("success"); createHelpMessage(msg + "", "返回首页", "index.do"); return "message"; } private void sendMessage(Long userId,double total,double money) throws SQLException, DataException, UnsupportedEncodingException{ try{ String title = "资金变动提醒"; //查找通知类型的通知状态 List<Map<String,Object>> lists = selectedService.queryNoticeMode(userId, IConstants.NOTICE_MODE_4); if(lists != null && lists.size()>0 ){ String content = "你已成功从桂林市合和年信贷充值¥" +total+"元,扣除手续费后到账金额为¥"+money+"元,请注意查收!"; //[通知方式(1 邮件 2 站内信 3 短信] if(lists.get(0).get("flag").toString().equals(String.valueOf(IConstants.NOTICE_ON))){ sendMessageService.emailSend(title, content, userId); } if(lists.get(1).get("flag").toString().equals(String.valueOf(IConstants.NOTICE_ON))){ sendMessageService.mailSend(title, content, userId); } if(lists.get(2).get("flag").toString().equals(String.valueOf(IConstants.NOTICE_ON))){ Map<String,String> userMap = userService.queryUserById(userId); if(userMap != null){ Long result = sendMessageService.noteSend(content, userId); }else{ if(money > IConstants.NOTE_CHARGE){ Long result = sendMessageService.noteSend(content, userId); if(result > 0){//信息发送成功,更新资金记录表 Long result2 = fundManagementService.updateFundrecord(userId,IConstants.NOTE_CHARGE,IConstants.WITHDRAW); if(result2 > 0){ Map<String,String> uMap = userService.queryUserById(userId); Map<String,String> map = new HashMap<String,String>(); map.put("handleSum", String.valueOf(IConstants.NOTE_CHARGE)); map.put("usableSum", uMap.get("usableSum")); map.put("freezeSum", uMap.get("freezeSum")); map.put("dueinSum", uMap.get("dueinSum")); map.put("dueOutSum", uMap.get("dueOutSum")); map.put("fundMode", "扣除短信服务费"); map.put("remarks", "扣除短信服务费"); fundManagementService.addFundRecord(userId,map); } } } } } } }catch(SQLException e){ log.error(e); e.printStackTrace(); throw e; }catch(DataException e){ log.error(e); e.printStackTrace(); throw e; } } // 回调方法:暗 public String alipayNotify() throws Exception { log.info("alipayNotify"); return alipayReceive(); } public String alipayNotify_back() throws Exception { log.info("alipayNotify_back"); return alipayNotify_back(); } public UserService getUserService() { return userService; } public void setUserService(UserService userService) { this.userService = userService; } }