Browse Source

对接台州银行接口

xdd 1 month ago
parent
commit
47afe26875

+ 65 - 0
fs-admin/src/test/java/com/fs/company/controller/CompanyControllerTest.java

@@ -0,0 +1,65 @@
+package com.fs.company.controller;
+
+import com.fs.FSAdminApplication;
+import com.fs.common.config.FSSysConfig;
+import com.fs.common.core.domain.R;
+import com.fs.erp.domain.ErpOrder;
+import com.fs.erp.domain.ErpOrderItem;
+import com.fs.erp.service.IErpOrderService;
+import com.fs.erp.service.impl.ErpOrderServiceImpl;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+@RunWith(org.springframework.test.context.junit4.SpringRunner.class)
+@SpringBootTest(classes = FSAdminApplication.class)
+public class CompanyControllerTest {
+
+    @Autowired
+    private FSSysConfig fsSysConfig;
+
+    @Autowired
+    private IErpOrderService erpOrderService;
+
+
+    @Test
+    public void addOrder() {
+        ErpOrder order=new ErpOrder();
+        order.setShop_code(fsSysConfig.getErpShopCode());
+        order.setVip_code("10000");
+        order.setPlatform_code("202211111110");
+        order.setWarehouse_code("CQDS001");
+        order.setExpress_code("YZJD");
+        order.setPost_fee(1.00);
+        order.setSeller_memo("备注");
+        // order.setCurrency_code("JCZD");
+        // order.setCod_fee(2.00);//到 付服务费
+        order.setBuyer_memo("备注");
+        order.setOrder_type_code("order");
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        order.setDeal_datetime(sdf.format(new Date()));
+        List<ErpOrderItem> details=new ArrayList<>();
+        ErpOrderItem item=new ErpOrderItem();
+        item.setItem_code("105015");
+        // item.setSku_code("1122");
+        item.setOrigin_price("1.00");
+        item.setPrice("12.00");
+        item.setQty(1);
+        item.setRefund(0);
+        details.add(item);
+        order.setDetails(details);
+        order.setReceiver_name("张三");
+        order.setReceiver_mobile("15193139333");
+        order.setReceiver_province("重庆市");
+        order.setReceiver_city("重庆市");
+        order.setReceiver_district("江北区");
+        order.setReceiver_address("观音桥街道中翰名苑");
+        erpOrderService.addOrder(order);
+    }
+}

+ 63 - 0
fs-api/src/main/java/com/fs/app/controller/PayController.java

@@ -8,10 +8,12 @@ import com.alibaba.fastjson.JSONObject;
 import com.fs.common.config.FSSysConfig;
 import com.fs.common.core.controller.BaseController;
 import com.fs.common.core.redis.RedisCache;
+import com.fs.common.utils.StringUtils;
 import com.fs.company.service.ICompanyService;
 import com.fs.company.service.ICompanyUserService;
 import com.fs.erp.service.IErpOrderService;
 import com.fs.huifuPay.domain.HuiFuResult;
+import com.fs.huifuPay.dto.*;
 import com.fs.pay.pay.domain.OrderCallback;
 import com.fs.pay.pay.domain.OrderResult;
 import com.fs.pay.pay.dto.OrderQueryDTO;
@@ -21,10 +23,17 @@ import com.fs.pay.service.dto.PayNotifyDTO;
 import com.fs.pay.service.dto.RefundNotifyDTO;
 import com.fs.pay.service.dto.TradeOrder;
 import com.fs.store.domain.FsStorePayment;
+import com.fs.store.domain.TzConfigInfoDTO;
 import com.fs.store.service.*;
 import com.fs.store.vo.PrescribeVO;
