package com.iotechn.unimall.biz.config.pay; import cn.hutool.core.codec.Base64; import com.dobbinsoft.fw.core.util.SessionUtil; import com.dobbinsoft.fw.pay.callback.PayHttpCallbackServlet; import com.dobbinsoft.fw.pay.config.PayProperties; import com.dobbinsoft.fw.pay.enums.PayPlatformType; import com.dobbinsoft.fw.pay.handler.MatrixPayCallbackHandler; import com.dobbinsoft.fw.pay.service.pay.MatrixPayService; import com.dobbinsoft.fw.pay.service.pay.MatrixPayServiceImpl; import com.dobbinsoft.fw.support.properties.FwAliAppProperties; import com.dobbinsoft.fw.support.properties.FwWxAppProperties; import com.dobbinsoft.fw.support.properties.FwWxPayProperties; import com.iotechn.unimall.biz.pay.OrderPayCallbackHandler; import com.iotechn.unimall.biz.pay.VipOrderPayCallbackHandler; import com.iotechn.unimall.data.dto.AdminDTO; import com.iotechn.unimall.data.dto.UserDTO; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.web.servlet.ServletRegistrationBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.util.ObjectUtils; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; @Configuration public class PayConfig { @Autowired private FwWxPayProperties fwWxPayProperties; @Autowired private FwAliAppProperties fwAliAppProperties; @Autowired private FwWxAppProperties fwWxAppProperties; @Autowired private SessionUtil sessionUtil; private static final Logger logger = LoggerFactory.getLogger(PayConfig.class); private abstract class AbstractPayProperties implements PayProperties { @Override public String getWxAppId() { return null; } @Override public String getWxMchId() { return null; } @Override public String getWxMchKey() { return null; } @Override public String getWxNotifyUrl() { return null; } @Override public byte[] getWxCert() { return new byte[0]; } @Override public String getAliGateway() { return fwAliAppProperties.getAliGateway(); } @Override public String getAliNotifyUrl() { return fwAliAppProperties.getAppNotifyUrl(); } } @Bean public MatrixPayService matrixPayService() { MatrixPayServiceImpl matrixPayService = new MatrixPayServiceImpl(new PayDynamicPropertiesImpl()); List payProperties = new ArrayList<>(); if (!ObjectUtils.isEmpty(fwAliAppProperties.getMiniAppId())) { payProperties.add(new AbstractPayProperties() { @Override public String getAliAppId() { return fwAliAppProperties.getMiniAppId(); } @Override public String getAliMchPrivateKey() { return fwAliAppProperties.getMiniAppPrivateKey2(); } @Override public String getAliAliPublicKey() { return fwAliAppProperties.getMiniAppPublicKey1(); } }); } if (!ObjectUtils.isEmpty(fwAliAppProperties.getAppId())) { payProperties.add(new AbstractPayProperties() { @Override public String getAliAppId() { return fwAliAppProperties.getAppId(); } @Override public String getAliMchPrivateKey() { return fwAliAppProperties.getAppPrivateKey2(); } @Override public String getAliAliPublicKey() { return fwAliAppProperties.getAppPublicKey1(); } }); } if (!ObjectUtils.isEmpty(fwAliAppProperties.getWapAppId())) { payProperties.add(new AbstractPayProperties() { @Override public String getAliAppId() { return fwAliAppProperties.getWapAppId(); } @Override public String getAliMchPrivateKey() { return fwAliAppProperties.getWapAppPrivateKey2(); } @Override public String getAliAliPublicKey() { return fwAliAppProperties.getWapAppPublicKey1(); } }); } /** * 先将支付宝client加载到内存 */ matrixPayService.configWarmUp(payProperties); return matrixPayService; } @Bean public OrderPayCallbackHandler orderPayCallbackHandler() { return new OrderPayCallbackHandler(); } @Bean public VipOrderPayCallbackHandler vipOrderPayCallbackHandler() { return new VipOrderPayCallbackHandler(); } @Bean public ServletRegistrationBean servletRegistrationBean() { Map urlHandlerMap = new HashMap<>(); urlHandlerMap.put("/cb/pay", orderPayCallbackHandler()); urlHandlerMap.put("/cb/pay/vip", vipOrderPayCallbackHandler()); return new ServletRegistrationBean(new PayHttpCallbackServlet(matrixPayService(), urlHandlerMap), urlHandlerMap.keySet().toArray(new String[]{})); } /** * MatrixPay 获取外部配置的接口实现类 */ public class PayDynamicPropertiesImpl implements PayProperties { @Override public String getWxAppId() { // 根据用户会话来决定,使用哪个APPID UserDTO user = sessionUtil.getUser(); if (user == null) { return null; } Integer platform = user.getPlatform(); if (PayPlatformType.MP.getCode() == platform) { return fwWxAppProperties.getMiniAppId(); } else if (PayPlatformType.APP.getCode() == platform) { return fwWxAppProperties.getAppId(); } else if (PayPlatformType.WAP.getCode() == platform) { return fwWxAppProperties.getH5AppId(); } return null; } @Override public String getWxMchId() { return fwWxPayProperties.getMchId(); } @Override public String getWxMchKey() { return fwWxPayProperties.getMchKey(); } @Override public String getWxNotifyUrl() { return fwWxPayProperties.getNotifyUrl(); } @Override public byte[] getWxCert() { String keyContent = fwWxPayProperties.getKeyContent(); if (!ObjectUtils.isEmpty(keyContent)) { return Base64.decode(fwWxPayProperties.getKeyContent()); } return new byte[0]; } @Override public String getAliGateway() { return fwAliAppProperties.getAliGateway(); } @Override public String getAliAppId() { // 根据用户会话来决定,使用哪个APPID UserDTO user = sessionUtil.getUser(); if (user == null) { return null; } Integer platform = user.getPlatform(); if (PayPlatformType.MP.getCode() == platform) { return fwAliAppProperties.getMiniAppId(); } else if (PayPlatformType.APP.getCode() == platform) { return fwAliAppProperties.getAppId(); } else if (PayPlatformType.WAP.getCode() == platform) { return fwAliAppProperties.getWapAppId(); } return null; } @Override public String getAliMchPrivateKey() { UserDTO user = sessionUtil.getUser(); if (user == null) { return null; } Integer platform = user.getPlatform(); if (PayPlatformType.MP.getCode() == platform) { return fwAliAppProperties.getMiniAppPrivateKey2(); } else if (PayPlatformType.APP.getCode() == platform) { return fwAliAppProperties.getAppPrivateKey2(); } else if (PayPlatformType.WAP.getCode() == platform) { return fwAliAppProperties.getWapAppPrivateKey2(); } return null; } @Override public String getAliAliPublicKey() { UserDTO user = sessionUtil.getUser(); if (user == null) { return null; } Integer platform = user.getPlatform(); if (PayPlatformType.MP.getCode() == platform) { return fwAliAppProperties.getMiniAppPublicKey1(); } else if (PayPlatformType.APP.getCode() == platform) { return fwAliAppProperties.getAppPublicKey1(); } else if (PayPlatformType.WAP.getCode() == platform) { return fwAliAppProperties.getWapAppPublicKey1(); } return null; } @Override public String getAliNotifyUrl() { return fwAliAppProperties.getAppNotifyUrl(); } } }