package com.tendbird.payserver.pay.service; import com.tendbird.payserver.pay.domain.PayConfig; import com.tendbird.payserver.pay.domain.PayOrder; import com.tendbird.payserver.pay.domain.PayResponse; import com.tendbird.payserver.pay.mapper.PayConfigMapper; import com.tendbird.payserver.pay.mapper.PayOrderMapper; import com.tendpay.sdk.response.PayOrderCreateResponse; import com.tendpay.sdk.response.PayOrderQueryResponse; import com.tendpay.sdk.response.RefundOrderCreateResponse; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.core.parameters.P; import org.springframework.stereotype.Service; import org.springframework.util.ObjectUtils; import java.util.Date; import java.util.Random; @Slf4j @Service public class PayService { @Autowired private PayOrderMapper payOrderMapper; @Autowired private PayConfigMapper payConfigMapper; public PayConfig getPayConfig(String appId) throws Exception { PayConfig payConfig = payConfigMapper.findByappId(appId); log.info("findPayConfig: {}", payConfig); if (ObjectUtils.isEmpty(payConfig)) { throw new Exception("获取支付参数错误!"); } return payConfig; } public PayOrder getByAuthCode(String payFlag, PayOrder payOrder) { return payOrderMapper.findByAuthCode(payFlag, payOrder.getAuthCode()); } public PayResponse doTradePay(PayOrder payOrder) throws Exception { PayConfig payConfig = getPayConfig(payOrder.getAppId()); //保存单据 if (ObjectUtils.isEmpty(payOrder.getMchOrderNo())) { payOrder.setMchOrderNo(getId()); } payOrder.setPayTime(new Date()); payOrder.setPayFlag("1"); payOrder.setStatus(PayOrder.STATE_ORDER_INIT); switch (payOrder.getWayCode()) { case "CASH": case "WXPAY": case "ALIPAY": case "BANKPAY": //现金、银行卡、微信已收款、支付宝已收款直接保存 payOrder.setStatus(PayOrder.STATE_ORDER_SUCCESS); payOrder.setPayTime(new Date()); payOrder.setOrderId(payOrder.getMchOrderId()); payOrder.setAuthCode(payOrder.getMchOrderId()); payOrderMapper.save(payOrder); break; default: //移动支付先保存数据,再进行支付处理 payOrderMapper.save(payOrder); try { PayOrderCreateResponse payOrderCreateResponse = PayUtils.doTradePay(payConfig, payOrder); if (!ObjectUtils.isEmpty(payOrderCreateResponse)) { String orderNo = payOrderCreateResponse.get().getMchOrderNo(); String payOrderId = payOrderCreateResponse.get().getPayOrderId(); //判断是否返回成功 if (payOrderCreateResponse.get().getOrderState() == PayOrder.STATE_ORDER_SUCCESS) { payOrder.setOrderId(payOrderId); payOrder.setStatus(payOrderCreateResponse.get().getOrderState()); payOrder.setPayTime(new Date()); payOrder.setErrCode(payOrderCreateResponse.get().getErrCode()); payOrder.setErrMsg(payOrderCreateResponse.get().getErrMsg()); payOrderMapper.update(payOrder); } else { PayOrderQueryResponse result = PayUtils.doTradePayQuery(payConfig, orderNo, payOrderId); if (!ObjectUtils.isEmpty(result)) { payOrder.setOrderId(result.get().getPayOrderId()); payOrder.setStatus(result.get().getState()); payOrder.setPayTime(new Date()); payOrder.setErrCode(payOrderCreateResponse.get().getErrCode()); payOrder.setErrMsg(payOrderCreateResponse.get().getErrMsg()); payOrderMapper.update(payOrder); } } } } catch (Exception e) { payOrder.setOrderId(""); payOrder.setStatus(PayOrder.STATE_ORDER_FAIL); payOrder.setPayTime(new Date()); payOrder.setErrCode("9999"); payOrder.setErrMsg(e.getMessage()); payOrderMapper.update(payOrder); } } PayResponse response = new PayResponse(); response.setMchOrderId(payOrder.getMchOrderId()); response.setMchOrderNo(payOrder.getMchOrderNo()); response.setOrderId(payOrder.getOrderId()); response.setState(payOrder.getStatus()); response.setErrCode(payOrder.getErrCode()); response.setErrMsg(payOrder.getErrMsg()); if (response.getState() == PayOrder.STATE_ORDER_SUCCESS) { return response; } else { throw new Exception(response.getErrMsg()); } } public PayResponse doTradePayRefund(PayOrder payOrder) throws Exception { PayConfig payConfig = getPayConfig(payOrder.getAppId()); PayOrder refundOrder = getByAuthCode("2", payOrder); if (ObjectUtils.isEmpty(refundOrder)) { //保存单据 if (ObjectUtils.isEmpty(payOrder.getMchOrderId()) && ObjectUtils.isEmpty(payOrder.getMchOrderNo())) { payOrder.setMchOrderId(getId()); payOrder.setMchOrderNo(payOrder.getMchOrderId()); } else if (ObjectUtils.isEmpty(payOrder.getMchOrderId())) { payOrder.setMchOrderId(getId()); } else if (ObjectUtils.isEmpty(payOrder.getMchOrderNo())) { payOrder.setMchOrderNo(getId()); } switch (payOrder.getWayCode()) { case "CASH": case "WXPAY": case "ALIPAY": case "BANKPAY": //现金、银行卡、微信已收款、支付宝已收款直接保存 payOrder.setPayTime(new Date()); payOrder.setStatus(PayOrder.STATE_REFUND_SUCCESS); payOrder.setOrderId(payOrder.getMchOrderId()); payOrder.setPayFlag("2"); payOrderMapper.save(payOrder); break; default: //移动支付 payOrder.setPayTime(new Date()); payOrder.setStatus(PayOrder.STATE_REFUND_INIT); payOrder.setPayFlag("2"); payOrderMapper.save(payOrder); try { RefundOrderCreateResponse response = PayUtils.doTradePayRefund(payConfig, payOrder); if (!ObjectUtils.isEmpty(response)) { payOrder.setOrderId(response.get().getRefundOrderId()); payOrder.setStatus(response.get().getState()); payOrder.setPayTime(new Date()); payOrder.setErrCode(response.get().getErrCode()); payOrder.setErrMsg(response.get().getErrMsg()); payOrderMapper.update(payOrder); } } catch (Exception e) { log.info("错误信息:{}", e.getMessage()); payOrder.setStatus(PayOrder.STATE_REFUND_FAIL); payOrder.setErrCode("9999"); payOrder.setErrMsg(e.getMessage()); payOrder.setPayTime(new Date()); payOrderMapper.update(payOrder); throw new Exception(e.getMessage()); } } } else { throw new Exception("已经生成退款数据,不能再次退款!"); } PayResponse response = new PayResponse(); response.setMchOrderId(payOrder.getMchOrderId()); response.setMchOrderNo(payOrder.getMchOrderNo()); response.setState(payOrder.getStatus()); response.setOrderId(payOrder.getOrderId()); response.setErrCode(payOrder.getErrCode()); response.setErrMsg(payOrder.getErrMsg()); //若是成功或退款中状态,表示退款成功 if (response.getState() == PayOrder.STATE_REFUND_SUCCESS || response.getState() == PayOrder.STATE_REFUND_ING) { response.setState(PayOrder.STATE_REFUND_SUCCESS); return response; } else { throw new Exception(response.getErrMsg()); } } public String getId() { long simple = System.currentTimeMillis(); int random = new Random().nextInt(900) + 100; return Long.toString(simple) + random; } }