diff --git a/mall-pay/src/main/java/com/suisung/mall/pay/service/impl/LakalaPayServiceImpl.java b/mall-pay/src/main/java/com/suisung/mall/pay/service/impl/LakalaPayServiceImpl.java index cab6498d..84ef10f2 100644 --- a/mall-pay/src/main/java/com/suisung/mall/pay/service/impl/LakalaPayServiceImpl.java +++ b/mall-pay/src/main/java/com/suisung/mall/pay/service/impl/LakalaPayServiceImpl.java @@ -52,7 +52,7 @@ import java.util.List; @Service public class LakalaPayServiceImpl implements LakalaPayService { private static final boolean init = false; - + @Value("${lakala.server_url}") private String serverUrl; //服务地址 @Value("${lakala.app_id}") @@ -230,6 +230,9 @@ public class LakalaPayServiceImpl implements LakalaPayService { log.error("无法获取店铺的拉卡拉商户号或终端号: storeId={}", storeId); return Pair.of(false, I18nUtil._("缺少商户号参数,退款失败!")); } + + // TODO 重要的逻辑,获取是否已经分账?已分账:分账退回;查商家账户余额够不够退回?够就执行退回 + // 5. 构造退款请求并发送 V3LabsRelationRefundRequest refundRequest = new V3LabsRelationRefundRequest(); refundRequest.setOutTradeNo(outTradeNo); @@ -261,8 +264,11 @@ public class LakalaPayServiceImpl implements LakalaPayService { log.error("拉卡拉退款失败, 错误信息: {}", errorMessage); return Pair.of(false, I18nUtil._(errorMessage)); } + + JSONObject responseData = lakalaResponseJson.getJSONObject("resp_data"); log.info("拉卡拉退款成功: outTradeNo={}", outTradeNo); - return Pair.of(true, I18nUtil._("退款成功!")); + return Pair.of(true, responseData == null ? "" : responseData.toString()); + } catch (SDKException e) { log.error("拉卡拉退款SDK异常: ", e); return Pair.of(false, I18nUtil._("拉卡拉退款SDK异常,退款失败!") + e.getMessage()); diff --git a/mall-pay/src/main/java/com/suisung/mall/pay/service/impl/PayUserPayServiceImpl.java b/mall-pay/src/main/java/com/suisung/mall/pay/service/impl/PayUserPayServiceImpl.java index 56c33215..1ca544db 100644 --- a/mall-pay/src/main/java/com/suisung/mall/pay/service/impl/PayUserPayServiceImpl.java +++ b/mall-pay/src/main/java/com/suisung/mall/pay/service/impl/PayUserPayServiceImpl.java @@ -64,6 +64,7 @@ import io.seata.spring.annotation.GlobalTransactional; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.util.Pair; import org.springframework.jdbc.datasource.DataSourceTransactionManager; import org.springframework.stereotype.Service; import org.springframework.transaction.TransactionDefinition; @@ -1691,41 +1692,46 @@ public class PayUserPayServiceImpl extends BaseServiceImpl params = RefundModel.builder().appid(wxPayApiConfig.getAppId()).mch_id(wxPayApiConfig.getMchId()).nonce_str(WxPayKit.generateStr()).transaction_id(deposit_trade_no).out_refund_no(WxPayKit.generateStr()).total_fee(refundAmount).refund_fee(refundAmount).build().createSign(wxPayApiConfig.getPartnerKey(), SignType.MD5); - logger.info(String.format(I18nUtil._("微信退款请求参数参数: params【%s】"), params.toString())); - InputStream certInStream = PayKit.getFileToStream(wxPayApiConfig.getCertPath()); - //IJPAY低版本jdk环境使用退款方法jdk1.8.0_111以下 - //String xmlResult = WxPayApi.orderRefund(false, params, certInStream, wxPayApiConfig.getMchId()); - //下面的方法解决IJPAY高版本jdk导致退款协议不支持问题jdk1.8.0_111以上 - String xmlResult = HttpKit.getDelegate().post(WxPayApi.getReqUrl(WxApiType.REFUND, null, false), WxPayKit.toXml(params), certInStream, wxPayApiConfig.getMchId(), ""); - logger.info(String.format(I18nUtil._("微信退款返回参数: xmlResult【%s】"), xmlResult)); - Map resultMap = WxPayKit.xmlToMap(xmlResult); - String returnCode = resultMap.get("return_code"); - String resultCode = resultMap.get("result_code"); + // 获取并处理交易号 + String deposit_trade_no = CheckUtil.isEmpty(orderReturn.getDeposit_trade_no()) ? "" : orderReturn.getDeposit_trade_no(); - if (!WxPayKit.codeIsOk(returnCode) || !WxPayKit.codeIsOk(resultCode)) { - LogUtil.error("微信退款异常!" + resultMap); + // 调用拉卡拉退款接口 + Pair resp = lakalaPayService.innerLklRefund( + orderReturn.getStore_id(), + orderReturn.getReturn_id(), + deposit_trade_no, + Integer.toString(NumberUtil.mul(orderReturn.getTrade_payment_amount(), 100).intValue()), + orderReturn.getReturn_buyer_message() + ); + + if (!resp.getFirst()) { + LogUtil.error("拉卡拉退款异常: " + resp.getSecond()); return null; } - ShopOrderReturn shopOrderReturn = new ShopOrderReturn(); - shopOrderReturn.setReturn_channel_flag(1); - shopOrderReturn.setDeposit_trade_no(deposit_trade_no); - shopOrderReturn.setOrder_id(orderReturn.getOrder_id()); - shopOrderReturn.setReturn_channel_trans_id(resultMap.get("refund_id")); - shopOrderReturn.setReturn_channel_time(new Date()); - return shopOrderReturn; + // 解析响应并获取退单号 + String lklTradeNo = ""; + try { + JSONObject respData = StrUtil.isNotBlank(resp.getSecond()) ? JSONObject.parseObject(resp.getSecond()) : null; + lklTradeNo = respData != null ? respData.getString("trade_no") : ""; + } catch (Exception e) { + LogUtil.error("解析拉卡拉退款响应数据失败: " + e.getMessage()); + return null; + } + + // 构造并返回结果 + String finalLklTradeNo = lklTradeNo; + return new ShopOrderReturn() {{ + setReturn_channel_flag(1); + setDeposit_trade_no(deposit_trade_no); + setOrder_id(orderReturn.getOrder_id()); + setReturn_channel_trans_id(finalLklTradeNo); + setReturn_channel_time(new Date()); + }}; } /** diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/order/service/impl/ShopOrderReturnServiceImpl.java b/mall-shop/src/main/java/com/suisung/mall/shop/order/service/impl/ShopOrderReturnServiceImpl.java index 6c742c34..628329d8 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/order/service/impl/ShopOrderReturnServiceImpl.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/order/service/impl/ShopOrderReturnServiceImpl.java @@ -942,6 +942,7 @@ public class ShopOrderReturnServiceImpl extends BaseServiceImpl