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 AllinPaymentAction extends BaseFrontAction {
private static final long serialVersionUID = 1L;
private static Log log = LogFactory.getLog(AllinPaymentAction.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;
}
public String allinPayment() 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;
}
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 = createAllinpayUrl(result + "", "在线充值", userId + "",
moneyDecimal, request("bankType"));// paymentId_orderId_userId:支付类型(在线支付/在线充值)_订单编号/_用户编号
sendHtml(html);
return null;
} else {
createHelpMessage("支付失败!", "返回首页", "index.do");
return null;
}
}
private String createAllinpayUrl(String out_trade_no, String body,
String extraCommonParam, BigDecimal money, String bankType)
throws Exception {
long lmoney = (long) (money.doubleValue() * 100);
extraCommonParam = com.shove.security.Encrypt.encryptSES(
extraCommonParam, AlipayConfig.ses_key);
extraCommonParam = URLEncoder.encode(extraCommonParam, "utf-8");
String version = AllinpayConfig.alllin_version;// 固定值
String language = AllinpayConfig.alllin_language;// 1 代表中文显示
String signType = AllinpayConfig.alllin_signType;// 签名类型,1 代表证书签名验签方式
String merchantId = AllinpayConfig.alllin_merchantId;// 商户号
String orderNo = out_trade_no;// 商户订单号
String orderAmount = lmoney + "";// 商户订单金额
String orderDatetime = sdf.format(new Date());// 商户订单提交时间
int payType = 0;
String issuerId = bankType;
if (StringUtils.isNotBlank(bankType) && !"DEFAULT".equals(bankType)) {
payType = 1;
} else {
issuerId = "";
}
// 支付方式
String key = AllinpayConfig.alllin_signkey;// 用于计算signMsg的key值
// ---------------若直连telpshx渠道,payerTelephone、payerName、payerIDCard、pan四个字段不可为空
String orderCurrency = "0";// 订单金额类型
String inputCharset = "1";// 字符集 1 代表UTF-8
String pickupUrl = AllinpayConfig.alllin_pickUrl;// 客户的取货地址
String receiveUrl = AllinpayConfig.alllin_receiveUrl;// 通知商户网站支付结果的url
// 地址
String ext1 = extraCommonParam;// 扩展字段1
String ext2 = "";// 扩展字段2
com.allinpay.ets.client.RequestOrder requestOrder = new com.allinpay.ets.client.RequestOrder();
if (null != inputCharset && !"".equals(inputCharset)) {
requestOrder.setInputCharset(Integer.parseInt(inputCharset));
}
requestOrder.setPickupUrl(pickupUrl);
requestOrder.setReceiveUrl(receiveUrl);
requestOrder.setVersion(version);
if (null != language && !"".equals(language)) {
requestOrder.setLanguage(Integer.parseInt(language));
}
requestOrder.setSignType(Integer.parseInt(signType));
requestOrder.setMerchantId(merchantId);
requestOrder.setOrderNo(orderNo);
requestOrder.setOrderAmount(Convert.strToLong(orderAmount, -1));
requestOrder.setOrderCurrency(orderCurrency);
requestOrder.setOrderDatetime(orderDatetime);
requestOrder.setExt1(ext1);
requestOrder.setExt2(ext2);
if (StringUtils.isNotBlank(issuerId)) {
requestOrder.setIssuerId(issuerId);
}
requestOrder.setPayType(payType);
requestOrder.setKey(key); // key为MD5密钥,密钥是在通联支付网关会员服务网站上设置。
String strSignMsg = requestOrder.doSign(); // 签名,设为signMsg字段值。
Map<String, String> sParaTemp = new HashMap<String, String>();
sParaTemp.put("version", version);
sParaTemp.put("language", language);
sParaTemp.put("signType", signType);
sParaTemp.put("merchantId", merchantId);
sParaTemp.put("orderNo", orderNo);
sParaTemp.put("orderAmount", orderAmount);
sParaTemp.put("orderDatetime", orderDatetime);
sParaTemp.put("payType", payType + "");
sParaTemp.put("inputCharset", inputCharset);
sParaTemp.put("pickupUrl", pickupUrl);
sParaTemp.put("receiveUrl", receiveUrl);
if (StringUtils.isNotBlank(issuerId)) {
sParaTemp.put("issuerId", issuerId);
}
sParaTemp.put("ext1", ext1);
sParaTemp.put("ext2", ext2);
sParaTemp.put("signMsg", strSignMsg);
sParaTemp.put("orderCurrency", orderCurrency);
return FormUtil.buildHtmlForm(sParaTemp,
AllinpayConfig.alllin_gate_way, "post");
}
/**
* 商城取货地址
*
* @return
* @throws Exception
*/
public String pickUrl() throws Exception {
request().setCharacterEncoding("UTF-8");
log.info("--allinpay--1--");
String merchantId = request().getParameter("merchantId");
String version = request().getParameter("version");
String language = request().getParameter("language");
String signType = request().getParameter("signType");
String payType = request().getParameter("payType");
String issuerId = request().getParameter("issuerId");
String paymentOrderId = request().getParameter("paymentOrderId");
String orderNo = request().getParameter("orderNo");
String orderDatetime = request().getParameter("orderDatetime");
String orderAmount = request().getParameter("orderAmount");
String payDatetime = request().getParameter("payDatetime");
String payAmount = request().getParameter("payAmount");
String ext1 = request().getParameter("ext1");
String ext2 = request().getParameter("ext2");
String payResult = request().getParameter("payResult");
String errorCode = request().getParameter("errorCode");
String returnDatetime = request().getParameter("returnDatetime");
String signMsg = request().getParameter("signMsg");
log.error("errorCode==>" + errorCode);
com.allinpay.ets.client.PaymentResult paymentResult = new com.allinpay.ets.client.PaymentResult();
paymentResult.setMerchantId(merchantId);
paymentResult.setVersion(version);
paymentResult.setLanguage(language);
paymentResult.setSignType(signType);
paymentResult.setPayType(payType);
paymentResult.setIssuerId(issuerId);
paymentResult.setPaymentOrderId(paymentOrderId);
paymentResult.setOrderNo(orderNo);
paymentResult.setOrderDatetime(orderDatetime);
paymentResult.setOrderAmount(orderAmount);
paymentResult.setPayDatetime(payDatetime);
paymentResult.setPayAmount(payAmount);
paymentResult.setExt1(ext1);
paymentResult.setExt2(ext2);
paymentResult.setPayResult(payResult);
paymentResult.setErrorCode(errorCode);
paymentResult.setReturnDatetime(returnDatetime);
// signMsg为服务器端返回的签名值。
paymentResult.setSignMsg(signMsg);
// signType为"1"时,必须设置证书路径。
String classPath = this.getClass().getResource("/").getPath();
log.info("--allinpay--2--");
paymentResult.setCertPath(classPath + "TLCert.cer");
log.info(classPath + "TLCert.cer");
// 验证签名:返回true代表验签成功;否则验签失败。
boolean verifyResult = paymentResult.verify();
log.info("--verifyResult----" + verifyResult);
log.info("--payResult----" + payResult);
// 验签成功,还需要判断订单状态,为"1"表示支付成功。
boolean paySuccess = verifyResult && payResult.equals("1");
log.info("--allinpay--2--");
if (!paySuccess) {
createHelpMessage("支付失败!", "返回首页", "index.do");
}
log.info("--allinpay--3--");
String paynumber = URLDecoder.decode(request("orderNo"), "utf-8");
// String notify_time = URLDecoder.decode(request("returnDatetime"),
// "utf-8");
String paybank = AllinpayConfig.bankMap.get(issuerId);// 支付银行
if (StringUtils.isBlank(paybank)) {// 如果没有银行编号说明是支付宝直接支付的
paybank = "通联支付";
}
// Map<String, Object> map = new HashMap<String, Object>();
// map.put("extraCommonParam", extraCommonParam);
// map.put("total_fee", new BigDecimal(payAmount));
// map.put("paynumber", paynumber);
// map.put("bankName", paybank);
// map.put("notify_time", notify_time);
String attach = request("ext1");
double money = Convert.strToDouble(payAmount, 0);
String in_paynumber = request("orderNo");
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";
}
/**
* 通知商户网站支付结果
*
* @return
* @throws Exception
*/
public String receiveUrl() throws Exception {
return pickUrl();
}
public UserService getUserService() {
return userService;
}
public void setUserService(UserService userService) {
this.userService = userService;
}
}