Ver código fonte

fix 注册支付宝支付

zoujiajian 3 anos atrás
pai
commit
74ce8aee9f

+ 37 - 0
netflix-dao/src/main/java/com/cyksj/model/dto/OrderPayBuilderDto.java

@@ -0,0 +1,37 @@
+package com.cyksj.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;
+}

+ 2 - 0
netflix-service/src/main/java/com/cyksj/service/pay/AliPayCommonService.java

@@ -15,4 +15,6 @@ public interface AliPayCommonService {
 	 * @return
 	 */
 	String unifiedPayRegister(Long orderId, Integer type, Integer payMode, String returnUrl) throws Exception;
+
+	String unifiedPay(Long orderId, Integer type, Integer payMode, String returnUrl, String productCode, String mode) throws Exception;
 }

+ 117 - 39
netflix-service/src/main/java/com/cyksj/service/pay/impl/AliPayCommonServiceImpl.java

@@ -14,14 +14,22 @@ import com.cyksj.common.EnvCommonService;
 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.cyksj.config.zfb.AliPayClientFactory;
 import com.cyksj.config.zfb.BaseZfbConfig;
 import com.cyksj.config.zfb.ZfbProductCode;
+import com.cyksj.mapper.GoodsDonMapper;
+import com.cyksj.mapper.OrderDonMapper;
+import com.cyksj.mapper.RegisterOrderDonMapper;
+import com.cyksj.mapper.channel.ShopConfigMapper;
 import com.cyksj.model.dto.AliPayParams;
-import com.cyksj.model.entity.*;
+import com.cyksj.model.dto.OrderPayBuilderDto;
+import com.cyksj.model.entity.GoodsDon;
+import com.cyksj.model.entity.OrderDon;
+import com.cyksj.model.entity.RegisterOrderDon;
+import com.cyksj.model.entity.ShopConfig;
 import com.cyksj.model.request.OrderAttach;
 import com.cyksj.service.pay.AliPayCommonService;
-import com.cyksj.service.register.RegisterOrderDonService;
 import com.cyksj.service.sys.SysConfigService;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
@@ -29,6 +37,7 @@ import org.springframework.stereotype.Service;
 
 import java.math.BigDecimal;
 import java.math.RoundingMode;
