From b028183f4f6c9d2b9bfb0f81cb10cd9569b3774b Mon Sep 17 00:00:00 2001 From: quyixiao <2621048238@qq.com> Date: Sun, 9 Nov 2025 14:51:49 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8F=90=E4=BA=A4=E6=82=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../request/mm/reverse/AppliyReverseRequest.java | 5 +++++ .../main/java/com/heyu/api/jsapi/JsapiPrepay.java | 9 ++++++--- .../api/service/impl/ReverseOrderServiceImpl.java | 15 ++++++++++++--- .../api/controller/mm/AdminOrderController.java | 6 +++--- .../api/controller/vv/AppReverseController.java | 8 +++++++- .../vv/AppWeiXinRefundNotifyController.java | 5 +++++ 6 files changed, 38 insertions(+), 10 deletions(-) diff --git a/api-third/src/main/java/com/heyu/api/alibaba/request/mm/reverse/AppliyReverseRequest.java b/api-third/src/main/java/com/heyu/api/alibaba/request/mm/reverse/AppliyReverseRequest.java index d355fc2..2e2cd45 100644 --- a/api-third/src/main/java/com/heyu/api/alibaba/request/mm/reverse/AppliyReverseRequest.java +++ b/api-third/src/main/java/com/heyu/api/alibaba/request/mm/reverse/AppliyReverseRequest.java @@ -47,4 +47,9 @@ public class AppliyReverseRequest extends AppBaseRequest { */ private List resourceDTOList; + /*** + * 退款状态 + */ + private String status; + } diff --git a/api-third/src/main/java/com/heyu/api/jsapi/JsapiPrepay.java b/api-third/src/main/java/com/heyu/api/jsapi/JsapiPrepay.java index afc61d9..8f0a8b7 100644 --- a/api-third/src/main/java/com/heyu/api/jsapi/JsapiPrepay.java +++ b/api-third/src/main/java/com/heyu/api/jsapi/JsapiPrepay.java @@ -214,7 +214,9 @@ public class JsapiPrepay { VvTradeOrderEntity vvTradeOrderEntity = vvTradeOrderDao.selectVvTradeOrderById(tradeOrderId); VvReverseOrderEntity vvReverseOrderEntity = vvReverseOrderDao.selectVvReverseOrderById(reverseOrderId); CreateRequest request = new CreateRequest(); + request.transactionId = vvTradeOrderEntity.getTransactionId(); // 【微信支付订单号】 微信支付侧订单的唯一标识,订单支付成功后,查询订单和支付成功回调通知会返回该参数。transaction_id和out_trade_no必须二选一进行传参。 + request.outTradeNo = tradeOrderId + ""; // 【商户订单号】 商户下单时传入的商户系统内部订单号。transaction_id和out_trade_no必须二选一进行传参。 request.outRefundNo = reverseOrderId + ""; //【商户退款单号】 商户系统内部的退款单号,商户系统内部唯一,只能是数字、大小写字母_-|*@ ,同一商户退款单号多次请求只退一笔。不可超过64个字节数。 request.reason = vvReverseOrderEntity.getRefundReason(); // 【退款原因】 若商户传了退款原因,该原因将在下发给用户的退款消息中显示,具体展示可参见退款通知UI示意图。请注意:1、该退款原因参数的长度不得超过80个字节;2、当订单退款金额小于等于1元且为部分退款时,退款原因将不会在消息中体现。 @@ -224,6 +226,7 @@ public class JsapiPrepay { * UNSETTLED: 仅对出行预付押金退款适用,指定从未结算资金出资。 */ request.fundsAccount = ReqFundsAccount.AVAILABLE; // 【退款资金来源】 若传递此参数则使用对应的资金账户退款。 + // 【金额信息】订单退款金额信息 request.amount = new AmountReq(); @@ -231,10 +234,12 @@ public class JsapiPrepay { Long tradeOrderAmount = BigDecimalUtil.multiply(vvTradeOrderEntity.getAllPrice(), new BigDecimal(100)).longValue(); request.amount.refund =refundAmount; // 【退款金额】 退款金额,币种的最小单位,只能为整数,不能超过原订单支付金额。 + // 【退款出资账户及金额】退款需从指定账户出资时,可传递该参数以指定出资金额(币种最小单位,仅限整数)。 // 多账户出资退款需满足:1、未开通退款支出分离功能;2、订单为待分账或分账中的分账订单。 // 传递参数需确保:1、基本账户可用与不可用余额之和等于退款金额;2、账户类型不重复。不符条件将返回错误。 request.amount.from = new ArrayList<>(); + { FundsFromItem fromItem = new FundsFromItem(); fromItem.account = Account.AVAILABLE; // 【出资账户类型】 退款出资的账户类型。 @@ -247,7 +252,6 @@ public class JsapiPrepay { String HOST = refundNotifyUrl; String METHOD = "POST"; String uri = "/v3/refund/domestic/refunds"; - String reqBody = WXPayUtility.toJson(request); Request.Builder reqBuilder = new Request.Builder().url(HOST + uri); reqBuilder.addHeader("Accept", "application/json"); @@ -257,16 +261,15 @@ public class JsapiPrepay { RequestBody requestBody = RequestBody.create(MediaType.parse("application/json; charset=utf-8"), reqBody); reqBuilder.method(METHOD, requestBody); Request httpRequest = reqBuilder.build(); - // 发送HTTP请求 OkHttpClient client = new OkHttpClient.Builder().build(); try (Response httpResponse = client.newCall(httpRequest).execute()) { String respBody = WXPayUtility.extractBody(httpResponse); + log.info("order refund respBody:{}", respBody); if (httpResponse.code() >= 200 && httpResponse.code() < 300) { // 2XX 成功,验证应答签名 WXPayUtility.validateResponse(this.wechatPayPublicKeyId, this.wechatPayPublicKey, httpResponse.headers(), respBody); - // 从HTTP应答报文构建返回数据 return WXPayUtility.fromJson(respBody, Refund.class); } else { diff --git a/api-third/src/main/java/com/heyu/api/service/impl/ReverseOrderServiceImpl.java b/api-third/src/main/java/com/heyu/api/service/impl/ReverseOrderServiceImpl.java index 8d16e59..7005148 100644 --- a/api-third/src/main/java/com/heyu/api/service/impl/ReverseOrderServiceImpl.java +++ b/api-third/src/main/java/com/heyu/api/service/impl/ReverseOrderServiceImpl.java @@ -1,6 +1,7 @@ package com.heyu.api.service.impl; +import com.alibaba.fastjson.JSON; import com.heyu.api.alibaba.request.mm.enums.ReverseStatusEnums; import com.heyu.api.alibaba.request.mm.enums.ReverseUploadSceneEnums; import com.heyu.api.alibaba.request.mm.order.ResourceDTO; @@ -10,6 +11,8 @@ import com.heyu.api.data.entity.vv.*; import com.heyu.api.data.utils.BigDecimalUtil; import com.heyu.api.data.utils.R; import com.heyu.api.data.utils.SanUtils; +import com.heyu.api.jsapi.JsapiPrepay; +import com.heyu.api.jsapi.dto.refund.Refund; import com.heyu.api.service.ReverseOrderService; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections.CollectionUtils; @@ -41,17 +44,20 @@ public class ReverseOrderServiceImpl implements ReverseOrderService { @Autowired private VvReverseOrderProveDao vvReverseOrderProveDao; + @Autowired + private JsapiPrepay jsapiPrepay; + + + @Override public R createReverseOrder(List vvTradeOrderLineEntityList, AppliyReverseRequest appliyReverseRequest) { List tradeOrderLineIds = SanUtils.list2list(vvTradeOrderLineEntityList, VvTradeOrderLineEntity::getId); Map vvTradeOrderLineEntityMap = SanUtils.list2Map(vvTradeOrderLineEntityList, VvTradeOrderLineEntity::getId); - Long tradeOrderId = SanUtils.findAnyNotNull(vvTradeOrderLineEntityList, VvTradeOrderLineEntity::getTradeOrderId); - VvTradeOrderEntity vvTradeOrderEntity = vvTradeOrderDao.selectVvTradeOrderById(tradeOrderId); VvReverseOrderEntity vvReverseOrderEntity = new VvReverseOrderEntity(); vvReverseOrderEntity.setTradeOrderId(vvTradeOrderEntity.getId()); - vvReverseOrderEntity.setStatus(ReverseStatusEnums.buyer_apply_reverse_wait_seller_agree.getStatus()); + vvReverseOrderEntity.setStatus(appliyReverseRequest.getStatus()); BigDecimal realRefundAmount = appliyReverseRequest.getRefundAmount() == null ? SanUtils.sum(vvTradeOrderLineEntityList, VvTradeOrderLineEntity::getPromotionPrice) @@ -74,6 +80,7 @@ public class ReverseOrderServiceImpl implements ReverseOrderService { vvReverseOrderDao.insertOrUpdateVvReverseOrder(vvReverseOrderEntity); BigDecimal preSum = BigDecimal.ZERO; + for (int i = 0; i < tradeOrderLineIds.size(); i++) { Long tradeOrderLineId = tradeOrderLineIds.get(i); VvTradeOrderLineEntity vvTradeOrderLineEntity = vvTradeOrderLineEntityMap.get(tradeOrderLineId); @@ -120,6 +127,8 @@ public class ReverseOrderServiceImpl implements ReverseOrderService { vvReverseOrderProveDao.insertOrUpdateVvReverseOrderProve(vvReverseOrderProveEntity); } } + Refund refund = jsapiPrepay.refund(tradeOrderId, vvReverseOrderEntity.getId()); + log.info("ReverseOrderServiceImpl refund:{}", JSON.toJSONString(refund)); return R.ok().setData(vvReverseOrderEntity); } diff --git a/api-web/api-interface/src/main/java/com/heyu/api/controller/mm/AdminOrderController.java b/api-web/api-interface/src/main/java/com/heyu/api/controller/mm/AdminOrderController.java index 26c32e2..17bf232 100644 --- a/api-web/api-interface/src/main/java/com/heyu/api/controller/mm/AdminOrderController.java +++ b/api-web/api-interface/src/main/java/com/heyu/api/controller/mm/AdminOrderController.java @@ -6,6 +6,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage; import com.heyu.api.alibaba.request.mm.VvUnPackDTO; import com.heyu.api.alibaba.request.mm.enums.OrderStatusEnums; import com.heyu.api.alibaba.request.mm.enums.RefundTypeEnums; +import com.heyu.api.alibaba.request.mm.enums.ReverseStatusEnums; import com.heyu.api.alibaba.request.mm.enums.ShippingTypeEnums; import com.heyu.api.alibaba.request.mm.order.*; import com.heyu.api.alibaba.request.mm.order.resp.VVOrderDetailResp; @@ -325,11 +326,10 @@ public class AdminOrderController { vvTradeOrderLineEntity.setCancelUser(vvCancelDTO.getUserName()); vvTradeOrderLineDao.updateVvTradeOrderLineById(vvTradeOrderLineEntity); } - AppliyReverseRequest appliyReverseRequest = new AppliyReverseRequest(); appliyReverseRequest.setRefundType(RefundTypeEnums.only_refund.getCode()); - appliyReverseRequest.setRefundReason(vvCancelDTO.getCancelReason()); - + appliyReverseRequest.setRefundReason("订单取消:" + vvCancelDTO.getCancelReason()); + appliyReverseRequest.setStatus(ReverseStatusEnums.cancel.getStatus()); return reverseOrderService.createReverseOrder(vvTradeOrderLineEntityList, appliyReverseRequest); } diff --git a/api-web/api-interface/src/main/java/com/heyu/api/controller/vv/AppReverseController.java b/api-web/api-interface/src/main/java/com/heyu/api/controller/vv/AppReverseController.java index 61737cb..f507ac7 100644 --- a/api-web/api-interface/src/main/java/com/heyu/api/controller/vv/AppReverseController.java +++ b/api-web/api-interface/src/main/java/com/heyu/api/controller/vv/AppReverseController.java @@ -14,6 +14,7 @@ import com.heyu.api.data.dao.vv.*; import com.heyu.api.data.entity.vv.*; import com.heyu.api.data.utils.R; import com.heyu.api.data.utils.SanUtils; +import com.heyu.api.service.ReverseOrderService; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections.CollectionUtils; import org.springframework.beans.factory.annotation.Autowired; @@ -50,6 +51,10 @@ public class AppReverseController { @Autowired private VvPackageDao vvPackageDao; + @Autowired + private ReverseOrderService reverseOrderService; + + /*** * /app/reverse/add * @@ -60,9 +65,10 @@ public class AppReverseController { @Describe("逆向订单创建") @RequestMapping("/add") public R add(@RequestBody AppliyReverseRequest appliyReverseRequest) { + List vvTradeOrderLineEntityList = vvTradeOrderLineDao.selectVvTradeOrderLineByTrackNumber(appliyReverseRequest.getTrackNumber()); - return R.ok("申请退款成功"); + return reverseOrderService.createReverseOrder(vvTradeOrderLineEntityList, appliyReverseRequest); } /** diff --git a/api-web/api-interface/src/main/java/com/heyu/api/controller/vv/AppWeiXinRefundNotifyController.java b/api-web/api-interface/src/main/java/com/heyu/api/controller/vv/AppWeiXinRefundNotifyController.java index fcdf323..85a5bb4 100644 --- a/api-web/api-interface/src/main/java/com/heyu/api/controller/vv/AppWeiXinRefundNotifyController.java +++ b/api-web/api-interface/src/main/java/com/heyu/api/controller/vv/AppWeiXinRefundNotifyController.java @@ -66,7 +66,9 @@ public class AppWeiXinRefundNotifyController { JSONObject object = JSONObject.parseObject(resource); String ciphertext = String.valueOf(object.get("ciphertext")); + String nonce = String.valueOf(object.get("nonce")); + String associated_data = String.valueOf(object.get("associated_data")); String resultStr = decryptToString(associated_data.getBytes("UTF-8"), nonce.getBytes("UTF-8"), ciphertext); @@ -81,11 +83,14 @@ public class AppWeiXinRefundNotifyController { vvReverseOrderEntity.setGmtRefunded(new Date()); vvReverseOrderEntity.setStatus(ReverseStatusEnums.refunded.getStatus()); reverseOrderDao.updateVvReverseOrderById(vvReverseOrderEntity); + List vvTradeOrderLineEntityList = vvTradeOrderLineDao.selectVvTradeOrderLineByTradeOrderId(NumberUtil.objToLong(out_trade_no)); + for (VvTradeOrderLineEntity vvTradeOrderLineEntity : vvTradeOrderLineEntityList) { vvTradeOrderLineEntity.setReverseStatus(ReverseStatusEnums.refunded.getStatus()); vvTradeOrderLineDao.updateVvTradeOrderLineById(vvTradeOrderLineEntity); } + //你自己的业务 parm.put("code", "SUCCESS"); parm.put("message", "成功");