Commit 1b69529a by 徐康

Merge branch 'feature/20201201_xukang_麦咖啡p4v1' into develop

parents abca55b8 aaf75412
...@@ -2,6 +2,8 @@ package com.freemud.sdk.api.assortment.order.util; ...@@ -2,6 +2,8 @@ package com.freemud.sdk.api.assortment.order.util;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import com.freemud.application.sdk.api.ordercenter.response.QueryOrderStateResp; import com.freemud.application.sdk.api.ordercenter.response.QueryOrderStateResp;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
import java.beans.BeanInfo; import java.beans.BeanInfo;
import java.beans.Introspector; import java.beans.Introspector;
...@@ -37,6 +39,53 @@ public class MapBeanConvertUtil { ...@@ -37,6 +39,53 @@ public class MapBeanConvertUtil {
} }
/** /**
* 按照ASCII 排序
* @param obj 排序类
* @return
*/
public static String sortObjWithoutSign(Object obj) {
Map<String, Object> stringObjectMap = transBean2Map(obj);
return sortMapWithoutSign(stringObjectMap, SIGN, true);
}
public static String sortMapWithoutSign(Map<String, Object> params, char sign, boolean containSymbols) {
if (CollectionUtils.isEmpty(params)) {
return null;
}
params.remove("sign");
String buff = "";
try {
List<Map.Entry<String, Object>> infoIds = new ArrayList<>(params.entrySet());
// 对所有传入参数按照字段名的 ASCII 码从小到大排序(字典序)
infoIds.sort(Comparator.comparing(o -> (o.getKey())));
// 构造URL 键值对的格式
StringBuilder buf = new StringBuilder();
for (Map.Entry<String, Object> item : infoIds) {
if (!StringUtils.isEmpty(item.getKey())) {
String key = item.getKey();
String val = null;
if (item.getValue() == null) {
continue;
} else {
val = String.valueOf(item.getValue());
}
buf.append(key).append(containSymbols ? "=" : "").append(val);
buf.append(sign);
}
}
buff = buf.toString();
if (buff.isEmpty() == false && containSymbols) {
buff = buff.substring(0, buff.length() - 1);
}
} catch (Exception e) {
return null;
}
return buff;
}
/**
* Map --> Bean * Map --> Bean
* *
* @param map * @param map
......
...@@ -99,7 +99,7 @@ public class WebAspect { ...@@ -99,7 +99,7 @@ public class WebAspect {
} }
List<String> unauthorizedUrls = Arrays.asList(getNotFilterUrl(CommonRedisKeyConstant.SAAS_NOT_AUTHORIZED_URL, NOT_AUTHORIZED_KEY).split(",")); List<String> unauthorizedUrls = Arrays.asList(getNotFilterUrl(CommonRedisKeyConstant.SAAS_NOT_AUTHORIZED_URL, NOT_AUTHORIZED_KEY).split(","));
List<String> mcCafeUnauthorizedUrls = Arrays.asList("/MCoffee/mcCafePaySuccessCallback","/openStoreMCCafeQueryPaymentCallback","/MCoffee/mcCafeRefund", List<String> mcCafeUnauthorizedUrls = Arrays.asList("/MCoffee/mcCafePaySuccessCallback","/openStoreMCCafeQueryPaymentCallback","/MCoffee/mcCafeRefund",
"/maCafeQueryOrders","/mcCafeQueryOrderById","/reminder","/listFreeRider","/mcCafePollingPickUpCode","/mcCafe/statusOperate"); "/maCafeQueryOrders","/mcCafeQueryOrderById","/reminder","/listFreeRider","/mcCafePollingPickUpCode","/mcCafe/statusOperate","/MCoffee/mcCafeRefundNotifyCallback");
if (!unauthorizedUrls.contains(requestUrl) && StringUtils.isEmpty(userInfo.getUnionId()) if (!unauthorizedUrls.contains(requestUrl) && StringUtils.isEmpty(userInfo.getUnionId())
&& mcCafeUnauthorizedUrls.stream().noneMatch(o -> requestUrl.contains(o))) { && mcCafeUnauthorizedUrls.stream().noneMatch(o -> requestUrl.contains(o))) {
throw new CommonServiceException(CommonResponseResult.USER_UNAUTHORIZED); throw new CommonServiceException(CommonResponseResult.USER_UNAUTHORIZED);
......
...@@ -255,6 +255,15 @@ public class OrderController { ...@@ -255,6 +255,15 @@ public class OrderController {
} }
/** /**
* 退款回掉通知
*/
@ApiAnnotation(logMessage = "mcCafeRefundNotifyCallback")
@PostMapping("/MCoffee/mcCafeRefundNotifyCallback")
public String mcCafeRefundNotifyCallback(@LogParams @RequestBody RefundNotifyCallbackRequestVo requestVo) {
return mcCafeOrderService.mcCafeRefundNotifyCallback(requestVo);
}
/**
* 获取订单排队号 * 获取订单排队号
*/ */
@ApiAnnotation(logMessage = "queueIndex") @ApiAnnotation(logMessage = "queueIndex")
......
package cn.freemud.entities.dto;
import lombok.Data;
/**
* All rights Reserved, Designed By www.freemud.com
*
* @version V1.0
* @Title:
* @Package: com.freemud.platform.amp.order.consumer.entity
* @Descripttion:
* @author: shuhu.hou
* @date: 2019/7/9
* @Copyright: 2017 www.freemud.cn Inc. All rights reserved.
* 注意:本内容仅限于上海非码科技内部传阅,禁止外泄以及用于其他的商业目.
*/
@Data
public class OrderRefundStatusChangeRequestBody {
private String orderCode;
private String timeStamp;
private String refundType;
private String refundStatus;
private String refundReason;
}
...@@ -35,5 +35,10 @@ public interface MCCafeOrderService { ...@@ -35,5 +35,10 @@ public interface MCCafeOrderService {
*/ */
BaseResponse orderRefund(OrderRefundVo orderRefundVo); BaseResponse orderRefund(OrderRefundVo orderRefundVo);
/**
* 退款回掉通知
*/
String mcCafeRefundNotifyCallback(RefundNotifyCallbackRequestVo message);
} }
...@@ -23,6 +23,7 @@ import cn.freemud.base.log.LogTreadLocal; ...@@ -23,6 +23,7 @@ import cn.freemud.base.log.LogTreadLocal;
import cn.freemud.base.util.DateUtil; import cn.freemud.base.util.DateUtil;
import cn.freemud.constant.RedisKeyConstant; import cn.freemud.constant.RedisKeyConstant;
import cn.freemud.constant.ResponseCodeConstant; import cn.freemud.constant.ResponseCodeConstant;
import cn.freemud.controller.test.PlatformBaseRequest;
import cn.freemud.entities.dto.PayAccessResponse; import cn.freemud.entities.dto.PayAccessResponse;
import cn.freemud.entities.dto.*; import cn.freemud.entities.dto.*;
import cn.freemud.entities.dto.QueryOrdersResponseDto.DataBean.OrderBean; import cn.freemud.entities.dto.QueryOrdersResponseDto.DataBean.OrderBean;
...@@ -46,17 +47,21 @@ import cn.freemud.service.*; ...@@ -46,17 +47,21 @@ import cn.freemud.service.*;
import cn.freemud.service.mccafe.thirdparty.DeliveryFeiginMCCafeClient; import cn.freemud.service.mccafe.thirdparty.DeliveryFeiginMCCafeClient;
import cn.freemud.service.thirdparty.*; import cn.freemud.service.thirdparty.*;
import cn.freemud.utils.LogUtil; import cn.freemud.utils.LogUtil;
import cn.freemud.utils.RedisUtil;
import cn.freemud.utils.ResponseUtil; import cn.freemud.utils.ResponseUtil;
import cn.freemud.utils.ValidationCode; import cn.freemud.utils.ValidationCode;
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import com.freemud.api.assortment.datamanager.entity.db.*; import com.freemud.api.assortment.datamanager.entity.db.*;
import com.freemud.api.assortment.datamanager.entity.dto.AssortmentOpenApiEncryptDto;
import com.freemud.api.assortment.datamanager.entity.vo.AssortmentCustomerInfoVo; import com.freemud.api.assortment.datamanager.entity.vo.AssortmentCustomerInfoVo;
import com.freemud.api.assortment.datamanager.enums.OpenPlatformEncryptUrlType;
import com.freemud.api.assortment.datamanager.manager.*; import com.freemud.api.assortment.datamanager.manager.*;
import com.freemud.api.assortment.datamanager.manager.cache.CacheOpenPlatformPartnerWxappConfigManager; import com.freemud.api.assortment.datamanager.manager.cache.CacheOpenPlatformPartnerWxappConfigManager;
import com.freemud.api.assortment.datamanager.manager.customer.AssortmentCustomerInfoManager; import com.freemud.api.assortment.datamanager.manager.customer.AssortmentCustomerInfoManager;
import com.freemud.api.assortment.datamanager.meal.MealCacheManager; import com.freemud.api.assortment.datamanager.meal.MealCacheManager;
import com.freemud.api.assortment.datamanager.openapiencrypt.CacheOpenApiEncryptManager;
import com.freemud.application.sdk.api.constant.ResponseConstant; import com.freemud.application.sdk.api.constant.ResponseConstant;
import com.freemud.application.sdk.api.constant.ResponseResultEnum; import com.freemud.application.sdk.api.constant.ResponseResultEnum;
import com.freemud.application.sdk.api.couponcenter.offline.response.CouponBaseResponse; import com.freemud.application.sdk.api.couponcenter.offline.response.CouponBaseResponse;
...@@ -64,6 +69,7 @@ import com.freemud.application.sdk.api.couponcenter.offline.response.CouponRedee ...@@ -64,6 +69,7 @@ import com.freemud.application.sdk.api.couponcenter.offline.response.CouponRedee
import com.freemud.application.sdk.api.deliverycenter.response.CreateDeliveryOrderResponseDto; import com.freemud.application.sdk.api.deliverycenter.response.CreateDeliveryOrderResponseDto;
import com.freemud.application.sdk.api.deliverycenter.service.DeliveryService; import com.freemud.application.sdk.api.deliverycenter.service.DeliveryService;
import com.freemud.application.sdk.api.log.ApiLog; import com.freemud.application.sdk.api.log.ApiLog;
import com.freemud.application.sdk.api.log.ErrorLog;
import com.freemud.application.sdk.api.log.LogThreadLocal; import com.freemud.application.sdk.api.log.LogThreadLocal;
import com.freemud.application.sdk.api.ordercenter.enums.AfterSalesType; import com.freemud.application.sdk.api.ordercenter.enums.AfterSalesType;
import com.freemud.application.sdk.api.ordercenter.enums.OrderClientType; import com.freemud.application.sdk.api.ordercenter.enums.OrderClientType;
...@@ -84,6 +90,7 @@ import com.freemud.application.sdk.api.storecenter.response.StoreResponse; ...@@ -84,6 +90,7 @@ import com.freemud.application.sdk.api.storecenter.response.StoreResponse;
import com.freemud.application.sdk.api.storecenter.service.StoreCenterService; import com.freemud.application.sdk.api.storecenter.service.StoreCenterService;
import com.freemud.application.sdk.api.structure.request.PushMessageNoticeDto; import com.freemud.application.sdk.api.structure.request.PushMessageNoticeDto;
import com.freemud.application.sdk.api.structure.service.MessageCenterClient; import com.freemud.application.sdk.api.structure.service.MessageCenterClient;
import com.freemud.openstore.sdk.util.RSASignUtil;
import com.freemud.sdk.api.assortment.message.config.MessageOfficialRefundPushMqConfig; import com.freemud.sdk.api.assortment.message.config.MessageOfficialRefundPushMqConfig;
import com.freemud.sdk.api.assortment.message.entity.MpTemplateMsg; import com.freemud.sdk.api.assortment.message.entity.MpTemplateMsg;
import com.freemud.sdk.api.assortment.message.entity.MpTemplateMsgDataValue; import com.freemud.sdk.api.assortment.message.entity.MpTemplateMsgDataValue;
...@@ -100,6 +107,7 @@ import com.freemud.sdk.api.assortment.order.response.payment.OrderPayResponse; ...@@ -100,6 +107,7 @@ import com.freemud.sdk.api.assortment.order.response.payment.OrderPayResponse;
import cn.freemud.service.mccafe.CouponClientService; import cn.freemud.service.mccafe.CouponClientService;
import cn.freemud.service.mccafe.MCCafeOrderCenterSdkService; import cn.freemud.service.mccafe.MCCafeOrderCenterSdkService;
import com.freemud.sdk.api.assortment.order.service.OrderCenterSdkService; import com.freemud.sdk.api.assortment.order.service.OrderCenterSdkService;
import com.freemud.sdk.api.assortment.order.util.MapBeanConvertUtil;
import com.freemud.sdk.api.assortment.order.vo.ProductGroupVo; import com.freemud.sdk.api.assortment.order.vo.ProductGroupVo;
import com.freemud.sdk.api.assortment.orderdistributor.entity.dto.PaymentMqMessageDto; import com.freemud.sdk.api.assortment.orderdistributor.entity.dto.PaymentMqMessageDto;
import com.freemud.sdk.api.assortment.orderdistributor.service.PaymentQueueService; import com.freemud.sdk.api.assortment.orderdistributor.service.PaymentQueueService;
...@@ -235,6 +243,8 @@ public class MCCafeOrderServiceImpl implements MCCafeOrderService { ...@@ -235,6 +243,8 @@ public class MCCafeOrderServiceImpl implements MCCafeOrderService {
private OrderBaseService orderBaseService; private OrderBaseService orderBaseService;
@Autowired @Autowired
private CustomerExtendClient customerExtendClient; private CustomerExtendClient customerExtendClient;
@Autowired
private CacheOpenApiEncryptManager cacheOpenApiEncryptManager;
@Override @Override
public BaseResponse createMCCafeOrder(CreateOrderVo createOrderVo) { public BaseResponse createMCCafeOrder(CreateOrderVo createOrderVo) {
...@@ -1225,6 +1235,94 @@ public class MCCafeOrderServiceImpl implements MCCafeOrderService { ...@@ -1225,6 +1235,94 @@ public class MCCafeOrderServiceImpl implements MCCafeOrderService {
return null; return null;
} }
@Override
public String mcCafeRefundNotifyCallback(RefundNotifyCallbackRequestVo requestVo) {
if (StringUtils.isEmpty(requestVo.getTransId())) {
//订单号不能为空
return refundFaileMessage("transId is can not empty");
}
//混合支付需要从缓存中获取订单号码,正常支付TransId = orderId
String orderId = redisCache.getValue(RedisUtil.getPaymentTransIdOrderKey(requestVo.getTransId()));
if(StringUtils.isNotEmpty(orderId)){
requestVo.setTransId(orderId);
}
String trackingNo = LogTreadLocal.getTrackingNo();
Integer refundStatus = requestVo.getRefundStatus();
if (!Objects.equals(refundStatus, ResponseCodeConstant.RESPONSE_SUCCESS)) {
//只有退款成功更新状态.其他情况不处理
return refundFaileMessage("pay refundStatus is not 100,refundStatus=" + refundStatus);
}
// 如果transId为空,返回失败
if (StringUtils.isBlank(requestVo.getTransId())) {
return refundFaileMessage("transId is empty " + requestVo);
}
//查询订单详情
QueryRelationOrderByIdResponseDto queryOrderByIdResponseDto = getQueryRelationOrderByIdResponseDto(requestVo.getTransId());
if (queryOrderByIdResponseDto.getData() == null || !Objects.equals(ResponseCodeConstant.RESPONSE_SUCCESS, queryOrderByIdResponseDto.getErrcode())) {
return refundFaileMessage("order query fail " + queryOrderByIdResponseDto);
}
OrderBean orderBean = new OrderBean();
if (1 == queryOrderByIdResponseDto.getData().size()) {
orderBean = queryOrderByIdResponseDto.getData().get(0);
} else {
List<OrderBean> orderBeans = queryOrderByIdResponseDto.getData().stream().filter(order -> order.getBizType().equals(1)).collect(Collectors.toList());
if (CollectionUtils.isNotEmpty(orderBeans)) {
orderBean = orderBeans.get(0);
}
}
// PlatformBaseRequest platformBaseRequest = getRequest(orderBean);
OrderRefundRequest orderRefundRequest = new OrderRefundRequest();
orderRefundRequest.setPartnerId(orderBean.getCompanyId());
orderRefundRequest.setStoreId(orderBean.getShopId());
orderRefundRequest.setOrderId(orderBean.getOid());
orderRefundRequest.setOrderClient(OrderClientType.SAAS.getIndex());
orderRefundRequest.setAfterSalesType(AfterSalesType.USER_CANCEL);
orderRefundRequest.setReason("门店线下退款");
orderRefundRequest.setOperator("门店营业人员");
orderRefundRequest.setOrderStatus(orderBean.getStatus());
orderRefundRequest.setActualAmount(orderBean.getAmount());
orderRefundRequest.setReqAmount(orderBean.getAmount());
orderRefundRequest.setTrackingNo(trackingNo);
orderRefundRequest.setCreateEvent(AfterSalesOrderCreateEventEnum.REFUND_COMPLETE.getCreateEvent());
BaseOrderResponse baseOrderResponse = orderCenterSdkService.orderRefund(orderRefundRequest);
if (baseOrderResponse == null || baseOrderResponse.getData() == null || !ObjectUtils.equals(ResponseConstant.SUCCESS_RESPONSE_CODE, baseOrderResponse.getErrcode())) {
LogUtil.error("mcCafeRefundNotifyCallback", orderRefundRequest, baseOrderResponse);
return refundFaileMessage("create after sale order failed");
}
return newSendPaySuccessNoticeMessage();
}
private PlatformBaseRequest getRequest(OrderBean orderInfo) {
PlatformBaseRequest request = new PlatformBaseRequest();
AssortmentOpenApiEncryptDto openApiEncrypts = cacheOpenApiEncryptManager.getAssortmentOpenApiEncrypt(orderInfo.getCompanyId(), OpenPlatformEncryptUrlType.REFUND_STATUS_CHANGE_NOTIFY_URL);
request.setAppId(openApiEncrypts.getAppId());
request.setPartnerId(orderInfo.getCompanyId());
request.setVer("1");
OrderRefundStatusChangeRequestBody orderBody = new OrderRefundStatusChangeRequestBody();
orderBody.setOrderCode(orderInfo.getOid());
orderBody.setTimeStamp(System.currentTimeMillis()+"");
orderBody.setRefundType(AfterSalesType.OTHER.getIndex().toString());
orderBody.setRefundStatus(com.freemud.sdk.api.assortment.order.enums.RefundStatus.COMPLETE_REFUND.getCode().toString());
orderBody.setRefundReason("门店线下退款");
request.setRequestBody(JSON.toJSONString(orderBody));
String content = MapBeanConvertUtil.sortObjWithoutSign(request);
try {
request.setSign(RSASignUtil.getSign(content, openApiEncrypts.getServerPrivateKey(), "UTF-8"));
} catch (Exception e) {
LogUtil.error("getPlatformBaseRequest", content, JSON.toJSONString(openApiEncrypts), e);
}
return request;
}
/** /**
* 取消配送 * 取消配送
* *
...@@ -1267,12 +1365,13 @@ public class MCCafeOrderServiceImpl implements MCCafeOrderService { ...@@ -1267,12 +1365,13 @@ public class MCCafeOrderServiceImpl implements MCCafeOrderService {
} }
/** /**
* 发送pos端消 * 退款中回调失败返回信
*/ */
public void sendPosMessage(String partnerId, String storeId) { public String refundFaileMessage(String errorMes) {
PushMessageNoticeDto pushMessageNoticeDto = messageNoticeAdapter.convent2PushMessageNoticeDto(2, partnerId, storeId, Map<String, Object> map = Maps.newTreeMap();
null, null, null, null); map.put("code", 500);
messageNoticeClient.createMessage(pushMessageNoticeDto, LogThreadLocal.getTrackingNo()); map.put("message", "failed:" + errorMes);
return gson.toJson(map);
} }
/** /**
......
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