增加支付、退款状态查询接口(后面考虑是否保留查询微信支付获取支付、退款详情的接口)返回是否成功状态

This commit is contained in:
jkcdev 2025-04-30 16:28:43 +08:00
parent 282b211b4b
commit ad34ae1f10
5 changed files with 144 additions and 66 deletions

View File

@ -70,6 +70,18 @@ public class EbikeWxPaymentController {
return r == null?JsonResult.failed(String.format("骑行订单号{%s}查询支付订单失败", outTradeNo)):JsonResult.success(r); return r == null?JsonResult.failed(String.format("骑行订单号{%s}查询支付订单失败", outTradeNo)):JsonResult.success(r);
} }
/**
* 通过交易订单号查询支付订单状态
*
* @param transactionId 微信支付订单号
* @return 支付订单信息
*/
@GetMapping("/queryOrderStatusById/{transactionId}")
public JsonResult<?> queryOrderStatusById(@PathVariable String transactionId) {
HandleNotifyResult r = wxPayService.queryOrderStatusById(transactionId);
return JsonResult.success(r);
}
/** /**
* 退款申请 * 退款申请
* *
@ -88,12 +100,14 @@ public class EbikeWxPaymentController {
* @param outRefundNo 商户(骑行)退款单号 * @param outRefundNo 商户(骑行)退款单号
* @return 退款信息 * @return 退款信息
*/ */
@GetMapping("/refundQuery/{outRefundNo}") @GetMapping("/queryRefund/{outRefundNo}")
public JsonResult<?> refundQuery(@PathVariable String outRefundNo) { public JsonResult<?> refundQuery(@PathVariable String outRefundNo) {
Refund r = wxPayService.queryRefundByOutNo(outRefundNo); Refund r = wxPayService.queryRefundByOutNo(outRefundNo);
return r == null?JsonResult.failed(String.format("退款单号{%s}查询退款失败", outRefundNo)):JsonResult.success(r); return r == null?JsonResult.failed(String.format("退款单号{%s}查询退款失败", outRefundNo)):JsonResult.success(r);
} }
// ================通知回调接口=============== // ================通知回调接口===============
// TODO 通知接口不能鉴权 // TODO 通知接口不能鉴权
/** /**

View File

@ -37,4 +37,11 @@ public interface EbikePaymentService extends IService<EbikePayment> {
*/ */
Boolean updatePaymentStatus(Transaction transaction); Boolean updatePaymentStatus(Transaction transaction);
/**
* 根据支付订单id查询支付记录
*
* @param paymentId 支付订单id
* @return
*/
EbikePayment getByPaymentId(String paymentId);
} }

View File

