소스 검색

优化代码

wuxw 2 년 전
부모
커밋
c5301ffe59

+ 119 - 1
service-acct/src/main/java/com/java110/acct/cmd/payment/NativeQrcodePaymentCmd.java

@@ -9,7 +9,13 @@ import com.java110.core.context.ICmdDataFlowContext;
 import com.java110.core.event.cmd.Cmd;
 import com.java110.core.event.cmd.CmdEvent;
 import com.java110.core.log.LoggerFactory;
+import com.java110.dto.fee.PayFeeDto;
 import com.java110.dto.payment.PaymentOrderDto;
+import com.java110.dto.paymentPool.PaymentPoolDto;
+import com.java110.dto.paymentPoolConfig.PaymentPoolConfigDto;
+import com.java110.intf.acct.IPaymentPoolConfigV1InnerServiceSMO;
+import com.java110.intf.acct.IPaymentPoolV1InnerServiceSMO;
+import com.java110.intf.fee.IPayFeeV1InnerServiceSMO;
 import com.java110.utils.cache.CommonCache;
 import com.java110.utils.cache.MappingCache;
 import com.java110.utils.constant.WechatConstant;
@@ -18,10 +24,12 @@ import com.java110.utils.factory.ApplicationContextFactory;
 import com.java110.utils.util.Assert;
 import com.java110.utils.util.StringUtil;
 import org.slf4j.Logger;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.HttpStatus;
 import org.springframework.http.ResponseEntity;
 
 import java.text.ParseException;
