浏览代码

余额支付

xiongzhu 4 年之前
父节点
当前提交
6bf74f3a5d

+ 10 - 3
src/main/java/com/izouma/nineth/aspect/RedisLockAspect.java

@@ -1,6 +1,7 @@
 package com.izouma.nineth.aspect;
 package com.izouma.nineth.aspect;
 
 
 import com.izouma.nineth.annotations.RedisLock;
 import com.izouma.nineth.annotations.RedisLock;
+import com.izouma.nineth.exception.BusinessException;
 import lombok.extern.slf4j.Slf4j;
 import lombok.extern.slf4j.Slf4j;
 import org.aspectj.lang.ProceedingJoinPoint;
 import org.aspectj.lang.ProceedingJoinPoint;
 import org.aspectj.lang.annotation.Around;
 import org.aspectj.lang.annotation.Around;
@@ -35,7 +36,7 @@ public class RedisLockAspect {
     }
     }
 
 
     @Around(value = "redisLockPointCut() && @annotation(redisLock)")
     @Around(value = "redisLockPointCut() && @annotation(redisLock)")
-    public void redisLock(ProceedingJoinPoint joinPoint, RedisLock redisLock) {
+    public Object redisLock(ProceedingJoinPoint joinPoint, RedisLock redisLock) {
         ExpressionParser parser = new SpelExpressionParser();
         ExpressionParser parser = new SpelExpressionParser();
         EvaluationContext context = new StandardEvaluationContext(joinPoint.getSignature());
         EvaluationContext context = new StandardEvaluationContext(joinPoint.getSignature());
         MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature();
         MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature();
@@ -55,13 +56,19 @@ public class RedisLockAspect {
         BoundValueOperations<String, Object> ops = redisTemplate.boundValueOps(key);
         BoundValueOperations<String, Object> ops = redisTemplate.boundValueOps(key);
         Boolean success = ops.setIfAbsent(1, redisLock.expire(), redisLock.unit());
         Boolean success = ops.setIfAbsent(1, redisLock.expire(), redisLock.unit());
         if (Boolean.TRUE.equals(success)) {
         if (Boolean.TRUE.equals(success)) {
+            Object res = null;
             try {
             try {
-                joinPoint.proceed();
+                res = joinPoint.proceed();
             } catch (Throwable e) {
             } catch (Throwable e) {
-                e.printStackTrace();
+                redisTemplate.delete(key);
+                throw new RuntimeException(e);
             }
             }
             redisTemplate.delete(key);
             redisTemplate.delete(key);
+            return res;
+        } else {
+            log.info("redis locked, key:{}", key);
         }
         }
+        throw new BusinessException("发生错误,请稍后再试");
     }
     }
 
 
 }
 }

+ 5 - 0
src/main/java/com/izouma/nineth/domain/BalanceRecord.java

@@ -1,6 +1,7 @@
 package com.izouma.nineth.domain;
 package com.izouma.nineth.domain;
 
 
 import com.izouma.nineth.enums.BalanceType;
 import com.izouma.nineth.enums.BalanceType;
+import com.izouma.nineth.enums.PayMethod;
 import lombok.AllArgsConstructor;
 import lombok.AllArgsConstructor;
 import lombok.Builder;
 import lombok.Builder;
 import lombok.Data;
 import lombok.Data;
@@ -45,4 +46,8 @@ public class BalanceRecord extends BaseEntity {
 
 
     private String extra;
     private String extra;
 
 
+    @Enumerated(EnumType.STRING)
+    @Column(length = 20)
+    private PayMethod payMethod;
+
 }
 }

+ 37 - 0
src/main/java/com/izouma/nineth/domain/RechargeOrder.java

