GiftOrderService.java 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173
  1. package com.izouma.nineth.service;
  2. import com.alibaba.fastjson.JSON;
  3. import com.alibaba.fastjson.JSONObject;
  4. import com.alipay.api.AlipayClient;
  5. import com.alipay.api.request.AlipayTradeWapPayRequest;
  6. import com.github.binarywang.wxpay.bean.order.WxPayMpOrderResult;
  7. import com.github.binarywang.wxpay.bean.order.WxPayMwebOrderResult;
  8. import com.github.binarywang.wxpay.bean.request.WxPayUnifiedOrderRequest;
  9. import com.github.binarywang.wxpay.constant.WxPayConstants;
  10. import com.github.binarywang.wxpay.exception.WxPayException;
  11. import com.github.binarywang.wxpay.service.WxPayService;
  12. import com.izouma.nineth.config.AlipayProperties;
  13. import com.izouma.nineth.config.WxPayProperties;
  14. import com.izouma.nineth.domain.Asset;
  15. import com.izouma.nineth.domain.GiftOrder;
  16. import com.izouma.nineth.domain.User;
  17. import com.izouma.nineth.enums.AssetStatus;
  18. import com.izouma.nineth.enums.OrderStatus;
  19. import com.izouma.nineth.enums.PayMethod;
  20. import com.izouma.nineth.exception.BusinessException;
  21. import com.izouma.nineth.repo.*;
  22. import com.izouma.nineth.utils.SnowflakeIdWorker;
  23. import lombok.AllArgsConstructor;
  24. import org.apache.commons.codec.EncoderException;
  25. import org.apache.commons.codec.net.URLCodec;
  26. import org.springframework.context.ApplicationContext;
  27. import org.springframework.core.env.Environment;
  28. import org.springframework.stereotype.Service;
  29. import org.springframework.ui.Model;
  30. import javax.transaction.Transactional;
  31. import java.math.BigDecimal;
  32. import java.time.LocalDateTime;
  33. import java.util.Arrays;
  34. @Service
  35. @AllArgsConstructor
  36. public class GiftOrderService {
  37. private AssetRepo assetRepo;
  38. private UserRepo userRepo;
  39. private NFTService nftService;
  40. private CollectionRepo collectionRepo;
  41. private ApplicationContext applicationContext;
  42. private OrderRepo orderRepo;
  43. private SysConfigService sysConfigService;
  44. private GiftOrderRepo giftOrderRepo;
  45. private TokenHistoryRepo tokenHistoryRepo;
  46. private AlipayProperties alipayProperties;
  47. private AlipayClient alipayClient;
  48. private WxPayProperties wxPayProperties;
  49. private WxPayService wxPayService;
  50. private Environment env;
  51. private AssetMintService assetMintService;
  52. private AssetService assetService;
  53. @Transactional
  54. public GiftOrder gift(Long userId, Long assetId, Long toUserId) {
  55. Asset asset = assetRepo.findById(assetId).orElseThrow(new BusinessException("资产不存在"));
  56. if (!(asset.getStatus() == AssetStatus.NORMAL)) {
  57. throw new BusinessException("当前状态不可转赠");
  58. }
  59. if (asset.isConsignment()) {
  60. throw new BusinessException("请先取消寄售");
  61. }
  62. if (asset.isPublicShow()) {
  63. assetService.cancelPublic(asset);
  64. }
  65. asset.setStatus(AssetStatus.GIFTING);
  66. assetRepo.save(asset);
  67. GiftOrder giftOrder = GiftOrder.builder()
  68. .userId(userId)
  69. .assetId(assetId)
  70. .toUserId(toUserId)
  71. .gasPrice(sysConfigService.getBigDecimal("gas_fee"))
  72. .status(OrderStatus.NOT_PAID)
  73. .build();
  74. return giftOrderRepo.save(giftOrder);
  75. }
  76. @Transactional
  77. public void giftNotify(Long orderId, PayMethod payMethod, String transactionId) {
  78. GiftOrder giftOrder = giftOrderRepo.findById(orderId).orElseThrow(new BusinessException("订单不存在"));
  79. Asset asset = assetRepo.findById(giftOrder.getAssetId()).orElseThrow(new BusinessException("资产不存在"));
  80. User newOwner = userRepo.findById(giftOrder.getToUserId()).orElseThrow(new BusinessException("用户不存在"));
  81. giftOrder.setPayMethod(payMethod);
  82. giftOrder.setStatus(OrderStatus.FINISH);
  83. giftOrder.setTransactionId(transactionId);
  84. giftOrder.setPayTime(LocalDateTime.now());
  85. giftOrder.setPayMethod(PayMethod.ALIPAY);
  86. assetService.transfer(asset, asset.getPrice(), newOwner, "转赠", null);
  87. }
  88. public void payOrderAlipay(Long id, Model model) {
  89. try {
  90. GiftOrder order = giftOrderRepo.findById(id).orElseThrow(new BusinessException("订单不存在"));
  91. if (order.getStatus() != OrderStatus.NOT_PAID) {
  92. throw new BusinessException("订单状态错误");
  93. }
  94. JSONObject bizContent = new JSONObject();
  95. bizContent.put("notifyUrl", alipayProperties.getNotifyUrl());
  96. bizContent.put("returnUrl", alipayProperties.getReturnUrl());
  97. bizContent.put("out_trade_no", String.valueOf(new SnowflakeIdWorker(0, 0).nextId()));
  98. bizContent.put("total_amount", order.getGasPrice().stripTrailingZeros().toPlainString());
  99. bizContent.put("disable_pay_channels", "pcredit,creditCard");
  100. if (Arrays.stream(env.getActiveProfiles()).noneMatch(s -> s.equals("prod"))) {
  101. // 测试环境设为1分
  102. bizContent.put("total_amount", "0.01");
  103. }
  104. bizContent.put("subject", "转赠GAS费");
  105. bizContent.put("product_code", "QUICK_WAP_PAY");
  106. JSONObject body = new JSONObject();
  107. body.put("action", "payGiftOrder");
  108. body.put("userId", order.getUserId());
  109. body.put("orderId", order.getId());
  110. bizContent.put("body", body.toJSONString());
  111. AlipayTradeWapPayRequest alipayRequest = new AlipayTradeWapPayRequest();
  112. alipayRequest.setReturnUrl(alipayProperties.getReturnUrl());
  113. alipayRequest.setNotifyUrl(alipayProperties.getNotifyUrl());
  114. alipayRequest.setBizContent(JSON.toJSONString(bizContent));
  115. String form = alipayClient.pageExecute(alipayRequest).getBody();
  116. model.addAttribute("form", form);
  117. } catch (BusinessException err) {
  118. model.addAttribute("errMsg", err.getError());
  119. } catch (Exception e) {
  120. model.addAttribute("errMsg", e.getMessage());
  121. }
  122. }
  123. public Object payOrderWeixin(Long id, String tradeType, String openId) throws WxPayException, EncoderException {
  124. GiftOrder order = giftOrderRepo.findById(id).orElseThrow(new BusinessException("订单不存在"));
  125. if (order.getStatus() != OrderStatus.NOT_PAID) {
  126. throw new BusinessException("订单状态错误");
  127. }
  128. WxPayUnifiedOrderRequest request = new WxPayUnifiedOrderRequest();
  129. request.setBody("转赠GAS费");
  130. request.setOutTradeNo(String.valueOf(new SnowflakeIdWorker(1, 1).nextId()));
  131. request.setTotalFee(order.getGasPrice().multiply(BigDecimal.valueOf(100)).intValue());
  132. if (Arrays.stream(env.getActiveProfiles()).noneMatch(s -> s.equals("prod"))) {
  133. // 测试环境设为1分
  134. // request.setTotalFee(1);
  135. }
  136. request.setSpbillCreateIp("180.102.110.170");
  137. request.setNotifyUrl(wxPayProperties.getNotifyUrl());
  138. request.setTradeType(tradeType);
  139. request.setOpenid(openId);
  140. request.setSignType("MD5");
  141. JSONObject body = new JSONObject();
  142. body.put("action", "payGiftOrder");
  143. body.put("userId", order.getUserId());
  144. body.put("orderId", order.getId());
  145. request.setAttach(body.toJSONString());
  146. if (WxPayConstants.TradeType.MWEB.equals(tradeType)) {
  147. WxPayMwebOrderResult result = wxPayService.createOrder(request);
  148. return result.getMwebUrl() + "&redirect_url=" + new URLCodec().encode(wxPayProperties.getReturnUrl());
  149. } else if (WxPayConstants.TradeType.JSAPI.equals(tradeType)) {
  150. return wxPayService.<WxPayMpOrderResult>createOrder(request);
  151. }
  152. throw new BusinessException("不支持此付款方式");
  153. }
  154. }