zoujiajian 2 年 前
コミット
204274ba96

+ 5 - 0
netflix-common/pom.xml

@@ -104,6 +104,11 @@
             <artifactId>tencentcloud-sdk-java-faceid</artifactId>
             <version>3.1.694</version>
         </dependency>
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-web</artifactId>
+        </dependency>
     </dependencies>
 
 

+ 39 - 0
netflix-common/src/main/java/com/cyksj/common/util/AliPayParamsHandlerUtil.java

@@ -0,0 +1,39 @@
+package com.cyksj.common.util;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * 项目名: yhlxj2
+ * 文件名: AliPayParamsHandlerUtil
+ * 创建者: JavaZou
+ * 创建时间:2024/2/22 17:35
+ */
+public class AliPayParamsHandlerUtil {
+	/**
+	 * 获取支付宝回调参数
+	 */
+	public static Map<String, String> convertRequestParamsToMap(HttpServletRequest request) {
+		Map<String, String> retMap = new HashMap<>();
+		Set<Map.Entry<String, String[]>> entrySet = request.getParameterMap().entrySet();
+		for (Map.Entry<String, String[]> entry : entrySet) {
+			String name = entry.getKey();
+			String[] values = entry.getValue();
+			int valLen = values.length;
+			if (valLen == 1) {
+				retMap.put(name, values[0]);
+			} else if (valLen > 1) {
+				StringBuilder sb = new StringBuilder();
+				for (String val : values) {
+					sb.append(",").append(val);
+				}
+				retMap.put(name, sb.substring(1));
+			} else {
+				retMap.put(name, "");
+			}
+		}
+		return retMap;
+	}
+}

+ 13 - 0
netflix-dao/src/main/java/com/cyksj/mapper/RentOrderDonTransportMapper.java

@@ -0,0 +1,13 @@
+package com.cyksj.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.cyksj.model.entity.RentOrderDonTransport;
+
+/**
+ * 项目名: yhlxj2
+ * 文件名: RentOrderDonTransportMapper
+ * 创建者: JavaZou
+ * 创建时间:2024/2/22 18:17
+ */
+public interface RentOrderDonTransportMapper extends BaseMapper<RentOrderDonTransport> {
+}

+ 24 - 0
netflix-dao/src/main/java/com/cyksj/model/entity/RentGoodsDonSpecFrontView.java

@@ -0,0 +1,24 @@
+package com.cyksj.model.entity;
+
+import com.ejlchina.searcher.bean.SearchBean;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 项目名: yhlxj2
+ * 文件名: RentGoodsDonSpecFrontView
+ * 创建者: JavaZou
+ * 创建时间:2024/2/22 17:15
+ */
+@Getter
+@Setter
+@SearchBean(tables = "rent_goods_don_spec")
+public class RentGoodsDonSpecFrontView {
+	private Long id;
+
+	private Long goodsId;
+
+	private String specsJson;
+
+	private String specMapping;
+}

+ 47 - 0
netflix-dao/src/main/java/com/cyksj/model/entity/RentOrderDonTransport.java

@@ -0,0 +1,47 @@
+package com.cyksj.model.entity;
+
+import lombok.Data;
+
+/**
+ * @author chan
+ * @date 2022/10/17 7:08 PM
+ */
+@Data
+public class RentOrderDonTransport extends BaseEntity{
+
+    /**
+     * 订单id
+     */
+    private Long orderId;
+
+    /**
+     * 收货人
+     */
+    private String receiver;
+
+    /**
+     * 手机号
+     */
+    private String phone;
+
+    /**
+     * 省份
+     */
+    private String province;
+
+    /**
+     * 城市
+     */
+    private String city;
+
+    /**
+     * 区/县
+     */
+    private String district;
+
+    /**
+     * 详细地址
+     */
+    private String address;
+
+}

+ 37 - 0
netflix-dao/src/main/java/com/cyksj/model/request/RentOrderPayRequest.java

