package me.xhh.alipay; import java.io.IOException; import java.io.PrintWriter; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import me.xhh.alipay.config.AlipayConfig; import me.xhh.alipay.util.AlipayBase; import me.xhh.alipay.util.AlipayNotify; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class AlipayHandler { private HttpServletRequest request; private HttpServletResponse response; private String trade_no; @SuppressWarnings("unused") private String extra_value; private String total_fee; private String subject; private String buyer_email; private String trade_status; private static final Logger log = LoggerFactory.getLogger(AlipayHandler.class); public AlipayHandler(HttpServletRequest req, HttpServletResponse resp) { this.request = req; this.response = resp; } public void process() throws IOException { boolean result = verify() && handle(); PrintWriter out = response.getWriter(); out.println(result ? "success" : "fail"); } @SuppressWarnings("unchecked") private boolean verify() throws IOException { Map<String, String> params = new HashMap<String, String>(); Map<String, String[]> requestParams = request.getParameterMap(); for (Iterator<String> iter = requestParams.keySet().iterator(); iter.hasNext();) { String name = iter.next(); String[] values = requestParams.get(name); String valueStr = ""; for (int i = 0; i < values.length; i++) { valueStr = (i == values.length - 1) ? valueStr + values[i] : valueStr + values[i] + ","; } // 乱码解决,这段代码在出现乱码时使用。如果mysign和sign不相等也可以使用这段代码转化 // valueStr = new String(valueStr.getBytes("ISO-8859-1"), "UTF-8"); params.put(name, valueStr); } String mysign = AlipayNotify.GetMysign(params, AlipayConfig.key); String sign = request.getParameter("sign"); Object[] logArgs = {AlipayBase.CreateLinkString(params), sign, mysign}; log.info("Alipay notification got. Arguments: {}\nSign: {}\nMy sign: {}", logArgs); // verify with Alipay String responseTxt = AlipayNotify.Verify(request.getParameter("notify_id")); log.info("Alipay verify-result: {}", responseTxt); boolean verified = (mysign.equals(sign) && responseTxt.equals("true")); if (!verified) { log.error("Alipay handling failed! Not verified!"); return false; } // verification succeeded // 获取支付宝的通知返回参数 trade_no = request.getParameter("trade_no"); // 支付宝交易号 extra_value = request.getParameter("extra_common_param"); // 获取 extra_common_param 的值 total_fee = request.getParameter("total_fee"); // 获取总金额 // subject = new String(request.getParameter("subject").getBytes("ISO-8859-1"), "UTF-8");// 商品名称、订单名称 encoding problem subject = request.getParameter("subject");// 商品名称、订单名称 // body = new String(request.getParameter("body").getBytes("ISO-8859-1"), "UTF-8");// 商品描述、订单备注、描述 buyer_email = request.getParameter("buyer_email"); // 买家支付宝账号 trade_status = request.getParameter("trade_status"); // 交易状态 return true; } /** * @return true for writing "success" back, false for "fail" */ private boolean handle() { String[] logArgs = {trade_no, buyer_email, total_fee, subject}; log.info("Alipay handling... trade_no: {}, buyer_email: {}, total_fee: {}, subject: {}", logArgs); // payment status not expected if (!trade_status.equals("TRADE_FINISHED") && !trade_status.equals("TRADE_SUCCESS")) { log.info("Alipay notification skipped. Payment status: {}", trade_status); return true; } /* Example processing if (isTransactionAlreadyProcessed()) { log.warn("Alipay transaction already processed before, exit."); return true; } boolean result = addFunds(); if (!result) { log.error("Alipay handling failed! Remove the transaction ID from database..."); removeTransactionID(); } else { log.info("Alipay handling completed."); } return result; */ return false; } }