| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819 |
- package com.izouma.nineth.service;
- import com.alibaba.fastjson.JSONObject;
- import com.alipay.api.AlipayApiException;
- import com.alipay.api.AlipayClient;
- import com.alipay.api.request.AlipayTradePrecreateRequest;
- import com.alipay.api.response.AlipayTradePrecreateResponse;
- import com.izouma.nineth.config.AlipayProperties;
- import com.izouma.nineth.config.Constants;
- import com.izouma.nineth.config.GeneralProperties;
- import com.izouma.nineth.domain.*;
- import com.izouma.nineth.dto.PayQuery;
- import com.izouma.nineth.dto.UserBankCard;
- import com.izouma.nineth.enums.*;
- import com.izouma.nineth.event.OrderNotifyEvent;
- import com.izouma.nineth.exception.BusinessException;
- import com.izouma.nineth.repo.*;
- import com.izouma.nineth.utils.SnowflakeIdWorker;
- import lombok.AllArgsConstructor;
- import lombok.extern.slf4j.Slf4j;
- import org.apache.commons.lang3.StringUtils;
- import org.apache.rocketmq.spring.core.RocketMQTemplate;
- import org.springframework.cache.annotation.Cacheable;
- import org.springframework.security.crypto.password.PasswordEncoder;
- 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;
- import java.util.Map;
- import java.util.Objects;
- import java.util.Optional;
- import java.util.stream.Stream;
- @Service
- @Slf4j
- @AllArgsConstructor
- public class OrderPayService {
- private static String PAY_CHANNEL = Constants.PayChannel.SAND;
- private final OrderService orderService;
- 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;
- private final PasswordEncoder passwordEncoder;
- private final PayEaseService payEaseService;
- private final UserBankCardRepo userBankCardRepo;
- private final AuctionOrderRepo auctionOrderRepo;
- private final AuctionOrderService auctionOrderService;
- private final IdentityAuthRepo identityAuthRepo;
- private final AlipayClient alipayClient;
- private final AlipayProperties alipayProperties;
- private final AlipayService alipayService;
- private final PhotoAssetRepo photoAssetRepo;
- private final PhotoAssetService photoAssetService;
- public static void setPayChannel(String payChannel) {
- log.info("set pay channel {}", payChannel);
- if (Constants.PayChannel.HM.equals(payChannel) || Constants.PayChannel.SAND.equals(payChannel)) {
- PAY_CHANNEL = payChannel;
- }
- }
- @Cacheable(value = "payOrder", key = "'order#'+#orderId")
- public String payOrder(Long orderId) {
- Order order = orderRepo.findById(orderId).orElseThrow(new BusinessException("订单不存在"));
- if (order.getStatus() != OrderStatus.NOT_PAID) {
- throw new BusinessException("订单状态错误");
- }
- switch (PAY_CHANNEL) {
- case Constants.PayChannel.SAND:
- return sandPayService.pay(orderId + "", order.getName(), order.getTotalPrice(),
- order.getCreatedAt().plusMinutes(3), "order");
- case Constants.PayChannel.HM:
- return hmPayService.requestAlipay(orderId + "", order.getTotalPrice(), order.getName(),
- HMPayService.getTimeout(order.getCreatedAt(), 180), Constants.OrderNotifyType.ORDER,
- generalProperties.resolveFrontUrl(order.getCompanyId(), "/orderDetail?id=" + orderId));
- }
- throw new BusinessException(Constants.PAY_ERR_MSG);
- }
- private String aliRequest(Long orderId, BigDecimal amount, String subject, String type) {
- AlipayTradePrecreateRequest request = new AlipayTradePrecreateRequest();
- request.setNotifyUrl(alipayProperties.getNotifyUrl());
- JSONObject bizContent = new JSONObject();
- bizContent.put("out_trade_no", orderId + "");
- bizContent.put("total_amount", amount);
- bizContent.put("subject", subject);
- JSONObject body = new JSONObject();
- body.put("type", type);
- body.put("orderId", orderId);
- bizContent.put("body", body.toString());
- request.setBizContent(bizContent.toString());
- AlipayTradePrecreateResponse response = null;
- try {
- response = alipayClient.execute(request);
- } catch (AlipayApiException e) {
- e.printStackTrace();
- throw new BusinessException(Constants.PAY_ERR_MSG, e.getErrMsg());
- }
- if (response.isSuccess()) {
- return response.getQrCode();
- } else {
- throw new BusinessException(response.getSubMsg());
- }
- }
- @Cacheable(value = "payOrder", key = "'order#'+#orderId")
- public String payOrderAli(Long orderId) {
- Order order = orderRepo.findById(orderId).orElseThrow(new BusinessException("订单不存在"));
- if (order.getStatus() != OrderStatus.NOT_PAID) {
- throw new BusinessException("订单状态错误");
- }
- String qrCode = aliRequest(orderId, order.getTotalPrice(), order.getName(), Constants.OrderNotifyType.ORDER);
- String ua = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest()
- .getHeader("User-Agent");
- if (ua.toLowerCase().contains("micromessenger")) {
- return "/static/wx_alipay_bridge.html?payUrl=" + URLEncoder
- .encode(Constants.ALIPAY_URL_SCHEME + qrCode, StandardCharsets.UTF_8)
- + "&orderId=" + orderId + "&type=order&returnUrl="
- + URLEncoder
- .encode(generalProperties.resolveFrontUrl(order.getCompanyId(), "/store"), StandardCharsets.UTF_8);
- } else {
- return Constants.ALIPAY_URL_SCHEME + qrCode;
- }
- }
- @Cacheable(value = "payOrder", key = "'order#'+#orderId")
- public String payOrderQuick(Long orderId) {
- Order order = orderRepo.findById(orderId).orElseThrow(new BusinessException("订单不存在"));
- if (order.getStatus() != OrderStatus.NOT_PAID) {
- throw new BusinessException("订单状态错误");
- }
- return sandPayService.payQuick(orderId + "", order.getName(), order.getTotalPrice(),
- order.getCreatedAt().plusMinutes(3), Constants.OrderNotifyType.ORDER,
- generalProperties.resolveFrontUrl(order.getCompanyId(), "/store"));
- }
- @Cacheable(value = "payOrder", key = "'order#'+#orderId")
- public String payOrderQuickBind(Long orderId) {
- Order order = orderRepo.findById(orderId).orElseThrow(new BusinessException("订单不存在"));
- if (order.getStatus() != OrderStatus.NOT_PAID) {
- throw new BusinessException("订单状态错误");
- }
- IdentityAuth identityAuth = identityAuthRepo
- .findFirstByUserIdAndStatusAndDelFalseOrderByCreatedAtDesc(order.getUserId(), AuthStatus.SUCCESS)
- .orElseThrow(new BusinessException("请先完成实名认证"));
- return sandPayService.payQuickBind(orderId + "", order.getName(), order.getTotalPrice(),
- order.getCreatedAt().plusMinutes(3), Constants.OrderNotifyType.ORDER,
- generalProperties.resolveFrontUrl(order.getCompanyId(), "/store"),
- order.getUserId(), identityAuth.getRealName(), identityAuth.getIdNo());
- }
- 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("订单状态错误");
- }
- checkTradeCode(userId, tradeCode, order.getUserId());
- 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 = "'order#'+#orderId")
- public Map<String, Object> payOrderAgreement(Long orderId, String bindCardId) {
- Order order = orderRepo.findById(orderId).orElseThrow(new BusinessException("订单不存在"));
- if (order.getStatus() != OrderStatus.NOT_PAID) {
- throw new BusinessException("订单状态错误");
- }
- if (StringUtils.isEmpty(bindCardId)) {
- bindCardId = userBankCardRepo.findByUserId(order.getUserId())
- .stream().map(UserBankCard::getBindCardId).findFirst().orElse(null);
- }
- if (StringUtils.isEmpty(bindCardId)) {
- throw new BusinessException("请先绑定银行卡");
- }
- return payEaseService.pay(order.getName(), orderId.toString(), order.getTotalPrice(),
- order.getUserId().toString(), bindCardId, Constants.OrderNotifyType.ORDER);
- }
- public void confirmOrderAgreement(String requestId, String paymentOrderId, String code) {
- try {
- payEaseService.payConfirm(requestId, paymentOrderId, code);
- } catch (BusinessException e) {
- try {
- new Thread(() -> {
- orderService.cancel(Long.parseLong(requestId));
- }).start();
- } catch (Exception ee) {
- }
- throw e;
- }
- }
- @Cacheable(value = "payOrder", key = "'gift#'+#orderId")
- public String payGiftOrder(Long orderId) {
- GiftOrder order = giftOrderRepo.findById(orderId).orElseThrow(new BusinessException("订单不存在"));
- if (order.getStatus() != OrderStatus.NOT_PAID) {
- throw new BusinessException("订单状态错误");
- }
- switch (PAY_CHANNEL) {
- case Constants.PayChannel.SAND:
- return sandPayService.pay(orderId + "", "转赠" + order.getAssetId(), order.getGasPrice(),
- order.getCreatedAt().plusMinutes(3), Constants.OrderNotifyType.GIFT);
- case Constants.PayChannel.HM:
- return hmPayService.requestAlipay(orderId + "", order.getGasPrice(),
- "转赠" + order.getAssetId(),
- HMPayService.getTimeout(order.getCreatedAt(), 180),
- Constants.OrderNotifyType.GIFT, generalProperties
- .resolveFrontUrl(order.getCompanyId(), "/store"));
- }
- throw new BusinessException(Constants.PAY_ERR_MSG);
- }
- @Cacheable(value = "payOrder", key = "'gift#'+#orderId")
- public String payGiftAli(Long orderId) {
- GiftOrder order = giftOrderRepo.findById(orderId).orElseThrow(new BusinessException("订单不存在"));
- if (order.getStatus() != OrderStatus.NOT_PAID) {
- throw new BusinessException("订单状态错误");
- }
- String qrCode = aliRequest(orderId, order.getGasPrice(), "转赠", Constants.OrderNotifyType.GIFT);
- String ua = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest()
- .getHeader("User-Agent");
- if (ua.toLowerCase().contains("micromessenger")) {
- return "/static/wx_alipay_bridge.html?payUrl=" + URLEncoder
- .encode(Constants.ALIPAY_URL_SCHEME + qrCode, StandardCharsets.UTF_8)
- + "&orderId=" + orderId + "&type=gift&returnUrl="
- + URLEncoder
- .encode(generalProperties.resolveFrontUrl(order.getCompanyId(), "/store"), StandardCharsets.UTF_8);
- } else {
- return Constants.ALIPAY_URL_SCHEME + qrCode;
- }
- }
- @Cacheable(value = "payOrder", key = "'gift#'+#orderId")
- public String payGiftQuick(Long orderId) {
- GiftOrder order = giftOrderRepo.findById(orderId).orElseThrow(new BusinessException("订单不存在"));
- if (order.getStatus() != OrderStatus.NOT_PAID) {
- throw new BusinessException("订单状态错误");
- }
- return sandPayService.payQuick(orderId + "", "转赠" + order.getAssetId(), order.getGasPrice(),
- order.getCreatedAt().plusMinutes(3), Constants.OrderNotifyType.GIFT,
- generalProperties.resolveFrontUrl(order.getCompanyId(), "/store"));
- }
- @Cacheable(value = "payOrder", key = "'gift#'+#orderId")
- public String payGiftQuickBind(Long orderId) {
- GiftOrder order = giftOrderRepo.findById(orderId).orElseThrow(new BusinessException("订单不存在"));
- if (order.getStatus() != OrderStatus.NOT_PAID) {
- throw new BusinessException("订单状态错误");
- }
- IdentityAuth identityAuth = identityAuthRepo
- .findFirstByUserIdAndStatusAndDelFalseOrderByCreatedAtDesc(order.getUserId(), AuthStatus.SUCCESS)
- .orElseThrow(new BusinessException("请先完成实名认证"));
- return sandPayService.payQuickBind(orderId + "", "转赠" + order.getAssetId(), order.getGasPrice(),
- order.getCreatedAt().plusMinutes(3), Constants.OrderNotifyType.GIFT,
- generalProperties.resolveFrontUrl(order.getCompanyId(), "/store"),
- order.getUserId(), identityAuth.getRealName(), identityAuth.getIdNo());
- }
- 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("订单状态错误");
- }
- checkTradeCode(userId, tradeCode, order.getUserId());
- BalanceRecord record = userBalanceService.balancePay(order.getUserId(), order.getGasPrice(), orderId, "转赠");
- giftOrderService.giftNotify(orderId, PayMethod.BALANCE, record.getId().toString());
- }
- @Cacheable(value = "payOrder", key = "'gift#'+#orderId")
- public Map<String, Object> payGiftOrderAgreement(Long orderId, String bindCardId) {
- GiftOrder order = giftOrderRepo.findById(orderId).orElseThrow(new BusinessException("订单不存在"));
- if (order.getStatus() != OrderStatus.NOT_PAID) {
- throw new BusinessException("订单状态错误");
- }
- if (StringUtils.isEmpty(bindCardId)) {
- bindCardId = userBankCardRepo.findByUserId(order.getUserId())
- .stream().map(UserBankCard::getBindCardId).findFirst().orElse(null);
- }
- if (StringUtils.isEmpty(bindCardId)) {
- throw new BusinessException("请先绑定银行卡");
- }
- return payEaseService.pay("转赠" + order.getAssetId(), orderId.toString(), order.getGasPrice(),
- order.getUserId().toString(), bindCardId, Constants.OrderNotifyType.GIFT);
- }
- @Cacheable(value = "payOrder", key = "'mintOrder#'+#orderId")
- public String payMintOrder(Long orderId) {
- MintOrder order = mintOrderRepo.findById(orderId).orElseThrow(new BusinessException("订单不存在"));
- if (order.getStatus() != MintOrderStatus.NOT_PAID) {
- throw new BusinessException("订单状态错误");
- }
- switch (PAY_CHANNEL) {
- case Constants.PayChannel.SAND:
- return sandPayService.pay(orderId + "", "铸造活动:" + order.getMintActivityId(),
- order.getGasPrice(), order.getCreatedAt().plusMinutes(3), Constants.OrderNotifyType.MINT);
- case Constants.PayChannel.HM:
- return hmPayService.requestAlipay(orderId + "", order.getGasPrice(),
- "铸造活动:" + order.getMintActivityId(),
- HMPayService.getTimeout(order.getCreatedAt(), 180),
- Constants.OrderNotifyType.MINT, generalProperties
- .resolveFrontUrl(order.getCompanyId(), "/home"));
- }
- throw new BusinessException("绿洲宇宙冷却系统已启动,请稍后支付");
- }
- @Cacheable(value = "payOrder", key = "'mintOrder#'+#orderId")
- public String payMintAli(Long orderId) {
- MintOrder order = mintOrderRepo.findById(orderId).orElseThrow(new BusinessException("订单不存在"));
- if (order.getStatus() != MintOrderStatus.NOT_PAID) {
- throw new BusinessException("订单状态错误");
- }
- String qrCode = aliRequest(orderId, order.getGasPrice(), "铸造活动:" + order
- .getMintActivityId(), Constants.OrderNotifyType.MINT);
- String ua = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest()
- .getHeader("User-Agent");
- if (ua.toLowerCase().contains("micromessenger")) {
- return "/static/wx_alipay_bridge.html?payUrl=" + URLEncoder
- .encode(Constants.ALIPAY_URL_SCHEME + qrCode, StandardCharsets.UTF_8)
- + "&orderId=" + orderId + "&type=mintOrder&returnUrl="
- + URLEncoder
- .encode(generalProperties.resolveFrontUrl(order.getCompanyId(), "/home"), StandardCharsets.UTF_8);
- } else {
- return Constants.ALIPAY_URL_SCHEME + qrCode;
- }
- }
- @Cacheable(value = "payOrder", key = "'mintOrder#'+#orderId")
- public String payMintQuick(Long orderId) {
- MintOrder order = mintOrderRepo.findById(orderId).orElseThrow(new BusinessException("订单不存在"));
- if (order.getStatus() != MintOrderStatus.NOT_PAID) {
- throw new BusinessException("订单状态错误");
- }
- return sandPayService.payQuick(orderId + "", "铸造活动:" + order.getMintActivityId(),
- order.getGasPrice(), order.getCreatedAt().plusMinutes(3), Constants.OrderNotifyType.MINT,
- generalProperties.resolveFrontUrl(order.getCompanyId(), "/home"));
- }
- @Cacheable(value = "payOrder", key = "'mintOrder#'+#orderId")
- public String payMintQuickBind(Long orderId) {
- MintOrder order = mintOrderRepo.findById(orderId).orElseThrow(new BusinessException("订单不存在"));
- if (order.getStatus() != MintOrderStatus.NOT_PAID) {
- throw new BusinessException("订单状态错误");
- }
- IdentityAuth identityAuth = identityAuthRepo
- .findFirstByUserIdAndStatusAndDelFalseOrderByCreatedAtDesc(order.getUserId(), AuthStatus.SUCCESS)
- .orElseThrow(new BusinessException("请先完成实名认证"));
- return sandPayService.payQuickBind(orderId + "", "铸造活动:" + order.getMintActivityId(),
- order.getGasPrice(), order.getCreatedAt().plusMinutes(3), Constants.OrderNotifyType.MINT,
- generalProperties.resolveFrontUrl(order.getCompanyId(), "/home"),
- order.getUserId(), identityAuth.getRealName(), identityAuth.getIdNo());
- }
- 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("订单状态错误");
- }
- checkTradeCode(userId, tradeCode, order.getUserId());
- BalanceRecord record = userBalanceService.balancePay(order.getUserId(), order.getGasPrice(), orderId, "铸造活动");
- mintOrderService.mintNotify(orderId, PayMethod.BALANCE, record.getId().toString());
- }
- private void checkTradeCode(Long userId, String tradeCode, Long orderUserId) {
- if (!Objects.equals(orderUserId, userId)) {
- throw new BusinessException("订单不属于该用户");
- }
- String encodedPwd = userRepo.findTradeCode(userId);
- if (StringUtils.isEmpty(encodedPwd)) {
- throw new BusinessException("请先设置交易密码");
- }
- if (!passwordEncoder.matches(tradeCode, encodedPwd)) {
- throw new BusinessException("交易码错误");
- }
- }
- @Cacheable(value = "payOrder", key = "'mint#'+#orderId")
- public Map<String, Object> payMintOrderAgreement(Long orderId, String bindCardId) {
- MintOrder order = mintOrderRepo.findById(orderId).orElseThrow(new BusinessException("订单不存在"));
- if (order.getStatus() != MintOrderStatus.NOT_PAID) {
- throw new BusinessException("订单状态错误");
- }
- if (StringUtils.isEmpty(bindCardId)) {
- bindCardId = userBankCardRepo.findByUserId(order.getUserId())
- .stream().map(UserBankCard::getBindCardId).findFirst().orElse(null);
- }
- if (StringUtils.isEmpty(bindCardId)) {
- throw new BusinessException("请先绑定银行卡");
- }
- return payEaseService.pay("铸造活动:" + order.getMintActivityId(), orderId.toString(), order.getGasPrice(),
- order.getUserId().toString(), bindCardId, Constants.OrderNotifyType.MINT);
- }
- private Long getCompanyId() {
- Long companyId = 1L;
- try {
- String hCompanyId = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest()
- .getHeader("companyId");
- if (StringUtils.isNotBlank(hCompanyId)) {
- companyId = Long.parseLong(hCompanyId);
- }
- } catch (Exception ignored) {
- }
- return companyId;
- }
- public String recharge(Long userId, BigDecimal amount) {
- BigDecimal minAmount = sysConfigService.getBigDecimal("min_recharge_amount");
- if (amount.compareTo(minAmount) < 0) {
- throw new BusinessException("充值金额不能小于" + minAmount);
- }
- if (amount.compareTo(new BigDecimal("50000")) > 0) {
- throw new BusinessException("充值金额不能大于50000");
- }
- RechargeOrder order = RechargeOrder.builder()
- .id(snowflakeIdWorker.nextId())
- .userId(userId)
- .amount(amount)
- .status(OrderStatus.NOT_PAID)
- .build();
- rechargeOrderRepo.save(order);
- switch (PAY_CHANNEL) {
- case Constants.PayChannel.SAND:
- return sandPayService.pay(order.getId() + "", "余额充值", order.getAmount(),
- order.getCreatedAt().plusMinutes(3), Constants.OrderNotifyType.RECHARGE);
- case Constants.PayChannel.HM:
- return hmPayService.requestAlipay(order.getId() + "", order.getAmount(),
- "余额充值",
- HMPayService.getTimeout(order.getCreatedAt(), 180),
- Constants.OrderNotifyType.RECHARGE, generalProperties.resolveFrontUrl(getCompanyId(), "/home"));
- }
- throw new BusinessException("绿洲宇宙冷却系统已启动,请稍后支付");
- }
- public String payRechargeAli(Long userId, BigDecimal amount) {
- BigDecimal minAmount = sysConfigService.getBigDecimal("min_recharge_amount");
- if (amount.compareTo(minAmount) < 0) {
- throw new BusinessException("充值金额不能小于" + minAmount);
- }
- if (amount.compareTo(new BigDecimal("50000")) > 0) {
- throw new BusinessException("充值金额不能大于50000");
- }
- RechargeOrder order = RechargeOrder.builder()
- .id(snowflakeIdWorker.nextId())
- .userId(userId)
- .amount(amount)
- .status(OrderStatus.NOT_PAID)
- .build();
- rechargeOrderRepo.save(order);
- String qrCode = aliRequest(order.getId(), order.getAmount(), "余额充值", Constants.OrderNotifyType.RECHARGE);
- String ua = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest()
- .getHeader("User-Agent");
- if (ua.toLowerCase().contains("micromessenger")) {
- return "/static/wx_alipay_bridge.html?payUrl=" + URLEncoder
- .encode(Constants.ALIPAY_URL_SCHEME + qrCode, StandardCharsets.UTF_8)
- + "&orderId=" + order.getId() + "&type=recharge&returnUrl="
- + URLEncoder
- .encode(generalProperties.resolveFrontUrl(getCompanyId(), "/home"), StandardCharsets.UTF_8);
- } else {
- return Constants.ALIPAY_URL_SCHEME + qrCode;
- }
- }
- public Map<String, Object> rechargeAgreement(Long userId, BigDecimal amount, String bindCardId) {
- BigDecimal minAmount = sysConfigService.getBigDecimal("min_recharge_amount");
- if (amount.compareTo(minAmount) < 0) {
- throw new BusinessException("充值金额不能小于" + minAmount);
- }
- if (amount.compareTo(new BigDecimal("50000")) > 0) {
- throw new BusinessException("充值金额不能大于50000");
- }
- RechargeOrder order = RechargeOrder.builder()
- .id(snowflakeIdWorker.nextId())
- .userId(userId)
- .amount(amount)
- .status(OrderStatus.NOT_PAID)
- .build();
- rechargeOrderRepo.save(order);
- if (StringUtils.isEmpty(bindCardId)) {
- bindCardId = userBankCardRepo.findByUserId(order.getUserId())
- .stream().map(UserBankCard::getBindCardId).findFirst().orElse(null);
- }
- if (StringUtils.isEmpty(bindCardId)) {
- throw new BusinessException("请先绑定银行卡");
- }
- return payEaseService.pay("余额充值", order.getId().toString(), order.getAmount(),
- order.getUserId().toString(), bindCardId, Constants.OrderNotifyType.RECHARGE);
- }
- public String rechargeQuick(Long userId, BigDecimal amount, Long companyId) {
- BigDecimal minAmount = sysConfigService.getBigDecimal("min_recharge_amount");
- if (amount.compareTo(minAmount) < 0) {
- throw new BusinessException("充值金额不能小于" + minAmount);
- }
- if (amount.compareTo(new BigDecimal("50000")) > 0) {
- throw new BusinessException("充值金额不能大于50000");
- }
- RechargeOrder order = RechargeOrder.builder()
- .id(snowflakeIdWorker.nextId())
- .userId(userId)
- .amount(amount)
- .status(OrderStatus.NOT_PAID)
- .build();
- rechargeOrderRepo.save(order);
- return sandPayService.payQuick(order.getId() + "", "余额充值",
- order.getAmount(), LocalDateTime.now().plusMinutes(3), Constants.OrderNotifyType.RECHARGE,
- generalProperties.resolveFrontUrl(companyId, "/home"));
- }
- public String rechargeQuickBind(Long userId, BigDecimal amount, Long companyId) {
- BigDecimal minAmount = sysConfigService.getBigDecimal("min_recharge_amount");
- if (amount.compareTo(minAmount) < 0) {
- throw new BusinessException("充值金额不能小于" + minAmount);
- }
- if (amount.compareTo(new BigDecimal("50000")) > 0) {
- throw new BusinessException("充值金额不能大于50000");
- }
- IdentityAuth identityAuth = identityAuthRepo
- .findFirstByUserIdAndStatusAndDelFalseOrderByCreatedAtDesc(userId, AuthStatus.SUCCESS)
- .orElseThrow(new BusinessException("请先完成实名认证"));
- RechargeOrder order = RechargeOrder.builder()
- .id(snowflakeIdWorker.nextId())
- .userId(userId)
- .amount(amount)
- .status(OrderStatus.NOT_PAID)
- .build();
- rechargeOrderRepo.save(order);
- return sandPayService.payQuickBind(order.getId() + "", "余额充值",
- order.getAmount(), LocalDateTime.now().plusMinutes(3), Constants.OrderNotifyType.RECHARGE,
- generalProperties.resolveFrontUrl(companyId, "/home"),
- userId, identityAuth.getRealName(), identityAuth.getIdNo());
- }
- public JSONObject refund(String orderId, String transactionId, BigDecimal amount, String channel) {
- switch (channel) {
- case Constants.PayChannel.SAND: {
- JSONObject res = sandPayService.refund(orderId, amount);
- if (!"000000".equals(res.getJSONObject("head").getString("respCode"))) {
- String msg = res.getJSONObject("head").getString("respMsg");
- throw new BusinessException("退款失败:" + msg);
- }
- return res;
- }
- case Constants.PayChannel.HM: {
- JSONObject res = hmPayService.refund(orderId, amount);
- if (!"REFUND_SUCCESS".equals(res.getString("sub_code"))) {
- String msg = res.getString("msg");
- throw new BusinessException("退款失败:" + msg);
- }
- return res;
- }
- case Constants.PayChannel.PE: {
- JSONObject res = payEaseService.refund(orderId, transactionId, amount);
- String status = res.getString("status");
- if (!"SUCCESS".equals(status)) {
- String error = res.getString("error");
- String cause = res.getString("cause");
- throw new BusinessException("退款失败:" + error + ";" + cause);
- }
- return res;
- }
- case Constants.PayChannel.ALI: {
- alipayService.refund(orderId, amount);
- return null;
- }
- }
- throw new BusinessException("退款失败");
- }
- public PayQuery query(String orderId) {
- return query(orderId, null);
- }
- public PayQuery query(String orderId, String channel) {
- if (StringUtils.isNotEmpty(channel)) {
- switch (channel) {
- case Constants.PayChannel.SAND:
- return sandPayService.payQuery(orderId);
- case Constants.PayChannel.HM:
- return hmPayService.payQuery(orderId);
- case Constants.PayChannel.PE:
- return payEaseService.payQuery(orderId);
- }
- }
- PayQuery query = sandPayService.payQuery(orderId);
- if (query == null || !query.isExist()) {
- query = hmPayService.payQuery(orderId);
- }
- if (query == null || !query.isExist()) {
- query = payEaseService.payQuery(orderId);
- }
- if (query == null || !query.isExist()) {
- query = alipayService.payQuery(orderId);
- }
- return Optional.ofNullable(query).orElse(PayQuery.builder().exist(false).build());
- }
- @Cacheable(value = "payOrder", key = "'auctionOrder#'+#orderId")
- public String payAuctionOrder(Long orderId) {
- AuctionOrder order = auctionOrderRepo.findById(orderId).orElseThrow(new BusinessException("订单不存在"));
- if (order.getStatus() != AuctionOrderStatus.NOT_PAID) {
- throw new BusinessException("订单状态错误");
- }
- switch (PAY_CHANNEL) {
- case Constants.PayChannel.SAND:
- return sandPayService.pay(orderId + "", "拍卖:" + order.getName(), order.getTotalPrice(),
- order.getCreatedAt().plusMinutes(3), Constants.OrderNotifyType.AUCTION);
- case Constants.PayChannel.HM:
- return hmPayService.requestAlipay(orderId + "", order.getTotalPrice(),
- "拍卖:" + order.getName(), HMPayService.getTimeout(order.getCreatedAt(), 180),
- Constants.OrderNotifyType.AUCTION, generalProperties.resolveFrontUrl(getCompanyId(), "/home"));
- }
- throw new BusinessException("绿洲宇宙冷却系统已启动,请稍后支付");
- }
- @Cacheable(value = "payOrder", key = "'auctionOrder#'+#orderId")
- public String payAuctionAli(Long orderId) {
- AuctionOrder order = auctionOrderRepo.findById(orderId).orElseThrow(new BusinessException("订单不存在"));
- if (order.getStatus() != AuctionOrderStatus.NOT_PAID) {
- throw new BusinessException("订单状态错误");
- }
- String qrCode = aliRequest(orderId, order.getTotalPrice(), "拍卖:" + order
- .getName(), Constants.OrderNotifyType.AUCTION);
- String ua = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest()
- .getHeader("User-Agent");
- if (ua.toLowerCase().contains("micromessenger")) {
- return "/static/wx_alipay_bridge.html?payUrl=" + URLEncoder
- .encode(Constants.ALIPAY_URL_SCHEME + qrCode, StandardCharsets.UTF_8)
- + "&orderId=" + orderId + "&type=auctionOrder&returnUrl="
- + URLEncoder
- .encode(generalProperties.resolveFrontUrl(getCompanyId(), "/home"), StandardCharsets.UTF_8);
- } else {
- return Constants.ALIPAY_URL_SCHEME + qrCode;
- }
- }
- @Cacheable(value = "payOrder", key = "'auctionOrder#'+#orderId")
- public String payAuctionQuick(Long orderId) {
- AuctionOrder order = auctionOrderRepo.findById(orderId).orElseThrow(new BusinessException("订单不存在"));
- if (order.getStatus() != AuctionOrderStatus.NOT_PAID) {
- throw new BusinessException("订单状态错误");
- }
- IdentityAuth identityAuth = identityAuthRepo
- .findFirstByUserIdAndStatusAndDelFalseOrderByCreatedAtDesc(order.getUserId(), AuthStatus.SUCCESS)
- .orElseThrow(new BusinessException("请先完成实名认证"));
- return sandPayService.payQuick(orderId + "", "拍卖:" + order.getName(),
- order.getTotalPrice(), order.getCreatedAt().plusMinutes(3), Constants.OrderNotifyType.AUCTION,
- generalProperties.resolveFrontUrl(getCompanyId(), "/home"));
- }
- @Cacheable(value = "payOrder", key = "'auctionOrder#'+#orderId")
- public String payAuctionQuickBind(Long orderId) {
- AuctionOrder order = auctionOrderRepo.findById(orderId).orElseThrow(new BusinessException("订单不存在"));
- if (order.getStatus() != AuctionOrderStatus.NOT_PAID) {
- throw new BusinessException("订单状态错误");
- }
- IdentityAuth identityAuth = identityAuthRepo
- .findFirstByUserIdAndStatusAndDelFalseOrderByCreatedAtDesc(order.getUserId(), AuthStatus.SUCCESS)
- .orElseThrow(new BusinessException("请先完成实名认证"));
- return sandPayService.payQuickBind(orderId + "", "拍卖:" + order.getName(),
- order.getTotalPrice(), order.getCreatedAt().plusMinutes(3), Constants.OrderNotifyType.AUCTION,
- generalProperties.resolveFrontUrl(getCompanyId(), "/home"),
- order.getUserId(), identityAuth.getRealName(), identityAuth.getIdNo());
- }
- public void payAuctionOrderBalance(Long orderId, Long userId, String tradeCode) {
- AuctionOrder order = auctionOrderRepo.findById(orderId).orElseThrow(new BusinessException("订单不存在"));
- if (order.getStatus() != AuctionOrderStatus.NOT_PAID) {
- throw new BusinessException("订单状态错误");
- }
- checkTradeCode(userId, tradeCode, order.getUserId());
- BalanceRecord record = userBalanceService.balancePay(order.getUserId(), order.getTotalPrice(), orderId, "拍卖");
- auctionOrderService.notify(orderId, PayMethod.BALANCE, record.getId().toString());
- }
- @Cacheable(value = "payOrder", key = "'auctionOrder#'+#orderId")
- public Map<String, Object> payAuctionOrderAgreement(Long orderId, String bindCardId) {
- AuctionOrder order = auctionOrderRepo.findById(orderId).orElseThrow(new BusinessException("订单不存在"));
- if (order.getStatus() != AuctionOrderStatus.NOT_PAID) {
- throw new BusinessException("订单状态错误");
- }
- if (StringUtils.isEmpty(bindCardId)) {
- bindCardId = userBankCardRepo.findByUserId(order.getUserId())
- .stream().map(UserBankCard::getBindCardId).findFirst().orElse(null);
- }
- if (StringUtils.isEmpty(bindCardId)) {
- throw new BusinessException("请先绑定银行卡");
- }
- return payEaseService.pay("拍卖:" + order.getAuctionId(), orderId.toString(), order.getTotalPrice(),
- order.getUserId().toString(), bindCardId, Constants.OrderNotifyType.AUCTION);
- }
- @Cacheable(value = "payOrder", key = "'picOrder#'+#orderId")
- public String payPicOrder(Long orderId) {
- PhotoAsset order = photoAssetRepo.findById(orderId).orElseThrow(new BusinessException("订单不存在"));
- if (order.getOrderStatus() != OrderStatus.NOT_PAID) {
- throw new BusinessException("订单状态错误");
- }
- switch (PAY_CHANNEL) {
- case Constants.PayChannel.SAND:
- return sandPayService.pay(orderId + "", "星图:" + order.getPicName(), order.getPrice(),
- order.getCreatedAt().plusMinutes(3), Constants.OrderNotifyType.PIC);
- case Constants.PayChannel.HM:
- return hmPayService.requestAlipay(orderId + "", order.getPrice(),
- "星图:" + order.getPicName(), HMPayService.getTimeout(order.getCreatedAt(), 180),
- Constants.OrderNotifyType.PIC, generalProperties.resolveFrontUrl(getCompanyId(), "/orderDetail?id=" + orderId));
- }
- throw new BusinessException("绿洲宇宙冷却系统已启动,请稍后支付");
- }
- @Cacheable(value = "payOrder", key = "'picOrder#'+#orderId")
- public String payPicAli(Long orderId) {
- PhotoAsset order = photoAssetRepo.findById(orderId).orElseThrow(new BusinessException("订单不存在"));
- if (order.getOrderStatus() != OrderStatus.NOT_PAID) {
- throw new BusinessException("订单状态错误");
- }
- String qrCode = aliRequest(orderId, order.getPrice(), "星图:" + order
- .getPicName(), Constants.OrderNotifyType.PIC);
- String ua = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest()
- .getHeader("User-Agent");
- if (ua.toLowerCase().contains("micromessenger")) {
- return "/static/wx_alipay_bridge.html?payUrl=" + URLEncoder
- .encode(Constants.ALIPAY_URL_SCHEME + qrCode, StandardCharsets.UTF_8)
- + "&orderId=" + orderId + "&type=pic&returnUrl="
- + URLEncoder
- .encode(generalProperties.resolveFrontUrl(getCompanyId(), "/orderDetail?id=" + orderId), StandardCharsets.UTF_8);
- } else {
- return Constants.ALIPAY_URL_SCHEME + qrCode;
- }
- }
- @Cacheable(value = "payOrder", key = "'picOrder#'+#orderId")
- public String payPicQuick(Long orderId) {
- PhotoAsset order = photoAssetRepo.findById(orderId).orElseThrow(new BusinessException("订单不存在"));
- if (order.getOrderStatus() != OrderStatus.NOT_PAID) {
- throw new BusinessException("订单状态错误");
- }
- IdentityAuth identityAuth = identityAuthRepo
- .findFirstByUserIdAndStatusAndDelFalseOrderByCreatedAtDesc(order.getUserId(), AuthStatus.SUCCESS)
- .orElseThrow(new BusinessException("请先完成实名认证"));
- return sandPayService.payQuick(orderId + "", "星图:" + order.getPicName(),
- order.getPrice(), order.getCreatedAt().plusMinutes(3), Constants.OrderNotifyType.PIC,
- generalProperties.resolveFrontUrl(getCompanyId(), "/orderDetail?id=" + orderId));
- }
- @Cacheable(value = "payOrder", key = "'picOrder#'+#orderId")
- public String payPicQuickBind(Long orderId) {
- PhotoAsset order = photoAssetRepo.findById(orderId).orElseThrow(new BusinessException("订单不存在"));
- if (order.getOrderStatus() != OrderStatus.NOT_PAID) {
- throw new BusinessException("订单状态错误");
- }
- IdentityAuth identityAuth = identityAuthRepo
- .findFirstByUserIdAndStatusAndDelFalseOrderByCreatedAtDesc(order.getUserId(), AuthStatus.SUCCESS)
- .orElseThrow(new BusinessException("请先完成实名认证"));
- return sandPayService.payQuickBind(orderId + "", "星图:" + order.getPicName(),
- order.getPrice(), order.getCreatedAt().plusMinutes(3), Constants.OrderNotifyType.PIC,
- generalProperties.resolveFrontUrl(getCompanyId(), "/orderDetail?id=" + orderId),
- order.getUserId(), identityAuth.getRealName(), identityAuth.getIdNo());
- }
- public void payPicOrderBalance(Long orderId, Long userId, String tradeCode) {
- PhotoAsset order = photoAssetRepo.findById(orderId).orElseThrow(new BusinessException("订单不存在"));
- if (order.getOrderStatus() != OrderStatus.NOT_PAID) {
- throw new BusinessException("订单状态错误");
- }
- checkTradeCode(userId, tradeCode, order.getUserId());
- BalanceRecord record = userBalanceService.balancePay(order.getUserId(), order.getPrice(), orderId, "星图");
- photoAssetService.notify(orderId, PayMethod.BALANCE, record.getId().toString());
- }
- @Cacheable(value = "payOrder", key = "'picOrder#'+#orderId")
- public Map<String, Object> payPicOrderAgreement(Long orderId, String bindCardId) {
- PhotoAsset order = photoAssetRepo.findById(orderId).orElseThrow(new BusinessException("订单不存在"));
- if (order.getOrderStatus() != OrderStatus.NOT_PAID) {
- throw new BusinessException("订单状态错误");
- }
- if (StringUtils.isEmpty(bindCardId)) {
- bindCardId = userBankCardRepo.findByUserId(order.getUserId())
- .stream().map(UserBankCard::getBindCardId).findFirst().orElse(null);
- }
- if (StringUtils.isEmpty(bindCardId)) {
- throw new BusinessException("请先绑定银行卡");
- }
- return payEaseService.pay("星图:" + order.getPicName(), orderId.toString(), order.getPrice(),
- order.getUserId().toString(), bindCardId, Constants.OrderNotifyType.PIC);
- }
- }
|