Commit ca7bdebc by 胡超

Merge remote-tracking branch 'origin/master'

parents 784159bf 87b6f7ba
......@@ -38,7 +38,6 @@ import cn.freemud.request.wechat.dto.SignMessageBuilder;
import cn.freemud.service.impl.OrderCommonService;
import cn.freemud.utils.*;
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.enums.IappIdType;
import com.freemud.application.sdk.api.log.LogThreadLocal;
......@@ -73,7 +72,6 @@ import org.springframework.stereotype.Component;
import java.awt.geom.Point2D;
import java.math.BigDecimal;
import java.net.URL;
import java.security.NoSuchAlgorithmException;
import java.security.spec.InvalidKeySpecException;
import java.text.DecimalFormat;
......@@ -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();
orderPayDto.setPartnerId(orderBean.getCompanyId());
orderPayDto.setBody(paymentRequest.getPrincipalName());
orderPayDto.setNotifyUrl(paymentRequest.getReverseNotifyiDcUrl());
orderPayDto.setStoreId(orderBean.getShopId());
orderPayDto.setTransId(orderBean.getOid());
orderPayDto.setTransId(transId);
orderPayDto.setOpenId(paymentRequest.getOpenId());
String businessDate = com.freemud.application.sdk.api.util.DateUtil.convert2String(new Date(), "yyyyMMdd");
orderPayDto.setBusinessDate(businessDate);
......@@ -2786,7 +2784,8 @@ public class OrderAdapter {
public CreatePrepayRequestDto convertToCreatePrepayRequestDto(String partnerId, String wxAppId, String openId,
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();
requestDto.setPartnerId(partnerId);
requestDto.setWxAppId(wxAppId);
......@@ -2799,6 +2798,7 @@ public class OrderAdapter {
requestDto.setTotalAmount(totalAmount);
requestDto.setCardAmount(cardAmount);
requestDto.setOrderExtInfoDTO(orderExtInfoDTO);
requestDto.setTransId(transId);
return requestDto;
}
......@@ -2808,7 +2808,28 @@ public class OrderAdapter {
createOrderVo.getFaceCode(), createOrderVo.getCardCode(), null,
createOrderOperateDto.getFatherOrderBean(), createOrderOperateDto.getProductOrderBean(),
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) {
......
......@@ -99,7 +99,7 @@ public class OrderController {
@ApiAnnotation(logMessage = "paySuccessCallback")
@PostMapping("/paySuccessCallback")
public String paySuccessCallback(@LogParams @RequestBody PaysuccessNoticeMessage message) {
return orderservice.paySuccessCallback(message);
return orderAdapterService.paySuccessCallback(message);
}
/**
......
......@@ -6,15 +6,52 @@ import lombok.Data;
@Data
public class CreatePrepayRequestDto {
/**
* 商户id
*/
private String partnerId;
/**
* appid
*/
private String wxAppId;
/**
* 用户openId
*/
private String openId;
/**
* 人脸识别码code
*/
private String faceCode;
/**
* 会员卡code
*/
private String cardCode;
/**
* 支付渠道码
*/
private String payCode;
/**
* 父订单,如果不存在,则值与productOrderBean一致
*/
private QueryOrdersResponse.DataBean.OrderBean fatherOrderBean;
/**
* 商品订单
*/
private QueryOrdersResponse.DataBean.OrderBean productOrderBean;
/**
* 总金额
*/
private long totalAmount;
/**
* 会员卡支付金额
*/
private int cardAmount;
/**
* 订单扩展信息
*/
private OrderExtInfoDTO orderExtInfoDTO;
/**
* 交易请求号
*/
private String transId;
}
......@@ -23,7 +23,12 @@ public enum RedisCacheEnum {
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_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 desc;
......
......@@ -5,6 +5,11 @@ import cn.freemud.entities.vo.AppCreateOrderVo;
import cn.freemud.entities.vo.CreateOrderVo;
import cn.freemud.entities.vo.CreatePrepayVo;
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订单服务
......@@ -25,4 +30,6 @@ public interface AppOrderService {
* APP下单,下单带商品信息,不经过购物车服务,不唤起支付
*/
BaseResponse createOrder(AppCreateOrderVo createOrderVo, AssortmentCustomerInfoVo customerInfo);
String paySuccessCallback(PaysuccessNoticeMessage message, ConfirmOrderDto confirmOrderDto, Map<String, QueryOrdersResponseDto.DataBean.OrderBean> orderBeans);
}
package cn.freemud.service;
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.OrderAffirmRequestVO;
import cn.freemud.entities.vo.PaysuccessNoticeMessage;
import cn.freemud.entities.vo.encircle.CreateReserveOrderVo;
import cn.freemud.entities.vo.encircle.EmptyTableNumberVo;
import cn.freemud.entities.vo.encircle.EncircleReserveBaseVo;
import java.util.Map;
/**
* 商城订单业务操作类
* @version V1.0
......@@ -28,4 +33,9 @@ public interface MallOrderService {
*/
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;
import cn.freemud.entities.vo.AppCreateOrderVo;
import cn.freemud.entities.vo.CreateOrderVo;
import cn.freemud.entities.vo.CreatePrepayVo;
import cn.freemud.entities.vo.PaysuccessNoticeMessage;
/**
* All rights Reserved, Designed By www.freemud.cn
......@@ -35,4 +36,9 @@ public interface OrderAdapterService {
*/
BaseResponse appCreateOrder(AppCreateOrderVo createOrderVo);
/**
* 支付回调处理
*/
String paySuccessCallback(PaysuccessNoticeMessage message);
}
package cn.freemud.service;
import cn.freemud.base.entity.BaseResponse;
import cn.freemud.entities.dto.ConfirmOrderDto;
import cn.freemud.entities.dto.QueryOrdersResponseDto;
import cn.freemud.entities.vo.*;
import com.freemud.sdk.api.assortment.order.enums.OrderSdkType;
import java.util.Map;
/**
* 订单服务
*
......@@ -25,9 +29,9 @@ public interface Orderservice {
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;
import cn.freemud.base.entity.BaseResponse;
import cn.freemud.base.log.LogTreadLocal;
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.CreatePrepayRequestDto;
import cn.freemud.entities.dto.shoppingCart.ActivityDiscountsDto;
import cn.freemud.entities.dto.shoppingCart.ShoppingCartGoodsDto;
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.ResponseResult;
import cn.freemud.enums.TradeState;
import cn.freemud.interceptor.ServiceException;
import cn.freemud.redis.RedisCache;
import cn.freemud.service.AppOrderService;
import cn.freemud.utils.BeanUtil;
import cn.freemud.utils.RedisUtil;
import cn.freemud.utils.ResponseUtil;
import com.alibaba.fastjson.JSONObject;
import com.freemud.api.assortment.datamanager.entity.vo.AssortmentCustomerInfoVo;
......@@ -52,6 +61,8 @@ import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
import java.util.Map;
import java.util.concurrent.TimeUnit;
@Service
public class AppOrderServiceImpl implements AppOrderService {
......@@ -66,6 +77,10 @@ public class AppOrderServiceImpl implements AppOrderService {
private OrderCenterSdkService orderCenterSdkService;
@Autowired
private PaymentNewService paymentNewService;
@Autowired
private RedisCache redisCache;
@Autowired
private RedisService redisService;
//门店SDK
@Autowired
......@@ -111,9 +126,11 @@ public class AppOrderServiceImpl implements AppOrderService {
extInfo.setOpenid(createPrepayVo.getOpenId());
String faceCode = "";
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,
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);
}
......@@ -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) {
if(!PayStatus.NOT_PAY.getCode().equals(orderBean.getPayStatus())){
throw new ServiceException(ResponseResult.ORDER_HAS_PAID);
......
......@@ -18,6 +18,7 @@ import cn.freemud.enums.*;
import cn.freemud.interceptor.ServiceException;
import cn.freemud.redis.RedisCache;
import cn.freemud.service.EncircleOrderService;
import cn.freemud.service.OrderAdapterService;
import cn.freemud.service.thirdparty.ShoppingCartClient;
import cn.freemud.service.thirdparty.StoreItemClient;
import cn.freemud.utils.AmountUtils;
......@@ -105,6 +106,9 @@ public class EncircleOrderServiceImpl implements EncircleOrderService {
private MealCacheManager mealCacheManager;
@Autowired
private ActivityCalculationDiscountService calculationDiscountService;
@Autowired
private OrderAdapterService orderAdapterService;
private final Integer RESPONSE_SUCCESS_CODE = 100;
......@@ -522,7 +526,7 @@ public class EncircleOrderServiceImpl implements EncircleOrderService {
message.setOpenid(assortmentCustomerInfoVo.getOpenId());
message.setPlatform_coupon(0);
message.setMerchant_coupon(0);
orderCommonService.paySuccessCallback(message);
orderAdapterService.paySuccessCallback(message);
}
}else{
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 {
public OrderPayResponse getPreOrderPay(QueryOrdersResponse.DataBean.OrderBean orderBean, PaymentRequest paymentRequest, String trackingNo, Integer cardAmount) {
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);
if (!ResponseCodeConstant.RESPONSE_SUCCESS_STR.equals(responseBase.getCode())) {
return null;
......@@ -392,11 +392,8 @@ public class MallOrderServiceImpl implements MallOrderService {
return this.paySuccessCallback(message, confirmOrderDto, orderBeans);
}
@Override
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());
String partnerId = orderBean.getCompanyId();
String userId = orderBean.getUserId();
......
package cn.freemud.service.impl;
import cn.freemud.adapter.OrderAdapter;
import cn.freemud.base.entity.BaseResponse;
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.CreatePrepayVo;
import cn.freemud.entities.vo.PaysuccessNoticeMessage;
import cn.freemud.entities.vo.encircle.CreateReserveOrderVo;
import cn.freemud.enums.OrderChannelType;
import cn.freemud.enums.ResponseResult;
import cn.freemud.enums.UserLoginChannelEnum;
import cn.freemud.enums.*;
import cn.freemud.interceptor.ServiceException;
import cn.freemud.redis.RedisCache;
import cn.freemud.service.*;
import cn.freemud.utils.RedisUtil;
import cn.freemud.utils.ResponseUtil;
import com.freemud.api.assortment.datamanager.entity.vo.AssortmentCustomerInfoVo;
import com.freemud.api.assortment.datamanager.enums.IappIdType;
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.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.Map;
/**
* All rights Reserved, Designed By www.freemud.cn
*
......@@ -30,19 +41,31 @@ import org.springframework.stereotype.Service;
* @Copyright: ${DATE.YARE} www.freemud.cn Inc. All rights reserved.
* 注意:本内容仅限于上海非码科技内部传阅,禁止外泄以及用于其他的商业目
*/
@Slf4j
@Service
public class OrderAdapterServiceImpl implements OrderAdapterService {
private final String PAY_SUCCESS_KEY = "pay_success_key:";
private static Gson gson = new Gson();
@Autowired
private EncircleOrderService encircleOrderService;
@Autowired
private Orderservice orderservice;
private OrderServiceImpl orderService;
@Autowired
private AssortmentCustomerInfoManager assortmentCustomerInfoManager;
@Autowired
private MallOrderService mallOrderService;
@Autowired
private AppOrderService appOrderService;
@Autowired
private RedisCache redisCache;
@Autowired
private OrderAdapter orderAdapter;
@Autowired
private OrderCommonService orderCommonService;
@Override
public BaseResponse createOrderNew(CreateOrderVo createOrderVo) {
......@@ -95,7 +118,7 @@ public class OrderAdapterServiceImpl implements OrderAdapterService {
if(ObjectUtils.notEqual(baseResponse.getCode(),ResponseResult.SUCCESS.getCode())){
return baseResponse;
}
return orderservice.createOrderNew(createOrderVo);
return orderService.createOrderNew(createOrderVo);
}
@Override
......@@ -110,6 +133,57 @@ public class OrderAdapterServiceImpl implements OrderAdapterService {
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下单,下单带商品信息,不经过购物车服务,不唤起支付
*/
......
......@@ -4,12 +4,16 @@ import cn.freemud.adapter.MessageNoticeAdapter;
import cn.freemud.adapter.OrderAdapter;
import cn.freemud.base.log.LogTreadLocal;
import cn.freemud.base.util.DateUtil;
import cn.freemud.constant.RedisKeyConstant;
import cn.freemud.constant.ResponseCodeConstant;
import cn.freemud.entities.dto.ConfirmOrderDto;
import cn.freemud.entities.dto.OrderExtInfoDto;
import cn.freemud.entities.dto.QueryOrdersResponseDto;
import cn.freemud.entities.dto.ShoppingCartBaseResponse;
import cn.freemud.entities.dto.shoppingCart.NewShoppingCartClearDto;
import cn.freemud.entities.vo.CreateOrderResponseVo;
import cn.freemud.entities.vo.PaysuccessNoticeMessage;
import cn.freemud.enums.OrderBeanType;
import cn.freemud.enums.PayStatus;
import cn.freemud.enums.RedisCacheEnum;
import cn.freemud.enums.ResponseResult;
......@@ -18,6 +22,7 @@ import cn.freemud.redis.RedisCache;
import cn.freemud.service.thirdparty.ShoppingCartClient;
import cn.freemud.utils.DateTimeUtil;
import cn.freemud.utils.LogUtil;
import cn.freemud.utils.RedisUtil;
import cn.freemud.utils.ValidationCode;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
......@@ -52,6 +57,7 @@ import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.sql.Time;
import java.text.MessageFormat;
import java.util.Date;
import java.util.Map;
......@@ -92,6 +98,8 @@ public class OrderCommonService {
private MessageNoticeAdapter messageNoticeAdapter;
@Autowired
private MessageCenterClient messageNoticeClient;
@Autowired
private RedisService redisService;
private final Integer RESPONSE_SUCCESS_CODE = 100;
/**
......@@ -111,10 +119,8 @@ public class OrderCommonService {
OrderExtInfoDto orderExtInfoDto = JSONObject.parseObject(orderBean.getExtInfo(), OrderExtInfoDto.class) == null ? new OrderExtInfoDto() : JSONObject.parseObject(orderBean.getExtInfo(), OrderExtInfoDto.class);
if(orderBean.getAmount() > 0){
try {
UnifiedOrderRequest request = orderAdapter.convent2UnifiedOrderRequest(orderBean, paymentRequest, orderBean.getAmount(), cardAmount);
Long increment = redisCache.opsForValue().increment(
MessageFormat.format(RedisCacheEnum.ORDER_CREATE_TRANS_ID_KEY.getCode(), orderBean.getCompanyId(), orderBean.getShopId(), orderBean.getBarCounter(), orderBean.getOid()), 1);
request.setTransId(orderBean.getOid() + increment);
String transId = orderBean.getOid() + redisService.increment(RedisUtil.getPaymentTransIdSequenceKey(orderBean.getOid()), 1L, TimeUnit.DAYS);
UnifiedOrderRequest request = orderAdapter.convent2UnifiedOrderRequest(orderBean, paymentRequest, orderBean.getAmount(), cardAmount, transId);
if(SDKCommonBaseContextWare.getProfile().equals(SDKCommonBaseContextWare.profiles.DEFAULT.getProfile())
|| SDKCommonBaseContextWare.getProfile().equals(SDKCommonBaseContextWare.profiles.DEV.getProfile())
......@@ -122,7 +128,7 @@ public class OrderCommonService {
request.setAmount(1L);
}
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());
if (!ResponseCodeConstant.RESPONSE_SUCCESS_STR.equals(responseBase.getCode())) {
return null;
......@@ -219,15 +225,9 @@ public class OrderCommonService {
* @param message
* @return
*/
public String paySuccessCallback(PaysuccessNoticeMessage message){
//拉取订单详细信息
BaseQueryOrderRequest baseQueryOrderRequest = new BaseQueryOrderRequest();
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();
public String paySuccessCallback(PaysuccessNoticeMessage message, ConfirmOrderDto confirmOrderDto, Map<String, QueryOrdersResponseDto.DataBean.OrderBean> orderBeans) {
QueryOrdersResponseDto.DataBean.OrderBean orderBean = orderBeans.get(OrderBeanType.SAASORDER.getCode());
OrderExtInfoDto extInfo = JSONObject.parseObject(orderBean.getExtInfo(), OrderExtInfoDto.class);
if(PayStatus.HAVE_PAID.getCode().equals(orderBean.getPayStatus()) && ObjectUtils.equals(1,orderBean.getPayType())){
//发起退款 本期不考虑 极端情况
}
......@@ -272,8 +272,14 @@ public class OrderCommonService {
LogUtil.error("paySuccessCallback_payAccess_faild", JSON.toJSONString(message), JSON.toJSONString(groupOrderResponse));
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());
//支付回掉成功标记
redisCache.save(RedisKeyConstant.KGD_PAYMENT_CALLBACK_FMID + message.getOut_trade_no(), message.getOut_trade_no(), 10L, TimeUnit.MINUTES);
//返回调用结果
return this.newSendPaySuccessNoticeMessage();
}
......
......@@ -45,8 +45,8 @@ import cn.freemud.interceptor.ServiceException;
import cn.freemud.redis.RedisCache;
import cn.freemud.service.BuriedPointService;
import cn.freemud.service.CouponActivityService;
import cn.freemud.service.OrderAdapterService;
import cn.freemud.service.Orderservice;
import cn.freemud.service.process.WechatPush.WechatPushProcessor;
import cn.freemud.service.thirdparty.*;
import cn.freemud.utils.*;
import com.alibaba.fastjson.JSON;
......@@ -134,8 +134,6 @@ public class OrderServiceImpl implements Orderservice {
private final Integer RESPONSE_SUCCESS_CODE = 100;
private final String PAY_SUCCESS_KEY="pay_success_key:";
private static Gson gson = new Gson();
@Value("${saas.reverseNotifyiDcUrl}")
......@@ -220,7 +218,8 @@ public class OrderServiceImpl implements Orderservice {
private MallOrderServiceImpl mallOrderService;
@Autowired
private CacheOpenPlatformPartnerWxappConfigManager cacheOpenPlatformPartnerWxappConfigManager;
@Autowired
private OrderAdapterService orderAdapterService;
@Override
public BaseResponse checkBeforeCreateOrder(CheckBeforeCreateOrderRequestVo requestVo) {
......@@ -334,33 +333,8 @@ public class OrderServiceImpl implements Orderservice {
}
@Override
public String paySuccessCallback(PaysuccessNoticeMessage message) {
//添加分布式锁,如果没有取得锁直接返回失败;整个方法执行完毕后会删掉该锁
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);
}
public String paySuccessCallback(PaysuccessNoticeMessage message, ConfirmOrderDto confirmOrderDto, Map<String, QueryOrdersResponseDto.DataBean.OrderBean> orderBeans) {
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 partnerId = orderBean.getCompanyId();
String userId = orderBean.getUserId();
......@@ -471,25 +445,16 @@ public class OrderServiceImpl implements Orderservice {
requestDto.setOpenId(orderExtInfoDto != null ? orderExtInfoDto.getOpenid() : "");
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)) {
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.delete("saas:lockAfter:"+PAY_SUCCESS_KEY+message.getTrans_id());
return sendPaySuccessNoticeMessage();
}
private Map<String, OrderBean> getOrderBeanByOrderId(String orderId) {
public Map<String, OrderBean> getOrderBeanByOrderId(String orderId) {
// 订单查询:若结果集只有一个orderBean,则为普通订单,否则为会员卡订单(父子订单)
Map<String, OrderBean> result = new HashMap<>();
QueryRelationOrderByIdResponseDto queryOrderByIdResponseDto = getQueryRelationOrderByIdResponseDto(orderId);
......@@ -554,7 +519,7 @@ public class OrderServiceImpl implements Orderservice {
message.setPlatformMchId(newMessage.getPlatformMchId());
message.setTerminalId(newMessage.getAppId());
message.setRuleId(newMessage.getRuleId());
String res = paySuccessCallback(message);
String res = orderAdapterService.paySuccessCallback(message);
JSONObject jsonObject = JSONObject.parseObject(res);
if (jsonObject.containsKey("code")) {
Integer code = (Integer) jsonObject.get("code");
......@@ -1825,13 +1790,14 @@ public class OrderServiceImpl implements Orderservice {
PaymentRequest paymentRequest = orderBodyConvertToPaymentBody(createPrepayRequestDto.getOpenId(), createPrepayRequestDto.getPartnerId(), createPrepayRequestDto.getWxAppId(), createPrepayRequestDto.getPayCode());
long totalAmount = createPrepayRequestDto.getTotalAmount();
String cardCode = createPrepayRequestDto.getCardCode();
String transId = createPrepayRequestDto.getTransId();
if (totalAmount < 0) {
throw new ServiceException(ResponseResult.PAY_AMOUNT_ERROR);
} 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)) {
//svc卡支付
orderPayResponse = svcPay(cardCode, createPrepayRequestDto.getFatherOrderBean(), paymentRequest, LogThreadLocal.getTrackingNo());
orderPayResponse = svcPay(cardCode, createPrepayRequestDto.getFatherOrderBean(), paymentRequest, transId, LogThreadLocal.getTrackingNo());
} else {
// 0元订单如果不需要支付,自定义支付单号
orderPayResponse = getOrderPayResponse(paymentRequest, createPrepayRequestDto.getFatherOrderBean());
......@@ -1863,7 +1829,7 @@ public class OrderServiceImpl implements Orderservice {
message.setOpenid(createPrepayRequestDto.getOpenId());
message.setPlatform_coupon(0);
message.setMerchant_coupon(0);
this.paySuccessCallback(message);
orderAdapterService.paySuccessCallback(message);
return ResponseUtil.success(createOrderResponse);
}
}
......@@ -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);
}
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 {
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);
if (!ResponseCodeConstant.RESPONSE_SUCCESS_STR.equals(responseBase.getCode())) {
log.error("支付SDK返回信息错误,trackingNo:{} request:{} response:{}", trackingNo, JSONObject.toJSONString(request), JSONObject.toJSONString(responseBase));
......@@ -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();
String partnerId = orderBean.getCompanyId();
request.setBody(orderBean.getShopName());
......@@ -1957,7 +1923,7 @@ public class OrderServiceImpl implements Orderservice {
request.setStoreId(orderBean.getShopId());
// request.setStoreId("10086");
request.setAmount(orderBean.getAmount());
request.setTransId(orderBean.getOid());
request.setTransId(transId);
request.setStationId("1");
request.setOperatorId("1");
request.setVer("2");
......@@ -2287,7 +2253,7 @@ public class OrderServiceImpl implements Orderservice {
message.setPlatform_coupon(0);
message.setMerchant_coupon(0);
//0元订单内部调支付成功
this.paySuccessCallback(message);
orderAdapterService.paySuccessCallback(message);
return ResponseUtil.success(createOrderResponse);
}
}
......@@ -2383,13 +2349,13 @@ public class OrderServiceImpl implements Orderservice {
}
//唤起微信支付
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;
}
//储值卡支付
if (totalAmount > 0 && StringUtils.isNotBlank(createOrderVo.getCardCode())) {
//svc卡支付
orderPayResponse = svcPay(createOrderVo.getCardCode(), fatherBeanListOne, paymentRequest, LogThreadLocal.getTrackingNo());
orderPayResponse = svcPay(createOrderVo.getCardCode(), fatherBeanListOne, paymentRequest, fatherBeanListOne.getOid(), LogThreadLocal.getTrackingNo());
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;
import cn.freemud.enums.RedisCacheEnum;
import java.text.MessageFormat;
public class RedisUtil {
private final static String BASE_URL = "micro_program:";
private final static String ENTER_SHOP_KEY = BASE_URL + "ENTER_SHOP_KEY_";
......@@ -17,4 +21,18 @@ public class RedisUtil {
public static String getCouponAppSecret(String 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