| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798 |
- package com.izouma.yags.service;
- import com.izouma.yags.config.Constants;
- import com.izouma.yags.config.GeneralProperties;
- import com.izouma.yags.domain.JumpForm;
- import com.izouma.yags.domain.TicketOrder;
- import com.izouma.yags.domain.UserBalance;
- import com.izouma.yags.enums.BalanceType;
- import com.izouma.yags.enums.OrderStatus;
- import com.izouma.yags.enums.PayMethod;
- import com.izouma.yags.exception.BusinessException;
- import com.izouma.yags.repo.JumpFormRepo;
- import com.izouma.yags.repo.TicketOrderRepo;
- import com.izouma.yags.repo.UserBalanceRepo;
- import com.izouma.yags.repo.UserTicketRepo;
- import org.springframework.context.annotation.Lazy;
- import org.springframework.stereotype.Service;
- import org.springframework.web.context.request.RequestContextHolder;
- import org.springframework.web.context.request.ServletRequestAttributes;
- import java.math.BigDecimal;
- import java.net.URLEncoder;
- import java.nio.charset.StandardCharsets;
- import java.time.LocalDateTime;
- @Service
- public class OrderPayService {
- private final TicketOrderRepo ticketOrderRepo;
- private final ReportService.AlipayService alipayService;
- private final UserBalanceService userBalanceService;
- private final UserTicketRepo userTicketRepo;
- private final TicketOrderService ticketOrderService;
- private final GeneralProperties generalProperties;
- private final SandPayService sandPayService;
- private final JumpFormRepo jumpFormRepo;
- private final UserBalanceRepo userBalanceRepo;
- public OrderPayService(TicketOrderRepo ticketOrderRepo, ReportService.AlipayService alipayService,
- UserBalanceService userBalanceService, UserTicketRepo userTicketRepo,
- @Lazy TicketOrderService ticketOrderService, GeneralProperties generalProperties,
- SandPayService sandPayService, JumpFormRepo jumpFormRepo, UserBalanceRepo userBalanceRepo) {
- this.ticketOrderRepo = ticketOrderRepo;
- this.alipayService = alipayService;
- this.userBalanceService = userBalanceService;
- this.userTicketRepo = userTicketRepo;
- this.ticketOrderService = ticketOrderService;
- this.generalProperties = generalProperties;
- this.sandPayService = sandPayService;
- this.jumpFormRepo = jumpFormRepo;
- this.userBalanceRepo = userBalanceRepo;
- }
- public Object pay(Long userId, Long orderId, PayMethod payMethod) throws Exception {
- TicketOrder ticketOrder = ticketOrderRepo.findById(orderId).orElseThrow(new BusinessException("订单不存在"));
- if (!ticketOrder.getUserId().equals(userId)) {
- throw new BusinessException("订单不属于该用户");
- }
- if (ticketOrder.getStatus() != OrderStatus.NOT_PAID) {
- throw new BusinessException("订单状态不正确");
- }
- switch (payMethod) {
- case ALIPAY: {
- String qrCode = alipayService.pay(orderId, ticketOrder.getTotalPrice(), "购买门票", Constants.OrderNotifyType.TICKET_ORDER);
- String ua = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest().getHeader("User-Agent");
- if (ua.toLowerCase().contains("micromessenger")) {
- return "/static/wx_alipay_bridge.html?payUrl=" + URLEncoder.encode(qrCode, StandardCharsets.UTF_8)
- + "&orderId=" + orderId + "&returnUrl="
- + URLEncoder.encode(generalProperties.getHost() + "/h5/userPass", StandardCharsets.UTF_8);
- } else {
- return "alipays://platformapi/startapp?saId=10000007&qrcode=" + qrCode;
- }
- }
- case BALANCE: {
- BigDecimal balance = userBalanceRepo.findByUserId(userId).map(UserBalance::getBalance).orElse(BigDecimal.ZERO);
- if (balance.compareTo(ticketOrder.getTotalPrice()) < 0) {
- throw new BusinessException("余额不足");
- }
- userBalanceService.modifyBalance(userId, ticketOrder.getTotalPrice().negate(), BalanceType.PAY);
- ticketOrderService.notify(ticketOrder.getId(), payMethod, null);
- return null;
- }
- case SAND_QUICK: {
- String html = sandPayService.payQuick(orderId + "", "购买门票", ticketOrder.getTotalPrice(),
- LocalDateTime.now().plusMinutes(3), Constants.OrderNotifyType.TICKET_ORDER,
- generalProperties.getHost() + "/h5/home");
- JumpForm jumpForm = jumpFormRepo.save(new JumpForm(html));
- return "/order/form/" + jumpForm.getId();
- }
- default:
- throw new BusinessException("不支持此支付方式");
- }
- }
- public String getForm(Long id) {
- return jumpFormRepo.findById(id).map(JumpForm::getContent).orElseThrow(new BusinessException("无记录"));
- }
- }
|