+import java.util.Date;
 import java.util.Optional;
 
 /*
@@ -41,7 +50,13 @@ import java.util.Optional;
 @RequiredArgsConstructor
 @Slf4j
 public class AliPayCommonServiceImpl implements AliPayCommonService {
-	private final RegisterOrderDonService registerOrderDonService;
+	private final RegisterOrderDonMapper registerOrderDonMapper;
+
+	private final OrderDonMapper orderDonMapper;
+
+	private final GoodsDonMapper goodsDonMapper;
+
+	private final ShopConfigMapper shopConfigMapper;
 
 	private final EnvCommonService envCommonService;
 
@@ -49,51 +64,107 @@ public class AliPayCommonServiceImpl implements AliPayCommonService {
 
 	@Override
 	public String unifiedPayRegister(Long orderId, Integer type, Integer payMode, String returnUrl) throws Exception {
-		RegisterOrderDon orderDon = registerOrderDonService.getById(orderId);
+		RegisterOrderDon orderDon = registerOrderDonMapper.selectById(orderId);
 		Assert.notNull(orderDon, "订单不存在");
 		if (type == null) throw BusinessRuntimeException.getInstance("请选择对应支付方式");
 		String productCode = StrUtil.EMPTY;
-		String mode = null;
 		if (type == 1) {
 			productCode = ZfbProductCode.MOBILE_WEB.getProductCode();
 		}
 		if (type == 2) {
 			productCode = ZfbProductCode.PC_WEB.getProductCode();
-			mode = String.valueOf(payMode);
 		}
 		if (StrUtil.isEmpty(productCode)) throw BusinessRuntimeException.getInstance("支付异常");
-		Boolean isFlag = false;
 		//获取支付宝默认商户
-		if (StrUtil.isEmpty(orderDon.getShopId())) {
-			String shopId = sysConfigService.getDefaultShopConfigByType("zfb");
-			orderDon.setShopId(shopId);
-			orderDon.setType(RegisterOrderDon.Type.ALI_PAY);
-			isFlag = true;
-		}
+		String shopId = sysConfigService.getDefaultShopConfigByType("zfb");
+		orderDon.setShopId(shopId);
+		orderDon.setType(RegisterOrderDon.Type.ALI_PAY);
 		if (orderDon.getType() != RegisterOrderDon.Type.ALI_PAY) {
 			orderDon.setType(RegisterOrderDon.Type.ALI_PAY);
-			isFlag = true;
 		}
-		if (isFlag) registerOrderDonService.updateById(orderDon);
-		AliPayParams aliPayParams = commonAliPay(orderDon, returnUrl, productCode, orderDon.getShopId(), mode);
+		registerOrderDonMapper.updateById(orderDon);
+		//回调地址
+		String host = envCommonService.getHost();
+		String notifyUrl = String.format("%s%s", host, BaseZfbConfig.zfb_register_notify_url);
+		if (type == 2 && payMode == 2) {
+			returnUrl = String.format("%s%s", envCommonService.getDomain(), BaseZfbConfig.zfb_register_login_return_url);
+		}
+		String subject = "注册服务";
+		AliPayParams aliPayParams = builderPayParams(orderDon.getId(),
+				orderDon.getShopId(),
+				orderDon.getMoney(),
+				orderDon.getCreatedTime(),
+				subject,
+				productCode,
+				String.valueOf(payMode),
+				notifyUrl,
+				returnUrl);
 		String body = aliPayParams.getBody();
 		return body;
 	}
 
-	public AliPayParams commonAliPay(RegisterOrderDon registerOrderDon, String returnUrl, String productCode, String appId, String qrPayMode) throws Exception {
-		AlipayClient alipayClient = AliPayClientFactory.getAlipayClient(Optional.ofNullable(appId).orElse(ShopConfig.ZFB_DEFAULT_APP_ID));
-		// 创建API对应的request
-		AlipayRequest alipayRequest = getAliAayRequest(registerOrderDon, productCode, qrPayMode);
-		if (alipayRequest == null) {
-			throw BusinessRuntimeException.getInstance("支付宝不支持该支付方式:{0}", productCode);
+	@Override
+	public String unifiedPay(Long orderId, Integer type, Integer payMode, String returnUrl, String productCode, String mode) throws Exception {
+		OrderDon orderDon = orderDonMapper.selectById(orderId);
+		//获取支付宝默认商户
+		String appId = sysConfigService.getDefaultShopConfigByType("zfb");
+		if (orderDon.getPopularizeId() != null) {
+			ShopConfig shopConfig = shopConfigMapper.getByChannelPopularizeId(orderDon.getPopularizeId(), "zfb");
+			if (shopConfig != null) {
+				appId = shopConfig.getAppId();
+			}
 		}
+		if (OrderDon.Type.ALI_PAY != orderDon.getType()) {
+			orderDon.setType(OrderDon.Type.ALI_PAY);
+		}
+		orderDon.setShopId(appId);
+		orderDonMapper.updateById(orderDon);
+		GoodsDon goodsDon = goodsDonMapper.selectById(orderDon.getGoodsId());
+		String subject = goodsDon.getTitle().contains("ChatGPT") ? "AI订阅" : goodsDon.getTitle();
 		//回调地址
 		String host = envCommonService.getHost();
-		String notifyUrl = String.format("%s%s", host, BaseZfbConfig.zfb_register_notify_url);
-		if (BaseZfbConfig.qrPayMode_redirect.equals(qrPayMode)) {
-			returnUrl = String.format("%s%s", envCommonService.getDomain(), BaseZfbConfig.zfb_register_login_return_url);
-			alipayRequest.setReturnUrl(returnUrl);
-		} else if (StrUtil.isNotBlank(returnUrl)) {
+		String notifyUrl = String.format("%s%s", host, BaseZfbConfig.notifyUrl);
+		if (type == 2 && payMode == 2) {
+			returnUrl = String.format("%s%s", envCommonService.getDomain(), BaseZfbConfig.loginReturnUrl);
+		}
+		AliPayParams aliPayParams = builderPayParams(orderDon.getId(),
+				orderDon.getShopId(),
+				orderDon.getMoney(),
+				orderDon.getCreatedTime(),
+				subject,
+				productCode,
+				String.valueOf(payMode),
+				notifyUrl,
+				returnUrl);
+		String body = aliPayParams.getBody();
+		return body;
+	}
+
+	public AliPayParams builderPayParams(Long orderId, 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.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);
@@ -103,7 +174,7 @@ public class AliPayCommonServiceImpl implements AliPayCommonService {
 			//pagePay 统一下单接口
 			form = alipayClient.pageExecute(alipayRequest).getBody();
 		} catch (AlipayApiException e) {
-			log.error("支付宝生成表单错误:{}", e == null ? null : e.getMessage());
+			log.error("支付宝生成表单错误:{}", StringUtil.getErrorText(e));
 		}
 		log.info("支付宝返回参数:{}", form);
 		return new AliPayParams(form);
@@ -111,27 +182,34 @@ public class AliPayCommonServiceImpl implements AliPayCommonService {
 
 	/**
 	 * 支付宝获取不同的request
-	 * @param productCode 销售产品码,与支付宝签约的产品码名称
-	 * @return
 	 */
