Kaynağa Gözat

兑换码批发下单

zoujiajian 1 yıl önce
ebeveyn
işleme
2b1e96ed28
24 değiştirilmiş dosya ile 938 ekleme ve 16 silme
  1. 0 4
      netflix-dao/src/main/java/com/cyksj/model/request/AlipayOrderDonReq.java
  2. 7 0
      wholesale/pom.xml
  3. 13 0
      wholesale/src/main/java/com/yhlxj/dao/mapper/SysConfigMapper.java
  4. 22 0
      wholesale/src/main/java/com/yhlxj/dao/model/dto/AliPayParams.java
  5. 29 0
      wholesale/src/main/java/com/yhlxj/dao/model/dto/DefaultShopConfig.java
  6. 37 0
      wholesale/src/main/java/com/yhlxj/dao/model/dto/OrderPayBuilderDto.java
  7. 92 0
      wholesale/src/main/java/com/yhlxj/dao/model/entity/ShopConfig.java
  8. 19 0
      wholesale/src/main/java/com/yhlxj/dao/model/entity/SysConfig.java
  9. 37 0
      wholesale/src/main/java/com/yhlxj/dao/model/request/AlipayOrderDonReq.java
  10. 29 0
      wholesale/src/main/java/com/yhlxj/dao/model/request/OrderAttach.java
  11. 2 0
      wholesale/src/main/java/com/yhlxj/dao/model/request/WebOrderPayRequest.java
  12. 26 0
      wholesale/src/main/java/com/yhlxj/dao/model/response/AliPayTradeStatus.java
  13. 37 1
      wholesale/src/main/java/com/yhlxj/service/common/EnvCommonService.java
  14. 12 0
      wholesale/src/main/java/com/yhlxj/service/order/WebWholesaleOrderDonService.java
  15. 21 0
      wholesale/src/main/java/com/yhlxj/service/order/impl/WebWholesaleOrderDonServiceImpl.java
  16. 14 0
      wholesale/src/main/java/com/yhlxj/service/pay/AliPayCommonService.java
  17. 182 0
      wholesale/src/main/java/com/yhlxj/service/pay/impl/AliPayCommonServiceImpl.java
  18. 17 0
      wholesale/src/main/java/com/yhlxj/service/sys/SysConfigService.java
  19. 54 0
      wholesale/src/main/java/com/yhlxj/service/sys/impl/SysConfigServiceImpl.java
  20. 93 0
      wholesale/src/main/java/com/yhlxj/service/zfb/AliPayClientFactory.java
  21. 67 0
      wholesale/src/main/java/com/yhlxj/service/zfb/BaseZfbConfig.java
  22. 25 0
      wholesale/src/main/java/com/yhlxj/service/zfb/ZfbProductCode.java
  23. 51 0
      wholesale/src/main/java/com/yhlxj/web/config/SaTokenConfigure.java
  24. 52 11
      wholesale/src/main/java/com/yhlxj/web/controller/manage/WholesaleCodeController.java

+ 0 - 4
netflix-dao/src/main/java/com/cyksj/model/request/AlipayOrderDonReq.java

@@ -30,8 +30,4 @@ public class AlipayOrderDonReq {
 	private String payMode;
 
 	private String returnUrl;
-
-	private Boolean isDeposit = false;
-
-	private Boolean isUserBenefits = false;
 }

+ 7 - 0
wholesale/pom.xml

@@ -171,6 +171,13 @@
             <artifactId>sa-token-spring-boot-starter</artifactId>
             <version>1.26.0</version>
         </dependency>
+
+        <!--阿里支付sdk-->
+        <dependency>
+            <groupId>com.alipay.sdk</groupId>
+            <artifactId>alipay-sdk-java</artifactId>
+            <version>4.35.65.ALL</version>
+        </dependency>
     </dependencies>
 
 

+ 13 - 0
wholesale/src/main/java/com/yhlxj/dao/mapper/SysConfigMapper.java

@@ -0,0 +1,13 @@
+package com.yhlxj.dao.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.yhlxj.dao.model.entity.SysConfig;
+
+/**
+ * 项目名: yhlxj2
+ * 文件名: SysConfigMapper
+ * 创建者: JavaZou
+ * 创建时间:2025/6/5 16:05
+ */
+public interface SysConfigMapper extends BaseMapper<SysConfig> {
+}

+ 22 - 0
wholesale/src/main/java/com/yhlxj/dao/model/dto/AliPayParams.java

@@ -0,0 +1,22 @@
+package com.yhlxj.dao.model.dto;
+
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+
+/*
+ *项目名: netflix
+ *文件名: AliPayParams
+ *创建者: JavaZou
+ *创建时间:2022/11/2 11:16
+ */
+@Getter
+@Setter
+@NoArgsConstructor
+public class AliPayParams {
+	private String body;
+
+	public AliPayParams(String body) {
+		this.body = body;
+	}
+}

+ 29 - 0
wholesale/src/main/java/com/yhlxj/dao/model/dto/DefaultShopConfig.java

