package com.hugnew.sps.services.impls;
import com.alibaba.fastjson.JSON;
import com.hugnew.core.common.exception.SystemException;
import com.hugnew.sps.dao.domain.PayMap;
import com.hugnew.sps.enums.PayPlatform;
import com.hugnew.sps.enums.PlatformType;
import com.hugnew.sps.services.IAlipayNotifyService;
import com.hugnew.sps.services.IPayMapService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
/**
* 支付宝通知业务
* Created by Martin on 2016/7/01.
*/
@Service
public class AlipayNotifyService implements IAlipayNotifyService {
private static Logger logger = LoggerFactory.getLogger(AlipayNotifyService.class);
@Autowired
private IPayMapService payMapService;
@Resource
private RabbitTemplate amqpTemplate;
@Override
public void alipayNotifyMainApp(HttpServletRequest request, HttpServletResponse response) {
//商户订单号
String out_trade_no = null;
//交易状态
String trade_status = null;
Map params = getRequestParams(request);
if (com.hugnew.sps.services.pay.util.app.ali.main.util.AlipayNotify.verify(params)) {//验证成功
try {
out_trade_no = new String(request.getParameter("out_trade_no").getBytes("ISO-8859-1"), "UTF-8");
trade_status = new String(request.getParameter("trade_status").getBytes("ISO-8859-1"), "UTF-8");
} catch (UnsupportedEncodingException e) {
logger.error("request getParameter error:{}",e.getMessage());
throw new SystemException(e);
}
String platformCode=PayPlatform.ALIPAY_COMMON.getCode();
if (trade_status.equals("TRADE_FINISHED")) {
} else if (trade_status.equals("TRADE_SUCCESS")) {
pay2NextBiz(response, out_trade_no, params, platformCode);
}
} else {//验证失败
try {
response.getOutputStream().println("fail");
} catch (IOException e) {
logger.error("response IO error:{}", e.getMessage());
throw new SystemException(e);
}
}
}
@Override
public void alipayNotifyMain(HttpServletRequest request, HttpServletResponse response) {
//商户订单号
String out_trade_no = null;
//交易状态
String trade_status = null;
Map params = getRequestParams(request);
if (com.hugnew.sps.services.pay.util.web.ali.main.util.AlipayNotify.verify(params)) {//验证成功
try {
out_trade_no = new String(request.getParameter("out_trade_no").getBytes("ISO-8859-1"), "UTF-8");
trade_status = new String(request.getParameter("trade_status").getBytes("ISO-8859-1"), "UTF-8");
} catch (UnsupportedEncodingException e) {
logger.error("request getParameter error:{}", e.getMessage());
throw new SystemException(e);
}
String platformCode=PayPlatform.ALIPAY_COMMON.getCode();
if (trade_status.equals("TRADE_FINISHED")) {
} else if (trade_status.equals("TRADE_SUCCESS")) {
pay2NextBiz(response, out_trade_no, params, platformCode);
}
} else {//验证失败
try {
response.getOutputStream().println("fail");
} catch (IOException e) {
logger.error("response IO error:{}", e.getMessage());
throw new SystemException(e);
}
}
}
@Override
public void alipayNotifyGlobal(HttpServletRequest request, HttpServletResponse response) {
//商户订单号
String out_trade_no = null;
//交易状态
String trade_status = null;
Map params = getRequestParams(request);
if (com.hugnew.sps.services.pay.util.web.ali.global.util.AlipayNotify.verify(params)) {//验证成功
try {
out_trade_no = new String(request.getParameter("out_trade_no").getBytes("ISO-8859-1"), "UTF-8");
trade_status = new String(request.getParameter("trade_status").getBytes("ISO-8859-1"), "UTF-8");
} catch (UnsupportedEncodingException e) {
logger.error("request getParameter error:{}", e.getMessage());
throw new SystemException(e);
}
String platformCode=PayPlatform.ALIPAY_GLOBAL.getCode();
if (trade_status.equals("TRADE_FINISHED")) {
pay2NextBiz(response, out_trade_no, params, platformCode);
} else if (trade_status.equals("TRADE_SUCCESS")) {
pay2NextBiz(response, out_trade_no, params, platformCode);
}
} else {//验证失败
try {
response.getOutputStream().println("fail");
} catch (IOException e) {
logger.error("response IO error:{}", e.getMessage());
throw new SystemException(e);
}
}
}
@Override
public void alipayNotifyGlobalApp(HttpServletRequest request, HttpServletResponse response) {
//商户订单号
String out_trade_no = null;
//交易状态
String trade_status = null;
Map params = getRequestParams(request);
if (com.hugnew.sps.services.pay.util.app.ali.global.util.AlipayNotify.verify(params)) {//验证成功
try {
out_trade_no = new String(request.getParameter("out_trade_no").getBytes("ISO-8859-1"), "UTF-8");
trade_status = new String(request.getParameter("trade_status").getBytes("ISO-8859-1"), "UTF-8");
} catch (UnsupportedEncodingException e) {
logger.error("request getParameter error:{}", e.getMessage());
throw new SystemException(e);
}
String platformCode=PayPlatform.ALIPAY_GLOBAL.getCode();
if (trade_status.equals("TRADE_FINISHED")) {
pay2NextBiz(response, out_trade_no, params, platformCode);
} else if (trade_status.equals("TRADE_SUCCESS")) {
pay2NextBiz(response, out_trade_no, params, platformCode);
}
} else {//验证失败
try {
response.getOutputStream().println("fail");
} catch (IOException e) {
logger.error("response IO error:{}", e.getMessage());
throw new SystemException(e);
}
}
}
private Map getRequestParams(HttpServletRequest request) {
Map requestParams = request.getParameterMap();
Map params = new HashMap();
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 = (i == values.length - 1) ? valueStr + values[i]
: valueStr + values[i] + ",";
}
params.put(name, valueStr);
}
if(logger.isDebugEnabled()){
logger.debug("订单orderCode:{}所对应的支付宝通知交易码为{}返回参数列表:{}", new Object[]{params.get("out_trade_no"), params.get("trade_no"), params.toString()});
}
return params;
}
private void pay2NextBiz(HttpServletResponse response, String out_trade_no, Map params, String platformCode) {
if(logger.isDebugEnabled()){
logger.debug("订单orderCode:{}所对应的支付宝通知交易码为:{}支付成功", new Object[]{params.get("out_trade_no"), params.get("trade_no")});
}
PayMap payMap = payMapService.updatePayMapByPayCode(out_trade_no, params.toString(), null, PlatformType.TB, String.valueOf(params.get("trade_no")), platformCode);
amqpTemplate.convertAndSend("payNotify." + payMap.getRequestBiz()+payMap.getOrderCode(), JSON.toJSONString(payMap));
try {
//向支付平台回写本地处理成功消息,让支付平台不再继续发送通知消息
response.getWriter().println("success");
} catch (IOException e) {
logger.error("response IO error:{}", e.getMessage());
throw new SystemException(e);
}
}
}