-	private AlipayRequest getAliAayRequest(RegisterOrderDon orderDon, String productCode, String qrPayMode) throws Exception {
+	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(orderDon.getId());
+		attach.setO(orderId);
 		String body = Codec.DoBase64.custom()
 				.setData(Jsons.toJson(attach)).encodeAsText();
-		String subject = "注册服务";
+		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(orderDon.getOrderNo());
-			alipayTradeWapPayModel.setTotalAmount(orderDon.getMoney().divide(new BigDecimal(100), 2, RoundingMode.HALF_EVEN).toString());
+			alipayTradeWapPayModel.setOutTradeNo(orderNo);
+			alipayTradeWapPayModel.setTotalAmount(moneyStr);
 			alipayTradeWapPayModel.setSubject(subject);
 			alipayTradeWapPayModel.setProductCode(productCode);
 			//5分钟订单失效时间
-			alipayTradeWapPayModel.setTimeExpire(DateUtil.offsetMinute(orderDon.getCreatedTime(), 5).toString());
+			alipayTradeWapPayModel.setTimeExpire(DateUtil.offsetMinute(orderCreatedTime, 5).toString());
 			alipayTradeWapPayRequest.setBizModel(alipayTradeWapPayModel);
 			return alipayTradeWapPayRequest;
 		} else if (ZfbProductCode.PC_WEB.getProductCode().equals(productCode)) {
@@ -140,12 +218,12 @@ public class AliPayCommonServiceImpl implements AliPayCommonService {
 			//电脑网站支付参数
 			AlipayTradePagePayModel alipayTradePagePayModel = new AlipayTradePagePayModel();
 			alipayTradePagePayModel.setBody(body);
-			alipayTradePagePayModel.setOutTradeNo(orderDon.getOrderNo());
-			alipayTradePagePayModel.setTotalAmount(orderDon.getMoney().divide(new BigDecimal(100), 2, RoundingMode.HALF_EVEN).toString());
+			alipayTradePagePayModel.setOutTradeNo(orderNo);
+			alipayTradePagePayModel.setTotalAmount(moneyStr);
 			alipayTradePagePayModel.setSubject(subject);
 			alipayTradePagePayModel.setProductCode(productCode);
 			//5分钟订单失效时间
-			alipayTradePagePayModel.setTimeExpire(DateUtil.offsetMinute(orderDon.getCreatedTime(), 5).toString());
+			alipayTradePagePayModel.setTimeExpire(DateUtil.offsetMinute(orderCreatedTime, 5).toString());
 			alipayTradePagePayModel.setQrPayMode(qrPayMode);
 			alipayTradePagePayRequest.setBizModel(alipayTradePagePayModel);
 			return alipayTradePagePayRequest;

+ 1 - 1
netflix-web/src/main/java/com/cyksj/web/controller/manage/register/CmsRegisterController.java

@@ -179,7 +179,7 @@ public class CmsRegisterController {
      * 注册 统一退款
      */
     @PostMapping("/unified/refund")
-    public Result<String> unifiedRefund(@RequestBody @Validated OrderRefundReq refundReq) {
+    public Result<String> unifiedRefund(@RequestBody @Validated OrderRefundReq refundReq) throws Exception {
         registerOrderDonService.unifiedRefund(refundReq);
         return GatewayResponse.SUCCESS.newBuilder().toResult();
     }

+ 6 - 1
netflix-web/src/main/java/com/cyksj/web/controller/register/RegisterController.java

@@ -130,8 +130,13 @@ public class RegisterController {
      * 支付宝支付
      */
     @PostMapping("/zfb/unified/pay")
-    public Result<String> zfbUnifiedPay(@RequestBody @Validated AlipayOrderDonReq re) throws Exception {
+    public Result<String> zfbUnifiedPay(@RequestBody @Validated AlipayOrderDonReq re,HttpServletResponse response) throws Exception {
         String pay_body = registerOrderDonService.zfbUnifiedPay(re);
+//        response.setContentType("text/html;charset=" + BaseZfbConfig.charset);
+//        //直接将完整的表单html输出到页面
+//        response.getWriter().write(pay_body);
+//        response.getWriter().flush();
+//        response.getWriter().close();
         return GatewayResponse.SUCCESS.newBuilder().toResult(pay_body);
     }