xdd 2 місяців тому
батько
коміт
b347583c95

+ 2 - 0
fs-service-system/src/main/java/com/fs/store/domain/FsCouponSchedule.java

@@ -14,6 +14,7 @@ import com.fs.common.core.domain.BaseEntity;
 import com.fs.store.config.CustomLocalDateTimeDeserializer;
 import com.hc.openapi.tool.util.StringUtils;
 import lombok.Data;
+import lombok.EqualsAndHashCode;
 import org.apache.commons.collections4.CollectionUtils;
 
 /**
@@ -22,6 +23,7 @@ import org.apache.commons.collections4.CollectionUtils;
  * @author fs
  * @date 2025-03-08
  */
+@EqualsAndHashCode(callSuper = true)
 @Data
 public class FsCouponSchedule extends BaseEntity
 {

+ 75 - 0
fs-service-system/src/main/java/com/fs/store/domain/FsPayConfig.java

@@ -23,4 +23,79 @@ public class FsPayConfig {
     private String hfRefundNotifyUrl;
     private String hfOnlineRefundNotifyUrl;
 
+
+
+    /**
+     * 应用 Key
+     * <p>
+     * 示例值: "1ef7bb04-a987-45c8-bfa9-1276188b085a"
+     * </p>
+     */
+    private String appKey;
+
+    /**
+     * 应用 Secret
+     * <p>
+     * 示例值: "141B81F09FB32DA2F490BEEBA2135316"
+     * </p>
+     */
+    private String appSecret;
+
+    /**
+     * 私钥
+     * <p>
+     * 示例值: "2AA510FB7AB3637F5044472785A9D1D6EEAEDA1A73EF242570A25C3F23C513AD"
+     * </p>
+     */
+    private String privateKey;
+
+    /**
+     * 公钥
+     * <p>
+     * 示例值: "0452469B7E7BBB00A06A59398967A7A2BA0C727317DC42FF72D146F8069131828DACC6587669FBBDA6637787E23E046C71139E17A16BD489569DA10C9126E3C6BB"
+     * </p>
+     */
+    private String publicKey;
+
+    /**
+     * UUID
+     * <p>
+     * 示例值: "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCB"
+     * </p>
+     */
+    private String uuid;
+
+    /**
+     * 应用 ID
+     * <p>
+     * 示例值: "wx19c8813ffc33d1cb"
+     * </p>
+     */
+    private String appid;
+
+    /**
+     * 平台商户号
+     */
+    private String platMerCstNo;
+
+    /**
+     * 交易商户号
+     */
+    private String tradeMerCstNo;
+
+    /**
+     * 业务平台客户号
+     */
+    private String businessCstNo;
+
+    /**
+     * 支付回调url
+     */
+    private String payNotifyUrl;
+
+    /**
+     * 退款回调url
+     */
+    private String refundNotifyUrl;
+
 }

+ 3 - 0
fs-service-system/src/main/java/com/fs/store/service/IFsStoreOrderService.java

@@ -206,4 +206,7 @@ public interface IFsStoreOrderService
 
     ExpressResultDTO updateDeliveryItem(ExpressNotifyDTO notifyDTO);
 
+    R otherPayment(FsStoreOrderOtherPayParam param);
+
+    R otherPaymentRemain(FsStoreOrderOtherPayParam param);
 }

+ 33 - 25
fs-service-system/src/main/java/com/fs/store/service/handler/HfPaymentHandler.java

@@ -4,44 +4,52 @@ import com.fs.common.core.domain.R;
 import com.fs.common.core.redis.RedisCache;
 import com.fs.huifuPay.domain.HuiFuCreateOrder;
 import com.fs.huifuPay.domain.HuifuCreateOrderResult;
+import com.fs.huifuPay.service.HuiFuService;
 import com.fs.huifuPay.service.impl.HuiFuServiceImpl;
 import com.fs.store.domain.FsStoreOrder;
 import com.fs.store.domain.FsStorePayment;
 import com.fs.store.domain.FsUser;
 import com.fs.store.mapper.FsStorePaymentMapper;
+import com.fs.store.service.handler.param.PayProcessContext;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Scope;
 import org.springframework.stereotype.Service;
 
+import java.math.BigDecimal;
 import java.util.concurrent.TimeUnit;
 
+import static org.springframework.beans.factory.config.ConfigurableBeanFactory.SCOPE_PROTOTYPE;
+
+/**
+ * hf支付处理
+ */
 @Service
