阿里环球Antom支付对接
线上文档地址:
GitHub:https://github.com/alipay/global-open-sdk-java
文档:https://global.alipay.com/docs/ac/ams_zh-cn/session_cashier
maven:
<!--阿里国际支付-->
<dependency>
<groupId>com.alipay.global.sdk</groupId>
<artifactId>global-open-sdk-java</artifactId>
<version>2.0.49</version>
</dependency>
新增作用在实现类上的注解
import com.ycwl.blindBox.enums.PayTypeEnum;
import java.lang.annotation.*;
/**
* <p>支付方式策略类型</p>
*
* @Description
*/
//作用在类上
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
//子类可以继承此注解
@Inherited
public @interface PayType {
/**
* 支付方式策略类型
*
* @return 策略类型
*/
PayTypeEnum type();
}
编写配置实体:AntomConfig
import lombok.Data;
/**
* <p>DESC: </p>
* <p>VERSION:1.0.0</p>
*/
@Data
public class AntomConfig {
/**
* 支付网关地址
*/
private String gatewayUrl;
/**
* 商户私钥
*/
private String merchantPrivateKey;
/**
* 支付宝公钥
*/
private String alipayPublicKey;
/**
* 客户端 ID
*/
private String clientId;
/**
* 系统商户 ID
*/
private String referenceMerchantId;
/**
* 支付回调地址
*/
private String payNotifyUrl;
/**
* 退款回调地址
*/
private String refundNotifyUrl;
/**
* 货币代码
*/
private String currency;
/**
* 最小币种单位
*/
private String currencyValue;
}
编写服务类:AlipayService
import com.alipay.global.api.exception.AlipayApiException;
import com.alipay.global.api.request.ams.notify.AlipayPayResultNotify;
import com.alipay.global.api.request.ams.notify.AlipayRefundNotify;
import com.ycwl.blindBox.constant.baseResp.ApiResponse;
import com.ycwl.blindBox.model.common.AntomResultResp;
import com.ycwl.blindBox.model.common.StatusReqDTO;
import com.ycwl.blindBox.model.dto.BagBoxDeliverDTO;
import com.ycwl.blindBox.model.dto.BagBoxExchangeDTO;
import com.ycwl.blindBox.model.dto.BagBoxTrailDTO;
import com.ycwl.blindBox.model.dto.BagBoxTrailGruopGoodsDTO;
import com.ycwl.blindBox.model.dto.giveRecord.GiveAppReqDTO;
import com.ycwl.blindBox.model.vo.*;
import org.springframework.web.bind.annotation.RequestBody;
import java.math.BigDecimal;
import java.util.List;
import java.util.Set;
/**
* @author songmingsong
* @description antom支付
*/
public interface AlipayService {
/**
* 创建支付订单
*
* @param paymentRequestId 商户为标识支付请求所分配的专属 ID。Antom 使用此字段进行幂等性控制。
* @param orderId 在商户端标识订单的专属 ID,由直接向客户提供服务或商品的商户分配
* @param orderDescription 订单的摘要描述。此字段用于显示用户消费记录以及其他后续操作
* @param redirectUrl 用户完成支付后跳转到的商户页面链接。
* @return
* @throws AlipayApiException
*/
AntomPayResultVO createPayment(String paymentRequestId,
String orderId,
String orderDescription,
String redirectUrl,
BigDecimal amount) throws AlipayApiException;
/**
* 支付结果查询
*
* @param payOrderNo 支付订单号
* @return
* @throws AlipayApiException
*/
AntomPayResultVO paymentResultInquiry(String payOrderNo) throws AlipayApiException;
/**
* 取消支付
*
* @param payOrderNo 支付订单号
* @return
* @throws AlipayApiException
*/
AntomPayResultVO paymentCancel(String payOrderNo) throws AlipayApiException;
/**
* 支付回调
*
* @param alipayPayResultNotify
*/
AntomResultResp payNotify(AlipayPayResultNotify alipayPayResultNotify) throws AlipayApiException;
/**
* 退款
*
* @param refundVO
*/
AntomRefundResultVO refund(AntomRefundVO refundVO) throws AlipayApiException;
/**
* 退款结果查询
*
* @param payOrderNo 支付订单号
* @return
* @throws AlipayApiException
*/
AntomRefundResultVO refundInquiry(String payOrderNo) throws AlipayApiException;
/**
* 退款回调
*
* @param alipayRefundNotify
*/
AntomResultResp refundNotify(AlipayRefundNotify alipayRefundNotify);
}
服务实现类:AlipayServiceImpl
这里面包含了一些业务逻辑,不需要的话请删除
package com.ycwl.blindBox.service.impl;
import com.alibaba.fastjson2.JSONObject;
import com.alipay.global.api.AlipayClient;
import com.alipay.global.api.DefaultAlipayClient;
import com.alipay.global.api.exception.AlipayApiException;
import com.alipay.global.api.model.Result;
import com.alipay.global.api.model.ResultStatusType;
import com.alipay.global.api.model.ams.*;
import com.alipay.global.api.model.ams.Order;
import com.alipay.global.api.request.ams.notify.AlipayPayResultNotify;
import com.alipay.global.api.request.ams.notify.AlipayRefundNotify;
import com.alipay.global.api.request.ams.pay.*;
import com.alipay.global.api.response.ams.pay.*;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.ycwl.blindBox.annotation.PayType;
import com.ycwl.blindBox.config.ApplicationContextHelper;
import com.ycwl.blindBox.constant.OrderNoTypeConstant;
import com.ycwl.blindBox.constant.SystemSettingTypeConstant;
import com.ycwl.blindBox.enums.*;
import com.ycwl.blindBox.exception.BaseException;
import com.ycwl.blindBox.mapper.*;
import com.ycwl.blindBox.model.common.AntomConfig;
import com.ycwl.blindBox.model.common.AntomResultResp;
import com.ycwl.blindBox.model.dto.OrderParamDTO;
import com.ycwl.blindBox.model.dto.vipCard.VipCardAwardSetDTO;
import com.ycwl.blindBox.model.entity.*;
import com.ycwl.blindBox.model.vo.AntomPayResultVO;
import com.ycwl.blindBox.model.vo.AntomRefundResultVO;
import com.ycwl.blindBox.model.vo.AntomRefundVO;
import com.ycwl.blindBox.model.vo.PayParamVO;
import com.ycwl.blindBox.service.*;
import com.ycwl.blindBox.utils.capital.CapitalChangeUtil;
import com.ycwl.blindBox.utils.dateUtils.DateUtils;
import com.ycwl.blindBox.utils.pubfunc.PubfuncUtil;
import com.ycwl.blindBox.utils.snowFlakeUtils.SnowFlakeUtil;
import com.ycwl.blindBox.utils.userLevelUtils.UserLevelUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.time.OffsetDateTime;
import java.time.format.DateTimeFormatter;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
import static com.ycwl.blindBox.constant.SystemSettingTypeConstant.ANTOM;
import static com.ycwl.blindBox.enums.BizCodeEnum.*;
import static com.ycwl.blindBox.enums.SysSettingEnum.CZ_INTEGRAL;
import static com.ycwl.blindBox.enums.SysSettingEnum.GZ_INTEGRAL;
/**
* @Author: songmingsong
* @CreateTime: 2024-12-25
* @Description: 阿里Antom全球支付实现
* @Version: 1.0
*/
@PayType(type = PayTypeEnum.ONLINE)
@Component("AlipayServiceImpl")
@Slf4j
public class AlipayServiceImpl implements PayProcessingService, AlipayService {
@Autowired
private RefundRecordLogMapper refundRecordLogMapper;
@Autowired
private OrderMapper orderMapper;
@Autowired
private OrderExpressMapper orderExpressMapper;
@Autowired
private UserVipCardOrderMapper userVipCardOrderMapper;
@Autowired
private BlindBoxOrderServiceImpl blindBoxOrderService;
@Autowired
private UserVipCardMapper userVipCardMapper;
@Autowired
private VipCardAwardSetMapper awardSetMapper;
@Autowired
private VipCardAwardMapper awardMapper;
@Autowired
private UserCardAwardReceiveRecordMapper userCardAwardReceiveRecordMapper;
@Autowired
private VipCardMapper vipCardMapper;
@Autowired
private UserBalanceRechargeLogMapper userBalanceRechargeLogMapper;
@Autowired
private OrderService orderService;
@Autowired
private CapitalChangeUtil capitalChangeUtil;
@Autowired
private UserBalanceChangeLogMapper userBalanceChangeLogMapper;
@Autowired
private UserLevelUtil userLevelUtil;
@Autowired
private RechargeSettingMapper rechargeSettingMapper;
@Autowired
private BagServiceImpl bagService;
@Autowired
private ShopOrderServiceImpl shopOrderService;
@Autowired
private InviteNewRecordService inviteNewRecordService;
private final Map<String, Lock> lockMap = new ConcurrentHashMap<>();
private AntomConfig antomConfig =</