package com.java214.fenxiao.action;
import com.java214.fenxiao.entities.Config;
import com.java214.fenxiao.entities.Financial;
import com.java214.fenxiao.entities.Orders;
import com.java214.fenxiao.entities.Recharge;
import com.java214.fenxiao.entities.User;
import com.java214.fenxiao.pay.alipay.AlipayConfig;
import com.java214.fenxiao.pay.alipay.AlipayNotify;
import com.java214.fenxiao.pay.alipay.AlipaySubmit;
import com.java214.fenxiao.service.IConfigService;
import com.java214.fenxiao.service.IFinancialService;
import com.java214.fenxiao.service.IOrdersService;
import com.java214.fenxiao.service.IRechargeService;
import com.java214.fenxiao.service.IUserService;
import java.io.PrintWriter;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Random;
import java.util.Set;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;
@Controller("alipayAction")
@Scope("prototype")
public class AlipayAction extends BaseAction {
	private static final long serialVersionUID = 1L;
	@Resource(name = "ordersService")
	private IOrdersService<Orders> ordersService;
	@Resource(name = "userService")
	private IUserService<User> userService;
	private Orders orders;
	private String ftlFileName;
	@Resource(name = "configService")
	private IConfigService<Config> configService;
	@Resource(name = "financialService")
	private IFinancialService<Financial> financialService;
	@Resource(name = "rechargeService")
	private IRechargeService<Recharge> rechargeService;
	public String alipayApi() throws Exception {
		String payment_type = "1";
		String notify_url = this.request.getScheme() + "://" + this.request.getServerName() + ":" + this.request.getServerPort()
				+ this.request.getContextPath() + "/" + "notifyUrl";
		String return_url = this.request.getScheme() + "://" + this.request.getServerName() + ":" + this.request.getServerPort()
				+ this.request.getContextPath() + "/" + "returnUrl";
		Random random = new Random();
		int n = random.nextInt(9999);
		n += 10000;
		String out_trade_no = "" + System.currentTimeMillis() + n ;
		String subject = out_trade_no;
		String money = this.request.getParameter("money");
		String body = out_trade_no;
		String show_url = this.request.getScheme() + "://" + this.request.getServerName() + ":" + this.request.getServerPort()
				+ this.request.getContextPath() + "/";
		String anti_phishing_key = "";
		String exter_invoke_ip = "";
		String enable_paymethod = this.request.getParameter("enable_paymethod");
		Config findConfig = (Config) this.configService.findById(Config.class, 1);
		Map sParaTemp = new HashMap();
		sParaTemp.put("service", "create_direct_pay_by_user");
		sParaTemp.put("partner", findConfig.getAlipayPartner());
		sParaTemp.put("optEmail", findConfig.getAlipaySellerEmail());
		sParaTemp.put("_input_charset", AlipayConfig.input_charset);
		sParaTemp.put("payment_type", payment_type);
		sParaTemp.put("notify_url", notify_url);
		sParaTemp.put("return_url", return_url);
		sParaTemp.put("out_trade_no", out_trade_no);
		sParaTemp.put("subject", subject);
		sParaTemp.put("total_fee", Double.parseDouble(money));
		sParaTemp.put("body", body);
		sParaTemp.put("show_url", show_url);
		sParaTemp.put("anti_phishing_key", anti_phishing_key);
		sParaTemp.put("exter_invoke_ip", exter_invoke_ip);
		sParaTemp.put("enable_paymethod", "debitCardExpress");
		String sHtmlText = AlipaySubmit.buildRequest(sParaTemp, "get", "确认", findConfig.getAlipayKey());
		HttpSession session = this.request.getSession();
		User loginUser = (User) session.getAttribute("loginUser");
		Recharge recharge = new Recharge();
		recharge.setNo(out_trade_no);
		recharge.setMoney(Double.valueOf(Double.parseDouble(money)));
		recharge.setUser(loginUser);
		recharge.setStatus(Integer.valueOf(0));
		recharge.setCreateDate(new Date());
		this.rechargeService.saveOrUpdate(recharge);
		PrintWriter out = this.response.getWriter();
		out.println(sHtmlText);
		out.flush();
		out.close();
		return null;
	}
	public String notifyUrl() throws Exception {
		PrintWriter out = this.response.getWriter();
		Map params = new HashMap();
		Map requestParams = this.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 = valueStr + values[i] + ",";
			}
			params.put(name, valueStr);
		}
		String out_trade_no = new String(this.request.getParameter("out_trade_no").getBytes("ISO-8859-1"), "UTF-8");
		String trade_no = new String(this.request.getParameter("trade_no").getBytes("ISO-8859-1"), "UTF-8");
		String trade_status = new String(this.request.getParameter("trade_status").getBytes("ISO-8859-1"), "UTF-8");
		Config findConfig = (Config) this.configService.findById(Config.class, 1);
		if (AlipayNotify.verify(params, findConfig.getAlipayKey())) {
			if (trade_status.equals("TRADE_FINISHED")) {
				Recharge findRecharge = this.rechargeService.findByNo(out_trade_no);
				if (findRecharge.getStatus().intValue() == 0) {
					findRecharge.setStatus(Integer.valueOf(1));
					this.rechargeService.saveOrUpdate(findRecharge);
					User findUser = (User) this.userService.findById(User.class, findRecharge.getUser().getId().intValue());
					findUser.setBalance(Double.valueOf(findUser.getBalance().doubleValue() + findRecharge.getMoney().doubleValue()));
					this.userService.saveOrUpdate(findUser);
				}
			} else if (trade_status.equals("TRADE_SUCCESS")) {
				Recharge findRecharge = this.rechargeService.findByNo(out_trade_no);
				if (findRecharge.getStatus().intValue() == 0) {
					findRecharge.setStatus(Integer.valueOf(1));
					this.rechargeService.saveOrUpdate(findRecharge);
					User findUser = (User) this.userService.findById(User.class, findRecharge.getUser().getId().intValue());
					findUser.setBalance(Double.valueOf(findUser.getBalance().doubleValue() + findRecharge.getMoney().doubleValue()));
					this.userService.saveOrUpdate(findUser);
				}
			}
			out.println("success");
		} else {
			out.println("fail");
		}
		out.flush();
		out.close();
		return null;
	}
	public String returnUrl() throws Exception {
		PrintWriter out = this.response.getWriter();
		Map params = new HashMap();
		Map requestParams = this.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 = valueStr + values[i] + ",";
			}
			valueStr = new String(valueStr.getBytes("ISO-8859-1"), "utf-8");
			params.put(name, valueStr);
		}
		String out_trade_no = new String(this.request.getParameter("out_trade_no").getBytes("ISO-8859-1"), "UTF-8");
		String trade_status = new String(this.request.getParameter("trade_status").getBytes("ISO-8859-1"), "UTF-8");
		Config findConfig = (Config) this.configService.findById(Config.class, 1);
		boolean verify_result = AlipayNotify.verify(params, findConfig.getAlipayKey());
		if (verify_result) {
			Recharge findRecharge = this.rechargeService.findByNo(out_trade_no);
			if ((trade_status.equals("TRADE_FINISHED")) || (trade_status.equals("TRADE_SUCCESS"))) {
				if (findRecharge.getStatus().intValue() == 0) {
					findRecharge.setStatus(Integer.valueOf(1));
					this.rechargeService.saveOrUpdate(findRecharge);
					User findUser = (User) this.userService.findById(User.class, findRecharge.getUser().getId().intValue());
					findUser.setBalance(Double.valueOf(findUser.getBalance().doubleValue() + findRecharge.getMoney().doubleValue()));
					this.userService.saveOrUpdate(findUser);
				}
			}
		      out.println("<br>交易成功!<br>订单号:" + out_trade_no + "<br>支付金额:" + findRecharge.getMoney());
		} else {
			out.println("验证失败");
		}
		out.flush();
		out.close();
		return null;
	}
	public Orders getOrders() {
		return this.orders;
	}
	public void setOrders(Orders orders) {
		this.orders = orders;
	}
	public String getFtlFileName() {
		return this.ftlFileName;
	}
	public void setFtlFileName(String ftlFileName) {
		this.ftlFileName = ftlFileName;
	}
}
/*
 * Location: D:\360��ȫ���������\WeFenxiao_A5\WeFenxiao_V1.0.1\WEB-INF\classes\
 * Qualified Name: com.java214.fenxiao.action.AlipayAction JD-Core Version: 0.6.0
 */