@@ -0,0 +1,37 @@
+package com.izouma.nineth.domain;
+
+import com.izouma.nineth.enums.OrderStatus;
+import com.izouma.nineth.enums.PayMethod;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import javax.persistence.*;
+import java.math.BigDecimal;
+
+@Data
+@Entity
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+public class RechargeOrder extends BaseEntityNoID {
+
+    @Id
+    private Long id;
+
+    private Long userId;
+
+    @Column(precision = 10, scale = 2)
+    private BigDecimal amount;
+
+    @Enumerated(EnumType.STRING)
+    @Column(length = 20)
+    private PayMethod payMethod;
+
+    private String transactionId;
+
+    @Enumerated(EnumType.STRING)
+    @Column(length = 20)
+    private OrderStatus status;
+}

+ 2 - 0
src/main/java/com/izouma/nineth/domain/UserBalance.java

@@ -4,6 +4,7 @@ import lombok.AllArgsConstructor;
 import lombok.Builder;
 import lombok.Builder;
 import lombok.Data;
 import lombok.Data;
 import lombok.NoArgsConstructor;
 import lombok.NoArgsConstructor;
+import org.hibernate.annotations.DynamicUpdate;
 
 
 import javax.persistence.Column;
 import javax.persistence.Column;
 import javax.persistence.Entity;
 import javax.persistence.Entity;
@@ -16,6 +17,7 @@ import java.time.LocalDateTime;
 @AllArgsConstructor
 @AllArgsConstructor
 @NoArgsConstructor
 @NoArgsConstructor
 @Builder
 @Builder