+import java.util.List;
 import java.util.Map;
 
 /**
@@ -36,10 +44,19 @@ public class NativeQrcodePaymentCmd extends Cmd {
 
     protected static final String DEFAULT_PAYMENT_ADAPT = "wechatNativeQrcodePaymentFactory";// 默认微信通用支付
 
+    @Autowired
+    private IPaymentPoolConfigV1InnerServiceSMO paymentPoolConfigV1InnerServiceSMOImpl;
+
+    @Autowired
+    private IPaymentPoolV1InnerServiceSMO paymentPoolV1InnerServiceSMOImpl;
+
+    @Autowired
+    private IPayFeeV1InnerServiceSMO payFeeV1InnerServiceSMOImpl;
 
     @Override
     public void validate(CmdEvent event, ICmdDataFlowContext context, JSONObject reqJson) throws CmdException, ParseException {
         Assert.hasKeyAndValue(reqJson, "business", "未包含业务");
+        Assert.hasKeyAndValue(reqJson, "communityId", "未包含小区");
 
     }
 
@@ -68,7 +85,7 @@ public class NativeQrcodePaymentCmd extends Cmd {
         logger.debug(">>>>>>>>>>>>>>>>支付业务下单返回,{}", JSONObject.toJSONString(paymentOrderDto));
 
         // 3.0 寻找当前支付适配器
-        String payAdapt = MappingCache.getValue(WechatConstant.WECHAT_DOMAIN, WechatConstant.NATIVE_QRCODE_PAYMENT_ADAPT);
+        String payAdapt = computeAdapt(reqJson.getString("business"), reqJson);//MappingCache.getValue(WechatConstant.WECHAT_DOMAIN, WechatConstant.NATIVE_QRCODE_PAYMENT_ADAPT);
         payAdapt = StringUtil.isEmpty(payAdapt) ? DEFAULT_PAYMENT_ADAPT : payAdapt;
 
         if (reqJson.containsKey("payAdapt") && !StringUtil.isEmpty(reqJson.getString("payAdapt"))) {
@@ -94,4 +111,105 @@ public class NativeQrcodePaymentCmd extends Cmd {
         // redis 中 保存 请求参数
         CommonCache.setValue("nativeQrcodePayment_" + paymentOrderDto.getOrderId(), reqJson.toJSONString(), CommonCache.PAY_DEFAULT_EXPIRE_TIME);
     }
+
+
+    /**
+     * 计算适配器
+     *
+     * @param business
+     * @param reqJson
+     * @return
+     */
+    private String computeAdapt(String business, JSONObject reqJson) {
+
+        String communityId = reqJson.getString("communityId");
+        //todo 如果是单个费用缴费
+        PaymentPoolDto paymentPoolDto = ifPayFeeBusiness(business, reqJson);
+        if (paymentPoolDto != null) {
+            reqJson.put("paymentPoolId", paymentPoolDto.getPpId());
+            return paymentPoolDto.getBeanNative();
+        }
+
+        //todo 如果是临时车
+        paymentPoolDto = ifTempCarFeeBusiness(business, communityId);
+        if (paymentPoolDto != null) {
+            reqJson.put("paymentPoolId", paymentPoolDto.getPpId());
+            return paymentPoolDto.getBeanNative();
+        }
+
+        //todo 按小区查询 支付信息
+        paymentPoolDto = new PaymentPoolDto();
+        paymentPoolDto.setCommunityId(communityId);
+        paymentPoolDto.setPayType(PaymentPoolDto.PAY_TYPE_COMMUNITY);
+        List<PaymentPoolDto> paymentPoolDtos = paymentPoolV1InnerServiceSMOImpl.queryPaymentPools(paymentPoolDto);
+        if (paymentPoolDtos == null || paymentPoolDtos.isEmpty()) {
+            throw new IllegalArgumentException("小区未配置支付信息");
+        }
+
+        reqJson.put("paymentPoolId", paymentPoolDtos.get(0).getPpId());
+        return paymentPoolDtos.get(0).getBeanNative();
+    }
+
+    /**
+     * 临时车场景处理
+     *
+     * @param business
+     * @param communityId
+     * @return
+     */
+    private PaymentPoolDto ifTempCarFeeBusiness(String business, String communityId) {
+        if (!"tempCarFee".equals(business)) {
+            return null;
+        }
+        //todo 按小区查询 支付信息
+        PaymentPoolDto paymentPoolDto = new PaymentPoolDto();
+        paymentPoolDto.setCommunityId(communityId);
+        paymentPoolDto.setPayType(PaymentPoolDto.PAY_TYPE_TEMP_CAT);
+        List<PaymentPoolDto> paymentPoolDtos = paymentPoolV1InnerServiceSMOImpl.queryPaymentPools(paymentPoolDto);
+        if (paymentPoolDtos == null || paymentPoolDtos.isEmpty()) {
+            return null;
+        }
+
+        return paymentPoolDtos.get(0);
+    }
+
+    private PaymentPoolDto ifPayFeeBusiness(String business, JSONObject reqJson) {
+        String feeId = "";
+        if (!"payFee".equals(business) || !reqJson.containsKey("feeId")) {
+            return null;
+        }
+
+        feeId = reqJson.getString("feeId");
+        if (StringUtil.isNumber(feeId)) {
+            return null;
+        }
+
+        PayFeeDto feeDto = new PayFeeDto();
+        feeDto.setFeeId(feeId);
+        feeDto.setCommunityId(reqJson.getString("communityId"));
+        List<PayFeeDto> feeDtos = payFeeV1InnerServiceSMOImpl.queryPayFees(feeDto);
+
+        if (feeDtos == null || feeDtos.isEmpty()) {
+            return null;
+        }
+
+        PaymentPoolConfigDto paymentPoolConfigDto = new PaymentPoolConfigDto();
+        paymentPoolConfigDto.setConfigId(feeDtos.get(0).getConfigId());
+        paymentPoolConfigDto.setCommunityId(feeDtos.get(0).getCommunityId());
+        List<PaymentPoolConfigDto> paymentPoolConfigDtos = paymentPoolConfigV1InnerServiceSMOImpl.queryPaymentPoolConfigs(paymentPoolConfigDto);
+        if (paymentPoolConfigDtos == null || paymentPoolConfigDtos.isEmpty()) {
+            return null;
+        }
+
+        PaymentPoolDto paymentPoolDto = new PaymentPoolDto();
+        paymentPoolDto.setPpId(paymentPoolConfigDtos.get(0).getPpId());
+        paymentPoolDto.setCommunityId(paymentPoolConfigDtos.get(0).getCommunityId());
+        paymentPoolDto.setPayType(PaymentPoolDto.PAY_TYPE_FEE_CONFIG);
+        List<PaymentPoolDto> paymentPoolDtos = paymentPoolV1InnerServiceSMOImpl.queryPaymentPools(paymentPoolDto);
+        if (paymentPoolDtos == null || paymentPoolDtos.isEmpty()) {
+            return null;
+        }
+
+        return paymentPoolDtos.get(0);
+    }
 }

