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