RegisterOrderDonServiceImpl.java 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  1. package com.cyksj.service.register.impl;
  2. import cn.hutool.core.bean.BeanUtil;
  3. import cn.hutool.core.date.DateUtil;
  4. import com.baomidou.mybatisplus.core.toolkit.Wrappers;
  5. import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
  6. import com.cyksj.common.exception.BusinessRuntimeException;
  7. import com.cyksj.common.snowflake.Sequence;
  8. import com.cyksj.common.util.Codec;
  9. import com.cyksj.common.util.Jsons;
  10. import com.cyksj.config.WeChatConfig;
  11. import com.cyksj.dto.RedisKey;
  12. import com.cyksj.mapper.RegisterOrderDonMapper;
  13. import com.cyksj.mapper.UserMapper;
  14. import com.cyksj.model.dto.H5JsPayParams;
  15. import com.cyksj.model.entity.RegisterOrderDon;
  16. import com.cyksj.model.entity.SysConfig;
  17. import com.cyksj.model.entity.User;
  18. import com.cyksj.model.entity.*;
  19. import com.cyksj.model.manage.request.RegisterReq;
  20. import com.cyksj.model.request.OrderAttach;
  21. import com.cyksj.redis.RedisService;
  22. import com.cyksj.service.register.RegisterOrderDonService;
  23. import com.cyksj.service.register.SpotifyService;
  24. import com.cyksj.service.sys.SysConfigService;
  25. import com.cyksj.service.wechat.WeChatService;
  26. import lombok.RequiredArgsConstructor;
  27. import lombok.extern.slf4j.Slf4j;
  28. import org.apache.commons.lang3.StringUtils;
  29. import org.springframework.stereotype.Service;
  30. import org.springframework.transaction.annotation.Transactional;
  31. import java.math.BigDecimal;
  32. import java.util.Date;
  33. import java.util.List;
  34. import java.util.Map;
  35. import java.util.Optional;
  36. /**
  37. * @author chan
  38. * @date 2022/11/7 2:39 PM
  39. */
  40. @Service
  41. @Slf4j
  42. @RequiredArgsConstructor
  43. public class RegisterOrderDonServiceImpl extends ServiceImpl<RegisterOrderDonMapper ,RegisterOrderDon> implements RegisterOrderDonService {
  44. private static final Sequence SEQUENCE = new Sequence(0);
  45. private static final String REGISTER_PRICE_KEY = "register_price";
  46. private final SpotifyService spotifyService;
  47. private final RedisService redisService;
  48. private final WeChatService weChatService;
  49. private final WeChatConfig weChatConfig;
  50. private final SysConfigService sysConfigService;
  51. private final UserMapper userMapper;
  52. /**
  53. * 判断是否免费
  54. * @author chan
  55. * @date 2022-11-07 3:34 PM
  56. */
  57. @Override
  58. public boolean isFree(long userId, String platform) {
  59. int count = count(Wrappers.lambdaQuery(RegisterOrderDon.class)
  60. .eq(RegisterOrderDon::getUserId, userId)
  61. .ne(RegisterOrderDon::getStatus, RegisterOrderDon.Status.noPayment)
  62. .eq(RegisterOrderDon::getIsFree, true));
  63. if(count > 0){
  64. return false;
  65. }
  66. Long num = redisService.decr(RedisKey.SPOTIFY_FREE_NUM, 1L);
  67. if(num >= 0){
  68. return true;
  69. }else {
  70. redisService.incr(RedisKey.SPOTIFY_FREE_NUM, 1L);
  71. }
  72. return false;
  73. }
  74. /**
  75. * 保存注册资料
  76. * @author chan
  77. * @date 2022-11-07 3:34 PM
  78. */
  79. @Override
  80. @Transactional(rollbackFor = Throwable.class)
  81. public RegisterOrderDon saveOrder(long userId, RegisterReq req, boolean isFree) throws Exception {
  82. RegisterOrderDon orderDon = new RegisterOrderDon();
  83. User user = userMapper.selectById(userId);
  84. BeanUtil.copyProperties(req,orderDon);
  85. SysConfig register_price = sysConfigService.getOne(Wrappers.lambdaQuery(SysConfig.class).eq(SysConfig::getSysKey, "register_price").last("limit 1"));
  86. Map<String, Integer> map = Jsons.toMap(register_price.getSysValue());
  87. orderDon.setOrderNo(SEQUENCE.nextId() + "");
  88. orderDon.setUserId(userId);
  89. orderDon.setOpenId(user.getOpenId());
  90. orderDon.setIsFree(isFree);
  91. orderDon.setMoney(isFree ? BigDecimal.ZERO : BigDecimal.valueOf(map.get(req.getPlatform())));
  92. orderDon.setStatus(isFree ? RegisterOrderDon.Status.hasPayment : RegisterOrderDon.Status.noPayment);
  93. save(orderDon);
  94. return orderDon;
  95. }
  96. @Override
  97. public H5JsPayParams pay(Long orderId) throws Exception {
  98. log.info("注册 账号调起微信支付[start] orderId:{}", orderId);
  99. RegisterOrderDon orderDon = this.getById(orderId);
  100. OrderAttach attach = new OrderAttach();
  101. attach.setO(orderDon.getId());
  102. String toWechatAttach = Codec.DoBase64.custom()
  103. .setData(Jsons.toJson(attach)).encodeAsText();
  104. H5JsPayParams params = weChatService.getJsPayParams(
  105. weChatConfig.getAppid(),
  106. orderDon.getOpenId(),
  107. orderDon.getMoney().intValue(),
  108. orderDon.getOrderNo(),
  109. weChatConfig.getDomain() + "applets/register/prepay/notify",
  110. toWechatAttach,
  111. "注册服务",
  112. "JSAPI"
  113. );
  114. log.info("微信支付成功[end]");
  115. return params;
  116. }
  117. @Override
  118. @Transactional(rollbackFor = Throwable.class)
  119. public void prepayNotify(Map<String, String> map) throws Exception {
  120. /* 此处处理订单等业务逻辑 */
  121. // 获取订单 和 微信订单号 和 支付的金额
  122. String attach = Codec.DoBase64.custom().setData(map.get("attach")).decodeAsText();
  123. OrderAttach orderAttach = Jsons.parseObject(attach, OrderAttach.class);
  124. final Long oid = orderAttach.getO();
  125. //final Long shareId = orderAttach.getShared();
  126. RegisterOrderDon order = this.getById(oid);
  127. if (null == order) {
  128. throw BusinessRuntimeException.getInstance("订单不存在.");
  129. }
  130. // 校验签名
  131. boolean f = weChatService.checkSignWithMd5(map, weChatConfig.getShopKey());
  132. if (!f) {
  133. log.error("回调数据:{}", map);
  134. throw BusinessRuntimeException.getInstance("支付成功回调, 校验签名失败.");
  135. }
  136. String transactionId = map.get("transaction_id");
  137. if (order.getStatus().equals(RegisterOrderDon.Status.hasPayment)) {
  138. log.info("已回调,重复修改状态 id:{}", order.getId());
  139. return;
  140. }
  141. // 更改订单状态
  142. order.setTransactionId(transactionId);
  143. order.setStatus(RegisterOrderDon.Status.hasPayment);
  144. order.setPayTime(DateUtil.parse(map.get("time_end"), "yyyyMMddHHmmss"));
  145. if (StringUtils.isBlank(order.getOpenId())) {
  146. order.setOpenId(map.get("openid"));
  147. }
  148. this.updateById(order);
  149. }
  150. }