package com.hugnew.sps.services.impls;
import com.alibaba.fastjson.JSON;
import com.hugnew.sps.dao.*;
import com.hugnew.sps.dao.domain.*;
import com.hugnew.sps.dto.PayRequestParam;
import com.hugnew.sps.services.pay.strategy.StrategyContext;
import com.hugnew.sps.enums.PayType;
import com.hugnew.sps.enums.PlatformType;
import com.hugnew.sps.services.*;
import org.apache.commons.lang3.StringUtils;
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 java.util.*;
/**
* 支付请求路由业务
* Created by Martin on 2016/7/01.
*/
@Service
public class PayRouteService implements IPayRouteService {
private static Logger logger = LoggerFactory.getLogger(PayRouteService.class);
@Resource
private RabbitTemplate amqpTemplate;
@Autowired
private PayMapMapper payMapMapper;
public PayType dealPayType(String onLineStyle, String browseType) {
PayType payType = null;
switch (onLineStyle) {
case "alipay":
switch (browseType) {
case "web":
payType = PayType.ALIPAY_WEB;
break;
case "wap":
payType = PayType.ALIPAY_WAP;
break;
case "app":
payType = PayType.ALIPAY_APP;
break;
default:
payType = null;
}
break;
case "unionpay":
switch (browseType) {
case "web":
payType = PayType.UNION_WEB;
break;
case "wap":
payType = PayType.UNION_WAP;
break;
case "app":
payType = PayType.UNION_APP;
break;
default:
payType = null;
}
break;
case "psbc":
switch (browseType) {
case "web":
payType = PayType.PSBC_WEB;
break;
case "wap":
payType = PayType.PSBC_WAP;
break;
default:
payType = null;
}
break;
case "ceb":
switch (browseType) {
case "web":
payType = PayType.CEB_WEB;
break;
case "wap":
payType = PayType.CEB_WAP;
break;
default:
payType = null;
}
break;
case "wechat":
switch (browseType) {
case "app":
payType = PayType.WECHAT_APP;
break;
default:
payType = null;
}
break;
case "ceb_GW":
switch (browseType) {
case "web":
payType = PayType.CEB_GATEWAY_WEB;
break;
case "wap":
payType = PayType.CEB_GATEWAY_WAP;
break;
default:
payType = null;
}
break;
default:
payType = null;
}
return payType;
}
private void savePayRecord(String payRequsetMsg, PayType payType, PayRequestParam payRequestParam) {
PayMap payMap = new PayMap();
payMap.setOrderId(payRequestParam.getOrderID());
payMap.setOrderCode(payRequestParam.getOrderCode());
PlatformType type = PlatformType.getPlatform(payType.value());
payMap.setPlatform(type.value());
payMap.setTempPayCode(payRequestParam.getPayCode());
payMap.setPayParams(payRequsetMsg);
payMap.setRequestBiz(payRequestParam.getRequestBiz());
payMapMapper.insertSelective(payMap);
}
@Override
public Map<String, Object> getPayRetMap(PayRequestParam payRequestParam) {
Map<String, Object> retMap = assembleRetMap(payRequestParam);
return retMap;
}
@Override
public Boolean getPayRetMap4MQ(PayRequestParam payRequestParam) {
Map<String, Object> retMap = assembleRetMap(payRequestParam);
amqpTemplate.convertAndSend("payRequestCallback." + payRequestParam.getRequestBiz() + payRequestParam.getOrderCode(), JSON.toJSONString(retMap));
return true;
}
private Map<String, Object> assembleRetMap(PayRequestParam payRequestParam) {
Map<String, Object> paramsToPass = new HashMap<>();
if (StringUtils.isNotBlank(payRequestParam.getRetUrl())) {
paramsToPass.put("retUrl", payRequestParam.getRetUrl());
}
paramsToPass.put("toPay", payRequestParam.getToPay());
paramsToPass.put("payCode", payRequestParam.getPayCode());
paramsToPass.put("sellerCode", payRequestParam.getSellerCode());
paramsToPass.put("sellerName", payRequestParam.getSellerName());
paramsToPass.put("orderCode", payRequestParam.getOrderCode());
paramsToPass.put("invalidTime", payRequestParam.getInvalidTime());
paramsToPass.put("orderCreateTime", payRequestParam.getCreateTime());
PayType payType = dealPayType(payRequestParam.getOnLineStyle(), payRequestParam.getBrowseType());
StrategyContext context = new StrategyContext();
String payRequsetMsg = context.generatePayParams(payType, paramsToPass);
if(logger.isDebugEnabled()){
logger.debug("订单code为{}的支付请求参数生成信息:{}", new Object[]{payRequestParam.getOrderCode(), payRequsetMsg});
}
savePayRecord(payRequsetMsg, payType, payRequestParam);
Map<String, Object> retMap = new HashMap<>();
retMap.put("payData", payRequsetMsg);
retMap.put("payment", payRequestParam.getOnLineStyle());
retMap.put("orderID", payRequestParam.getOrderID());
retMap.put("errorCode", "0710");
retMap.put("message", "请去第三方平台支付~~");
return retMap;
}
}