@@ -0,0 +1,29 @@
+package com.yhlxj.dao.model.dto;
+
+import lombok.Getter;
+import lombok.Setter;
+
+/*
+ *项目名: netflix
+ *文件名: DefaultShopConfig
+ *创建者: JavaZou
+ *创建时间:2023/3/21 15:06
+ */
+@Getter
+@Setter
+public class DefaultShopConfig {
+	/**
+	 * 支付宝默认商户
+	 */
+	private String zfbDefaultAppId;
+
+	/**
+	 * 微信默认商户
+	 */
+	private String wxDefaultAppId;
+
+	/**
+	 * 支付方式
+	 */
+	private String payMethod;
+}

+ 37 - 0
wholesale/src/main/java/com/yhlxj/dao/model/dto/OrderPayBuilderDto.java

@@ -0,0 +1,37 @@
+package com.yhlxj.dao.model.dto;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+/*
+ *项目名: netflix
+ *文件名: OrderPayBuilderDto
+ *创建者: JavaZou
+ *创建时间:2023/6/15 14:28
+ */
+@Getter
+@Setter
+public class OrderPayBuilderDto {
+	private Long orderId;
+
+	private String orderNo;
+
+	private BigDecimal money;
+
+	private String productCode;
+
+	private String subject;
+
+	private String payMode;
+
+	private String notifyUrl;
+
+	private String returnUrl;
+
+	private String shopId;
+
+	private Date orderCreatedTime;
+}

+ 92 - 0
wholesale/src/main/java/com/yhlxj/dao/model/entity/ShopConfig.java

@@ -0,0 +1,92 @@
+package com.yhlxj.dao.model.entity;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.ejlchina.searcher.bean.DbIgnore;
+import com.yhlxj.dao.model.BaseEntity;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * @author chan
+ * @date 2022/12/13 2:07 PM
+ */
+@Getter
+@Setter
+public class ShopConfig extends BaseEntity {
+
+    /**
+     * 益路同行支付宝商户
+     */
+    public static final String ZFB_DEFAULT_APP_ID = "2021005100673118";
+
+    /**
+     * 分销提现支付宝默认商户
+     * 益路同行
+     */
+    public static final String DISTRIBUTE_ZFB_DEFAULT_APP_ID = "2021005100673118";
+
+    public static final String WX_DEFAULT_APP_ID = "1634772026";
+
+    /**
+     * shopid,appid
+     */
+    private String appId;
+
+    /**
+     * 商户类型 wx zfb
+     */
+    private String type;
+
+    /**
+     * 密钥
+     */
+    private String secret;
+
+    /**
+     * 应用私钥
+     */
+    private String appPrivateKey;
+
+    /**
+     * 应用公钥
+     */
+    private String appPublicKey;
+
+    /**
+     * 支付宝公钥
+     */
+    private String publicKey;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+    @DbIgnore
+    @TableField(exist = false)
+    private Integer channelCount;
+
+    /***
+     * 是否需要携带证书
+     */
+    private Boolean isCert;
+
+    /**
+     * 支付主体
+     */
+    private String payment;
+
+    /**
+     * 每日限单数
+     */
+    @DbIgnore
+    @TableField(exist = false)
+    private Integer dayLimitOrders;
+
+    /**
+     * 限单是否启用
+     */
+    @DbIgnore
+    @TableField(exist = false)
+    private Boolean dayLimitStatus;
+}

+ 19 - 0
wholesale/src/main/java/com/yhlxj/dao/model/entity/SysConfig.java

@@ -0,0 +1,19 @@
+package com.yhlxj.dao.model.entity;
+
+import com.yhlxj.dao.model.BaseEntity;
+import lombok.Data;
+
+/**
+ * @author chan
+ * @date 2022/10/20 10:02 AM
+ */
+@Data
+public class SysConfig extends BaseEntity {
+
+    private String sysKey;
+
+    private String sysValue;
+
+    private String remark;
+
+}

+ 37 - 0
wholesale/src/main/java/com/yhlxj/dao/model/request/AlipayOrderDonReq.java

@@ -0,0 +1,37 @@
+package com.yhlxj.dao.model.request;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import javax.validation.constraints.NotNull;
+
+/*
+ *项目名: netflix
+ *文件名: AlipayOrderDonReq
+ *创建者: JavaZou
+ *创建时间:2023/3/2 15:19
+ */
+@Getter
+@Setter
+public class AlipayOrderDonReq {
+	@NotNull
+	private Long orderId;
+
+	/**
+	 *  1、手机网页支付 2、电脑网页支付
+	 */
+	private Integer type;
+
+	/**
+	 * 是否在微信内支付
+	 */
+	private Boolean isWx;
+
+	private String payMode;
+
+	private String returnUrl;
+
+	private Boolean isDeposit = false;
+
+	private Boolean isUserBenefits = false;
+}

+ 29 - 0
wholesale/src/main/java/com/yhlxj/dao/model/request/OrderAttach.java

@@ -0,0 +1,29 @@
+package com.yhlxj.dao.model.request;
+
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * @author chan
+ * @date 2021-10-11 下午6:18
+ */
+@Getter
+@Setter
+public class OrderAttach {
+
+    /**
+     * 订单id
+     */
+    private Long o;
+
+    /**
+     * 用户id
+     */
+    private int u;
+
+    /**
+     *  分享者id
+     */
+    private Long shared;
+
+}

+ 2 - 0
wholesale/src/main/java/com/yhlxj/dao/model/request/WebOrderPayRequest.java

