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.GoodsToLevelEnums; 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.MallMqRecord; import cc.mrbird.febs.mall.entity.MallOrderInfo; import cc.mrbird.febs.mall.entity.MallOrderItem; import cc.mrbird.febs.mall.mapper.MallMqRecordMapper; import cc.mrbird.febs.mall.mapper.MallOrderInfoMapper; import cc.mrbird.febs.mall.service.*; 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 MallOrderInfoMapper orderInfoMapper; @Autowired private WxPayService wxPayService; @Autowired private WxPayProperties wxPayProperties; @Autowired private AgentProducer agentProducer; @Autowired private IMallAchieveService mallAchieveService; @Autowired private IApiMallMemberService mallMemberService; @Autowired private IApiMallMemberWalletService memberWalletService; @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().subtract(orderInfo.getScoreAmount()).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); MallMember member = mallMemberService.getById(orderInfo.getMemberId()); // 商品级别 会员/代理/股东 int goodsLevel = 0; BigDecimal score = BigDecimal.ZERO; for (MallOrderItem item : orderInfo.getItems()) { // 计算静态倍数 if(item.getIsNormal() == 2) { score = score.add(item.getPrice().multiply(item.getStaticMulti())); } // 判断会员层级 if (item.getIsNormal() == 2 && goodsLevel < item.getGoodsLevel()) { goodsLevel = item.getGoodsLevel(); } mallAchieveService.add(item.getId()); } // 根据用户购买的商品设置其等级 member.setLevel(GoodsToLevelEnums.getLevelByAccountLevel(goodsLevel)); member.setAccountLevel(goodsLevel); this.mallMemberService.updateById(member); memberWalletService.add(score, member.getId(), "score"); //发送代理自动升级消息 agentProducer.sendAutoLevelUpMsg(orderInfo.getMemberId()); //发送直推返利消息 agentProducer.sendOrderReturn(orderInfo.getId()); // 发送分红消息 agentProducer.sendOrderBonus(orderInfo.getId()); } }