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