@@ -0,0 +1,37 @@
+package com.cyksj.model.request;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import javax.validation.constraints.NotNull;
+import java.math.BigDecimal;
+
+/**
+ * 项目名: yhlxj2
+ * 文件名: RentOrderPayRequest
+ * 创建者: JavaZou
+ * 创建时间:2024/2/22 17:29
+ */
+@Getter
+@Setter
+public class RentOrderPayRequest {
+	private Long userId;
+	/**
+	 * 商品规格id
+	 */
+	@NotNull
+	private Long skuId;
+
+	/**
+	 * 金额
+	 */
+	@NotNull(message = "请输入金额")
+	private BigDecimal donMoney;
+
+	/**
+	 * 收获地址id
+	 */
+	private Long addressId;
+
+	private String type;
+}

+ 52 - 0
netflix-dao/src/main/java/com/cyksj/model/views/RentGoodsDonFrontView.java

@@ -0,0 +1,52 @@
+package com.cyksj.model.views;
+
+import com.cyksj.model.entity.RentGoodsDonSpecFrontView;
+import com.ejlchina.searcher.bean.DbField;
+import com.ejlchina.searcher.bean.DbIgnore;
+import com.ejlchina.searcher.bean.SearchBean;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.List;
+
+/**
+ * 项目名: yhlxj2
+ * 文件名: RentGoodsDonFrontView
+ * 创建者: JavaZou
+ * 创建时间:2024/2/22 17:11
+ */
+@Getter
+@Setter
+@SearchBean(tables = "rent_goods_don g",
+		where = "g.deleted is true and g.status is true")
+public class RentGoodsDonFrontView {
+	@DbField("g.id")
+	private Long id;
+
+	/**
+	 * 商品名称
+	 */
+	@DbField("g.title")
+	private String title;
+
+	/**
+	 * 背景图
+	 */
+	@DbField("g.img")
+	private String img;
+
+	/**
+	 * 已售
+	 */
+	@DbField("g.virtual_sold")
+	private Integer sold;
+
+	@DbField("g.detail")
+	private String detail;
+
+	@DbIgnore
+	private List<RentGoodsDonSkuView> skuList;
+
+	@DbIgnore
+	private RentGoodsDonSpecFrontView specs;
+}

+ 33 - 0
netflix-dao/src/main/java/com/cyksj/model/views/RentGoodsDonSkuView.java

@@ -0,0 +1,33 @@
+package com.cyksj.model.views;
+
+import com.ejlchina.searcher.bean.SearchBean;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.math.BigDecimal;
+
+/**
+ * 项目名: yhlxj2
+ * 文件名: RentGoodsDonSkuView
+ * 创建者: JavaZou
+ * 创建时间:2024/2/22 17:13
+ */
+@Getter
+@Setter
+@SearchBean(tables = "rent_goods_don_sku sku",
+		where = "status is true")
+public class RentGoodsDonSkuView {
+	private Long id;
+
+	private Long goodsId;
+
+	/**
+	 * 天数
+	 */
+	private Integer days;
+
+	/**
+	 * 价格
+	 */
+	private BigDecimal price;
+}

+ 1 - 1
netflix-service/src/main/java/com/cyksj/redis/RedisService.java

