Commit 3a0a9cef by 周晓航

Merge branch 'feature-20211115-视频卖券ID1039458-zxh' into qa

# Conflicts:
#	order-application-service/src/main/java/cn/freemud/entities/vo/CreateOrderResponseVo.java
#	order-application-service/src/main/java/cn/freemud/service/impl/SellCouponOrderServiceImpl.java
parents f5db4184 09b32833
......@@ -19,6 +19,12 @@
<dependencies>
<dependency>
<groupId>com.freemud.thirdparty.sdk</groupId>
<artifactId>thirdparty-weichat-sdk</artifactId>
<version>0.1-BETA</version>
</dependency>
<dependency>
<groupId>com.xuxueli</groupId>
<artifactId>xxl-job-core</artifactId>
<version>2.0.1</version>
......
......@@ -3394,6 +3394,7 @@ public class OrderAdapter {
createOrderResponseVo.setOid(orderBean.getOid());
createOrderResponseVo.setWxappId(orderPayResponse.getWxAppid());
createOrderResponseVo.setFmId(orderPayResponse.getFmId());
createOrderResponseVo.setPayId(orderPayResponse.getPayId());
OrderPayResponse.PayOrderBean payOrderBean = orderPayResponse.getPayOrder();
// 腾讯有数数据上报 时间戳不能为空
createOrderResponseVo.setTimestamp(payOrderBean == null ? Instant.now().getEpochSecond() + "" : payOrderBean.getTimestamp());
......
......@@ -106,6 +106,11 @@ public class RedisKeyConstant {
public final static String KGD_PAYMENT_CANCEL_OID = "kgd:cancel_payment_oid:";
/**
* 获取生态 accessToken 的key前缀
*/
public final static String SAAS_ACCESSTOKEN_APPID = "saas:accesstoken:appid:";
/**
* cocoNotMadeGoods:商户号:门店号:yyyy-MM-dd
*
* @param partnerId
......
package cn.freemud.entities.live;
import com.freemud.thirdparty.wechat.entities.vo.request.OrderCreateRequestVO;
import com.freemud.thirdparty.wechat.entities.vo.response.OrderCreateResponseVO;
import lombok.Data;
/**
* @author : xh.Z
* @email : fisherman0510@163.com
* @Date : 2021/11/16 下午4:32
* @description :
*/
@Data
public class WeChatReportVO {
private OrderCreateRequestVO requestVO;
private OrderCreateResponseVO data;
public WeChatReportVO(OrderCreateRequestVO requestVO, OrderCreateResponseVO data) {
this.requestVO = requestVO;
this.data = data;
}
private WeChatReportVO() {
}
}
package cn.freemud.entities.vo;
import cn.freemud.entities.dto.CreateOrderProductDto;
import cn.freemud.entities.dto.UserDeliveryInfoDto;
import cn.freemud.entities.dto.delivery.WeixinDeliveryAddressDto;
import io.swagger.annotations.ApiModelProperty;
import lombok.Builder;
import lombok.Data;
import org.hibernate.validator.constraints.NotEmpty;
import javax.validation.Valid;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Pattern;
import java.util.List;
/**
......@@ -84,5 +78,9 @@ public class AppCreateOrderVo {
private Integer bizType;
/**
* 卖券场景值
*/
private String scene ;
}
......@@ -12,6 +12,7 @@
*/
package cn.freemud.entities.vo;
import cn.freemud.entities.live.WeChatReportVO;
import cn.freemud.entities.ttpay.OrderInfo;
import cn.freemud.entities.vo.order.PlugInParameter;
import io.swagger.annotations.ApiModelProperty;
......@@ -72,4 +73,11 @@ public class CreateOrderResponseVo {
//一元捐插件新增
private String outTradeNo;
/**
* pay_id : 微信小程序支付
*/
private String payId;
private WeChatReportVO weChatReportVO;
}
package cn.freemud.entities.vo;
import cn.freemud.entities.dto.UserDeliveryInfoDto;
import io.swagger.annotations.ApiModelProperty;
import lombok.Builder;
import lombok.Data;
import org.hibernate.validator.constraints.NotEmpty;
import javax.validation.Valid;
import javax.validation.constraints.Pattern;
/**
* All rights Reserved, Designed By www.freemud.cn
*
......@@ -67,9 +61,21 @@ public class SellCouponCreateOrderVo {
/**
* 【华莱士】【订单C端记录不分账的卡面编号】不让走分账,卡面编号--11840,11845,11846,11853,11854,11855,11857,11858,11859,11860,11861,11862,11863,11864,11865,11866,11906
*
* <p>
* 1 表示不分账 ,其他情况 不传值 给基础服务
*/
private Integer unDistribution;
/**
* 视频卖券 需要带上该参数
* 卖券场景值
*/
private String scene;
/**
* 视频卖券 需要带上该参数
*/
private String productPath;
}
package cn.freemud.handler;
import cn.freemud.base.entity.BaseResponse;
import cn.freemud.base.util.DateUtil;
import cn.freemud.constant.RedisKeyConstant;
import cn.freemud.entities.dto.order.CreatePrepayRequestDto;
import cn.freemud.entities.dto.wechat.GetAuthorizerRequestDto;
import cn.freemud.entities.dto.wechat.GetTokenResponseDto;
import cn.freemud.entities.live.WeChatReportVO;
import cn.freemud.entities.vo.CreateOrderResponseVo;
import cn.freemud.enums.ResponseResult;
import cn.freemud.interceptor.ServiceException;
import cn.freemud.redis.RedisCache;
import cn.freemud.service.thirdparty.EcologyAdminApplicationClient;
import cn.freemud.utils.ResponseUtil;
import com.freemud.application.sdk.api.ordercenter.entities.v1.OrderBeanV1;
import com.freemud.application.sdk.api.ordercenter.entities.v1.ProductBeanV1;
import com.freemud.thirdparty.wechat.WeChatClient;
import com.freemud.thirdparty.wechat.constant.WeChatConstant;
import com.freemud.thirdparty.wechat.entities.WeChatBaseResponse;
import com.freemud.thirdparty.wechat.entities.vo.request.OrderCreateRequestVO;
import com.freemud.thirdparty.wechat.entities.vo.response.OrderCreateResponseVO;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Objects;
import java.util.concurrent.TimeUnit;
/**
* @author : xh.Z
* @email : fisherman0510@163.com
* @Date : 2021/11/16 上午11:25
* @description : 微信直播 卖券商品 数据处理
*/
@Component
public class WeChatLiveMsgHandle {
@Value("${wechat.live.order.path:}")
private String path;
@Autowired
private EcologyAdminApplicationClient ecologyAdminApplicationClient;
@Autowired
private RedisCache redisCache;
/**
* 组装 订单创建上报数据 对象
*
* @param createPrepayRequestDto
* @param prepayOrder
*/
public BaseResponse reportOrder(CreatePrepayRequestDto createPrepayRequestDto,
CreateOrderResponseVo prepayOrder, String scene, String productPath) {
// 组装 request
OrderCreateRequestVO requestVO = this.getOrderCreateRequest(createPrepayRequestDto, prepayOrder, scene, productPath);
// 获取 session
String accessToken = this.getAccessToken(createPrepayRequestDto.getWxAppId(), createPrepayRequestDto.getPartnerId());
WeChatClient weChatClient = new WeChatClient();
WeChatBaseResponse<OrderCreateResponseVO> weChatBaseResponse = weChatClient.orderApply(accessToken, requestVO, WeChatConstant.OrderMethod.ORDER_ADD);
if (weChatBaseResponse == null) {
// 调用失败
return ResponseUtil.error(ResponseResult.SYSTEM_BUSINESS_ERROR.getCode(), "错误码" + ResponseResult.SYSTEM_BUSINESS_ERROR.getCode() + ",创建视频号订单异常,请稍后再试。");
}
if ("0".equals(weChatBaseResponse.getErrcode())) {
// 调用成功
OrderCreateResponseVO data = weChatBaseResponse.getData();
WeChatReportVO weChatReportVO = new WeChatReportVO(requestVO, data);
return ResponseUtil.success(weChatReportVO);
}
// 处理 token失败的情况 42001 表示 accesstoken 有问题 重新调用一遍
if ("42001".equals(weChatBaseResponse.getErrcode())) {
accessToken = this.refreshAccessToken(createPrepayRequestDto.getWxAppId(), createPrepayRequestDto.getPartnerId());
WeChatBaseResponse<OrderCreateResponseVO> agResponse = weChatClient.orderApply(accessToken, requestVO, WeChatConstant.OrderMethod.ORDER_ADD);
if (weChatBaseResponse == null) {
// 调用失败
return ResponseUtil.error(ResponseResult.SYSTEM_BUSINESS_ERROR.getCode(), "错误码" + ResponseResult.SYSTEM_BUSINESS_ERROR.getCode() + ",创建视频号订单异常,请稍后再试。");
}
if ("0".equals(weChatBaseResponse.getErrcode())) {
// 调用成功
OrderCreateResponseVO data = agResponse.getData();
WeChatReportVO weChatReportVO = new WeChatReportVO(requestVO, data);
return ResponseUtil.success(weChatReportVO);
}
return ResponseUtil.error(agResponse.getErrcode(), "错误码" + agResponse.getErrmsg() + ",创建视频号订单异常,请稍后再试。");
}
// 全部失败 直接抛出异常
return ResponseUtil.error(weChatBaseResponse.getErrcode(), "错误码" + weChatBaseResponse.getErrmsg() + ",创建视频号订单异常,请稍后再试。");
}
private String refreshAccessToken(String wxAppId, String partnerId) {
String dbAccessToken = this.getDBAccessToken(wxAppId, partnerId);
String redisKey = RedisKeyConstant.SAAS_ACCESSTOKEN_APPID + wxAppId;
this.putRedis(redisKey, dbAccessToken);
return dbAccessToken;
}
private String getDBAccessToken(String wxAppId, String partnerId) {
GetAuthorizerRequestDto request = new GetAuthorizerRequestDto();
request.setAuthorizerAppid(wxAppId);
request.setPartnerId(partnerId);
GetTokenResponseDto authorizerAccessToken = ecologyAdminApplicationClient.getAuthorizerAccessToken(request);
if (authorizerAccessToken == null || authorizerAccessToken.getResult() == null || StringUtils.isBlank(authorizerAccessToken.getResult().getAccessToken())) {
throw new ServiceException(ResponseResult.SYSTEM_BUSINESS_ERROR.getCode(), "获取生态accessToken失败");
}
String accessToken = authorizerAccessToken.getResult().getAccessToken();
return accessToken;
}
private void putRedis(String redisKey, String accessToken) {
// 存redis + 过期时间
redisCache.setAdd(redisKey, accessToken);
redisCache.updateTTL(redisKey, 2, TimeUnit.HOURS);
}
/**
* 获取 token
*
* @param wxAppId
* @param partnerId
* @return
*/
private String getAccessToken(String wxAppId, String partnerId) {
String redisKey = RedisKeyConstant.SAAS_ACCESSTOKEN_APPID + wxAppId;
Object value = redisCache.getValue(redisKey);
// 该操作 无需关注 重入情况
if (Objects.isNull(value)) {
String accessToken = this.getDBAccessToken(wxAppId, partnerId);
// 存redis + 过期时间
this.putRedis(redisKey, accessToken);
return accessToken;
}
return value.toString();
}
private OrderCreateRequestVO getOrderCreateRequest(CreatePrepayRequestDto createPrepayRequestDto,
CreateOrderResponseVo prepayOrder,
String scene,
String productPath) {
OrderCreateRequestVO requestVO = new OrderCreateRequestVO();
OrderBeanV1 orderBean = createPrepayRequestDto.getProductOrderBean();
Long gmtCreate = orderBean.getGmtCreate();
requestVO.setCreate_time(DateUtil.convert2Str(new Date(gmtCreate), DateUtil.FORMAT_YYYY_MM_DD_HHMMSS));
requestVO.setOut_order_id(orderBean.getOid());
requestVO.setOpenid(createPrepayRequestDto.getOpenId());
requestVO.setPath(path);
requestVO.setScene(Integer.valueOf(scene));
OrderCreateRequestVO.DeliveryDetail deliveryDetail = new OrderCreateRequestVO.DeliveryDetail();
deliveryDetail.setDelivery_type(2);
requestVO.setDelivery_detail(deliveryDetail);
// 组装商品参数
OrderCreateRequestVO.OrderDetail orderDetail = this.getOrderDetail(orderBean, prepayOrder, productPath);
requestVO.setOrder_detail(orderDetail);
return requestVO;
}
private OrderCreateRequestVO.OrderDetail getOrderDetail(OrderBeanV1 orderBean, CreateOrderResponseVo prepayOrder, String productPath) {
OrderCreateRequestVO.OrderDetail detail = new OrderCreateRequestVO.OrderDetail();
// payinfo
OrderCreateRequestVO.PayInfo payInfo = new OrderCreateRequestVO.PayInfo();
payInfo.setPay_method_type(0);
payInfo.setPrepay_id(prepayOrder.getPayId());
String gmtCreate = prepayOrder.getTimestamp();
payInfo.setPrepay_time(DateUtil.convert2Str(new Date(Long.parseLong(gmtCreate + "000")), DateUtil.FORMAT_YYYY_MM_DD_HHMMSS));
detail.setPay_info(payInfo);
// priceinfo
OrderCreateRequestVO.PriceInfo priceInfo = new OrderCreateRequestVO.PriceInfo();
priceInfo.setOrder_price(orderBean.getSettlementAmount());
priceInfo.setFreight(0L);
detail.setPrice_info(priceInfo);
// list productinfo
List<ProductBeanV1> productList = orderBean.getProductList();
List<OrderCreateRequestVO.ProductInfo> productInfos = new ArrayList<>(productList.size());
productList.forEach(p -> {
OrderCreateRequestVO.ProductInfo productInfo = new OrderCreateRequestVO.ProductInfo();
productInfo.setOut_product_id(p.getProductId());
productInfo.setOut_sku_id(p.getProductId());
productInfo.setProduct_cnt(p.getNumber());
productInfo.setSale_price(p.getSalePrice());
productInfo.setReal_price(p.getSalePrice());
productInfo.setHead_img(p.getPicture());
productInfo.setTitle(p.getProductName());
// fisherman 虚拟商品的 path 未知
productInfo.setPath(productPath);
productInfos.add(productInfo);
});
detail.setProduct_infos(productInfos);
return detail;
}
}
......@@ -198,7 +198,7 @@ public class AppOrderServiceImpl implements AppOrderService {
String skuId = createOrderReq.getOrderProducts().get(0).getSkuId();
//20200107提取虚拟商品券效验方法---》校验虚拟商品,如果正常则返回创建订单对象
BaseResponse createOrderRequestResponse =
sellCouponOrderService.checkOrderCoupon(customerInfo, storeResponse, trackingNo, createOrderReq.getMenuType(), Integer.valueOf(createOrderReq.getBizType()), partnerId, shopId, skuId, null);
sellCouponOrderService.checkOrderCoupon(customerInfo, storeResponse, trackingNo, createOrderReq.getMenuType(), Integer.valueOf(createOrderReq.getBizType()), partnerId, shopId, skuId, null,createOrderReq.getScene());
if (createOrderRequestResponse == null || !ResponseResult.SUCCESS.getCode().equals(createOrderRequestResponse.getCode()) || createOrderRequestResponse.getResult() == null) {
return createOrderRequestResponse;
}
......
......@@ -22,8 +22,10 @@ import cn.freemud.entities.dto.product.ProductInfo;
import cn.freemud.entities.dto.product.ValidateProductInfosDto;
import cn.freemud.entities.dto.promotion.CalculationDiscountGoodsDto;
import cn.freemud.entities.dto.promotion.CalculationDiscountRequestDto;
import cn.freemud.entities.live.WeChatReportVO;
import cn.freemud.entities.vo.*;
import cn.freemud.enums.*;
import cn.freemud.handler.WeChatLiveMsgHandle;
import cn.freemud.interceptor.ServiceException;
import cn.freemud.manager.BuyProductOnceManager;
import cn.freemud.redis.RedisCache;
......@@ -53,6 +55,7 @@ import com.freemud.application.sdk.api.log.LogThreadLocal;
import com.freemud.application.sdk.api.log.ThirdPartyLog;
import com.freemud.application.sdk.api.ordercenter.entities.v1.OrderBeanV1;
import com.freemud.application.sdk.api.ordercenter.entities.v1.ProductBeanV1;
import com.freemud.application.sdk.api.ordercenter.enums.CreateOrderSceneEnum;
import com.freemud.application.sdk.api.ordercenter.enums.OrderType;
import com.freemud.application.sdk.api.ordercenter.enums.*;
import com.freemud.application.sdk.api.ordercenter.request.OrderChangeStateReq;
......@@ -178,6 +181,8 @@ public class SellCouponOrderServiceImpl implements OrderFactoryService {
private AssortmentOpenPlatformPartnerConfigManager openPlatformPartnerConfigManager;
@Autowired
private AssortmentOpenPlatformIappWxappStoreManager assortmentOpenPlatformIappWxappStoreManager;
@Autowired
private WeChatLiveMsgHandle weChatLiveMsgHandle;
@Autowired
private CouponOnlineClient couponOnlineClient;
......@@ -226,7 +231,7 @@ public class SellCouponOrderServiceImpl implements OrderFactoryService {
}
//卖券订单biztype默认传入6
BaseResponse createOrderRequestResponse = checkOrderCoupon(userLoginInfoDto, storeResponse, trackingNo, requestVo.getMenuType(), BizTypeEnum.SALE_COUPON.getBizType(), partnerId, storeId, skuId,requestVo.getCardCode());
BaseResponse createOrderRequestResponse = checkOrderCoupon(userLoginInfoDto, storeResponse, trackingNo, requestVo.getMenuType(), BizTypeEnum.SALE_COUPON.getBizType(), partnerId, storeId, skuId,requestVo.getCardCode(),requestVo.getScene());
if (createOrderRequestResponse == null || !ResponseResult.SUCCESS.getCode().equals(createOrderRequestResponse.getCode()) || createOrderRequestResponse.getResult() == null) {
return createOrderRequestResponse;
}
......@@ -359,7 +364,10 @@ public class SellCouponOrderServiceImpl implements OrderFactoryService {
}
//卖券订单biztype默认传入6
BaseResponse createOrderRequestResponse = checkOrderCoupon(userLoginInfoDto, storeResponse, trackingNo, requestVo.getMenuType(), 6, partnerId, storeId, requestVo.getSkuId(),requestVo.getCardCode());
BaseResponse createOrderRequestResponse = checkOrderCoupon(userLoginInfoDto, storeResponse, trackingNo,
requestVo.getMenuType(), 6, partnerId, storeId,
requestVo.getSkuId(),requestVo.getCardCode(),
requestVo.getScene());
if (createOrderRequestResponse == null || !ResponseResult.SUCCESS.getCode().equals(createOrderRequestResponse.getCode()) || createOrderRequestResponse.getResult() == null) {
return createOrderRequestResponse;
}
......@@ -490,6 +498,17 @@ public class SellCouponOrderServiceImpl implements OrderFactoryService {
}
//唤起支付返回参数
checkOrder.convent2CreateOrderResponseVo(createOrderResponseVo, appId, response.getData());
// fisherman 视频卖券 需要拼装额外对象 给前端
if (StringUtils.isNotBlank(requestVo.getScene()) && CreateOrderSceneEnum.verifySceneOrder.contains(requestVo.getScene())) {
BaseResponse<WeChatReportVO> baseResponse = weChatLiveMsgHandle.reportOrder(createPrepayRequestDto, createOrderResponseVo, requestVo.getScene(), requestVo.getProductPath());
if (ResponseResult.SUCCESS.getCode().equals(baseResponse.getCode())) {
WeChatReportVO weChatReportVO = baseResponse.getResult();
createOrderResponseVo.setWeChatReportVO(weChatReportVO);
return ResponseUtil.success(createOrderResponseVo);
}else {
return baseResponse;
}
}
return ResponseUtil.success(createOrderResponseVo);
}
......@@ -505,6 +524,7 @@ public class SellCouponOrderServiceImpl implements OrderFactoryService {
* @param storeId
* @param skuId
* @param cardCode
* @param scene 下单的场景
* @return
*/
public BaseResponse checkOrderCoupon(AssortmentCustomerInfoVo userLoginInfoDto,
......@@ -514,7 +534,8 @@ public class SellCouponOrderServiceImpl implements OrderFactoryService {
Integer bizType,
String partnerId,
String storeId,
String skuId,String cardCode) {
String skuId,String cardCode,
String scene) {
//校验虚拟商品是否在门店菜单
GetValidateProductInfoDto getProductInfoDto = new GetValidateProductInfoDto();
......@@ -584,7 +605,7 @@ public class SellCouponOrderServiceImpl implements OrderFactoryService {
CreateOrderRequest createOrderRequest = convent2NEWCreateOrderRequest(userLoginInfoDto,
productInfos.getData(),
activeDetailVOS,
storeResponse.getBizVO(),storeId,cardCode,skuId,menuType,bizType);
storeResponse.getBizVO(),storeId,cardCode,skuId,menuType,bizType,scene);
return ResponseUtil.success(createOrderRequest);
}
......@@ -725,7 +746,8 @@ public class SellCouponOrderServiceImpl implements OrderFactoryService {
String cardCode,
String skuId,
String channel,
Integer bizType){
Integer bizType,
String scene){
CreateOrderRequest request = new CreateOrderRequest();
Integer orderClient = OrderClientType.SAAS.getIndex();
request.setPayChannel(PayChannelType.WECHAT.getIndex().toString());
......@@ -738,6 +760,11 @@ public class SellCouponOrderServiceImpl implements OrderFactoryService {
if(UserLoginChannelEnum.APP.getCode().equals(userLoginInfoDto.getChannel())){
orderClient = OrderClientType.APP.getIndex();
}
// fisherman 视频直播卖券 需要修改 orderclient
if (StringUtils.isNotBlank(scene) && CreateOrderSceneEnum.verifySceneOrder.contains(scene)) {
orderClient = OrderClientType.WE_CHAT_LIVE_SELL.getIndex();
}
//抖音小程序
if("5".equalsIgnoreCase(userLoginInfoDto.getChannel())) {
request.setPayChannel(PayChannelType.TIKTOKPAY.getIndex().toString());
......
package com.freemud.application.sdk.api.ordercenter.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
import java.util.Arrays;
import java.util.List;
/**
* @author : xh.Z
* @email : fisherman0510@163.com
* @Date : 2021/11/16 下午2:08
* @description : 视频直播 场景值记录
*/
@AllArgsConstructor
@Getter
public enum CreateOrderSceneEnum {
LIVE_STORE_ENTER("1175", "视频号主页商店入口"),
LIVE_PRODUCT("1177", "视频号直播商品"),
LIVE_HOME_PAGE_PRODUCT("1195", "视频号主页商品tab");
private String scene;
private String name;
/**
* 卖券订单需要校验的场景值
*/
public static List<String> verifySceneOrder = Arrays.asList(CreateOrderSceneEnum.LIVE_HOME_PAGE_PRODUCT.getScene(),
CreateOrderSceneEnum.LIVE_PRODUCT.getScene(),
CreateOrderSceneEnum.LIVE_HOME_PAGE_PRODUCT.getScene()
);
}
......@@ -42,6 +42,7 @@ public enum OrderClientType {
SHERPAS(30,"食派士"),
PARKING(99 , "农工商停车"),
CASHIER(36, "收银买单"),
WE_CHAT_LIVE_SELL(37, "微信视频卖券"),
;
......
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