@ -26,6 +26,7 @@ public interface WxPayService {
* @return * @return
*/ */
boolean closeOrder(String outTradeNo); boolean closeOrder(String outTradeNo);
/** /**
* JSAPI支付下单 * JSAPI支付下单
* *
@ -46,6 +47,7 @@ public interface WxPayService {
* @return 支付订单信息 * @return 支付订单信息
*/ */
Transaction queryOrderById(String transactionId); Transaction queryOrderById(String transactionId);
/** /**
* 通过商户(骑行)订单号查询支付订单 * 通过商户(骑行)订单号查询支付订单
* *
@ -54,6 +56,14 @@ public interface WxPayService {
*/ */
Transaction queryOrderByOutTradeNo(String outTradeNo); Transaction queryOrderByOutTradeNo(String outTradeNo);
/**
* 通过交易订单号查询支付订单状态
*
* @param transactionId 微信支付订单号
* @return 支付订单信息
*/
HandleNotifyResult queryOrderStatusById(String transactionId);
/** /**
* 处理支付回调 * 处理支付回调
* *
@ -82,6 +92,14 @@ public interface WxPayService {
*/ */
Refund queryRefundByOutNo(String outRefundNo); Refund queryRefundByOutNo(String outRefundNo);
/**
* 通过商户退款单号查询退款信息状态
*
* @param outRefundNo 商户退款订单号
* @return 退款信息
*/
HandleNotifyResult queryRefundStatusByOutNo(String outRefundNo);
/** /**
* 处理支退款回调 * 处理支退款回调
* *

View File

@ -58,7 +58,7 @@ public class EbikePaymentServiceImpl extends ServiceImpl<EbikePaymentMapper, Ebi
ebikePayment.setTradeState(String.valueOf(transaction.getTradeState().ordinal())); ebikePayment.setTradeState(String.valueOf(transaction.getTradeState().ordinal()));
if (Transaction.TradeStateEnum.SUCCESS.equals(transaction.getTradeState())) { if (Transaction.TradeStateEnum.SUCCESS.equals(transaction.getTradeState())) {
// 支付成功 更新订单状态 // 支付成功 更新订单状态
double v = transaction.getAmount().getTotal().doubleValue() / 100.0; double v = transaction.getAmount().getPayerTotal().doubleValue() / 100.0;
ebikePayment.setTotal(v); ebikePayment.setTotal(v);
String paymentTime = transaction.getSuccessTime(); String paymentTime = transaction.getSuccessTime();
ebikePayment.setPaymentTime(StringUtils.toLocalDatetime(paymentTime)); ebikePayment.setPaymentTime(StringUtils.toLocalDatetime(paymentTime));
@ -73,4 +73,11 @@ public class EbikePaymentServiceImpl extends ServiceImpl<EbikePaymentMapper, Ebi
.where(EBIKE_PAYMENT.PAYMENT_ID.eq(transaction.getTransactionId())); .where(EBIKE_PAYMENT.PAYMENT_ID.eq(transaction.getTransactionId()));
return update(ebikePayment, query); return update(ebikePayment, query);
} }
@Override
public EbikePayment getByPaymentId(String paymentId) {
QueryWrapper query = QueryWrapper.create()
.where(EBIKE_PAYMENT.PAYMENT_ID.eq(paymentId));
return this.getOne(query);
}
} }

View File

@ -147,26 +147,44 @@ public class WxPayServiceImpl implements WxPayService {
@Override @Override
public Transaction queryOrderById(String transactionId) { public Transaction queryOrderById(String transactionId) {
try {
QueryOrderByIdRequest request = new QueryOrderByIdRequest(); QueryOrderByIdRequest request = new QueryOrderByIdRequest();
request.setTransactionId(transactionId); request.setTransactionId(transactionId);
return wxJsapiService.queryOrderById(request); return wxJsapiService.queryOrderById(request);
}catch (Exception e) {
logError("通过交易订单号查询支付订单queryOrderById", e);
}
return null;
} }
@Override @Override
public Transaction queryOrderByOutTradeNo(String outTradeNo) { public Transaction queryOrderByOutTradeNo(String outTradeNo) {
try {
QueryOrderByOutTradeNoRequest request = new QueryOrderByOutTradeNoRequest(); QueryOrderByOutTradeNoRequest request = new QueryOrderByOutTradeNoRequest();
request.setOutTradeNo(outTradeNo); request.setOutTradeNo(outTradeNo);
return wxJsapiService.queryOrderByOutTradeNo(request); return wxJsapiService.queryOrderByOutTradeNo(request);
}catch (Exception e) {
logError("通过商户(骑行)订单号查询支付订单queryOrderByOutTradeNo", e);
return null;
} }
@Override
public HandleNotifyResult queryOrderStatusById(String transactionId) {
// 先查本地数据库如果退款状态不为SUCCESS需要查询微信支付
HandleNotifyResult result = new HandleNotifyResult();
EbikePayment ebikePayment = ebikePaymentService.getByPaymentId(transactionId);
if (ebikePayment==null){
log.error("{}支付订单不存在", transactionId);
result.setMessage(String.format("{%s}支付订单不存在", transactionId));
return result;
}
result.setSuccess(String.valueOf(Transaction.TradeStateEnum.SUCCESS.ordinal()).equals(ebikePayment.getTradeState()));
if (result.isSuccess()){
result.setMessage(String.format("订单%s支付成功", ebikePayment.getOrderId()));
return result;
}
QueryOrderByIdRequest request = new QueryOrderByIdRequest();
request.setTransactionId(transactionId);
Transaction r = wxJsapiService.queryOrderById(request);
if(r!=null&& r.getTradeState().equals(Transaction.TradeStateEnum.SUCCESS)) {
result.setMessage(String.format("订单%s支付成功", ebikePayment.getOrderId()));
result.setSuccess(true);
// 更新支付状态
ebikePaymentService.updatePaymentStatus(r);
return result;
}
return result;
} }
@Override @Override
@ -177,14 +195,12 @@ public class WxPayServiceImpl implements WxPayService {
String nonce = request.getHeader(WECHAT_PAY_NONCE); String nonce = request.getHeader(WECHAT_PAY_NONCE);
String serialNo = request.getHeader(WECHAT_PAY_SERIAL); String serialNo = request.getHeader(WECHAT_PAY_SERIAL);
String signature = request.getHeader(WECHAT_PAY_SIGNATURE); String signature = request.getHeader(WECHAT_PAY_SIGNATURE);
String signatureType = request.getHeader(WECHAT_PAY_SIGNATURE+"-Type");
String timestamp = request.getHeader(WECHAT_PAY_TIMESTAMP); String timestamp = request.getHeader(WECHAT_PAY_TIMESTAMP);
try { try {
RequestParam requestParam = new RequestParam.Builder() RequestParam requestParam = new RequestParam.Builder()
.serialNumber(serialNo) .serialNumber(serialNo)
.signature(signature) .signature(signature)
.signType(signatureType)
.timestamp(timestamp) .timestamp(timestamp)
.body(HttpServletUtils.getRequestBody(request)) .body(HttpServletUtils.getRequestBody(request))
.nonce(nonce) .nonce(nonce)
@ -208,7 +224,6 @@ public class WxPayServiceImpl implements WxPayService {
@Override @Override
public String refund(String transactionId, String outTradeNo, String reason, AmountRefundDto amount) { public String refund(String transactionId, String outTradeNo, String reason, AmountRefundDto amount) {
try {
// 雪花算法生成退款单号 // 雪花算法生成退款单号
String outRefundNo = StringUtils.generateSnowflakeId("refundId"); String outRefundNo = StringUtils.generateSnowflakeId("refundId");
EbikeRefund ebikeRefund = new EbikeRefund(); EbikeRefund ebikeRefund = new EbikeRefund();
@ -244,22 +259,41 @@ public class WxPayServiceImpl implements WxPayService {
} }
log.error("退款申请refund失败订单号{}", outTradeNo); log.error("退款申请refund失败订单号{}", outTradeNo);
return null; return null;
}catch (Exception e) {
logError("退款申请refund", e);
return null;
}
} }
@Override @Override
public Refund queryRefundByOutNo(String outRefundNo) { public Refund queryRefundByOutNo(String outRefundNo) {
try {
QueryByOutRefundNoRequest request = new QueryByOutRefundNoRequest(); QueryByOutRefundNoRequest request = new QueryByOutRefundNoRequest();
request.setOutRefundNo(outRefundNo); request.setOutRefundNo(outRefundNo);
return wxRefundService.queryByOutRefundNo(request); return wxRefundService.queryByOutRefundNo(request);
}catch (Exception e) {
logError("通过商户退款单号查询退款queryByOutRefundNo", e);
return null;
} }
@Override
public HandleNotifyResult queryRefundStatusByOutNo(String outRefundNo) {
HandleNotifyResult result = new HandleNotifyResult();
// 先查本地数据库如果退款状态不为SUCCESS需要查询微信支付
EbikeRefund ebikeRefund = ebikeRefundService.getById(outRefundNo);
if (ebikeRefund==null){
log.error("{}退款订单不存在", outRefundNo);
result.setMessage(String.format("{%s}退款订单不存在", outRefundNo));
return result;
}
result.setSuccess(String.valueOf(Status.SUCCESS.ordinal()).equals(ebikeRefund.getStatus()));
if (result.isSuccess()){
result.setMessage(String.format("退款%s成功", ebikeRefund.getRefundId()));
return result;
}
QueryByOutRefundNoRequest request = new QueryByOutRefundNoRequest();
request.setOutRefundNo(outRefundNo);
Refund r = wxRefundService.queryByOutRefundNo(request);
if(r!=null&& r.getStatus().equals(Status.SUCCESS)) {
result.setMessage(String.format("退款%s成功", ebikeRefund.getRefundId()));
result.setSuccess(true);
// 更新退款状态
ebikeRefundService.updateRefundStatus(r);
return result;
}
return result;
} }
@Override @Override
@ -270,14 +304,12 @@ public class WxPayServiceImpl implements WxPayService {
String nonce = request.getHeader(WECHAT_PAY_NONCE); String nonce = request.getHeader(WECHAT_PAY_NONCE);
String serialNo = request.getHeader(WECHAT_PAY_SERIAL); String serialNo = request.getHeader(WECHAT_PAY_SERIAL);
String signature = request.getHeader(WECHAT_PAY_SIGNATURE); String signature = request.getHeader(WECHAT_PAY_SIGNATURE);
String signatureType = request.getHeader(WECHAT_PAY_SIGNATURE+"-Type");
String timestamp = request.getHeader(WECHAT_PAY_TIMESTAMP); String timestamp = request.getHeader(WECHAT_PAY_TIMESTAMP);
try { try {
RequestParam requestParam = new RequestParam.Builder() RequestParam requestParam = new RequestParam.Builder()
.serialNumber(serialNo) .serialNumber(serialNo)
.signature(signature) .signature(signature)
.signType(signatureType)
.timestamp(timestamp) .timestamp(timestamp)
.body(HttpServletUtils.getRequestBody(request)) .body(HttpServletUtils.getRequestBody(request))
.nonce(nonce) .nonce(nonce)