@@ -669,7 +669,7 @@ public class RedisService {
         DOUBLE_VERIFY_CODE_VIEW_MINUTES_KEY("double_verify_code_view_minutes_key","双重验证码查看同时间段人数限制",60),
 
         WX_INDENT_BIND_KEY("wx_indent_bind:key:", "微信身份授权绑定key", 60 * 60 * 24),
-        RENT_GOODS_PAGHE_CACHE("rent_goods_paghe_cache:", "租赁商品缓存", 30 * 60),
+        RENT_GOODS_PAGHE_CACHE("rent_goods_paghe_cache:", "租赁商品缓存", 60 * 60),
         ;
 
         private String name;

+ 28 - 0
netflix-service/src/main/java/com/cyksj/service/order/RentOrderDonService.java

@@ -0,0 +1,28 @@
+package com.cyksj.service.order;
+
+import com.cyksj.model.dto.AliPayParams;
+import com.cyksj.model.entity.RentOrderDon;
+import com.cyksj.model.request.AlipayOrderDonReq;
+import com.cyksj.model.request.RentOrderPayRequest;
+
+import java.util.Map;
+
+/**
+ * 项目名: yhlxj2
+ * 文件名: RentOrderDonService
+ * 创建者: JavaZou
+ * 创建时间:2024/2/22 17:31
+ */
+public interface RentOrderDonService {
+	RentOrderDon submit(RentOrderPayRequest payRequest) throws Exception;
+
+	/**
+	 * 支付宝预支付
+	 */
+	AliPayParams aliPay(AlipayOrderDonReq alipayOrderDonReq, String productCode, String qrPayMode) throws Exception;
+
+	/**
+	 * 支付宝回调
+	 */
+	void aliPayNotify(Map<String, String> paramsMap) throws Exception;
+}

+ 153 - 0
netflix-service/src/main/java/com/cyksj/service/order/impl/RentOrderDonServiceImpl.java

@@ -0,0 +1,153 @@
+package com.cyksj.service.order.impl;
+
+import com.baomidou.mybatisplus.core.toolkit.Assert;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.cyksj.common.exception.BusinessRuntimeException;
+import com.cyksj.common.snowflake.Sequence;
+import com.cyksj.common.util.Jsons;
+import com.cyksj.mapper.AddressMapper;
+import com.cyksj.mapper.RentOrderDonTransportMapper;
+import com.cyksj.mapper.UserMapper;
+import com.cyksj.mapper.rent.RentGoodsDonSkuMapper;
+import com.cyksj.mapper.rent.RentGoodsDonSpecMapper;
+import com.cyksj.mapper.rent.RentOrderDonMapper;
+import com.cyksj.model.dto.AliPayParams;
+import com.cyksj.model.entity.*;
+import com.cyksj.model.manage.request.ReqGoodsSkuSpec;
+import com.cyksj.model.request.AlipayOrderDonReq;
+import com.cyksj.model.request.RentOrderPayRequest;
+import com.cyksj.service.order.RentOrderDonService;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+import java.math.BigDecimal;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 项目名: yhlxj2
+ * 文件名: RentOrderDonServiceImpl
+ * 创建者: JavaZou
+ * 创建时间:2024/2/22 17:31
+ */
+@Service
+@RequiredArgsConstructor
+@Slf4j
+public class RentOrderDonServiceImpl implements RentOrderDonService {
+	private final RentGoodsDonSkuMapper skuMapper;
+
+	private final RentGoodsDonSpecMapper specMapper;
+
+	private final UserMapper userMapper;
+
+	private final AddressMapper addressMapper;
+
+	private final RentOrderDonMapper orderDonMapper;
+
+	private final RentOrderDonTransportMapper orderDonTransportMapper;
+
+	private static final Sequence SEQUENCE = new Sequence(0);
+
+	@Override
+	public RentOrderDon submit(RentOrderPayRequest payRequest) throws Exception {
+		Long skuId = payRequest.getSkuId();
+		RentGoodsDonSku sku = skuMapper.selectById(skuId);
+		Assert.notNull(sku, "规格不存在..");
+		BigDecimal price = sku.getPrice();
+		//押金
+		BigDecimal deposit = getRentGoodsDonDeposit(sku.getGoodsId(), sku.getSpecIds());
+		Assert.notNull(deposit, "应付押金异常..");
+
+		Long userId = payRequest.getUserId();
+		User user = userMapper.selectById(userId);
+		Assert.notNull(user, "用户信息已失效,请重新登录");
+
+		Long addressId = payRequest.getAddressId();
+
+		//检查地址是否存在
+		Address address = checkAddressId(addressId);
+
+		/* 生成订单 */
+		String donNo = SEQUENCE.nextId().toString();
+		RentOrderDon orderDon = new RentOrderDon();
+
+		orderDon.setOrderNo(donNo);
+		orderDon.setOpenId(user.getOpenId());
+
+		if (payRequest.getDonMoney().compareTo(price.add(deposit)) < 0) {
+			payRequest.setDonMoney(price.add(deposit));
+		}
+		orderDon.setMoney(payRequest.getDonMoney());
+		//押金
+		orderDon.setDeposit(deposit);
+		orderDon.setSkuId(payRequest.getSkuId());
+		orderDon.setGoodsId(sku.getGoodsId());
+		orderDon.setStatus(RentOrderDon.Status.noPayment);
+		orderDon.setUserId(user.getId());
+		orderDon.setType(RentOrderDon.Type.getType(payRequest.getType()));
+		orderDon.setPayTitle(sku.getSpecVal());
+		orderDonMapper.insert(orderDon);
+
+		saveTransport(address, orderDon.getId());
+
+		return orderDon;
+	}
+
+	@Override
+	public AliPayParams aliPay(AlipayOrderDonReq alipayOrderDonReq, String productCode, String qrPayMode) throws Exception {
+		return null;
+	}
+
+	@Override
+	public void aliPayNotify(Map<String, String> paramsMap) throws Exception {
+
+	}
+
+	/**
+	 * 获取租赁商品的应付押金
+	 */
+	private BigDecimal getRentGoodsDonDeposit(Long goodsId, String specIdsStr) throws Exception {
+		RentGoodsDonSpec rentGoodsDonSpec = specMapper.selectOne(Wrappers.lambdaQuery(RentGoodsDonSpec.class)
+				.eq(RentGoodsDonSpec::getGoodsId, goodsId)
+				.last("limit 1"));
+		List<Long> specIds = Jsons.parseList(specIdsStr, Long.class);
+		String specsJson = rentGoodsDonSpec.getSpecsJson();
+		List<ReqGoodsSkuSpec> reqGoodsSkuSpec = Jsons.parseList(specsJson, ReqGoodsSkuSpec.class);
+		//押金
+		BigDecimal deposit = null;
+		for (ReqGoodsSkuSpec spec : reqGoodsSkuSpec) {
+			if (spec.getKey().contains("版本")) {
+				for (ReqGoodsSkuSpec.Node value : spec.getValues()) {
+					if (specIds.contains(value.getId())) {
+						return value.getDeposit();
+					}
+				}
+			}
+		}
+		return null;
+	}
+
+	private Address checkAddressId(Long addressId) {
+		if (addressId == null) {
+			throw new BusinessRuntimeException("请选择收货地址.");
+		}
+		Address address = addressMapper.selectById(addressId);
+		if (address == null) {
+			throw new BusinessRuntimeException("请添加收货地址.");
+		}
+		return address;
+	}
+
+	private void saveTransport(Address address, Long orderId) {
+		RentOrderDonTransport transport = new RentOrderDonTransport();
+		transport.setOrderId(orderId);
+		transport.setReceiver(address.getReceiver());
+		transport.setPhone(address.getPhone());
+		transport.setProvince(address.getProvince());
+		transport.setCity(address.getCity());
+		transport.setDistrict(address.getDistrict());
+		transport.setAddress(address.getAddress());
+		orderDonTransportMapper.insert(transport);
+	}
+}

+ 55 - 0
netflix-web/src/main/java/com/cyksj/web/controller/goods/RentGoodsDonController.java

@@ -0,0 +1,55 @@
+package com.cyksj.web.controller.goods;
+
+import cn.hutool.core.util.RandomUtil;
+import com.cyksj.common.util.Jsons;
+import com.cyksj.dto.Result;
+import com.cyksj.enums.GatewayResponse;
+import com.cyksj.model.entity.RentGoodsDonSpecFrontView;
+import com.cyksj.model.views.RentGoodsDonFrontView;
+import com.cyksj.model.views.RentGoodsDonSkuView;
+import com.cyksj.redis.RedisService;
+import com.ejlchina.searcher.BeanSearcher;
+import com.ejlchina.searcher.util.MapUtils;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * 项目名: yhlxj2
+ * 文件名: RentGoodsDonController
+ * 创建者: JavaZou
+ * 创建时间:2024/2/22 17:09
+ */
+@Slf4j
+@RestController
+@RequestMapping("/applets/rent/goods")
+@RequiredArgsConstructor
+public class RentGoodsDonController {
+
+	private final BeanSearcher beanSearcher;
+
+	private final RedisService redisService;
+
+	/**
+	 * 获取商品详情
+	 */
+	@GetMapping("/get/{id}")
+	public Result<? extends Object> getDetail(@PathVariable Long id) {
+		String goodsDetailKey = RedisService.key.RENT_GOODS_PAGHE_CACHE.getEnvName() + "goods_detail:" + id;
+		Object o = redisService.get(goodsDetailKey);
+		if (o == null) {
+			RentGoodsDonFrontView views = beanSearcher.searchFirst(RentGoodsDonFrontView.class, MapUtils.builder().field(RentGoodsDonFrontView::getId, id)
+					.build());
+			views.setSpecs(beanSearcher.searchFirst(RentGoodsDonSpecFrontView.class, MapUtils.builder().field(RentGoodsDonSpecFrontView::getGoodsId, views.getId()).build()));
+			views.setSkuList(beanSearcher.searchAll(RentGoodsDonSkuView.class, MapUtils.builder().field(RentGoodsDonSkuView::getGoodsId, views.getId()).build()));
+
+			redisService.setNx(goodsDetailKey, views, RedisService.key.RENT_GOODS_PAGHE_CACHE.getTimeout() + 60 * RandomUtil.randomInt(10));
+			o = redisService.get(goodsDetailKey);
+		}
+		RentGoodsDonFrontView views = Jsons.parseObject(o, RentGoodsDonFrontView.class);
+		return GatewayResponse.SUCCESS.newBuilder().toResult(views);
+	}
+}

+ 2 - 33
netflix-web/src/main/java/com/cyksj/web/controller/payment/OrderController.java

@@ -10,10 +10,7 @@ import com.alipay.api.response.AlipayFundTransCommonQueryResponse;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.cyksj.common.constant.Constant;
 import com.cyksj.common.exception.BusinessRuntimeException;
-import com.cyksj.common.util.IoKit;
-import com.cyksj.common.util.Jsons;
-import com.cyksj.common.util.StringUtil;
-import com.cyksj.common.util.Xmls;
+import com.cyksj.common.util.*;
 import com.cyksj.config.zfb.BaseZfbConfig;
 import com.cyksj.config.zfb.ZfbProductCode;
 import com.cyksj.dto.Result;
@@ -66,10 +63,8 @@ import javax.servlet.http.HttpServletResponse;
 import java.io.InputStream;
 import java.io.OutputStream;
 import java.nio.charset.StandardCharsets;
-import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
-import java.util.Set;
 import java.util.stream.Collectors;
 
 /**
@@ -321,7 +316,7 @@ public class OrderController {
 	@PostMapping("/prepay/zfb/notify")
 	public String aliPayNotify(HttpServletRequest request) throws Exception {
 		////将异步通知中收到的所有参数都存放到map中
-		Map<String, String> params = convertRequestParamsToMap(request);
+		Map<String, String> params = AliPayParamsHandlerUtil.convertRequestParamsToMap(request);
 		String tradeStatus = params.get("trade_status");
         String orderNo = params.get("out_trade_no");
         if (AliPayTradeStatus.TRADE_SUCCESS.getStatus().equals(tradeStatus) || AliPayTradeStatus.TRADE_FINISHED.getStatus().equals(tradeStatus)) {
@@ -495,32 +490,6 @@ public class OrderController {
         return GatewayResponse.SUCCESS.newBuilder().toResult(true);
     }
 
-    /**
-     * 获取支付宝回调参数
-     */
-    private static Map<String, String> convertRequestParamsToMap(HttpServletRequest request) {
-        Map<String, String> retMap = new HashMap<>();
-        Set<Map.Entry<String, String[]>> entrySet = request.getParameterMap().entrySet();
-        for (Map.Entry<String, String[]> entry : entrySet) {
-            String name = entry.getKey();
-            String[] values = entry.getValue();
-            int valLen = values.length;
-            if (valLen == 1) {
-                retMap.put(name, values[0]);
-            } else if (valLen > 1) {
-                StringBuilder sb = new StringBuilder();
-                for (String val : values) {
-                    sb.append(",").append(val);
-                }
-                retMap.put(name, sb.substring(1));
-            } else {
-                retMap.put(name, "");
-            }
-        }
-        return retMap;
-    }
-
-
     /**
      * paypal支付
      */

+ 92 - 0
netflix-web/src/main/java/com/cyksj/web/controller/payment/RentOrderController.java

@@ -1,10 +1,28 @@
 package com.cyksj.web.controller.payment;
 
+import com.cyksj.common.util.AliPayParamsHandlerUtil;
+import com.cyksj.config.zfb.BaseZfbConfig;
+import com.cyksj.config.zfb.ZfbProductCode;
+import com.cyksj.dto.Result;
+import com.cyksj.enums.GatewayResponse;
+import com.cyksj.model.dto.AliPayParams;
+import com.cyksj.model.entity.RentOrderDon;
+import com.cyksj.model.request.AlipayOrderDonReq;
+import com.cyksj.model.request.RentOrderPayRequest;
+import com.cyksj.model.response.AliPayTradeStatus;
+import com.cyksj.service.order.RentOrderDonService;
+import com.cyksj.web.util.StpUserUtil;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
+import javax.servlet.http.HttpServletRequest;
+import java.util.Map;
+
 /**
  * 项目名: yhlxj2
  * 文件名: RentOrderController
@@ -17,4 +35,78 @@ import org.springframework.web.bind.annotation.RestController;
 @RequiredArgsConstructor
 public class RentOrderController {
 
+	private final RentOrderDonService orderDonService;
+
+	/**
+	 * 支付
+	 * @author chan
+	 * @date 2021-10-11 下午4:56
+	 */
+	@PostMapping("/post/submit")
+	public Result<RentOrderDon> submit(@Validated @RequestBody RentOrderPayRequest payRequest) throws Exception {
+		final String methodName = "吊起支付";
+		Long userId = StpUserUtil.getUserIdAfterLogin();
+		payRequest.setUserId(userId);
+		log.info("{}[start] params:{}", methodName, payRequest);
+
+		RentOrderDon orderDon = orderDonService.submit(payRequest);
+
+		return GatewayResponse.SUCCESS.newBuilder().toResult(orderDon);
+	}
+
+	/**
+	 * 支付宝表单支付
+	 * 支付宝调起支付宝表单
+	 * 手机支付
+	 */
+	@PostMapping("/post/pay/zfb")
+	@Deprecated
+	public Result<String> aliPay(@RequestBody @Validated AlipayOrderDonReq re) throws Exception {
+		AliPayParams aliPayParams = orderDonService.aliPay(re, ZfbProductCode.MOBILE_WEB.getProductCode(), null);
+//        response.setContentType("text/html;charset=" + BaseZfbConfig.charset);
+		//直接将完整的表单html输出到页面
+//        response.getWriter().write(aliPayParams.getBody());
+//        response.getWriter().flush();
+//        response.getWriter().close();
+		return GatewayResponse.SUCCESS.newBuilder().toResult(aliPayParams.getBody());
+	}
+
+	/**
+	 * 支付宝web支付
+	 * pc网页内嵌二维码
+	 */
+	@PostMapping("/get/zfb/orderQrCode")
+	public Result<String> zfbWebQrCode(@RequestBody @Validated AlipayOrderDonReq re) throws Exception {
+		AliPayParams aliPayParams = orderDonService.aliPay(re, ZfbProductCode.PC_WEB.getProductCode(), BaseZfbConfig.qrPayMode_orderCode);
+		return GatewayResponse.SUCCESS.newBuilder().toResult(aliPayParams.getBody());
+	}
+
+	/**
+	 * 支付宝web支付
+	 * pc网页跳转二维码
+	 */
+	@PostMapping("/get/zfb/orderRedirect")
+	public Result<String> zfbWebRedirectQrCode(@RequestBody @Validated AlipayOrderDonReq re) throws Exception {
+		AliPayParams aliPayParams = orderDonService.aliPay(re, ZfbProductCode.PC_WEB.getProductCode(), BaseZfbConfig.qrPayMode_redirect);
+		return GatewayResponse.SUCCESS.newBuilder().toResult(aliPayParams.getBody());
+	}
+
+	/**
+	 * 支付宝回调
+	 */
+	@PostMapping("/prepay/zfb/notify")
+	public String aliPayNotify(HttpServletRequest request) throws Exception {
+		////将异步通知中收到的所有参数都存放到map中
+		Map<String, String> params = AliPayParamsHandlerUtil.convertRequestParamsToMap(request);
+		String tradeStatus = params.get("trade_status");
+		String orderNo = params.get("out_trade_no");
+		if (AliPayTradeStatus.TRADE_SUCCESS.getStatus().equals(tradeStatus) || AliPayTradeStatus.TRADE_FINISHED.getStatus().equals(tradeStatus)) {
+			log.info("支付宝商家订单号orderNo:{},status:{}开始回调", orderNo, tradeStatus);
+			orderDonService.aliPayNotify(params);
+		} else {
+			log.error("支付宝回调 error 状态不符合 成功或完成 status:{} ,orderNo:{}", tradeStatus, orderNo);
+			return "fail";
+		}
+		return "success";
+	}
 }