@@ -19,4 +19,6 @@ public class WebOrderPayRequest {
 	private Integer num;
 
 	private BigDecimal price;
+
+	private Long userId;
 }

+ 26 - 0
wholesale/src/main/java/com/yhlxj/dao/model/response/AliPayTradeStatus.java

@@ -0,0 +1,26 @@
+package com.yhlxj.dao.model.response;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * @author chan
+ * @className AliPayTradeStatus
+ * @description 支付宝支付 状态枚举
+ * @date 2020/9/2 11:56 上午
+ */
+@AllArgsConstructor
+@Getter
+public enum AliPayTradeStatus {
+
+	TRADE_CLOSED("TRADE_CLOSED", "交易关闭"),
+	TRADE_FINISHED("TRADE_FINISHED", "交易完结"),
+	TRADE_SUCCESS("TRADE_SUCCESS", "支付成功"),
+	WAIT_BUYER_PAY("WAIT_BUYER_PAY", "交易创建");
+
+	private String status;
+
+	private String desc;
+
+
+}

+ 37 - 1
wholesale/src/main/java/com/yhlxj/service/common/EnvCommonService.java

@@ -29,6 +29,34 @@ public class EnvCommonService {
 	@Value(value = "${spring.profiles.active}")
 	private String env;
 
+	@Value(value = "${wechat.domain}")
+	private String domain;
+
+	@Value(value = "${wechat.notifyDomain}")
+	private String notifyDomain;
+
+	public String getHost() {
+		if (isPreEnv()) {
+			return domain.replaceAll("8081", "8082");
+		}
+		return domain;
+	}
+
+	public String getNotifyHost() {
+		if (isPreEnv()) {
+			return notifyDomain.replaceAll("8081", "8082");
+		}
+		return notifyDomain;
+	}
+
+	public String getDomain() {
+		return this.getHost().substring(0, this.getHost().indexOf("80"));
+	}
+
+	public String getDomain2() {
+		return this.getHost().substring(0, this.getHost().indexOf("/80"));
+	}
+
 	public Boolean isPrdEnv() {
 		return EnvCommonService.active_prd.equals(getEnv());
 	}
@@ -37,4 +65,12 @@ public class EnvCommonService {
 		return EnvCommonService.active_pre.equals(getEnv());
 	}
 
-}
+	@PostConstruct
+	public void getDistributeUrl() {
+		DISTRIBUTE_DEFAULT_URL_PREFIX = getDomain();
+		if (!DISTRIBUTE_DEFAULT_URL_PREFIX.endsWith("/")) {
+			DISTRIBUTE_DEFAULT_URL_PREFIX += "/";
+		}
+		DISTRIBUTE_DEFAULT_URL_PREFIX += "%s";
+	}
+}

+ 12 - 0
wholesale/src/main/java/com/yhlxj/service/order/WebWholesaleOrderDonService.java

@@ -1,5 +1,12 @@
 package com.yhlxj.service.order;
 
+import com.yhlxj.dao.model.dto.AliPayParams;
+import com.yhlxj.dao.model.entity.WebWholesaleOrderDon;
+import com.yhlxj.dao.model.request.AlipayOrderDonReq;
+import com.yhlxj.dao.model.request.WebOrderPayRequest;
+
+import java.util.Map;
+
 /**
  * 项目名: yhlxj2
  * 文件名: WebWholesaleOrderDonService
@@ -7,4 +14,9 @@ package com.yhlxj.service.order;
  * 创建时间:2025/6/5 14:04
  */
 public interface WebWholesaleOrderDonService {
+	AliPayParams zfbUnifiedPay(AlipayOrderDonReq re) throws Exception;
+
+	WebWholesaleOrderDon submit(WebOrderPayRequest payRequest);
+
+	void aliPayNotify(Map<String, String> params);
 }

+ 21 - 0
wholesale/src/main/java/com/yhlxj/service/order/impl/WebWholesaleOrderDonServiceImpl.java

@@ -1,6 +1,13 @@
 package com.yhlxj.service.order.impl;
 
+import cn.hutool.core.util.StrUtil;
+import com.yhlxj.dao.model.dto.AliPayParams;
+import com.yhlxj.dao.model.request.AlipayOrderDonReq;
 import com.yhlxj.service.order.WebWholesaleOrderDonService;
+import com.yhlxj.service.pay.AliPayCommonService;
+import com.yhlxj.service.zfb.ZfbProductCode;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
 
 /**
@@ -10,5 +17,19 @@ import org.springframework.stereotype.Service;
  * 创建时间:2025/6/5 14:04
  */
 @Service
+@RequiredArgsConstructor
+@Slf4j
 public class WebWholesaleOrderDonServiceImpl implements WebWholesaleOrderDonService {
+	private final AliPayCommonService aliPayCommonService;
+	@Override
+	public AliPayParams zfbUnifiedPay(AlipayOrderDonReq re) throws Exception {
+		String productCode = StrUtil.EMPTY;
+		if (re.getType() == 1) {
+			productCode = ZfbProductCode.MOBILE_WEB.getProductCode();
+		}
+		if (re.getType() == 2) {
+			productCode = ZfbProductCode.PC_WEB.getProductCode();
+		}
+		return aliPayCommonService.unifiedPayWebWholesale(re.getOrderId(), productCode, re.getPayMode(), re.getReturnUrl());
+	}
 }

