|
|
@@ -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;
|