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;
}
}