提交悠

This commit is contained in:
quyixiao 2025-11-09 14:51:49 +08:00
parent f8b0501988
commit b028183f4f
6 changed files with 38 additions and 10 deletions

View File

@ -47,4 +47,9 @@ public class AppliyReverseRequest extends AppBaseRequest {
*/
private List<ResourceDTO> resourceDTOList;
/***
* 退款状态
*/
private String status;
}

View File

@ -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 {

View File

@ -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<VvTradeOrderLineEntity> vvTradeOrderLineEntityList, AppliyReverseRequest appliyReverseRequest) {
List<Long> tradeOrderLineIds = SanUtils.list2list(vvTradeOrderLineEntityList, VvTradeOrderLineEntity::getId);
Map<Long, VvTradeOrderLineEntity> 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);
}

View File

@ -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);
}

View File

@ -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<VvTradeOrderLineEntity> vvTradeOrderLineEntityList = vvTradeOrderLineDao.selectVvTradeOrderLineByTrackNumber(appliyReverseRequest.getTrackNumber());
return R.ok("申请退款成功");
return reverseOrderService.createReverseOrder(vvTradeOrderLineEntityList, appliyReverseRequest);
}
/**

View File

@ -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<VvTradeOrderLineEntity> 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", "成功");