Commit eb526c7f by 周晓航

Merge branch 'KA-新增同意退款回调逻辑处理'

# Conflicts:
#	order-application-service/src/main/java/cn/freemud/service/impl/OrderAdapterServiceImpl.java
#	order-management/src/main/java/cn/freemud/management/service/adapter/OrderManagerAdapter.java
parents e1acc3f3 36206fe2
......@@ -19,7 +19,8 @@ public enum PayRefundStatus {
/**
* 额外状态码 用于判断逻辑,
*/
NOT_SUFFICIENT_FUNDS(8200201,"余额不足");
NOT_SUFFICIENT_FUNDS(8200201,"余额不足"),
COMPATIBILITY_STATUS(9999999,"退款异常");
private Integer code;
private String desc;
......
package com.freemud.sdk.api.assortment.order.response.order;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.List;
......@@ -22,7 +23,16 @@ public class MultiOrderRefundResponse<T> {
}
@Data
public static class RefundPlatformResponse{
public static class RefundPlatformResponse {
/**
* 退款中状态码需要单独处理
*/
public static Integer REFUNDED_RESULTCODE = 8200305;
/**
* 退款成功
*/
public static Integer REFUND_SUCCESS = 100;
private String endTransTradeNo;
private String fmRefundNo;
private String fmTradeNo;
......@@ -39,5 +49,11 @@ public class MultiOrderRefundResponse<T> {
private Integer totalAmount;
private String transId;
private String ebcode;
@ApiModelProperty(value = "业务返回码 8200305 代表退款中 100是成功 其他 都是失败")
private Integer resultCode;
@ApiModelProperty(value = "业务返回消息")
private String resultMsg;
}
}
\ No newline at end of file
......@@ -22,6 +22,7 @@ import cn.freemud.entities.vo.encircle.CreateReserveOrderVo;
import cn.freemud.entities.vo.encircle.EncircleReserveBaseVo;
import cn.freemud.entities.vo.order.*;
import cn.freemud.handler.OrderReportJobHandler;
import cn.freemud.management.entities.dto.request.order.RefundSuccessCallbackVo;
import cn.freemud.service.EncircleOrderService;
import cn.freemud.service.Orderservice;
import cn.freemud.service.PointsMallOrderService;
......
......@@ -207,6 +207,7 @@ public enum ResponseResult {
*/
PAY_BACKEND_CONFIG_ERROR("58003", "支付交易异常","Abnormal payment transaction"),
PAY_SVC_CONFIG_ERROR("58004", "不支持储值卡支付",""),
PAY_REFUND_ERROR("58005", "退款已受理,请等待",""),
/**
* 优惠券活动
*/
......
......@@ -2022,9 +2022,9 @@ public class OrderServiceImpl implements Orderservice {
BaseResponse baseResponse = partnerNoTakeOrder(orderRefundVo, orderBean, orderId, AfterSalesType.USER_CANCEL, isRefundDeliveryFee);
if (baseResponse != null) {
return baseResponse;
}
// 删除订单 通知活动添加商品库存
} // 删除订单 通知活动添加商品库存
orderQueueService.backOrdersStatusChange(orderBean.getOid(), orderBean.getStatus(), orderBean.getPayStatus());
} else {
CancelOrderRequest cancelOrderRequest = new CancelOrderRequest();
cancelOrderRequest.setPartnerId(orderBean.getCompanyId());
......@@ -2078,50 +2078,25 @@ public class OrderServiceImpl implements Orderservice {
String partnerId = orderBean.getCompanyId();
int state = PayRefundStatus.SUCCESS.getCode();
if (orderBean.getAmount() != 0) {
if (null != orderBean.getOrderPayItem() && orderBean.getOrderPayItem().size() > 0) {
//调用支付退款
MultiOrderRefundRequest multiOrderRefundRequest = orderAdapter.getMultiOrderPayRefundRequest(orderBean, refundId);
MultiOrderRefundResponse multiOrderRefundResponse = payServiceImpl.paymentApplicationRefund(multiOrderRefundRequest, orderBean.getCompanyId());
if (multiOrderRefundResponse == null || multiOrderRefundResponse.getData() == null || !com.freemud.sdk.api.assortment.order.domain.ResponseCodeConstant.ORDER_PAY_RESPONSE_SUCCESS.equals(multiOrderRefundResponse.getCode())) {
return ResponseUtil.error(ResponseResult.MULTIORDER__ERRORREFUND.getCode(), "multiOrderRefund_failed");
}
List<MultiOrderRefundResponse.RefundPlatformResponse> refundPlatformResponseList = multiOrderRefundResponse.getData().refundPlatformResponseList;
if (null != refundPlatformResponseList && refundPlatformResponseList.size() > 0) {
redisCache.save(RedisUtil.getPaymentTransIdSequenceKey(refundPlatformResponseList.get(0).getTransId()), orderBean.getOid(), 1L, TimeUnit.DAYS);
}
//获取支付返回退款状态
state = PayRefundStatus.SUCCESS.getCode();
} else {
OrderExtendedReq ext = orderBean.getOrderExtended();
if (StringUtils.isNotBlank(ext.getAgentPayerId()) && !Objects.equals(ext.getAgentPayerId(), orderBean.getUserId())) {
//代付人信息不为空 并且和订单创建人不一样,表示代付单
PayRefundResponse resp = paymentHandle.agentPayRefund(orderBean);
state = resp.getPayRefundStatus().getCode();
} else {
//调用支付退款
PayRefundRequestDto orderPayRefundRequest = orderAdapter.getOrderPayRefundRequest(orderBean, refundId, fatherOrderId);
//抖音支付退款必传
orderPayRefundRequest.setRefundDesc(orderRefundVo.getReason() == null ? "用户退款" : orderRefundVo.getReason());
response = payServiceImpl.orderRefund(orderPayRefundRequest);
if (response == null || response.getData() == null || !com.freemud.sdk.api.assortment.order.domain.ResponseCodeConstant.RESPONSE_SUCCESS_STR.equals(response.getCode())) {
return ResponseUtil.error(ResponseResult.ORDER__ERRORREFUND.getCode(), "orderRefund_failed");
}
//获取支付返回退款状态
state = response.getData().getRefundStatus() == null ? PayRefundStatus.SUCCESS.getCode() : response.getData().getRefundStatus();
}
}
OrderManagerRequest orderManagerRequest = new OrderManagerRequest();
orderManagerRequest.setReason(orderRefundVo.getReason());
PayRefundResponse refundResponse = paymentHandle.getCommonPayRefundResponse(orderManagerRequest, orderBean);
state = refundResponse.getPayRefundStatus().getCode();
}
CancelOrderRequest cancelOrderRequest = orderAdapter.convent2CancelOrderRequest(orderBean.getOid(),
partnerId, afterSalesType, orderRefundVo.getReason(), LogThreadLocal.getTrackingNo(), refundId.toString());
cancelOrderRequest.setOperator(orderBean.getUserName());
cancelOrderRequest.setPartnerId(orderBean.getCompanyId());
if (Objects.equals(PayRefundStatus.RUNNING.getCode(), state)) {
// 退款中
cancelOrderRequest.setCreateEvent(AfterSalesOrderCreateEventEnum.RETURN_COMPLETE.getCreateEvent());
} else if (Objects.equals(PayRefundStatus.SUCCESS.getCode(), state)) {
if (Objects.equals(PayRefundStatus.SUCCESS.getCode(), state)) {
//退款成功
cancelOrderRequest.setCreateEvent(AfterSalesOrderCreateEventEnum.REFUND_COMPLETE.getCreateEvent());
} else if (Objects.equals(PayRefundStatus.RUNNING.getCode(), state)) {
cancelOrderRequest.setCreateEvent(null);
}else {
// 其他退款失败的情况 不生成售后单
return ResponseUtil.error(ResponseResult.MULTIORDER__ERRORREFUND.getCode(), "multiOrderRefund_failed");
}
cancelOrderRequest.setReqRemark(orderRefundVo.getRemarks());
cancelOrderRequest.setRefundDeliveryAmount(isRefundDeliveryFee);
......@@ -2134,6 +2109,11 @@ public class OrderServiceImpl implements Orderservice {
if (baseOrderResponse == null || !ObjectUtils.equals(ResponseConstant.SUCCESS_RESPONSE_CODE, baseOrderResponse.getErrcode())) {
return ResponseUtil.error(ResponseResult.ORDER__ERRORREFUND.getCode(), "orderRefund_failed");
}
if (state == PayRefundStatus.RUNNING.getCode().intValue()) {
// 如果退款中, 直接来个申请记录, 退款回调进行处理
return ResponseUtil.error(ResponseResult.PAY_REFUND_ERROR);
}
return null;
}
......@@ -2338,7 +2318,10 @@ public class OrderServiceImpl implements Orderservice {
try {
messageTemplateRequest = messageNoticeAdapter.convent2MessageTemplateRequest(orderBean);
messageTemplateRequest.setMessageEventType(messageEventType);
this.messageTemplatePushService.sendTemplateMsg(messageTemplateRequest);
com.freemud.application.sdk.api.base.BaseResponse baseResponse = this.messageTemplatePushService.sendTemplateMsg(messageTemplateRequest);
if (!Objects.equals(baseResponse.getCode(), ResponseResultEnum.SUCCESS.getCode())) {
AppLogUtil.errorLog("发送支付成功模板消息 失败", orderBean.getOid(), JSON.toJSONString(baseResponse), null);
}
} catch (Exception e) {
AppLogUtil.errorLog("sendTemplateMsg_error", JSONObject.toJSONString(orderBean), JSONObject.toJSONString(messageTemplateRequest), e);
}
......@@ -3613,7 +3596,7 @@ public class OrderServiceImpl implements Orderservice {
} else {
resultMap.put(orderCode, resp.getMessage());
}
}catch (Exception e){
} catch (Exception e) {
resultMap.put(orderCode, e.getMessage());
}
});
......@@ -3644,7 +3627,7 @@ public class OrderServiceImpl implements Orderservice {
return ResponseUtil.error(ResponseResult.ORDER__ERRORREFUND.getCode(), "订单已取消,无法退款");
}
// fisherman 仅仅支持 餐饮类订单进行操作
if (BizTypeEnum.ORDINARY.getBizType().compareTo(orderBean.getBizType()) !=0) {
if (BizTypeEnum.ORDINARY.getBizType().compareTo(orderBean.getBizType()) != 0) {
return ResponseUtil.error(ResponseResult.ORDER__ERRORREFUND.getCode(), "仅支持餐饮订单操作");
}
......@@ -3703,9 +3686,9 @@ public class OrderServiceImpl implements Orderservice {
Long bLong = Long.valueOf(o2.getCreateTime());
if (bLong > aLong) {
return 1;
}else if (bLong < aLong){
} else if (bLong < aLong) {
return -1;
}else {
} else {
return 0;
}
});
......@@ -3952,5 +3935,4 @@ public class OrderServiceImpl implements Orderservice {
}
}
package cn.freemud.management.adapter;
import cn.freemud.management.entities.dto.request.pay.AgentPayRefundReq;
import cn.freemud.management.entities.dto.request.pay.PayRefundRequestDto;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.freemud.application.sdk.api.ordercenter.entities.v1.OrderBeanV1;
import com.freemud.application.sdk.api.ordercenter.request.OrderExtInfoDto;
......@@ -76,6 +78,21 @@ public class PaymentSdkAdapter {
return multiQueryRequest;
}
@SneakyThrows
public AgentPayRefundReq getAgentPayefundReq(OrderBeanV1 orderBean, BigDecimal refundAmount) {
OrderExtInfoDto ext = JSON.parseObject(orderBean.getExtInfo(), OrderExtInfoDto.class);
AgentPayRefundReq req = new AgentPayRefundReq();
req.setPartnerId(orderBean.getCompanyId());
req.setStoreId(orderBean.getShopId());
req.setFmTradeNo(ext.getPayTransId());
req.setOutOrderNo(orderBean.getOid());
req.setRefundTradeNo(this.getRefundSerialNo().toString());
req.setRefundAmount(refundAmount.longValue());
req.setNotifyUrl(refundNotifyCallback);
req.setVer("V1");
return req;
}
public Long getRefundSerialNo() {
return System.currentTimeMillis() + (int) (Math.random() * 9000) + 1000;
}
......
......@@ -3,6 +3,7 @@ package cn.freemud.management.controller;
import cn.freemud.base.entity.BaseResponse;
import cn.freemud.management.entities.dto.request.order.McCafeOrderManagerRequest;
import cn.freemud.management.entities.dto.request.order.OrderManagerRequest;
import cn.freemud.management.entities.dto.request.order.RefundSuccessCallbackVo;
import cn.freemud.management.enums.McCafeOperateType;
import cn.freemud.management.enums.OperateType;
import cn.freemud.management.enums.ResponseResult;
......@@ -72,6 +73,17 @@ public class OrderManagerController {
}
}
/**
* 同意退款, 支付服务退款失败的补偿接口
*
* 退款成功会回调该接口进行后续流程补偿
*/
@ApiAnnotation(logMessage = "/order/refund/callback")
@PostMapping("/refund/callback")
public BaseResponse refundSuccessCallback(@Validated @LogParams @RequestBody RefundSuccessCallbackVo req) {
return orderManagerAdapter.refundSuccessCallback(req);
}
@ApiAnnotation(logMessage = "mcCafeDeliveryCreate")
@ApiOperation(value = "麦咖啡订单入机", notes = "麦咖啡订单入机", produces = "application/json")
@PostMapping("/mcCafe/statusOperate")
......
package cn.freemud.management.entities.dto.request.order;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotBlank;
/**
* @author : xh.Z
* @email : fisherman0510@163.com
* @Date : 2022/6/8 17:38
* @description :
*/
@Data
public class RefundSuccessCallbackVo {
@ApiModelProperty(value = "总金额", position = 10)
private Integer totalAmount;
@ApiModelProperty(value = "退款金额", position = 11)
private Integer refundAmount;
@ApiModelProperty(value = "应结总金额", position = 12)
private Integer settlementTotalAmount;
@ApiModelProperty(value = "应结退款金额", position = 13)
private Integer settlementRefundAmount;
@ApiModelProperty(value = "交易流水号", position = 14)
private String tradeNo;
/**
* 订单编号
*/
private String orderCode;
/**
* 退款描述
*/
private String msg;
@ApiModelProperty(value = "第三方交易流水", position = 15)
private String thirdPartTradeNo;
@ApiModelProperty(value = "退款交易流水号", position = 16)
private String refundTradeNo;
@ApiModelProperty(value = "第三方退款交易流水", position = 17)
private String thirdPartRefundTradeNo;
@ApiModelProperty(value = "格式:yyyyMMddHHmmss", position = 18)
private String refundTime;
@ApiModelProperty(value = "货币类型", position = 19)
private String transCurrency;
@ApiModelProperty(value = "退款状态: 100 退款成功 8200305 处理中, 其他都是失败", position = 20)
private String refundStatus;
@ApiModelProperty(value = "商户号", position = 21)
private String partnerId;
@ApiModelProperty(value = "业务方退款单号", position = 22)
private String refundId;
@ApiModelProperty(value = "业务方支付单号", position = 22)
private String transId;
@ApiModelProperty(value = "间联退款单号")
private String refundEndTransId;
}
package cn.freemud.management.entities.dto.response.pay;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.NoArgsConstructor;
......@@ -20,6 +21,7 @@ public class AgentPayRefundResp {
@NoArgsConstructor
@Data
public static class DataDTO {
private String fmTradeNo;
private String endTransTradeNo;
private String platformTradeNo;
......@@ -35,6 +37,12 @@ public class AgentPayRefundResp {
private String refundTime;
private String transId;
private String ebcode;
@ApiModelProperty(value = "业务返回码")
private Integer resultCode;
@ApiModelProperty(value = "业务返回消息")
private String resultMsg;
}
public boolean isOk() {
......
package cn.freemud.management.entities.dto.response.pay;
import cn.freemud.management.enums.ResponseResult;
import com.freemud.sdk.api.assortment.order.enums.PayRefundStatus;
import lombok.Data;
......@@ -28,4 +29,9 @@ public class PayRefundResponse {
* 退款序列号
*/
private String refundId;
/**
* 兼容爱马哥退款报错的字段 ,其他场景不会有值
*/
private ResponseResult result;
}
......@@ -181,6 +181,8 @@ public enum ResponseResult {
REFUND_EXCEPTION("58004", "支付退款异常"),
REFUND_FAIL("58005", "支付退款失败"),
NOT_SUFFICIENT_FUNDS("8200201", "商户余额不足"),
CHECK_PARAM_ERROR("58006", "支付退款请求参数校验异常"),
REFUND_FAIL_WAIT_CALLBACK("58007", "支付退款失败,等待回调补偿中"),
/**
* 优惠券活动
*/
......
......@@ -2,6 +2,7 @@ package cn.freemud.management.service;
import cn.freemud.base.entity.BaseResponse;
import cn.freemud.management.entities.dto.request.order.OrderManagerRequest;
import cn.freemud.management.entities.dto.request.order.RefundSuccessCallbackVo;
import cn.freemud.management.entities.dto.response.order.OrderManagerResponse;
import cn.freemud.management.util.ResponseUtil;
import com.freemud.application.sdk.api.ordercenter.entities.v1.OrderBeanV1;
......@@ -110,4 +111,14 @@ public interface OrderManagerService {
default BaseResponse<OrderManagerResponse> orderCancelDelivery(OrderManagerRequest request, OrderBeanV1 orderBean){
return ResponseUtil.success();
};
/**
* 支付退款成功的售后状态回调
* @param request
* @param orderBean
* @return
*/
default BaseResponse refundSuccessCallback(RefundSuccessCallbackVo request, OrderBeanV1 orderBean){
return ResponseUtil.success();
};
}
package cn.freemud.management.service.handle;
import cn.freemud.management.entities.dto.response.pay.OrderRefundResponse;
import cn.freemud.management.entities.dto.response.pay.PayRefundData;
import cn.freemud.management.enums.PaymentRefundStatus;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.TypeReference;
import com.freemud.application.sdk.api.base.BaseResponse;
import com.freemud.application.sdk.api.util.ResponseUtils;
import com.freemud.sdk.api.assortment.order.enums.PayRefundStatus;
import org.apache.commons.lang.ObjectUtils;
import java.util.Objects;
/**
* @author : xh.Z
* @email : fisherman0510@163.com
* @Date : 2022/6/13 10:56
* @description :
*/
public class DemoMain {
public static void main(String[] args) {
String str = "{\n" +
" \"code\": \"100\",\n" +
" \"data\": {\n" +
" \"resultCode\": 82004005,\n" +
" \"resultMsg\": \"当前订单有退款记录没有完成\"\n" +
" },\n" +
" \"message\": \"success\"\n" +
"}";
BaseResponse<PayRefundData> refundNewResponse = JSON.parseObject(str, new TypeReference<BaseResponse<PayRefundData>>() {
});
if (Objects.equals(refundNewResponse.getCode(), "100") && refundNewResponse.getData() != null) {
refundNewResponse.setCode(refundNewResponse.getData().getResultCode().toString());
refundNewResponse.setMessage(refundNewResponse.getData().getResultMsg());
}
if (Objects.equals(refundNewResponse.getCode(), "100")) {
PayRefundData refundData = refundNewResponse.getData();
if (null != refundData) {
OrderRefundResponse refundResponse = new OrderRefundResponse();
refundResponse.setStatusCode(refundData.getResultCode());
refundResponse.setMsg(refundData.getResultMsg());
refundResponse.setRefundAmount(refundData.getRefundAmount());
refundResponse.setTotalAmount(refundData.getTotalAmount());
refundResponse.setRefundStatus(getRefundStatus(refundData.getResultCode()));
refundResponse.setRefundTradeNo(refundData.getRefundTradeNo());
refundResponse.setTradeNo(refundData.getRefundTradeNo());
refundResponse.setThirdPartRefundTradeNo(refundData.getThirdPartRefundTradeNo());
refundResponse.setThirdPartTradeNo(refundData.getThirdPartTradeNo());
refundResponse.setTotalAmount(refundData.getTotalAmount());
// return ResponseUtils.success(refundResponse);
}
}
BaseResponse<OrderRefundResponse> orderRefundResponse = ResponseUtils.error(refundNewResponse.getCode(), refundNewResponse.getMessage());
// Integer refundStatus = PayRefundStatus.SUCCESS;
Integer refundStatus = 1;
if (orderRefundResponse == null) {
// refundStatus = PayRefundStatus.RUNNING;
refundStatus = 4;
} else {
refundStatus = getFinalRefundStatus(Integer.valueOf(orderRefundResponse.getCode()));
}
System.out.println(refundStatus);
}
private static Integer getFinalRefundStatus(Integer resultCode) {
switch (resultCode) {
// 退款中状态码需要单独处理
case 8200305:
// return PayRefundStatus.RUNNING;
return 4;
// 退款成功
case 100:
// return PayRefundStatus.SUCCESS;
return 1;
default:
// return PayRefundStatus.FAIL;
return 2;
}
}
private static final String SUCCESS = "100";
public static final Integer SUCCESS_RESPONSE_CODE_INT = 100;
public static final Integer SUCCESS_RESPONSE_101_CODE_INT = 101;
public static final Integer REFUND_RESPONSE_CODE = 8200305;
public static Integer getRefundStatus(Integer resultCode) {
if (Objects.equals(resultCode, SUCCESS_RESPONSE_CODE_INT)) {
return PaymentRefundStatus.PAYMENT_REFUND_STATUS_1.getCode();
} else if (Objects.equals(resultCode, SUCCESS_RESPONSE_101_CODE_INT)) {
return PaymentRefundStatus.PAYMENT_REFUND_STATUS_1.getCode();
} else {
return Objects.equals(resultCode, REFUND_RESPONSE_CODE) ? PaymentRefundStatus.PAYMENT_REFUND_STATUS_4.getCode() : PaymentRefundStatus.PAYMENT_REFUND_STATUS_2.getCode();
}
}
}
......@@ -221,6 +221,7 @@ public class SaasOrderHandle {
if (PayRefundStatus.SUCCESS.equals(refundResponse.getPayRefundStatus())) {
baseOrderResponse = orderCenterSdkService.refundComplete(refundAgreeRequest);
} else {
// fisherman 这里有缺陷 退款失败也是最终状态, 基础服务售后状态不能为 4 不然用户无法重新发起售后单
baseOrderResponse = orderCenterSdkService.refundReturn(refundAgreeRequest);
}
if (baseOrderResponse == null || ObjectUtils.notEqual(ResponseResult.SUCCESS.getCode(), baseOrderResponse.getErrcode().toString())) {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment