package cc.mrbird.febs.pay.service.impl;
|
|
import cc.mrbird.febs.common.enumerates.AgentLevelEnum;
|
import cc.mrbird.febs.common.enumerates.FlowTypeEnum;
|
import cc.mrbird.febs.common.enumerates.MoneyFlowTypeEnum;
|
import cc.mrbird.febs.common.enumerates.OrderStatusEnum;
|
import cc.mrbird.febs.common.exception.FebsException;
|
import cc.mrbird.febs.mall.entity.MallMember;
|
import cc.mrbird.febs.mall.entity.MallOrderInfo;
|
import cc.mrbird.febs.mall.mapper.MallMoneyFlowMapper;
|
import cc.mrbird.febs.mall.mapper.MallOrderInfoMapper;
|
import cc.mrbird.febs.mall.service.IApiMallMemberService;
|
import cc.mrbird.febs.mall.service.IApiMallOrderInfoService;
|
import cc.mrbird.febs.mall.service.ICommonService;
|
import cc.mrbird.febs.mall.service.IMallMoneyFlowService;
|
import cc.mrbird.febs.pay.properties.WxPayProperties;
|
import cc.mrbird.febs.pay.service.IPayService;
|
import cc.mrbird.febs.rabbit.producter.AgentProducer;
|
import cn.hutool.core.date.DateField;
|
import cn.hutool.core.date.DatePattern;
|
import cn.hutool.core.date.DateUnit;
|
import cn.hutool.core.date.DateUtil;
|
import cn.hutool.core.util.RandomUtil;
|
import com.alibaba.fastjson.JSONObject;
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
import com.github.binarywang.wxpay.bean.order.WxPayAppOrderResult;
|
import com.github.binarywang.wxpay.bean.request.WxPayUnifiedOrderRequest;
|
import com.github.binarywang.wxpay.exception.WxPayException;
|
import com.github.binarywang.wxpay.service.WxPayService;
|
import lombok.RequiredArgsConstructor;
|
import lombok.extern.slf4j.Slf4j;
|
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Value;
|
import org.springframework.stereotype.Service;
|
import org.springframework.transaction.annotation.Transactional;
|
|
import java.math.BigDecimal;
|
import java.util.Date;
|
import java.util.Map;
|
|
/**
|
* @author wzy
|
* @date 2023-04-07
|
**/
|
@Slf4j
|
@Service("wechatPayService")
|
@RequiredArgsConstructor
|
public class WxPayServiceImpl implements IPayService {
|
|
@Autowired
|
private ICommonService commonService;
|
|
@Autowired
|
private MallOrderInfoMapper orderInfoMapper;
|
|
private WxPayService wxPayService = new com.github.binarywang.wxpay.service.impl.WxPayServiceImpl();
|
|
@Autowired
|
private WxPayProperties wxPayProperties;
|
|
@Autowired
|
private AgentProducer agentProducer;
|
|
@Autowired
|
private IMallMoneyFlowService mallMoneyFlowService;
|
|
@Value("${spring.profiles.active}")
|
private String active;
|
|
@Override
|
public String pay(MallOrderInfo orderInfo) {
|
WxPayUnifiedOrderRequest request = new WxPayUnifiedOrderRequest();
|
request.setAppid(wxPayProperties.getAppId());
|
request.setMchId(wxPayProperties.getMchId());
|
request.setNotifyUrl(wxPayProperties.getNoticeUrl());
|
request.setBody(orderInfo.getName());
|
request.setOutTradeNo(orderInfo.getOrderNo());
|
request.setTimeExpire(DateUtil.format(DateUtil.offset(new Date(), DateField.MINUTE, 15), DatePattern.PURE_DATETIME_PATTERN));
|
request.setSpbillCreateIp("127.0.0.1");
|
request.setTradeType("APP");
|
|
if ("dev".equals(active) || "test".equals(active)) {
|
request.setTotalFee(1);
|
} else {
|
request.setTotalFee(orderInfo.getAmount().add(orderInfo.getCarriage()).multiply(new BigDecimal(100)).intValue());
|
}
|
|
try {
|
WxPayAppOrderResult result = wxPayService.createOrder(request);
|
return JSONObject.toJSONString(result);
|
} catch (WxPayException e) {
|
e.printStackTrace();
|
throw new FebsException("支付异常, 请检查");
|
}
|
}
|
|
@Override
|
@Transactional(rollbackFor = Exception.class)
|
public void payCallback(Map<String, String> params) {
|
String orderNo = params.get("out_trade_no");
|
|
LambdaQueryWrapper<MallOrderInfo> query = new LambdaQueryWrapper<>();
|
query.eq(MallOrderInfo::getOrderNo, orderNo);
|
MallOrderInfo orderInfo = this.orderInfoMapper.selectOne(query);
|
if ("1".equals(orderInfo.getPayResult())) {
|
return;
|
}
|
|
orderInfo.setStatus(OrderStatusEnum.WAIT_SHIPPING.getValue());
|
orderInfo.setPayResult("1");
|
orderInfo.setPayTime(new Date());
|
orderInfo.setPayTradeNo(params.get("transaction_id"));
|
orderInfoMapper.updateById(orderInfo);
|
|
commonService.addAchieveAndUpdateLevel(orderInfo.getId(),orderInfo.getMemberId());
|
mallMoneyFlowService.addMoneyFlow(orderInfo.getMemberId(), orderInfo.getAmount().negate(), MoneyFlowTypeEnum.PAY.getValue(), orderInfo.getOrderNo(), FlowTypeEnum.WX.getValue());
|
agentProducer.sendAutoLevelUpMsg(orderInfo.getMemberId());
|
agentProducer.sendReturnMoneyMsg(orderInfo.getId());
|
|
}
|
}
|