package com.walker.pay; import com.walker.infrastructure.arguments.Variable; import com.walker.infrastructure.utils.StringUtils; import com.walker.pay.exception.NotifyException; import com.walker.pay.exception.OrderException; import com.walker.pay.response.OrderStatusResponsePay; import com.walker.pay.util.PayDefinitionUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; public abstract class AbstractPayEngineManager implements PayEngineManager{ protected final transient Logger logger = LoggerFactory.getLogger(this.getClass()); private final Map payDefinitionMap = new HashMap<>(); private final Map payEngineProviderMap = new HashMap<>(); private Map configuration = null; public Map getConfiguration() { return configuration; } public void setConfiguration(Map configuration){ if(configuration == null || configuration.size() == 0){ logger.warn("支付引擎配置参数为空,请确认是否不需要参数。"); } this.configuration = configuration; logger.info("setConfiguration:{}", this.configuration); } @Override public void loadPayDefinitionList() { List list = this.acquirePayDefinitionList(); if(StringUtils.isEmptyList(list)){ logger.warn("未加载到任何'支付定义'集合, 无法使用支付功能!"); return; } PayEngineProvider payEngineProvider = null; for(PayDefinition pd : list){ try { if(!pd.getEnabled()){ logger.warn("支付定义被禁用,无法使用:" + pd.getName()); continue; } payEngineProvider = this.acquirePayEngineProvider(pd); if(payEngineProvider == null){ logger.error("acquirePayEngineProvider()得到空的引擎对象!"); continue; } this.payEngineProviderMap.put(pd.getId(), payEngineProvider); this.payDefinitionMap.put(pd.getId(), pd); logger.info("加载了一个'PayEngineProvider': " + pd.getName() + ", id=" + pd.getId()); } catch (PayEngineNotFoundException e) { logger.error("获取支付引擎错误,未找到需要的对象: " + pd.getId()); throw new RuntimeException(e); } } } @Override public PayDefinition getPayDefinition(String payDefinitionId) { PayDefinition pd = this.payDefinitionMap.get(payDefinitionId); if(pd == null){ logger.warn("未找到支付定义对象, id=" + payDefinitionId); } return pd; } @Override public List getPayEngineProviderList() { if(this.payEngineProviderMap.size() == 0){ return null; } List resultList = new ArrayList<>(8); for(PayEngineProvider payEngineProvider : this.payEngineProviderMap.values()){ resultList.add(payEngineProvider); } return resultList; } @Override public PayEngineProvider getPayEngineProvider(String payDefinitionId) { PayEngineProvider payEngineProvider = this.payEngineProviderMap.get(payDefinitionId); if(payEngineProvider == null){ logger.warn("未找到支付引擎对象, id=" + payDefinitionId); } return payEngineProvider; } @Override public PayEngineProvider getPayEngineProvider(ServiceProvider serviceProvider, String version, PayType payType) { String payDefinitionId = PayDefinitionUtils.getPayDefinitionId(serviceProvider, version); PayEngineProvider payEngineProvider = this.payEngineProviderMap.get(payDefinitionId); if(payEngineProvider == null){ logger.warn("未找到支付引擎对象, id=" + payDefinitionId + ", provider=" + serviceProvider.getName() + ", version=" + version); } return payEngineProvider; } @Override public List getPayEngineProviderList(ServiceProvider serviceProvider){ if(serviceProvider == null){ throw new IllegalArgumentException("serviceProvider 参数必须提供"); } if(this.payEngineProviderMap.size() == 0){ return null; } List resultList = new ArrayList<>(2); for(PayEngineProvider payEngineProvider : this.payEngineProviderMap.values()){ if(payEngineProvider.getServiceProvider() == serviceProvider){ resultList.add(payEngineProvider); } } return resultList; } @Override public ResponsePay generatePrepareOrder(Order platformOrder) throws OrderException { if(platformOrder == null){ throw new IllegalArgumentException("platformOrder is required!"); } if(platformOrder.getServiceProvider() == null){ throw new IllegalArgumentException("提供商不能为空: serviceProvider is required!"); } if(platformOrder.getPayType() == null){ throw new IllegalArgumentException("支付类型不能为空: payType is required!"); } PayEngineProvider payEngineProvider = null; if(StringUtils.isEmpty(platformOrder.getVersion())){ logger.warn("订单未传入'version'属性, 需要根据'ServiceProvider'查询是否存在多个提供者:" + platformOrder.getServiceProvider()); List payEngineProviders = this.getPayEngineProviderList(platformOrder.getServiceProvider()); if(StringUtils.isEmptyList(payEngineProviders)){ logger.error("根据'serviceProvider'没有找到任何支付引擎提供者:" + platformOrder.getServiceProvider()); } else if(payEngineProviders.size() == 1){ if(logger.isDebugEnabled()){ logger.debug("该'serviceProvider'下只存在一个提供者:" + platformOrder.getServiceProvider()); } payEngineProvider = payEngineProviders.get(0); } else { throw new IllegalArgumentException("订单没有提供版本号,而且该提供者存在多个,请传入版本号,serviceProvider=" + platformOrder.getServiceProvider()); } } else { payEngineProvider = this.getPayEngineProvider(platformOrder.getServiceProvider() , platformOrder.getVersion(), platformOrder.getPayType()); } if(payEngineProvider == null){ throw new IllegalArgumentException("PayEngineProvider not found:" + platformOrder.getServiceProvider() + ", " + platformOrder.getVersion()); } return payEngineProvider.generatePrepareOrder(platformOrder); } @Override public String notifyOrder(String payDefinitionId, Object notifyData) throws NotifyException{ if(StringUtils.isEmpty(payDefinitionId)){ // throw new NotifyException("", "payDefinitionId 为空!", null); return "payDefinitionId 为空!"; } PayEngineProvider payEngineProvider = this.getPayEngineProvider(payDefinitionId); if(payEngineProvider == null){ // throw new IllegalArgumentException("未找到支付引擎,payDefinition:" + payDefinitionId); return "未找到支付引擎,payDefinition:" + payDefinitionId; } // payEngineProvider.notifyOrder(notifyData, orderCallBack); payEngineProvider.notifyOrder(notifyData); // 成功返回空对象。 return null; } @Override public String generateNotifyResponse(String payDefinitionId, boolean success){ if(StringUtils.isEmpty(payDefinitionId)){ throw new IllegalArgumentException("payDefinitionId is acquired!"); } PayEngineProvider payEngineProvider = this.getPayEngineProvider(payDefinitionId); if(payEngineProvider == null){ throw new IllegalArgumentException("未找到支付引擎,payDefinition:" + payDefinitionId); } return payEngineProvider.generateNotifyResponse(success); } @Override public OrderStatusResponsePay searchOrderStatus(String orderId){ if(StringUtils.isEmpty(orderId)){ throw new IllegalArgumentException("请输入订单编号"); } Order order = this.acquireOrder(orderId); if(order == null){ logger.error("系统订单不存在,orderId={}", orderId); return null; } String payDefinitionId = order.getPayDefinitionId(); if(StringUtils.isEmpty(payDefinitionId)){ throw new IllegalStateException("该订单未关联任何支付引擎,无法继续查询订单状态: payDefinitionId 为空,orderId=" + orderId); } PayEngineProvider payEngineProvider = this.getPayEngineProvider(payDefinitionId); if(payEngineProvider == null){ throw new IllegalArgumentException("未找到支付引擎,payDefinition:" + payDefinitionId); } return payEngineProvider.searchOrderStatus(order); } /** * 由子类实现加载支付定义数据。 * @return */ protected abstract List acquirePayDefinitionList(); /** * 根据支付定义,获取支付引擎提供者对象。 * @param payDefinition * @return */ protected abstract PayEngineProvider acquirePayEngineProvider(PayDefinition payDefinition) throws PayEngineNotFoundException; /** * 从平台查询数据库,找出订单基本信息。 * @param orderId 平台订单ID,数字 * @return * @date 2023-02-23 */ protected abstract Order acquireOrder(String orderId); }