RegisterOrderDonServiceImpl.java 6.0 KB

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