+ 14 - 0
wholesale/src/main/java/com/yhlxj/service/pay/AliPayCommonService.java

@@ -0,0 +1,14 @@
+package com.yhlxj.service.pay;
+
+import com.yhlxj.dao.model.dto.AliPayParams;
+
+/*
+ *项目名: netflix
+ *文件名: AliPayCommonService
+ *创建者: JavaZou
+ *创建时间:2023/6/14 15:19
+ */
+public interface AliPayCommonService {
+
+	AliPayParams unifiedPayWebWholesale(Long orderId, String productCode, String payMode, String returnUrl) throws Exception;
+}

+ 182 - 0
wholesale/src/main/java/com/yhlxj/service/pay/impl/AliPayCommonServiceImpl.java

@@ -0,0 +1,182 @@
+package com.yhlxj.service.pay.impl;
+
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.util.StrUtil;
+import com.alipay.api.AlipayApiException;
+import com.alipay.api.AlipayClient;
+import com.alipay.api.AlipayRequest;
+import com.alipay.api.domain.AlipayTradePagePayModel;
+import com.alipay.api.domain.AlipayTradeWapPayModel;
+import com.alipay.api.request.AlipayTradePagePayRequest;
+import com.alipay.api.request.AlipayTradeWapPayRequest;
+import com.baomidou.mybatisplus.core.toolkit.Assert;
+import com.cyksj.common.exception.BusinessRuntimeException;
+import com.cyksj.common.util.Codec;
+import com.cyksj.common.util.Jsons;
+import com.cyksj.common.util.StringUtil;
+import com.yhlxj.dao.mapper.WebWholeSaleOrderDonMapper;
+import com.yhlxj.dao.model.dto.AliPayParams;
+import com.yhlxj.dao.model.dto.OrderPayBuilderDto;
+import com.yhlxj.dao.model.entity.ShopConfig;
+import com.yhlxj.dao.model.entity.WebWholesaleOrderDon;
+import com.yhlxj.dao.model.request.OrderAttach;
+import com.yhlxj.service.common.EnvCommonService;
+import com.yhlxj.service.pay.AliPayCommonService;
+import com.yhlxj.service.sys.SysConfigService;
+import com.yhlxj.service.zfb.AliPayClientFactory;
+import com.yhlxj.service.zfb.BaseZfbConfig;
+import com.yhlxj.service.zfb.ZfbProductCode;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.util.Date;
+import java.util.Optional;
+
+/*
+ *项目名: netflix
+ *文件名: AliPayCommonServiceImpl
+ *创建者: JavaZou
+ *创建时间:2023/6/14 15:19
+ */
+@Service
+@RequiredArgsConstructor
+@Slf4j
+public class AliPayCommonServiceImpl implements AliPayCommonService {
+	private final WebWholeSaleOrderDonMapper orderDonMapper;
+
+	private final EnvCommonService envCommonService;
+
+	private final SysConfigService sysConfigService;
+
+	@Override
+	public AliPayParams unifiedPayWebWholesale(Long orderId, String productCode, String payMode, String returnUrl) throws Exception {
+		WebWholesaleOrderDon orderDon = orderDonMapper.selectById(orderId);
+		Assert.notNull(orderDon, "订单不存在");
+		if (StrUtil.isEmpty(productCode)) throw BusinessRuntimeException.getInstance("支付异常");
+		//获取支付宝默认商户
+		String shopId = sysConfigService.getDefaultShopConfigByType("zfb");
+		orderDon.setShopId(shopId);
+		orderDon.setType(WebWholesaleOrderDon.Type.ALI_PAY);
+		if (orderDon.getType() != WebWholesaleOrderDon.Type.ALI_PAY) {
+			orderDon.setType(WebWholesaleOrderDon.Type.ALI_PAY);
+		}
+		orderDonMapper.updateById(orderDon);
+		//回调地址
+		String host = envCommonService.getNotifyHost();
+		String notifyUrl = String.format("%s%s", host, BaseZfbConfig.zfb_webWholesale_notify_url);
+		if (ZfbProductCode.MOBILE_WEB.getProductCode().equals(productCode) && BaseZfbConfig.qrPayMode_redirect.equals(payMode)) {
+			returnUrl = String.format("%s%s", envCommonService.getDomain(), BaseZfbConfig.zfb_webWholesale_login_return_url);
+		}
+		String subject = "特价批发";
+		AliPayParams aliPayParams = builderPayParams(orderDon.getId(),
+				orderDon.getOrderNo(),
+				orderDon.getShopId(),
+				orderDon.getMoney(),
+				orderDon.getCreatedTime(),
+				subject,
+				productCode,
+				payMode,
+				notifyUrl,
+				returnUrl);
+		return aliPayParams;
+	}
+
+	public AliPayParams builderPayParams(Long orderId, String orderNo, String shopId, BigDecimal money, Date orderCreatedTime, String subject, String productCode, String payMode, String notifyUrl, String returnUrl) throws Exception {
+		OrderPayBuilderDto orderPayBuilderDto = new OrderPayBuilderDto();
+		orderPayBuilderDto.setOrderId(orderId);
+		orderPayBuilderDto.setMoney(money);
+		orderPayBuilderDto.setOrderNo(orderNo);
+		orderPayBuilderDto.setSubject(subject);
+		orderPayBuilderDto.setOrderCreatedTime(orderCreatedTime);
+		orderPayBuilderDto.setProductCode(productCode);
+		orderPayBuilderDto.setPayMode(payMode);
+		orderPayBuilderDto.setReturnUrl(returnUrl);
+		orderPayBuilderDto.setNotifyUrl(notifyUrl);
+		orderPayBuilderDto.setShopId(shopId);
+		AliPayParams aliPayParams = commonAliPay(orderPayBuilderDto);
+		return aliPayParams;
+	}
+
+	public AliPayParams commonAliPay(OrderPayBuilderDto orderPayBuilderDto) throws Exception {
+		AlipayClient alipayClient = AliPayClientFactory.getAlipayClient(Optional.ofNullable(orderPayBuilderDto.getShopId()).orElse(ShopConfig.ZFB_DEFAULT_APP_ID));
+		String returnUrl = orderPayBuilderDto.getReturnUrl();
+		String notifyUrl = orderPayBuilderDto.getNotifyUrl();
+		// 创建API对应的request
+		AlipayRequest alipayRequest = getAliAayRequest(orderPayBuilderDto);
+		if (alipayRequest == null) {
+			throw BusinessRuntimeException.getInstance("支付宝不支持该支付方式:{0}", orderPayBuilderDto.getProductCode());
+		}
+		if (StrUtil.isNotBlank(returnUrl)) {
+			alipayRequest.setReturnUrl(returnUrl);
+		}
+		alipayRequest.setNotifyUrl(notifyUrl);
+		String form = null;
+		try {
+			//调用SDK生成表单
+			//pagePay 统一下单接口
+			form = alipayClient.pageExecute(alipayRequest).getBody();
+		} catch (AlipayApiException e) {
+			log.error("支付宝生成表单错误:{}", StringUtil.getErrorText(e));
+		}
+		log.info("支付宝返回参数:{}", form);
+		return new AliPayParams(form);
+	}
+
+
+	/**
+	 * 支付宝获取不同的request
+	 */
+	private AlipayRequest getAliAayRequest(OrderPayBuilderDto payBuilderDto) throws Exception {
+		Long orderId = payBuilderDto.getOrderId();
+		BigDecimal money = payBuilderDto.getMoney();
+		String orderNo = payBuilderDto.getOrderNo();
+		//productCode 销售产品码,与支付宝签约的产品码名称
+		String productCode = payBuilderDto.getProductCode();
+		String subject = payBuilderDto.getSubject();
+		Date orderCreatedTime = payBuilderDto.getOrderCreatedTime();
+		//网页支付跳转模式
+		String qrPayMode = payBuilderDto.getPayMode();
+		OrderAttach attach = new OrderAttach();
+		attach.setO(orderId);
+		String body = Codec.DoBase64.custom()
+				.setData(Jsons.toJson(attach)).encodeAsText();
+		String moneyStr = money.divide(new BigDecimal(100), 2, RoundingMode.HALF_EVEN).toString();
+		if (ZfbProductCode.MOBILE_WEB.getProductCode().equals(productCode)) {
+			//手机网站支付
+			AlipayTradeWapPayRequest alipayTradeWapPayRequest = new AlipayTradeWapPayRequest();
+			//手机网站支付支付参数
+			AlipayTradeWapPayModel alipayTradeWapPayModel = new AlipayTradeWapPayModel();
+			alipayTradeWapPayModel.setBody(body);
+			alipayTradeWapPayModel.setOutTradeNo(orderNo);
+			alipayTradeWapPayModel.setTotalAmount(moneyStr);
+			alipayTradeWapPayModel.setSubject(subject);
+			alipayTradeWapPayModel.setProductCode(productCode);
+			//5分钟订单失效时间
+			alipayTradeWapPayModel.setTimeExpire(DateUtil.offsetMinute(orderCreatedTime, 5).toString());
+			alipayTradeWapPayRequest.setBizModel(alipayTradeWapPayModel);
+			return alipayTradeWapPayRequest;
+		} else if (ZfbProductCode.PC_WEB.getProductCode().equals(productCode)) {
+			//电脑网站支付
+			AlipayTradePagePayRequest alipayTradePagePayRequest = new AlipayTradePagePayRequest();
+			//电脑网站支付参数
+			AlipayTradePagePayModel alipayTradePagePayModel = new AlipayTradePagePayModel();
+			alipayTradePagePayModel.setBody(body);
+			alipayTradePagePayModel.setOutTradeNo(orderNo);
+			alipayTradePagePayModel.setTotalAmount(moneyStr);
+			alipayTradePagePayModel.setSubject(subject);
+			alipayTradePagePayModel.setProductCode(productCode);
+			//5分钟订单失效时间
+			alipayTradePagePayModel.setTimeExpire(DateUtil.offsetMinute(orderCreatedTime, 5).toString());
+			if (StrUtil.isEmpty(qrPayMode)) {
+				qrPayMode = BaseZfbConfig.qrPayMode_orderCode;
+			}
+			alipayTradePagePayModel.setQrPayMode(qrPayMode);
+			alipayTradePagePayRequest.setBizModel(alipayTradePagePayModel);
+			return alipayTradePagePayRequest;
+		}
+		return null;
+	}
+}