+ 47 - 12
service-acct/src/main/java/com/java110/acct/payment/adapt/wechat/WechatNativeQrcodePaymentFactoryAdapt.java

@@ -9,9 +9,11 @@ import com.java110.core.factory.WechatFactory;
 import com.java110.core.log.LoggerFactory;
 import com.java110.dto.payment.NotifyPaymentOrderDto;
 import com.java110.dto.payment.PaymentOrderDto;
+import com.java110.dto.paymentPoolValue.PaymentPoolValueDto;
 import com.java110.dto.wechat.OnlinePayDto;
 import com.java110.dto.wechat.SmallWeChatDto;
 import com.java110.intf.acct.IOnlinePayV1InnerServiceSMO;
+import com.java110.intf.acct.IPaymentPoolValueV1InnerServiceSMO;
 import com.java110.intf.store.ISmallWechatV1InnerServiceSMO;
 import com.java110.intf.user.IOwnerAppUserInnerServiceSMO;
 import com.java110.po.wechat.OnlinePayPo;
@@ -69,18 +71,22 @@ public class WechatNativeQrcodePaymentFactoryAdapt implements IPaymentFactoryAda
     @Autowired
     private IOnlinePayV1InnerServiceSMO onlinePayV1InnerServiceSMOImpl;
 
+
+    @Autowired
+    private IPaymentPoolValueV1InnerServiceSMO paymentPoolValueV1InnerServiceSMOImpl;
+
     @Autowired
     private RestTemplate outRestTemplate;
 
     @Override
     public Map java110Payment(PaymentOrderDto paymentOrderDto, JSONObject reqJson, ICmdDataFlowContext context) throws Exception {
         SmallWeChatDto smallWeChatDto = getSmallWechat(reqJson);
-
+        String paymentPoolId = reqJson.getString("paymentPoolId");
 
         String appId = context.getReqHeaders().get("app-id");
         String userId = context.getReqHeaders().get("user-id");
 
-        String notifyUrl = UrlCache.getOwnerUrl() + "/app/payment/notify/nativeWechat/992020011134400001/" + smallWeChatDto.getObjId();
+        String notifyUrl = UrlCache.getOwnerUrl() + "/app/payment/notify/nativeWechat/992020011134400001/" + paymentPoolId;
 
         logger.debug("【小程序支付】 统一下单开始, 订单编号=" + paymentOrderDto.getOrderId());
         SortedMap<String, String> resultMap = new TreeMap<String, String>();
@@ -94,6 +100,7 @@ public class WechatNativeQrcodePaymentFactoryAdapt implements IPaymentFactoryAda
                 TRADE_TYPE_NATIVE,
                 payAmount,
                 smallWeChatDto,
+                paymentPoolId,
                 notifyUrl
         );
 
@@ -113,17 +120,31 @@ public class WechatNativeQrcodePaymentFactoryAdapt implements IPaymentFactoryAda
 
     private Map<String, String> java110UnifieldOrder(String feeName, String orderNum,
                                                      String tradeType, double payAmount,
-                                                     SmallWeChatDto smallWeChatDto, String notifyUrl) throws Exception {
+                                                     SmallWeChatDto smallWeChatDto,
+                                                     String paymentPoolId,
+                                                     String notifyUrl) throws Exception {
 
         //String systemName = MappingCache.getValue(WechatConstant.WECHAT_DOMAIN, WechatConstant.PAY_GOOD_NAME);
 
+        PaymentPoolValueDto paymentPoolValueDto = new PaymentPoolValueDto();
+        paymentPoolValueDto.setPpId(paymentPoolId);
+        List<PaymentPoolValueDto> paymentPoolValueDtos = paymentPoolValueV1InnerServiceSMOImpl.queryPaymentPoolValues(paymentPoolValueDto);
+
+        if (paymentPoolValueDtos == null || paymentPoolValueDtos.isEmpty()) {
+            throw new IllegalArgumentException("配置错误,未配置参数");
+        }
+
+        String mchId = PaymentPoolValueDto.getValue(paymentPoolValueDtos, "WECHAT_MCHID");
+        String key = PaymentPoolValueDto.getValue(paymentPoolValueDtos, "WECHAT_KEY");
+
+
         if (feeName.length() > 127) {
             feeName = feeName.substring(0, 126);
         }
 
         SortedMap<String, String> paramMap = new TreeMap<String, String>();
         paramMap.put("appid", smallWeChatDto.getAppId());
-        paramMap.put("mch_id", smallWeChatDto.getMchId());
+        paramMap.put("mch_id", mchId);
         paramMap.put("nonce_str", PayUtil.makeUUID(32));
         paramMap.put("body", feeName);
         paramMap.put("out_trade_no", orderNum);
@@ -138,7 +159,7 @@ public class WechatNativeQrcodePaymentFactoryAdapt implements IPaymentFactoryAda
             paramMap.put("sub_appid", smallWeChatDto.getAppId());//起调小程序appid
             paramMap.put("sub_mch_id", smallWeChatDto.getMchId());//起调小程序的商户号
         }
