PayService.java 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192
  1. package com.tendbird.payserver.pay.service;
  2. import com.tendbird.payserver.pay.domain.PayConfig;
  3. import com.tendbird.payserver.pay.domain.PayOrder;
  4. import com.tendbird.payserver.pay.domain.PayResponse;
  5. import com.tendbird.payserver.pay.mapper.PayConfigMapper;
  6. import com.tendbird.payserver.pay.mapper.PayOrderMapper;
  7. import com.tendpay.sdk.response.PayOrderCreateResponse;
  8. import com.tendpay.sdk.response.PayOrderQueryResponse;
  9. import com.tendpay.sdk.response.RefundOrderCreateResponse;
  10. import lombok.extern.slf4j.Slf4j;
  11. import org.springframework.beans.factory.annotation.Autowired;
  12. import org.springframework.security.core.parameters.P;
  13. import org.springframework.stereotype.Service;
  14. import org.springframework.util.ObjectUtils;
  15. import java.util.Date;
  16. import java.util.Random;
  17. @Slf4j
  18. @Service
  19. public class PayService {
  20. @Autowired
  21. private PayOrderMapper payOrderMapper;
  22. @Autowired
  23. private PayConfigMapper payConfigMapper;
  24. public PayConfig getPayConfig(String appId) throws Exception {
  25. PayConfig payConfig = payConfigMapper.findByappId(appId);
  26. log.info("findPayConfig: {}", payConfig);
  27. if (ObjectUtils.isEmpty(payConfig)) {
  28. throw new Exception("获取支付参数错误!");
  29. }
  30. return payConfig;
  31. }
  32. public PayOrder getByAuthCode(String payFlag, PayOrder payOrder) {
  33. return payOrderMapper.findByAuthCode(payFlag, payOrder.getAuthCode());
  34. }
  35. public PayResponse doTradePay(PayOrder payOrder) throws Exception {
  36. PayConfig payConfig = getPayConfig(payOrder.getAppId());
  37. //保存单据
  38. if (ObjectUtils.isEmpty(payOrder.getMchOrderNo())) {
  39. payOrder.setMchOrderNo(getId());
  40. }
  41. payOrder.setPayTime(new Date());
  42. payOrder.setPayFlag("1");
  43. payOrder.setStatus(PayOrder.STATE_ORDER_INIT);
  44. switch (payOrder.getWayCode()) {
  45. case "CASH":
  46. case "WXPAY":
  47. case "ALIPAY":
  48. case "BANKPAY":
  49. //现金、银行卡、微信已收款、支付宝已收款直接保存
  50. payOrder.setStatus(PayOrder.STATE_ORDER_SUCCESS);
  51. payOrder.setPayTime(new Date());
  52. payOrder.setOrderId(payOrder.getMchOrderId());
  53. payOrder.setAuthCode(payOrder.getMchOrderId());
  54. payOrderMapper.save(payOrder);
  55. break;
  56. default:
  57. //移动支付先保存数据,再进行支付处理
  58. payOrderMapper.save(payOrder);
  59. try {
  60. PayOrderCreateResponse payOrderCreateResponse = PayUtils.doTradePay(payConfig, payOrder);
  61. if (!ObjectUtils.isEmpty(payOrderCreateResponse)) {
  62. String orderNo = payOrderCreateResponse.get().getMchOrderNo();
  63. String payOrderId = payOrderCreateResponse.get().getPayOrderId();
  64. //判断是否返回成功
  65. if (payOrderCreateResponse.get().getOrderState() == PayOrder.STATE_ORDER_SUCCESS) {
  66. payOrder.setOrderId(payOrderId);
  67. payOrder.setStatus(payOrderCreateResponse.get().getOrderState());
  68. payOrder.setPayTime(new Date());
  69. payOrder.setErrCode(payOrderCreateResponse.get().getErrCode());
  70. payOrder.setErrMsg(payOrderCreateResponse.get().getErrMsg());
  71. payOrderMapper.update(payOrder);
  72. } else {
  73. PayOrderQueryResponse result = PayUtils.doTradePayQuery(payConfig, orderNo, payOrderId);
  74. if (!ObjectUtils.isEmpty(result)) {
  75. payOrder.setOrderId(result.get().getPayOrderId());
  76. payOrder.setStatus(result.get().getState());
  77. payOrder.setPayTime(new Date());
  78. payOrder.setErrCode(payOrderCreateResponse.get().getErrCode());
  79. payOrder.setErrMsg(payOrderCreateResponse.get().getErrMsg());
  80. payOrderMapper.update(payOrder);
  81. }
  82. }
  83. }
  84. } catch (Exception e) {
  85. payOrder.setOrderId("");
  86. payOrder.setStatus(PayOrder.STATE_ORDER_FAIL);
  87. payOrder.setPayTime(new Date());
  88. payOrder.setErrCode("9999");
  89. payOrder.setErrMsg(e.getMessage());
  90. payOrderMapper.update(payOrder);
  91. }
  92. }
  93. PayResponse response = new PayResponse();
  94. response.setMchOrderId(payOrder.getMchOrderId());
  95. response.setMchOrderNo(payOrder.getMchOrderNo());
  96. response.setOrderId(payOrder.getOrderId());
  97. response.setState(payOrder.getStatus());
  98. response.setErrCode(payOrder.getErrCode());
  99. response.setErrMsg(payOrder.getErrMsg());
  100. if (response.getState() == PayOrder.STATE_ORDER_SUCCESS) {
  101. return response;
  102. } else {
  103. throw new Exception(response.getErrMsg());
  104. }
  105. }
  106. public PayResponse doTradePayRefund(PayOrder payOrder) throws Exception {
  107. PayConfig payConfig = getPayConfig(payOrder.getAppId());
  108. PayOrder refundOrder = getByAuthCode("2", payOrder);
  109. if (ObjectUtils.isEmpty(refundOrder)) {
  110. //保存单据
  111. if (ObjectUtils.isEmpty(payOrder.getMchOrderId()) &&
  112. ObjectUtils.isEmpty(payOrder.getMchOrderNo())) {
  113. payOrder.setMchOrderId(getId());
  114. payOrder.setMchOrderNo(payOrder.getMchOrderId());
  115. } else if (ObjectUtils.isEmpty(payOrder.getMchOrderId())) {
  116. payOrder.setMchOrderId(getId());
  117. } else if (ObjectUtils.isEmpty(payOrder.getMchOrderNo())) {
  118. payOrder.setMchOrderNo(getId());
  119. }
  120. switch (payOrder.getWayCode()) {
  121. case "CASH":
  122. case "WXPAY":
  123. case "ALIPAY":
  124. case "BANKPAY":
  125. //现金、银行卡、微信已收款、支付宝已收款直接保存
  126. payOrder.setPayTime(new Date());
  127. payOrder.setStatus(PayOrder.STATE_REFUND_SUCCESS);
  128. payOrder.setOrderId(payOrder.getMchOrderId());
  129. payOrder.setPayFlag("2");
  130. payOrderMapper.save(payOrder);
  131. break;
  132. default:
  133. //移动支付
  134. payOrder.setPayTime(new Date());
  135. payOrder.setStatus(PayOrder.STATE_REFUND_INIT);
  136. payOrder.setPayFlag("2");
  137. payOrderMapper.save(payOrder);
  138. try {
  139. RefundOrderCreateResponse response = PayUtils.doTradePayRefund(payConfig, payOrder);
  140. if (!ObjectUtils.isEmpty(response)) {
  141. payOrder.setOrderId(response.get().getRefundOrderId());
  142. payOrder.setStatus(response.get().getState());
  143. payOrder.setPayTime(new Date());
  144. payOrder.setErrCode(response.get().getErrCode());
  145. payOrder.setErrMsg(response.get().getErrMsg());
  146. payOrderMapper.update(payOrder);
  147. }
  148. } catch (Exception e) {
  149. log.info("错误信息:{}", e.getMessage());
  150. payOrder.setStatus(PayOrder.STATE_REFUND_FAIL);
  151. payOrder.setErrCode("9999");
  152. payOrder.setErrMsg(e.getMessage());
  153. payOrder.setPayTime(new Date());
  154. payOrderMapper.update(payOrder);
  155. throw new Exception(e.getMessage());
  156. }
  157. }
  158. } else {
  159. throw new Exception("已经生成退款数据,不能再次退款!");
  160. }
  161. PayResponse response = new PayResponse();
  162. response.setMchOrderId(payOrder.getMchOrderId());
  163. response.setMchOrderNo(payOrder.getMchOrderNo());
  164. response.setState(payOrder.getStatus());
  165. response.setOrderId(payOrder.getOrderId());
  166. response.setErrCode(payOrder.getErrCode());
  167. response.setErrMsg(payOrder.getErrMsg());
  168. //若是成功或退款中状态,表示退款成功
  169. if (response.getState() == PayOrder.STATE_REFUND_SUCCESS ||
  170. response.getState() == PayOrder.STATE_REFUND_ING) {
  171. response.setState(PayOrder.STATE_REFUND_SUCCESS);
  172. return response;
  173. } else {
  174. throw new Exception(response.getErrMsg());
  175. }
  176. }
  177. public String getId() {
  178. long simple = System.currentTimeMillis();
  179. int random = new Random().nextInt(900) + 100;
  180. return Long.toString(simple) + random;
  181. }
  182. }