+ 17 - 0
wholesale/src/main/java/com/yhlxj/service/sys/SysConfigService.java

@@ -0,0 +1,17 @@
+package com.yhlxj.service.sys;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.yhlxj.dao.model.entity.SysConfig;
+
+/**
+ * @author chan
+ * @date 2022/10/20 10:07 AM
+ */
+public interface SysConfigService extends IService<SysConfig> {
+
+	/**
+	 * 获取默认系统默认商户主配置
+	 * @param type wx\zfb
+	 */
+	String getDefaultShopConfigByType(String type);
+}

+ 54 - 0
wholesale/src/main/java/com/yhlxj/service/sys/impl/SysConfigServiceImpl.java

@@ -0,0 +1,54 @@
+package com.yhlxj.service.sys.impl;
+
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.cyksj.common.constant.Constant;
+import com.cyksj.common.util.Jsons;
+import com.yhlxj.dao.mapper.SysConfigMapper;
+import com.yhlxj.dao.model.dto.DefaultShopConfig;
+import com.yhlxj.dao.model.entity.ShopConfig;
+import com.yhlxj.dao.model.entity.SysConfig;
+import com.yhlxj.service.sys.SysConfigService;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+import java.util.Optional;
+
+/**
+ * @author chan
+ * @date 2022/10/20 10:07 AM
+ */
+@Slf4j
+@Service
+@RequiredArgsConstructor
+public class SysConfigServiceImpl extends ServiceImpl<SysConfigMapper, SysConfig> implements SysConfigService {
+
+	@Override
+	public String getDefaultShopConfigByType(String type) {
+		SysConfig shopConfig = this.getOne(Wrappers.lambdaQuery(SysConfig.class)
+				.eq(SysConfig::getSysKey, Constant.SYS_DEFAULT_SHOP_KEY).last("limit 1"));
+		if (shopConfig == null) {
+			return getShopIdByType(type);
+		}
+		String sysValue = shopConfig.getSysValue();
+		try {
+			DefaultShopConfig defaultShopConfig = Jsons.parseObject(sysValue, DefaultShopConfig.class);
+			String wxDefaultAppId = defaultShopConfig.getWxDefaultAppId();
+			String zfbDefaultAppId = defaultShopConfig.getZfbDefaultAppId();
+			if ("wx".equals(type)) {
+				return Optional.ofNullable(wxDefaultAppId).orElse(ShopConfig.WX_DEFAULT_APP_ID);
+			}
+			return Optional.ofNullable(zfbDefaultAppId).orElse(ShopConfig.ZFB_DEFAULT_APP_ID);
+		} catch (Exception e) {
+
+		}
+		return getShopIdByType(type);
+	}
+	public String getShopIdByType(String type) {
+		if ("wx".equals(type)) {
+			return ShopConfig.WX_DEFAULT_APP_ID;
+		}
+		return ShopConfig.ZFB_DEFAULT_APP_ID;
+	}
+}

