package com.iplatform.pay; import com.iplatform.base.WechatConstants; import com.iplatform.model.po.S_pay_definition; import com.iplatform.model.po.S_pay_order; import com.iplatform.pay.config.PayProperties; import com.iplatform.pay.service.PayDefinitionServiceImpl; import com.iplatform.pay.service.PlatformOrderServiceImpl; import com.iplatform.pay.support.AllinpayCloudOrderCallback; import com.iplatform.pay.support.DefaultWechatV2OrderCallback; import com.iplatform.pay.support.PayUnkPlatformOrderCallback; import com.iplatform.pay.util.PayDefinitionUtils; import com.walker.infrastructure.arguments.ArgumentsManager; import com.walker.infrastructure.arguments.Variable; import com.walker.infrastructure.utils.ClassUtils; import com.walker.infrastructure.utils.StringUtils; import com.walker.pay.AbstractPayEngineManager; import com.walker.pay.AbstractPayEngineProvider; import com.walker.pay.Order; import com.walker.pay.PayDefinition; import com.walker.pay.PayEngineNotFoundException; import com.walker.pay.PayEngineProvider; import com.walker.pay.PayStatus; import com.walker.pay.PayType; import com.walker.pay.ServiceProvider; import com.walker.pay.support.DefaultOrder; import com.walker.pay.support.DefaultPayDefinition; import org.springframework.web.client.RestTemplate; import java.lang.reflect.Constructor; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; /** * 支付平台默认'支付引擎'管理器实现。

* 它负责管理多种支付实现提供者的对接与维护,所有通用支付操作都要从该管理器为入口。 * @author 时克英 * @date 2023-02-25 */ public class DefaultEngineManager extends AbstractPayEngineManager { @Override protected List acquirePayDefinitionList() { // 暂时把加载【支付配置】相关参数,加载时机放在这里。2023-02-25 logger.warn("================== 加载支付配置信息,这里暂时只有测试用的'通商云'"); // this.setConfiguration(MockUtils.getTestConfiguration()); this.setConfiguration(this.doAcquireConfiguration()); logger.warn("================== 从数据库加载支付定义列表,这里暂时只有测试用的'通商云'"); // return MockUtils.getTestPayDefinitionList(this.getConfiguration()); return this.doAcquireDefinitionList(); } @Override protected PayEngineProvider acquirePayEngineProvider(PayDefinition payDefinition) throws PayEngineNotFoundException { boolean exist = ClassUtils.isPresent(payDefinition.getPayEngineProviderClass(), this.getClass().getClassLoader()); if(!exist){ throw new PayEngineNotFoundException(payDefinition.getId(), "PayEngineProviderClass不存在:" + payDefinition.getPayEngineProviderClass(), null); } try { logger.info("PayEngineProviderClass = " + payDefinition.getPayEngineProviderClass()); Class payEngineProviderClass = ClassUtils.forName(payDefinition.getPayEngineProviderClass(), this.getClass().getClassLoader()); Constructor constructor = (Constructor)payEngineProviderClass.getConstructor(RestTemplate.class); AbstractPayEngineProvider payEngineProvider = constructor.newInstance(this.restTemplate); payEngineProvider.setConfiguration(this.getConfiguration()); payEngineProvider.setPayDefinition(payDefinition); // 设置通知数据转换器,暂时还没有实现。 payEngineProvider.setOrderNotifyConvertor(payDefinition.getOrderNotifyConvertor()); // 设置定义的订单回调业务实现。 payEngineProvider.setOrderCallback(payDefinition.getOrderCallback()); return payEngineProvider; } catch (Exception ex){ throw new PayEngineNotFoundException(payDefinition.getId(), "创建'PayEngineProvider'失败:" + ex.getMessage(), ex); } } @Override protected Order acquireOrder(String orderId) { // 从数据库加载订单信息,目前主要用于查询订单状态时,获取支付定义ID long id = Long.parseLong(orderId); S_pay_order platformOrder = this.platformOrderService.get(new S_pay_order(id)); DefaultOrder order = new DefaultOrder(); order.setId(id); order.setBuyerId(platformOrder.getBuyer_id()); order.setVersion(platformOrder.getVersion()); order.setTitle(platformOrder.getTitle()); order.setAttach(platformOrder.getAttach()); order.setNonce(platformOrder.getNonce()); order.setReceiverId(platformOrder.getReceiver_id()); order.setPayDefinitionId(platformOrder.getPay_definition_id()); order.setServiceProvider(ServiceProvider.getType(platformOrder.getService_provider())); // order.setNotifyUrl(platformOrder.getn); order.setTotalMoney(platformOrder.getTotal_money()); order.setPayType(PayType.getType(platformOrder.getPay_type())); order.setIp(platformOrder.getIp()); order.setCreateTime(platformOrder.getCreate_time()); order.setDeviceInfo(platformOrder.getDevice_info()); order.setFee(platformOrder.getFee()); order.setPayStatus(PayStatus.getType(platformOrder.getPay_status())); order.setTradeNo(platformOrder.getTrade_no()); return order; } private List doAcquireDefinitionList(){ List payDefinitionDatabase = this.payDefinitionService.queryAvailablePayDefinitionList(); if(StringUtils.isEmptyList(payDefinitionDatabase)){ return null; } List resultList = new ArrayList<>(8); DefaultPayDefinition payDefinition = null; for(S_pay_definition s_pay_definition : payDefinitionDatabase){ payDefinition = PayDefinitionUtils.toPayDefinition(s_pay_definition, this.getConfiguration()); // 因为每个第三方支付模块不一定会配置,这里要检测类是否存在,如果没有加载模块则日志提示 boolean exist = ClassUtils.isPresent(payDefinition.getPayEngineProviderClass(), this.getClass().getClassLoader()); if(!exist){ logger.warn("支付定义不存在,可能是未引入模块,providerClass: {}", payDefinition.getPayEngineProviderClass()); continue; } if(StringUtils.isEmpty(payDefinition.getOrderNotifyConvertorClass())){ logger.warn("支付定义未设置'OrderNotifyConvertor'类定义,可能会出现支付通知问题,请关注模块实现是否完整! id={}", payDefinition.getId()); } else { payDefinition.setOrderNotifyConvertor(PayDefinitionUtils.createNotifyConvertorInstance(payDefinition.getOrderNotifyConvertorClass(), this.getClass().getClassLoader())); } // 这里设置支付定义中的:格式转换器和回调等。2023-02-28 if(payDefinition.getId().equals(Constants.PAY_DEFINITION_ID_ALLINPAY_CLOUD)){ AllinpayCloudOrderCallback orderCallback = new AllinpayCloudOrderCallback(); orderCallback.setOrderService(this.platformOrderService); payDefinition.setOrderCallback(orderCallback); // payDefinition.setOrderNotifyConvertor(new NotifyOrderConvertor()); } else if(payDefinition.getId().equals(Constants.PAY_DEFINITION_ID_WECHAT_V2)){ // DefaultWechatV2OrderCallback orderCallback = new DefaultWechatV2OrderCallback(); DefaultWechatV2OrderCallback orderCallback = PayDefinitionUtils .acquireWechatV2CallbackInstance(this.payProperties.getWechatTwoOrderCallback(), this.getClass().getClassLoader()); orderCallback.setOrderService(this.platformOrderService); payDefinition.setOrderCallback(orderCallback); } else if(payDefinition.getId().equals(Constants.PAY_DEFINITION_ID_PAYUNK)){ // 2023-10-30 畅联支付相关 PayUnkPlatformOrderCallback orderCallback = new PayUnkPlatformOrderCallback(); orderCallback.setOrderService(this.platformOrderService); payDefinition.setOrderCallback(orderCallback); } else { throw new UnsupportedOperationException("代码未实现!"); } resultList.add(payDefinition); } return resultList; } private Map doAcquireConfiguration(){ Map configuration = new HashMap<>(); // configuration.put(com.walker.pay.allinpaycloud.Constants.CONFIG_KEY_URL, this.argumentsManager.getVariable(com.walker.pay.allinpaycloud.Constants.CONFIG_KEY_URL)); // configuration.put(com.walker.pay.allinpaycloud.Constants.CONFIG_KEY_APP_ID, this.argumentsManager.getVariable(com.walker.pay.allinpaycloud.Constants.CONFIG_KEY_APP_ID)); // configuration.put(com.walker.pay.allinpaycloud.Constants.CONFIG_KEY_SECRET_KEY, this.argumentsManager.getVariable(com.walker.pay.allinpaycloud.Constants.CONFIG_KEY_SECRET_KEY)); // configuration.put(com.walker.pay.allinpaycloud.Constants.CONFIG_KEY_PRIVATE_KEY_PATH, this.argumentsManager.getVariable(com.walker.pay.allinpaycloud.Constants.CONFIG_KEY_PRIVATE_KEY_PATH)); // configuration.put(com.walker.pay.allinpaycloud.Constants.CONFIG_KEY_PWD, this.argumentsManager.getVariable(com.walker.pay.allinpaycloud.Constants.CONFIG_KEY_PWD)); // configuration.put(com.walker.pay.allinpaycloud.Constants.CONFIG_KEY_PUBLIC_KEY, this.argumentsManager.getVariable(com.walker.pay.allinpaycloud.Constants.CONFIG_KEY_PUBLIC_KEY)); List payVariableList = this.argumentsManager.getVariableList(String.valueOf(Constants.VARIABLE_FORM_PAY)); for(Variable v : payVariableList){ configuration.put(v.getId(), v); } // 2023-09-15,微信小程序相关配置 Variable miniAppId = this.argumentsManager.getVariable(WechatConstants.WECHAT_MINI_APPID); Variable miniPaySecret = this.argumentsManager.getVariable(WechatConstants.WECHAT_PAY_MINI_KEY); Variable miniMchId = this.argumentsManager.getVariable(WechatConstants.WECHAT_PAY_MINI_MCHID); configuration.put(miniAppId.getId(), miniAppId); configuration.put(miniPaySecret.getId(), miniPaySecret); configuration.put(miniMchId.getId(), miniMchId); return configuration; } public void setArgumentsManager(ArgumentsManager argumentsManager) { this.argumentsManager = argumentsManager; } public void setPayDefinitionService(PayDefinitionServiceImpl payDefinitionService) { this.payDefinitionService = payDefinitionService; } public void setRestTemplate(RestTemplate restTemplate) { this.restTemplate = restTemplate; } public void setPayProperties(PayProperties payProperties) { this.payProperties = payProperties; } public void setPlatformOrderService(PlatformOrderServiceImpl platformOrderService) { this.platformOrderService = platformOrderService; } private PayProperties payProperties; private RestTemplate restTemplate; private PlatformOrderServiceImpl platformOrderService; private PayDefinitionServiceImpl payDefinitionService = null; private ArgumentsManager argumentsManager = null; }