sql/xc_mall.sql
@@ -351,3 +351,6 @@ address varchar(255) null comment '下载地址', type tinyint null comment '类型:1安卓,2苹果' )comment '版本表'; alter table mall_order_info add pay_trade_no text null comment '支付交易单号'; src/main/java/cc/mrbird/febs/mall/entity/MallOrderInfo.java
@@ -71,4 +71,6 @@ private List<MallOrderItem> items; private String payImage; private String payTradeNo; } src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallOrderInfoServiceImpl.java
@@ -174,27 +174,32 @@ orderInfo.setPayMethod("微信支付"); break; case "2": if (StrUtil.isNotBlank(orderInfo.getPayOrderNo())) { payResultStr = orderInfo.getPayOrderNo(); } else { payResultStr = payService.aliPay(orderInfo); } orderInfo.setPayOrderNo(payResultStr); orderInfo.setPayMethod("支付宝支付"); break; case "3": payResultStr = balancePay(orderInfo, payOrderDto.getTradePwd()); orderInfo.setPayOrderNo(orderInfo.getOrderNo()); orderInfo.setPayMethod("积分支付"); orderInfo.setStatus(OrderStatusEnum.WAIT_SHIPPING.getValue()); orderInfo.setPayTime(new Date()); orderInfo.setPayResult("1"); this.baseMapper.updateById(orderInfo); memberService.addMoneyFlow(member.getId(), orderInfo.getAmount().negate(), MoneyFlowTypeEnum.PAY.getValue(), orderInfo.getOrderNo(), null, null, null, null); default: } this.baseMapper.updateById(orderInfo); Map<String, Object> map = new HashMap<>(); map.put("orderInfo", payResultStr); map.put("orderNo", orderInfo.getOrderNo()); src/main/java/cc/mrbird/febs/pay/controller/PayCallBackController.java
@@ -1,14 +1,20 @@ 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 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; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import java.util.Map; @@ -21,14 +27,36 @@ @RequestMapping(value = "/api/pay") public class PayCallBackController { @Autowired private IPayService payService; @Resource private AliPayProperties aliPayProperties; @RequestMapping("/aliCallBack") public FebsResponse aliPayCallBack(HttpServletRequest request) { log.info("进入回调"); public String aliPayCallBack(HttpServletRequest request){ log.info("进入支付宝回调"); Map<String, String> params = AliPayApi.toMap(request); log.info("回调参数:{}", JSONObject.toJSONString(params)); for (Map.Entry<String, String> entry : params.entrySet()) { log.info("支付宝回调:{}===={}", entry.getKey(), entry.getValue()); boolean verifyResult = false; try { verifyResult = AlipaySignature.verifyV1(params, aliPayProperties.getPublicKey(), "UTF-8", "RSA2"); } catch (AlipayApiException e) { log.info("验证失败=="); return "failure"; } return new FebsResponse().success(); if (verifyResult) { if ("TRADE_SUCCESS".equals(params.get("trade_status")) || "TRADE_FINISHED".equals(params.get("trade_status"))) { payService.aliCallback(params); return "success"; } else { log.info("支付失败"); return "failure"; } } else { log.info("验证失败"); return "failure"; } } } src/main/java/cc/mrbird/febs/pay/service/IPayService.java
@@ -2,6 +2,8 @@ import cc.mrbird.febs.mall.entity.MallOrderInfo; import java.util.Map; /** * @author wzy * @date 2021-09-27 @@ -9,4 +11,6 @@ public interface IPayService { String aliPay(MallOrderInfo orderInfo); void aliCallback(Map<String, String> params); } src/main/java/cc/mrbird/febs/pay/service/impl/PayServiceImpl.java
@@ -1,20 +1,30 @@ package cc.mrbird.febs.pay.service.impl; 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.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.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; import com.alipay.api.response.AlipayTradeAppPayResponse; import com.ijpay.alipay.AliPayApi; 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 javax.annotation.Resource; import java.util.Date; import java.util.Map; /** * @author wzy @@ -26,6 +36,13 @@ @Resource private AliPayProperties aliPayProperties; @Autowired private IApiMallMemberService memberService; @Autowired private MallOrderInfoMapper orderInfoMapper; @Autowired private AgentProducer agentProducer; @Value("${spring.profiles.active}") private String active; @@ -59,4 +76,27 @@ } return resp.getBody(); } @Override public void aliCallback(Map<String, String> params) { String modelStr = params.get("passback_params"); AliPayPassbackModel passback = JSONObject.parseObject(modelStr, AliPayPassbackModel.class); MallOrderInfo orderInfo = orderInfoMapper.selectById(passback.getOrderId()); if ("1".equals(orderInfo.getPayResult())) { return; } orderInfo.setStatus(OrderStatusEnum.WAIT_SHIPPING.getValue()); orderInfo.setPayResult("1"); orderInfo.setPayTime(new Date()); orderInfo.setPayTradeNo(params.get("trade_no")); orderInfoMapper.updateById(orderInfo); agentProducer.sendReturnMoneyMsg(orderInfo.getId()); agentProducer.sendAutoLevelUpMsg(orderInfo.getMemberId()); memberService.addMoneyFlow(orderInfo.getMemberId(), orderInfo.getAmount().negate(), MoneyFlowTypeEnum.PAY.getValue(), orderInfo.getOrderNo(), null, null, null, null); } }