+@DynamicUpdate
 public class UserBalance {
 public class UserBalance {
 
 
     @Id
     @Id

+ 4 - 1
src/main/java/com/izouma/nineth/enums/BalanceType.java

@@ -4,7 +4,10 @@ public enum BalanceType {
 
 
     WITHDRAW("提现"),
     WITHDRAW("提现"),
     SELL("藏品出售"),
     SELL("藏品出售"),
-    RETURN("失败退回");
+    RETURN("失败退回"),
+    PAY("支付"),
+    RECHARGE("充值"),
+    ;
 
 
     private final String description;
     private final String description;
 
 

+ 5 - 1
src/main/java/com/izouma/nineth/enums/PayMethod.java

@@ -3,7 +3,11 @@ package com.izouma.nineth.enums;
 public enum PayMethod {
 public enum PayMethod {
     WEIXIN("微信"),
     WEIXIN("微信"),
     ALIPAY("支付宝"),
     ALIPAY("支付宝"),
-    FREE("无GAS费");
+    FREE("无GAS费"),
+    SANDPAY("衫德支付"),
+    HMPAY("河马支付"),
+    PAYEASE("首信易"),
+    BALANCE("余额支付");
 
 
     private final String description;
     private final String description;
 
 

+ 7 - 0
src/main/java/com/izouma/nineth/repo/RechargeOrderRepo.java

@@ -0,0 +1,7 @@
+package com.izouma.nineth.repo;
+
+import com.izouma.nineth.domain.RechargeOrder;
+import org.springframework.data.jpa.repository.JpaRepository;
+
+public interface RechargeOrderRepo extends JpaRepository<RechargeOrder, Long> {
+}

+ 2 - 0
src/main/java/com/izouma/nineth/repo/UserRepo.java

@@ -221,4 +221,6 @@ public interface UserRepo extends JpaRepository<User, Long>, JpaSpecificationExe
     @Query("update User set vipPurchase = ?2 where id = ?1")
     @Query("update User set vipPurchase = ?2 where id = ?1")
     void updateVipPurchase(Long id, int vipPurchase);
     void updateVipPurchase(Long id, int vipPurchase);
 
 
+    @Query("select u.tradeCode from User u where u.id = ?1")
+    String findTradeCode(Long id);
 }
 }

+ 95 - 12
src/main/java/com/izouma/nineth/service/OrderPayService.java

@@ -2,22 +2,24 @@ package com.izouma.nineth.service;
 
 
 import com.alibaba.fastjson.JSONObject;
 import com.alibaba.fastjson.JSONObject;
 import com.izouma.nineth.config.GeneralProperties;
 import com.izouma.nineth.config.GeneralProperties;
-import com.izouma.nineth.domain.GiftOrder;
-import com.izouma.nineth.domain.MintOrder;
-import com.izouma.nineth.domain.Order;
+import com.izouma.nineth.domain.*;
 import com.izouma.nineth.enums.MintOrderStatus;
 import com.izouma.nineth.enums.MintOrderStatus;
 import com.izouma.nineth.enums.OrderStatus;
 import com.izouma.nineth.enums.OrderStatus;
+import com.izouma.nineth.enums.PayMethod;
+import com.izouma.nineth.event.OrderNotifyEvent;
 import com.izouma.nineth.exception.BusinessException;
 import com.izouma.nineth.exception.BusinessException;
-import com.izouma.nineth.repo.GiftOrderRepo;
-import com.izouma.nineth.repo.MintOrderRepo;
-import com.izouma.nineth.repo.OrderRepo;
+import com.izouma.nineth.repo.*;
 import com.izouma.nineth.utils.DateTimeUtils;
 import com.izouma.nineth.utils.DateTimeUtils;
+import com.izouma.nineth.utils.SnowflakeIdWorker;
 import lombok.AllArgsConstructor;
 import lombok.AllArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.rocketmq.spring.core.RocketMQTemplate;
 import org.springframework.cache.annotation.Cacheable;
 import org.springframework.cache.annotation.Cacheable;
 import org.springframework.stereotype.Service;
 import org.springframework.stereotype.Service;
 
 
+import java.math.BigDecimal;
 import java.time.LocalDateTime;
 import java.time.LocalDateTime;
+import java.util.Objects;
 import java.util.Optional;
 import java.util.Optional;
 
 
 @Service
 @Service
@@ -26,12 +28,20 @@ import java.util.Optional;
 public class OrderPayService {
 public class OrderPayService {
     private static String PAY_CHANNEL = "sandPay";
     private static String PAY_CHANNEL = "sandPay";
 
 
-    private final OrderRepo         orderRepo;
-    private final MintOrderRepo     mintOrderRepo;
-    private final GiftOrderRepo     giftOrderRepo;
-    private final SandPayService    sandPayService;
-    private final HMPayService      hmPayService;
-    private final GeneralProperties generalProperties;
+    private final OrderRepo          orderRepo;
+    private final MintOrderRepo      mintOrderRepo;
+    private final GiftOrderRepo      giftOrderRepo;
+    private final SandPayService     sandPayService;
+    private final HMPayService       hmPayService;
+    private final GeneralProperties  generalProperties;
+    private final UserBalanceService userBalanceService;
+    private final RocketMQTemplate   rocketMQTemplate;
+    private final GiftOrderService   giftOrderService;
+    private final MintOrderService   mintOrderService;
+    private final UserRepo           userRepo;
+    private final SnowflakeIdWorker  snowflakeIdWorker;
+    private final RechargeOrderRepo  rechargeOrderRepo;
+    private final SysConfigService   sysConfigService;
 
 
     public static void setPayChannel(String payChannel) {
     public static void setPayChannel(String payChannel) {
         if ("hmPay".equals(payChannel) || "sandPay".equals(payChannel)) {
         if ("hmPay".equals(payChannel) || "sandPay".equals(payChannel)) {
@@ -58,6 +68,22 @@ public class OrderPayService {
         throw new BusinessException("绿洲宇宙冷却系统已启动,请稍后支付");
         throw new BusinessException("绿洲宇宙冷却系统已启动,请稍后支付");
     }
     }
 
 
+    public void payOrderBalance(Long orderId, Long userId, String tradeCode) {
+        Order order = orderRepo.findById(orderId).orElseThrow(new BusinessException("订单不存在"));
+        if (order.getStatus() != OrderStatus.NOT_PAID) {
+            throw new BusinessException("订单状态错误");
+        }
+        if (!Objects.equals(order.getUserId(), userId)) {
+            throw new BusinessException("订单不属于该用户");
+        }
+        if (!Objects.equals(userRepo.findTradeCode(userId), tradeCode)) {
+            throw new BusinessException("交易码错误");
+        }
+        BalanceRecord record = userBalanceService.balancePay(order.getUserId(), order.getTotalPrice(), orderId, order.getName());
+        rocketMQTemplate.syncSend(generalProperties.getOrderNotifyTopic(),
+                new OrderNotifyEvent(orderId, PayMethod.BALANCE, record.getId().toString(), System.currentTimeMillis()));
+    }
+
     @Cacheable(value = "payOrder", key = "'gift#'+#orderId")
     @Cacheable(value = "payOrder", key = "'gift#'+#orderId")
     public String payGiftOrder(Long orderId) {
     public String payGiftOrder(Long orderId) {
         GiftOrder order = giftOrderRepo.findById(orderId).orElseThrow(new BusinessException("订单不存在"));
         GiftOrder order = giftOrderRepo.findById(orderId).orElseThrow(new BusinessException("订单不存在"));
@@ -79,6 +105,21 @@ public class OrderPayService {
         throw new BusinessException("绿洲宇宙冷却系统已启动,请稍后支付");
         throw new BusinessException("绿洲宇宙冷却系统已启动,请稍后支付");
     }
     }
 
 
+    public void payGiftBalance(Long orderId, Long userId, String tradeCode) {
+        GiftOrder order = giftOrderRepo.findById(orderId).orElseThrow(new BusinessException("订单不存在"));
+        if (order.getStatus() != OrderStatus.NOT_PAID) {
+            throw new BusinessException("订单状态错误");
+        }
+        if (!Objects.equals(order.getUserId(), userId)) {
+            throw new BusinessException("订单不属于该用户");
+        }
+        if (!Objects.equals(userRepo.findTradeCode(userId), tradeCode)) {
+            throw new BusinessException("交易码错误");
+        }
+        BalanceRecord record = userBalanceService.balancePay(order.getUserId(), order.getGasPrice(), orderId, "转赠");
+        giftOrderService.giftNotify(orderId, PayMethod.BALANCE, record.getId().toString());
+    }
+
     @Cacheable(value = "payOrder", key = "'mintOrder#'+#orderId")
     @Cacheable(value = "payOrder", key = "'mintOrder#'+#orderId")
     public String payMintOrder(Long orderId) {
     public String payMintOrder(Long orderId) {
         MintOrder order = mintOrderRepo.findById(orderId).orElseThrow(new BusinessException("订单不存在"));
         MintOrder order = mintOrderRepo.findById(orderId).orElseThrow(new BusinessException("订单不存在"));
@@ -99,4 +140,46 @@ public class OrderPayService {
         }
         }
         throw new BusinessException("绿洲宇宙冷却系统已启动,请稍后支付");
         throw new BusinessException("绿洲宇宙冷却系统已启动,请稍后支付");
     }
     }
+
+    public void payMintOrderBalance(Long orderId, Long userId, String tradeCode) {
+        MintOrder order = mintOrderRepo.findById(orderId).orElseThrow(new BusinessException("订单不存在"));
+        if (order.getStatus() != MintOrderStatus.NOT_PAID) {
+            throw new BusinessException("订单状态错误");
+        }
+        if (!Objects.equals(order.getUserId(), userId)) {
+            throw new BusinessException("订单不属于该用户");
+        }
+        if (!Objects.equals(userRepo.findTradeCode(userId), tradeCode)) {
+            throw new BusinessException("交易码错误");
+        }
+        BalanceRecord record = userBalanceService.balancePay(order.getUserId(), order.getGasPrice(), orderId, "铸造活动");
+        giftOrderService.giftNotify(orderId, PayMethod.BALANCE, record.getId().toString());
+    }
+
+    public String recharge(Long userId, BigDecimal amount) {
+        BigDecimal minAmount = sysConfigService.getBigDecimal("min_recharge_amount");
+        if (amount.compareTo(minAmount) < 0) {
+            throw new BusinessException("充值金额不能小于" + minAmount);
+        }
+        RechargeOrder order = RechargeOrder.builder()
+                .id(snowflakeIdWorker.nextId())
+                .userId(userId)
+                .amount(amount)
+                .status(OrderStatus.NOT_PAID)
+                .build();
+        rechargeOrderRepo.save(order);
+        switch (PAY_CHANNEL) {
+            case "sandPay":
+                return sandPayService.requestAlipay(order.getId() + "", order.getAmount(),
+                        "余额充值", "余额充值",
+                        SandPayService.getTimeout(order.getCreatedAt(), 180),
+                        "{\"type\":\"recharge\",\"id\":\"" + order.getId() + "\"}");
+            case "hmPay":
+                return hmPayService.requestAlipay(order.getId() + "", order.getAmount(),
+                        "余额充值",
+                        HMPayService.getTimeout(order.getCreatedAt(), 180),
+                        "recharge", generalProperties.getHost() + "/9th/home");
+        }
+        throw new BusinessException("绿洲宇宙冷却系统已启动,请稍后支付");
+    }
 }
 }

+ 8 - 0
src/main/java/com/izouma/nineth/service/SysConfigService.java

@@ -123,6 +123,14 @@ public class SysConfigService {
                     .value("20")
                     .value("20")
                     .build());
                     .build());
         }
         }
+        if (sysConfigRepo.findByName("min_recharge_amount").isEmpty()) {
+            sysConfigRepo.save(SysConfig.builder()
+                    .name("min_recharge_amount")
+                    .desc("最小充值金额")
+                    .type(SysConfig.ValueType.NUMBER)
+                    .value("100")
+                    .build());
+        }
         SearchMode searchMode = SearchMode.valueOf(sysConfigRepo.findByName("default_search_mode").get().getValue());
         SearchMode searchMode = SearchMode.valueOf(sysConfigRepo.findByName("default_search_mode").get().getValue());
         JpaUtils.setDefaultSearchMode(searchMode);
         JpaUtils.setDefaultSearchMode(searchMode);
 
 

+ 60 - 0
src/main/java/com/izouma/nineth/service/UserBalanceService.java

@@ -3,6 +3,7 @@ package com.izouma.nineth.service;
 import cn.hutool.core.util.ZipUtil;
 import cn.hutool.core.util.ZipUtil;
 import com.alibaba.excel.EasyExcel;
 import com.alibaba.excel.EasyExcel;
 import com.alibaba.fastjson.JSONObject;
 import com.alibaba.fastjson.JSONObject;
+import com.izouma.nineth.annotations.RedisLock;
 import com.izouma.nineth.domain.*;
 import com.izouma.nineth.domain.*;
 import com.izouma.nineth.dto.SandPaySettle;
 import com.izouma.nineth.dto.SandPaySettle;
 import com.izouma.nineth.dto.UserBankCard;
 import com.izouma.nineth.dto.UserBankCard;
@@ -10,6 +11,7 @@ import com.izouma.nineth.dto.UserWithdraw;
 import com.izouma.nineth.enums.BalanceType;
 import com.izouma.nineth.enums.BalanceType;
 import com.izouma.nineth.enums.CollectionSource;
 import com.izouma.nineth.enums.CollectionSource;
 import com.izouma.nineth.enums.OrderStatus;
 import com.izouma.nineth.enums.OrderStatus;
+import com.izouma.nineth.enums.PayMethod;
 import com.izouma.nineth.exception.BusinessException;
 import com.izouma.nineth.exception.BusinessException;
 import com.izouma.nineth.repo.*;
 import com.izouma.nineth.repo.*;
 import com.izouma.nineth.service.storage.StorageService;
 import com.izouma.nineth.service.storage.StorageService;
@@ -61,6 +63,7 @@ public class UserBalanceService {
     private final SnowflakeIdWorker             snowflakeIdWorker;
     private final SnowflakeIdWorker             snowflakeIdWorker;
     private final SandPayService                sandPayService;
     private final SandPayService                sandPayService;
     private final RedisTemplate<String, Object> redisTemplate;
     private final RedisTemplate<String, Object> redisTemplate;
+    private final RechargeOrderRepo             rechargeOrderRepo;
 
 
     public void settle(LocalDate start, LocalDate end) {
     public void settle(LocalDate start, LocalDate end) {
         for (long i = 0; i <= ChronoUnit.DAYS.between(start, end); i++) {
         for (long i = 0; i <= ChronoUnit.DAYS.between(start, end); i++) {
@@ -404,4 +407,61 @@ public class UserBalanceService {
         }).get();
         }).get();
 
 
     }
     }
+
+    @RedisLock("#userId")
+    public BalanceRecord balancePay(Long userId, BigDecimal amount, Long orderId, String remark) {
+        UserBalance userBalance = userBalanceRepo.findById(userId).orElseThrow(new BusinessException("余额不足"));
+        if (userBalance.getBalance().compareTo(amount) < 0) {
+            throw new BusinessException("余额不足");
+        }
+        userBalance.setLastBalance(userBalance.getBalance());
+        userBalance.setBalance(userBalance.getBalance().subtract(amount));
+        userBalanceRepo.save(userBalance);
+
+        return balanceRecordRepo.save(BalanceRecord.builder()
+                .userId(userId)
+                .balance(userBalance.getBalance())
+                .lastBalance(userBalance.getLastBalance())
+                .type(BalanceType.PAY)
+                .amount(amount)
+                .time(LocalDateTime.now())
+                .orderId(orderId)
+                .remark(remark)
+                .build());
+    }
+
+    @RedisLock("#userId")
+    public void recharge(Long orderId, PayMethod payMethod, String transactionId) {
+        log.info("recharge  orderId={}, transactionId={}, payMethod={}",
+                orderId, transactionId, payMethod);
+        RechargeOrder rechargeOrder = rechargeOrderRepo.findById(orderId).orElseThrow(new BusinessException("充值订单不存在"));
+        Long userId = rechargeOrder.getUserId();
+        if (OrderStatus.NOT_PAID == rechargeOrder.getStatus()) {
+            BigDecimal amount = rechargeOrder.getAmount();
+            UserBalance userBalance = userBalanceRepo.findById(userId).orElse(UserBalance.builder()
+                    .userId(userId)
+                    .balance(BigDecimal.ZERO)
+                    .lastBalance(BigDecimal.ZERO)
+                    .build());
+            userBalance.setLastBalance(userBalance.getBalance());
+            userBalance.setBalance(userBalance.getBalance().add(amount));
+            userBalanceRepo.save(userBalance);
+
+            balanceRecordRepo.save(BalanceRecord.builder()
+                    .userId(userId)
+                    .balance(userBalance.getBalance())
+                    .lastBalance(userBalance.getLastBalance())
+                    .type(BalanceType.RECHARGE)
+                    .amount(amount)
+                    .time(LocalDateTime.now())
+                    .orderId(orderId)
+                    .payMethod(payMethod)
+                    .build());
+        } else if (OrderStatus.FINISH == rechargeOrder.getStatus()) {
+            log.info("recharge orderId={} has been finished", orderId);
+        } else {
+            throw new BusinessException("充值订单状态异常");
+        }
+
+    }
 }
 }

+ 12 - 7
src/main/java/com/izouma/nineth/web/HmPayController.java

@@ -27,13 +27,14 @@ import java.util.stream.Collectors;
 @Slf4j
 @Slf4j
 @AllArgsConstructor
 @AllArgsConstructor
 public class HmPayController extends BaseController {
 public class HmPayController extends BaseController {
-    private final HMPayService      hmPayService;
-    private final HmPayProperties   hmPayProperties;
-    private final RocketMQTemplate  rocketMQTemplate;
-    private final OrderService      orderService;
-    private final MintOrderService  mintOrderService;
-    private final GiftOrderService  giftOrderService;
-    private final GeneralProperties generalProperties;
+    private final HMPayService       hmPayService;
+    private final HmPayProperties    hmPayProperties;
+    private final RocketMQTemplate   rocketMQTemplate;
+    private final OrderService       orderService;
+    private final MintOrderService   mintOrderService;
+    private final GiftOrderService   giftOrderService;
+    private final GeneralProperties  generalProperties;
+    private final UserBalanceService userBalanceService;
 
 
     @GetMapping("/notify/{type}/{id}")
     @GetMapping("/notify/{type}/{id}")
     public String orderNotify(@PathVariable String type, @PathVariable Long id, HttpServletRequest req) throws AlipayApiException {
     public String orderNotify(@PathVariable String type, @PathVariable Long id, HttpServletRequest req) throws AlipayApiException {
@@ -63,6 +64,10 @@ public class HmPayController extends BaseController {
                     break;
                     break;
                 case "mintOrder":
                 case "mintOrder":
                     mintOrderService.mintNotify(id, PayMethod.ALIPAY, plat_trx_no);
                     mintOrderService.mintNotify(id, PayMethod.ALIPAY, plat_trx_no);
+                    break;
+                case "recharge":
+                    userBalanceService.recharge(id, PayMethod.ALIPAY, plat_trx_no);
+                    break;
             }
             }
         }
         }
         return "SUCCESS";
         return "SUCCESS";

+ 23 - 0
src/main/java/com/izouma/nineth/web/OrderPayControllerV2.java

@@ -10,6 +10,7 @@ import com.izouma.nineth.enums.OrderStatus;
 import com.izouma.nineth.exception.BusinessException;
 import com.izouma.nineth.exception.BusinessException;
 import com.izouma.nineth.repo.OrderRepo;
 import com.izouma.nineth.repo.OrderRepo;
 import com.izouma.nineth.service.*;
 import com.izouma.nineth.service.*;
+import com.izouma.nineth.utils.SecurityUtils;
 import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiOperation;
 import lombok.AllArgsConstructor;
 import lombok.AllArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import lombok.extern.slf4j.Slf4j;
@@ -22,6 +23,7 @@ import org.springframework.stereotype.Controller;
 import org.springframework.ui.Model;
 import org.springframework.ui.Model;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.bind.annotation.*;
 
 
+import java.math.BigDecimal;
 import java.util.regex.Pattern;
 import java.util.regex.Pattern;
 
 
 @Controller
 @Controller
@@ -51,6 +53,12 @@ public class OrderPayControllerV2 {
         return "AlipayHtml";
         return "AlipayHtml";
     }
     }
 
 
+    @RequestMapping(value = "/balance", method = RequestMethod.GET)
+    @ResponseBody
+    public void payOrderBalance(@RequestParam Long id, @RequestParam String tradeCode) {
+        orderPayService.payOrderBalance(id, SecurityUtils.getAuthenticatedUser().getId(), tradeCode);
+    }
+
     @ApiOperation("衫德h5快捷")
     @ApiOperation("衫德h5快捷")
     @RequestMapping(value = "/sandQuick", method = RequestMethod.GET, produces = "text/html")
     @RequestMapping(value = "/sandQuick", method = RequestMethod.GET, produces = "text/html")
     @ResponseBody
     @ResponseBody
@@ -72,6 +80,11 @@ public class OrderPayControllerV2 {
         return "AlipayHtml";
         return "AlipayHtml";
     }
     }
 
 