+ 93 - 0
wholesale/src/main/java/com/yhlxj/service/zfb/AliPayClientFactory.java

@@ -0,0 +1,93 @@
+package com.yhlxj.service.zfb;
+
+import com.alipay.api.AlipayClient;
+import com.alipay.api.AlipayConfig;
+import com.alipay.api.DefaultAlipayClient;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.cyksj.common.exception.BusinessRuntimeException;
+import com.cyksj.mapper.channel.ShopConfigMapper;
+import com.cyksj.model.entity.ShopConfig;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.PostConstruct;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+/*
+ *项目名: netflix
+ *文件名: AliPayClientFactory
+ *创建者: JavaZou
+ *创建时间:2022/11/2 11:18
+ */
+@Component
+public class AliPayClientFactory {
+	/**
+	 * 支付宝证书路径
+	 */
+	private static final String ALIPAY_CERT_PATH = "cert/alipay";
+
+	/**
+	 * 应用公钥证书名字
+	 */
+	private static final String ALIPAY_APP_PUBLIC_CERT_NAME = "appCertPublicKey.crt";
+
+	/**
+	 * 支付宝公钥证书名字
+	 */
+	private static final String ALIPAY_PUBLIC_CERT_NAME = "alipayCertPublicKey_RSA2.crt";
+
+	/**
+	 * 支付宝根证书名字
+	 */
+	private static final String ALIPAY_ROOT_CERT_NAME = "alipayRootCert.crt";
+
+	private static Map<String, AlipayClient> alipayClientMap = new ConcurrentHashMap<>();
+
+	@Autowired
+	private ShopConfigMapper shopConfigMapper;
+
+	/**
+	 * 初始化
+	 */
+	@PostConstruct
+	public void initAliPayClient() {
+		List<ShopConfig> zfbShopConfig = shopConfigMapper.selectList(Wrappers.lambdaQuery(ShopConfig.class)
+				.eq(ShopConfig::getType, "zfb"));
+		zfbShopConfig.forEach(config -> {
+			AlipayConfig alipayConfig = new AlipayConfig();
+			//网关地址
+			alipayConfig.setServerUrl(BaseZfbConfig.url);
+			alipayConfig.setAppId(config.getAppId());
+			alipayConfig.setPrivateKey(config.getAppPrivateKey());
+			alipayConfig.setFormat(BaseZfbConfig.format);
+			alipayConfig.setCharset(BaseZfbConfig.charset);
+			alipayConfig.setSignType(BaseZfbConfig.signType);
+			if (config.getIsCert()) {
+				String shopId = config.getAppId();
+				// 设置应用公钥证书路径
+				alipayConfig.setAppCertPath(String.format("%s/%s/%s", ALIPAY_CERT_PATH, shopId, ALIPAY_APP_PUBLIC_CERT_NAME));
+				// 设置支付宝公钥证书路径
+				alipayConfig.setAlipayPublicCertPath(String.format("%s/%s/%s", ALIPAY_CERT_PATH, shopId, ALIPAY_PUBLIC_CERT_NAME));
+				// 设置支付宝根证书路径
+				alipayConfig.setRootCertPath(String.format("%s/%s/%s", ALIPAY_CERT_PATH, shopId, ALIPAY_ROOT_CERT_NAME));
+			}
+			AlipayClient alipayClient = null;
+			try {
+				alipayClient = new DefaultAlipayClient(alipayConfig);
+			} catch (Exception e) {
+				return;
+			}
+			alipayClientMap.putIfAbsent(config.getAppId(), alipayClient);
+		});
+	}
+
+	public static AlipayClient getAlipayClient(String shopId) {
+		AlipayClient alipayClient = alipayClientMap.get(shopId);
+		if (alipayClient == null) {
+			throw BusinessRuntimeException.getInstance("未配置该支付宝商户");
+		}
+		return alipayClient;
+	}
+}