+import com.fs.tzBank.TzBankService;
+import com.fs.tzBank.dto.TzOrderInfoDTO;
+import com.fs.tzBank.dto.TzPaymentResultDTO;
+import com.fs.tzBank.dto.TzRefundOrderDTO;
+import com.fs.tzBank.utils.TzConfigUtils;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -77,9 +86,63 @@ public class PayController {
     @Autowired
     PayService ybPayService;
 
+    @Autowired
+    TzBankService tzBankService;
+
     @Autowired
     private ICompanyUserService companyUserService;
 
+    @ApiOperation("台州银行第三方支付回调")
+    @PostMapping(value="/tzBkPayNotify")
+    public String tzBkPayNotify( @RequestBody TzPaymentResultDTO tzPaymentResultDTO ) throws Exception {
+        logger.info("台州银行第三方支付回调接口被调用,请求参数: {}", JSON.toJSONString(tzPaymentResultDTO));
+
+        //验证
+        if(tzPaymentResultDTO.getStatus().equals("90")){
+            RequestDTO<QueryOrderRestDTO> requestDTO = new RequestDTO<>();
+
+            QueryOrderRestDTO queryOrderRestDTO = new QueryOrderRestDTO();
+
+            queryOrderRestDTO.setOrderFlowNo(tzPaymentResultDTO.getOrderFlowNo());
+            TzConfigInfoDTO tzConfigInfoDTO = TzConfigUtils.getConfig();
+
+            queryOrderRestDTO.setPlatMerCstNo(tzConfigInfoDTO.getPlatMerCstNo());
+
+            requestDTO.setReqBody(queryOrderRestDTO);
+            requestDTO.setReqHeader(TzReqHeaderDTO.getInstance(tzPaymentResultDTO.getOrderNo()));
+
+            TzReqResultDTO<QueryOrderInfoDTO> resultDTO = tzBankService.payQueryOrder(requestDTO);
+            String retCode = resultDTO.getRetCode();
+            if(!retCode.equals("000000")){
+                logger.info("台州银行支付回调查询失败:"+retCode);
+                return "";
+            }
+            String orderId = tzPaymentResultDTO.getOrderNo().replace("store","");
+            if(StringUtils.isNotBlank(orderId)){
+                orderService.payConfirm(1, null, orderId, tzPaymentResultDTO.getOrderFlowNo(),tzPaymentResultDTO.getChlTrxId(),tzPaymentResultDTO.getOrderFlowNo());
+            }
+        }
+        return "";
+
+    }
+    @ApiOperation("台州银行第三方退款回调")
+    @PostMapping(value="/tzRefundNotify")
+    public String tzRefundNotify(HttpServletRequest request, TzRefundOrderDTO dto) throws Exception {
+        logger.info("台州银行第三方退款回调,请求参数: {}", JSON.toJSONString(dto));
+
+        if(dto.getRefundOrdStatus().equals("90")){
+            FsStorePayment storePayment=storePaymentService.selectFsStorePaymentByCode(dto.getRefundOrderNo());
+            if(storePayment!=null){
+                storePayment.setRefundMoney(dto.getRefundOrdTransAmt());
+                storePayment.setStatus(-1);
+                storePayment.setRefundTime(new Date());
+                storePaymentService.updateFsStorePayment(storePayment);
+            }
+            return "success";
+        }
+        return "success";
+    }
+
     @ApiOperation("易宝第三方支付回调")
     @PostMapping(value="/ybPayNotify")
     public String ybPayNotify( @RequestBody String jsonBody ) throws Exception {

+ 5 - 2
fs-service-system/pom.xml

@@ -162,8 +162,11 @@
             <groupId>com.tzbank</groupId>
             <artifactId>tzbClient</artifactId>
             <version>1.0-SNAPSHOT</version>
-            <scope>system</scope>
-            <systemPath>${basedir}/src/main/resources/lib/tzbClient-1.0-SNAPSHOT.jar</systemPath>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-test</artifactId>
         </dependency>
 
 

+ 5 - 0
fs-service-system/src/main/java/com/fs/huifuPay/dto/TzMiniProgramCodeRespDTO.java

@@ -35,6 +35,11 @@ public class TzMiniProgramCodeRespDTO implements Serializable {
      */
     private String orderNo;
 
+    /**
+     * 订单id
+     */
+    private String payCode;
+
     /**
      * 平台商户名称
      * <p>

+ 10 - 0
fs-service-system/src/main/java/com/fs/store/mapper/FsStorePaymentMapper.java

@@ -354,6 +354,16 @@ public interface FsStorePaymentMapper
 
     @Select("select * from fs_store_payment where business_type=2 and order_id=#{orderId}    ")
     List<FsStorePayment> selectFsStorePaymentByOrder(Long orderId);
+
+    @Select("select * from fs_store_payment where business_type=2 and pay_code=#{payCode}    ")
+    List<FsStorePayment> selectFsStorePaymentByPayCode(String payCode);
+
+    @Select("select * from fs_store_payment where order_id=#{orderId} and status=0 and pay_mode='tzbk' and trade_no is not null")
+    List<FsStorePayment> selectFsStorePaymentTzUnpayByOrder(Long orderId);
+
+    @Select("select * from fs_store_payment where pay_code=#{payCode} and status=0 and pay_mode='tzbk' and trade_no is not null")
+    List<FsStorePayment> selectFsStorePaymentTzUnpayByPayCode(String payCode);
+
     @Select("select * from fs_store_payment where trade_no=#{tradeNo}")
     FsStorePayment selectFsStorePaymentByTradeNo(String tradeNo);
 }

+ 50 - 10
fs-service-system/src/main/java/com/fs/store/service/impl/FsStorePaymentServiceImpl.java

@@ -1,11 +1,14 @@
 package com.fs.store.service.impl;
 
 import java.math.BigDecimal;
+import java.time.Instant;
 import java.util.Date;
 import java.util.List;
 import java.util.Map;
+import java.util.concurrent.TimeUnit;
 
 import cn.hutool.core.util.IdUtil;
+import cn.hutool.core.util.StrUtil;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
 import com.fs.common.annotation.DataScope;
@@ -20,11 +23,9 @@ import com.fs.company.service.ICompanyService;
 import com.fs.company.service.ICompanyUserService;
 import com.fs.huifuPay.domain.HuiFuCreateOrder;
 import com.fs.huifuPay.domain.HuifuCreateOrderResult;
-import com.fs.huifuPay.dto.RequestDTO;
-import com.fs.huifuPay.dto.TzPayCreateOrderReqBodyDTO;
-import com.fs.huifuPay.dto.TzPayCreateOrderRspDTO;
-import com.fs.huifuPay.dto.TzReqResultDTO;
+import com.fs.huifuPay.dto.*;
 import com.fs.huifuPay.service.HuiFuService;
+import com.fs.store.constants.StoreConstants;
 import com.fs.tzBank.TzBankService;
 import com.fs.pay.pay.domain.CreateWxOrderResult;
 import com.fs.pay.pay.dto.WxJspayDTO;
@@ -253,30 +254,69 @@ public class FsStorePaymentServiceImpl implements IFsStorePaymentService
             else{
                 return R.error(wxOrder.getMessage());
             }
-        } else if(fsPayConfig.getType().equals("tzbank")){
+        } else if(fsPayConfig.getType().equals("tzbk")){
             TzConfigInfoDTO tzConfigInfoDTO = JSON.parseObject(json, TzConfigInfoDTO.class);
 
             TzPayCreateOrderReqBodyDTO reqBodyDTO = new TzPayCreateOrderReqBodyDTO();
             RequestDTO<TzPayCreateOrderReqBodyDTO> requestDTO = new RequestDTO<>();
-            reqBodyDTO.setOrderNo(orderSn);
+            String payCode = storePayment.getPayCode();
+            reqBodyDTO.setOrderNo(storePayment.getPayCode());
             reqBodyDTO.setOrderSource("02");
             reqBodyDTO.setTrxAmt(storePayment.getPayMoney());
             reqBodyDTO.setCurrency("CNY");
             reqBodyDTO.setTransType("2001");
-            reqBodyDTO.setTradeMerCstNo(tzConfigInfoDTO.getTradeMerCstNo());
+            reqBodyDTO.setTradeMerCstNo(tzConfigInfoDTO.getPlatMerCstNo());
             reqBodyDTO.setPlatMerCstNo(tzConfigInfoDTO.getPlatMerCstNo());
-            reqBodyDTO.setBusinessCstNo(tzConfigInfoDTO.getBusinessCstNo());
+            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()));
-            reqBodyDTO.setExpiredTime("");
+            // 获取订单到期时间
+            // 获取当前时间戳
+            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) {
-                throw new RuntimeException(e);
+                logger.error("系统异常",e);
+                return R.error("系统异常,请联系管理员!");
             }
 //            if()
 //            return R.ok().put("result",wxOrder.getPay_info());

+ 100 - 0
fs-service-system/src/main/java/com/fs/tzBank/dto/TzOrderInfoDTO.java

@@ -0,0 +1,100 @@
+package com.fs.tzBank.dto;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * 订单信息DTO.
+ *
+ * <p>
+ *  此类包含了订单的各种状态信息,例如订单状态、成功时间、成功金额、支付方式等。
+ *  它是用于数据传输的对象,方便在不同系统或服务之间传递订单数据。
+ * </p>
+ *
+ * @author xdd
+ * @date 2025-02-27
+ */
+@Data
+public class TzOrderInfoDTO implements Serializable {
+
+    /**
+     * 订单状态.
+     * <p>
+     *  10-初始状态,60-交易中,70-交易失败,80-订单关闭,90-交易成功
+     * </p>
+     */
+    private String status;
+
+    /**
+     * 成功时间.
+     * <p>
+     *  格式:yyyyMMddHHmmss (14位字符串)
+     *  当订单状态为成功时返回
+     * </p>
+     */
+    private String succTime;
+
+    /**
+     * 支付成功金额.
+     * <p>
+     *  单位:元,保留两位小数。
+     *  订单状态为成功时返回。
+     * </p>
+     */
+    private Double succTrxAmt;
+
+    /**
+     * 支付方式.
+     * <p>
+     *  具体支付方式枚举可见门户个人中心-下载中心下《线上收银台支付方式下载》。
+     * </p>
+     */
+    private String payType;
+
+    /**
+     * 白条支付订单号.
+     * <p>
+     *  当支付方式为白条支付时,会返回该字段;其含义为在支付平台在白条系统的订单号。
+     * </p>
+     */
+    private String loanPayOrder;
+
+    /**
+     * 商户手续费.
+     * <p>
+     *  单位:元,保留两位小数。
+     *  订单状态为成功时返回,以业务协议为准,现阶段都是 0。
+     * </p>
+     */
+    private Double fee;
+
+    /**
+     * 支付来源.
+     * <p>
+     *  00-PC;01-APP;02-H5
+     * </p>
+     */
+    private String trxPaySource;
+
+    /**
+     * 付款客户号.
+     * <p>
+     *  第三方客户号
+     * </p>
+     */
+    private String payCstNo;
+
+    /**
+     * 前台返回地址.
+     * <p>
+     *  预下单传了返回地址,此字段会返回相应数据。
+     * </p>
+     */
+    private String payReturnUrl;
+
+    /**
+     * 渠道交易流水号.
+     */
+    private String chlTrxId;
+}

+ 107 - 0
fs-service-system/src/main/java/com/fs/tzBank/dto/TzPaymentResultDTO.java

@@ -0,0 +1,107 @@
+package com.fs.tzBank.dto;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * 支付结果通知 DTO.
+ *
+ * <p>
+ *  该 DTO 用于接收支付平台返回的支付结果通知。
+ * </p>
+ *
+ * @author xdd
+ * @version 1.0
+ * @since 2025-02-27
+ */
+@Data
+public class TzPaymentResultDTO implements Serializable {
+
+    /**
+     * 商户订单号.
+     * <p>
+     * 企业自己生成的订单号。
+     * </p>
+     */
+    private String orderNo;
+
+    /**
+     * 支付平台订单号.
+     * <p>
+     * 由行方生成的订单号, 同支付申请接口返回 orderFlowNo 字段。
+     * </p>
+     */
+    private String orderFlowNo;
+
+    /**
+     * 订单状态.
+     * <p>
+     * 70-交易失败,90-交易成功;其他状态不主动通知。
+     * (10-初始状态,60-交易中;80-订单关闭)
+     * </p>
+     */
+    private String status;
+
+    /**
+     * 实付金额.
+     */
+    private Double actualyAmt;
+
+    /**
+     * 成功金额.
+     * <p>
+     * 可选字段,只有在特定情况下返回。
+     * </p>
+     */
+    private Double succTrxAmt;
+
+    /**
+     * 成功时间.
+     * <p>
+     * 可选字段,格式:yyyyMMddHHmmss。
+     * </p>
+     */
+    private String succTime;
+
+    /**
+     * 支付方式.
+     * <p>
+     * 即该笔订单是用什么方式支付的,具体支付方式枚举可
+     * 见门户个人中心-下载中心下《线上收银台支付方
+     * 式下载》。
+     * </p>
+     */
+    private String payType;
+
+    /**
+     * 白条支付订单号.
+     * <p>
+     * 当支付方式为白条支付时,会返回该字段;其含义为在
+     * 支付平台在白条系统的订单号。
+     * </p>
+     */
+    private String loanPayOrder;
+
+    /**
+     * 商户手续费.
+     * <p>
+     * 订单状态为成功时返回,也业务协议为准,现阶段都是 0。
+     * </p>
+     */
+    private Double fee;
+
+    /**
+     * 渠道交易流水号.
+     */
+    private String chlTrxId;
+
+    /**
+     * 卡类型.
+     * <p>
+     * 0010 借记卡 0020 贷记卡 0050 其他(类似微信零钱、余
+     * 额宝)。
+     * </p>
+     */
+    private String cardType;
+}

+ 60 - 0
fs-service-system/src/main/java/com/fs/tzBank/dto/TzRefundOrderDTO.java

@@ -0,0 +1,60 @@
+package com.fs.tzBank.dto;
+
+import lombok.Getter;
+import lombok.Setter;
+import lombok.ToString;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+/**
+ * 退款订单信息DTO
+ *
+ * <p>此类用于封装退款订单的相关信息,包括商户退款订单号、支付平台订单号、退款单状态、退款金额以及退款成功时间等。
+ *
+ * @author xdd
+ * @since 2025-02-27
+ */
+@Getter
+@Setter
+@ToString
+public class TzRefundOrderDTO implements Serializable {
+
+    /**
+     * 商户退款订单号
+     * <p>企业自己生成的退款订单号, 长度限制为32个字符。</p>
+     */
+    private String refundOrderNo;
+
+    /**
+     * 支付平台订单号
+     * <p>由行方生成的退款订单号, 同退款申请接口返回字段, 长度限制为32个字符。</p>
+     */
+    private String refundOrderFlowNo;
+
+    /**
+     * 退款单状态
+     * <p>
+     *     <ul>
+     *         <li>40-待审核</li>
+     *         <li>50-审核拒绝</li>
+     *         <li>60-退款中</li>
+     *         <li>70-退款失败</li>
+     *         <li>90-退款成功</li>
+     *     </ul>
+     * </p>
+     */
+    private String refundOrdStatus;
+
+    /**
+     * 退款金额
+     * <p>退款金额,格式为12位整数和2位小数。</p>
+     */
+    private BigDecimal refundOrdTransAmt;
+
+    /**
+     * 成功时间
+     * <p>退款成功时返回, 格式为 yyyyMMddHHmmss (14位数字)。</p>
+     */
+    private String refundSuccTime;
+}

+ 17 - 0
fs-service-system/src/test/java/com/fs/erp/service/impl/ErpOrderServiceImplTest.java

@@ -0,0 +1,17 @@
+package com.fs.erp.service.impl;
+
+import com.fs.common.core.domain.R;
+import com.fs.erp.domain.ErpOrder;
+import com.fs.erp.domain.ErpOrderItem;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.test.context.SpringBootTest;
+
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+
+
+public class ErpOrderServiceImplTest {
+}

+ 170 - 3
fs-user-app/src/main/java/com/fs/app/controller/StoreOrderController.java

@@ -51,6 +51,7 @@ import com.google.gson.Gson;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import me.chanjar.weixin.common.error.WxErrorException;
+import org.apache.commons.collections4.CollectionUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -203,6 +204,99 @@ public class StoreOrderController extends  AppBaseController {
         return R.ok().put("order",order).put("productPackage",productPackage).put("payLimitTime",payLimitTime);
     }
 
+    @Login
+    @ApiOperation("获取订单-轮询获取信息")
+    @GetMapping("/getStoreOrderByOrderIdTz")
+    public R getStoreOrderByIdRemote(@RequestParam(value = "orderId",required = false) Long orderId,
+                                     @RequestParam(value = "payCode",required = false) String payCode, HttpServletRequest request){
+        // 根据订单查询payment
+        if(ObjectUtil.isNull(orderId)&&ObjectUtil.isNull(payCode)){
+            return R.error("参数错误");
+        }
+
+        List<FsStorePayment> fsStorePayments;
+        if(ObjectUtil.isNotNull(orderId)){
+            fsStorePayments = fsStorePaymentMapper.selectFsStorePaymentByOrder(orderId);
+        } else{
+            fsStorePayments = fsStorePaymentMapper.selectFsStorePaymentByPayCode(payCode);
+        }
+        // 如果已经有支付成功的记录
+        if(CollectionUtils.isNotEmpty(fsStorePayments)){
+            for (FsStorePayment fsStorePayment : fsStorePayments) {
+                // 如果状态为已支付或者已经退款
+                if(ObjectUtil.equal(fsStorePayment.getStatus(),1) || ObjectUtil.equal(fsStorePayment.getStatus(), -1)){
+                    return R.ok().put("orderId", orderId)
+                            .put("payCode", payCode)
+                            .put("status", fsStorePayment.getStatus());
+                }
+            }
+        }
+        // 如果没找到,查看付款信息是否有未支付的 且 类型为tzbank 且 trade_no 不为空的数据
+        // 调用台州银行接口查询订单信息
+        List<FsStorePayment> fsStorePayments1;
+        if(ObjectUtil.isNotNull(orderId)){
+            fsStorePayments1 = fsStorePaymentMapper.selectFsStorePaymentTzUnpayByOrder(orderId);
+        } else {
+            fsStorePayments1 = fsStorePaymentMapper.selectFsStorePaymentTzUnpayByPayCode(payCode);
+        }
+
+        if(CollectionUtils.isNotEmpty(fsStorePayments1)){
+            FsStorePayment fsStorePayment = fsStorePayments1.get(0);
+
+            RequestDTO<QueryOrderRestDTO> requestDTO = new RequestDTO<>();
+
+            QueryOrderRestDTO queryOrderRestDTO = new QueryOrderRestDTO();
+
+            queryOrderRestDTO.setOrderFlowNo(fsStorePayment.getTradeNo());
+            TzConfigInfoDTO tzConfigInfoDTO = TzConfigUtils.getConfig();
+
+            queryOrderRestDTO.setPlatMerCstNo(tzConfigInfoDTO.getPlatMerCstNo());
+
+            requestDTO.setReqBody(queryOrderRestDTO);
+            requestDTO.setReqHeader(TzReqHeaderDTO.getInstance(fsStorePayment.getPayCode()));
+
+            TzReqResultDTO<QueryOrderInfoDTO> resultDTO = null;
+            try {
+                resultDTO = tzBankService.payQueryOrder(requestDTO);
+                String retCode = resultDTO.getRetCode();
+                // 如果查询支付成功
+                if(retCode.equals("00000000")){
+                    QueryOrderInfoDTO body = resultDTO.getBody();
+                    String status = body.getStatus();
+                    if("90".equals(status)){
+                        // 如果查询支付成功 更新订单状态
+                        orderService.payConfirm(1,orderId,fsStorePayment.getPayCode(),
+                                fsStorePayment.getTradeNo(),body.getChlTrxId(),fsStorePayment.getTradeNo());
+                        return R.ok().put("orderId", orderId)
+                                .put("payCode", payCode)
+                                .put("status", 1);
+                    } else if("70".equals(status)) {
+                        return R.ok().put("orderId", orderId)
+                                .put("payCode", payCode)
+                                .put("status", -1);
+                    }
+
+                }
+            } catch (Exception e) {
+                logger.error("台州银行支付回调查询失败:",e);
+            }
+
+        }
+        FsStoreOrder order=orderService.selectFsStoreOrderById(orderId);
+
+        if(ObjectUtil.isNotNull(order)){
+            return R.ok().put("orderId",orderId)
+                    .put("payCode", payCode)
+                    .put("status", order.getStatus());
+        } else {
+            // 如果没有订单信息可能是从微信收款而来
+            return R.ok().put("orderId", orderId)
+                    .put("payCode", payCode)
+                    .put("status", 0);
+        }
+
+    }
+
 
     @Login
     @ApiOperation("确认订单")
@@ -342,8 +436,7 @@ public class StoreOrderController extends  AppBaseController {
                     reqBodyDTO.setPayNotifyUrl(tzConfigInfoDTO.getPayNotifyUrl());
                     reqBodyDTO.setPayerName(user.getUsername());
                     reqBodyDTO.setPayerMobileNo(user.getPhone());
-                    //TODO 商品信息必须获取
-                    reqBodyDTO.setGoodsInfo("测试");
+                    reqBodyDTO.setGoodsInfo("商城订单支付");
                     // 不需要分账
                     reqBodyDTO.setNeedLedger("00");
                     reqBodyDTO.setClientIp(IPUtils.getIpAddr(ServletUtils.getRequest()));
@@ -380,7 +473,9 @@ public class StoreOrderController extends  AppBaseController {
                                 mt.setTradeNo(miniProgramCode.getBody().getOrderNo());
                                 fsStorePaymentMapper.updateFsStorePayment(mt);
                                 redisCache.setCacheObject("isPaying:"+order.getId(),order.getId().toString(),1, TimeUnit.MINUTES);
-                                return R.ok().put("payType",param.getPayType()).put("result",miniProgramCode.getBody());
+                                TzMiniProgramCodeRespDTO result = miniProgramCode.getBody();
+                                result.setPayCode(payCode);
+                                return R.ok().put("payType",param.getPayType()).put("result",result);
                             } else {
                                 return R.error(miniProgramCode.getRetMsg());
                             }
@@ -557,6 +652,9 @@ public class StoreOrderController extends  AppBaseController {
         List<FsStorePayment>  payments=fsStorePaymentMapper.selectFsStorePaymentByOrder(order.getId());
         if(payments.size()>0){
             for(FsStorePayment payment : payments){
+                if(StringUtils.isEmpty(payment.getTradeNo())){
+                    continue;
+                }
                 OrderQueryDTO orderQueryDTO = new OrderQueryDTO();
                 orderQueryDTO.setLowOrderId("store-"+payment.getPayCode());
                 RequestDTO<QueryOrderRestDTO> requestDTO = new RequestDTO<>();
@@ -576,6 +674,13 @@ public class StoreOrderController extends  AppBaseController {
                         QueryOrderInfoDTO body = resultDTO.getBody();
                         if(ObjectUtil.isNotNull(body)){
                             if("80".equals(body.getStatus()) || "90".equals(body.getStatus())){
+                                // 更新订单状态和支付状态
+                                payment.setStatus(1);
+                                fsStorePaymentMapper.updateFsStorePayment(payment);
+                                orderService.payConfirm(1, order.getId(), payment.getPayCode(),
+                                        payment.getTradeNo(),
+                                        body.getChlTrxId(),
+                                        payment.getTradeNo());
                                 return R.error("订单已支付");
                             }
                         }
@@ -895,6 +1000,68 @@ public class StoreOrderController extends  AppBaseController {
                 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("store"+order.getOrderCode());
+                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("系统异常,请联系管理员!");
+                }
             }