+    @RequestMapping(value = "/gift/balance", method = RequestMethod.GET)
+    public void payGiftOrderBalance(@RequestParam Long id, @RequestParam String tradeCode) {
+        orderPayService.payGiftBalance(id, SecurityUtils.getAuthenticatedUser().getId(), tradeCode);
+    }
+
     @RequestMapping(value = "/gift/sandQuick", method = RequestMethod.GET, produces = "text/html")
     @RequestMapping(value = "/gift/sandQuick", method = RequestMethod.GET, produces = "text/html")
     @ResponseBody
     @ResponseBody
     public String payGiftQuick(@RequestParam Long id) {
     public String payGiftQuick(@RequestParam Long id) {
@@ -97,4 +110,14 @@ public class OrderPayControllerV2 {
     public String payMintQuick(@RequestParam Long id) {
     public String payMintQuick(@RequestParam Long id) {
         return sandPayService.payMintQuick(id);
         return sandPayService.payMintQuick(id);
     }
     }
+
+    @RequestMapping(value = "mint/balance", method = RequestMethod.GET)
+    public void payMintOrderBalance(@RequestParam Long id, @RequestParam String tradeCode) {
+        orderPayService.payMintOrderBalance(id, SecurityUtils.getAuthenticatedUser().getId(), tradeCode);
+    }
+
+    @RequestMapping("/recharge")
+    public String recharge(@RequestParam BigDecimal amount) {
+        return orderPayService.recharge(SecurityUtils.getAuthenticatedUser().getId(), amount);
+    }
 }
 }

+ 12 - 6
src/main/java/com/izouma/nineth/web/SandPayController.java

@@ -10,6 +10,7 @@ import com.izouma.nineth.exception.BusinessException;
 import com.izouma.nineth.service.GiftOrderService;
 import com.izouma.nineth.service.GiftOrderService;
 import com.izouma.nineth.service.MintOrderService;
 import com.izouma.nineth.service.MintOrderService;
 import com.izouma.nineth.service.SandPayService;
 import com.izouma.nineth.service.SandPayService;
+import com.izouma.nineth.service.UserBalanceService;
 import com.izouma.nineth.utils.SnowflakeIdWorker;
 import com.izouma.nineth.utils.SnowflakeIdWorker;
 import lombok.AllArgsConstructor;
 import lombok.AllArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import lombok.extern.slf4j.Slf4j;
@@ -28,12 +29,13 @@ import java.nio.charset.StandardCharsets;
 @AllArgsConstructor
 @AllArgsConstructor
 public class SandPayController {
 public class SandPayController {
 
 
-    private SandPayService    sandPayService;
-    private SnowflakeIdWorker snowflakeIdWorker;
-    private GeneralProperties generalProperties;
-    private RocketMQTemplate  rocketMQTemplate;
-    private GiftOrderService  giftOrderService;
-    private MintOrderService  mintOrderService;
+    private SandPayService     sandPayService;
+    private SnowflakeIdWorker  snowflakeIdWorker;
+    private GeneralProperties  generalProperties;
+    private RocketMQTemplate   rocketMQTemplate;
+    private GiftOrderService   giftOrderService;
+    private MintOrderService   mintOrderService;
+    private UserBalanceService userBalanceService;
 
 
     @PostMapping("/notify")
     @PostMapping("/notify")
     public Object notifyOrder(HttpServletRequest req, HttpServletResponse resp) {
     public Object notifyOrder(HttpServletRequest req, HttpServletResponse resp) {
@@ -72,6 +74,10 @@ public class SandPayController {
                                 break;
                                 break;
                             case "mintOrder":
                             case "mintOrder":
                                 mintOrderService.mintNotify(id, PayMethod.ALIPAY, payOrderCode);
                                 mintOrderService.mintNotify(id, PayMethod.ALIPAY, payOrderCode);
+                                break;
+                            case "recharge":
+                                userBalanceService.recharge(id, PayMethod.SANDPAY, payOrderCode);
+                                break;
                         }
                         }
                     }
                     }
                     return "respCode=000000";
                     return "respCode=000000";