|
@@ -13,7 +13,6 @@ import com.ym.mec.thirdparty.adapay.ConfigInit;
|
|
|
import com.ym.mec.thirdparty.adapay.Payment;
|
|
|
import com.ym.mec.util.date.DateUtil;
|
|
|
import com.ym.mec.util.http.HttpUtil;
|
|
|
-import org.apache.commons.lang3.StringUtils;
|
|
|
import org.redisson.api.RBucket;
|
|
|
import org.redisson.api.RedissonClient;
|
|
|
import org.slf4j.Logger;
|
|
@@ -23,6 +22,7 @@ import org.springframework.stereotype.Service;
|
|
|
import org.springframework.util.DigestUtils;
|
|
|
|
|
|
import java.math.BigDecimal;
|
|
|
+import java.math.RoundingMode;
|
|
|
import java.text.SimpleDateFormat;
|
|
|
import java.util.*;
|
|
|
import java.util.concurrent.CompletableFuture;
|
|
@@ -50,6 +50,20 @@ public class OrderPayOpsServiceImpl implements OrderPayOpsService {
|
|
|
@Autowired
|
|
|
private CloudTeacherOrderService cloudTeacherOrderService;
|
|
|
|
|
|
+ //支付类型
|
|
|
+ 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,
|
|
@@ -63,63 +77,10 @@ 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());
|
|
|
- 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());
|
|
|
- }
|
|
|
- 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());
|
|
|
- }
|
|
|
- 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());
|
|
|
- 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());
|
|
|
payment = checkOrderAndGetParam(payParam,
|
|
|
studentPaymentOrder,
|
|
@@ -128,16 +89,88 @@ 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());
|
|
|
+ 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());
|
|
|
+ payment = checkOrderGetPayment(payParam, tenantOrderRecord);
|
|
|
+ //主动延迟检查订单
|
|
|
+ log.info("executePayment delayCheckTenantRecharge >>>>> ");
|
|
|
+ delayCheckTenantRecharge(tenantOrderRecord);
|
|
|
+ return payment;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 云教练支付
|
|
|
+ private Map<String, Object> cloudTeacherOrder(PaymentParam payParam) {
|
|
|
+ TenantOrderRecord tenantOrderRecord = getTenantOrderRecord(payParam.getOrderNo());
|
|
|
+ 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());
|
|
|
+ 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());
|
|
@@ -156,7 +189,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);
|
|
@@ -164,7 +199,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");
|
|
@@ -195,15 +230,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 {
|
|
@@ -260,6 +288,7 @@ public class OrderPayOpsServiceImpl implements OrderPayOpsService {
|
|
|
tenantOrderRecordService.checkTenantOrder();
|
|
|
log.info("delayCheckTenant >>>>> start {}", i);
|
|
|
} catch (InterruptedException e) {
|
|
|
+ log.error("delayCheckTenant >>>>", e.getCause());
|
|
|
return;
|
|
|
}
|
|
|
}
|
|
@@ -284,7 +313,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();
|
|
|
}
|
|
|
}
|