PayServiceImpl.java 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253
  1. package com.sckj.front.service.impl;
  2. import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
  3. import com.sckj.common.entity.RechargeOrder;
  4. import com.sckj.common.entity.setting.DevPayConfig;
  5. import com.sckj.common.entity.setting.DevPayWay;
  6. import com.sckj.common.entity.user.User;
  7. import com.sckj.common.entity.user.UserAuth;
  8. import com.sckj.common.enums.ClientEnum;
  9. import com.sckj.common.enums.LogMoneyEnum;
  10. import com.sckj.common.enums.PaymentEnum;
  11. import com.sckj.common.exception.OperateException;
  12. import com.sckj.common.exception.PaymentException;
  13. import com.sckj.common.mapper.RechargeOrderMapper;
  14. import com.sckj.common.mapper.log.LogMoneyMapper;
  15. import com.sckj.common.mapper.setting.DevPayConfigMapper;
  16. import com.sckj.common.mapper.setting.DevPayWayMapper;
  17. import com.sckj.common.mapper.user.UserAuthMapper;
  18. import com.sckj.common.mapper.user.UserMapper;
  19. import com.sckj.common.plugin.wechat.WxPayDriver;
  20. import com.sckj.common.plugin.wechat.request.PaymentRequestV3;
  21. import com.sckj.common.util.StringUtils;
  22. import com.sckj.common.util.TimeUtils;
  23. import com.sckj.common.util.UrlUtils;
  24. import com.sckj.front.service.IPayService;
  25. import com.sckj.front.validate.PaymentValidate;
  26. import com.sckj.front.vo.pay.PayStatusVo;
  27. import com.sckj.front.vo.pay.PayWayInfoVo;
  28. import com.sckj.front.vo.pay.PayWayListVo;
  29. import lombok.extern.slf4j.Slf4j;
  30. import org.springframework.stereotype.Service;
  31. import org.springframework.transaction.annotation.Transactional;
  32. import org.springframework.util.Assert;
  33. import javax.annotation.Resource;
  34. import java.util.*;
  35. @Slf4j
  36. @Service
  37. public class PayServiceImpl implements IPayService {
  38. @Resource
  39. UserMapper userMapper;
  40. @Resource
  41. UserAuthMapper userAuthMapper;
  42. @Resource
  43. DevPayWayMapper devPayWayMapper;
  44. @Resource
  45. DevPayConfigMapper devPayConfigMapper;
  46. @Resource
  47. RechargeOrderMapper rechargeOrderMapper;
  48. @Resource
  49. LogMoneyMapper logMoneyMapper;
  50. /**
  51. * 支付方式
  52. *
  53. * @author fzr
  54. * @param from 场景
  55. * @param orderId 订单ID
  56. * @param terminal 终端
  57. * @return List<PayWayListedVo>
  58. */
  59. @Override
  60. public PayWayListVo payWay(String from, Integer orderId, Integer terminal) {
  61. List<DevPayWay> devPayWays = devPayWayMapper.selectList(
  62. new QueryWrapper<DevPayWay>()
  63. .eq("scene", terminal)
  64. .eq("status", 1));
  65. PayWayListVo vo = new PayWayListVo();
  66. if (from.equals("recharge")) {
  67. RechargeOrder rechargeOrder = rechargeOrderMapper.selectById(orderId);
  68. vo.setOrderAmount(rechargeOrder.getOrderAmount());
  69. }
  70. Integer walletType = PaymentEnum.WALLET_PAY.getCode();
  71. List<PayWayInfoVo> list = new LinkedList<>();
  72. for (DevPayWay way : devPayWays) {
  73. if (from.equals("recharge") && way.getPayConfigId().equals(walletType)) {
  74. continue;
  75. }
  76. DevPayConfig devPayConfig = devPayConfigMapper.selectById(way.getPayConfigId());
  77. PayWayInfoVo infoVo = new PayWayInfoVo();
  78. infoVo.setId(devPayConfig.getId());
  79. infoVo.setName(devPayConfig.getName());
  80. infoVo.setIcon(UrlUtils.toAbsoluteUrl(devPayConfig.getIcon()));
  81. infoVo.setIsDefault(way.getIsDefault());
  82. list.add(infoVo);
  83. }
  84. vo.setList(list);
  85. return vo;
  86. }
  87. /**
  88. * 订单状态
  89. *
  90. * @author fzr
  91. * @param from 场景
  92. * @param orderId 订单ID
  93. * @return PayStatusVo
  94. */
  95. @Override
  96. public PayStatusVo payStatus(String from, Integer orderId) {
  97. PayStatusVo vo = new PayStatusVo();
  98. boolean orderExist = false;
  99. switch (from) {
  100. case "recharge":
  101. RechargeOrder rechargeOrder = rechargeOrderMapper.selectById(orderId);
  102. if (StringUtils.isNotNull(rechargeOrder)) {
  103. orderExist = true;
  104. vo.setPayStatus(rechargeOrder.getPayStatus());
  105. vo.setPayWay(PaymentEnum.getPayWayMsg(rechargeOrder.getPayWay()));
  106. vo.setOrderId(rechargeOrder.getId());
  107. vo.setOrderSn(rechargeOrder.getOrderSn());
  108. vo.setOrderAmount(rechargeOrder.getOrderAmount());
  109. vo.setPayTime(StringUtils.isNotEmpty(vo.getPayTime()) ? TimeUtils.timestampToDate(vo.getPayTime()) : "");
  110. }
  111. break;
  112. case "order":
  113. break;
  114. }
  115. if (!orderExist) {
  116. throw new OperateException("订单不存在!");
  117. }
  118. return vo;
  119. }
  120. /**
  121. * 发起支付
  122. *
  123. * @param params 参数
  124. * @param terminal 终端
  125. * @return Object
  126. */
  127. public Object prepay(PaymentValidate params, Integer terminal) {
  128. try {
  129. String openId = null;
  130. UserAuth userAuth = userAuthMapper.selectOne(new QueryWrapper<UserAuth>()
  131. .eq("user_id", params.getUserId())
  132. .eq("terminal", terminal)
  133. .last("limit 1"));
  134. if (StringUtils.isNotNull(userAuth)) {
  135. openId = userAuth.getOpenid();
  136. }
  137. switch (params.getPayWay()) {
  138. case 1: // 余额支付
  139. String attach = params.getAttach();
  140. String orderSn = params.getOutTradeNo();
  141. this.handlePaidNotify(attach, orderSn, null);
  142. return Collections.emptyList();
  143. case 2: // 微信支付
  144. PaymentRequestV3 requestV3 = new PaymentRequestV3();
  145. requestV3.setTerminal(terminal);
  146. requestV3.setOpenId(openId);
  147. requestV3.setAttach(params.getAttach());
  148. requestV3.setOutTradeNo(params.getOutTradeNo());
  149. requestV3.setOrderAmount(params.getOrderAmount());
  150. requestV3.setDescription(params.getDescription());
  151. Object result = WxPayDriver.unifiedOrder(requestV3);
  152. if (terminal == ClientEnum.H5.getCode()) {
  153. Assert.notNull(params.getRedirectUrl(), "redirectUrl参数缺失");
  154. Map<String, String> map = new LinkedHashMap<>();
  155. String h5Url = result.toString();
  156. map.put("url", h5Url);
  157. return map;
  158. }
  159. return WxPayDriver.unifiedOrder(requestV3);
  160. }
  161. } catch (Exception e) {
  162. throw new PaymentException(e.getMessage());
  163. }
  164. throw new PaymentException("支付发起异常");
  165. }
  166. /**
  167. * 支付回调处理
  168. *
  169. * @author fzr
  170. * @param attach 场景码
  171. * @param outTradeNo 订单编号
  172. * @param transactionId 流水号
  173. */
  174. @Override
  175. @Transactional
  176. public void handlePaidNotify(String attach, String outTradeNo, String transactionId) {
  177. switch (attach) {
  178. case "order":
  179. break;
  180. case "recharge":
  181. this.rechargeCallback(outTradeNo, transactionId);
  182. break;
  183. }
  184. }
  185. /**
  186. * 余额充值回调
  187. *
  188. * @author fzr
  189. * @param outTradeNo 订单号
  190. * @param transactionId 流水号
  191. */
  192. private void rechargeCallback(String outTradeNo, String transactionId) {
  193. for (int i=0; i<=0; i++) {
  194. RechargeOrder rechargeOrder = rechargeOrderMapper.selectOne(
  195. new QueryWrapper<RechargeOrder>()
  196. .eq("order_sn", outTradeNo)
  197. .last("limit 1"));
  198. if (StringUtils.isNull(rechargeOrder)) {
  199. log.error("充值订单不存在: {} : {}", outTradeNo, transactionId);
  200. break;
  201. }
  202. if (rechargeOrder.getPayStatus().equals(PaymentEnum.OK_PAID.getCode())) {
  203. log.error("充值订单已支付: {} : {}", outTradeNo, transactionId);
  204. break;
  205. }
  206. rechargeOrder.setPayStatus(1);
  207. rechargeOrder.setTransactionId(transactionId);
  208. rechargeOrder.setPayTime(System.currentTimeMillis() / 1000);
  209. rechargeOrder.setUpdateTime(System.currentTimeMillis() / 1000);
  210. rechargeOrderMapper.updateById(rechargeOrder);
  211. User user = userMapper.selectById(rechargeOrder.getUserId());
  212. user.setMoney(user.getMoney().add(rechargeOrder.getOrderAmount()));
  213. user.setUpdateTime(System.currentTimeMillis() / 1000);
  214. userMapper.updateById(user);
  215. logMoneyMapper.add(rechargeOrder.getUserId(),
  216. LogMoneyEnum.UM_INC_RECHARGE.getCode(),
  217. rechargeOrder.getOrderAmount(),
  218. rechargeOrder.getId(),
  219. rechargeOrder.getOrderSn(),
  220. "用户充值余额", null);
  221. }
  222. }
  223. }