refactor(mcwl-pay): 调整支付状态查询逻辑

master
yang 2025-03-11 09:48:33 +08:00
parent ed5909b837
commit 5a684c3829
1 changed files with 41 additions and 21 deletions

View File

@ -13,18 +13,20 @@ import com.alipay.api.AlipayConfig;
import com.alipay.api.DefaultAlipayClient;
import com.alipay.api.domain.AlipayFundAccountQueryModel;
import com.alipay.api.domain.AlipayFundTransUniTransferModel;
import com.alipay.api.domain.AlipayTradeQueryModel;
import com.alipay.api.domain.Participant;
import com.alipay.api.internal.util.file.IOUtils;
import com.alipay.api.request.AlipayFundAccountQueryRequest;
import com.alipay.api.request.AlipayFundTransUniTransferRequest;
import com.alipay.api.request.AlipaySystemOauthTokenRequest;
import com.alipay.api.request.AlipayTradeQueryRequest;
import com.alipay.api.response.AlipayFundAccountQueryResponse;
import com.alipay.api.response.AlipayFundTransUniTransferResponse;
import com.alipay.api.response.AlipaySystemOauthTokenResponse;
import com.alipay.api.response.AlipayTradeQueryResponse;
import com.alipay.easysdk.factory.Factory;
import com.alipay.easysdk.kernel.Config;
import com.alipay.easysdk.payment.common.models.AlipayTradeCancelResponse;
import com.alipay.easysdk.payment.common.models.AlipayTradeQueryResponse;
import com.alipay.easysdk.payment.facetoface.models.AlipayTradePrecreateResponse;
import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper;
import com.mcwl.common.JSONUtils;
@ -33,6 +35,7 @@ import com.mcwl.common.core.domain.R;
import com.mcwl.common.core.domain.entity.SysUser;
import com.mcwl.common.core.redis.RedisCache;
import com.mcwl.common.exception.ServiceException;
import com.mcwl.common.utils.DateUtils;
import com.mcwl.common.utils.SecurityUtils;
import com.mcwl.common.utils.ShareCodeUtils;
import com.mcwl.common.utils.StringUtils;
@ -59,6 +62,7 @@ import org.springframework.util.ResourceUtils;
import java.io.FileNotFoundException;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.concurrent.TimeUnit;
@ -431,17 +435,30 @@ public class AliPayServiceImpl implements AliPayService {
if (orderTrade.getPayStatus() == 1) {
// 查询支付宝订单
Object tradStatus = this.getTradStatus(outTradeNo);
String jsonString = JSONObject.toJSONString(tradStatus);
JSONObject jsonObject = JSONObject.parseObject(jsonString);
Object tradeStatus = jsonObject.get("trade_status");
AlipayTradeQueryResponse tradStatus;
try {
tradStatus = this.getTradStatus(outTradeNo);
} catch (Exception e) {
log.error("支付状态获取失败,原始内容: {}", e.getMessage());
return R.ok(0);
}
// 返回交易结果, 是否交易成功需要根据该对象中的 trade_status 来确定
// trade_status 的枚举值如下, 请见 https://opendocs.alipay.com/apis/api_1/alipay.trade.query
// WAIT_BUYER_PAY交易创建等待买家付款
// TRADE_CLOSED未付款交易超时关闭或支付完成后全额退款
// TRADE_SUCCESS交易支付成功
// TRADE_FINISHED交易结束不可退款
// 当 trade_status 等于 TRADE_SUCCESS 或 TRADE_FINISHED 时, 表示支付成功
String tradeStatus = tradStatus.getTradeStatus();
if (Objects.nonNull(tradeStatus) && tradeStatus.equals("TRADE_SUCCESS")) {
Map<String, String> params = new HashMap<>();
params.put("buyer_pay_amount", jsonObject.get("buyer_pay_amount").toString());
params.put("out_trade_no", jsonObject.get("out_trade_no").toString());
params.put("gmt_payment", jsonObject.get("send_pay_date").toString());
params.put("total_amount", jsonObject.get("total_amount").toString());
params.put("trade_no", jsonObject.get("trade_no").toString());
params.put("buyer_pay_amount", tradStatus.getBuyerPayAmount());
params.put("out_trade_no", tradStatus.getOutTradeNo());
params.put("gmt_payment",DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD_HH_MM_SS, tradStatus.getSendPayDate()));
params.put("total_amount", tradStatus.getTotalAmount());
params.put("trade_no", tradStatus.getTradeNo());
String code = orderTrade.getCode();
// 获取订单后缀
String suffix = code.substring(code.lastIndexOf("_") + 1);
@ -535,18 +552,21 @@ public class AliPayServiceImpl implements AliPayService {
}
private Object getTradStatus(String outTradeNo) throws Exception {
AlipayTradeQueryResponse query = Factory.Payment.Common().query(outTradeNo);
Map<String, Object> map = JSONUtils.jsonToMap(query.getHttpBody());
private AlipayTradeQueryResponse getTradStatus(String outTradeNo) throws Exception {
// 初始化SDK
AlipayClient alipayClient = new DefaultAlipayClient(getAlipayConfig());
// 返回交易结果, 是否交易成功需要根据该对象中的 trade_status 来确定
// trade_status 的枚举值如下, 请见 https://opendocs.alipay.com/apis/api_1/alipay.trade.query
// WAIT_BUYER_PAY交易创建等待买家付款
// TRADE_CLOSED未付款交易超时关闭或支付完成后全额退款
// TRADE_SUCCESS交易支付成功
// TRADE_FINISHED交易结束不可退款
// 当 trade_status 等于 TRADE_SUCCESS 或 TRADE_FINISHED 时, 表示支付成功
return map.get("alipay_trade_query_response");
// 构造请求参数以调用接口
AlipayTradeQueryRequest request = new AlipayTradeQueryRequest();
AlipayTradeQueryModel model = new AlipayTradeQueryModel();
// 设置订单支付时传入的商户订单号
model.setOutTradeNo(outTradeNo);
request.setBizModel(model);
AlipayTradeQueryResponse response = alipayClient.certificateExecute(request);
return response;
}
private void addLogAndUpdateUserWallet(SysUser sysUser, String amount) {