+@Scope(value = SCOPE_PROTOTYPE)
 public class HfPaymentHandler extends PaymentHandler{
+    @Autowired
+    protected HuiFuService huiFuService;
 
-
-//    @Override
-//    public R process(FsStoreOrder order, FsUser user, String payCode, FsStorePayment storePayment) {
-//        HuiFuCreateOrder o = new HuiFuCreateOrder();
-//        o.setTradeType("T_MINIAPP");
-//        o.setOpenid(user.getMaOpenId());
-//        o.setReqSeqId("store-"+ storePayment.getPayCode());
-//        o.setTransAmt(storePayment.getPayMoney().toString());
-//        o.setGoodsDesc("商城订单支付");
-//        HuifuCreateOrderResult result = huiFuService.createOrder(o);
-//        //创建订单
-//        if(result.getResp_code()!=null&&(result.getResp_code().equals("00000000")||result.getResp_code().equals("00000100"))){
-//            FsStorePayment mt=new FsStorePayment();
-//            mt.setPaymentId(storePayment.getPaymentId());
-//            mt.setTradeNo(result.getHf_seq_id());
-//            fsStorePaymentMapper.updateFsStorePayment(mt);
-//            redisCache.setCacheObject("isPaying:"+ order.getId(), order.getId().toString(),1, TimeUnit.MINUTES);
-//            return R.ok().put("payType", param.getPayType()).put("result", result.getPay_info());
-//        }
-//        else{
-//            return R.error(result.getResp_desc());
-//        }
-//
-//        return null;
-//    }
+    @Override
+    protected R doProcess(PayProcessContext context) {
+        HuiFuCreateOrder o = new HuiFuCreateOrder();
+        o.setTradeType("T_MINIAPP");
+        o.setOpenid(user.getMaOpenId());
+        o.setReqSeqId(context.getOrderPrefix()+ this.fsStorePayment.getPayCode());
+        o.setTransAmt(this.fsStorePayment.getPayMoney().toString());
+        o.setGoodsDesc(context.getGoodsInfo());
+        HuifuCreateOrderResult result = huiFuService.createOrder(o);
+        //创建订单
+        if(result.getResp_code()!=null&&(result.getResp_code().equals("00000000")||result.getResp_code().equals("00000100"))){
+            FsStorePayment mt=new FsStorePayment();
+            mt.setPaymentId(context.getPaymentId());
+            mt.setTradeNo(result.getHf_seq_id());
+            this.fsStorePaymentService.updateFsStorePayment(mt);
+            return R.ok().put("payType", context.getPayType()).put("result", result.getPay_info());
+        }
+        else{
+            return R.error(result.getResp_desc());
+        }
+    }
 
     @Override
     public boolean support(String code) {

+ 43 - 8
fs-service-system/src/main/java/com/fs/store/service/handler/PaymentHandler.java

@@ -1,32 +1,67 @@
 package com.fs.store.service.handler;
 
+import cn.hutool.core.util.ObjectUtil;
 import com.fs.common.core.domain.R;
 import com.fs.common.core.redis.RedisCache;
+import com.fs.huifuPay.service.HuiFuService;
 import com.fs.huifuPay.service.impl.HuiFuServiceImpl;
 import com.fs.store.domain.FsStoreOrder;
 import com.fs.store.domain.FsStorePayment;
 import com.fs.store.domain.FsUser;
 import com.fs.store.mapper.FsStorePaymentMapper;
+import com.fs.store.service.IFsStoreOrderService;
+import com.fs.store.service.IFsStorePaymentService;
+import com.fs.store.service.IFsUserService;
+import com.fs.store.service.handler.param.PayProcessContext;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Scope;
 import org.springframework.stereotype.Service;
 
+import static org.springframework.beans.factory.config.ConfigurableBeanFactory.SCOPE_PROTOTYPE;
+
 @Service
+@Scope(value = SCOPE_PROTOTYPE)
 public abstract class PaymentHandler {
     @Autowired
-    protected HuiFuServiceImpl huiFuService;
-    @Autowired
-    protected FsStorePaymentMapper fsStorePaymentMapper;
+    protected IFsStorePaymentService fsStorePaymentService;
     @Autowired
     protected RedisCache redisCache;
+    @Autowired
+    protected IFsStoreOrderService orderService;
+    @Autowired
+    protected IFsUserService fsUserService;
+
+    // 订单号可能为空
+    protected FsStoreOrder order;
+
+    protected FsUser user;
 
+    protected FsStorePayment fsStorePayment;
     /**
      * 处理支付
-     * @param order 订单信息
-     * @param user 用户信息
-     * @param payCode 支付编码
-     * @return 处理结果
+     * @param context 上下文
+     * @return R
+     */
+    public final R process(PayProcessContext context){
+        if(ObjectUtil.isNotNull(context.getOrderId())){
+            this.order = orderService.selectFsStoreOrderById(context.getOrderId());
+        }
+
+        if(ObjectUtil.isNotNull(context.getUserId())){
+            this.user = fsUserService.selectFsUserById(context.getUserId());
+        }
+
+        if(ObjectUtil.isNotNull(context.getPaymentId())){
+            this.fsStorePayment = fsStorePaymentService.selectFsStorePaymentById(context.getPaymentId());
+        }
+        return doProcess(context);
+    }
+    /**
+     * 子类实现的具体支付处理逻辑
+     * @param context 上下文
+     * @return R
      */
-//    protected R process(FsStoreOrder order, FsUser user, String payCode, FsStorePayment storePayment);
+    protected abstract R doProcess(PayProcessContext context);
 
     /**
      * 是否支持

+ 14 - 7
fs-service-system/src/main/java/com/fs/store/service/handler/PaymentHandlerHolder.java

@@ -4,7 +4,11 @@ import com.fs.common.core.domain.R;
 import com.fs.store.domain.FsStoreOrder;
 import com.fs.store.domain.FsUser;
 import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.BeansException;
+import org.springframework.beans.factory.ObjectProvider;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.ApplicationContext;
+import org.springframework.context.ApplicationContextAware;
 import org.springframework.stereotype.Service;
 
 import java.util.List;
@@ -13,17 +17,20 @@ import java.util.List;
 @Service
 public class PaymentHandlerHolder {
 
-    private static List<PaymentHandler> handlerList;
+    private static ApplicationContext applicationContext;
 
     @Autowired
-    public void setHandlerList(List<PaymentHandler> handlerList) {
-        PaymentHandlerHolder.handlerList = handlerList;
+    public void setApplicationContext(ApplicationContext applicationContext) {
+        PaymentHandlerHolder.applicationContext = applicationContext;
     }
 
-    public static PaymentHandler findBest(String code){
-        for (PaymentHandler paymentHandler : handlerList) {
-            if(paymentHandler.support(code)){
-                return paymentHandler;
+    public static PaymentHandler findBest(String code) {
+        String[] beanNames = applicationContext.getBeanNamesForType(PaymentHandler.class);
+
+        for (String beanName : beanNames) {
+            PaymentHandler handler = (PaymentHandler) applicationContext.getBean(beanName);
+            if (handler.support(code)) {
+                return handler;
             }
         }
         return null;

+ 115 - 0
fs-service-system/src/main/java/com/fs/store/service/handler/TzbkPaymentHandler.java

@@ -0,0 +1,115 @@
+package com.fs.store.service.handler;
+
+import cn.hutool.core.util.StrUtil;
+import com.alibaba.fastjson.JSON;
+import com.fs.common.core.domain.R;
+import com.fs.common.utils.IPUtils;
+import com.fs.common.utils.ServletUtils;
+import com.fs.huifuPay.domain.HuiFuCreateOrder;
+import com.fs.huifuPay.domain.HuifuCreateOrderResult;
+import com.fs.huifuPay.dto.*;
+import com.fs.store.constants.StoreConstants;
+import com.fs.store.domain.FsStorePayment;
+import com.fs.store.domain.TzConfigInfoDTO;
+import com.fs.store.service.handler.param.PayProcessContext;
+import com.fs.system.service.ISysConfigService;
+import com.fs.system.service.impl.SysConfigServiceImpl;
+import com.fs.tzBank.TzBankService;
+import com.fs.tzBank.impl.TzBankServiceImpl;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Scope;
+import org.springframework.stereotype.Service;
+
+import java.time.Instant;
+import java.util.concurrent.TimeUnit;
+
+import static org.springframework.beans.factory.config.ConfigurableBeanFactory.SCOPE_PROTOTYPE;
+
+/**
+ * tzbk支付处理
+ */
+@Service
+@Slf4j
+@Scope(value = SCOPE_PROTOTYPE)
+public class TzbkPaymentHandler extends PaymentHandler{
+
+
+    @Autowired
+    private ISysConfigService configService;
+    @Autowired
+    private TzBankService tzBankService;
+
+
+    @Override
+    protected R doProcess(PayProcessContext context) {
+        String json = configService.selectConfigByKey("store.pay");
+        TzConfigInfoDTO tzConfigInfoDTO = JSON.parseObject(json, TzConfigInfoDTO.class);
+
+        TzPayCreateOrderReqBodyDTO reqBodyDTO = new TzPayCreateOrderReqBodyDTO();
+        RequestDTO<TzPayCreateOrderReqBodyDTO> requestDTO = new RequestDTO<>();
+        reqBodyDTO.setOrderNo(String.valueOf(context.getPayCode()));
+        reqBodyDTO.setOrderSource("02");
+        reqBodyDTO.setTrxAmt(this.fsStorePayment.getPayMoney());
+        reqBodyDTO.setCurrency("CNY");
+        reqBodyDTO.setTransType("2001");
+        reqBodyDTO.setTradeMerCstNo(tzConfigInfoDTO.getPlatMerCstNo());
+        reqBodyDTO.setPlatMerCstNo(tzConfigInfoDTO.getPlatMerCstNo());
+        reqBodyDTO.setBusinessCstNo(user.getUserId().toString());
+        reqBodyDTO.setPayNotifyUrl(tzConfigInfoDTO.getPayNotifyUrl());
+        reqBodyDTO.setPayerName(user.getUsername());
+        reqBodyDTO.setPayerMobileNo(user.getPhone());
+        reqBodyDTO.setGoodsInfo(context.getGoodsInfo());
+        // 不需要分账
+        reqBodyDTO.setNeedLedger("00");
+        reqBodyDTO.setClientIp(IPUtils.getIpAddr(ServletUtils.getRequest()));
+
+        // 获取当前时间戳
+        Instant currentTimestamp = Instant.now();
+        // 增加一个小时
+        Instant oneHourLater = currentTimestamp.plusSeconds(3600);
+        reqBodyDTO.setExpiredTime(String.valueOf(oneHourLater.toEpochMilli()));
+
+
+        requestDTO.setReqHeader(TzReqHeaderDTO.getInstance(context.getPayCode()));
+        requestDTO.setReqBody(reqBodyDTO);
+        try {
+            // 创建订单
+            TzReqResultDTO<TzPayCreateOrderRspDTO> payCreateOrder = tzBankService.payCreateOrder(requestDTO);
+            // 获得小程序请求码
+            if("00000000".equals(payCreateOrder.getRetCode())){
+                TzPayCreateOrderRspDTO body = payCreateOrder.getBody();
+
+                RequestDTO<TzMiniProgramCodeReqDTO> reqDTORequestDTO = new RequestDTO<>();
+                TzMiniProgramCodeReqDTO tzMiniProgramCodeReqDTO = new TzMiniProgramCodeReqDTO();
+                tzMiniProgramCodeReqDTO.setOrderNo(body.getOrderFlowNo());
+                tzMiniProgramCodeReqDTO.setPlatMerCstNo(tzConfigInfoDTO.getPlatMerCstNo());
+                tzMiniProgramCodeReqDTO.setBusinessCstNo(user.getUserId().toString());
+                reqDTORequestDTO.setReqHeader(TzReqHeaderDTO.getInstance(context.getPayCode()));
+                reqDTORequestDTO.setReqBody(tzMiniProgramCodeReqDTO);
+                TzReqResultDTO<TzMiniProgramCodeRespDTO> miniProgramCode = tzBankService.miniProgramCode(reqDTORequestDTO);
+                if("00000000".equals(miniProgramCode.getRetCode())){
+                    FsStorePayment mt=new FsStorePayment();
+                    mt.setPaymentId(context.getPaymentId());
+                    mt.setTradeNo(miniProgramCode.getBody().getOrderNo());
+                    this.fsStorePaymentService.updateFsStorePayment(mt);
+                    TzMiniProgramCodeRespDTO result = miniProgramCode.getBody();
+                    result.setPayCode(context.getPayCode());
+                    return R.ok().put("payType",context.getPayType()).put("result",result);
+                } else {
+                    return R.error(miniProgramCode.getRetMsg());
+                }
+            } else {
+                return R.error(payCreateOrder.getRetMsg());
+            }
+        } catch (Throwable e) {
+            log.error("系统异常",e);
+            return R.error("系统异常,请联系管理员!");
+        }
+    }
+
+    @Override
+    public boolean support(String code) {
+        return "tzbk".equals(code);
+    }
+}

+ 56 - 0
fs-service-system/src/main/java/com/fs/store/service/handler/YbPaymentHandler.java

@@ -0,0 +1,56 @@
+package com.fs.store.service.handler;
+
+import com.fs.common.core.domain.R;
+import com.fs.huifuPay.domain.HuiFuCreateOrder;
+import com.fs.huifuPay.domain.HuifuCreateOrderResult;
+import com.fs.pay.pay.domain.CreateWxOrderResult;
+import com.fs.pay.pay.dto.WxJspayDTO;
+import com.fs.pay.pay.service.PayService;
+import com.fs.store.domain.FsStorePayment;
+import com.fs.store.service.handler.param.PayProcessContext;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Scope;
+import org.springframework.stereotype.Service;
+
+import java.util.concurrent.TimeUnit;
+
+import static org.springframework.beans.factory.config.ConfigurableBeanFactory.SCOPE_PROTOTYPE;
+
+/**
+ * hf支付处理
+ */
+@Service
+@Scope(value = SCOPE_PROTOTYPE)
+public class YbPaymentHandler extends PaymentHandler{
+    @Autowired
+    private PayService ybPayService;
+
+    @Override
+    protected R doProcess(PayProcessContext context) {
+        WxJspayDTO p = new WxJspayDTO();
+        p.setPayMoney(fsStorePayment.getPayMoney().toString());
+        p.setLowOrderId(context.getOrderPrefix()+context.getPayCode());
+        p.setBody(context.getGoodsInfo());
+        p.setIsMinipg("1");
+        p.setReturnUrl(context.getFsPayConfig().getYbNotifyUrl());
+        p.setOpenId(user.getMaOpenId());
+        p.setAttach("");
+        p.setStoreid("0");
+        CreateWxOrderResult wxOrder = ybPayService.createWxOrder(p);
+        if(wxOrder.getStatus().equals("100")){
+            FsStorePayment ment=new FsStorePayment();
+            ment.setPaymentId(context.getPaymentId());
+            ment.setTradeNo(wxOrder.getUpOrderId());
+            this.fsStorePaymentService.updateFsStorePayment(ment);
+            return R.ok().put("payType",context.getPayType()).put("result",wxOrder.getPay_info());
+        }
+        else{
+            return R.error(wxOrder.getMessage());
+        }
+    }
+
+    @Override
+    public boolean support(String code) {
+        return "yb".equals(code);
+    }
+}

+ 46 - 0
fs-service-system/src/main/java/com/fs/store/service/handler/param/PayProcessContext.java

@@ -0,0 +1,46 @@
+package com.fs.store.service.handler.param;
+
+import com.fs.store.domain.FsPayConfig;
+import lombok.Data;
+
+@Data
+public class PayProcessContext {
+
+    /**
+     * 订单号
+     */
+    private Long orderId;
+    /**
+     * 用户ID
+     */
+    private Long userId;
+    /**
+     * 支付类型
+     */
+    private Integer payType;
+
+    /**
+     * 支付ID
+     */
+    private Long paymentId;
+
+    /**
+     * payCode
+     */
+    private String payCode;
+
+    /**
+     * 支付配置信息
+     */
+    private FsPayConfig fsPayConfig;
+
+    /**
+     * 订单前缀
+     */
+    private String orderPrefix;
+
+    /**
+     * 货物信息
+     */
+    private String goodsInfo;
+}

+ 224 - 108
fs-service-system/src/main/java/com/fs/store/service/impl/FsStoreOrderServiceImpl.java

@@ -11,6 +11,8 @@ import java.util.*;
 import java.util.concurrent.TimeUnit;
 import java.util.stream.Collectors;
 
+import cn.binarywang.wx.miniapp.api.WxMaService;
+import cn.binarywang.wx.miniapp.bean.WxMaJscode2SessionResult;
 import cn.hutool.core.collection.CollectionUtil;
 import cn.hutool.core.date.DateTime;
 import cn.hutool.core.net.URLDecoder;
@@ -66,6 +68,9 @@ import com.fs.store.enums.*;
 import com.fs.store.mapper.*;
 import com.fs.store.param.*;
 import com.fs.store.service.*;
+import com.fs.store.service.handler.PaymentHandler;
+import com.fs.store.service.handler.PaymentHandlerHolder;
+import com.fs.store.service.handler.param.PayProcessContext;
 import com.fs.store.vo.*;
 import com.fs.pay.service.IPayService;
 import com.fs.pay.service.dto.RefundDTO;
@@ -73,8 +78,12 @@ import com.fs.system.domain.SysConfig;
 import com.fs.system.service.ISysConfigService;
 import com.fs.tzBank.TzBankService;
 import com.fs.tzBank.utils.TzConfigUtils;
+import com.fs.wx.miniapp.config.WxMaConfiguration;
+import com.fs.wx.miniapp.config.WxMaProperties;
+import com.fs.wx.pay.config.WxPayProperties;
 import com.hc.openapi.tool.util.Ids;
 import lombok.Synchronized;
+import me.chanjar.weixin.common.error.WxErrorException;
 import org.apache.commons.collections4.CollectionUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -209,7 +218,11 @@ public class FsStoreOrderServiceImpl implements IFsStoreOrderService
     private IFsStoreProductCacheServiceImpl fsStoreProductCacheService;
     @Autowired
     private FsStorePaymentMapper fsStorePaymentMapper;
+    @Autowired
+    private WxPayProperties wxPayProperties;
 
+    @Autowired
+    private WxMaProperties properties;
     /**
      * 查询订单
      *
@@ -229,7 +242,7 @@ public class FsStoreOrderServiceImpl implements IFsStoreOrderService
         if(order==null){
             return R.error("订单不存在");
         }
-        if(order.getStatus()!= OrderInfoEnum.STATUS_0.getValue()){
+        if(!Objects.equals(order.getStatus(), OrderInfoEnum.STATUS_0.getValue())){
             return R.error("订单状态不正确");
         }
         String orderId=redisCache.getCacheObject("isPaying:"+order.getId());
@@ -268,7 +281,6 @@ public class FsStoreOrderServiceImpl implements IFsStoreOrderService
             }
             String payCode = IdUtil.getSnowflake(0, 0).nextIdStr();
 
-            // 台州银行支付
             if(order.getPayType().equals("1")||order.getPayType().equals("2")){
                 String json = configService.selectConfigByKey("store.pay");
                 FsPayConfig fsPayConfig = JSON.parseObject(json, FsPayConfig.class);
@@ -288,112 +300,24 @@ public class FsStoreOrderServiceImpl implements IFsStoreOrderService
                 storePayment.setBusinessOrderId(order.getId().toString());
                 storePayment.setOrderId(order.getId());
                 fsStorePaymentMapper.insertFsStorePayment(storePayment);
-                if (fsPayConfig.getType().equals("hf")){
-                    HuiFuCreateOrder o = new HuiFuCreateOrder();
-                    o.setTradeType("T_MINIAPP");
-                    o.setOpenid(user.getMaOpenId());
-                    o.setReqSeqId("store-"+ storePayment.getPayCode());
-                    o.setTransAmt(storePayment.getPayMoney().toString());
-                    o.setGoodsDesc("商城订单支付");
-                    HuifuCreateOrderResult result = huiFuService.createOrder(o);
-                    //创建订单
-                    if(result.getResp_code()!=null&&(result.getResp_code().equals("00000000")||result.getResp_code().equals("00000100"))){
-                        FsStorePayment mt=new FsStorePayment();
-                        mt.setPaymentId(storePayment.getPaymentId());
-                        mt.setTradeNo(result.getHf_seq_id());
-                        fsStorePaymentMapper.updateFsStorePayment(mt);
-                        redisCache.setCacheObject("isPaying:"+ order.getId(), order.getId().toString(),1, TimeUnit.MINUTES);
-                        return R.ok().put("payType", param.getPayType()).put("result", result.getPay_info());
-                    }
-                    else{
-                        return R.error(result.getResp_desc());
-                    }
-                } else if(fsPayConfig.getType().equals("tzbk")){
-                    TzConfigInfoDTO tzConfigInfoDTO = JSON.parseObject(json, TzConfigInfoDTO.class);
-
-                    TzPayCreateOrderReqBodyDTO reqBodyDTO = new TzPayCreateOrderReqBodyDTO();
-                    RequestDTO<TzPayCreateOrderReqBodyDTO> requestDTO = new RequestDTO<>();
-                    reqBodyDTO.setOrderNo(payCode);
-                    reqBodyDTO.setOrderSource("02");
-                    reqBodyDTO.setTrxAmt(storePayment.getPayMoney());
-                    reqBodyDTO.setCurrency("CNY");
-                    reqBodyDTO.setTransType("2001");
-                    reqBodyDTO.setTradeMerCstNo(tzConfigInfoDTO.getPlatMerCstNo());
-                    reqBodyDTO.setPlatMerCstNo(tzConfigInfoDTO.getPlatMerCstNo());
-                    reqBodyDTO.setBusinessCstNo(user.getUserId().toString());
-                    reqBodyDTO.setPayNotifyUrl(tzConfigInfoDTO.getPayNotifyUrl());
-                    reqBodyDTO.setPayerName(user.getUsername());
-                    reqBodyDTO.setPayerMobileNo(user.getPhone());
-                    reqBodyDTO.setGoodsInfo("商城订单支付");
-                    // 不需要分账
-                    reqBodyDTO.setNeedLedger("00");
-                    reqBodyDTO.setClientIp(IPUtils.getIpAddr(ServletUtils.getRequest()));
-                    // 获取订单到期时间
-                    String redisKey = String.valueOf(StrUtil.format("{}{}",
-                            StoreConstants.REDIS_ORDER_OUTTIME_UNPAY, order.getId()));
-                    Long expire = redisCache.getExpire(redisKey);
-                    Long currentTimeMillis = System.currentTimeMillis();
-
-                    reqBodyDTO.setExpiredTime(String.valueOf(currentTimeMillis+expire));
-
-
-
-                    requestDTO.setReqHeader(TzReqHeaderDTO.getInstance(payCode));
-                    requestDTO.setReqBody(reqBodyDTO);
-                    try {
-                        // 创建订单
-                        TzReqResultDTO<TzPayCreateOrderRspDTO> payCreateOrder = tzBankService.payCreateOrder(requestDTO);
-                        // 获得小程序请求码
-                        if("00000000".equals(payCreateOrder.getRetCode())){
-                            TzPayCreateOrderRspDTO body = payCreateOrder.getBody();
-
-                            RequestDTO<TzMiniProgramCodeReqDTO> reqDTORequestDTO = new RequestDTO<>();
-                            TzMiniProgramCodeReqDTO tzMiniProgramCodeReqDTO = new TzMiniProgramCodeReqDTO();
-                            tzMiniProgramCodeReqDTO.setOrderNo(body.getOrderFlowNo());
-                            tzMiniProgramCodeReqDTO.setPlatMerCstNo(tzConfigInfoDTO.getPlatMerCstNo());
-                            tzMiniProgramCodeReqDTO.setBusinessCstNo(user.getUserId().toString());
-                            reqDTORequestDTO.setReqHeader(TzReqHeaderDTO.getInstance(payCode));
-                            reqDTORequestDTO.setReqBody(tzMiniProgramCodeReqDTO);
-                            TzReqResultDTO<TzMiniProgramCodeRespDTO> miniProgramCode = tzBankService.miniProgramCode(reqDTORequestDTO);
-                            if("00000000".equals(miniProgramCode.getRetCode())){
-                                FsStorePayment mt=new FsStorePayment();
-                                mt.setPaymentId(storePayment.getPaymentId());
-                                mt.setTradeNo(miniProgramCode.getBody().getOrderNo());
-                                fsStorePaymentMapper.updateFsStorePayment(mt);
-                                redisCache.setCacheObject("isPaying:"+order.getId(),order.getId().toString(),1, TimeUnit.MINUTES);
-                                TzMiniProgramCodeRespDTO result = miniProgramCode.getBody();
-                                result.setPayCode(payCode);
-                                return R.ok().put("payType",param.getPayType()).put("result",result);
-                            } else {
-                                return R.error(miniProgramCode.getRetMsg());
-                            }
-                        }
-                    } catch (Exception e) {
-                        logger.error("系统异常",e);
-                        return R.error("系统异常,请联系管理员!");
-                    }
-                } else if (fsPayConfig.getType().equals("yb")){
-                    WxJspayDTO p = new WxJspayDTO();
-                    p.setPayMoney(order.getPayMoney().toString());
-                    p.setLowOrderId("store-"+payCode);
-                    p.setBody("商城订单支付");
-                    p.setIsMinipg("1");
-                    p.setReturnUrl(fsPayConfig.getYbNotifyUrl());
-                    p.setOpenId(user.getMaOpenId());
-                    p.setAttach("");
-                    p.setStoreid("0");
-                    CreateWxOrderResult wxOrder = ybPayService.createWxOrder(p);
-                    if(wxOrder.getStatus().equals("100")){
-                        FsStorePayment ment=new FsStorePayment();
-                        ment.setPaymentId(storePayment.getPaymentId());
-                        ment.setTradeNo(wxOrder.getUpOrderId());
-                        fsStorePaymentMapper.updateFsStorePayment(ment);
-                        redisCache.setCacheObject("isPaying:"+order.getId(),order.getId().toString(),1, TimeUnit.MINUTES);
-                        return R.ok().put("payType",param.getPayType()).put("result",wxOrder.getPay_info());
-                    }
-                    else{
-                        return R.error(wxOrder.getMessage());
-                    }
+
+                PayProcessContext processContext = new PayProcessContext();
+                processContext.setOrderId(param.getOrderId());
+                processContext.setPayType(param.getPayType());
+                processContext.setPaymentId(storePayment.getPaymentId());
+                processContext.setPayCode(payCode);
+                processContext.setFsPayConfig(fsPayConfig);
+                processContext.setUserId(order.getUserId());
+                processContext.setGoodsInfo("商城订单支付");
+                processContext.setOrderPrefix("store-");
+                PaymentHandler payment = PaymentHandlerHolder.findBest(fsPayConfig.getType());
+                if(ObjectUtil.isNull(payment)){
+                    throw new CustomException("支付方式不存在");
+                }
+                R process = payment.process(processContext);
+                if("200".equals(String.valueOf(process.get("code")))){
+                    redisCache.setCacheObject("isPaying:"+order.getId(),order.getId().toString(),1, TimeUnit.MINUTES);
+                    return process;
                 }
             }
             else if(order.getPayType().equals("3")){
@@ -2988,4 +2912,196 @@ public class FsStoreOrderServiceImpl implements IFsStoreOrderService
         return ExpressResultDTO.success(sysConfig.getKdnId().trim());
     }
 
+    @Override
+    @Transactional(rollbackFor = Throwable.class,propagation = Propagation.REQUIRED)
+    public R otherPayment(FsStoreOrderOtherPayParam param) {
+
+        final WxMaService wxService = WxMaConfiguration.getMaService(properties.getConfigs().get(0).getAppid());
+        try {
+            String ip = IpUtil.getRequestIp();
+            WxMaJscode2SessionResult session = wxService.getUserService().getSessionInfo(param.getCode());
+            FsUser user=userService.selectFsUserByMaOpenId(session.getOpenid());
+            if(user==null){
+                //创建
+                user=new FsUser();
+                user.setUsername("");
+                user.setNickname("微信用户");
+                user.setStatus(1);
+                user.setMaOpenId(session.getOpenid());
+                user.setUnionId(session.getUnionid());
+                user.setIsWeixinAuth(0);
+                user.setLastIp(ip);
+                user.setCreateTime(new Date());
+                userService.insertFsUser(user);
+            }
+            FsStoreOrder order=orderService.selectFsStoreOrderById(param.getOrderId());
+            if(order==null){
+                return R.error("订单不存在");
+            }
+            if(order.getStatus()!= OrderInfoEnum.STATUS_0.getValue()){
+                return R.error("此订单不能支付");
+            }
+            if(order.getPayMoney().compareTo(new BigDecimal(0))<1){
+                return R.error("此订单没有可支付的金额");
+            }
+
+            String orderId=redisCache.getCacheObject("isPaying:"+order.getId());
+            if(StringUtils.isNotEmpty(orderId)&&orderId.equals(order.getId().toString())){
+                return R.error("正在支付中...");
+            }
+
+
+            String payCode = IdUtil.getSnowflake(0, 0).nextIdStr();
+            String json = configService.selectConfigByKey("store.pay");
+            FsPayConfig fsPayConfig = JSON.parseObject(json, FsPayConfig.class);
+            FsStorePayment storePayment=new FsStorePayment();
+            storePayment.setCompanyId(order.getCompanyId());
+            storePayment.setCompanyUserId(order.getCompanyUserId());
+            storePayment.setStatus(0);
+            storePayment.setPayMode(fsPayConfig.getType());
+            storePayment.setPayCode(payCode);
+            storePayment.setPayMoney(order.getPayMoney());
+            storePayment.setCreateTime(new Date());
+            storePayment.setPayTypeCode("weixin");
+            storePayment.setBusinessType(2);
+            storePayment.setRemark("商城订单支付");
+            storePayment.setOpenId(session.getOpenid());
+            storePayment.setUserId(user.getUserId());
+            storePayment.setBusinessOrderId(order.getId().toString());
+            storePayment.setOrderId(order.getId());
+            fsStorePaymentMapper.insertFsStorePayment(storePayment);
+            PaymentHandler payment = PaymentHandlerHolder.findBest(fsPayConfig.getType());
+            if(ObjectUtil.isNull(payment)){
+                throw new CustomException("支付方式不存在");
+            }
+            PayProcessContext processContext = new PayProcessContext();
+            processContext.setOrderId(param.getOrderId());
+            processContext.setPayType(null);
+            processContext.setPaymentId(storePayment.getPaymentId());
+            processContext.setPayCode(payCode);
+            processContext.setFsPayConfig(fsPayConfig);
+            processContext.setUserId(order.getUserId());
+            processContext.setGoodsInfo("商城订单支付");
+            processContext.setOrderPrefix("store-");
+
+            R process = payment.process(processContext);
+            if("200".equals(String.valueOf(process.get("code")))){
+                redisCache.setCacheObject("isPaying:"+order.getId(),order.getId().toString(),1, TimeUnit.MINUTES);
+                return process;
+            }
+        } catch (WxErrorException e) {
+            e.printStackTrace();
+            return R.error(e.getMessage());
+        }
+        return R.error("无支付类型");
+    }
+
+    @Override
+    public R otherPaymentRemain(FsStoreOrderOtherPayParam param) {
+        final WxMaService wxService = WxMaConfiguration.getMaService(properties.getConfigs().get(0).getAppid());
+        try {
+            String ip = IpUtil.getRequestIp();
+            WxMaJscode2SessionResult session = wxService.getUserService().getSessionInfo(param.getCode());
+            FsUser user=userService.selectFsUserByMaOpenId(session.getOpenid());
+            if(user==null){
+                //创建
+                user=new FsUser();
+                user.setUsername("");
+                user.setNickname("微信用户");
+                user.setStatus(1);
+                user.setMaOpenId(session.getOpenid());
+                user.setUnionId(session.getUnionid());
+                user.setIsWeixinAuth(0);
+                user.setLastIp(ip);
+                user.setCreateTime(new Date());
+                userService.insertFsUser(user);
+            }
+            FsStoreOrder order=orderService.selectFsStoreOrderById(param.getOrderId());
+            if(order==null){
+                return R.error("订单不存在");
+            }
+            if(order.getStatus()!= OrderInfoEnum.STATUS_2.getValue()){
+                return R.error("待收货订单可申请支付尾款");
+            }
+            if(order.getPayType().equals(1)){
+                return R.error("此订单已支付");
+            }
+            //只有顺风才可以付尾
+            if(!order.getDeliverySn().trim().equals("SF")){
+                return R.error("只有顺丰物流支持尾款支付");
+            }
+
+            if(!order.getIsPayRemain().equals(0)){
+                return R.error("此订单已支付");
+            }
+            String payCode = IdUtil.getSnowflake(0, 0).nextIdStr();
+            //易宝支付
+            String json = configService.selectConfigByKey("store.pay");
+            FsPayConfig fsPayConfig = JSON.parseObject(json, FsPayConfig.class);
+            FsStorePayment storePayment=new FsStorePayment();
+            storePayment.setCompanyId(order.getCompanyId());
+            storePayment.setCompanyUserId(order.getCompanyUserId());
+            storePayment.setStatus(0);
+            storePayment.setPayCode(payCode);
+            storePayment.setPayMoney(order.getPayDelivery());
+            storePayment.setCreateTime(new Date());
+            storePayment.setPayTypeCode("weixin");
+            storePayment.setBusinessType(2);
+            storePayment.setRemark("商城订单尾款支付");
+            storePayment.setOpenId(user.getRealName());
+            storePayment.setUserId(user.getUserId());
+            storePayment.setBusinessOrderId(order.getId().toString());
+            storePayment.setOrderId(order.getId());
+            storePayment.setIsPayRemain(1);
+            storePayment.setPayMode(fsPayConfig.getType());
+            fsStorePaymentMapper.insertFsStorePayment(storePayment);
+            if (fsPayConfig.getType().equals("hf")){
+                HuiFuCreateOrder o = new HuiFuCreateOrder();
+                o.setTradeType("T_MINIAPP");
+                o.setOpenid(user.getMaOpenId());
+                o.setReqSeqId("store_remain-"+storePayment.getPayCode());
+                o.setTransAmt(storePayment.getPayMoney().toString());
+                o.setGoodsDesc("支付订单尾款");
+                HuifuCreateOrderResult result = huiFuService.createOrder(o);
+                if(result.getResp_code()!=null&&(result.getResp_code().equals("00000000")||result.getResp_code().equals("00000100"))){
+                    FsStorePayment mt=new FsStorePayment();
+                    mt.setPaymentId(storePayment.getPaymentId());
+                    mt.setTradeNo(result.getHf_seq_id());
+                    fsStorePaymentMapper.updateFsStorePayment(mt);
+                    redisCache.setCacheObject("isPaying:"+order.getId(),order.getId().toString(),1, TimeUnit.MINUTES);
+                    return R.ok().put("result",result.getPay_info());
+                }else{
+                    return R.error(result.getResp_desc());
+                }
+            }else if (fsPayConfig.getType().equals("yb")){
+                WxJspayDTO p = new WxJspayDTO();
+                // 使用setter方法为对象赋值
+                p.setPayMoney(order.getPayDelivery().toString());
+                p.setLowOrderId("store_remain-"+payCode);
+                p.setBody("支付订单尾款");
+                p.setIsMinipg("1");
+                p.setReturnUrl(fsPayConfig.getYbNotifyUrl());
+                p.setOpenId(user.getMaOpenId());
+                p.setAttach("");
+                p.setStoreid("0");
+                CreateWxOrderResult wxOrder = ybPayService.createWxOrder(p);
+                if(wxOrder.getStatus().equals("100")){
+                    FsStorePayment ment=new FsStorePayment();
+                    ment.setPaymentId(storePayment.getPaymentId());
+                    ment.setTradeNo(wxOrder.getUpOrderId());
+                    fsStorePaymentMapper.updateFsStorePayment(ment);
+                    return R.ok().put("result",wxOrder.getPay_info());
+                }
+                else{
+                    return R.error(wxOrder.getMessage());
+                }
+            }
+        } catch (WxErrorException e) {
+            e.printStackTrace();
+            return R.error(e.getMessage());
+        }
+
+        return R.error("无支付类型");
+    }
+
 }

+ 23 - 154
fs-service-system/src/main/java/com/fs/store/service/impl/FsStorePaymentServiceImpl.java

@@ -8,6 +8,7 @@ import java.util.Map;
 import java.util.concurrent.TimeUnit;
 
 import cn.hutool.core.util.IdUtil;
+import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.StrUtil;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
@@ -16,6 +17,7 @@ import com.fs.common.config.FSConfig;
 import com.fs.common.config.FSSysConfig;
 import com.fs.common.core.controller.BaseController;
 import com.fs.common.core.domain.R;
+import com.fs.common.exception.CustomException;
 import com.fs.common.utils.DateUtils;
 import com.fs.common.utils.IPUtils;
 import com.fs.common.utils.ServletUtils;
@@ -28,6 +30,9 @@ import com.fs.huifuPay.dto.*;
 import com.fs.huifuPay.service.HuiFuService;
 import com.fs.store.constants.StoreConstants;
 import com.fs.store.service.IFsStoreOrderService;
+import com.fs.store.service.handler.PaymentHandler;
+import com.fs.store.service.handler.PaymentHandlerHolder;
+import com.fs.store.service.handler.param.PayProcessContext;
 import com.fs.tzBank.TzBankService;
 import com.fs.pay.pay.domain.CreateWxOrderResult;
 import com.fs.pay.pay.dto.WxJspayDTO;
@@ -57,6 +62,7 @@ import org.springframework.stereotype.Service;
 import com.fs.store.mapper.FsStorePaymentMapper;
 import com.fs.store.domain.FsStorePayment;
 import com.fs.store.service.IFsStorePaymentService;
+import org.springframework.transaction.annotation.Propagation;
 import org.springframework.transaction.annotation.Transactional;
 
 /**
@@ -174,34 +180,17 @@ public class FsStorePaymentServiceImpl implements IFsStorePaymentService
     }
 
     @Override
-    @Transactional
+    @Transactional(rollbackFor = Throwable.class,propagation = Propagation.REQUIRED)
     public R payment(FsStorePaymentPayParam payment) {
         if(payment.getPayMoney().compareTo(new BigDecimal(0.0))<1){
             return R.error("支付金额必须大于0");
         }
-        // //获取OPENID
-        // final WxMaService wxService = WxMaConfiguration.getMaService(properties.getConfigs().get(0).getAppid());
+
         String orderSn = IdUtil.getSnowflake(0, 0).nextIdStr();
-        // WxMaJscode2SessionResult session = null;
-        // try {
-        //     session = wxService.getUserService().getSessionInfo(payment.getCode());
-        // } catch (WxErrorException e) {
-        //     e.printStackTrace();
-        // }
+
         CompanyUser companyUser=companyUserService.selectCompanyUserById(payment.getCompanyUserId());
         FsUser user=userService.selectFsUserById(payment.getUserId());
-        // if(user==null){
-        //     //写入
-        //     user=new FsUser();
-        //     user.setPhone("");
-        //     user.setUsername("");
-        //     user.setNickname("微信用户");
-        //     user.setStatus(1);
-        //     user.setOpenId(session.getOpenid());
-        //     user.setLastIp(IpUtil.getRequestIp());
-        //     user.setIsWeixinAuth(0);
-        //     userService.insertFsUser(user);
-        // }
+
 
         String json = configService.selectConfigByKey("store.pay");
         FsPayConfig fsPayConfig = JSON.parseObject(json, FsPayConfig.class);
@@ -224,140 +213,20 @@ public class FsStorePaymentServiceImpl implements IFsStorePaymentService
         storePayment.setDeptId(companyUser.getDeptId());
         //易宝支付
         fsStorePaymentMapper.insertFsStorePayment(storePayment);
-        if (fsPayConfig.getType().equals("hf")){
-            HuiFuCreateOrder o = new HuiFuCreateOrder();
-            o.setTradeType("T_MINIAPP");
-            o.setOpenid(user.getMaOpenId());
-            o.setReqSeqId("payment-"+storePayment.getPayCode());
-            o.setTransAmt(storePayment.getPayMoney().setScale(2, BigDecimal.ROUND_HALF_UP).toString());
-            o.setGoodsDesc("医学管理方案服务");
-            logger.info("汇付支付参数:"+o);
-            HuifuCreateOrderResult result = huiFuService.createOrder(o);
-            //创建订单
-            if(result.getResp_code()!=null&&(result.getResp_code().equals("00000000")||result.getResp_code().equals("00000100"))){
-                FsStorePayment mt=new FsStorePayment();
-                mt.setPaymentId(storePayment.getPaymentId());
-                mt.setTradeNo(result.getHf_seq_id());
-                fsStorePaymentMapper.updateFsStorePayment(mt);
-
-                return R.ok().put("result",result.getPay_info());
-            }
-            else{
-                return R.error(result.getResp_desc());
-            }
-        }else  if (fsPayConfig.getType().equals("yb")){
-            WxJspayDTO p = new WxJspayDTO();
-            // 使用setter方法为对象赋值
-            p.setPayMoney(storePayment.getPayMoney().toString());
-            p.setLowOrderId("payment-"+storePayment.getPayCode());
-            p.setBody("医学管理方案服务");
-            p.setIsMinipg("1");
-            p.setReturnUrl(fsPayConfig.getYbNotifyUrl());
-            p.setOpenId(user.getMaOpenId());
-            p.setAttach("");
-            p.setStoreid("0");
-            CreateWxOrderResult wxOrder = ybPayService.createWxOrder(p);
-            if(wxOrder.getStatus().equals("100")){
-                FsStorePayment ment=new FsStorePayment();
-                ment.setPaymentId(storePayment.getPaymentId());
-                ment.setTradeNo(wxOrder.getUpOrderId());
-                fsStorePaymentMapper.updateFsStorePayment(ment);
-                return R.ok().put("result",wxOrder.getPay_info());
-            }
-            else{
-                return R.error(wxOrder.getMessage());
-            }
-        } else if(fsPayConfig.getType().equals("tzbk")){
-            TzConfigInfoDTO tzConfigInfoDTO = JSON.parseObject(json, TzConfigInfoDTO.class);
-
-            TzPayCreateOrderReqBodyDTO reqBodyDTO = new TzPayCreateOrderReqBodyDTO();
-            RequestDTO<TzPayCreateOrderReqBodyDTO> requestDTO = new RequestDTO<>();
-            String payCode = storePayment.getPayCode();
-            reqBodyDTO.setOrderNo(storePayment.getPayCode());
-            reqBodyDTO.setOrderSource("02");
-            reqBodyDTO.setTrxAmt(storePayment.getPayMoney());
-            reqBodyDTO.setCurrency("CNY");
-            reqBodyDTO.setTransType("2001");
-            reqBodyDTO.setTradeMerCstNo(tzConfigInfoDTO.getPlatMerCstNo());
-            reqBodyDTO.setPlatMerCstNo(tzConfigInfoDTO.getPlatMerCstNo());
-            reqBodyDTO.setBusinessCstNo(user.getUserId().toString());
-            reqBodyDTO.setPayNotifyUrl(tzConfigInfoDTO.getPayNotifyUrl());
-            reqBodyDTO.setPayerName(user.getUsername());
-            reqBodyDTO.setPayerMobileNo(user.getPhone());
-            reqBodyDTO.setGoodsInfo("微信收款");
-            // 不需要分账
-            reqBodyDTO.setNeedLedger("00");
-            reqBodyDTO.setClientIp(IPUtils.getIpAddr(ServletUtils.getRequest()));
-            // 获取订单到期时间
-            // 获取当前时间戳
-            Instant currentTimestamp = Instant.now();
-            // 增加一个小时
-            Instant oneHourLater = currentTimestamp.plusSeconds(3600);
-
-            reqBodyDTO.setExpiredTime(String.valueOf(oneHourLater.toEpochMilli()));
-
-            requestDTO.setReqHeader(TzReqHeaderDTO.getInstance(payCode));
-            requestDTO.setReqBody(reqBodyDTO);
-            try {
-                // 创建订单
-                TzReqResultDTO<TzPayCreateOrderRspDTO> payCreateOrder = tzBankService.payCreateOrder(requestDTO);
-                // 获得小程序请求码
-                if("00000000".equals(payCreateOrder.getRetCode())){
-                    TzPayCreateOrderRspDTO body = payCreateOrder.getBody();
-
-                    RequestDTO<TzMiniProgramCodeReqDTO> reqDTORequestDTO = new RequestDTO<>();
-                    TzMiniProgramCodeReqDTO tzMiniProgramCodeReqDTO = new TzMiniProgramCodeReqDTO();
-                    tzMiniProgramCodeReqDTO.setOrderNo(body.getOrderFlowNo());
-                    tzMiniProgramCodeReqDTO.setPlatMerCstNo(tzConfigInfoDTO.getPlatMerCstNo());
-                    tzMiniProgramCodeReqDTO.setBusinessCstNo(user.getUserId().toString());
-                    reqDTORequestDTO.setReqHeader(TzReqHeaderDTO.getInstance(payCode));
-                    reqDTORequestDTO.setReqBody(tzMiniProgramCodeReqDTO);
-                    TzReqResultDTO<TzMiniProgramCodeRespDTO> miniProgramCode = tzBankService.miniProgramCode(reqDTORequestDTO);
-                    if("00000000".equals(miniProgramCode.getRetCode())){
-                        FsStorePayment ment=new FsStorePayment();
-                        ment.setPaymentId(storePayment.getPaymentId());
-                        ment.setTradeNo(body.getOrderFlowNo());
-                        fsStorePaymentMapper.updateFsStorePayment(ment);
-                        TzMiniProgramCodeRespDTO result = miniProgramCode.getBody();
-                        result.setPayCode(payCode);
-                        return R.ok().put("result",result);
-                    } else {
-                        return R.error(miniProgramCode.getRetMsg());
-                    }
-                } else {
-                    return R.error(payCreateOrder.getRetMsg());
-                }
-            } catch (Exception e) {
-                logger.error("系统异常",e);
-                return R.error("系统异常,请联系管理员!");
-            }
-//            if()
-//            return R.ok().put("result",wxOrder.getPay_info());
-
+        PayProcessContext processContext = new PayProcessContext();
+        processContext.setOrderId(null);
+        processContext.setPayType(null);
+        processContext.setPaymentId(storePayment.getPaymentId());
+        processContext.setPayCode(orderSn);
+        processContext.setFsPayConfig(fsPayConfig);
+        processContext.setUserId(user.getUserId());
+        processContext.setGoodsInfo("医学管理方案服务");
+        processContext.setOrderPrefix("payment-");
+        PaymentHandler paymentHandler = PaymentHandlerHolder.findBest(fsPayConfig.getType());
+        if(ObjectUtil.isNull(payment)){
+            throw new CustomException("支付方式不存在");
         }
-
-        //小雨点支付
-//        CreatePayDTO createPayDTO=new CreatePayDTO();
-//        createPayDTO.setMerchOrderNo("payment-"+storePayment.getPayCode());
-//        List<TradeOrder> orders=new ArrayList<>();
-//        TradeOrder order=new TradeOrder();
-//        order.setAmount(storePayment.getPayMoney().toString());
-//        order.setSubMerchOrderNo("payment-"+storePayment.getPayCode());
-//        order.setTradeName("超重/肥胖/气血/代谢/美乳/慢病医学管理方案服务");
-//        order.setPayeeOutUserId(sysConfig.getPayPartnerId());
-//        orders.add(order);
-//        createPayDTO.setOrders(orders);
-//        payService.createOrder(createPayDTO);
-//        PayDTO payDTO=new PayDTO();
-//        payDTO.setOrigMerchOrderNo("payment-"+storePayment.getPayCode());
-//        payDTO.setOpenID(user.getMaOpenId());
-//        payDTO.setAppID(wxPayProperties.getAppId());
-//        payDTO.setPayerOutUserId(user.getUserId().toString());
-//        payDTO.setPayerOutUserName(user.getNickname());
-//        payDTO.setUserIp(IPUtils.getIpAddr(ServletUtils.getRequest()));
-//        return R.ok().put("result",payService.payOrder(payDTO));
-        return R.error("无支付类型");
-
+        return paymentHandler.process(processContext);
     }
 
     @Override

+ 20 - 300
fs-user-app/src/main/java/com/fs/app/controller/StoreOrderController.java

@@ -21,6 +21,9 @@ import com.fs.huifuPay.domain.HuiFuCreateOrder;
 import com.fs.huifuPay.domain.HuifuCreateOrderResult;
 import com.fs.huifuPay.dto.*;
 import com.fs.huifuPay.service.HuiFuService;
+import com.fs.store.service.handler.PaymentHandler;
+import com.fs.store.service.handler.PaymentHandlerHolder;
+import com.fs.store.service.handler.param.PayProcessContext;
 import com.fs.tzBank.TzBankService;
 import com.fs.pay.pay.domain.CreateWxOrderResult;
 import com.fs.pay.pay.dto.OrderQueryDTO;
@@ -74,11 +77,6 @@ import java.util.concurrent.TimeUnit;
 public class StoreOrderController extends  AppBaseController {
 
     Logger logger= LoggerFactory.getLogger(getClass());
-    @Autowired
-    private WxPayProperties wxPayProperties;
-
-    @Autowired
-    private WxMaProperties properties;
 
     @Autowired
     private WxPayService wxPayService;
@@ -112,7 +110,8 @@ public class StoreOrderController extends  AppBaseController {
     PayService ybPayService;
     @Autowired
     TzBankService tzBankService;
-
+    @Autowired
+    private WxMaProperties properties;
 
 
     @Login
@@ -338,7 +337,7 @@ public class StoreOrderController extends  AppBaseController {
         R result = null;
         try {
             result = orderService.pay(param);
-        } catch (Exception e) {
+        } catch (Throwable e) {
             logger.error("支付过程中发生异常, 订单号: {}", param.getOrderId(), e);
             throw e;
         } finally {
@@ -557,172 +556,23 @@ public class StoreOrderController extends  AppBaseController {
     @Login
     @ApiOperation("亲友支付")
     @PostMapping("/otherPayment")
-    @Transactional
     public R otherPayment(@Validated @RequestBody FsStoreOrderOtherPayParam param, HttpServletRequest request){
-        final WxMaService wxService = WxMaConfiguration.getMaService(properties.getConfigs().get(0).getAppid());
-        try {
-            String ip = IpUtil.getRequestIp();
-            WxMaJscode2SessionResult session = wxService.getUserService().getSessionInfo(param.getCode());
-            FsUser user=userService.selectFsUserByMaOpenId(session.getOpenid());
-            if(user==null){
-                //创建
-                user=new FsUser();
-                user.setUsername("");
-                user.setNickname("微信用户");
-                user.setStatus(1);
-                user.setMaOpenId(session.getOpenid());
-                user.setUnionId(session.getUnionid());
-                user.setIsWeixinAuth(0);
-                user.setLastIp(ip);
-                user.setCreateTime(new Date());
-                userService.insertFsUser(user);
-            }
-            FsStoreOrder order=orderService.selectFsStoreOrderById(param.getOrderId());
-            if(order==null){
-                return R.error("订单不存在");
-            }
-            if(order.getStatus()!= OrderInfoEnum.STATUS_0.getValue()){
-                return R.error("此订单不能支付");
-            }
-            if(order.getPayMoney().compareTo(new BigDecimal(0))<1){
-                return R.error("此订单没有可支付的金额");
-            }
-
-            String orderId=redisCache.getCacheObject("isPaying:"+order.getId());
-            if(StringUtils.isNotEmpty(orderId)&&orderId.equals(order.getId().toString())){
-                return R.error("正在支付中...");
-            }
 
-
-            String payCode = IdUtil.getSnowflake(0, 0).nextIdStr();
-            String json = configService.selectConfigByKey("store.pay");
-            FsPayConfig fsPayConfig = JSON.parseObject(json, FsPayConfig.class);
-            FsStorePayment storePayment=new FsStorePayment();
-            storePayment.setCompanyId(order.getCompanyId());
-            storePayment.setCompanyUserId(order.getCompanyUserId());
-            storePayment.setStatus(0);
-            storePayment.setPayMode(fsPayConfig.getType());
-            storePayment.setPayCode(payCode);
-            storePayment.setPayMoney(order.getPayMoney());
-            storePayment.setCreateTime(new Date());
-            storePayment.setPayTypeCode("weixin");
-            storePayment.setBusinessType(2);
-            storePayment.setRemark("商城订单支付");
-            storePayment.setOpenId(session.getOpenid());
-            storePayment.setUserId(user.getUserId());
-            storePayment.setBusinessOrderId(order.getId().toString());
-            storePayment.setOrderId(order.getId());
-            fsStorePaymentMapper.insertFsStorePayment(storePayment);
-            if (fsPayConfig.getType().equals("hf")){
-                HuiFuCreateOrder o = new HuiFuCreateOrder();
-                o.setTradeType("T_MINIAPP");
-                o.setOpenid(user.getMaOpenId());
-                o.setReqSeqId("store-"+storePayment.getPayCode());
-                o.setTransAmt(storePayment.getPayMoney().toString());
-                o.setGoodsDesc("商城订单支付");
-                HuifuCreateOrderResult result = huiFuService.createOrder(o);
-                if(result.getResp_code()!=null&&(result.getResp_code().equals("00000000")||result.getResp_code().equals("00000100"))){
-                    FsStorePayment mt=new FsStorePayment();
-                    mt.setPaymentId(storePayment.getPaymentId());
-                    mt.setTradeNo(result.getHf_seq_id());
-                    fsStorePaymentMapper.updateFsStorePayment(mt);
-                    redisCache.setCacheObject("isPaying:"+order.getId(),order.getId().toString(),1, TimeUnit.MINUTES);
-                    return R.ok().put("result",result.getPay_info());
-                }
-                else{
-                    return R.error(result.getResp_desc());
-                }
-            }else  if (fsPayConfig.getType().equals("yb")){
-                WxJspayDTO p = new WxJspayDTO();
-                // 使用setter方法为对象赋值
-                p.setPayMoney(order.getPayMoney().toString());
-                p.setLowOrderId("store-"+payCode);
-                p.setBody("商城订单支付");
-                p.setIsMinipg("1");
-                p.setReturnUrl(fsPayConfig.getYbNotifyUrl());
-                p.setOpenId(user.getMaOpenId());
-                p.setAttach("");
-                p.setStoreid("0");
-                CreateWxOrderResult wxOrder = ybPayService.createWxOrder(p);
-                if(wxOrder.getStatus().equals("100")){
-                    FsStorePayment ment=new FsStorePayment();
-                    ment.setPaymentId(storePayment.getPaymentId());
-                    ment.setTradeNo(wxOrder.getUpOrderId());
-                    fsStorePaymentMapper.updateFsStorePayment(ment);
-                    redisCache.setCacheObject("isPaying:"+order.getId(),order.getId().toString(),1, TimeUnit.MINUTES);
-                    return R.ok().put("result",wxOrder.getPay_info());
-                }
-                else{
-                    return R.error(wxOrder.getMessage());
-                }
-            } else if(fsPayConfig.getType().equals("tzbk")){
-                TzConfigInfoDTO tzConfigInfoDTO = JSON.parseObject(json, TzConfigInfoDTO.class);
-
-                TzPayCreateOrderReqBodyDTO reqBodyDTO = new TzPayCreateOrderReqBodyDTO();
-                RequestDTO<TzPayCreateOrderReqBodyDTO> requestDTO = new RequestDTO<>();
-                reqBodyDTO.setOrderNo(storePayment.getPayCode());
-                reqBodyDTO.setOrderSource("02");
-                reqBodyDTO.setTrxAmt(storePayment.getPayMoney());
-                reqBodyDTO.setCurrency("CNY");
-                reqBodyDTO.setTransType("2001");
-                reqBodyDTO.setTradeMerCstNo(tzConfigInfoDTO.getPlatMerCstNo());
-                reqBodyDTO.setPlatMerCstNo(tzConfigInfoDTO.getPlatMerCstNo());
-                reqBodyDTO.setBusinessCstNo(user.getUserId().toString());
-                reqBodyDTO.setPayNotifyUrl(tzConfigInfoDTO.getPayNotifyUrl());
-                reqBodyDTO.setPayerName(user.getUsername());
-                reqBodyDTO.setPayerMobileNo(user.getPhone());
-                reqBodyDTO.setGoodsInfo("商城订单支付");
-                // 不需要分账
-                reqBodyDTO.setNeedLedger("00");
-                reqBodyDTO.setClientIp(IPUtils.getIpAddr(ServletUtils.getRequest()));
-                // 获取订单到期时间
-                String redisKey = String.valueOf(StrUtil.format("{}{}",
-                        StoreConstants.REDIS_ORDER_OUTTIME_UNPAY, order.getId()));
-                Long expire = redisCache.getExpire(redisKey);
-                Long currentTimeMillis = System.currentTimeMillis();
-
-                reqBodyDTO.setExpiredTime(String.valueOf(currentTimeMillis+expire));
-
-
-
-                requestDTO.setReqHeader(TzReqHeaderDTO.getInstance(payCode));
-                requestDTO.setReqBody(reqBodyDTO);
-                try {
-                    // 创建订单
-                    TzReqResultDTO<TzPayCreateOrderRspDTO> payCreateOrder = tzBankService.payCreateOrder(requestDTO);
-                    // 获得小程序请求码
-                    if("00000000".equals(payCreateOrder.getRetCode())){
-                        TzPayCreateOrderRspDTO body = payCreateOrder.getBody();
-
-                        RequestDTO<TzMiniProgramCodeReqDTO> reqDTORequestDTO = new RequestDTO<>();
-                        TzMiniProgramCodeReqDTO tzMiniProgramCodeReqDTO = new TzMiniProgramCodeReqDTO();
-                        tzMiniProgramCodeReqDTO.setOrderNo(body.getOrderFlowNo());
-                        tzMiniProgramCodeReqDTO.setPlatMerCstNo(tzConfigInfoDTO.getPlatMerCstNo());
-                        tzMiniProgramCodeReqDTO.setBusinessCstNo(user.getUserId().toString());
-                        reqDTORequestDTO.setReqHeader(TzReqHeaderDTO.getInstance(payCode));
-                        reqDTORequestDTO.setReqBody(tzMiniProgramCodeReqDTO);
-                        TzReqResultDTO<TzMiniProgramCodeRespDTO> miniProgramCode = tzBankService.miniProgramCode(reqDTORequestDTO);
-                        if("00000000".equals(miniProgramCode.getRetCode())){
-                            FsStorePayment mt=new FsStorePayment();
-                            mt.setPaymentId(storePayment.getPaymentId());
-                            mt.setTradeNo(miniProgramCode.getBody().getOrderNo());
-                            fsStorePaymentMapper.updateFsStorePayment(mt);
-                            redisCache.setCacheObject("isPaying:"+order.getId(),order.getId().toString(),1, TimeUnit.MINUTES);
-                            return R.ok().put("result",miniProgramCode.getBody());
-                        } else {
-                            return R.error(miniProgramCode.getRetMsg());
-                        }
-                    }
-                } catch (Exception e) {
-                    logger.error("系统异常",e);
-                    return R.error("系统异常,请联系管理员!");
-                }
+        logger.info("开始处理支付请求, 订单号: {}, 支付类型: 亲友支付", param.getOrderId());
+        R result = null;
+        try {
+            result = orderService.otherPayment(param);
+        } catch (Throwable e) {
+            logger.error("支付过程中发生异常, 订单号: {}", param.getOrderId(), e);
+            throw e;
+        } finally {
+            if (result != null) {
+                logger.info("支付请求处理完成, 订单号: {}, 返回结果: {}", param.getOrderId(), result);
+            } else {
+                logger.info("支付请求处理完成, 订单号: {}, 返回结果为空", param.getOrderId());
             }
-        } catch (WxErrorException e) {
-            e.printStackTrace();
-            return R.error(e.getMessage());
         }
-        return R.error("无支付类型");
+        return result;
     }
 
     @Login
@@ -730,117 +580,13 @@ public class StoreOrderController extends  AppBaseController {
     @PostMapping("/otherPaymentRemain")
     @Transactional
     public R otherPaymentRemain(@Validated @RequestBody FsStoreOrderOtherPayParam param, HttpServletRequest request){
-        final WxMaService wxService = WxMaConfiguration.getMaService(properties.getConfigs().get(0).getAppid());
-        try {
-            String ip = IpUtil.getRequestIp();
-            WxMaJscode2SessionResult session = wxService.getUserService().getSessionInfo(param.getCode());
-            FsUser user=userService.selectFsUserByMaOpenId(session.getOpenid());
-            if(user==null){
-                //创建
-                user=new FsUser();
-                user.setUsername("");
-                user.setNickname("微信用户");
-                user.setStatus(1);
-                user.setMaOpenId(session.getOpenid());
-                user.setUnionId(session.getUnionid());
-                user.setIsWeixinAuth(0);
-                user.setLastIp(ip);
-                user.setCreateTime(new Date());
-                userService.insertFsUser(user);
-            }
-            FsStoreOrder order=orderService.selectFsStoreOrderById(param.getOrderId());
-            if(order==null){
-                return R.error("订单不存在");
-            }
-            if(order.getStatus()!= OrderInfoEnum.STATUS_2.getValue()){
-                return R.error("待收货订单可申请支付尾款");
-            }
-            if(order.getPayType().equals(1)){
-                return R.error("此订单已支付");
-            }
-            //只有顺风才可以付尾
-            if(!order.getDeliverySn().trim().equals("SF")){
-                return R.error("只有顺丰物流支持尾款支付");
-            }
-
-            if(!order.getIsPayRemain().equals(0)){
-                return R.error("此订单已支付");
-            }
-            String payCode = IdUtil.getSnowflake(0, 0).nextIdStr();
-            //易宝支付
-            String json = configService.selectConfigByKey("store.pay");
-            FsPayConfig fsPayConfig = JSON.parseObject(json, FsPayConfig.class);
-            FsStorePayment storePayment=new FsStorePayment();
-            storePayment.setCompanyId(order.getCompanyId());
-            storePayment.setCompanyUserId(order.getCompanyUserId());
-            storePayment.setStatus(0);
-            storePayment.setPayCode(payCode);
-            storePayment.setPayMoney(order.getPayDelivery());
-            storePayment.setCreateTime(new Date());
-            storePayment.setPayTypeCode("weixin");
-            storePayment.setBusinessType(2);
-            storePayment.setRemark("商城订单尾款支付");
-            storePayment.setOpenId(user.getRealName());
-            storePayment.setUserId(user.getUserId());
-            storePayment.setBusinessOrderId(order.getId().toString());
-            storePayment.setOrderId(order.getId());
-            storePayment.setIsPayRemain(1);
-            storePayment.setPayMode(fsPayConfig.getType());
-            fsStorePaymentMapper.insertFsStorePayment(storePayment);
-            if (fsPayConfig.getType().equals("hf")){
-                HuiFuCreateOrder o = new HuiFuCreateOrder();
-                o.setTradeType("T_MINIAPP");
-                o.setOpenid(user.getMaOpenId());
-                o.setReqSeqId("store_remain-"+storePayment.getPayCode());
-                o.setTransAmt(storePayment.getPayMoney().toString());
-                o.setGoodsDesc("支付订单尾款");
-                HuifuCreateOrderResult result = huiFuService.createOrder(o);
-                if(result.getResp_code()!=null&&(result.getResp_code().equals("00000000")||result.getResp_code().equals("00000100"))){
-                    FsStorePayment mt=new FsStorePayment();
-                    mt.setPaymentId(storePayment.getPaymentId());
-                    mt.setTradeNo(result.getHf_seq_id());
-                    fsStorePaymentMapper.updateFsStorePayment(mt);
-                    redisCache.setCacheObject("isPaying:"+order.getId(),order.getId().toString(),1, TimeUnit.MINUTES);
-                    return R.ok().put("result",result.getPay_info());
-                }else{
-                    return R.error(result.getResp_desc());
-                }
-            }else if (fsPayConfig.getType().equals("yb")){
-                WxJspayDTO p = new WxJspayDTO();
-                // 使用setter方法为对象赋值
-                p.setPayMoney(order.getPayDelivery().toString());
-                p.setLowOrderId("store_remain-"+payCode);
-                p.setBody("支付订单尾款");
-                p.setIsMinipg("1");
-                p.setReturnUrl(fsPayConfig.getYbNotifyUrl());
-                p.setOpenId(user.getMaOpenId());
-                p.setAttach("");
-                p.setStoreid("0");
-                CreateWxOrderResult wxOrder = ybPayService.createWxOrder(p);
-                if(wxOrder.getStatus().equals("100")){
-                    FsStorePayment ment=new FsStorePayment();
-                    ment.setPaymentId(storePayment.getPaymentId());
-                    ment.setTradeNo(wxOrder.getUpOrderId());
-                    fsStorePaymentMapper.updateFsStorePayment(ment);
-                    return R.ok().put("result",wxOrder.getPay_info());
-                }
-                else{
-                    return R.error(wxOrder.getMessage());
-                }
-            }
-        } catch (WxErrorException e) {
-            e.printStackTrace();
-            return R.error(e.getMessage());
-        }
-
-        return R.error("无支付类型");
+        return orderService.otherPaymentRemain(param);
     }
 
 
     @Login
     @ApiOperation("取消订单")
     @PostMapping("/cancelOrder")
-//    @Log(title = "取消订单", businessType = BusinessType.UPDATE)
     public R cancelOrder( @Validated @RequestBody FsStoreOrderCancelParam param, HttpServletRequest request){
         FsStoreOrder order=orderService.selectFsStoreOrderById(param.getOrderId());
         if (ObjectUtil.isNull(order)) {
@@ -850,32 +596,6 @@ public class StoreOrderController extends  AppBaseController {
             throw new CustomException("非法操作");
         }
         orderService.cancelOrder(param.getOrderId());
-//        if(sysConfig.getPayOpen()==1){
-//            if (order.getPaid() == 1) {
-//                RefundDTO refundDTO=new RefundDTO();
-//                refundDTO.setMerchOrderNo(Ids.oid());
-//                refundDTO.setAmount(order.getPayMoney().toString());
-//                refundDTO.setOrigMerchOrderNo("store-"+order.getOrderCode());
-//                refundDTO.setOrderId(order.getId());
-//                payService.refundOrder(refundDTO);
-//            }
-//            else{
-//                orderService.cancelOrder(param.getOrderId());
-//            }
-//        }
-//        else{
-//            if (order.getPaid() == 1) {
-//                //todo 微信原生退款
-//                // BigDecimal bigDecimal = new BigDecimal("100");
-//                // int payPrice = bigDecimal.multiply(orderInfo.getPayPrice()).intValue();
-//                // weixinPayService.refundOrder(param.getId(),payPrice);
-//
-//            }
-//            else{
-//                orderService.cancelOrder(param.getOrderId());
-//            }
-//
-//        }
         return R.ok("操作成功");
     }
     @Login