package cc.mrbird.febs.pay.service.impl; import cc.mrbird.febs.common.properties.XcxProperties; import cc.mrbird.febs.common.utils.RedisUtils; import cc.mrbird.febs.common.utils.SpringContextHolder; import cc.mrbird.febs.mall.entity.MallMember; import cc.mrbird.febs.mall.entity.MallOrderInfo; import cc.mrbird.febs.mall.entity.MallOrderItem; import cc.mrbird.febs.mall.mapper.MallMemberMapper; import cc.mrbird.febs.mall.mapper.MallOrderInfoMapper; import cc.mrbird.febs.pay.model.BrandWCPayRequestData; import cc.mrbird.febs.pay.model.OrderStateDto; import cc.mrbird.febs.pay.model.OrderStateMsgVo; import cc.mrbird.febs.pay.model.WxTemplateData; import cc.mrbird.febs.pay.service.IXcxPayService; import cc.mrbird.febs.pay.util.WechatConfigure; import cc.mrbird.febs.pay.util.WeixinServiceUtil; import cn.hutool.log.Log; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections.CollectionUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Service; import org.springframework.web.client.RestTemplate; import java.math.BigDecimal; import java.util.HashMap; import java.util.List; import java.util.Map; @Slf4j @Service public class XcxPayServiceImpl implements IXcxPayService { @Autowired MallOrderInfoMapper mallOrderInfoMapper; @Autowired MallMemberMapper mallMemberMapper; @Autowired WeixinServiceUtil weixinServiceUtil; @Autowired RedisUtils redisUtils; @Autowired private SpringContextHolder springContextHolder; private final XcxProperties xcxProperties = SpringContextHolder.getBean(XcxProperties.class); @Override public BrandWCPayRequestData startPayment(MallOrderInfo mallOrderInfo) throws Exception { BigDecimal unit = new BigDecimal("100"); BigDecimal money = new BigDecimal(mallOrderInfo.getAmount().toString()); BrandWCPayRequestData payData; String productNames = getProductNames(mallOrderInfo.getMemberId(), mallOrderInfo.getId()); MallMember mallMember = mallMemberMapper.selectById(mallOrderInfo.getMemberId()); Boolean debug = xcxProperties.getDebug(); if (debug) { payData = weixinServiceUtil.createOrder("[测试]" + productNames, mallOrderInfo.getOrderNo(), 1, mallMember.getOpenId(), String.valueOf(mallOrderInfo.getId())); } else { payData = weixinServiceUtil.createOrder(productNames, mallOrderInfo.getOrderNo(), unit.multiply(money).intValue(),mallMember.getOpenId(), String.valueOf(mallOrderInfo.getId())); } mallOrderInfo.setWxOrderNo(payData.getPrepay_id()); mallOrderInfoMapper.updateById(mallOrderInfo); return payData; } @Override public String pushOrderToAddress(OrderStateDto info) { RestTemplate restTemplate = new RestTemplate(); String url = WechatConfigure.SEND_INFO_URL + redisUtils.get(WechatConfigure.WX_ACCESS_TOKEN_REDIS_KEY); //拼接推送的模版 OrderStateMsgVo orderStateMsgVo = new OrderStateMsgVo(); orderStateMsgVo.setToUser(info.getOpenId());//用户的openId orderStateMsgVo.setTemplateId(info.getTemplateId());//订阅消息模板id // wxMssVo.setPage("pages/appointment/line_up?"+"shopId="+info.getShopId()); Map m = new HashMap<>(5); m.put("character_string1", new WxTemplateData(info.getOrderNo())); m.put("thing9", new WxTemplateData(info.getGoodsName())); m.put("phrase2", new WxTemplateData(info.getOrderState())); m.put("thing13", new WxTemplateData(info.getAddressArea())); m.put("thing16", new WxTemplateData(info.getTakeCode())); orderStateMsgVo.setData(m); ResponseEntity responseEntity = restTemplate.postForEntity(url, orderStateMsgVo, String.class); return responseEntity.getBody(); } /** * 根据用户ID和订单ID获取所购买商品名称 * @return 所含商品名称(多个以","隔开) */ public String getProductNames(Long memberId, Long orderId) { MallOrderInfo mallOrderInfo = mallOrderInfoMapper.selectOrderByMemberIdAndId(memberId, orderId); List details = mallOrderInfo.getItems(); if (CollectionUtils.isEmpty(details)) { return ""; } StringBuffer productNameBuffer = new StringBuffer(); Integer maxLength = 30; for (int i = 0; i< details.size(); i++) { MallOrderItem mallOrderItem = details.get(i); String goodsName = mallOrderItem.getGoodsName(); if (goodsName == null) { continue; } if (i == 0 && goodsName.length() > maxLength) { productNameBuffer.append(goodsName.substring(0, maxLength) + "..."); break; } if ((productNameBuffer.length() + goodsName.length()) > maxLength) { productNameBuffer.append("等"); break; } productNameBuffer.append(goodsName + ","); } String productNames = productNameBuffer.toString(); if (productNames.endsWith(",")) { productNames = productNames.substring(0, productNames.length() - 1); } if (productNames.endsWith(",等")) { productNames = productNames.substring(0, productNames.length() - 2) + "等"; } return productNames; } }