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