| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255 |
- 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.baomidou.mybatisplus.core.toolkit.Wrappers;
- 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.mapper.order.OrderDonPostMapper;
- import com.cyksj.model.dto.AliPayParams;
- import com.cyksj.model.dto.OrderPayBuilderDto;
- import com.cyksj.model.entity.*;
- import com.cyksj.model.request.AlipayOrderDonReq;
- import com.cyksj.model.request.OrderAttach;
- import com.cyksj.service.pay.AliPayCommonService;
- 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.Date;
- import java.util.Optional;
- /*
- *项目名: netflix
- *文件名: AliPayCommonServiceImpl
- *创建者: JavaZou
- *创建时间:2023/6/14 15:19
- */
- @Service
- @RequiredArgsConstructor
- @Slf4j
- public class AliPayCommonServiceImpl implements AliPayCommonService {
- private final RegisterOrderDonMapper registerOrderDonMapper;
- private final OrderDonMapper orderDonMapper;
- private final GoodsDonMapper goodsDonMapper;
- private final ShopConfigMapper shopConfigMapper;
- private final EnvCommonService envCommonService;
- private final SysConfigService sysConfigService;
- private final OrderDonPostMapper orderDonPostMapper;
- @Override
- public AliPayParams unifiedPayRegister(Long orderId, String productCode, String payMode, String returnUrl) throws Exception {
- RegisterOrderDon orderDon = registerOrderDonMapper.selectById(orderId);
- Assert.notNull(orderDon, "订单不存在");
- if (StrUtil.isEmpty(productCode)) throw BusinessRuntimeException.getInstance("支付异常");
- //获取支付宝默认商户
- 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);
- }
- registerOrderDonMapper.updateById(orderDon);
- //回调地址
- String host = envCommonService.getHost();
- String notifyUrl = String.format("%s%s", host, BaseZfbConfig.zfb_register_notify_url);
- if (ZfbProductCode.MOBILE_WEB.getProductCode().equals(productCode) && BaseZfbConfig.qrPayMode_redirect.equals(payMode)) {
- returnUrl = String.format("%s%s", envCommonService.getDomain(), BaseZfbConfig.zfb_register_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;
- }
- @Override
- public AliPayParams unifiedPay(AlipayOrderDonReq re, String productCode, String payMode) throws Exception {
- Long orderId = re.getOrderId();
- String returnUrl = re.getReturnUrl();
- 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);
- if (ZfbProductCode.PC_WEB.getProductCode().equals(productCode)) {
- orderDon.setIsWebPay(true);
- }
- if (ZfbProductCode.MOBILE_WEB.getProductCode().equals(productCode)) {
- orderDon.setIsWebPay(false);
- }
- 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.notifyUrl);
- //手机h5 跳转
- OrderDonPost orderDonPost = orderDonPostMapper.selectOne(Wrappers.lambdaQuery(OrderDonPost.class)
- .eq(OrderDonPost::getOrderId, orderId).last("limit 1"));
- //百度回传 跳转
- Boolean is_bdPost = false;
- if (orderDonPost != null && OrderDonPost.Type.BaiDu == orderDonPost.getType()) {
- is_bdPost = true;
- }
- //是否在微信内支付 微信内支付宝支付后 支付宝回调页面不跳转
- Boolean isWx = Optional.ofNullable(re.getIsWx()).orElse(false);
- if (ZfbProductCode.MOBILE_WEB.getProductCode().equals(productCode) && !isWx) {
- if (is_bdPost) {
- //页面 拼接订单号,前端从url获取订单id.
- returnUrl = String.format("%s%s", envCommonService.getDomain(), BaseZfbConfig.SUCCESS_URL) + orderDon.getId();
- } else {
- //默认跳转页
- returnUrl = String.format("%s%s", envCommonService.getDomain(), BaseZfbConfig.DEFAULT_URL);
- }
- }
- 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;
- }
- }
|