OrderPayService.java 5.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. package com.izouma.yags.service;
  2. import com.izouma.yags.config.Constants;
  3. import com.izouma.yags.config.GeneralProperties;
  4. import com.izouma.yags.domain.JumpForm;
  5. import com.izouma.yags.domain.TicketOrder;
  6. import com.izouma.yags.domain.UserBalance;
  7. import com.izouma.yags.enums.BalanceType;
  8. import com.izouma.yags.enums.OrderStatus;
  9. import com.izouma.yags.enums.PayMethod;
  10. import com.izouma.yags.exception.BusinessException;
  11. import com.izouma.yags.repo.JumpFormRepo;
  12. import com.izouma.yags.repo.TicketOrderRepo;
  13. import com.izouma.yags.repo.UserBalanceRepo;
  14. import com.izouma.yags.repo.UserTicketRepo;
  15. import org.springframework.context.annotation.Lazy;
  16. import org.springframework.stereotype.Service;
  17. import org.springframework.web.context.request.RequestContextHolder;
  18. import org.springframework.web.context.request.ServletRequestAttributes;
  19. import java.math.BigDecimal;
  20. import java.net.URLEncoder;
  21. import java.nio.charset.StandardCharsets;
  22. import java.time.LocalDateTime;
  23. @Service
  24. public class OrderPayService {
  25. private final TicketOrderRepo ticketOrderRepo;
  26. private final ReportService.AlipayService alipayService;
  27. private final UserBalanceService userBalanceService;
  28. private final UserTicketRepo userTicketRepo;
  29. private final TicketOrderService ticketOrderService;
  30. private final GeneralProperties generalProperties;
  31. private final SandPayService sandPayService;
  32. private final JumpFormRepo jumpFormRepo;
  33. private final UserBalanceRepo userBalanceRepo;
  34. public OrderPayService(TicketOrderRepo ticketOrderRepo, ReportService.AlipayService alipayService,
  35. UserBalanceService userBalanceService, UserTicketRepo userTicketRepo,
  36. @Lazy TicketOrderService ticketOrderService, GeneralProperties generalProperties,
  37. SandPayService sandPayService, JumpFormRepo jumpFormRepo, UserBalanceRepo userBalanceRepo) {
  38. this.ticketOrderRepo = ticketOrderRepo;
  39. this.alipayService = alipayService;
  40. this.userBalanceService = userBalanceService;
  41. this.userTicketRepo = userTicketRepo;
  42. this.ticketOrderService = ticketOrderService;
  43. this.generalProperties = generalProperties;
  44. this.sandPayService = sandPayService;
  45. this.jumpFormRepo = jumpFormRepo;
  46. this.userBalanceRepo = userBalanceRepo;
  47. }
  48. public Object pay(Long userId, Long orderId, PayMethod payMethod) throws Exception {
  49. TicketOrder ticketOrder = ticketOrderRepo.findById(orderId).orElseThrow(new BusinessException("订单不存在"));
  50. if (!ticketOrder.getUserId().equals(userId)) {
  51. throw new BusinessException("订单不属于该用户");
  52. }
  53. if (ticketOrder.getStatus() != OrderStatus.NOT_PAID) {
  54. throw new BusinessException("订单状态不正确");
  55. }
  56. switch (payMethod) {
  57. case ALIPAY: {
  58. String qrCode = alipayService.pay(orderId, ticketOrder.getTotalPrice(), "购买门票", Constants.OrderNotifyType.TICKET_ORDER);
  59. String ua = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest().getHeader("User-Agent");
  60. if (ua.toLowerCase().contains("micromessenger")) {
  61. return "/static/wx_alipay_bridge.html?payUrl=" + URLEncoder.encode(qrCode, StandardCharsets.UTF_8)
  62. + "&orderId=" + orderId + "&returnUrl="
  63. + URLEncoder.encode(generalProperties.getHost() + "/h5/userPass", StandardCharsets.UTF_8);
  64. } else {
  65. return "alipays://platformapi/startapp?saId=10000007&qrcode=" + qrCode;
  66. }
  67. }
  68. case BALANCE: {
  69. BigDecimal balance = userBalanceRepo.findByUserId(userId).map(UserBalance::getBalance).orElse(BigDecimal.ZERO);
  70. if (balance.compareTo(ticketOrder.getTotalPrice()) < 0) {
  71. throw new BusinessException("余额不足");
  72. }
  73. userBalanceService.modifyBalance(userId, ticketOrder.getTotalPrice().negate(), BalanceType.PAY);
  74. ticketOrderService.notify(ticketOrder.getId(), payMethod, null);
  75. return null;
  76. }
  77. case SAND_QUICK: {
  78. String html = sandPayService.payQuick(orderId + "", "购买门票", ticketOrder.getTotalPrice(),
  79. LocalDateTime.now().plusMinutes(3), Constants.OrderNotifyType.TICKET_ORDER,
  80. generalProperties.getHost() + "/h5/home");
  81. JumpForm jumpForm = jumpFormRepo.save(new JumpForm(html));
  82. return "/order/form/" + jumpForm.getId();
  83. }
  84. default:
  85. throw new BusinessException("不支持此支付方式");
  86. }
  87. }
  88. public String getForm(Long id) {
  89. return jumpFormRepo.findById(id).map(JumpForm::getContent).orElseThrow(new BusinessException("无记录"));
  90. }
  91. }