pom.xml
@@ -323,6 +323,12 @@ <artifactId>poi-ooxml-schemas</artifactId> <version>3.8</version> </dependency> <!-- 微信支付 --> <dependency> <groupId>com.github.binarywang</groupId> <artifactId>weixin-java-pay</artifactId> <version>4.4.0</version> </dependency> </dependencies> <build> src/main/java/cc/mrbird/febs/common/enumerates/FlowTypeEnum.java
@@ -25,7 +25,11 @@ /** * 佣金 */ COMMISSION(4); COMMISSION(4), /** * 微信支付 */ WX(5); private final int value; src/main/java/cc/mrbird/febs/mall/service/ICommonService.java
@@ -21,4 +21,6 @@ void updateDataDic(String type, String code, String value); void addAchieveAndUpdateLevel(Long orderId,Long memberId); } src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallOrderInfoServiceImpl.java
@@ -19,8 +19,8 @@ import cc.mrbird.febs.mall.vo.OrderListVo; import cc.mrbird.febs.mall.vo.OrderRefundVo; import cc.mrbird.febs.pay.model.AgreementPayDto; import cc.mrbird.febs.pay.model.AgreementSignDto; import cc.mrbird.febs.pay.model.UnipayDto; import cc.mrbird.febs.pay.service.AliIPayService; import cc.mrbird.febs.pay.service.IPayService; import cc.mrbird.febs.pay.service.UnipayService; import cc.mrbird.febs.rabbit.producter.AgentProducer; @@ -37,7 +37,6 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -70,7 +69,7 @@ private final RedisUtils redisUtils; private final AgentProducer agentProducer; private final IPayService payService; private final AliIPayService payService; private final IMallAchieveService mallAchieveService; private final MallAchieveRecordMapper mallAchieveRecordMapper; private final UnipayService unipayService; @@ -78,6 +77,8 @@ private final MallMemberBankSignMapper mallMemberBankSignMapper; private final MallMemberBankMapper mallMemberBankMapper; private final MallShopApplyMapper mallShopApplyMapper; private final IPayService wechatPayService; private final ICommonService commonService; @Override @Transactional(rollbackFor = Exception.class) @@ -261,32 +262,45 @@ String rcResult = ""; switch (payOrderDto.getType()) { case "1": UnipayDto unipayDtoWx = new UnipayDto(); // unipayDto.setAmount(new BigDecimal("0.01")); unipayDtoWx.setAmount(orderInfo.getAmount()); unipayDtoWx.setFrpCode("WEIXIN_APP3"); unipayDtoWx.setTradeMerchantNo("777180800385820"); unipayDtoWx.setOrderNo(orderInfo.getOrderNo()); List<MallOrderItem> itemsWx = orderInfo.getItems(); if(CollUtil.isEmpty(itemsWx)){ unipayDtoWx.setProductName("商品"); orderInfo.setName("商品"); }else{ unipayDtoWx.setProductName(itemsWx.get(0).getGoodsName()); orderInfo.setName(itemsWx.get(0).getGoodsName()); } String unipayStrWx = unipayService.unipay(unipayDtoWx); if("fail" == unipayStrWx){ throw new FebsException("支付失败"); }else{ // JSONUtil.parseObj(unipayStr); JSONObject jsonObject = JSONUtil.parseObj(unipayStrWx); payResultStr = (String) jsonObject.get("r7_TrxNo"); rcResult = (String) jsonObject.get("rc_Result"); } payResultStr = wechatPayService.pay(orderInfo); orderInfo.setPayOrderNo(payResultStr); // orderInfo.setPayOrderNo(payOrderDto.getPayOrderNo()); // orderInfo.setPayImage(payOrderDto.getPayImage()); orderInfo.setPayMethod("微信支付"); orderInfo.setPayResult("2"); break; // case "1": // UnipayDto unipayDtoWx = new UnipayDto(); //// unipayDto.setAmount(new BigDecimal("0.01")); // unipayDtoWx.setAmount(orderInfo.getAmount()); // unipayDtoWx.setFrpCode("WEIXIN_APP3"); // unipayDtoWx.setTradeMerchantNo("777180800385820"); // unipayDtoWx.setOrderNo(orderInfo.getOrderNo()); // List<MallOrderItem> itemsWx = orderInfo.getItems(); // if(CollUtil.isEmpty(itemsWx)){ // unipayDtoWx.setProductName("商品"); // }else{ // unipayDtoWx.setProductName(itemsWx.get(0).getGoodsName()); // } // String unipayStrWx = unipayService.unipay(unipayDtoWx); // if("fail" == unipayStrWx){ // throw new FebsException("支付失败"); // }else{ //// JSONUtil.parseObj(unipayStr); // JSONObject jsonObject = JSONUtil.parseObj(unipayStrWx); // payResultStr = (String) jsonObject.get("r7_TrxNo"); // rcResult = (String) jsonObject.get("rc_Result"); // } // orderInfo.setPayOrderNo(payResultStr); //// orderInfo.setPayOrderNo(payOrderDto.getPayOrderNo()); //// orderInfo.setPayImage(payOrderDto.getPayImage()); // orderInfo.setPayMethod("微信支付"); // break; case "2": // if (StrUtil.isNotBlank(orderInfo.getPayOrderNo())) { // payResultStr = orderInfo.getPayOrderNo(); @@ -329,8 +343,8 @@ this.baseMapper.updateById(orderInfo); //新增业绩,第一次购买套餐则升级用户为普通会员 addAchieveAndUpdateLevel(orderInfo.getId(),member.getId()); commonService.addAchieveAndUpdateLevel(orderInfo.getId(),orderInfo.getMemberId()); mallMoneyFlowService.addMoneyFlow(member.getId(), orderInfo.getAmount().negate(), MoneyFlowTypeEnum.PAY.getValue(), orderInfo.getOrderNo(), FlowTypeEnum.BALANCE.getValue()); agentProducer.sendAutoLevelUpMsg(member.getId()); // agentProducer.sendOrderReturn(orderInfo.getId()); src/main/java/cc/mrbird/febs/mall/service/impl/CommonService.java
@@ -1,18 +1,19 @@ package cc.mrbird.febs.mall.service.impl; import cc.mrbird.febs.common.enumerates.MemberLevelEnum; import cc.mrbird.febs.common.utils.AppContants; import cc.mrbird.febs.common.utils.RedisUtils; import cc.mrbird.febs.mall.entity.AppVersion; import cc.mrbird.febs.mall.entity.DataDictionaryCustom; import cc.mrbird.febs.mall.mapper.AppVersionMapper; import cc.mrbird.febs.mall.mapper.DataDictionaryCustomMapper; import cc.mrbird.febs.mall.entity.*; import cc.mrbird.febs.mall.mapper.*; import cc.mrbird.febs.mall.service.ICommonService; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson.JSONObject; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import java.math.BigDecimal; import java.util.List; /** @@ -26,6 +27,11 @@ private final RedisUtils redisUtils; private final DataDictionaryCustomMapper dataDictionaryCustomMapper; private final AppVersionMapper appVersionMapper; private final MallOrderInfoMapper mallOrderInfoMapper; private final MallMemberMapper memberMapper; private final MallGoodsMapper mallGoodsMapper; private final MallGoodsSkuMapper mallGoodsSkuMapper; private final MallAchieveRecordMapper mallAchieveRecordMapper; @Override public boolean verifyCode(String account, String code) { @@ -82,4 +88,46 @@ dataDictionaryCustomMapper.updateById(dic); } } @Override public void addAchieveAndUpdateLevel(Long orderId,Long memberId){ MallOrderInfo orderInfo = mallOrderInfoMapper.selectById(orderId); MallMember member = memberMapper.selectById(memberId); boolean hasTc = false; BigDecimal achieveAmount = BigDecimal.ZERO; List<MallOrderItem> orderItems = mallOrderInfoMapper.getMallOrderItemByOrderId(orderId); if (CollUtil.isNotEmpty(orderItems)) { for (MallOrderItem orderItem : orderItems) { MallGoods mallGoods = mallGoodsMapper.selectById(orderItem.getGoodsId()); MallGoodsSku sku = mallGoodsSkuMapper.selectById(orderItem.getSkuId()); if (mallGoods.getIsNormal() == 2) { hasTc = true; achieveAmount = achieveAmount.add(sku.getPresentPrice().multiply(new BigDecimal(orderItem.getCnt()))); } } } if (hasTc){ if(achieveAmount.compareTo(BigDecimal.ZERO) > 0) { // 添加业绩 MallAchieveRecord mallAchieveRecord = new MallAchieveRecord(); mallAchieveRecord.setMemberId(memberId); mallAchieveRecord.setAmount(achieveAmount); mallAchieveRecord.setAchieveTime(orderInfo.getPayTime()); mallAchieveRecord.setOrderId(orderInfo.getId()); mallAchieveRecord.setIsNormal(2); mallAchieveRecord.setPayTime(orderInfo.getPayTime()); mallAchieveRecordMapper.insert(mallAchieveRecord); //得到三倍补助 // BigDecimal multiply = achieveAmount.multiply(new BigDecimal(3)); // memberWalletService.add(multiply, memberId, "commission"); } if(member.getLevel().equals(MemberLevelEnum.FANS.getType())){ member.setLevel(MemberLevelEnum.NORMAL.getType()); memberMapper.updateById(member); } } } } src/main/java/cc/mrbird/febs/pay/controller/PayCallBackController.java
@@ -1,16 +1,12 @@ package cc.mrbird.febs.pay.controller; import cc.mrbird.febs.common.entity.FebsResponse; import cc.mrbird.febs.pay.properties.AliPayProperties; import cc.mrbird.febs.pay.service.IPayService; import com.alibaba.fastjson.JSONObject; import cc.mrbird.febs.pay.service.AliIPayService; import com.alipay.api.AlipayApiException; import com.alipay.api.internal.util.AlipaySignature; import com.ijpay.alipay.AliPayApi; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @@ -28,7 +24,7 @@ public class PayCallBackController { @Autowired private IPayService payService; private AliIPayService payService; @Resource private AliPayProperties aliPayProperties; src/main/java/cc/mrbird/febs/pay/properties/WxPayProperties.java
New file @@ -0,0 +1,34 @@ package cc.mrbird.febs.pay.properties; import lombok.Data; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.Configuration; /** * @author wzy * @date 2023-04-07 **/ @Data @Configuration @ConfigurationProperties(prefix = "pay.wx") public class WxPayProperties { /** * 设置微信公众号或者小程序等的appid */ private String appId; /** * 微信支付商户号 */ private String mchId; /** * 微信支付商户密钥 */ private String mchKey; private String keyPath; private String noticeUrl; } src/main/java/cc/mrbird/febs/pay/service/AliIPayService.java
New file @@ -0,0 +1,16 @@ package cc.mrbird.febs.pay.service; import cc.mrbird.febs.mall.entity.MallOrderInfo; import java.util.Map; /** * @author wzy * @date 2021-09-27 **/ public interface AliIPayService { String aliPay(MallOrderInfo orderInfo); void aliCallback(Map<String, String> params); } src/main/java/cc/mrbird/febs/pay/service/IPayService.java
@@ -4,13 +4,9 @@ import java.util.Map; /** * @author wzy * @date 2021-09-27 **/ public interface IPayService { String aliPay(MallOrderInfo orderInfo); String pay(MallOrderInfo orderInfo); void aliCallback(Map<String, String> params); void payCallback(Map<String, String> params); } src/main/java/cc/mrbird/febs/pay/service/impl/PayServiceImplAli.java
File was renamed from src/main/java/cc/mrbird/febs/pay/service/impl/PayServiceImpl.java @@ -1,20 +1,16 @@ 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.MallOrderInfoMapper; import cc.mrbird.febs.mall.service.IApiMallMemberService; import cc.mrbird.febs.mall.service.IApiMallOrderInfoService; import cc.mrbird.febs.pay.model.AliPayPassbackModel; import cc.mrbird.febs.pay.properties.AliPayProperties; import cc.mrbird.febs.pay.service.IPayService; import cc.mrbird.febs.pay.service.AliIPayService; import cc.mrbird.febs.rabbit.producter.AgentProducer; import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson.JSONObject; import com.alipay.api.AlipayApiException; import com.alipay.api.domain.AlipayTradeAppPayModel; @@ -36,7 +32,7 @@ **/ @Slf4j @Service public class PayServiceImpl implements IPayService { public class PayServiceImplAli implements AliIPayService { @Resource private AliPayProperties aliPayProperties; src/main/java/cc/mrbird/febs/pay/service/impl/WxPayServiceImpl.java
New file @@ -0,0 +1,122 @@ 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<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()); } } src/main/resources/application-test.yml
@@ -58,3 +58,10 @@ # 回调地址 noticeUrl: http://120.27.238.55:8801/api/pay/aliCallBack domain: https://openapi.alipaydev.com/gateway.do wx: appId: wx051693799db39540 mchId: 1641389321 mchKey: wqri51aCfiG31o4IcdX3dW12qnX3u4hp keyPath: classpath:cert/apiclient_cert.p12 noticeUrl: http://120.27.238.55:8185/api/pay/wxPayCallBack