+ 67 - 0
wholesale/src/main/java/com/yhlxj/service/zfb/BaseZfbConfig.java

@@ -0,0 +1,67 @@
+package com.yhlxj.service.zfb;
+
+import lombok.Getter;
+import lombok.Setter;
+
+/*
+ *项目名: netflix
+ *文件名: BaseZfbConfig
+ *创建者: JavaZou
+ *创建时间:2022/11/2 10:38
+ */
+@Getter
+@Setter
+public class BaseZfbConfig {
+	/**
+	 * 请求支付宝的网关地址
+	 */
+	public static String url = "https://openapi.alipay.com/gateway.do";
+
+	/**
+	 * 参数返回格式
+	 */
+	public static String format = "JSON";
+
+	/**
+	 * 编码格式
+	 */
+	public static String  charset = "UTF-8";
+
+	/**
+	 * 签名算法
+	 */
+	public static String signType = "RSA2";
+
+	public static String returnUrl = "yinhe/web/ticket";
+
+	//前端成功页面
+	public static String SUCCESS_URL = "success/";
+
+	//手机支付 h5默认跳转 成功页
+	public static String DEFAULT_URL = "ticket";
+
+	public static String zfb_webWholesale_login_return_url = "yinhe/web/registerTicket";
+
+	public static String zfb_webWholesale_notify_url = "manage/wholesale/code/prepay/zfb/notify";
+
+	/**
+	 * qr_pay_mode PC扫码支付的方式。 跳转模式
+	 */
+	public static String qrPayMode_redirect = "2";
+
+	/**
+	 * qr_pay_mode PC扫码支付的方式。订单码 默认4嵌入
+	 */
+	public static String qrPayMode_orderCode = "4";
+
+
+	/**
+	 * 支付宝手机支付
+	 */
+	public static String ONE_STR = "1";
+
+	/**
+	 * 支付网页支付
+	 */
+	public static String TWO_STR = "2";
+}

+ 25 - 0
wholesale/src/main/java/com/yhlxj/service/zfb/ZfbProductCode.java

@@ -0,0 +1,25 @@
+package com.yhlxj.service.zfb;
+
+import lombok.Getter;
+
+/*
+ *项目名: netflix
+ *文件名: ZfbProductCode
+ *创建者: JavaZou
+ *创建时间:2022/11/2 14:44
+ */
+@Getter
+public enum ZfbProductCode {
+	MOBILE_WEB("支付宝手机网页支付", "QUICK_WAP_PAY"),
+	PC_WEB("支付宝电脑网站支付", "FAST_INSTANT_TRADE_PAY"),
+	TRANS_ACCOUNT_NO_PWD("单笔无密转账到固定支付宝账户", "TRANS_ACCOUNT_NO_PWD"),
+	STD_RED_PACKET("支付宝红包转账", "STD_RED_PACKET"),
+	;
+	String desc;
+	String productCode;
+
+	ZfbProductCode(String desc, String productCode) {
+		this.desc = desc;
+		this.productCode = productCode;
+	}
+}

+ 51 - 0
wholesale/src/main/java/com/yhlxj/web/config/SaTokenConfigure.java

