Browse Source

支付对接

qzyReal 2 years ago
parent
commit
a3a2279bae

+ 5 - 2
app/pages/wx/pay.vue

@@ -196,12 +196,15 @@
 				}
 				let type = this.type;
 				let con = 'A1停车费';
+				let tradeType = 'PORT_PARKING_FEE';
 				if (type == 2) {
 					con = 'A1整车业务';
+					tradeType='PORT_OPERATION_FEE';
 				} else if (type == 1) {
 					con = 'A1车辆消杀'
 				}
 				p.desc = con + '-' + carNos;
+				p.businessType=tradeType;
 				this.$common.showLoading('正在请求...');
 				let that = this;
 				that.$api.getPrePay(that.$common.removeNull(p)).then(resp => {
@@ -226,8 +229,8 @@
 								that.total = 0
 							}
 						},
-						complete:function(res){
-							that.checkPayResult(data.outTradeNo);
+						complete: function(res) {
+							//that.checkPayResult(data.outTradeNo);
 						}
 					});
 				})

+ 2 - 1
app/pages/wx/payOrder.vue

@@ -176,7 +176,8 @@
 					tradeType: "JSAPI",
 					openid: this.wx.openid
 				}
-				p.desc = "A1-业务费用"
+				p.desc = "A1-业务费用";
+				p.businessType='PORT_OPERATION_FEE';
 				this.$api.getPrePay(this.$common.removeNull(p)).then(resp => {
 					let data = resp.data;
 					let that = this;

+ 1 - 1
sp-server/app.pid

@@ -1 +1 @@
-12244
+4176

+ 23 - 5
sp-server/src/main/java/com/pj/api/jh/service/JhService.java

@@ -1,5 +1,6 @@
 package com.pj.api.jh.service;
 
+import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.util.NumberUtil;
 import cn.hutool.core.util.RandomUtil;
 import cn.hutool.core.util.StrUtil;
@@ -7,6 +8,7 @@ import cn.hutool.http.HttpUtil;
 import cn.hutool.json.JSONObject;
 import cn.hutool.json.JSONUtil;
 import cn.hutool.log.StaticLog;
+import com.pj.api.jh.task.CheckPayStatusTask;
 import com.pj.api.jh.utils.JhHttpUtils;
 import com.pj.api.jh.utils.MerchantApiUtil;
 import com.pj.api.jh.bo.JhNotifyBO;
@@ -16,6 +18,7 @@ import com.pj.api.wx.service.WxService;
 import com.pj.current.config.JhConfig;
 import com.pj.current.config.MyConfig;
 import com.pj.current.config.PartConfig;
+import com.pj.current.task.TaskService;
 import com.pj.project.tb_order.TbOrder;
 import com.pj.project.tb_order.TbOrderService;
 import lombok.extern.slf4j.Slf4j;
@@ -54,17 +57,24 @@ public class JhService {
     JhHttpUtils jhHttpUtils;
     @Resource
     private TbOrderService tbOrderService;
+    @Resource
+    private TaskService taskService;
 
-    public JSONObject initPay(HttpServletRequest request) throws Exception {
+    public Map<String, ?> initPay(HttpServletRequest request) throws Exception {
+        if (!jhConfig.isEnable()) {
+            return wxService.prePay(request);
+        }
         String money = request.getParameter("money");
         String openid = request.getParameter("openid");
         String desc = request.getParameter("desc");
         String businessId = request.getParameter("b");
         String c = request.getParameter("c");
         String a = request.getParameter("a");
+        String tradeType = request.getParameter("tradeType");
+        String businessType = request.getParameter("businessType");
         Attach atchMap = new Attach();
         atchMap.setC(c).setB(businessId).setA(a);
-        String out_trade_no = RandomUtil.randomString(30);
+        String out_trade_no = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss")) + RandomUtil.randomNumbers(6);
         StaticLog.info("outTradeNo:{}", out_trade_no);
         Map<String, Object> params = new HashMap<>();
         params.put("attach", JSONUtil.toJsonStr(atchMap));
@@ -72,7 +82,7 @@ public class JhService {
         params.put("businessMerchantNo", jhConfig.getBusinessMerchantNo());
         params.put("openId", openid);
         params.put("merchantNo", jhConfig.getBusinessMerchantNo());
-        params.put("tradeType", jhConfig.getTradeType());
+        params.put("tradeType", businessType);
         params.put("subTradeType", "");
         String total_free = partConfig.isTestEnv() ? "0.01" : money + "";
         log.info("order price:{}", total_free);
@@ -99,6 +109,7 @@ public class JhService {
             Map<String, String> r = wxService.getPayP(payMessage.getStr("timeStamp"), payMessage.getStr("nonceStr"), openid, p);
             StaticLog.info("re:{}", JSONUtil.toJsonStr(r));
             JSONObject object = JSONUtil.parseObj(payMessage);
+
             object.set("outTradeNo", out_trade_no);
             TbOrder tbOrder = new TbOrder();
             tbOrder.setAttach(JSONUtil.toJsonStr(atchMap))
@@ -106,7 +117,8 @@ public class JhService {
                     .setOrderTime(new Date())
                     .setOutTradeNo(out_trade_no).setPrice(money);
             tbOrderService.save(tbOrder);
-            return object;
+            taskService.addTask(new CheckPayStatusTask(RandomUtil.randomNumbers(12), 2000, out_trade_no));
+            return BeanUtil.beanToMap(object);
         }
         throw new Exception("支付信息有误");
     }
@@ -130,14 +142,20 @@ public class JhService {
 
     @Async
     public void notifyResult(JhNotifyBO bo) {
-        if (!"SUCCESS".equals(bo.getTradeStatus().toUpperCase()) && !"FINISH".equals(bo.getTradeStatus().toUpperCase())) {
+        String orderStatus=bo.getTradeStatus();
+        if (!"SUCCESS".equals(orderStatus) && !"FINISH".equals(orderStatus)) {
             return;
         }
         NotifyBO notifyBO = new NotifyBO();
+        String outTradeNo = bo.getOutTradeNo();
         notifyBO.setOutTradeNo(bo.getOutTradeNo())
                 .setAttach(bo.getAttach())
                 .setTransactionId(bo.getBankTrxNo())
                 .setTotalFee(NumberUtil.mul(bo.getOrderPrice(), 100 + "").toString());
         wxService.WxNotify(notifyBO);
+        TbOrder tbOrder = tbOrderService.findByOutTradeNo(outTradeNo);
+        tbOrder.setOrderStatus(orderStatus)
+                .setTransactionId(bo.getBankTrxNo())
+                .setCompleteDate(bo.getSuccessTime());
     }
 }

+ 63 - 3
sp-server/src/main/java/com/pj/api/jh/task/CheckPayStatusTask.java

@@ -1,20 +1,80 @@
 package com.pj.api.jh.task;
 
+import cn.hutool.core.util.StrUtil;
 import cn.hutool.extra.spring.SpringUtil;
+import cn.hutool.http.HttpUtil;
+import cn.hutool.json.JSONObject;
+import cn.hutool.json.JSONUtil;
+import com.pj.api.jh.bo.JhNotifyBO;
+import com.pj.api.jh.service.JhService;
+import com.pj.api.jh.utils.JhHttpUtils;
+import com.pj.api.wx.service.WxService;
+import com.pj.current.config.JhConfig;
 import com.pj.current.task.Task;
 import com.pj.project.tb_order.TbOrder;
 import com.pj.project.tb_order.TbOrderService;
+import com.pj.project4sp.global.BusinessException;
 import lombok.extern.slf4j.Slf4j;
 
+import java.time.LocalDateTime;
+import java.time.temporal.ChronoUnit;
+import java.util.Map;
+
 @Slf4j
 public class CheckPayStatusTask extends Task {
-    public CheckPayStatusTask(String id, long delayInMilliseconds) {
+    private String outTradeNo;
+    private LocalDateTime startTime;
+
+    public CheckPayStatusTask(String id, long delayInMilliseconds, String outTradeNo) {
         super(id, delayInMilliseconds);
+        this.outTradeNo = outTradeNo;
+        this.startTime = LocalDateTime.now();
     }
 
     @Override
     public void run() {
-        TbOrderService tbOrderService = SpringUtil.getBean(TbOrderService.class);
-        tbOrderService.check();
+        JhConfig jhConfig = SpringUtil.getBean(JhConfig.class);
+        JhService jhService = SpringUtil.getBean(JhService.class);
+        String url = jhConfig.getServerUrl() + "/uaps-web-gateway/query/singleOrder";
+        Map<String, Object> params = jhService.buildCheckParams(outTradeNo);
+        check(url, params);
+    }
+
+    private void check(String url, Map<String, Object> params) {
+        LocalDateTime now = LocalDateTime.now();
+        if (ChronoUnit.MINUTES.between(startTime,now)>5){
+            log.error("超时订单,不再查单:{}",outTradeNo);
+            return;
+        }
+        log.info("开始查单===:{}", JSONUtil.toJsonStr(params));
+        JhHttpUtils jhHttpUtils = SpringUtil.getBean(JhHttpUtils.class);
+        JSONObject result = jhHttpUtils.checkStatus(url, params);
+        String orderStatus = result.getStr("orderStatus");
+        if (StrUtil.equals(orderStatus, "WAITING_PAYMENT")) {
+            try {
+                Thread.sleep(2000);
+            } catch (InterruptedException e) {
+                e.printStackTrace();
+            }
+            this.check(url, params);
+        } else if (StrUtil.equals(orderStatus, "SUCCESS") || StrUtil.equals(orderStatus, "FINISH")) {
+            TbOrderService tbOrderService = SpringUtil.getBean(TbOrderService.class);
+            TbOrder tbOrder = tbOrderService.findByOutTradeNo(outTradeNo);
+            if (StrUtil.equals("WAITING_PAYMENT", tbOrder.getOrderStatus())) {
+                tbOrder.setOrderStatus(orderStatus)
+                        .setTransactionId(result.getStr("bankTrxNo"))
+                        .setCompleteDate(result.getStr("completeDate"));
+                tbOrderService.updateById(tbOrder);
+                JhService jhService = SpringUtil.getBean(JhService.class);
+                JhNotifyBO notifyBO = new JhNotifyBO();
+                notifyBO.setAttach(tbOrder.getAttach()).setBankTrxNo(tbOrder.getTransactionId()).setTradeStatus(orderStatus)
+                        .setOutTradeNo(tbOrder.getOutTradeNo()).setOrderPrice(tbOrder.getPrice());
+                jhService.notifyResult(notifyBO);
+            }
+
+        }
+
     }
+
+
 }

+ 20 - 0
sp-server/src/main/java/com/pj/api/jh/task/StartUpCheckPayStatusTask.java

@@ -0,0 +1,20 @@
+package com.pj.api.jh.task;
+
+import cn.hutool.extra.spring.SpringUtil;
+import com.pj.current.task.Task;
+import com.pj.project.tb_order.TbOrder;
+import com.pj.project.tb_order.TbOrderService;
+import lombok.extern.slf4j.Slf4j;
+
+@Slf4j
+public class StartUpCheckPayStatusTask extends Task {
+    public StartUpCheckPayStatusTask(String id, long delayInMilliseconds) {
+        super(id, delayInMilliseconds);
+    }
+
+    @Override
+    public void run() {
+        TbOrderService tbOrderService = SpringUtil.getBean(TbOrderService.class);
+        tbOrderService.check();
+    }
+}

+ 2 - 4
sp-server/src/main/java/com/pj/api/wx/service/WxService.java

@@ -31,6 +31,7 @@ import com.pj.project.tb_costomer.TbCostomer;
 import com.pj.project.tb_costomer.TbCostomerService;
 import com.pj.project.tb_fee_details.TbFeeDetailsService;
 import com.pj.project.tb_fee_statistics.TbFeeStatisticsService;
+import com.pj.project.tb_order.TbOrderService;
 import com.pj.project.tb_pay_record.TbPayRecord;
 import com.pj.project.tb_pay_record.TbPayRecordService;
 import com.pj.utils.cache.RedisUtil;
@@ -65,10 +66,6 @@ public class WxService {
     @Resource
     WxUtils wxUtils;
     @Resource
-    TbPayRecordService tbPayRecordService;
-    @Resource
-    TbCostomerService tbCostomerService;
-    @Resource
     TbBusinessCarService tbBusinessCarService;
     @Resource
     @Lazy
@@ -80,6 +77,7 @@ public class WxService {
     @Resource
     TbFeeDetailsService tbFeeDetailsService;
 
+
     /**
      * 统一下单接口
      */

+ 2 - 4
sp-server/src/main/java/com/pj/current/SaPlusStartup.java

@@ -1,14 +1,12 @@
 package com.pj.current;
 
-import java.net.InetAddress;
 import java.text.SimpleDateFormat;
 import java.util.Date;
 
-import com.pj.api.jh.task.CheckPayStatusTask;
+import com.pj.api.jh.task.StartUpCheckPayStatusTask;
 import com.pj.current.config.WxConfig;
 import com.pj.current.task.TaskService;
 import com.pj.current.task.TokenTask;
-import com.pj.project.tb_order.TbOrderService;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.boot.CommandLineRunner;
@@ -51,7 +49,7 @@ public class SaPlusStartup implements CommandLineRunner {
     public void run(String... args){
         tokenTask.run();
         threadPoolTaskScheduler.scheduleAtFixedRate(tokenTask, wxConfig.getFlushSecond() * 1000);
-        taskService.addTask(new CheckPayStatusTask("=========检查正在支付订单状态========",2000L));
+        taskService.addTask(new StartUpCheckPayStatusTask("=========检查正在支付订单状态========",2000L));
     }
 
 

+ 1 - 0
sp-server/src/main/java/com/pj/current/config/JhConfig.java

@@ -20,5 +20,6 @@ public class JhConfig {
     private String tradeType;
     private String paySecret;
     private String serverUrl;
+    private boolean enable;
 
 }

+ 8 - 2
sp-server/src/main/java/com/pj/project/tb_order/TbOrderService.java

@@ -1,5 +1,7 @@
 package com.pj.project.tb_order;
 
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
 import java.util.List;
 import java.util.Map;
 
@@ -59,6 +61,7 @@ public class TbOrderService extends ServiceImpl<TbOrderMapper, TbOrder> implemen
     public void check() {
         QueryWrapper<TbOrder> ew = new QueryWrapper<>();
         ew.eq("order_status", "WAITING_PAYMENT");
+        ew.ge("date_format(order_time,'%Y-%m-%d %H:%i:%s')", LocalDateTime.now().minusMinutes(10).format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
         List<TbOrder> list = this.list(ew);
         String url = jhConfig.getServerUrl() + "/uaps-web-gateway/query/singleOrder";
         list.forEach(tbOrder -> {
@@ -74,10 +77,13 @@ public class TbOrderService extends ServiceImpl<TbOrderMapper, TbOrder> implemen
                 notifyBO.setAttach(tbOrder.getAttach()).setBankTrxNo(tbOrder.getTransactionId()).setTradeStatus(orderStatus)
                         .setOutTradeNo(tbOrder.getOutTradeNo()).setOrderPrice(tbOrder.getPrice());
                 jhService.notifyResult(notifyBO);
-            } else if (StrUtil.equals(orderStatus, "FAILED")) {
-                this.removeById(tbOrder.getId());
             }
         });
     }
 
+    public TbOrder findByOutTradeNo(String outTradeNo) {
+        QueryWrapper<TbOrder> ew = new QueryWrapper<>();
+        ew.eq("out_trade_no", outTradeNo);
+        return getOne(ew);
+    }
 }

+ 1 - 0
sp-server/src/main/resources/application-dev.yml

@@ -84,3 +84,4 @@ jh-config:
     trade-type: GAS_PAY
     pay-secret: f0b9d6ea704d4c03a6b44be50d055025
     server-url: http://116.252.74.15:8081
+    enable: true