package com.walker.pay.wechat; import com.walker.infrastructure.utils.ClassUtils; import com.walker.pay.AbstractPayEngineManager; import com.walker.pay.AbstractPayEngineProvider; import com.walker.pay.Order; import com.walker.pay.PayChannel; import com.walker.pay.PayDefinition; import com.walker.pay.PayEngineNotFoundException; import com.walker.pay.PayEngineProvider; import com.walker.pay.ServiceProvider; import com.walker.pay.support.DefaultOrder; import com.walker.pay.support.DefaultPayDefinition; import com.walker.pay.wechat.v2.WechatV2OrderCallback; import org.springframework.web.client.RestTemplate; import java.lang.reflect.Constructor; import java.util.ArrayList; import java.util.List; public class DemoPayEngineManager extends AbstractPayEngineManager { private RestTemplate restTemplate; public DemoPayEngineManager(RestTemplate restTemplate){ this.restTemplate = restTemplate; } @Override protected List acquirePayDefinitionList() { return this.createTestPayDefinitionList(); } @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.setServiceProvider(payDefinition.getServiceProvider()); // payEngineProvider.setPayChannel(payDefinition.getPayChannel()); // payEngineProvider.setVersion(payDefinition.getVersion()); // 设置通知数据转换器,暂时还没有实现。 // payEngineProvider.setOrderNotifyConvertor(); // 设置定义的订单回调业务实现。 payEngineProvider.setOrderCallback(payDefinition.getOrderCallback()); return payEngineProvider; } catch (ClassNotFoundException e) { throw new PayEngineNotFoundException(payDefinition.getId(), "未找到'PayEngineProviderClass':" + payDefinition.getPayEngineProviderClass(), e); } catch (NoSuchMethodException e){ throw new PayEngineNotFoundException(payDefinition.getId(), "未找到构造方法:getConstructor(RestTemplate.class)", e); } catch (Exception ex){ throw new PayEngineNotFoundException(payDefinition.getId(), "创建'PayEngineProvider'失败:" + ex.getMessage(), ex); } } @Override protected Order acquireOrder(String orderId) { // 2023-02-23 目前获取订单只是要支付定义id DefaultOrder order = new DefaultOrder(); order.setPayDefinitionId("Wechat_v2"); return order; } private List createTestPayDefinitionList(){ // Map configuration = new HashMap<>(); // configuration.put(Constants.CONFIG_KEY_APP_ID, new DefaultVariable(VariableType.String, "wx8e4834af01a60a32", null)); // configuration.put(Constants.CONFIG_KEY_MCH_ID, new DefaultVariable(VariableType.String, "1630059373", null)); // configuration.put(Constants.CONFIG_KEY_API_KEY, new DefaultVariable(VariableType.String, "Zhongzhouzhihuishuili12345678901", null)); DefaultPayDefinition d1 = new DefaultPayDefinition(); d1.setServiceProvider(ServiceProvider.Wechat); d1.setVersion("v2"); d1.setPayChannel(PayChannel.ProviderDirect); d1.setName("定义: 微信支付v2"); d1.setEnabled(true); d1.setPayEngineProviderClass("com.walker.pay.wechat.WechatV2PayEngineProvider"); d1.setConfiguration(this.getConfiguration()); d1.setOrderCallback(new WechatV2OrderCallback()); DefaultPayDefinition d2 = new DefaultPayDefinition(); d2.setServiceProvider(ServiceProvider.Wechat); d2.setVersion("v3"); d2.setPayChannel(PayChannel.ProviderDirect); d2.setName("定义: 微信支付v3"); d2.setEnabled(true); d2.setPayEngineProviderClass("com.walker.pay.wechat.WechatV3PayEngineProvider"); d2.setConfiguration(this.getConfiguration()); List list = new ArrayList<>(8); list.add(d1); // list.add(d2); return list; } }