提交悠
This commit is contained in:
parent
f8b0501988
commit
b028183f4f
@ -47,4 +47,9 @@ public class AppliyReverseRequest extends AppBaseRequest {
|
||||
*/
|
||||
private List<ResourceDTO> resourceDTOList;
|
||||
|
||||
/***
|
||||
* 退款状态
|
||||
*/
|
||||
private String status;
|
||||
|
||||
}
|
||||
|
||||
@ -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 {
|
||||
|
||||
@ -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);
|
||||
}
|
||||
|
||||
|
||||
@ -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);
|
||||
}
|
||||
|
||||
|
||||
@ -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);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@ -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", "成功");
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user