|
@@ -1,6 +1,7 @@
|
|
|
package com.ym.mec.biz.service.impl;
|
|
|
|
|
|
import java.math.BigDecimal;
|
|
|
+import java.math.RoundingMode;
|
|
|
import java.text.SimpleDateFormat;
|
|
|
import java.util.ArrayList;
|
|
|
import java.util.Calendar;
|
|
@@ -10,14 +11,12 @@ import java.util.LinkedHashMap;
|
|
|
import java.util.List;
|
|
|
import java.util.Map;
|
|
|
import java.util.Objects;
|
|
|
-import java.util.Optional;
|
|
|
import java.util.concurrent.CompletableFuture;
|
|
|
import java.util.concurrent.TimeUnit;
|
|
|
import java.util.function.BiPredicate;
|
|
|
import java.util.function.Consumer;
|
|
|
import java.util.function.Function;
|
|
|
|
|
|
-import org.apache.commons.lang3.StringUtils;
|
|
|
import org.redisson.api.RBucket;
|
|
|
import org.redisson.api.RedissonClient;
|
|
|
import org.slf4j.Logger;
|
|
@@ -29,7 +28,6 @@ import org.springframework.util.DigestUtils;
|
|
|
import com.alibaba.fastjson.JSON;
|
|
|
import com.alibaba.fastjson.JSONObject;
|
|
|
import com.ym.mec.biz.dal.entity.StudentPaymentOrder;
|
|
|
-import com.ym.mec.biz.dal.entity.StudentPaymentRouteOrder;
|
|
|
import com.ym.mec.biz.dal.entity.TenantConfig;
|
|
|
import com.ym.mec.biz.dal.entity.TenantOrderRecord;
|
|
|
import com.ym.mec.biz.dal.entity.TenantPaymentOrder;
|
|
@@ -58,7 +56,6 @@ public class OrderPayOpsServiceImpl implements OrderPayOpsService {
|
|
|
|
|
|
@Autowired
|
|
|
private StudentPaymentOrderService studentPaymentOrderService;
|
|
|
-
|
|
|
@Autowired
|
|
|
private TenantPaymentOrderService tenantPaymentOrderService;
|
|
|
@Autowired
|
|
@@ -71,6 +68,20 @@ public class OrderPayOpsServiceImpl implements OrderPayOpsService {
|
|
|
@Autowired
|
|
|
private TenantConfigService tenantConfigService;
|
|
|
|
|
|
+ //支付类型
|
|
|
+ private static final Map<String, Function<PaymentParam, Map<String, Object>>> checkOrderType = new HashMap<>();
|
|
|
+
|
|
|
+ {
|
|
|
+ //开通缴费/续费
|
|
|
+ checkOrderType.put("tenant", this::openOrRenew);
|
|
|
+ //云教练支付
|
|
|
+ checkOrderType.put("cloudTeacherOrder", this::cloudTeacherOrder);
|
|
|
+ //机构充值
|
|
|
+ checkOrderType.put("tenantRecharge", this::tenantRecharge);
|
|
|
+ //teacher
|
|
|
+ checkOrderType.put("teacher", this::teacher);
|
|
|
+ }
|
|
|
+
|
|
|
@Override
|
|
|
public Map<String, Object> executePayment(BigDecimal amount, String orderNo, String payChannel, String returnUrl, String orderSubject, String orderBody, String sign, String code, String platform) throws Exception {
|
|
|
PaymentParam payParam = new PaymentParam(amount, orderNo, payChannel, returnUrl,
|
|
@@ -84,69 +95,11 @@ public class OrderPayOpsServiceImpl implements OrderPayOpsService {
|
|
|
|
|
|
Map<String, Object> payment = new HashMap<>();
|
|
|
if (platform != null) {
|
|
|
- if (WrapperUtil.checkStr(platform,"tenant")) {
|
|
|
- //机构开通、续费付款
|
|
|
- TenantOrderRecord tenantOrderRecord = tenantOrderRecordService.getOne(new WrapperUtil<TenantOrderRecord>()
|
|
|
- .hasEq("order_no_", payParam.getOrderNo()).queryWrapper());
|
|
|
- payParam.setTenantId(tenantOrderRecord.getTenantId());
|
|
|
- payment = checkOrderAndGetParam(payParam,
|
|
|
- tenantOrderRecord,
|
|
|
- TenantOrderRecord::getEnumOrderState,
|
|
|
- TenantOrderRecord::getCreatedTime,
|
|
|
- tenantOrderRecord::setTransNo,
|
|
|
- tenantOrderRecordService::updateById
|
|
|
- );
|
|
|
- //机构开通付款 主动延迟检查订单
|
|
|
- delayCheckTenant();
|
|
|
- } else if (platform.equals("cloudTeacherOrder")) {
|
|
|
- // 云教练支付
|
|
|
- TenantOrderRecord tenantOrderRecord = tenantOrderRecordService.getOne(new WrapperUtil<TenantOrderRecord>()
|
|
|
- .hasEq("order_no_", payParam.getOrderNo()).queryWrapper());
|
|
|
- if (tenantOrderRecord.getOrderState() == 1) {
|
|
|
- throw new Exception("订单已支付, 订单号:" + payParam.getOrderNo());
|
|
|
- }
|
|
|
- payParam.setTenantId(tenantOrderRecord.getTenantId());
|
|
|
- payment = checkOrderAndGetParam(payParam,
|
|
|
- tenantOrderRecord,
|
|
|
- TenantOrderRecord::getEnumOrderState,
|
|
|
- TenantOrderRecord::getCreatedTime,
|
|
|
- tenantOrderRecord::setTransNo,
|
|
|
- tenantOrderRecordService::updateById
|
|
|
- );
|
|
|
- // 云教练支付 主动延迟检查订单
|
|
|
- log.info("executePayment delayCheckCloudTeacherOrder >>>>> ");
|
|
|
- delayCheckCloudTeacherOrder(tenantOrderRecord);
|
|
|
- } else if (platform.equals("tenantRecharge")) {
|
|
|
- // 机构充值
|
|
|
- TenantOrderRecord tenantOrderRecord = tenantOrderRecordService.getOne(new WrapperUtil<TenantOrderRecord>()
|
|
|
- .hasEq("order_no_", payParam.getOrderNo()).queryWrapper());
|
|
|
- if (tenantOrderRecord.getOrderState() == 1) {
|
|
|
- throw new Exception("订单已支付, 订单号:" + payParam.getOrderNo());
|
|
|
- }
|
|
|
- payParam.setTenantId(tenantOrderRecord.getTenantId());
|
|
|
- payment = checkOrderAndGetParam(payParam,
|
|
|
- tenantOrderRecord,
|
|
|
- TenantOrderRecord::getEnumOrderState,
|
|
|
- TenantOrderRecord::getCreatedTime,
|
|
|
- tenantOrderRecord::setTransNo,
|
|
|
- tenantOrderRecordService::updateById
|
|
|
- );
|
|
|
- //主动延迟检查订单
|
|
|
- log.info("executePayment delayCheckTenantRecharge >>>>> ");
|
|
|
- delayCheckTenantRecharge(tenantOrderRecord);
|
|
|
- } else if (platform.equals("teacher")) {
|
|
|
- TenantPaymentOrder tenantPaymentOrder = tenantPaymentOrderService.queryByOrderNo(payParam.getOrderNo());
|
|
|
- payParam.setTenantId(1);
|
|
|
- payment = checkOrderAndGetParam(payParam,
|
|
|
- tenantPaymentOrder,
|
|
|
- TenantPaymentOrder::getStatus,
|
|
|
- TenantPaymentOrder::getCreateTime,
|
|
|
- tenantPaymentOrder::setTransNo,
|
|
|
- tenantPaymentOrderService::update
|
|
|
- );
|
|
|
- } else {
|
|
|
+ //根据传入platform 来判断执行哪个操作
|
|
|
+ Function<PaymentParam, Map<String, Object>> function = checkOrderType.get(platform);
|
|
|
+ //如果以上操作都没有 则应该是这一个,因为老代码就是这样写的。
|
|
|
+ if (Objects.isNull(function)) {
|
|
|
StudentPaymentOrder studentPaymentOrder = studentPaymentOrderService.findOrderByOrderNo(payParam.getOrderNo());
|
|
|
- payParam.setTenantId(studentPaymentOrder.getTenantId());
|
|
|
payment = checkOrderAndGetParam(payParam,
|
|
|
studentPaymentOrder,
|
|
|
StudentPaymentOrder::getStatus,
|
|
@@ -154,16 +107,92 @@ public class OrderPayOpsServiceImpl implements OrderPayOpsService {
|
|
|
studentPaymentOrder::setTransNo,
|
|
|
studentPaymentOrderService::update
|
|
|
);
|
|
|
+ } else {
|
|
|
+ payment = function.apply(payParam);
|
|
|
}
|
|
|
}
|
|
|
+ return payment;
|
|
|
+ }
|
|
|
+
|
|
|
+ //teacher
|
|
|
+ private Map<String, Object> teacher(PaymentParam payParam) {
|
|
|
+ Map<String, Object> payment;
|
|
|
+ TenantPaymentOrder tenantPaymentOrder = tenantPaymentOrderService.queryByOrderNo(payParam.getOrderNo());
|
|
|
+ payParam.setTenantId(1);
|
|
|
+ try {
|
|
|
+ payment = checkOrderAndGetParam(payParam,
|
|
|
+ tenantPaymentOrder,
|
|
|
+ TenantPaymentOrder::getStatus,
|
|
|
+ TenantPaymentOrder::getCreateTime,
|
|
|
+ tenantPaymentOrder::setTransNo,
|
|
|
+ tenantPaymentOrderService::update
|
|
|
+ );
|
|
|
+ } catch (Exception e) {
|
|
|
+ throw new BizException(e.getMessage());
|
|
|
+ }
|
|
|
+ return payment;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 机构充值
|
|
|
+ private Map<String, Object> tenantRecharge(PaymentParam payParam) {
|
|
|
+ Map<String, Object> payment;
|
|
|
+ TenantOrderRecord tenantOrderRecord = getTenantOrderRecord(payParam.getOrderNo());
|
|
|
+ payParam.setTenantId(tenantOrderRecord.getTenantId());
|
|
|
+ payment = checkOrderGetPayment(payParam, tenantOrderRecord);
|
|
|
+ //主动延迟检查订单
|
|
|
+ log.info("executePayment delayCheckTenantRecharge >>>>> ");
|
|
|
+ delayCheckTenantRecharge(tenantOrderRecord);
|
|
|
+ return payment;
|
|
|
+ }
|
|
|
|
|
|
+ // 云教练支付
|
|
|
+ private Map<String, Object> cloudTeacherOrder(PaymentParam payParam) {
|
|
|
+ TenantOrderRecord tenantOrderRecord = getTenantOrderRecord(payParam.getOrderNo());
|
|
|
+ payParam.setTenantId(tenantOrderRecord.getTenantId());
|
|
|
+ Map<String, Object> payment = checkOrderGetPayment(payParam, tenantOrderRecord);
|
|
|
+ // 云教练支付 主动延迟检查订单
|
|
|
+ log.info("executePayment delayCheckCloudTeacherOrder >>>>> ");
|
|
|
+ delayCheckCloudTeacherOrder(tenantOrderRecord);
|
|
|
+ return payment;
|
|
|
+ }
|
|
|
+
|
|
|
+ //机构开通、续费付款
|
|
|
+ private Map<String, Object> openOrRenew(PaymentParam payParam) {
|
|
|
+ TenantOrderRecord tenantOrderRecord = getTenantOrderRecord(payParam.getOrderNo());
|
|
|
+ payParam.setTenantId(tenantOrderRecord.getTenantId());
|
|
|
+ Map<String, Object> payment = checkOrderGetPayment(payParam, tenantOrderRecord);
|
|
|
+ //主动延迟检查订单
|
|
|
+ delayCheckTenant();
|
|
|
+ return payment;
|
|
|
+ }
|
|
|
+
|
|
|
+ //查询订单
|
|
|
+ private TenantOrderRecord getTenantOrderRecord(String orderNo) {
|
|
|
+ return tenantOrderRecordService.getOne(new WrapperUtil<TenantOrderRecord>()
|
|
|
+ .hasEq("order_no_", orderNo).queryWrapper());
|
|
|
+ }
|
|
|
+
|
|
|
+ //获取支付数据
|
|
|
+ private Map<String, Object> checkOrderGetPayment(PaymentParam payParam, TenantOrderRecord tenantOrderRecord) {
|
|
|
+ Map<String, Object> payment;
|
|
|
+ try {
|
|
|
+ payment = checkOrderAndGetParam(payParam,
|
|
|
+ tenantOrderRecord,
|
|
|
+ TenantOrderRecord::getEnumOrderState,
|
|
|
+ TenantOrderRecord::getCreatedTime,
|
|
|
+ tenantOrderRecord::setTransNo,
|
|
|
+ tenantOrderRecordService::updateById
|
|
|
+ );
|
|
|
+ } catch (Exception e) {
|
|
|
+ throw new BizException(e.getMessage());
|
|
|
+ }
|
|
|
return payment;
|
|
|
}
|
|
|
|
|
|
private void checkSing(PaymentParam param) {
|
|
|
Map<String, Object> signParams = new LinkedHashMap<>();
|
|
|
signParams.put("appId", ConfigInit.appId);
|
|
|
- signParams.put("amount", param.getAmount().setScale(2, BigDecimal.ROUND_HALF_UP));
|
|
|
+ signParams.put("amount", param.getAmount().setScale(2, RoundingMode.HALF_UP));
|
|
|
signParams.put("orderNo", param.getOrderNo());
|
|
|
signParams.put("orderSubject", param.getOrderSubject());
|
|
|
signParams.put("orderBody", param.getOrderBody());
|
|
@@ -182,7 +211,9 @@ public class OrderPayOpsServiceImpl implements OrderPayOpsService {
|
|
|
if (Objects.isNull(clazz)) {
|
|
|
throw new BizException("订单不存在");
|
|
|
}
|
|
|
+ //校验订单状态
|
|
|
checkOrderState(clazz, enumFunc);
|
|
|
+ //获取订单创建时间
|
|
|
Date createTime = dateFunc.apply(clazz);
|
|
|
//校验订单是否超时
|
|
|
String timeExpire = checkOrderTimeOut(createTime);
|
|
@@ -190,7 +221,7 @@ public class OrderPayOpsServiceImpl implements OrderPayOpsService {
|
|
|
Map<String, Object> paymentParams = getPaymentParam(payParam);
|
|
|
paymentParams.put("time_expire", timeExpire);
|
|
|
paymentParams.put("expend", getExpend(payParam));
|
|
|
- //获取第三方的支付的信息
|
|
|
+ //向第三方发起支付,获取第三方的支付的信息
|
|
|
Map<String, Object> payment = Payment.executePayment(paymentParams);
|
|
|
log.info("executePayment create order param >>>>> {}", JSON.toJSONString(payment));
|
|
|
String transNo = (String) payment.get("id");
|
|
@@ -221,15 +252,8 @@ public class OrderPayOpsServiceImpl implements OrderPayOpsService {
|
|
|
}
|
|
|
|
|
|
private <T> void setTransNoByApply(String TransNo, T clazz, Consumer<String> setOption, Consumer<T> action) {
|
|
|
- Optional.ofNullable(clazz)
|
|
|
- .filter(c -> Objects.nonNull(setOption))
|
|
|
- .filter(c -> Objects.nonNull(action))
|
|
|
- .filter(c -> StringUtils.isNotBlank(TransNo))
|
|
|
- .map(c -> {
|
|
|
- setOption.accept(TransNo);
|
|
|
- return c;
|
|
|
- })
|
|
|
- .ifPresent(action);
|
|
|
+ setOption.accept(TransNo);
|
|
|
+ action.accept(clazz);
|
|
|
}
|
|
|
|
|
|
private Map<String, Object> getExpend(PaymentParam payParam) throws Exception {
|
|
@@ -268,8 +292,8 @@ public class OrderPayOpsServiceImpl implements OrderPayOpsService {
|
|
|
paymentParams.put("pay_amt", payParam.getAmount().setScale(2, BigDecimal.ROUND_HALF_UP));
|
|
|
paymentParams.put("goods_title", payParam.getOrderSubject());
|
|
|
paymentParams.put("goods_desc", payParam.getOrderBody());
|
|
|
-
|
|
|
- if (payParam.getTenantId() == 1) {
|
|
|
+
|
|
|
+ if (payParam.getTenantId() == 1) {
|
|
|
// 延时分账
|
|
|
paymentParams.put("pay_mode", "delay");
|
|
|
} else {
|
|
@@ -300,6 +324,7 @@ public class OrderPayOpsServiceImpl implements OrderPayOpsService {
|
|
|
|
|
|
//手续费收取模式:O-商户手续费账户扣取手续费,I-交易金额中扣取手续费;值为空时,默认值为I;若为O时,分账对象列表中不支持传入手续费承担方
|
|
|
paymentParams.put("fee_mode", "I");
|
|
|
+
|
|
|
return paymentParams;
|
|
|
}
|
|
|
|
|
@@ -317,6 +342,7 @@ public class OrderPayOpsServiceImpl implements OrderPayOpsService {
|
|
|
tenantOrderRecordService.checkTenantOrder();
|
|
|
log.info("delayCheckTenant >>>>> start {}", i);
|
|
|
} catch (InterruptedException e) {
|
|
|
+ log.error("delayCheckTenant >>>>", e.getCause());
|
|
|
return;
|
|
|
}
|
|
|
}
|
|
@@ -341,7 +367,7 @@ public class OrderPayOpsServiceImpl implements OrderPayOpsService {
|
|
|
Thread.sleep(3000);//每3秒触发一次
|
|
|
log.info("云教练 支付 重试>>>>> start {}", i);
|
|
|
} catch (Exception e) {
|
|
|
- log.info("云教练 支付 异常 ", e.toString());
|
|
|
+ log.info("云教练 支付 异常 : {}", e.toString());
|
|
|
e.printStackTrace();
|
|
|
}
|
|
|
}
|
|
@@ -388,7 +414,6 @@ public class OrderPayOpsServiceImpl implements OrderPayOpsService {
|
|
|
private String code;
|
|
|
private String platform;
|
|
|
private Integer tenantId;
|
|
|
-
|
|
|
|
|
|
PaymentParam(BigDecimal amount, String orderNo, String payChannel, String returnUrl, String orderSubject,
|
|
|
String orderBody, String sign, String code, String platform) {
|
|
@@ -485,3 +510,4 @@ public class OrderPayOpsServiceImpl implements OrderPayOpsService {
|
|
|
}
|
|
|
|
|
|
}
|
|
|
+
|