Browse Source

汇付支付修改

周箭河 5 years ago
parent
commit
e75aeeebce

+ 55 - 20
mec-biz/src/main/java/com/ym/mec/biz/service/NotifyCallback.java

@@ -3,11 +3,15 @@ package com.ym.mec.biz.service;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
 import com.huifu.adapay.notify.MQTTCallbackHandler;
+import com.ym.mec.biz.dal.entity.StudentPaymentOrder;
+import com.ym.mec.biz.dal.entity.TenantPaymentOrder;
+import com.ym.mec.biz.dal.enums.DealStatusEnum;
 import com.ym.mec.thirdparty.adapay2.ConfigInit;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
 import javax.annotation.PostConstruct;
+import java.math.BigDecimal;
 import java.util.HashMap;
 import java.util.Map;
 
@@ -17,6 +21,8 @@ public class NotifyCallback implements MQTTCallbackHandler {
 
     @Autowired
     private StudentPaymentOrderService studentPaymentOrderService;
+    @Autowired
+    private TenantPaymentOrderService tenantPaymentOrderService;
 
     private static NotifyCallback notifyCallback;
 
@@ -38,13 +44,23 @@ public class NotifyCallback implements MQTTCallbackHandler {
         if (!dataObj.getString("app_id").equals(ConfigInit.appId)) {
             return;
         }
-
-        Map<String, String> notifyMap = new HashMap<>();
-        notifyMap.put("channelType", dataObj.getString("pay_channel"));
-        notifyMap.put("tradeState", "1");
-        notifyMap.put("totalMoney", dataObj.getString("pay_amt"));
-        notifyMap.put("merOrderNo", dataObj.getString("order_no"));
-        notifyCallback.studentPaymentOrderService.updateOrder(notifyMap);
+        String orderNo = dataObj.getString("order_no");
+        StudentPaymentOrder studentPaymentOrder = notifyCallback.studentPaymentOrderService.findOrderByOrderNo(orderNo);
+
+        if (studentPaymentOrder != null) {
+            Map<String, String> notifyMap = new HashMap<>();
+            notifyMap.put("channelType", dataObj.getString("pay_channel"));
+            notifyMap.put("tradeState", "1");
+            notifyMap.put("totalMoney", dataObj.getString("pay_amt"));
+            notifyMap.put("merOrderNo", dataObj.getString("order_no"));
+            notifyCallback.studentPaymentOrderService.updateOrder(notifyMap);
+        } else {
+            TenantPaymentOrder tenantPaymentOrder = notifyCallback.tenantPaymentOrderService.queryByOrderNo(orderNo);
+            tenantPaymentOrder.setStatus(DealStatusEnum.SUCCESS);
+            tenantPaymentOrder.setPaymentBusinessChannel(dataObj.getString("pay_channel"));
+            tenantPaymentOrder.setActualAmount(new BigDecimal(dataObj.getString("pay_amt")));
+            notifyCallback.tenantPaymentOrderService.paymentForCallback(tenantPaymentOrder);
+        }
     }
 
     /**
@@ -62,12 +78,22 @@ public class NotifyCallback implements MQTTCallbackHandler {
             return;
         }
 
-        Map<String, String> notifyMap = new HashMap<>();
-        notifyMap.put("channelType", dataObj.getString("pay_channel"));
-        notifyMap.put("tradeState", "0");
-        notifyMap.put("totalMoney", dataObj.getString("pay_amt"));
-        notifyMap.put("merOrderNo", dataObj.getString("order_no"));
-        notifyCallback.studentPaymentOrderService.updateOrder(notifyMap);
+        String orderNo = dataObj.getString("order_no");
+        StudentPaymentOrder studentPaymentOrder = notifyCallback.studentPaymentOrderService.findOrderByOrderNo(orderNo);
+
+        if (studentPaymentOrder != null) {
+            Map<String, String> notifyMap = new HashMap<>();
+            notifyMap.put("channelType", dataObj.getString("pay_channel"));
+            notifyMap.put("tradeState", "0");
+            notifyMap.put("totalMoney", dataObj.getString("pay_amt"));
+            notifyMap.put("merOrderNo", dataObj.getString("order_no"));
+            notifyCallback.studentPaymentOrderService.updateOrder(notifyMap);
+        } else {
+            TenantPaymentOrder tenantPaymentOrder = notifyCallback.tenantPaymentOrderService.queryByOrderNo(orderNo);
+            tenantPaymentOrder.setStatus(DealStatusEnum.FAILED);
+            tenantPaymentOrder.setPaymentBusinessChannel(dataObj.getString("pay_channel"));
+            notifyCallback.tenantPaymentOrderService.paymentForCallback(tenantPaymentOrder);
+        }
     }
 
 
@@ -84,13 +110,22 @@ public class NotifyCallback implements MQTTCallbackHandler {
         if (!dataObj.getString("app_id").equals(ConfigInit.appId)) {
             return;
         }
-
-        Map<String, String> notifyMap = new HashMap<>();
-        notifyMap.put("channelType", dataObj.getString("pay_channel"));
-        notifyMap.put("tradeState", "0");
-        notifyMap.put("totalMoney", dataObj.getString("pay_amt"));
-        notifyMap.put("merOrderNo", dataObj.getString("order_no"));
-        notifyCallback.studentPaymentOrderService.updateOrder(notifyMap);
+        String orderNo = dataObj.getString("order_no");
+        StudentPaymentOrder studentPaymentOrder = notifyCallback.studentPaymentOrderService.findOrderByOrderNo(orderNo);
+
+        if (studentPaymentOrder != null) {
+            Map<String, String> notifyMap = new HashMap<>();
+            notifyMap.put("channelType", dataObj.getString("pay_channel"));
+            notifyMap.put("tradeState", "0");
+            notifyMap.put("totalMoney", dataObj.getString("pay_amt"));
+            notifyMap.put("merOrderNo", dataObj.getString("order_no"));
+            notifyCallback.studentPaymentOrderService.updateOrder(notifyMap);
+        } else {
+            TenantPaymentOrder tenantPaymentOrder = notifyCallback.tenantPaymentOrderService.queryByOrderNo(orderNo);
+            tenantPaymentOrder.setStatus(DealStatusEnum.FAILED);
+            tenantPaymentOrder.setPaymentBusinessChannel(dataObj.getString("pay_channel"));
+            tenantPaymentOrderService.paymentForCallback(tenantPaymentOrder);
+        }
     }
 
     /**

+ 14 - 2
mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentPaymentOrderServiceImpl.java

@@ -136,8 +136,8 @@ public class StudentPaymentOrderServiceImpl extends BaseServiceImpl<Long, Studen
                         updateOrder(rpMap); //更新订单
                     } catch (Exception e) {
                         e.printStackTrace();
-                        continue;
                     }
+                    continue;
                 }
             }
             closeOrders(orderNoList); //关闭订单
@@ -160,16 +160,28 @@ public class StudentPaymentOrderServiceImpl extends BaseServiceImpl<Long, Studen
             Map<String, Object> payment = Payment.queryPayment(payingOrder.getTransNo());
             Map<String, String> rpMap = new HashMap<>();
             rpMap.put("merOrderNo", payingOrder.getOrderNo());
-            rpMap.put("remarks", (String) payment.get("reason"));
             rpMap.put("orderNo", (String) payment.get("id"));
             rpMap.put("channelType", (String) payment.get("pay_channel"));
             String status = (String) payment.get("status");
+            if(payment.containsKey("error_msg")){
+                rpMap.put("remarks", (String) payment.get("error_msg"));
+            }
             if (status.equals("succeeded")) {
                 rpMap.put("tradeState", "1");
             }
             if (status.equals("failed")) {
                 rpMap.put("tradeState", "0");
             }
+
+            if (rpMap.containsKey("tradeState")) {
+                try {
+                    updateOrder(rpMap); //更新订单
+                } catch (Exception e) {
+                    e.printStackTrace();
+                    continue;
+                }
+            }
+
             if (status.equals("pending")) {
                 orderNoList.add(payingOrder.getOrderNo());
             }

+ 338 - 321
mec-biz/src/main/java/com/ym/mec/biz/service/impl/TenantPaymentOrderServiceImpl.java

@@ -53,325 +53,342 @@ import com.ym.mec.util.date.DateUtil;
 @Service
 public class TenantPaymentOrderServiceImpl extends BaseServiceImpl<Long, TenantPaymentOrder> implements TenantPaymentOrderService {
 
-	private static final Logger logger = LoggerFactory.getLogger(TenantPaymentOrderServiceImpl.class);
-
-	@Autowired
-	private TenantPaymentOrderDao tenantPaymentOrderDao;
-
-	@Autowired
-	private TenantEntryActivitiesDao tenantEntryActivitiesDao;
-
-	@Autowired
-	private IdGeneratorService idGeneratorService;
-
-	@Autowired
-	private PayService payService;
-
-	@Autowired
-	private SysConfigDao sysConfigDao;
-
-	@Autowired
-	private TeacherDao teacherDao;
-
-	@Autowired
-	private SysTenantAccountService sysTenantAccountService;
-
-	@Autowired
-	private YqPayFeignService yqPayFeignService;
-
-	@Override
-	public BaseDAO<Long, TenantPaymentOrder> getDAO() {
-		return tenantPaymentOrderDao;
-	}
-
-	@Override
-	@Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
-	public HttpResponseResult createOrder(Integer userId, Integer activitiesId, boolean isContinuePay) {
-
-		Teacher teacher = teacherDao.get(userId);
-		if (teacher == null) {
-			throw new BizException("用户信息不存在");
-		}
-
-		Integer organId = teacher.getTeacherOrganId();
-
-		TenantEntryActivities tenantEntryActivities = tenantEntryActivitiesDao.get(activitiesId);
-		if (tenantEntryActivities == null) {
-			throw new BizException("活动不存在");
-		}
-
-		Date date = new Date();
-		// 判断活动是否有效
-		if (tenantEntryActivities.getDelFlag() == true) {
-			throw new BizException("活动已下架");
-		}
-		if (date.before(tenantEntryActivities.getStartDate())) {
-			throw new BizException("活动未开始");
-		}
-		if (date.after(tenantEntryActivities.getEndDate())) {
-			throw new BizException("活动已结束");
-		}
-
-		// 查询用户订单
-		List<TenantPaymentOrder> orderList = tenantPaymentOrderDao.queryByUserIdAndActivitiesId(userId, activitiesId);
-		if (orderList != null && orderList.size() > 0) {
-			for (TenantPaymentOrder po : orderList) {
-				// 是否满足条件
-				if (tenantEntryActivities.getSuitableUser() == SuitableUser.NEW) {
-					if (po.getStatus() == DealStatusEnum.SUCCESS) {
-						throw new BizException("首充优惠活动每个用户限参与一次。");
-					}
-
-					if (po.getStatus() == DealStatusEnum.ING) {
-						int i = 35 - DateUtil.minutesBetween(po.getCreateTime(), date);
-						if (i <= 0) {
-							throw new BizException("您有支付中的订单出现异常,请联系客服");
-						}
-						// throw new BizException("您参加的首充活动正在处理中,预计于{}分钟后处理完毕,请稍后。", i);
-						if (isContinuePay == false) {
-							HttpResponseResult result = new HttpResponseResult(true, HttpStatus.CONTINUE, "您存在支付中的订单,是否重新付款?", null);
-							return result;
-						} else {
-							// 关闭原订单
-							po.setStatus(DealStatusEnum.CLOSE);
-							po.setMemo("用户主动关闭");
-							po.setUpdateTime(date);
-							tenantPaymentOrderDao.update(po);
-						}
-					}
-				}
-			}
-		}
-
-		TenantPaymentOrder tenantPaymentOrder = new TenantPaymentOrder();
-		tenantPaymentOrder.setUserId(userId);
-		tenantPaymentOrder.setTransMinutes(tenantEntryActivities.getPurchaseMinutes());
-		tenantPaymentOrder.setGiveMinutes(tenantEntryActivities.getGiveMinutes());
-		tenantPaymentOrder.setOrderNo(idGeneratorService.generatorId("tenant_payment") + "");
-		tenantPaymentOrder.setType(TenantPaymentType.RECHARGE);
-		tenantPaymentOrder.setExpectAmount(tenantEntryActivities.getDiscountPrice());
-		tenantPaymentOrder.setStatus(DealStatusEnum.ING);
-		tenantPaymentOrder.setCreateTime(date);
-		tenantPaymentOrder.setUpdateTime(date);
-		tenantPaymentOrder.setVersion(0);
-		tenantPaymentOrder.setOrganId(organId);
-		tenantPaymentOrder.setActivitiesId(activitiesId);
-		tenantPaymentOrderDao.insert(tenantPaymentOrder);
-
-		String baseApiUrl = sysConfigDao.findConfigValue("teacher_base_url");
-
-		// 分类费用 course,instrument,accessories,other
-		Map<String, BigDecimal> classFee = new HashMap<>();
-		classFee.put("course", BigDecimal.ZERO);
-		classFee.put("instrument", BigDecimal.ZERO);
-		classFee.put("accessories", BigDecimal.ZERO);
-		classFee.put("other", tenantPaymentOrder.getExpectAmount());
-
-		try {
-
-			Map<String, Object> payMap = payService.getPayMap(tenantPaymentOrder.getExpectAmount(), tenantPaymentOrder.getOrderNo(), baseApiUrl
-					+ "/api-teacher/teacherOrder/notify", baseApiUrl + "/api-teacher/teacherOrder/paymentResult?orderNo=" + tenantPaymentOrder.getOrderNo(),
-					"商户入驻", "商户充值", userId, classFee, organId, "sdaya");
-
-			Map<String, BigDecimal> routingFee = (Map<String, BigDecimal>) payMap.get("routingFee");
-			tenantPaymentOrder.setComAmount(routingFee.get("COM"));
-			tenantPaymentOrder.setPerAmount(routingFee.get("PER"));
-			tenantPaymentOrder.setMerNos((String) payMap.get("routingMerNos"));
-			tenantPaymentOrder.setPaymentChannel(PaymentChannelEnum.valueOf(payMap.get("type").toString()));
-			tenantPaymentOrder.setUpdateTime(date);
-			tenantPaymentOrderDao.update(tenantPaymentOrder);
-
-			HttpResponseResult result = new HttpResponseResult(true, HttpStatus.OK, payMap, null);
-			return result;
-		} catch (Exception e) {
-			throw new BizException("调用支付接口出错", e);
-		}
-	}
-
-	@Override
-	@Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
-	public boolean paymentForCallback(TenantPaymentOrder tenantPaymentOrder) {
-
-		Integer activitiesId = tenantPaymentOrder.getActivitiesId();
-
-		Date date = new Date();
-		tenantPaymentOrder.setUpdateTime(date);
-		tenantPaymentOrderDao.update(tenantPaymentOrder);
-
-		Integer userId = tenantPaymentOrder.getUserId();
-
-		if (tenantPaymentOrder.getStatus() == DealStatusEnum.SUCCESS) {
-
-			TenantEntryActivities tenantEntryActivities = tenantEntryActivitiesDao.get(activitiesId);
-			if (tenantEntryActivities == null) {
-				throw new BizException("活动找不到");
-			}
-
-			// 更新账户表信息
-			sysTenantAccountService.update(userId, tenantEntryActivities.getPurchaseMinutes() + tenantEntryActivities.getGiveMinutes(),
-					tenantPaymentOrder.getOrderNo(), TransType.RECHARGE, "", tenantEntryActivities.getDiscountPrice(), "");
-		} else {
-
-		}
-
-		return true;
-	}
-
-	@Override
-	public void queryOrderStatusFromRemote() {
-		try {
-			yqPayQuery();
-		} catch (Exception e) {
-			throw new BizException("查询订单状态出现异常");
-		}
-		try {
-			adaPayQuery();
-		} catch (Exception e) {
-			throw new BizException("查询订单状态出现异常");
-		}
-	}
-
-	private void yqPayQuery() throws Exception {
-		List<TenantPaymentOrder> payingOrders = tenantPaymentOrderDao.findOrdersByStatus(DealStatusEnum.ING, "YQPAY");
-
-		if (payingOrders.size() == 0) {
-			return;
-		}
-		List<String> orderNoList = payingOrders.stream().map(TenantPaymentOrder::getOrderNo).collect(Collectors.toList());
-		String merOrderNos = payingOrders.stream().map(TenantPaymentOrder::getOrderNo).collect(Collectors.joining(","));
-
-		String notifyUrl = ""; // 回调地址
-		Map<String, Object> resultMap = new LinkedHashMap<>();
-		resultMap.put("merOrderNoList", merOrderNos);
-		Map<String, Object> requestMap = YqPayUtil.getRequestMap(notifyUrl, resultMap);
-
-		RsqMsg rsqMsg = new RsqMsg(requestMap);
-
-		Msg queryRs = yqPayFeignService.orderQuery(rsqMsg);
-		logger.info("支付状态查询结果:{}", queryRs);
-		if (queryRs.getCode().equals("88")) {
-			// 更新订单状态
-			String[] statusArr = { "0", "1", "7" };
-			String responseParameters = queryRs.getResponseParameters();
-			List<Map<String, Object>> responseList = JSON.parseObject(responseParameters, List.class);
-			for (Map<String, Object> response : responseList) {
-				Map<String, Object> rpMap = response;
-				String channelType = rpMap.get("channelType").equals("1") ? "WXPay" : (rpMap.get("channelType").equals("2") ? "Alipay" : "quickPay");
-				rpMap.put("channelType", channelType);
-
-				if (orderNoList.contains(rpMap.get("merOrderNo"))) {
-					orderNoList.remove(rpMap.get("merOrderNo"));
-				}
-
-				if (Arrays.asList(statusArr).contains(rpMap.get("tradeState"))) {
-					try {
-						DealStatusEnum status = rpMap.get("tradeState").equals("1") ? DealStatusEnum.SUCCESS : DealStatusEnum.FAILED;
-						TenantPaymentOrder order = tenantPaymentOrderDao.findOrderByOrderNo(rpMap.get("merOrderNo").toString());
-						if (order == null || !order.getStatus().equals(DealStatusEnum.ING)) {
-							continue;
-						}
-
-						if (status.equals(DealStatusEnum.SUCCESS)) {
-							order.setPayTime(new Date());
-						} else {
-							Object remarks = rpMap.get("remarks");
-							if (remarks != null) {
-								order.setMemo(remarks.toString());
-							}
-						}
-						order.setStatus(status);
-						order.setTransNo(rpMap.get("orderNo").toString());
-						order.setPaymentBusinessChannel(channelType);
-						order.setActualAmount(new BigDecimal(rpMap.get("moneyPayed").toString()));
-						paymentForCallback(order);
-					} catch (Exception e) {
-						e.printStackTrace();
-						continue;
-					}
-				}
-			}
-
-			Date date = new Date();
-			for (TenantPaymentOrder po : payingOrders) {
-				if (orderNoList.contains(po.getOrderNo())) {
-					// 超过30分钟的关闭订单
-					if (DateUtil.addMinutes(po.getCreateTime(), 30).before(date)) {
-						po.setStatus(DealStatusEnum.FAILED);
-						po.setMemo("超时未支付关闭");
-						paymentForCallback(po);
-					}
-				}
-			}
-		}
-	}
-
-	private void adaPayQuery() throws Exception {
-		List<TenantPaymentOrder> payingOrders = tenantPaymentOrderDao.findOrdersByStatus(DealStatusEnum.ING, "ADAPAY");
-		if (payingOrders.size() == 0) {
-			return;
-		}
-
-		List<String> orderNoList = new ArrayList<String>();
-
-		for (TenantPaymentOrder payingOrder : payingOrders) {
-			if (payingOrder.getTransNo() == null) {
-				orderNoList.add(payingOrder.getOrderNo());
-				continue;
-			}
-			Map<String, Object> payment = Payment.queryPayment(payingOrder.getTransNo());
-			Map<String, String> rpMap = new HashMap<>();
-			rpMap.put("merOrderNo", payingOrder.getOrderNo());
-			rpMap.put("remarks", (String) payment.get("reason"));
-			rpMap.put("orderNo", (String) payment.get("id"));
-			rpMap.put("channelType", (String) payment.get("pay_channel"));
-			String status = (String) payment.get("status");
-			if (status.equals("succeeded")) {
-				rpMap.put("tradeState", "1");
-			}
-			if (status.equals("failed")) {
-				rpMap.put("tradeState", "0");
-			}
-			if (status.equals("pending")) {
-				orderNoList.add(payingOrder.getOrderNo());
-			}
-		}
-
-		Date date = new Date();
-		for (TenantPaymentOrder po : payingOrders) {
-			if (orderNoList.contains(po.getOrderNo())) {
-				// 超过30分钟的关闭订单
-				if (DateUtil.addMinutes(po.getCreateTime(), 30).before(date)) {
-					po.setStatus(DealStatusEnum.FAILED);
-					po.setMemo("超时未支付关闭");
-					paymentForCallback(po);
-				}
-			}
-		}
-	}
-
-	@Override
-	public TenantPaymentOrder queryByOrderNo(String orderNo) {
-		return tenantPaymentOrderDao.findOrderByOrderNo(orderNo);
-	}
-
-	@Override
-	public Object queryTenanPaymentPage(TenantPaymentOrderQueryInfo queryInfo) {
-		PageInfoOrder<TenantPaymentOrder> pageInfo = new PageInfoOrder<>(queryInfo.getPage(), queryInfo.getRows());
-		Map<String, Object> params = new HashMap<String, Object>();
-		MapUtil.populateMap(params, queryInfo);
-		List<TenantPaymentOrder> dataList = new ArrayList<>();
-		int count = this.findCount(params);
-		if (count > 0) {
-			TenantPaymentOrder orderMoneyAmount = tenantPaymentOrderDao.getOrderMoneyAmount(params);
-			if (orderMoneyAmount != null) {
-				pageInfo.setTotalExpectAmount(orderMoneyAmount.getExpectAmount() != null ? orderMoneyAmount.getExpectAmount() : BigDecimal.ZERO);
-				pageInfo.setTotalActualAmount(orderMoneyAmount.getActualAmount() != null ? orderMoneyAmount.getActualAmount() : BigDecimal.ZERO);
-			}
-			pageInfo.setTotal(count);
-			params.put("offset", pageInfo.getOffset());
-			dataList = tenantPaymentOrderDao.queryPage(params);
-		}
-		pageInfo.setRows(dataList);
-		return pageInfo;
-	}
+    private static final Logger logger = LoggerFactory.getLogger(TenantPaymentOrderServiceImpl.class);
+
+    @Autowired
+    private TenantPaymentOrderDao tenantPaymentOrderDao;
+
+    @Autowired
+    private TenantEntryActivitiesDao tenantEntryActivitiesDao;
+
+    @Autowired
+    private IdGeneratorService idGeneratorService;
+
+    @Autowired
+    private PayService payService;
+
+    @Autowired
+    private SysConfigDao sysConfigDao;
+
+    @Autowired
+    private TeacherDao teacherDao;
+
+    @Autowired
+    private SysTenantAccountService sysTenantAccountService;
+
+    @Autowired
+    private YqPayFeignService yqPayFeignService;
+
+    @Override
+    public BaseDAO<Long, TenantPaymentOrder> getDAO() {
+        return tenantPaymentOrderDao;
+    }
+
+    @Override
+    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
+    public HttpResponseResult createOrder(Integer userId, Integer activitiesId, boolean isContinuePay) {
+
+        Teacher teacher = teacherDao.get(userId);
+        if (teacher == null) {
+            throw new BizException("用户信息不存在");
+        }
+
+        Integer organId = teacher.getTeacherOrganId();
+
+        TenantEntryActivities tenantEntryActivities = tenantEntryActivitiesDao.get(activitiesId);
+        if (tenantEntryActivities == null) {
+            throw new BizException("活动不存在");
+        }
+
+        Date date = new Date();
+        // 判断活动是否有效
+        if (tenantEntryActivities.getDelFlag() == true) {
+            throw new BizException("活动已下架");
+        }
+        if (date.before(tenantEntryActivities.getStartDate())) {
+            throw new BizException("活动未开始");
+        }
+        if (date.after(tenantEntryActivities.getEndDate())) {
+            throw new BizException("活动已结束");
+        }
+
+        // 查询用户订单
+        List<TenantPaymentOrder> orderList = tenantPaymentOrderDao.queryByUserIdAndActivitiesId(userId, activitiesId);
+        if (orderList != null && orderList.size() > 0) {
+            for (TenantPaymentOrder po : orderList) {
+                // 是否满足条件
+                if (tenantEntryActivities.getSuitableUser() == SuitableUser.NEW) {
+                    if (po.getStatus() == DealStatusEnum.SUCCESS) {
+                        throw new BizException("首充优惠活动每个用户限参与一次。");
+                    }
+
+                    if (po.getStatus() == DealStatusEnum.ING) {
+                        int i = 35 - DateUtil.minutesBetween(po.getCreateTime(), date);
+                        if (i <= 0) {
+                            throw new BizException("您有支付中的订单出现异常,请联系客服");
+                        }
+                        // throw new BizException("您参加的首充活动正在处理中,预计于{}分钟后处理完毕,请稍后。", i);
+                        if (isContinuePay == false) {
+                            HttpResponseResult result = new HttpResponseResult(true, HttpStatus.CONTINUE, "您存在支付中的订单,是否重新付款?", null);
+                            return result;
+                        } else {
+                            // 关闭原订单
+                            po.setStatus(DealStatusEnum.CLOSE);
+                            po.setMemo("用户主动关闭");
+                            po.setUpdateTime(date);
+                            tenantPaymentOrderDao.update(po);
+                        }
+                    }
+                }
+            }
+        }
+
+        TenantPaymentOrder tenantPaymentOrder = new TenantPaymentOrder();
+        tenantPaymentOrder.setUserId(userId);
+        tenantPaymentOrder.setTransMinutes(tenantEntryActivities.getPurchaseMinutes());
+        tenantPaymentOrder.setGiveMinutes(tenantEntryActivities.getGiveMinutes());
+        tenantPaymentOrder.setOrderNo(idGeneratorService.generatorId("tenant_payment") + "");
+        tenantPaymentOrder.setType(TenantPaymentType.RECHARGE);
+        tenantPaymentOrder.setExpectAmount(tenantEntryActivities.getDiscountPrice());
+        tenantPaymentOrder.setStatus(DealStatusEnum.ING);
+        tenantPaymentOrder.setCreateTime(date);
+        tenantPaymentOrder.setUpdateTime(date);
+        tenantPaymentOrder.setVersion(0);
+        tenantPaymentOrder.setOrganId(organId);
+        tenantPaymentOrder.setActivitiesId(activitiesId);
+        tenantPaymentOrderDao.insert(tenantPaymentOrder);
+
+        String baseApiUrl = sysConfigDao.findConfigValue("teacher_base_url");
+
+        // 分类费用 course,instrument,accessories,other
+        Map<String, BigDecimal> classFee = new HashMap<>();
+        classFee.put("course", BigDecimal.ZERO);
+        classFee.put("instrument", BigDecimal.ZERO);
+        classFee.put("accessories", BigDecimal.ZERO);
+        classFee.put("other", tenantPaymentOrder.getExpectAmount());
+
+        try {
+
+            Map<String, Object> payMap = payService.getPayMap(tenantPaymentOrder.getExpectAmount(), tenantPaymentOrder.getOrderNo(), baseApiUrl
+                            + "/api-teacher/teacherOrder/notify", baseApiUrl + "/api-teacher/teacherOrder/paymentResult?orderNo=" + tenantPaymentOrder.getOrderNo(),
+                    "商户入驻", "商户充值", userId, classFee, organId, "sdaya");
+
+            Map<String, BigDecimal> routingFee = (Map<String, BigDecimal>) payMap.get("routingFee");
+            tenantPaymentOrder.setComAmount(routingFee.get("COM"));
+            tenantPaymentOrder.setPerAmount(routingFee.get("PER"));
+            tenantPaymentOrder.setMerNos((String) payMap.get("routingMerNos"));
+            tenantPaymentOrder.setPaymentChannel(PaymentChannelEnum.valueOf(payMap.get("type").toString()));
+            tenantPaymentOrder.setUpdateTime(date);
+            tenantPaymentOrderDao.update(tenantPaymentOrder);
+
+            HttpResponseResult result = new HttpResponseResult(true, HttpStatus.OK, payMap, null);
+            return result;
+        } catch (Exception e) {
+            throw new BizException("调用支付接口出错", e);
+        }
+    }
+
+    @Override
+    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
+    public boolean paymentForCallback(TenantPaymentOrder tenantPaymentOrder) {
+
+        Integer activitiesId = tenantPaymentOrder.getActivitiesId();
+
+        Date date = new Date();
+        tenantPaymentOrder.setUpdateTime(date);
+        tenantPaymentOrderDao.update(tenantPaymentOrder);
+
+        Integer userId = tenantPaymentOrder.getUserId();
+
+        if (tenantPaymentOrder.getStatus() == DealStatusEnum.SUCCESS) {
+
+            TenantEntryActivities tenantEntryActivities = tenantEntryActivitiesDao.get(activitiesId);
+            if (tenantEntryActivities == null) {
+                throw new BizException("活动找不到");
+            }
+
+            // 更新账户表信息
+            sysTenantAccountService.update(userId, tenantEntryActivities.getPurchaseMinutes() + tenantEntryActivities.getGiveMinutes(),
+                    tenantPaymentOrder.getOrderNo(), TransType.RECHARGE, "", tenantEntryActivities.getDiscountPrice(), "");
+        } else {
+
+        }
+
+        return true;
+    }
+
+    @Override
+    public void queryOrderStatusFromRemote() {
+        try {
+            yqPayQuery();
+        } catch (Exception e) {
+            throw new BizException("查询订单状态出现异常");
+        }
+        try {
+            adaPayQuery();
+        } catch (Exception e) {
+            throw new BizException("查询订单状态出现异常");
+        }
+    }
+
+    private void yqPayQuery() throws Exception {
+        List<TenantPaymentOrder> payingOrders = tenantPaymentOrderDao.findOrdersByStatus(DealStatusEnum.ING, "YQPAY");
+
+        if (payingOrders.size() == 0) {
+            return;
+        }
+        List<String> orderNoList = payingOrders.stream().map(TenantPaymentOrder::getOrderNo).collect(Collectors.toList());
+        String merOrderNos = payingOrders.stream().map(TenantPaymentOrder::getOrderNo).collect(Collectors.joining(","));
+
+        String notifyUrl = ""; // 回调地址
+        Map<String, Object> resultMap = new LinkedHashMap<>();
+        resultMap.put("merOrderNoList", merOrderNos);
+        Map<String, Object> requestMap = YqPayUtil.getRequestMap(notifyUrl, resultMap);
+
+        RsqMsg rsqMsg = new RsqMsg(requestMap);
+
+        Msg queryRs = yqPayFeignService.orderQuery(rsqMsg);
+        logger.info("支付状态查询结果:{}", queryRs);
+        if (queryRs.getCode().equals("88")) {
+            // 更新订单状态
+            String[] statusArr = {"0", "1", "7"};
+            String responseParameters = queryRs.getResponseParameters();
+            List<Map<String, Object>> responseList = JSON.parseObject(responseParameters, List.class);
+            for (Map<String, Object> response : responseList) {
+                Map<String, Object> rpMap = response;
+                String channelType = rpMap.get("channelType").equals("1") ? "WXPay" : (rpMap.get("channelType").equals("2") ? "Alipay" : "quickPay");
+                rpMap.put("channelType", channelType);
+
+                if (orderNoList.contains(rpMap.get("merOrderNo"))) {
+                    orderNoList.remove(rpMap.get("merOrderNo"));
+                }
+
+                if (Arrays.asList(statusArr).contains(rpMap.get("tradeState"))) {
+                    try {
+                        DealStatusEnum status = rpMap.get("tradeState").equals("1") ? DealStatusEnum.SUCCESS : DealStatusEnum.FAILED;
+                        TenantPaymentOrder order = tenantPaymentOrderDao.findOrderByOrderNo(rpMap.get("merOrderNo").toString());
+                        if (order == null || !order.getStatus().equals(DealStatusEnum.ING)) {
+                            continue;
+                        }
+
+                        if (status.equals(DealStatusEnum.SUCCESS)) {
+                            order.setPayTime(new Date());
+                            order.setActualAmount(new BigDecimal((String) rpMap.get("payAmount")));
+                        } else {
+                            Object remarks = rpMap.get("remarks");
+                            if (remarks != null) {
+                                order.setMemo(remarks.toString());
+                            }
+                        }
+                        order.setStatus(status);
+                        order.setTransNo(rpMap.get("orderNo").toString());
+                        order.setPaymentBusinessChannel(channelType);
+                        paymentForCallback(order);
+                    } catch (Exception e) {
+                        e.printStackTrace();
+                        continue;
+                    }
+                }
+            }
+
+            Date date = new Date();
+            for (TenantPaymentOrder po : payingOrders) {
+                if (orderNoList.contains(po.getOrderNo())) {
+                    // 超过30分钟的关闭订单
+                    if (DateUtil.addMinutes(po.getCreateTime(), 30).before(date)) {
+                        po.setStatus(DealStatusEnum.FAILED);
+                        po.setMemo("超时未支付关闭");
+                        paymentForCallback(po);
+                    }
+                }
+            }
+        }
+    }
+
+    private void adaPayQuery() throws Exception {
+        List<TenantPaymentOrder> payingOrders = tenantPaymentOrderDao.findOrdersByStatus(DealStatusEnum.ING, "ADAPAY");
+        if (payingOrders.size() == 0) {
+            return;
+        }
+
+        List<String> orderNoList = new ArrayList<String>();
+
+        for (TenantPaymentOrder payingOrder : payingOrders) {
+            if (payingOrder.getTransNo() == null) {
+                orderNoList.add(payingOrder.getOrderNo());
+                continue;
+            }
+            Map<String, Object> payment = Payment.queryPayment(payingOrder.getTransNo());
+
+            String channelType = (String) payment.get("pay_channel");
+            String payStatus = (String) payment.get("status");
+            String transNo = (String) payment.get("id");
+            String memo = null;
+            if (payment.containsKey("error_msg")) {
+                memo = (String) payment.get("error_msg");
+            }
+            DealStatusEnum status = null;
+            if (payStatus.equals("succeeded")) {
+                status = DealStatusEnum.SUCCESS;
+                payingOrder.setActualAmount(new BigDecimal((String) payment.get("pay_amt")));
+            } else if (payStatus.equals("failed")) {
+                status = DealStatusEnum.FAILED;
+            }
+
+            if (status != null) {
+                payingOrder.setStatus(status);
+                payingOrder.setTransNo(transNo);
+                payingOrder.setPaymentBusinessChannel(channelType);
+                payingOrder.setMemo(memo);
+                try {
+                    paymentForCallback(payingOrder);
+                } catch (Exception e) {
+                    e.printStackTrace();
+                    continue;
+                }
+            }
+
+            if (status.equals("pending")) {
+                orderNoList.add(payingOrder.getOrderNo());
+            }
+        }
+
+        Date date = new Date();
+        for (TenantPaymentOrder po : payingOrders) {
+            if (orderNoList.contains(po.getOrderNo())) {
+                // 超过30分钟的关闭订单
+                if (DateUtil.addMinutes(po.getCreateTime(), 30).before(date)) {
+                    po.setStatus(DealStatusEnum.FAILED);
+                    po.setMemo("超时未支付关闭");
+                    paymentForCallback(po);
+                }
+            }
+        }
+    }
+
+    @Override
+    public TenantPaymentOrder queryByOrderNo(String orderNo) {
+        return tenantPaymentOrderDao.findOrderByOrderNo(orderNo);
+    }
+
+    @Override
+    public Object queryTenanPaymentPage(TenantPaymentOrderQueryInfo queryInfo) {
+        PageInfoOrder<TenantPaymentOrder> pageInfo = new PageInfoOrder<>(queryInfo.getPage(), queryInfo.getRows());
+        Map<String, Object> params = new HashMap<String, Object>();
+        MapUtil.populateMap(params, queryInfo);
+        List<TenantPaymentOrder> dataList = new ArrayList<>();
+        int count = this.findCount(params);
+        if (count > 0) {
+            TenantPaymentOrder orderMoneyAmount = tenantPaymentOrderDao.getOrderMoneyAmount(params);
+            if (orderMoneyAmount != null) {
+                pageInfo.setTotalExpectAmount(orderMoneyAmount.getExpectAmount() != null ? orderMoneyAmount.getExpectAmount() : BigDecimal.ZERO);
+                pageInfo.setTotalActualAmount(orderMoneyAmount.getActualAmount() != null ? orderMoneyAmount.getActualAmount() : BigDecimal.ZERO);
+            }
+            pageInfo.setTotal(count);
+            params.put("offset", pageInfo.getOffset());
+            dataList = tenantPaymentOrderDao.queryPage(params);
+        }
+        pageInfo.setRows(dataList);
+        return pageInfo;
+    }
 }

+ 40 - 8
mec-student/src/main/java/com/ym/mec/student/controller/StudentOrderController.java

@@ -16,6 +16,7 @@ import io.swagger.annotations.ApiOperation;
 import java.io.IOException;
 import java.math.BigDecimal;
 import java.net.URLEncoder;
+import java.text.SimpleDateFormat;
 import java.util.*;
 import java.util.stream.Collectors;
 
@@ -81,6 +82,8 @@ public class StudentOrderController extends BaseController {
     private TeacherCourseStatisticsDao teacherCourseStatisticsDao;
     @Autowired
     private CourseScheduleEvaluateDao courseScheduleEvaluateDao;
+    @Autowired
+    private TenantPaymentOrderService tenantPaymentOrderService;
 
     @PostMapping("/notify")
     public Msg notify(@ModelAttribute Msg msg) throws Exception {
@@ -150,7 +153,7 @@ public class StudentOrderController extends BaseController {
             @ApiImplicitParam(name = "orderNo", value = "订单号", required = true, dataType = "String"),
             @ApiImplicitParam(name = "payChannel", value = "支付方式(alipay-支付宝app支付)", required = true, dataType = "String"),
     })
-    public Object executePayment(BigDecimal amount, String orderNo, String payChannel, String notifyUrl, String returnUrl, String orderSubject, String orderBody, String sign, String code) throws Exception {
+    public Object executePayment(BigDecimal amount, String orderNo, String payChannel, String notifyUrl, String returnUrl, String orderSubject, String orderBody, String sign, String code, String platform) throws Exception {
         String openId = "";
         if (payChannel.equals("wx_pub")) {
             if (code == null || code.isEmpty()) {
@@ -164,13 +167,36 @@ public class StudentOrderController extends BaseController {
             openId = weChatRes.get("openid");
         }
 
-        StudentPaymentOrder order = studentPaymentOrderService.findOrderByOrderNo(orderNo);
-        if (order == null) {
+        Date createTime = null;
+        String merNos = null;
+        TenantPaymentOrder tenantPaymentOrder = null;
+        StudentPaymentOrder studentPaymentOrder = null;
+        if (platform != null && platform.equals("teacher")) {
+            tenantPaymentOrder = tenantPaymentOrderService.queryByOrderNo(orderNo);
+        } else {
+            studentPaymentOrder = studentPaymentOrderService.findOrderByOrderNo(orderNo);
+        }
+
+        if (studentPaymentOrder == null && tenantPaymentOrder == null) {
             return failed("订单不存在");
         }
+        if (studentPaymentOrder != null) {
+            createTime = studentPaymentOrder.getCreateTime();
+            merNos = studentPaymentOrder.getMerNos();
+        } else {
+            createTime = tenantPaymentOrder.getCreateTime();
+            merNos = tenantPaymentOrder.getMerNos();
+        }
 
+        Calendar beforeTime = Calendar.getInstance();
+        beforeTime.add(Calendar.MINUTE, -28);// 28 分钟之前的时间
+        Date beforeDate = beforeTime.getTime();
+        if (createTime.before(beforeDate)) {
+            return failed("订单已超时,请重新下单");
+        }
 
-        String merchantKey = "yifuyun";
+        Date expireDate = DateUtil.addMinutes(createTime, 30);
+        String timeExpire = new SimpleDateFormat("yyyyMMddHHmmss").format(expireDate);
 
         Map<String, Object> paymentParams = new HashMap<>();
         paymentParams.put("app_id", ConfigInit.appId);
@@ -179,11 +205,11 @@ public class StudentOrderController extends BaseController {
         paymentParams.put("pay_amt", amount);
         paymentParams.put("goods_title", orderSubject);
         paymentParams.put("goods_desc", orderBody);
-       // paymentParams.put("notify_url", "https://wxwechat.utools.club/studentOrder/adaNotify");
+        paymentParams.put("time_expire", timeExpire);
 
         List<Map<String, Object>> divMembers = new ArrayList<>();
         Map<String, Object> divMember = new HashMap<>();
-        divMember.put("member_id", order.getMerNos());//分佣账户
+        divMember.put("member_id", merNos);//分佣账户
         divMember.put("amount", amount);//分佣金额
         divMember.put("fee_flag", "Y"); //承担手续费
         divMembers.add(divMember);
@@ -199,8 +225,14 @@ public class StudentOrderController extends BaseController {
         paymentParams.put("expend", expendParams);
 
         Map<String, Object> payment = Payment.executePayment(paymentParams);
-        order.setTransNo((String) payment.get("id"));
-        studentPaymentOrderService.update(order);
+
+        if (studentPaymentOrder != null) {
+            studentPaymentOrder.setTransNo((String) payment.get("id"));
+            studentPaymentOrderService.update(studentPaymentOrder);
+        } else {
+            tenantPaymentOrder.setTransNo((String) payment.get("id"));
+            tenantPaymentOrderService.update(tenantPaymentOrder);
+        }
 
         return succeed(payment);
     }

+ 8 - 27
mec-thirdparty/src/main/java/com/ym/mec/thirdparty/adapay2/CorpMember.java

@@ -96,8 +96,8 @@ class CorpMember extends ConfigInit {
      */
     public static void executeCorpMemberTest( String app_id) throws Exception {
         CorpMember demo = new CorpMember();
-        Map<String, Object> member = demo.executeCreateMember( app_id);
-        demo.executeQueryMember( (String) member.get("member_id"), app_id);
+        //Map<String, Object> member = demo.executeCreateMember();
+        //demo.executeQueryMember( (String) member.get("member_id"), app_id);
 
     }
 
@@ -108,33 +108,14 @@ class CorpMember extends ConfigInit {
      * @return 创建的CorpMember 对象
      * @throws Exception 异常
      */
-    public Map<String, Object> executeCreateMember( String app_id) throws Exception {
+    public Map<String, Object> executeCreateMember( Map<String,Object> info) throws Exception {
         System.out.println("=======execute Create CorpMember begin=======");
-        Map<String, Object> memberParams = new HashMap<String, Object>(2);
-        memberParams.put("member_id", "jsdk_member_" + System.currentTimeMillis());
-        memberParams.put("app_id", app_id);
-        memberParams.put("order_no", "jsdk_order_" + System.currentTimeMillis());
-        memberParams.put("social_credit_code_expires", "1111");
-        memberParams.put("business_scope", "123");
+        Map<String, Object> memberParams = new HashMap<String, Object>();
+        memberParams.put("app_id", appId);
+        memberParams.putAll(info);
+
+        String path= "C:/Users/river/Desktop/mec/mec-thirdparty/libs/test.zip";
 
-        memberParams.put("name", "中国测试有限公司");
-        memberParams.put("prov_code", "0011");
-        memberParams.put("area_code", "1100");
-        memberParams.put("social_credit_code", "201932658452655");
-        memberParams.put("legal_person", "张测试");
-        memberParams.put("legal_cert_id", "321485199014234852");
-        memberParams.put("legal_cert_id_expires", "20220112");
-        memberParams.put("legal_mp", "13958465215");
-        memberParams.put("address", "中国上海");
-        memberParams.put("zip_code", "225485");
-        memberParams.put("telphone", "41164452");
-        memberParams.put("email", "ceshi@qq.com");
-        memberParams.put("bank_code", "652142");
-        memberParams.put("bank_acct_type", "1");
-        memberParams.put("card_no", "622546895642156");
-        memberParams.put("card_name", "中国测试有限公司");
-        String path= CorpMember.class.getClassLoader().getResource("").getPath()+"test.zip";
-        
         File file = new File(path);
         System.out.println("创建企业用户,请求参数:" + JSON.toJSONString(memberParams) );
         Map<String, Object> member = com.huifu.adapay.model.CorpMember.create(memberParams, file);