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; @Autowired private WxPayService wxPayService; @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 params) { String orderNo = params.get("out_trade_no"); LambdaQueryWrapper 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()); } }