Commit ca7bdebc by 胡超

Merge remote-tracking branch 'origin/master'

parents 784159bf 87b6f7ba
...@@ -38,7 +38,6 @@ import cn.freemud.request.wechat.dto.SignMessageBuilder; ...@@ -38,7 +38,6 @@ import cn.freemud.request.wechat.dto.SignMessageBuilder;
import cn.freemud.service.impl.OrderCommonService; import cn.freemud.service.impl.OrderCommonService;
import cn.freemud.utils.*; import cn.freemud.utils.*;
import com.freemud.api.assortment.datamanager.entity.db.AssortmentOpenPlatformPartnerWxappConfig; import com.freemud.api.assortment.datamanager.entity.db.AssortmentOpenPlatformPartnerWxappConfig;
import com.freemud.api.assortment.datamanager.entity.db.AssortmentOpenPlatformWxapp;
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.IappIdType; import com.freemud.api.assortment.datamanager.enums.IappIdType;
import com.freemud.application.sdk.api.log.LogThreadLocal; import com.freemud.application.sdk.api.log.LogThreadLocal;
...@@ -73,7 +72,6 @@ import org.springframework.stereotype.Component; ...@@ -73,7 +72,6 @@ import org.springframework.stereotype.Component;
import java.awt.geom.Point2D; import java.awt.geom.Point2D;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.net.URL;
import java.security.NoSuchAlgorithmException; import java.security.NoSuchAlgorithmException;
import java.security.spec.InvalidKeySpecException; import java.security.spec.InvalidKeySpecException;
import java.text.DecimalFormat; import java.text.DecimalFormat;
...@@ -2259,13 +2257,13 @@ public class OrderAdapter { ...@@ -2259,13 +2257,13 @@ public class OrderAdapter {
/** /**
* 支付信息转换 * 支付信息转换
*/ */
public UnifiedOrderRequest convent2UnifiedOrderRequest(QueryOrdersResponse.DataBean.OrderBean orderBean, PaymentRequest paymentRequest, Long amount, Integer cardAmount) { public UnifiedOrderRequest convent2UnifiedOrderRequest(QueryOrdersResponse.DataBean.OrderBean orderBean, PaymentRequest paymentRequest, Long amount, Integer cardAmount, String transId) {
UnifiedOrderRequest orderPayDto = new UnifiedOrderRequest(); UnifiedOrderRequest orderPayDto = new UnifiedOrderRequest();
orderPayDto.setPartnerId(orderBean.getCompanyId()); orderPayDto.setPartnerId(orderBean.getCompanyId());
orderPayDto.setBody(paymentRequest.getPrincipalName()); orderPayDto.setBody(paymentRequest.getPrincipalName());
orderPayDto.setNotifyUrl(paymentRequest.getReverseNotifyiDcUrl()); orderPayDto.setNotifyUrl(paymentRequest.getReverseNotifyiDcUrl());
orderPayDto.setStoreId(orderBean.getShopId()); orderPayDto.setStoreId(orderBean.getShopId());
orderPayDto.setTransId(orderBean.getOid()); orderPayDto.setTransId(transId);
orderPayDto.setOpenId(paymentRequest.getOpenId()); orderPayDto.setOpenId(paymentRequest.getOpenId());
String businessDate = com.freemud.application.sdk.api.util.DateUtil.convert2String(new Date(), "yyyyMMdd"); String businessDate = com.freemud.application.sdk.api.util.DateUtil.convert2String(new Date(), "yyyyMMdd");
orderPayDto.setBusinessDate(businessDate); orderPayDto.setBusinessDate(businessDate);
...@@ -2786,7 +2784,8 @@ public class OrderAdapter { ...@@ -2786,7 +2784,8 @@ public class OrderAdapter {
public CreatePrepayRequestDto convertToCreatePrepayRequestDto(String partnerId, String wxAppId, String openId, public CreatePrepayRequestDto convertToCreatePrepayRequestDto(String partnerId, String wxAppId, String openId,
String faceCode, String cardCode, String payCode, QueryOrdersResponse.DataBean.OrderBean fatherOrderBean, String faceCode, String cardCode, String payCode, QueryOrdersResponse.DataBean.OrderBean fatherOrderBean,
QueryOrdersResponse.DataBean.OrderBean productOrderBean, long totalAmount, int cardAmount, OrderExtInfoDTO orderExtInfoDTO){ QueryOrdersResponse.DataBean.OrderBean productOrderBean, long totalAmount, int cardAmount, OrderExtInfoDTO orderExtInfoDTO,
String transId){
CreatePrepayRequestDto requestDto = new CreatePrepayRequestDto(); CreatePrepayRequestDto requestDto = new CreatePrepayRequestDto();
requestDto.setPartnerId(partnerId); requestDto.setPartnerId(partnerId);
requestDto.setWxAppId(wxAppId); requestDto.setWxAppId(wxAppId);
...@@ -2799,6 +2798,7 @@ public class OrderAdapter { ...@@ -2799,6 +2798,7 @@ public class OrderAdapter {
requestDto.setTotalAmount(totalAmount); requestDto.setTotalAmount(totalAmount);
requestDto.setCardAmount(cardAmount); requestDto.setCardAmount(cardAmount);
requestDto.setOrderExtInfoDTO(orderExtInfoDTO); requestDto.setOrderExtInfoDTO(orderExtInfoDTO);
requestDto.setTransId(transId);
return requestDto; return requestDto;
} }
...@@ -2808,7 +2808,28 @@ public class OrderAdapter { ...@@ -2808,7 +2808,28 @@ public class OrderAdapter {
createOrderVo.getFaceCode(), createOrderVo.getCardCode(), null, createOrderVo.getFaceCode(), createOrderVo.getCardCode(), null,
createOrderOperateDto.getFatherOrderBean(), createOrderOperateDto.getProductOrderBean(), createOrderOperateDto.getFatherOrderBean(), createOrderOperateDto.getProductOrderBean(),
createOrderOperateDto.getTotalAmount() == null ? 0 : createOrderOperateDto.getTotalAmount(), createOrderOperateDto.getTotalAmount() == null ? 0 : createOrderOperateDto.getTotalAmount(),
createOrderOperateDto.getCardAmount() == null ? 0 : createOrderOperateDto.getCardAmount(), orderExtInfoDTO); createOrderOperateDto.getCardAmount() == null ? 0 : createOrderOperateDto.getCardAmount(), orderExtInfoDTO,
createOrderOperateDto.getFatherOrderBean().getOid());
}
/**
* 支付后通知失败返回信息
*/
public String newSendPayFaileMessage() {
Map<String, Object> map = Maps.newTreeMap();
map.put("code", 500);
map.put("message", "failed");
return gson.toJson(map);
}
/**
* 支付后通知确认返回信息
*/
public String sendPaySuccessNoticeMessage() {
Map<String, Object> map = Maps.newTreeMap();
map.put("code", 0);
map.put("message", "success");
return gson.toJson(map);
} }
public Integer getNewOrderClient(String name) { public Integer getNewOrderClient(String name) {
......
...@@ -99,7 +99,7 @@ public class OrderController { ...@@ -99,7 +99,7 @@ public class OrderController {
@ApiAnnotation(logMessage = "paySuccessCallback") @ApiAnnotation(logMessage = "paySuccessCallback")
@PostMapping("/paySuccessCallback") @PostMapping("/paySuccessCallback")
public String paySuccessCallback(@LogParams @RequestBody PaysuccessNoticeMessage message) { public String paySuccessCallback(@LogParams @RequestBody PaysuccessNoticeMessage message) {
return orderservice.paySuccessCallback(message); return orderAdapterService.paySuccessCallback(message);
} }
/** /**
......
...@@ -6,15 +6,52 @@ import lombok.Data; ...@@ -6,15 +6,52 @@ import lombok.Data;
@Data @Data
public class CreatePrepayRequestDto { public class CreatePrepayRequestDto {
/**
* 商户id
*/
private String partnerId; private String partnerId;
/**
* appid
*/
private String wxAppId; private String wxAppId;
/**
* 用户openId
*/
private String openId; private String openId;
/**
* 人脸识别码code
*/
private String faceCode; private String faceCode;
/**
* 会员卡code
*/
private String cardCode; private String cardCode;
/**
* 支付渠道码
*/
private String payCode; private String payCode;
/**
* 父订单,如果不存在,则值与productOrderBean一致
*/
private QueryOrdersResponse.DataBean.OrderBean fatherOrderBean; private QueryOrdersResponse.DataBean.OrderBean fatherOrderBean;
/**
* 商品订单
*/
private QueryOrdersResponse.DataBean.OrderBean productOrderBean; private QueryOrdersResponse.DataBean.OrderBean productOrderBean;
/**
* 总金额
*/
private long totalAmount; private long totalAmount;
/**
* 会员卡支付金额
*/
private int cardAmount; private int cardAmount;
/**
* 订单扩展信息
*/
private OrderExtInfoDTO orderExtInfoDTO; private OrderExtInfoDTO orderExtInfoDTO;
/**
* 交易请求号
*/
private String transId;
} }
...@@ -23,7 +23,12 @@ public enum RedisCacheEnum { ...@@ -23,7 +23,12 @@ public enum RedisCacheEnum {
ORDER_PLUS_DISH_LOCKKEY_PREFIX("kgd:encircle:plus:dish:table:lock:","围餐下单业务LockKey"), ORDER_PLUS_DISH_LOCKKEY_PREFIX("kgd:encircle:plus:dish:table:lock:","围餐下单业务LockKey"),
ORDER_CREATE_TRANS_ID_KEY("kgd:meal:trans:{0}:{1}:{2}:{3}","围餐下单多次创建预支付生成不同TRANS_ID"), ORDER_CREATE_TRANS_ID_KEY("kgd:meal:trans:{0}:{1}:{2}:{3}","围餐下单多次创建预支付生成不同TRANS_ID"),
ORDER_CREATE_PRE_PARMENT_INTO_LOCK("kgd:meal:pre:payment:lock:","围餐订单唤起预支付锁定不可下单"), ORDER_CREATE_PRE_PARMENT_INTO_LOCK("kgd:meal:pre:payment:lock:","围餐订单唤起预支付锁定不可下单"),
ORDER_CACHE_WEICAN_TRANSID_INFO("kgd:meal:payment:trans:order:","缓存围餐支付transId"); ORDER_CACHE_WEICAN_TRANSID_INFO("kgd:meal:payment:trans:order:","缓存围餐支付transId"),
PAYMENT_TRANSID_SEQUENCE_KEY("kgd:payment:transid:sequence:{0}", "创建预支付交易号序列"),
PAYMENT_TRANSID_ORDER_KEY("kgd:payment:transid:order:{0}", "交易订单key"),
;
private String code; private String code;
private String desc; private String desc;
......
...@@ -5,6 +5,11 @@ import cn.freemud.entities.vo.AppCreateOrderVo; ...@@ -5,6 +5,11 @@ import cn.freemud.entities.vo.AppCreateOrderVo;
import cn.freemud.entities.vo.CreateOrderVo; import cn.freemud.entities.vo.CreateOrderVo;
import cn.freemud.entities.vo.CreatePrepayVo; import cn.freemud.entities.vo.CreatePrepayVo;
import com.freemud.api.assortment.datamanager.entity.vo.AssortmentCustomerInfoVo; import com.freemud.api.assortment.datamanager.entity.vo.AssortmentCustomerInfoVo;
import cn.freemud.entities.dto.ConfirmOrderDto;
import cn.freemud.entities.dto.QueryOrdersResponseDto;
import cn.freemud.entities.vo.PaysuccessNoticeMessage;
import java.util.Map;
/** /**
* app订单服务 * app订单服务
...@@ -25,4 +30,6 @@ public interface AppOrderService { ...@@ -25,4 +30,6 @@ public interface AppOrderService {
* APP下单,下单带商品信息,不经过购物车服务,不唤起支付 * APP下单,下单带商品信息,不经过购物车服务,不唤起支付
*/ */
BaseResponse createOrder(AppCreateOrderVo createOrderVo, AssortmentCustomerInfoVo customerInfo); BaseResponse createOrder(AppCreateOrderVo createOrderVo, AssortmentCustomerInfoVo customerInfo);
String paySuccessCallback(PaysuccessNoticeMessage message, ConfirmOrderDto confirmOrderDto, Map<String, QueryOrdersResponseDto.DataBean.OrderBean> orderBeans);
} }
package cn.freemud.service; package cn.freemud.service;
import cn.freemud.base.entity.BaseResponse; import cn.freemud.base.entity.BaseResponse;
import cn.freemud.entities.dto.ConfirmOrderDto;
import cn.freemud.entities.dto.QueryOrdersResponseDto;
import cn.freemud.entities.vo.CreateOrderVo; import cn.freemud.entities.vo.CreateOrderVo;
import cn.freemud.entities.vo.OrderAffirmRequestVO; import cn.freemud.entities.vo.OrderAffirmRequestVO;
import cn.freemud.entities.vo.PaysuccessNoticeMessage;
import cn.freemud.entities.vo.encircle.CreateReserveOrderVo; import cn.freemud.entities.vo.encircle.CreateReserveOrderVo;
import cn.freemud.entities.vo.encircle.EmptyTableNumberVo; import cn.freemud.entities.vo.encircle.EmptyTableNumberVo;
import cn.freemud.entities.vo.encircle.EncircleReserveBaseVo; import cn.freemud.entities.vo.encircle.EncircleReserveBaseVo;
import java.util.Map;
/** /**
* 商城订单业务操作类 * 商城订单业务操作类
* @version V1.0 * @version V1.0
...@@ -28,4 +33,9 @@ public interface MallOrderService { ...@@ -28,4 +33,9 @@ public interface MallOrderService {
*/ */
BaseResponse orderAffirm(OrderAffirmRequestVO requestVO); BaseResponse orderAffirm(OrderAffirmRequestVO requestVO);
/**
* 支付回调
*/
String paySuccessCallback(PaysuccessNoticeMessage message, ConfirmOrderDto confirmOrderDto, Map<String, QueryOrdersResponseDto.DataBean.OrderBean> orderBeans);
} }
...@@ -4,6 +4,7 @@ import cn.freemud.base.entity.BaseResponse; ...@@ -4,6 +4,7 @@ import cn.freemud.base.entity.BaseResponse;
import cn.freemud.entities.vo.AppCreateOrderVo; import cn.freemud.entities.vo.AppCreateOrderVo;
import cn.freemud.entities.vo.CreateOrderVo; import cn.freemud.entities.vo.CreateOrderVo;
import cn.freemud.entities.vo.CreatePrepayVo; import cn.freemud.entities.vo.CreatePrepayVo;
import cn.freemud.entities.vo.PaysuccessNoticeMessage;
/** /**
* All rights Reserved, Designed By www.freemud.cn * All rights Reserved, Designed By www.freemud.cn
...@@ -35,4 +36,9 @@ public interface OrderAdapterService { ...@@ -35,4 +36,9 @@ public interface OrderAdapterService {
*/ */
BaseResponse appCreateOrder(AppCreateOrderVo createOrderVo); BaseResponse appCreateOrder(AppCreateOrderVo createOrderVo);
/**
* 支付回调处理
*/
String paySuccessCallback(PaysuccessNoticeMessage message);
} }
package cn.freemud.service; package cn.freemud.service;
import cn.freemud.base.entity.BaseResponse; import cn.freemud.base.entity.BaseResponse;
import cn.freemud.entities.dto.ConfirmOrderDto;
import cn.freemud.entities.dto.QueryOrdersResponseDto;
import cn.freemud.entities.vo.*; import cn.freemud.entities.vo.*;
import com.freemud.sdk.api.assortment.order.enums.OrderSdkType; import com.freemud.sdk.api.assortment.order.enums.OrderSdkType;
import java.util.Map;
/** /**
* 订单服务 * 订单服务
* *
...@@ -25,9 +29,9 @@ public interface Orderservice { ...@@ -25,9 +29,9 @@ public interface Orderservice {
BaseResponse scanFaceCreateOrder(CreateOrderVo createOrderVo); BaseResponse scanFaceCreateOrder(CreateOrderVo createOrderVo);
/** /**
* 支付成功后回调通知 * 支付回调
*/ */
String paySuccessCallback(PaysuccessNoticeMessage message); String paySuccessCallback(PaysuccessNoticeMessage message, ConfirmOrderDto confirmOrderDto, Map<String, QueryOrdersResponseDto.DataBean.OrderBean> orderBeans);
/** /**
* 支付成功后回调通知_新版本 * 支付成功后回调通知_新版本
......
...@@ -4,17 +4,26 @@ import cn.freemud.adapter.OrderAdapter; ...@@ -4,17 +4,26 @@ import cn.freemud.adapter.OrderAdapter;
import cn.freemud.base.entity.BaseResponse; import cn.freemud.base.entity.BaseResponse;
import cn.freemud.base.log.LogTreadLocal; import cn.freemud.base.log.LogTreadLocal;
import cn.freemud.constant.ResponseCodeConstant; import cn.freemud.constant.ResponseCodeConstant;
import cn.freemud.entities.dto.ConfirmOrderDto;
import cn.freemud.entities.dto.QueryOrdersResponseDto;
import cn.freemud.entities.dto.order.CreateOrderOperateDto; import cn.freemud.entities.dto.order.CreateOrderOperateDto;
import cn.freemud.entities.dto.order.CreatePrepayRequestDto; import cn.freemud.entities.dto.order.CreatePrepayRequestDto;
import cn.freemud.entities.dto.shoppingCart.ActivityDiscountsDto; import cn.freemud.entities.dto.shoppingCart.ActivityDiscountsDto;
import cn.freemud.entities.dto.shoppingCart.ShoppingCartGoodsDto; import cn.freemud.entities.dto.shoppingCart.ShoppingCartGoodsDto;
import cn.freemud.entities.vo.*; import cn.freemud.entities.vo.*;
import cn.freemud.entities.vo.CreateOrderResponseVo;
import cn.freemud.entities.vo.CreateOrderVo;
import cn.freemud.entities.vo.CreatePrepayVo;
import cn.freemud.entities.vo.PaysuccessNoticeMessage;
import cn.freemud.enums.OrderBeanType;
import cn.freemud.enums.PayStatus; import cn.freemud.enums.PayStatus;
import cn.freemud.enums.ResponseResult; import cn.freemud.enums.ResponseResult;
import cn.freemud.enums.TradeState; import cn.freemud.enums.TradeState;
import cn.freemud.interceptor.ServiceException; import cn.freemud.interceptor.ServiceException;
import cn.freemud.redis.RedisCache;
import cn.freemud.service.AppOrderService; import cn.freemud.service.AppOrderService;
import cn.freemud.utils.BeanUtil; import cn.freemud.utils.BeanUtil;
import cn.freemud.utils.RedisUtil;
import cn.freemud.utils.ResponseUtil; import cn.freemud.utils.ResponseUtil;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import com.freemud.api.assortment.datamanager.entity.vo.AssortmentCustomerInfoVo; import com.freemud.api.assortment.datamanager.entity.vo.AssortmentCustomerInfoVo;
...@@ -52,6 +61,8 @@ import java.util.ArrayList; ...@@ -52,6 +61,8 @@ import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Objects; import java.util.Objects;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import java.util.Map;
import java.util.concurrent.TimeUnit;
@Service @Service
public class AppOrderServiceImpl implements AppOrderService { public class AppOrderServiceImpl implements AppOrderService {
...@@ -66,6 +77,10 @@ public class AppOrderServiceImpl implements AppOrderService { ...@@ -66,6 +77,10 @@ public class AppOrderServiceImpl implements AppOrderService {
private OrderCenterSdkService orderCenterSdkService; private OrderCenterSdkService orderCenterSdkService;
@Autowired @Autowired
private PaymentNewService paymentNewService; private PaymentNewService paymentNewService;
@Autowired
private RedisCache redisCache;
@Autowired
private RedisService redisService;
//门店SDK //门店SDK
@Autowired @Autowired
...@@ -111,9 +126,11 @@ public class AppOrderServiceImpl implements AppOrderService { ...@@ -111,9 +126,11 @@ public class AppOrderServiceImpl implements AppOrderService {
extInfo.setOpenid(createPrepayVo.getOpenId()); extInfo.setOpenid(createPrepayVo.getOpenId());
String faceCode = ""; String faceCode = "";
String cardCode = ""; String cardCode = "";
String transId = createPrepayVo.getOrderCode() + redisService.increment(RedisUtil.getPaymentTransIdSequenceKey(createPrepayVo.getOrderCode()), 1, TimeUnit.DAYS);
CreatePrepayRequestDto createPrepayRequestDto = orderAdapter.convertToCreatePrepayRequestDto(createPrepayVo.getPartnerId(), createPrepayVo.getPayAppId(), createPrepayVo.getOpenId(), faceCode, CreatePrepayRequestDto createPrepayRequestDto = orderAdapter.convertToCreatePrepayRequestDto(createPrepayVo.getPartnerId(), createPrepayVo.getPayAppId(), createPrepayVo.getOpenId(), faceCode,
cardCode, createPrepayVo.getPayCode(), createOrderOperateDto.getFatherOrderBean(), createOrderOperateDto.getProductOrderBean(), createOrderOperateDto.getTotalAmount(), cardCode, createPrepayVo.getPayCode(), createOrderOperateDto.getFatherOrderBean(), createOrderOperateDto.getProductOrderBean(), createOrderOperateDto.getTotalAmount(),
createOrderOperateDto.getCardAmount(), extInfo); createOrderOperateDto.getCardAmount(), extInfo, transId);
redisService.savePaymentTransIdOrder(RedisUtil.getPaymentTransIdOrderKey(transId), productOrderBean.getOid(), 30L, TimeUnit.MINUTES);
return orderservice.createPrepayOrder(createPrepayRequestDto); return orderservice.createPrepayOrder(createPrepayRequestDto);
} }
...@@ -157,6 +174,17 @@ public class AppOrderServiceImpl implements AppOrderService { ...@@ -157,6 +174,17 @@ public class AppOrderServiceImpl implements AppOrderService {
@Override
public String paySuccessCallback(PaysuccessNoticeMessage message, ConfirmOrderDto confirmOrderDto, Map<String, QueryOrdersResponseDto.DataBean.OrderBean> orderBeans) {
String paySuccessCallbackResult = orderservice.paySuccessCallback(message, confirmOrderDto, orderBeans);
QueryOrdersResponseDto.DataBean.OrderBean orderBean = orderBeans.get(OrderBeanType.SAASORDER.getCode());
// 删除订单自增缓存
redisCache.delete(RedisUtil.getPaymentTransIdSequenceKey(orderBean.getOid()));
// 删除支付交易号订单关系缓存
redisCache.delete(RedisUtil.getPaymentTransIdOrderKey(message.getTrans_id()));
return paySuccessCallbackResult;
}
private void checkOrderBefore(CreatePrepayVo createPrepayVo, QueryOrdersResponse.DataBean.OrderBean orderBean) { private void checkOrderBefore(CreatePrepayVo createPrepayVo, QueryOrdersResponse.DataBean.OrderBean orderBean) {
if(!PayStatus.NOT_PAY.getCode().equals(orderBean.getPayStatus())){ if(!PayStatus.NOT_PAY.getCode().equals(orderBean.getPayStatus())){
throw new ServiceException(ResponseResult.ORDER_HAS_PAID); throw new ServiceException(ResponseResult.ORDER_HAS_PAID);
......
...@@ -18,6 +18,7 @@ import cn.freemud.enums.*; ...@@ -18,6 +18,7 @@ import cn.freemud.enums.*;
import cn.freemud.interceptor.ServiceException; import cn.freemud.interceptor.ServiceException;
import cn.freemud.redis.RedisCache; import cn.freemud.redis.RedisCache;
import cn.freemud.service.EncircleOrderService; import cn.freemud.service.EncircleOrderService;
import cn.freemud.service.OrderAdapterService;
import cn.freemud.service.thirdparty.ShoppingCartClient; import cn.freemud.service.thirdparty.ShoppingCartClient;
import cn.freemud.service.thirdparty.StoreItemClient; import cn.freemud.service.thirdparty.StoreItemClient;
import cn.freemud.utils.AmountUtils; import cn.freemud.utils.AmountUtils;
...@@ -105,6 +106,9 @@ public class EncircleOrderServiceImpl implements EncircleOrderService { ...@@ -105,6 +106,9 @@ public class EncircleOrderServiceImpl implements EncircleOrderService {
private MealCacheManager mealCacheManager; private MealCacheManager mealCacheManager;
@Autowired @Autowired
private ActivityCalculationDiscountService calculationDiscountService; private ActivityCalculationDiscountService calculationDiscountService;
@Autowired
private OrderAdapterService orderAdapterService;
private final Integer RESPONSE_SUCCESS_CODE = 100; private final Integer RESPONSE_SUCCESS_CODE = 100;
...@@ -522,7 +526,7 @@ public class EncircleOrderServiceImpl implements EncircleOrderService { ...@@ -522,7 +526,7 @@ public class EncircleOrderServiceImpl implements EncircleOrderService {
message.setOpenid(assortmentCustomerInfoVo.getOpenId()); message.setOpenid(assortmentCustomerInfoVo.getOpenId());
message.setPlatform_coupon(0); message.setPlatform_coupon(0);
message.setMerchant_coupon(0); message.setMerchant_coupon(0);
orderCommonService.paySuccessCallback(message); orderAdapterService.paySuccessCallback(message);
} }
}else{ }else{
return ResponseUtil.error(ResponseResultEnum.PAY_UNIFIED_ORDER_ERROR.getCode(), ResponseResultEnum.PAY_UNIFIED_ORDER_ERROR.getMessage(), null); return ResponseUtil.error(ResponseResultEnum.PAY_UNIFIED_ORDER_ERROR.getCode(), ResponseResultEnum.PAY_UNIFIED_ORDER_ERROR.getMessage(), null);
......
...@@ -338,7 +338,7 @@ public class MallOrderServiceImpl implements MallOrderService { ...@@ -338,7 +338,7 @@ public class MallOrderServiceImpl implements MallOrderService {
public OrderPayResponse getPreOrderPay(QueryOrdersResponse.DataBean.OrderBean orderBean, PaymentRequest paymentRequest, String trackingNo, Integer cardAmount) { public OrderPayResponse getPreOrderPay(QueryOrdersResponse.DataBean.OrderBean orderBean, PaymentRequest paymentRequest, String trackingNo, Integer cardAmount) {
try { try {
UnifiedOrderRequest request = orderAdapter.convent2UnifiedOrderRequest(orderBean, paymentRequest, orderBean.getAmount(), cardAmount); UnifiedOrderRequest request = orderAdapter.convent2UnifiedOrderRequest(orderBean, paymentRequest, orderBean.getAmount(), cardAmount, orderBean.getOid());
com.freemud.application.sdk.api.base.BaseResponse<UnifiedOrderResponse> responseBase = standardPaymentService.unifiedOrder(request, trackingNo); com.freemud.application.sdk.api.base.BaseResponse<UnifiedOrderResponse> responseBase = standardPaymentService.unifiedOrder(request, trackingNo);
if (!ResponseCodeConstant.RESPONSE_SUCCESS_STR.equals(responseBase.getCode())) { if (!ResponseCodeConstant.RESPONSE_SUCCESS_STR.equals(responseBase.getCode())) {
return null; return null;
...@@ -392,11 +392,8 @@ public class MallOrderServiceImpl implements MallOrderService { ...@@ -392,11 +392,8 @@ public class MallOrderServiceImpl implements MallOrderService {
return this.paySuccessCallback(message, confirmOrderDto, orderBeans); return this.paySuccessCallback(message, confirmOrderDto, orderBeans);
} }
@Override
public String paySuccessCallback(PaysuccessNoticeMessage message, ConfirmOrderDto confirmOrderDto, Map<String, QueryOrdersResponseDto.DataBean.OrderBean> orderBeans) { public String paySuccessCallback(PaysuccessNoticeMessage message, ConfirmOrderDto confirmOrderDto, Map<String, QueryOrdersResponseDto.DataBean.OrderBean> orderBeans) {
if (MapUtils.isEmpty(orderBeans)) {
ErrorLog.printErrorLog("paySuccessCallback_queryOrderById_faild", "paySuccessCallback", message, new Exception());
return gson.toJson(message);
}
QueryOrdersResponseDto.DataBean.OrderBean orderBean = orderBeans.get(OrderBeanType.SAASORDER.getCode()); QueryOrdersResponseDto.DataBean.OrderBean orderBean = orderBeans.get(OrderBeanType.SAASORDER.getCode());
String partnerId = orderBean.getCompanyId(); String partnerId = orderBean.getCompanyId();
String userId = orderBean.getUserId(); String userId = orderBean.getUserId();
......
package cn.freemud.service.impl; package cn.freemud.service.impl;
import cn.freemud.adapter.OrderAdapter;
import cn.freemud.base.entity.BaseResponse; import cn.freemud.base.entity.BaseResponse;
import cn.freemud.entities.vo.AppCreateOrderVo; import cn.freemud.entities.vo.AppCreateOrderVo;
import cn.freemud.base.log.LogTreadLocal;
import cn.freemud.entities.dto.*;
import cn.freemud.entities.vo.CreateOrderVo; import cn.freemud.entities.vo.CreateOrderVo;
import cn.freemud.entities.vo.CreatePrepayVo; import cn.freemud.entities.vo.CreatePrepayVo;
import cn.freemud.entities.vo.PaysuccessNoticeMessage;
import cn.freemud.entities.vo.encircle.CreateReserveOrderVo; import cn.freemud.entities.vo.encircle.CreateReserveOrderVo;
import cn.freemud.enums.OrderChannelType; import cn.freemud.enums.*;
import cn.freemud.enums.ResponseResult;
import cn.freemud.enums.UserLoginChannelEnum;
import cn.freemud.interceptor.ServiceException; import cn.freemud.interceptor.ServiceException;
import cn.freemud.redis.RedisCache;
import cn.freemud.service.*; import cn.freemud.service.*;
import cn.freemud.utils.RedisUtil;
import cn.freemud.utils.ResponseUtil; import cn.freemud.utils.ResponseUtil;
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.IappIdType; import com.freemud.api.assortment.datamanager.enums.IappIdType;
import com.freemud.api.assortment.datamanager.manager.customer.AssortmentCustomerInfoManager; import com.freemud.api.assortment.datamanager.manager.customer.AssortmentCustomerInfoManager;
import com.freemud.sdk.api.assortment.order.enums.OrderSourceType;
import com.freemud.sdk.api.assortment.order.util.LockUtils;
import com.google.gson.Gson;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.MapUtils;
import org.apache.commons.lang.ObjectUtils; import org.apache.commons.lang.ObjectUtils;
import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.util.Map;
/** /**
* All rights Reserved, Designed By www.freemud.cn * All rights Reserved, Designed By www.freemud.cn
* *
...@@ -30,19 +41,31 @@ import org.springframework.stereotype.Service; ...@@ -30,19 +41,31 @@ import org.springframework.stereotype.Service;
* @Copyright: ${DATE.YARE} www.freemud.cn Inc. All rights reserved. * @Copyright: ${DATE.YARE} www.freemud.cn Inc. All rights reserved.
* 注意:本内容仅限于上海非码科技内部传阅,禁止外泄以及用于其他的商业目 * 注意:本内容仅限于上海非码科技内部传阅,禁止外泄以及用于其他的商业目
*/ */
@Slf4j
@Service @Service
public class OrderAdapterServiceImpl implements OrderAdapterService { public class OrderAdapterServiceImpl implements OrderAdapterService {
private final String PAY_SUCCESS_KEY = "pay_success_key:";
private static Gson gson = new Gson();
@Autowired @Autowired
private EncircleOrderService encircleOrderService; private EncircleOrderService encircleOrderService;
@Autowired @Autowired
private Orderservice orderservice; private OrderServiceImpl orderService;
@Autowired @Autowired
private AssortmentCustomerInfoManager assortmentCustomerInfoManager; private AssortmentCustomerInfoManager assortmentCustomerInfoManager;
@Autowired @Autowired
private MallOrderService mallOrderService; private MallOrderService mallOrderService;
@Autowired @Autowired
private AppOrderService appOrderService; private AppOrderService appOrderService;
@Autowired
private RedisCache redisCache;
@Autowired
private OrderAdapter orderAdapter;
@Autowired
private OrderCommonService orderCommonService;
@Override @Override
public BaseResponse createOrderNew(CreateOrderVo createOrderVo) { public BaseResponse createOrderNew(CreateOrderVo createOrderVo) {
...@@ -95,7 +118,7 @@ public class OrderAdapterServiceImpl implements OrderAdapterService { ...@@ -95,7 +118,7 @@ public class OrderAdapterServiceImpl implements OrderAdapterService {
if(ObjectUtils.notEqual(baseResponse.getCode(),ResponseResult.SUCCESS.getCode())){ if(ObjectUtils.notEqual(baseResponse.getCode(),ResponseResult.SUCCESS.getCode())){
return baseResponse; return baseResponse;
} }
return orderservice.createOrderNew(createOrderVo); return orderService.createOrderNew(createOrderVo);
} }
@Override @Override
...@@ -110,6 +133,57 @@ public class OrderAdapterServiceImpl implements OrderAdapterService { ...@@ -110,6 +133,57 @@ public class OrderAdapterServiceImpl implements OrderAdapterService {
throw new UnsupportedOperationException("暂不支持渠道:"+assortmentCustomerInfoVo.getChannel()); throw new UnsupportedOperationException("暂不支持渠道:"+assortmentCustomerInfoVo.getChannel());
} }
@Override
public String paySuccessCallback(PaysuccessNoticeMessage message) {
//添加分布式锁,如果没有取得锁直接返回失败;整个方法执行完毕后会删掉该锁
String paySuccessKey = PAY_SUCCESS_KEY + message.getTrans_id();
if(!LockUtils.lockAfter(redisCache.getRedisTemplate(), paySuccessKey)){
return orderAdapter.newSendPayFaileMessage();
}
try {
ConfirmOrderDto confirmOrderDto = orderAdapter.convent2ConfirmOrderDto(message);
// 通过交易号从缓存中拿订单号,如果有数据则实际订单号为其value值
String orderId = redisCache.getValue(RedisUtil.getPaymentTransIdOrderKey(confirmOrderDto.getOrderId()));
if (StringUtils.isNotBlank(orderId)) {
log.info("从缓存中获取的订单数据,trackingNo:{},transId:{},orderId:{}", LogTreadLocal.getTrackingNo(), confirmOrderDto.getOrderId(), orderId);
confirmOrderDto.setOrderId(orderId);
}
Map<String, QueryOrdersResponseDto.DataBean.OrderBean> orderBeans = orderService.getOrderBeanByOrderId(confirmOrderDto.getOrderId());
if (MapUtils.isEmpty(orderBeans)) {
log.error("paySuccessCallback_queryOrderById_faild, trackingNo:{},PaysuccessNoticeMessage:{}", LogTreadLocal.getTrackingNo(), gson.toJson(message));
return gson.toJson(message);
}
QueryOrdersResponseDto.DataBean.OrderBean orderBean = orderBeans.get(OrderBeanType.SAASORDER.getCode());
/**
* 围餐处理
*/
if ("meals".equals(orderBean.getSource())) {
return orderCommonService.paySuccessCallback(message, confirmOrderDto, orderBeans);
}
/**
* 微商城处理
*/
if(OrderSourceType.SAASMALL.getCode().equals(orderBean.getSource())) {
return mallOrderService.paySuccessCallback(message, confirmOrderDto, orderBeans);
}
/**
* app订单处理
*/
if(OrderSourceType.APP.getCode().equals(orderBean.getSource())) {
return appOrderService.paySuccessCallback(message, confirmOrderDto, orderBeans);
}
/**
* 默认点餐处理
*/
return orderService.paySuccessCallback(message, confirmOrderDto, orderBeans);
} catch (Exception e) {
throw e;
} finally {
//删除分布式锁
redisCache.delete("saas:lockAfter:" + paySuccessKey);
}
}
/** /**
* APP下单,下单带商品信息,不经过购物车服务,不唤起支付 * APP下单,下单带商品信息,不经过购物车服务,不唤起支付
*/ */
......
...@@ -4,12 +4,16 @@ import cn.freemud.adapter.MessageNoticeAdapter; ...@@ -4,12 +4,16 @@ import cn.freemud.adapter.MessageNoticeAdapter;
import cn.freemud.adapter.OrderAdapter; import cn.freemud.adapter.OrderAdapter;
import cn.freemud.base.log.LogTreadLocal; 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.ResponseCodeConstant; import cn.freemud.constant.ResponseCodeConstant;
import cn.freemud.entities.dto.ConfirmOrderDto;
import cn.freemud.entities.dto.OrderExtInfoDto; import cn.freemud.entities.dto.OrderExtInfoDto;
import cn.freemud.entities.dto.QueryOrdersResponseDto;
import cn.freemud.entities.dto.ShoppingCartBaseResponse; import cn.freemud.entities.dto.ShoppingCartBaseResponse;
import cn.freemud.entities.dto.shoppingCart.NewShoppingCartClearDto; import cn.freemud.entities.dto.shoppingCart.NewShoppingCartClearDto;
import cn.freemud.entities.vo.CreateOrderResponseVo; import cn.freemud.entities.vo.CreateOrderResponseVo;
import cn.freemud.entities.vo.PaysuccessNoticeMessage; import cn.freemud.entities.vo.PaysuccessNoticeMessage;
import cn.freemud.enums.OrderBeanType;
import cn.freemud.enums.PayStatus; import cn.freemud.enums.PayStatus;
import cn.freemud.enums.RedisCacheEnum; import cn.freemud.enums.RedisCacheEnum;
import cn.freemud.enums.ResponseResult; import cn.freemud.enums.ResponseResult;
...@@ -18,6 +22,7 @@ import cn.freemud.redis.RedisCache; ...@@ -18,6 +22,7 @@ import cn.freemud.redis.RedisCache;
import cn.freemud.service.thirdparty.ShoppingCartClient; import cn.freemud.service.thirdparty.ShoppingCartClient;
import cn.freemud.utils.DateTimeUtil; import cn.freemud.utils.DateTimeUtil;
import cn.freemud.utils.LogUtil; import cn.freemud.utils.LogUtil;
import cn.freemud.utils.RedisUtil;
import cn.freemud.utils.ValidationCode; import cn.freemud.utils.ValidationCode;
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
...@@ -52,6 +57,7 @@ import org.springframework.beans.factory.annotation.Value; ...@@ -52,6 +57,7 @@ import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.sql.Time;
import java.text.MessageFormat; import java.text.MessageFormat;
import java.util.Date; import java.util.Date;
import java.util.Map; import java.util.Map;
...@@ -92,6 +98,8 @@ public class OrderCommonService { ...@@ -92,6 +98,8 @@ public class OrderCommonService {
private MessageNoticeAdapter messageNoticeAdapter; private MessageNoticeAdapter messageNoticeAdapter;
@Autowired @Autowired
private MessageCenterClient messageNoticeClient; private MessageCenterClient messageNoticeClient;
@Autowired
private RedisService redisService;
private final Integer RESPONSE_SUCCESS_CODE = 100; private final Integer RESPONSE_SUCCESS_CODE = 100;
/** /**
...@@ -111,10 +119,8 @@ public class OrderCommonService { ...@@ -111,10 +119,8 @@ public class OrderCommonService {
OrderExtInfoDto orderExtInfoDto = JSONObject.parseObject(orderBean.getExtInfo(), OrderExtInfoDto.class) == null ? new OrderExtInfoDto() : JSONObject.parseObject(orderBean.getExtInfo(), OrderExtInfoDto.class); OrderExtInfoDto orderExtInfoDto = JSONObject.parseObject(orderBean.getExtInfo(), OrderExtInfoDto.class) == null ? new OrderExtInfoDto() : JSONObject.parseObject(orderBean.getExtInfo(), OrderExtInfoDto.class);
if(orderBean.getAmount() > 0){ if(orderBean.getAmount() > 0){
try { try {
UnifiedOrderRequest request = orderAdapter.convent2UnifiedOrderRequest(orderBean, paymentRequest, orderBean.getAmount(), cardAmount); String transId = orderBean.getOid() + redisService.increment(RedisUtil.getPaymentTransIdSequenceKey(orderBean.getOid()), 1L, TimeUnit.DAYS);
Long increment = redisCache.opsForValue().increment( UnifiedOrderRequest request = orderAdapter.convent2UnifiedOrderRequest(orderBean, paymentRequest, orderBean.getAmount(), cardAmount, transId);
MessageFormat.format(RedisCacheEnum.ORDER_CREATE_TRANS_ID_KEY.getCode(), orderBean.getCompanyId(), orderBean.getShopId(), orderBean.getBarCounter(), orderBean.getOid()), 1);
request.setTransId(orderBean.getOid() + increment);
if(SDKCommonBaseContextWare.getProfile().equals(SDKCommonBaseContextWare.profiles.DEFAULT.getProfile()) if(SDKCommonBaseContextWare.getProfile().equals(SDKCommonBaseContextWare.profiles.DEFAULT.getProfile())
|| SDKCommonBaseContextWare.getProfile().equals(SDKCommonBaseContextWare.profiles.DEV.getProfile()) || SDKCommonBaseContextWare.getProfile().equals(SDKCommonBaseContextWare.profiles.DEV.getProfile())
...@@ -122,7 +128,7 @@ public class OrderCommonService { ...@@ -122,7 +128,7 @@ public class OrderCommonService {
request.setAmount(1L); request.setAmount(1L);
} }
ApiLog.info("支付transId :{},payRequest:{}",request.getTransId(),JSON.toJSONString(request)); ApiLog.info("支付transId :{},payRequest:{}",request.getTransId(),JSON.toJSONString(request));
redisCache.save(RedisCacheEnum.ORDER_CACHE_WEICAN_TRANSID_INFO.getCode()+request.getTransId(),orderBean.getOid(),1L,TimeUnit.DAYS); redisService.savePaymentTransIdOrder(RedisUtil.getPaymentTransIdOrderKey(transId), orderBean.getOid(), 1L, TimeUnit.DAYS);
com.freemud.application.sdk.api.base.BaseResponse<UnifiedOrderResponse> responseBase = standardPaymentService.unifiedOrder(request, LogThreadLocal.getTrackingNo()); com.freemud.application.sdk.api.base.BaseResponse<UnifiedOrderResponse> responseBase = standardPaymentService.unifiedOrder(request, LogThreadLocal.getTrackingNo());
if (!ResponseCodeConstant.RESPONSE_SUCCESS_STR.equals(responseBase.getCode())) { if (!ResponseCodeConstant.RESPONSE_SUCCESS_STR.equals(responseBase.getCode())) {
return null; return null;
...@@ -219,15 +225,9 @@ public class OrderCommonService { ...@@ -219,15 +225,9 @@ public class OrderCommonService {
* @param message * @param message
* @return * @return
*/ */
public String paySuccessCallback(PaysuccessNoticeMessage message){ public String paySuccessCallback(PaysuccessNoticeMessage message, ConfirmOrderDto confirmOrderDto, Map<String, QueryOrdersResponseDto.DataBean.OrderBean> orderBeans) {
//拉取订单详细信息 QueryOrdersResponseDto.DataBean.OrderBean orderBean = orderBeans.get(OrderBeanType.SAASORDER.getCode());
BaseQueryOrderRequest baseQueryOrderRequest = new BaseQueryOrderRequest(); OrderExtInfoDto extInfo = JSONObject.parseObject(orderBean.getExtInfo(), OrderExtInfoDto.class);
baseQueryOrderRequest.setOrderId(message.getTrans_id());
baseQueryOrderRequest.setTrackingNo(LogTreadLocal.getTrackingNo());
QueryOrderByIdResponse queryOrderByIdResponse = orderCenterSdkService.queryOrderById(baseQueryOrderRequest);
OrderExtInfoDto extInfo = JSONObject.parseObject(queryOrderByIdResponse.getData().getExtInfo(), OrderExtInfoDto.class);
//判断订单支付状态 订单已支付则发起退款
QueryOrdersResponse.DataBean.OrderBean orderBean = queryOrderByIdResponse.getData();
if(PayStatus.HAVE_PAID.getCode().equals(orderBean.getPayStatus()) && ObjectUtils.equals(1,orderBean.getPayType())){ if(PayStatus.HAVE_PAID.getCode().equals(orderBean.getPayStatus()) && ObjectUtils.equals(1,orderBean.getPayType())){
//发起退款 本期不考虑 极端情况 //发起退款 本期不考虑 极端情况
} }
...@@ -272,8 +272,14 @@ public class OrderCommonService { ...@@ -272,8 +272,14 @@ public class OrderCommonService {
LogUtil.error("paySuccessCallback_payAccess_faild", JSON.toJSONString(message), JSON.toJSONString(groupOrderResponse)); LogUtil.error("paySuccessCallback_payAccess_faild", JSON.toJSONString(message), JSON.toJSONString(groupOrderResponse));
return this.newSendPayFaileMessage(); return this.newSendPayFaileMessage();
} }
redisCache.delete(MessageFormat.format(RedisCacheEnum.ORDER_CREATE_TRANS_ID_KEY.getCode(), orderBean.getCompanyId(), orderBean.getShopId(), orderBean.getBarCounter(), orderBean.getOid())); // 删除订单自增缓存
redisCache.delete(RedisUtil.getPaymentTransIdSequenceKey(orderBean.getOid()));
// 删除支付交易号订单关系缓存
redisCache.delete(RedisUtil.getPaymentTransIdOrderKey(message.getTrans_id()));
this.sendPosMessage(orderBean.getCompanyId(),orderBean.getShopId(),orderBean.getOid()); this.sendPosMessage(orderBean.getCompanyId(),orderBean.getShopId(),orderBean.getOid());
//支付回掉成功标记
redisCache.save(RedisKeyConstant.KGD_PAYMENT_CALLBACK_FMID + message.getOut_trade_no(), message.getOut_trade_no(), 10L, TimeUnit.MINUTES);
//返回调用结果 //返回调用结果
return this.newSendPaySuccessNoticeMessage(); return this.newSendPaySuccessNoticeMessage();
} }
......
...@@ -45,8 +45,8 @@ import cn.freemud.interceptor.ServiceException; ...@@ -45,8 +45,8 @@ import cn.freemud.interceptor.ServiceException;
import cn.freemud.redis.RedisCache; import cn.freemud.redis.RedisCache;
import cn.freemud.service.BuriedPointService; import cn.freemud.service.BuriedPointService;
import cn.freemud.service.CouponActivityService; import cn.freemud.service.CouponActivityService;
import cn.freemud.service.OrderAdapterService;
import cn.freemud.service.Orderservice; import cn.freemud.service.Orderservice;
import cn.freemud.service.process.WechatPush.WechatPushProcessor;
import cn.freemud.service.thirdparty.*; import cn.freemud.service.thirdparty.*;
import cn.freemud.utils.*; import cn.freemud.utils.*;
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSON;
...@@ -134,8 +134,6 @@ public class OrderServiceImpl implements Orderservice { ...@@ -134,8 +134,6 @@ public class OrderServiceImpl implements Orderservice {
private final Integer RESPONSE_SUCCESS_CODE = 100; private final Integer RESPONSE_SUCCESS_CODE = 100;
private final String PAY_SUCCESS_KEY="pay_success_key:";
private static Gson gson = new Gson(); private static Gson gson = new Gson();
@Value("${saas.reverseNotifyiDcUrl}") @Value("${saas.reverseNotifyiDcUrl}")
...@@ -220,7 +218,8 @@ public class OrderServiceImpl implements Orderservice { ...@@ -220,7 +218,8 @@ public class OrderServiceImpl implements Orderservice {
private MallOrderServiceImpl mallOrderService; private MallOrderServiceImpl mallOrderService;
@Autowired @Autowired
private CacheOpenPlatformPartnerWxappConfigManager cacheOpenPlatformPartnerWxappConfigManager; private CacheOpenPlatformPartnerWxappConfigManager cacheOpenPlatformPartnerWxappConfigManager;
@Autowired
private OrderAdapterService orderAdapterService;
@Override @Override
public BaseResponse checkBeforeCreateOrder(CheckBeforeCreateOrderRequestVo requestVo) { public BaseResponse checkBeforeCreateOrder(CheckBeforeCreateOrderRequestVo requestVo) {
...@@ -334,33 +333,8 @@ public class OrderServiceImpl implements Orderservice { ...@@ -334,33 +333,8 @@ public class OrderServiceImpl implements Orderservice {
} }
@Override @Override
public String paySuccessCallback(PaysuccessNoticeMessage message) { public String paySuccessCallback(PaysuccessNoticeMessage message, ConfirmOrderDto confirmOrderDto, Map<String, QueryOrdersResponseDto.DataBean.OrderBean> orderBeans) {
//添加分布式锁,如果没有取得锁直接返回失败;整个方法执行完毕后会删掉该锁
if(!LockUtils.lockAfter(redisCache.getRedisTemplate(),PAY_SUCCESS_KEY+message.getTrans_id())){
return newSendPayFaileMessage();
}
ConfirmOrderDto confirmOrderDto = orderAdapter.convent2ConfirmOrderDto(message);
//首先判断当前订单号是否为围餐,围餐则需要截取掉订单最后一位数字
String orderId = redisCache.getValue(RedisCacheEnum.ORDER_CACHE_WEICAN_TRANSID_INFO.getCode() + confirmOrderDto.getOrderId());
if (StringUtils.isNotBlank(orderId)) {
confirmOrderDto.setOrderId(orderId);
ApiLog.info("围餐订单回调==>orderId:{},transId:{}", confirmOrderDto.getOrderId(), orderId);
}
Map<String, OrderBean> orderBeans = getOrderBeanByOrderId(confirmOrderDto.getOrderId());
if (MapUtils.isEmpty(orderBeans)) {
ErrorLog.printErrorLog("paySuccessCallback_queryOrderById_faild", "paySuccessCallback", message, new Exception());
return gson.toJson(message);
}
OrderBean orderBean = orderBeans.get(OrderBeanType.SAASORDER.getCode()); OrderBean orderBean = orderBeans.get(OrderBeanType.SAASORDER.getCode());
if ("meals".equals(orderBean.getSource())) { //围餐
message.setTrans_id(confirmOrderDto.getOrderId());
return orderCommonService.paySuccessCallback(message);
}
// 商城订单处理
if(OrderSourceType.SAASMALL.getCode().equals(orderBean.getSource())) {
return mallOrderService.paySuccessCallback(message, confirmOrderDto, orderBeans);
}
String oid = StringUtils.isNotEmpty(orderBean.getParentCode()) && !"0".equals(orderBean.getParentCode()) ? orderBean.getParentCode() : orderBean.getOid(); String oid = StringUtils.isNotEmpty(orderBean.getParentCode()) && !"0".equals(orderBean.getParentCode()) ? orderBean.getParentCode() : orderBean.getOid();
String partnerId = orderBean.getCompanyId(); String partnerId = orderBean.getCompanyId();
String userId = orderBean.getUserId(); String userId = orderBean.getUserId();
...@@ -471,25 +445,16 @@ public class OrderServiceImpl implements Orderservice { ...@@ -471,25 +445,16 @@ public class OrderServiceImpl implements Orderservice {
requestDto.setOpenId(orderExtInfoDto != null ? orderExtInfoDto.getOpenid() : ""); requestDto.setOpenId(orderExtInfoDto != null ? orderExtInfoDto.getOpenid() : "");
buriedPointService.BuriedPointPayment(requestDto, orderBean); buriedPointService.BuriedPointPayment(requestDto, orderBean);
// 推荐优惠插件用户支付完成数据上报
// if (message.getTotal_fee() != 0) {
// orderBean.setStatus(OrderStatus.TAKE_ORDER.getCode());
// wechatPushProcessor.statusOrderPay(orderBean, sessionId, message.getPaid_no(), message.getOut_trade_no()
// , message.getEndTransId(), message.getPlatformMchId(), message.getTerminalId());
// }
// 开通会员卡 // 开通会员卡
if (StringUtils.isNotBlank(ruleId)) { if (StringUtils.isNotBlank(ruleId)) {
this.activateMemberCard(partnerId, ruleId, oid, userId); this.activateMemberCard(partnerId, ruleId, oid, userId);
} }
//支付回掉成功标记 //支付回掉成功标记
redisCache.save(RedisKeyConstant.KGD_PAYMENT_CALLBACK_FMID + message.getOut_trade_no(), message.getOut_trade_no(), 10L, TimeUnit.MINUTES); redisCache.save(RedisKeyConstant.KGD_PAYMENT_CALLBACK_FMID + message.getOut_trade_no(), message.getOut_trade_no(), 10L, TimeUnit.MINUTES);
//删除分布式锁
redisCache.delete("saas:lockAfter:"+PAY_SUCCESS_KEY+message.getTrans_id());
return sendPaySuccessNoticeMessage(); return sendPaySuccessNoticeMessage();
} }
private Map<String, OrderBean> getOrderBeanByOrderId(String orderId) { public Map<String, OrderBean> getOrderBeanByOrderId(String orderId) {
// 订单查询:若结果集只有一个orderBean,则为普通订单,否则为会员卡订单(父子订单) // 订单查询:若结果集只有一个orderBean,则为普通订单,否则为会员卡订单(父子订单)
Map<String, OrderBean> result = new HashMap<>(); Map<String, OrderBean> result = new HashMap<>();
QueryRelationOrderByIdResponseDto queryOrderByIdResponseDto = getQueryRelationOrderByIdResponseDto(orderId); QueryRelationOrderByIdResponseDto queryOrderByIdResponseDto = getQueryRelationOrderByIdResponseDto(orderId);
...@@ -554,7 +519,7 @@ public class OrderServiceImpl implements Orderservice { ...@@ -554,7 +519,7 @@ public class OrderServiceImpl implements Orderservice {
message.setPlatformMchId(newMessage.getPlatformMchId()); message.setPlatformMchId(newMessage.getPlatformMchId());
message.setTerminalId(newMessage.getAppId()); message.setTerminalId(newMessage.getAppId());
message.setRuleId(newMessage.getRuleId()); message.setRuleId(newMessage.getRuleId());
String res = paySuccessCallback(message); String res = orderAdapterService.paySuccessCallback(message);
JSONObject jsonObject = JSONObject.parseObject(res); JSONObject jsonObject = JSONObject.parseObject(res);
if (jsonObject.containsKey("code")) { if (jsonObject.containsKey("code")) {
Integer code = (Integer) jsonObject.get("code"); Integer code = (Integer) jsonObject.get("code");
...@@ -1825,13 +1790,14 @@ public class OrderServiceImpl implements Orderservice { ...@@ -1825,13 +1790,14 @@ public class OrderServiceImpl implements Orderservice {
PaymentRequest paymentRequest = orderBodyConvertToPaymentBody(createPrepayRequestDto.getOpenId(), createPrepayRequestDto.getPartnerId(), createPrepayRequestDto.getWxAppId(), createPrepayRequestDto.getPayCode()); PaymentRequest paymentRequest = orderBodyConvertToPaymentBody(createPrepayRequestDto.getOpenId(), createPrepayRequestDto.getPartnerId(), createPrepayRequestDto.getWxAppId(), createPrepayRequestDto.getPayCode());
long totalAmount = createPrepayRequestDto.getTotalAmount(); long totalAmount = createPrepayRequestDto.getTotalAmount();
String cardCode = createPrepayRequestDto.getCardCode(); String cardCode = createPrepayRequestDto.getCardCode();
String transId = createPrepayRequestDto.getTransId();
if (totalAmount < 0) { if (totalAmount < 0) {
throw new ServiceException(ResponseResult.PAY_AMOUNT_ERROR); throw new ServiceException(ResponseResult.PAY_AMOUNT_ERROR);
} else if (totalAmount > 0 && StringUtils.isBlank(cardCode)) { } else if (totalAmount > 0 && StringUtils.isBlank(cardCode)) {
orderPayResponse = getPreOrderPay(createPrepayRequestDto.getFatherOrderBean(), paymentRequest, LogThreadLocal.getTrackingNo(), createPrepayRequestDto.getCardAmount()); orderPayResponse = getPreOrderPay(createPrepayRequestDto.getFatherOrderBean(), paymentRequest, LogThreadLocal.getTrackingNo(), createPrepayRequestDto.getCardAmount(), transId);
} else if (totalAmount > 0 && StringUtils.isNotBlank(cardCode)) { } else if (totalAmount > 0 && StringUtils.isNotBlank(cardCode)) {
//svc卡支付 //svc卡支付
orderPayResponse = svcPay(cardCode, createPrepayRequestDto.getFatherOrderBean(), paymentRequest, LogThreadLocal.getTrackingNo()); orderPayResponse = svcPay(cardCode, createPrepayRequestDto.getFatherOrderBean(), paymentRequest, transId, LogThreadLocal.getTrackingNo());
} else { } else {
// 0元订单如果不需要支付,自定义支付单号 // 0元订单如果不需要支付,自定义支付单号
orderPayResponse = getOrderPayResponse(paymentRequest, createPrepayRequestDto.getFatherOrderBean()); orderPayResponse = getOrderPayResponse(paymentRequest, createPrepayRequestDto.getFatherOrderBean());
...@@ -1863,7 +1829,7 @@ public class OrderServiceImpl implements Orderservice { ...@@ -1863,7 +1829,7 @@ public class OrderServiceImpl implements Orderservice {
message.setOpenid(createPrepayRequestDto.getOpenId()); message.setOpenid(createPrepayRequestDto.getOpenId());
message.setPlatform_coupon(0); message.setPlatform_coupon(0);
message.setMerchant_coupon(0); message.setMerchant_coupon(0);
this.paySuccessCallback(message); orderAdapterService.paySuccessCallback(message);
return ResponseUtil.success(createOrderResponse); return ResponseUtil.success(createOrderResponse);
} }
} }
...@@ -1925,9 +1891,9 @@ public class OrderServiceImpl implements Orderservice { ...@@ -1925,9 +1891,9 @@ public class OrderServiceImpl implements Orderservice {
return ResponseUtil.error(ResponseResultEnum.PAY_UNIFIED_ORDER_ERROR.getCode(), ResponseResultEnum.PAY_UNIFIED_ORDER_ERROR.getMessage(), null); return ResponseUtil.error(ResponseResultEnum.PAY_UNIFIED_ORDER_ERROR.getCode(), ResponseResultEnum.PAY_UNIFIED_ORDER_ERROR.getMessage(), null);
} }
public OrderPayResponse getPreOrderPay(QueryOrdersResponse.DataBean.OrderBean orderBean, PaymentRequest paymentRequest, String trackingNo, Integer cardAmount) { public OrderPayResponse getPreOrderPay(QueryOrdersResponse.DataBean.OrderBean orderBean, PaymentRequest paymentRequest, String trackingNo, Integer cardAmount, String transId) {
try { try {
UnifiedOrderRequest request = orderAdapter.convent2UnifiedOrderRequest(orderBean, paymentRequest, orderBean.getAmount(), cardAmount); UnifiedOrderRequest request = orderAdapter.convent2UnifiedOrderRequest(orderBean, paymentRequest, orderBean.getAmount(), cardAmount, transId);
com.freemud.application.sdk.api.base.BaseResponse<UnifiedOrderResponse> responseBase = standardPaymentService.unifiedOrder(request, trackingNo); com.freemud.application.sdk.api.base.BaseResponse<UnifiedOrderResponse> responseBase = standardPaymentService.unifiedOrder(request, trackingNo);
if (!ResponseCodeConstant.RESPONSE_SUCCESS_STR.equals(responseBase.getCode())) { if (!ResponseCodeConstant.RESPONSE_SUCCESS_STR.equals(responseBase.getCode())) {
log.error("支付SDK返回信息错误,trackingNo:{} request:{} response:{}", trackingNo, JSONObject.toJSONString(request), JSONObject.toJSONString(responseBase)); log.error("支付SDK返回信息错误,trackingNo:{} request:{} response:{}", trackingNo, JSONObject.toJSONString(request), JSONObject.toJSONString(responseBase));
...@@ -1947,7 +1913,7 @@ public class OrderServiceImpl implements Orderservice { ...@@ -1947,7 +1913,7 @@ public class OrderServiceImpl implements Orderservice {
} }
} }
public OrderPayResponse svcPay(String cardCode, QueryOrdersResponse.DataBean.OrderBean orderBean, PaymentRequest paymentRequest, String trackingNo) { public OrderPayResponse svcPay(String cardCode, QueryOrdersResponse.DataBean.OrderBean orderBean, PaymentRequest paymentRequest, String transId, String trackingNo) {
CodePayRequest request = new CodePayRequest(); CodePayRequest request = new CodePayRequest();
String partnerId = orderBean.getCompanyId(); String partnerId = orderBean.getCompanyId();
request.setBody(orderBean.getShopName()); request.setBody(orderBean.getShopName());
...@@ -1957,7 +1923,7 @@ public class OrderServiceImpl implements Orderservice { ...@@ -1957,7 +1923,7 @@ public class OrderServiceImpl implements Orderservice {
request.setStoreId(orderBean.getShopId()); request.setStoreId(orderBean.getShopId());
// request.setStoreId("10086"); // request.setStoreId("10086");
request.setAmount(orderBean.getAmount()); request.setAmount(orderBean.getAmount());
request.setTransId(orderBean.getOid()); request.setTransId(transId);
request.setStationId("1"); request.setStationId("1");
request.setOperatorId("1"); request.setOperatorId("1");
request.setVer("2"); request.setVer("2");
...@@ -2287,7 +2253,7 @@ public class OrderServiceImpl implements Orderservice { ...@@ -2287,7 +2253,7 @@ public class OrderServiceImpl implements Orderservice {
message.setPlatform_coupon(0); message.setPlatform_coupon(0);
message.setMerchant_coupon(0); message.setMerchant_coupon(0);
//0元订单内部调支付成功 //0元订单内部调支付成功
this.paySuccessCallback(message); orderAdapterService.paySuccessCallback(message);
return ResponseUtil.success(createOrderResponse); return ResponseUtil.success(createOrderResponse);
} }
} }
...@@ -2383,13 +2349,13 @@ public class OrderServiceImpl implements Orderservice { ...@@ -2383,13 +2349,13 @@ public class OrderServiceImpl implements Orderservice {
} }
//唤起微信支付 //唤起微信支付
if (totalAmount > 0 && StringUtils.isBlank(createOrderVo.getCardCode()) && StringUtils.isBlank(createOrderVo.getFaceCode())) { if (totalAmount > 0 && StringUtils.isBlank(createOrderVo.getCardCode()) && StringUtils.isBlank(createOrderVo.getFaceCode())) {
orderPayResponse = getPreOrderPay(fatherBeanListOne, paymentRequest, LogThreadLocal.getTrackingNo(), cardAmount); orderPayResponse = getPreOrderPay(fatherBeanListOne, paymentRequest, LogThreadLocal.getTrackingNo(), cardAmount, fatherBeanListOne.getOid());
return orderPayResponse; return orderPayResponse;
} }
//储值卡支付 //储值卡支付
if (totalAmount > 0 && StringUtils.isNotBlank(createOrderVo.getCardCode())) { if (totalAmount > 0 && StringUtils.isNotBlank(createOrderVo.getCardCode())) {
//svc卡支付 //svc卡支付
orderPayResponse = svcPay(createOrderVo.getCardCode(), fatherBeanListOne, paymentRequest, LogThreadLocal.getTrackingNo()); orderPayResponse = svcPay(createOrderVo.getCardCode(), fatherBeanListOne, paymentRequest, fatherBeanListOne.getOid(), LogThreadLocal.getTrackingNo());
return orderPayResponse; return orderPayResponse;
} }
//扫脸支付 //扫脸支付
......
package cn.freemud.service.impl;
import cn.freemud.enums.RedisCacheEnum;
import cn.freemud.redis.RedisCache;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.concurrent.TimeUnit;
@Service
public class RedisService {
@Autowired
private RedisCache redisCache;
/**
* 指定的key值自增,并指定缓存过期时间
*/
public Long increment(String key, long expire, TimeUnit timeUnit) {
Long increment = redisCache.opsForValue().increment(key, 1);
redisCache.updateTTL(key, expire, timeUnit);
return increment;
}
/**
* 保存支付交易好订单关系,并指定缓存过期时间
*/
public void savePaymentTransIdOrder(String key, String orderId, long expire, TimeUnit timeUnit) {
redisCache.save(key, orderId, expire, timeUnit);
}
}
package cn.freemud.utils; package cn.freemud.utils;
import cn.freemud.enums.RedisCacheEnum;
import java.text.MessageFormat;
public class RedisUtil { public class RedisUtil {
private final static String BASE_URL = "micro_program:"; private final static String BASE_URL = "micro_program:";
private final static String ENTER_SHOP_KEY = BASE_URL + "ENTER_SHOP_KEY_"; private final static String ENTER_SHOP_KEY = BASE_URL + "ENTER_SHOP_KEY_";
...@@ -17,4 +21,18 @@ public class RedisUtil { ...@@ -17,4 +21,18 @@ public class RedisUtil {
public static String getCouponAppSecret(String partnerId) { public static String getCouponAppSecret(String partnerId) {
return COUPON_APP_SECRET + partnerId; return COUPON_APP_SECRET + partnerId;
} }
/**
* 获取订单支付交易请求序列
*/
public static String getPaymentTransIdSequenceKey(String orderId) {
return MessageFormat.format(RedisCacheEnum.PAYMENT_TRANSID_SEQUENCE_KEY.getCode(), orderId);
}
/**
* 获取交易订单key
*/
public static String getPaymentTransIdOrderKey(String transId){
return MessageFormat.format(RedisCacheEnum.PAYMENT_TRANSID_ORDER_KEY.getCode(), transId);
}
} }
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