package com.shove.web.action;
import java.io.PrintWriter;
import java.math.BigDecimal;
import java.net.URLDecoder;
import java.util.Date;
import java.util.HashMap;
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.GopayConfig;
import com.shove.security.Encrypt;
import com.shove.util.FormUtil;
import com.shove.web.util.GopayUtils;
import com.sp2p.constants.IConstants;
import com.sp2p.service.RechargeDetailService;
import com.sp2p.service.RechargeService;
import com.sp2p.service.UserService;
import com.sp2p.system.exception.FrontHelpMessageException;
import com.sp2p.util.DateUtil;
/**
* 汇付天下在线充值
*
* @author Administrator
*
*/
@SuppressWarnings({ "serial", "unchecked" })
public class GoPaymentAction extends BasePageAction {
private static Log log = LogFactory.getLog(GoPaymentAction.class);
private UserService userService;
private RechargeDetailService rechargeDetailService;
private RechargeService rechargeService;
private String urlParam = "";// 接口拼接的参数
// 在线充值
public String gopayPayment() throws Exception {
AccountUserDo user = (AccountUserDo) session(IConstants.SESSION_USER);
if (user == null) {// 未登陆
return IConstants.ADMIN_AJAX_LOGIN;
}
String bankCode = request("bankCode");
String money = request("money");
if (StringUtils.isBlank(money)) {// 判断是否为空
return INPUT;
}
BigDecimal moneyDecimal = null;
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 = 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 = createGopayUrl("在线充值", nunber, userId, bankCode,
DateUtil.YYYYMMDD.format(date), moneyDecimal);// paymentId_orderId_userId:支付类型(在线支付/在线充值)_订单编号/_用户编号
sendHtml(html);
return null;
} else {
createHelpMessage("支付失败!" + result.get("description"), "返回首页",
"index.do");
return null;
}
}
/**
* 跳转拦截
*
* @param title
* @param msg
* @param url
* @throws FrontHelpMessageException
*/
public void createHelpMessage(String title, String msg, String url)
throws FrontHelpMessageException {
/* helpMessage.setTitle("用户不存在"); */
helpMessage.setMsg(new String[] { "返回首页" });
helpMessage.setUrl(new String[] { "index" });
helpMessage.setTitle(title);
/*
* helpMessage.setMsg(new String[]{msg}); helpMessage.setUrl(new
* String[]{url});
*/
throw new FrontHelpMessageException();
}
private String createGopayUrl(String body, long recharId, long userId,
String bankCode, String tranDateTime, BigDecimal money)
throws Exception {
log.info("12");
// 组装接口参数,并进行加密
String version = GopayConfig.gopay_version;
String charset = GopayConfig.gopay_input_charset;
String language = "";
String signType = GopayConfig.gopay_signtype;
// 交易代码
String tranCode = GopayConfig.gopay_tranCode;
String merchantID = GopayConfig.gopay_merchantID;
String merOrderNum = recharId + ""; // 订单号 ---- 支付流水号
String tranAmt = money + "";
String feeAmt = "0";
String frontMerUrl = GopayConfig.gopay_frontMerUrl;
String backgroundMerUrl = GopayConfig.gopay_backgroundMerUrl;
String tranIP = GopayUtils.getIpAddr(request());
String verficationCode = GopayConfig.gopay_verficationCode;
String gopayServerTime = GopayUtils.getGopayServerTime();
Map<String, String> map = new HashMap<String, String>();
map.put("version", version);
map.put("charset", "2");
map.put("language", "1");
map.put("signType", "1");
map.put("tranCode", tranCode);
map.put("merchantID", merchantID);
map.put("merOrderNum", merOrderNum);
map.put("tranAmt", tranAmt);
map.put("feeAmt", feeAmt);
map.put("tranDateTime", tranDateTime);
map.put("frontMerUrl", frontMerUrl);
map.put("backgroundMerUrl", backgroundMerUrl);
map.put("currencyType", "156");
map.put("virCardNoIn", GopayConfig.gopay_virCardNoIn);
if (!"DEFAULT".equals(bankCode)) {
map.put("bankCode", bankCode);
map.put("userType", "1");
} else {
map.put("bankCode", bankCode);
}
map.put("orderId", "");
map.put("gopayOutOrderId", "");
map.put("tranIP", tranIP);
map.put("respCode", "");
map.put("VerficationCode", verficationCode);
map.put("gopayServerTime", gopayServerTime);
map.put("merRemark1", com.shove.security.Encrypt.encryptSES(
userId + "", GopayConfig.gopay_see_key));
// 组织加密明文
StringBuffer plain = new StringBuffer();
plain.append("version=[");
plain.append(version);
plain.append("]tranCode=[");
plain.append(tranCode);
plain.append("]merchantID=[");
plain.append(merchantID);
plain.append("]merOrderNum=[");
plain.append(merOrderNum);
plain.append("]tranAmt=[");
plain.append(tranAmt);
plain.append("]feeAmt=[");
plain.append(feeAmt);
plain.append("]tranDateTime=[");
plain.append(tranDateTime);
plain.append("]frontMerUrl=[");
plain.append(frontMerUrl);
plain.append("]backgroundMerUrl=[");
plain.append(backgroundMerUrl);
plain.append("]orderId=[]gopayOutOrderId=[]tranIP=[");
plain.append(tranIP);
plain.append("]respCode=[]gopayServerTime=[");
plain.append(gopayServerTime);
plain.append("]VerficationCode=[");
plain.append(verficationCode);
plain.append("]");
String signValue = GopayUtils.md5(plain.toString());
map.put("signValue", signValue);
return FormUtil.buildHtmlForm(map, GopayConfig.gopay_gateway, "post");
}
/**
* 前台调用函数
*
* @return
* @throws Exception
*/
public String frontMerUrl() throws Exception {
log.info("1--frontMerUrl");
return backgroundMerUrl();
}
/**
* 国付宝回调函数
*
* @return
* @throws Exception
*/
public String backgroundMerUrl() throws Exception {
log.info("1-----backgroundMerUrl");
String respCode = request("respCode");//
log.info("2--" + respCode);
if (!"0000".equals(respCode) && !"9999".equals(respCode)) {
log.info("3--");
createHelpMessage("支付失败!", "返回首页", "index.do");
}
if ("9999".equals(respCode)) {
log.info("4--");
createHelpMessage("订单处理中,请耐心等待!", "返回首页", "index.do");
}
String merchantID = request("merchantID");// 商户号
log.info("4--" + merchantID);
if (!validateSign()) {
log.info("5--validate sign fail");
createHelpMessage("支付失败!", "返回首页", "index.do");
}
// 国付宝支付编号
String orderId = URLDecoder.decode(request("orderId"), "utf-8");
// 交易完成时间
String tranFinishTime = URLDecoder.decode(request("tranFinishTime"),
"utf-8");
String paybank = GopayConfig.bankMap.get(request("bankCode"));//
if (StringUtils.isBlank(paybank)) {// 如果没有银行编号说明是支付宝直接支付的
paybank = "国付宝充值";
}
// Map<String, Object> map = new HashMap<String, Object>();
// map.put("merOrderNum", request("merOrderNum"));
// map.put("tranAmt", request("tranAmt"));
// map.put("feeAmt", request("feeAmt"));
// map.put("orderId", orderId);
// map.put("tranFinishTime", tranFinishTime);
// map.put("buyerName", request("buyerName"));
// map.put("merRemark1", com.shove.security.Encrypt.decryptSES(
// request("merRemark1"), GopayConfig.gopay_see_key));
// map.put("signValue", request("signValue"));
// map.put("paybank", paybank);
String attach = request("merRemark1");
double money = Convert.strToDouble(request("tranAmt"), 0);
String in_paynumber = request("merOrderNum");
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";
}
private static long getDistanceTime(Date one, Date two) {// 判断相隔多少天。
long day = 0;
long time1 = one.getTime();
long time2 = two.getTime();
long diff;
diff = time1 - time2;
day = diff / (24 * 60 * 60 * 1000);
return day;
}
/**
* 返回验证参数
*
* @return
*/
public boolean validateSign() {
StringBuffer plain = new StringBuffer();
plain.append("version=[");
plain.append(request("version"));
plain.append("]tranCode=[");
plain.append(request("tranCode"));
plain.append("]merchantID=[");
plain.append(request("merchantID"));
plain.append("]merOrderNum=[");
plain.append(request("merOrderNum"));
plain.append("]tranAmt=[");
plain.append(request("tranAmt"));
plain.append("]feeAmt=[");
plain.append(request("feeAmt"));
plain.append("]tranDateTime=[");
plain.append(request("tranDateTime"));
plain.append("]frontMerUrl=[");
plain.append(request("frontMerUrl"));
plain.append("]backgroundMerUrl=[");
plain.append(request("backgroundMerUrl"));
plain.append("]orderId=[");
plain.append(request("orderId"));
plain.append("]gopayOutOrderId=[");
plain.append(request("gopayOutOrderId"));
plain.append("]tranIP=[");
plain.append(request("tranIP"));
plain.append("]respCode=[");
plain.append(request("respCode"));
plain.append("]gopayServerTime=[]VerficationCode=[");
plain.append(GopayConfig.gopay_verficationCode);
plain.append("]");
String sign = GopayUtils.md5(plain.toString());
return sign.equals(request("signValue"));
}
public String getUrlParam() {
return urlParam;
}
public void setUrlParam(String urlParam) {
this.urlParam = urlParam;
}
public void setUserService(UserService userService) {
this.userService = userService;
}
public void setRechargeDetailService(
RechargeDetailService rechargeDetailService) {
this.rechargeDetailService = rechargeDetailService;
}
public void setRechargeService(RechargeService rechargeService) {
this.rechargeService = rechargeService;
}
}