-        paramMap.put("sign", PayUtil.createSign(paramMap, smallWeChatDto.getPayPassword()));
+        paramMap.put("sign", PayUtil.createSign(paramMap, key));
 //转换为xml
         String xmlData = PayUtil.mapToXml(paramMap);
 
@@ -212,13 +233,27 @@ public class WechatNativeQrcodePaymentFactoryAdapt implements IPaymentFactoryAda
             }
             paramMap.put(key, map.get(key).toString());
         }
+
+        PaymentPoolValueDto paymentPoolValueDto = new PaymentPoolValueDto();
+        paymentPoolValueDto.setPpId(notifyPaymentOrderDto.getPaymentPoolId());
+        paymentPoolValueDto.setCommunityId(notifyPaymentOrderDto.getCommunityId());
+        List<PaymentPoolValueDto> paymentPoolValueDtos = paymentPoolValueV1InnerServiceSMOImpl.queryPaymentPoolValues(paymentPoolValueDto);
+
+        if (paymentPoolValueDtos == null || paymentPoolValueDtos.isEmpty()) {
+            throw new IllegalArgumentException("配置错误,未配置参数");
+        }
+
+        // String mchId = PaymentPoolValueDto.getValue(paymentPoolValueDtos, "WECHAT_MCHID");
+        String key = PaymentPoolValueDto.getValue(paymentPoolValueDtos, "WECHAT_KEY");
+
+
         //String appId = WechatFactory.getAppId(wId);
-        JSONObject paramIn = new JSONObject();
-        paramIn.put("appId", appId);
-        paramIn.put("communityId", notifyPaymentOrderDto.getCommunityId());
-        SmallWeChatDto smallWeChatDto = getSmallWechat(paramIn);
+//        JSONObject paramIn = new JSONObject();
+//        paramIn.put("appId", appId);
+//        paramIn.put("communityId", notifyPaymentOrderDto.getCommunityId());
+//        SmallWeChatDto smallWeChatDto = getSmallWechat(paramIn);
 
-        String sign = PayUtil.createSign(paramMap, smallWeChatDto.getPayPassword());
+        String sign = PayUtil.createSign(paramMap, key);
 
         if (!sign.equals(map.get("sign"))) {
             throw new IllegalArgumentException("鉴权失败");
@@ -246,8 +281,8 @@ public class WechatNativeQrcodePaymentFactoryAdapt implements IPaymentFactoryAda
             smallWeChatDto = new SmallWeChatDto();
             smallWeChatDto.setAppId(MappingCache.getValue(WechatConstant.WECHAT_DOMAIN, "appId"));
             smallWeChatDto.setAppSecret(MappingCache.getValue(WechatConstant.WECHAT_DOMAIN, "appSecret"));
-            smallWeChatDto.setMchId(MappingCache.getValue(MappingConstant.WECHAT_STORE_DOMAIN, "mchId"));
-            smallWeChatDto.setPayPassword(MappingCache.getValue(MappingConstant.WECHAT_STORE_DOMAIN, "key"));
+//            smallWeChatDto.setMchId(MappingCache.getValue(MappingConstant.WECHAT_STORE_DOMAIN, "mchId"));
+//            smallWeChatDto.setPayPassword(MappingCache.getValue(MappingConstant.WECHAT_STORE_DOMAIN, "key"));
             smallWeChatDto.setObjId(paramIn.getString("communityId"));
 
             return smallWeChatDto;