@@ -0,0 +1,51 @@
+package com.yhlxj.web.config;
+
+import cn.dev33.satoken.interceptor.SaAnnotationInterceptor;
+import cn.dev33.satoken.interceptor.SaRouteInterceptor;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
+
+import java.util.List;
+
+/*
+ *项目名: yicang-admin
+ *文件名: SaTokenConfigure
+ *创建者: JavaZou
+ *创建时间:2022/12/19 10:01
+ */
+@Configuration
+public class SaTokenConfigure implements WebMvcConfigurer {
+	// 注册拦截器
+	@Override
+	public void addInterceptors(InterceptorRegistry registry) {
+		registry.addInterceptor(new SaRouteInterceptor())
+				.addPathPatterns(List.of("/manage/**", "/manager/**", "/sys/update", "/sys/delete/**"))
+				.excludePathPatterns(List.of("/manage/admin/login",
+						"/manage/admin/get/loginInfo",
+						"/manage/corp/**",
+						"/manage/coupon/corp/send",
+						"/manage/coupon",
+						"/manage/register/wx/refund/notify",
+						"/manage/register/unLimit",
+						"/manage/gzh/msg/notify",
+						"/manage/admin/send/template",
+						"/manage/order/put/status/*",
+						"/manage/user/get/loginInfo",
+						"/manage/user/login",
+						"/manage/admin/send/template",
+						"/manage/admin/callback",
+						"/manage/coupon/get/classification",
+						"/manage/account/get/latest/orders",
+						"/manage/account/get/expired/accounts",
+						"/manage/account/put/account",
+						"/manage/coupon/get/classificationList",
+						"/manage/coupon/get/couponList",
+						"manage/order/wx/refund/notify",
+						"/manage/goods/whole/sale/deposit/refund/notify",
+						"/manage/admin/get/yh/user/token"));
+		//注解权限校验
+		registry.addInterceptor(new SaAnnotationInterceptor()).addPathPatterns("/**");
+	}
+}
+

+ 52 - 11
wholesale/src/main/java/com/yhlxj/web/controller/manage/WholesaleCodeController.java

@@ -1,15 +1,15 @@
 package com.yhlxj.web.controller.manage;
 
-import cn.hutool.extra.servlet.ServletUtil;
 import com.cyksj.common.exception.BusinessRuntimeException;
-import com.cyksj.common.util.StringUtil;
 import com.ejlchina.searcher.BeanSearcher;
 import com.ejlchina.searcher.SearchResult;
 import com.ejlchina.searcher.util.MapUtils;
 import com.yhlxj.dao.model.dto.Result;
 import com.yhlxj.dao.model.entity.WebWholesaleOrderDon;
 import com.yhlxj.dao.model.enums.GatewayResponse;
+import com.yhlxj.dao.model.request.AlipayOrderDonReq;
 import com.yhlxj.dao.model.request.WebOrderPayRequest;
+import com.yhlxj.dao.model.response.AliPayTradeStatus;
 import com.yhlxj.dao.model.view.WebWholesaleCodeDetailView;
 import com.yhlxj.dao.model.view.WebWholesaleOrderView;
 import com.yhlxj.service.order.WebWholesaleOrderDonService;
@@ -20,6 +20,9 @@ import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 
 import javax.servlet.http.HttpServletRequest;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Set;
 
 /**
  * 项目名: yhlxj2
@@ -68,17 +71,9 @@ public class WholesaleCodeController {
 	@PostMapping("/post/submit")
 	public Result<WebWholesaleOrderDon> submit(@Validated @RequestBody WebOrderPayRequest payRequest) throws Exception {
 		final String methodName = "吊起兑换码预支付";
-		Long userId = "todo";
+		Long userId = StpUserUtil.getUserIdAfterLogin();
 		payRequest.setUserId(userId);
 		log.info("{}[start] params:{}", methodName, payRequest);
-
-		String ip = ServletUtil.getClientIP(request);
-		String address = StringUtil.getNewInternalAddressByIp(ip);
-		//address.contains("柬埔寨") ||
-		if (address != null && address.contains("缅甸")) {
-			throw BusinessRuntimeException.getInstance("用户异常");
-		}
-		payRequest.setIp(ip);
 		WebWholesaleOrderDon orderDon = webWholesaleOrderDonService.submit(payRequest);
 		return GatewayResponse.SUCCESS.newBuilder().toResult(orderDon);
 	}
@@ -88,9 +83,55 @@ public class WholesaleCodeController {
 	/**
 	 * 支付宝支付
 	 */
+	@PostMapping("/zfb/unified/pay")
+	public Result<String> zfbUnifiedPay(@RequestBody @Validated AlipayOrderDonReq re) throws Exception {
+		if (re.getType() == null) throw BusinessRuntimeException.getInstance("支付异常");
+		String pay_body = webWholesaleOrderDonService.zfbUnifiedPay(re).getBody();
+		return GatewayResponse.SUCCESS.newBuilder().toResult(pay_body);
+	}
 
 
 	/**
 	 * 支付宝回调
 	 */
+	@PostMapping("/prepay/zfb/notify")
+	public String aliPayNotify(HttpServletRequest request) throws Exception {
+		////将异步通知中收到的所有参数都存放到map中
+		Map<String, String> params = 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);
+			webWholesaleOrderDonService.aliPayNotify(params);
+		} else {
+			log.error("支付宝回调 error 状态不符合 成功或完成 status:{} ,orderNo:{}", tradeStatus, orderNo);
+			return "fail";
+		}
+		return "success";
+	}
+
+	/**
+	 * 获取支付宝回调参数
+	 */
+	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;
+	}
 }