package com.izouma.jiashanxia.service; import com.github.binarywang.wxpay.bean.order.WxPayMpOrderResult; import com.github.binarywang.wxpay.bean.request.WxPayUnifiedOrderRequest; import com.github.binarywang.wxpay.constant.WxPayConstants; import com.github.binarywang.wxpay.exception.WxPayException; import com.github.binarywang.wxpay.service.WxPayService; import com.izouma.jiashanxia.domain.OrderInfo; import com.izouma.jiashanxia.domain.User; import com.izouma.jiashanxia.exception.BusinessException; import com.izouma.jiashanxia.repo.OrderInfoRepo; import com.izouma.jiashanxia.repo.UserRepo; import com.izouma.jiashanxia.utils.JsonUtils; import com.izouma.jiashanxia.utils.SnowflakeIdWorker; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.core.env.Environment; import org.springframework.stereotype.Service; import java.math.BigDecimal; import java.util.Arrays; @Service @Slf4j public class ConsumptionService { @Autowired private UserRepo userRepo; @Autowired private OrderInfoRepo orderInfoRepo; @Value("${wx.pay.notifyUrl}") private String wxNotifyUrl; @Autowired private Environment environment; @Autowired private WxPayService wxPayService; /* 微信支付 */ public WxPayMpOrderResult payOrder(Long userId, Long orderId) { User user = userRepo.findById(userId).orElseThrow(new BusinessException("用户不存在")); OrderInfo orders = orderInfoRepo.findById(orderId).orElseThrow(new BusinessException("订单错误")); String body = orders.getName(); WxPayUnifiedOrderRequest request = new WxPayUnifiedOrderRequest(); request.setBody(body); //订单号 request.setOutTradeNo(String.valueOf(new SnowflakeIdWorker(1, 1).nextId())); //分为单位 request.setTotalFee(orders.getPrice().multiply(BigDecimal.valueOf(100)).intValue()); if (Arrays.stream(environment.getActiveProfiles()).noneMatch(s -> s.equals("prod"))) { request.setTotalFee(1); } request.setOpenid(user.getOpenId()); request.setNotifyUrl(wxNotifyUrl); request.setSpbillCreateIp("180.102.110.170"); request.setTradeType(WxPayConstants.TradeType.JSAPI); request.setSignType("MD5"); request.setAttach(new JsonUtils.Builder() .add("type", "member") .add("orderId", orderId) .add("userId", userId) .add("amount", orders.getPrice()) .build()); try { return wxPayService.createOrder(request); } catch (WxPayException e) { log.info("微信支付异常", e); throw new BusinessException(e.getMessage()); } } }