|
|
@@ -0,0 +1,155 @@
|
|
|
+package com.cyksj.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.EnvCommonService;
|
|
|
+import com.cyksj.common.exception.BusinessRuntimeException;
|
|
|
+import com.cyksj.common.util.Codec;
|
|
|
+import com.cyksj.common.util.Jsons;
|
|
|
+import com.cyksj.config.zfb.AliPayClientFactory;
|
|
|
+import com.cyksj.config.zfb.BaseZfbConfig;
|
|
|
+import com.cyksj.config.zfb.ZfbProductCode;
|
|
|
+import com.cyksj.model.dto.AliPayParams;
|
|
|
+import com.cyksj.model.entity.*;
|
|
|
+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;
|
|
|
+import org.springframework.stereotype.Service;
|
|
|
+
|
|
|
+import java.math.BigDecimal;
|
|
|
+import java.math.RoundingMode;
|
|
|
+import java.util.Optional;
|
|
|
+
|
|
|
+/*
|
|
|
+ *项目名: netflix
|
|
|
+ *文件名: AliPayCommonServiceImpl
|
|
|
+ *创建者: JavaZou
|
|
|
+ *创建时间:2023/6/14 15:19
|
|
|
+ */
|
|
|
+@Service
|
|
|
+@RequiredArgsConstructor
|
|
|
+@Slf4j
|
|
|
+public class AliPayCommonServiceImpl implements AliPayCommonService {
|
|
|
+ private final RegisterOrderDonService registerOrderDonService;
|
|
|
+
|
|
|
+ private final EnvCommonService envCommonService;
|
|
|
+
|
|
|
+ private final SysConfigService sysConfigService;
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public String unifiedPayRegister(Long orderId, Integer type, Integer payMode, String returnUrl) throws Exception {
|
|
|
+ RegisterOrderDon orderDon = registerOrderDonService.getById(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;
|
|
|
+ }
|
|
|
+ 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);
|
|
|
+ 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);
|
|
|
+ }
|
|
|
+ //回调地址
|
|
|
+ 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)) {
|
|
|
+ alipayRequest.setReturnUrl(returnUrl);
|
|
|
+ }
|
|
|
+ alipayRequest.setNotifyUrl(notifyUrl);
|
|
|
+ String form = null;
|
|
|
+ try {
|
|
|
+ //调用SDK生成表单
|
|
|
+ //pagePay 统一下单接口
|
|
|
+ form = alipayClient.pageExecute(alipayRequest).getBody();
|
|
|
+ } catch (AlipayApiException e) {
|
|
|
+ log.error("支付宝生成表单错误:{}", e == null ? null : e.getMessage());
|
|
|
+ }
|
|
|
+ log.info("支付宝返回参数:{}", form);
|
|
|
+ return new AliPayParams(form);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 支付宝获取不同的request
|
|
|
+ * @param productCode 销售产品码,与支付宝签约的产品码名称
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ private AlipayRequest getAliAayRequest(RegisterOrderDon orderDon, String productCode, String qrPayMode) throws Exception {
|
|
|
+ OrderAttach attach = new OrderAttach();
|
|
|
+ attach.setO(orderDon.getId());
|
|
|
+ String body = Codec.DoBase64.custom()
|
|
|
+ .setData(Jsons.toJson(attach)).encodeAsText();
|
|
|
+ String subject = "注册服务";
|
|
|
+ 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.setSubject(subject);
|
|
|
+ alipayTradeWapPayModel.setProductCode(productCode);
|
|
|
+ //5分钟订单失效时间
|
|
|
+ alipayTradeWapPayModel.setTimeExpire(DateUtil.offsetMinute(orderDon.getCreatedTime(), 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(orderDon.getOrderNo());
|
|
|
+ alipayTradePagePayModel.setTotalAmount(orderDon.getMoney().divide(new BigDecimal(100), 2, RoundingMode.HALF_EVEN).toString());
|
|
|
+ alipayTradePagePayModel.setSubject(subject);
|
|
|
+ alipayTradePagePayModel.setProductCode(productCode);
|
|
|
+ //5分钟订单失效时间
|
|
|
+ alipayTradePagePayModel.setTimeExpire(DateUtil.offsetMinute(orderDon.getCreatedTime(), 5).toString());
|
|
|
+ alipayTradePagePayModel.setQrPayMode(qrPayMode);
|
|
|
+ alipayTradePagePayRequest.setBizModel(alipayTradePagePayModel);
|
|
|
+ return alipayTradePagePayRequest;
|
|
|
+ }
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+}
|