package com.shove.web.action; 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.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.Enumeration; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; import java.util.SortedMap; import java.util.TreeMap; import javax.servlet.http.HttpServletRequest; 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.config.AllinpayConfig; import com.shove.config.GopayConfig; import com.shove.config.TenPayConfig; import com.shove.data.DataException; import com.shove.security.Encrypt; import com.shove.services.AlipayService; import com.shove.util.AlipayNotify; import com.shove.util.FormUtil; import com.shove.web.util.ServletUtils; import com.sp2p.action.front.BaseFrontAction; 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 TenPaymentAction extends BaseFrontAction { private static final long serialVersionUID = 1L; private static Log log = LogFactory.getLog(TenPaymentAction.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; } private static SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss"); 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; } /** * 财付通支付 * * @return * @throws Exception */ public String tenPayment() throws Exception { AccountUserDo user = (AccountUserDo) session().getAttribute(IConstants.SESSION_USER); String money = 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; } String bankType = request("bank_type"); long userId = this.getUserId(); // 生成订单 paramMap.put("rechargeMoney", moneyDecimal + ""); paramMap.put("userId", userId + ""); paramMap.put("result", "0"); Date date = new Date(); paramMap.put("addTime", DateUtil.dateToString(date)); Map<String, String> result = rechargeService.addRecharge(paramMap, 3); long nunber = Convert.strToInt(result.get("result"), -1); if (nunber != -1) { String html = createTenUrl(nunber+"", "在线充值", moneyDecimal, userId+"", bankType); sendHtml(html); return null; } else { createHelpMessage("支付失败!", "返回首页", "index.do"); return null; } } public String createTenUrl(String out_trade_no, String body, BigDecimal money, String attach, String bankType) throws Exception { long lmoney = (long) (money.doubleValue() * 100); Map<String, String> paraMap = new HashMap<String, String>(); paraMap.put("body", body); paraMap.put("bank_type", bankType); paraMap.put("service_version", "1.0"); paraMap.put("sign_type", "MD5"); paraMap.put("input_charset", "utf-8"); paraMap.put("notify_url", TenPayConfig.tenpay_online_notifyReceiver); paraMap.put("return_url", TenPayConfig.tenpay_online_callBack); paraMap.put("fee_type", "1"); paraMap.put("partner", TenPayConfig.tenpay_online_bargainor_id); paraMap.put("total_fee", lmoney + ""); paraMap.put("out_trade_no", out_trade_no); paraMap.put("spbill_create_ip", request().getRemoteAddr()); attach = com.shove.security.Encrypt.encryptSES(attach, AlipayConfig.ses_key); paraMap.put("attach", attach); String sign = createSign(paraMap); paraMap.put("sign", sign); return FormUtil.buildHtmlForm(paraMap, TenPayConfig.tenpay_online_reqUrl, "post"); } protected String createSign(Map<String, String> para) { Map<String, String> parameters = new TreeMap<String, String>(para); StringBuffer sb = new StringBuffer(); Set es = parameters.entrySet(); Iterator it = es.iterator(); while (it.hasNext()) { Map.Entry entry = (Map.Entry) it.next(); String k = (String) entry.getKey(); String v = (String) entry.getValue(); if (null != v && !"".equals(v) && !"sign".equals(k) && !"key".equals(k)) { sb.append(k + "=" + v + "&"); } } sb.append("key=" + TenPayConfig.tenpay_online_key); String sign = Encrypt.MD5(sb.toString(), "UTF-8").toLowerCase(); return sign; // debug信息 } public boolean isTenpaySign(Map<String, String> paraMap) { StringBuffer sb = new StringBuffer(); Map<String, String> parameters = new TreeMap<String, String>(paraMap); Set es = parameters.entrySet(); Iterator it = es.iterator(); while (it.hasNext()) { Map.Entry entry = (Map.Entry) it.next(); String k = (String) entry.getKey(); String v = (String) entry.getValue(); if (!"sign".equals(k) && null != v && !"".equals(v)) { sb.append(k + "=" + v + "&"); } } sb.append("key=" + TenPayConfig.tenpay_online_key); String sign = Encrypt.MD5(sb.toString(), "UTF-8").toLowerCase(); String tenpaySign = parameters.get("sign").toLowerCase(); return tenpaySign.equals(sign); } public String tenPayReceive() throws Exception { log.info("----tenPayReceive"); // 密钥 String key = TenPayConfig.tenpay_online_key; Map<String, String> para = new TreeMap<String, String>(); Enumeration<String> keys = request().getParameterNames(); while (keys.hasMoreElements()) { String paraName = keys.nextElement(); para.put(paraName, request(paraName)); } // 判断签名 if (isTenpaySign(para)) { log.info("--tenpay--2--"); if (!"0".equals(request("trade_state"))) { createHelpMessage("支付失败!", "返回首页", "index.do"); } // String paynumber = request(""); // log.info("--tenpay--3--"); String paybank = TenPayConfig.bankMap.get(request("bank_type"));// 支付银行 if (StringUtils.isBlank(paybank)) {// paybank = "财付通支付"; } // String buyer_email = URLDecoder.decode(request("buyer_email"), // "utf-8");// 支付银行 // String buyer_id = URLDecoder.decode(request("buyer_id"), // "utf-8");// 支付银行 // Map<String, Object> map = new HashMap<String, Object>(); // map.put("extraCommonParam", extraCommonParam); // map.put("total_fee", new BigDecimal(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); String attach = request("attach"); double money = Convert.strToDouble(request("total_fee"), 0); String in_paynumber = request("out_trade_no"); long userId = Convert.strToLong(Encrypt.decryptSES(attach, GopayConfig.gopay_see_key), -1); Map<String, String> resultMap = rechargeService.addUseraddmoney(userId, money, in_paynumber, paybank); String result = resultMap.get("result"); String description = resultMap.get("description"); HttpServletResponse httpServletResponse = ServletActionContext .getResponse(); httpServletResponse.setCharacterEncoding("utf-8"); PrintWriter pw = httpServletResponse.getWriter(); String msg = description; if (!"0".endsWith(result)) { log.info("6--"); pw.println("fail"); createHelpMessage(msg, "返回首页", "index.do"); } msg = "充值成功"; pw.println("success"); log.info("7--"); createHelpMessage(msg + "", "返回首页", "index.do"); return "message"; } else { createHelpMessage("充值失败", "返回首页", "index.do"); } return "message"; } // 暗调 public String tenPayNotify() throws Exception { log.info("----tenPayNotify"); Map<String, String> rechargeMap = null; try { tenPayReceive(); } catch (Exception e) { } finally { String extra_common_param = request("attach");// 获得参数信息 // 支付类型_订单编号/金钱_用户编号 if (StringUtils.isBlank(extra_common_param)) { response().getWriter().write("fail"); log.info("--pay fail"); } 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) { response().getWriter().write("fail"); log.info("--pay fail"); } rechargeMap = rechargeService.getRechargeDetail(Convert.strToLong( extraCommonParam[0], -1)); if (rechargeMap != null) { if ("1".equals(rechargeMap.get("result"))) { response().getWriter().write("success"); log.info("--pay success"); } else { response().getWriter().write("fail"); log.info("---pay fail"); } } else { response().getWriter().write("fail"); log.info("--pay fail"); } } return null; } /** * 取出一个指定长度大小的随机正整数. * * @param length * int 设定所取出随机数的长度。length小于11 * @return int 返回生成的随机数。 */ public static int buildRandom(int length) { int num = 1; double random = Math.random(); if (random < 0.1) { random = random + 0.1; } for (int i = 0; i < length; i++) { num = num * 10; } return (int) ((random * num)); } public UserService getUserService() { return userService; } public void setUserService(UserService userService) { this.userService = userService; } }