Commit 49f8814b by xiaoer.li@freemud.com

Merge branch 'feature/2020-1104-混合支付' into qa

# Conflicts:
#	assortment-ordercenter-sdk/pom.xml
#	assortment-ordercenter-sdk/src/main/java/com/freemud/sdk/api/assortment/order/adapter/OrderSdkAdapter.java
#	assortment-ordercenter-sdk/src/main/java/com/freemud/sdk/api/assortment/order/request/order/BaseCreateOrderRequest.java
#	assortment-ordercenter-sdk/src/main/java/com/freemud/sdk/api/assortment/order/request/payment/PayPlatformVO.java
#	assortment-ordercenter-sdk/src/main/java/com/freemud/sdk/api/assortment/order/request/payment/ProductVO.java
#	assortment-ordercenter-sdk/src/main/java/com/freemud/sdk/api/assortment/order/response/order/QueryOrdersResponse.java
#	order-application-service/pom.xml
#	order-application-service/src/main/java/cn/freemud/adapter/OrderAdapter.java
#	order-application-service/src/main/java/cn/freemud/entities/dto/order/CreatePrepayRequestDto.java
#	order-application-service/src/main/java/cn/freemud/entities/vo/CreateOrderVo.java
#	order-application-service/src/main/java/cn/freemud/service/impl/OrderServiceImpl.java
#	ordercenter-sdk/pom.xml
#	ordercenter-sdk/src/main/java/com/freemud/application/sdk/api/ordercenter/request/create/CreateOrderRequest.java
#	ordercenter-sdk/src/main/java/com/freemud/application/sdk/api/ordercenter/request/create/OrderPayItemCreateReq.java
#	ordercenter-sdk/src/main/java/com/freemud/application/sdk/api/ordercenter/response/orderInfo/OrderInfoReqs.java
parents 323272d4 0150fc7d
......@@ -61,7 +61,7 @@
<dependency>
<artifactId>promotioncenter-sdk</artifactId>
<groupId>com.freemud.application.service.sdk</groupId>
<version>2.7.RELEASE</version>
<version>2.3.RELEASE</version>
<scope>provided</scope>
</dependency>
<dependency>
......
......@@ -1170,10 +1170,30 @@ public class OrderSdkAdapter {
data.setExpressChannelName(orderInfoReqs.getExpressChannelName());
//发票信息
data.setOrderInvoice(orderInfoReqs.getOrderInvoice());
//todo:混合支付
if (CollectionUtils.isNotEmpty(orderInfoReqs.getOrderPayItemCreateReqList())) {
data.setOrderPayItem(this.getOrderItemPayList(orderInfoReqs.getOrderPayItemCreateReqList()));
}
return data;
}
/**
* 混合支付转换
* @param OrderPayItemReqs
*/
private List<QueryOrdersResponse.DataBean.OrderBean.OrderPayItem> getOrderItemPayList(List<OrderPayItemReqs> OrderPayItemReqs) {
List<QueryOrdersResponse.DataBean.OrderBean.OrderPayItem> OrderPayItemList = new ArrayList<>(2);
for (OrderPayItemReqs orderPayItemReq : OrderPayItemReqs) {
QueryOrdersResponse.DataBean.OrderBean.OrderPayItem orderPayItem = new QueryOrdersResponse.DataBean.OrderBean.OrderPayItem();
orderPayItem.setOrderCode(orderPayItemReq.getOrderCode());
orderPayItem.setOrderPayItemCode(orderPayItemReq.getOrderPayItemCode());
orderPayItem.setPayAmount(orderPayItemReq.getPayAmount());
orderPayItem.setPayChannelName(orderPayItemReq.getPayChannelName());
orderPayItem.setPayChannelType(orderPayItemReq.getPayChannelType());
OrderPayItemList.add(orderPayItem);
}
return OrderPayItemList;
}
public QueryOrdersResponse convent2QueryOrdersResponse(BaseResponse<QueryOrderForUserResp> baseResponse) {
QueryOrdersResponse response = new QueryOrdersResponse();
response.setErrcode(Integer.parseInt(baseResponse.getCode()));
......@@ -1324,9 +1344,6 @@ public class OrderSdkAdapter {
case "MEMBER_PRICE_DISCOUNT":
type=220;
break;
case "GATHER_SPOT":
type=221;
break;
default:
break;
}
......@@ -1607,9 +1624,6 @@ public class OrderSdkAdapter {
activityUpdateStockRequest.setPartnerCode(orderBean.getCompanyId());
activityUpdateStockRequest.setStoreId(orderBean.getShopId());
activityUpdateStockRequest.setVer("1");
// add by miaohui 20201030 for 【ID1018638】【C端服务端】活动库存接口调整对接
activityUpdateStockRequest.setUserId(orderBean.getUserId());
activityUpdateStockRequest.setOrderCreateTime(DateUtil.getCurrentDate(DateUtil.FORMAT_yyyyMMdd_date));
return activityUpdateStockRequest;
}
......
......@@ -4,10 +4,10 @@ import com.freemud.application.sdk.api.ordercenter.enums.OrderClientType;
import com.freemud.application.sdk.api.ordercenter.request.OrderExtendedReq;
import com.freemud.application.sdk.api.ordercenter.request.create.OrderPayItemCreateReq;
import com.freemud.application.sdk.api.ordercenter.request.create.OrderTaskReq;
import com.freemud.application.sdk.api.ordercenter.request.create.OrderPayItemCreateReq;
import com.freemud.application.sdk.api.promotioncenter.request.promotion.ActivityUpdateStockRequest;
import com.freemud.sdk.api.assortment.order.config.BaseConfig;
import com.freemud.sdk.api.assortment.order.enums.*;
import lombok.Builder;
import lombok.Data;
import java.util.Date;
......@@ -48,7 +48,6 @@ public class BaseCreateOrderRequest extends BaseConfig {
* 用户电话
*/
private String phone;
/**
* 收货地址 非必填
*/
......@@ -169,7 +168,7 @@ public class BaseCreateOrderRequest extends BaseConfig {
* 收货地址Id
*/
private String receiveId;
private List<OrderPayItemCreateReq> orderPayItemCreateReqList;
@Data
public static class DeliveryTypeInfo {
/**
......@@ -223,6 +222,5 @@ public class BaseCreateOrderRequest extends BaseConfig {
private Integer validityDateDays;
}
private List<OrderPayItemCreateReq> orderPayItemCreateReqList;
}
package com.freemud.sdk.api.assortment.order.request.order;
import com.freemud.application.sdk.api.ordercenter.entities.PayItem;
import com.freemud.sdk.api.assortment.order.config.BaseConfig;
import lombok.Data;
import java.util.List;
@Data
public class OrderEditRequest extends BaseConfig {
......@@ -17,8 +20,10 @@ public class OrderEditRequest extends BaseConfig {
*/
private String extInfo;
private List<PayItem> orderPayItem;
public OrderEditRequest(String orderId, String extInfo) {
this.orderId = orderId;
this.extInfo = extInfo;
}
}
package com.freemud.sdk.api.assortment.order.request.payment;
import lombok.Data;
import java.util.List;
@Data
public class CombPayRequest {
private List<PayPlatformVO> platforms;
/**
* 用户标识
*/
private String open_id;
/**
* 回调通知地址
*/
private String notify_url;
/**
* 是否需要开发票:1为需要
*/
private Integer invoice_flag;
/**
* 支付总金额,以分为单位
*/
private Long amount;
/**
* 会员支付金额,以分为单位
*/
private Long vip_amount;
/**
* 不可打折金额,以分为单位
*/
private Integer undis_amount;
/**
* 订单描述
*/
private String body;
/**
* 外部交易流水号,由上游系统生成,需保证唯一
*/
private String out_order_no;
private List<ProductVO> products;
private String goodsTag;
/**
* 商户编号(由非码提供)
*/
private String partner_id;
/**
* 商家门店号(在线支付需要提前定义)
*/
private String store_id;
/**
* 业务日期
*/
private String business_date;
/**
* 营业员编号(可以使用固定值)
*/
private String operator_id = "1";
/**
* 商家POS机编号(可以使用固定值,扫码付必传)
*/
private String station_id = "1";;
private String appId;
private String payCode;
private String payTimeOutTime;
private String ebCode;
private String cardCode;
private Boolean disable_service_goods_tag = false;
private String request_source ="V1";
private String ver ="10";
}
......@@ -6,5 +6,6 @@ import lombok.Data;
public class PayPlatformVO {
private String ebcode;
private Long amount;
private String clientCode;
}
......@@ -8,7 +8,7 @@ import java.math.BigDecimal;
public class ProductVO {
private String id;
private BigDecimal quantity;
private Integer quantity;
private Integer seq;
private Long price;
private String name;
......
......@@ -410,6 +410,11 @@ public class QueryOrdersResponse {
private String downstreamThirdOrderCode;
/**
* 混合支付list
*/
private List<OrderPayItem> orderPayItem;
@NoArgsConstructor
@Data
public static class AddDeliveryInfo {
......@@ -746,6 +751,23 @@ public class QueryOrdersResponse {
// 扩展字段
private String extInfo;
}
@NoArgsConstructor
@Data
public static class OrderPayItem {
private Long orderId;
/**
* 订单号
*/
private String orderCode;
private Integer payChannelType;
private String payChannelName;
/**
* 支付交易号
*/
private String orderPayItemCode;
private BigDecimal payAmount;
}
}
}
}
......@@ -12,10 +12,14 @@
*/
package com.freemud.sdk.api.assortment.order.response.payment;
import com.freemud.application.sdk.api.ordercenter.entities.PayItem;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;
import java.util.ArrayList;
import java.util.List;
@NoArgsConstructor
@Data
@ToString
......@@ -59,6 +63,7 @@ public class OrderPayResponse {
private String wxAppid;
private String orderId;
private List<PayItem> payItem = new ArrayList<>();
@NoArgsConstructor
@Data
......@@ -78,12 +83,19 @@ public class OrderPayResponse {
private String nonceStr;
/**
* 签名
*/
private String sign;
private String timestamp;
/**
* 签名方式
*/
private String signType;
private String aliPayOrder;
}
}
......@@ -695,6 +695,7 @@ public class OrderCenterSdkServiceImpl implements OrderCenterSdkService {
request.setOrderCode(orderEdit.getOrderId());
request.setExtInfo(orderEdit.getExtInfo());
request.setOrderClient(OrderClientType.SAAS.getIndex());
request.setOrderPayItem(orderEdit.getOrderPayItem());
com.freemud.application.sdk.api.ordercenter.response.BaseResponse response = orderSdkService.editOrder(request, orderEdit.getTrackingNo());
return orderSdkAdapter.convent2BaseOrderResponse(response);
}
......
......@@ -25,7 +25,7 @@
<dependency>
<groupId>com.freemud.sdk.api.assortment</groupId>
<artifactId>assortment-orderdistributor-sdk</artifactId>
<version>2.4.3-SNAPSHOT</version>
<version>2.4.4-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.freemud.application.service.sdk</groupId>
......@@ -40,7 +40,7 @@
<dependency>
<groupId>cn.freemud</groupId>
<artifactId>assortment-ordercenter-sdk</artifactId>
<version>2.1.8-SNAPSHOT</version>
<version>2.0.2-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.freemud.application.service.sdk</groupId>
......@@ -60,7 +60,7 @@
<dependency>
<artifactId>promotioncenter-sdk</artifactId>
<groupId>com.freemud.application.service.sdk</groupId>
<version>2.7.RELEASE</version>
<version>2.3.RELEASE</version>
</dependency>
<dependency>
<groupId>com.freemud.sdk.api.assortment</groupId>
......@@ -88,7 +88,7 @@
<dependency>
<groupId>com.freemud.application.service.sdk</groupId>
<artifactId>storecenter-sdk</artifactId>
<version>3.2.1-SNAPSHOT</version>
<version>3.1.9.RELEASE</version>
</dependency>
<dependency>
<groupId>cn.freemud</groupId>
......@@ -119,7 +119,7 @@
<dependency>
<artifactId>assortment-data-manager</artifactId>
<groupId>com.freemud.sdk.api.assortment</groupId>
<version>5.2.7.RELEASE</version>
<version>5.1.1-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>cn.freemud.commons</groupId>
......
......@@ -20,6 +20,7 @@ import cn.freemud.entities.dto.activity.ShareDiscountActivityDto;
import cn.freemud.entities.dto.order.*;
import cn.freemud.entities.dto.order.CreateOrderAccountDto;
import cn.freemud.entities.dto.order.CreateOrderProductDto;
import cn.freemud.entities.dto.pay.CombPayResponse;
import cn.freemud.entities.dto.promotion.OrderBeanRequest;
import cn.freemud.entities.dto.promotion.ShoppingCartGoodsResponse;
import cn.freemud.entities.dto.shoppingCart.ActivityDiscountsDto;
......@@ -50,19 +51,21 @@ import com.freemud.api.assortment.datamanager.enums.IappIdType;
import com.freemud.application.sdk.api.log.LogThreadLocal;
import com.freemud.api.assortment.datamanager.manager.cache.CacheOpenPlatformPartnerWxappConfigManager;
import com.freemud.application.sdk.api.log.LogThreadLocal;
import com.freemud.application.sdk.api.ordercenter.enums.AfterSalesType;
import com.freemud.application.sdk.api.ordercenter.enums.OrderClientType;
import com.freemud.application.sdk.api.ordercenter.enums.OrderSettlementType;
import com.freemud.application.sdk.api.ordercenter.enums.ProductTypeEnum;
import com.freemud.application.sdk.api.ordercenter.entities.PayItem;
import com.freemud.application.sdk.api.ordercenter.enums.*;
import com.freemud.application.sdk.api.ordercenter.request.OrderExtInfoDto;
import com.freemud.application.sdk.api.ordercenter.request.OrderExtendedReq;
import com.freemud.application.sdk.api.ordercenter.request.create.OrderPayItemCreateReq;
import com.freemud.application.sdk.api.ordercenter.request.create.OrderPayItemCreateReq;
import com.freemud.application.sdk.api.ordercenter.request.create.OrderTaskReq;
import com.freemud.application.sdk.api.promotioncenter.dto.promotion.GoodsStockDTO;
import com.freemud.application.sdk.api.promotioncenter.request.promotion.ActivityUpdateStockRequest;
import com.freemud.application.sdk.api.storecenter.response.StoreResponse;
import com.freemud.sdk.api.assortment.order.enums.*;
import com.freemud.sdk.api.assortment.order.request.order.*;
import com.freemud.sdk.api.assortment.order.request.payment.CombPayRequest;
import com.freemud.sdk.api.assortment.order.request.payment.PayPlatformVO;
import com.freemud.sdk.api.assortment.order.request.payment.ProductVO;
import com.freemud.sdk.api.assortment.order.request.payment.PayPlatformVO;
import com.freemud.sdk.api.assortment.order.request.payment.ProductVO;
import com.freemud.sdk.api.assortment.order.request.payment.UnifiedOrderApplicationRequest;
......@@ -131,8 +134,7 @@ public class OrderAdapter {
// private RedisCache redisCache;
@Autowired
private OrderCommonService orderCommonService;
@Autowired
private RedisTemplate redisTemplate;
private static Gson gson = new Gson();
@Autowired
......@@ -308,9 +310,8 @@ public class OrderAdapter {
}
createOrderDto.setActivityUpdateStockRequest(activityUpdateStockRequest);
createOrderDto.setPayChannelType(createOrderVo.getPayChannelType());
// createOrderDto.setOtherInfo(getOrderOtherInfo(shoppingCartGoodsDto));
createOrderDto.setOrderPayItemCreateReqList(createOrderVo.getOrderPayItemCreateReqList());
// createOrderDto.setOtherInfo(getOrderOtherInfo(shoppingCartGoodsDto));
return createOrderDto;
}
......@@ -3378,12 +3379,62 @@ public class OrderAdapter {
public CreatePrepayRequestDto convertToCreatePrepayRequestDto(AssortmentCustomerInfoVo userLoginInfoDto,CreateOrderVo createOrderVo,
CreateOrderOperateDto createOrderOperateDto, OrderExtInfoDto orderExtInfoDTO){
return this.convertToCreatePrepayRequestDto(createOrderVo.getPartnerId(), userLoginInfoDto.getWxAppId(), userLoginInfoDto.getOpenId(),
createOrderVo.getFaceCode(), createOrderVo.getCardCode(), null,
createOrderOperateDto.getFatherOrderBean(), createOrderOperateDto.getProductOrderBean(),
createOrderOperateDto.getTotalAmount() == null ? 0 : createOrderOperateDto.getTotalAmount(),
createOrderOperateDto.getCardAmount() == null ? 0 : createOrderOperateDto.getCardAmount(), orderExtInfoDTO,
createOrderOperateDto.getFatherOrderBean().getOid(), null, createOrderVo.getUnionPayCard());
return this.convertToCreatePrepayRequestDto(createOrderVo.getPartnerId()
, userLoginInfoDto.getWxAppId()
, userLoginInfoDto.getOpenId()
, createOrderVo.getFaceCode()
, createOrderVo.getCardCode()
, null
, createOrderOperateDto.getFatherOrderBean()
, createOrderOperateDto.getProductOrderBean()
, createOrderOperateDto.getTotalAmount() == null ? 0 : createOrderOperateDto.getTotalAmount()
, createOrderOperateDto.getCardAmount() == null ? 0 : createOrderOperateDto.getCardAmount()
, orderExtInfoDTO
, createOrderOperateDto.getFatherOrderBean().getOid()
, null
, createOrderVo.getUnionPayCard()
, createOrderVo.getShopId()
, createOrderVo.getOrderPayItemCreateReqList()
, createOrderVo.getCashAmount()
, createOrderVo.getSvcAmount());
}
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
,String transId
, OrderClientType orderClient
, CreateOrderVo.UnionPayCard unionPayCard
, String storeId
, List<OrderPayItemCreateReq> payItem
, BigDecimal cashAmount
, BigDecimal svcAmount){
CreatePrepayRequestDto requestDto = new CreatePrepayRequestDto();
requestDto.setPartnerId(partnerId);
requestDto.setWxAppId(wxAppId);
requestDto.setOpenId(openId);
requestDto.setFaceCode(faceCode);
requestDto.setCardCode(cardCode);
requestDto.setPayCode(payCode);
requestDto.setFatherOrderBean(fatherOrderBean);
requestDto.setProductOrderBean(productOrderBean);
requestDto.setTotalAmount(totalAmount);
requestDto.setCardAmount(cardAmount);
requestDto.setOrderExtInfoDTO(orderExtInfoDTO);
requestDto.setTransId(transId);
requestDto.setOrderClient(orderClient);
requestDto.setUnionPayCard(unionPayCard);
requestDto.setStoreId(storeId);
requestDto.setOrderPayItemCreateReqList(payItem);
requestDto.setCashAmount(cashAmount);
requestDto.setSvcAmount(svcAmount);
return requestDto;
}
/**
......@@ -3460,144 +3511,7 @@ public class OrderAdapter {
public static boolean isPayOfSVC(String payChannel) {
return StringUtils.isNotBlank(payChannel) && OrderAdapter.PAY_CODE_10102.equalsIgnoreCase(payChannel);
}
/**
* 支付信息转换
*/
public UnifiedOrderApplicationRequest convent2CombPayOrderRequest(List<OrderPayItemCreateReq> orderPayItemCreateReqList, QueryOrdersResponse.DataBean.OrderBean orderBean, PaymentRequest paymentRequest, Long amount, Integer cardAmount, String partnerPayOvertime) {
UnifiedOrderApplicationRequest orderPayDto = new UnifiedOrderApplicationRequest();
orderPayDto.setEbCode(paymentRequest.getPayCode());
orderPayDto.setPartnerId(orderBean.getCompanyId());
orderPayDto.setBody(paymentRequest.getPrincipalName());
orderPayDto.setNotifyUrl(paymentRequest.getReverseNotifyiDcUrl());
orderPayDto.setStoreId(orderBean.getShopId());
orderPayDto.setOpenId(paymentRequest.getOpenId());
String businessDate = com.freemud.application.sdk.api.util.DateUtil.convert2String(new Date(), "yyyyMMdd");
orderPayDto.setBusinessDate(businessDate);
orderPayDto.setAmount(amount);
orderPayDto.setUndisAmount(1L);
orderPayDto.setVipAmount(Long.valueOf(cardAmount));
orderPayDto.setAppId(paymentRequest.getWxAppId());
orderPayDto.setPayTimeOutTime(StringUtils.defaultIfBlank(partnerPayOvertime, "30"));
List<ProductVO> productVOS = new ArrayList<ProductVO>();
if (CollectionUtils.isNotEmpty(orderBean.getProductList())) {
orderBean.getProductList().forEach(orderProductBean -> {
ProductVO productBean = new ProductVO();
productBean.setId(orderProductBean.getProductId());
productBean.setQuantity(BigDecimal.valueOf(orderProductBean.getNumber()));
productBean.setSeq(orderProductBean.getSequence());
productBean.setSalesType("NORMAL");
productBean.setPrice(orderProductBean.getPrice());
productBean.setName(orderProductBean.getProductName());
productVOS.add(productBean);
});
}
orderPayDto.setProducts(productVOS);
orderPayDto.setPayCode(paymentRequest.getPayCode());
orderPayDto.setFoodOrderType(getFoodOrderType(orderBean.getOrderType()));
List<PayPlatformVO> platforms = new ArrayList<>();
if(null != orderPayItemCreateReqList && orderPayItemCreateReqList.size()>0){
orderPayItemCreateReqList.forEach(OrderPayItem -> {
PayPlatformVO payPlatformVO = new PayPlatformVO();
payPlatformVO.setAmount(OrderPayItem.getPayAmount().longValue());
payPlatformVO.setEbcode(getEbCode4PayOrderCenter(OrderPayItem.getPayChannelType()));
platforms.add(payPlatformVO);
});
}
orderPayDto.setPlatforms(platforms);
orderPayDto.setOutOrderNo(orderBean.getOid());
return orderPayDto;
}
public OrderPayResponse convent2OrderCombPayResponse(UnifiedOrderApiResponse unifiedOrderResponse) {
OrderPayResponse responseDto = new OrderPayResponse();
responseDto.setFmId(unifiedOrderResponse.getFmTradeNo());
responseDto.setMsg(unifiedOrderResponse.getMessage());
responseDto.setPayEbcode(unifiedOrderResponse.getEbCode());
responseDto.setPayId(unifiedOrderResponse.getPrepayId());
OrderPayResponse.PayOrderBean payBean = new OrderPayResponse.PayOrderBean();
payBean.setAppid(unifiedOrderResponse.getAppId());
payBean.setNonceStr(unifiedOrderResponse.getNonceStr());
payBean.setPackageX(unifiedOrderResponse.get_package());
payBean.setSign(unifiedOrderResponse.getPaySign());
payBean.setSignType(unifiedOrderResponse.getPaySignType());
payBean.setTimestamp(unifiedOrderResponse.getTimestamp());
payBean.setAliPayOrder(unifiedOrderResponse.getPayAccount());
responseDto.setPayOrder(payBean);
responseDto.setStatusCode(unifiedOrderResponse.getCode());
return responseDto;
}
/**
* @nots 基础服务映射,存储数据库用 payChannel 映射 payChannelType java类
* @param payChannelType
* @return
*/
public String getPayChannel4SharedOrder(Integer payChannelType) {
String payChannel = "" ;
switch (payChannelType) {
case 1:
payChannel = "10211";
break;
case 2:
payChannel ="10102";
break;
case 3:
payChannel = "10300";
break;
case 4:
payChannel = "10212";
break;
}
return payChannel;
}
/**
* @nots 基础支付
* @param payChannelType
* @return
*/
public String getEbCode4PayOrderCenter(String payChannelType) {
String ebCode = "" ;
switch (payChannelType) {
case "1":
ebCode = "10004";
break;
case "2":
ebCode = "10200";
break;
case "3":
ebCode = "10001";
break;
case "4":
ebCode = "";
break;
}
return ebCode;
}
/**
* @nots 基础支付
* @param payChannelType
* @return
*/
public String getPayChannelName(Integer payChannelType) {
String payChannelName = "" ;
switch (payChannelType) {
case 1:
payChannelName = "微信";
break;
case 2:
payChannelName = "svc卡支付";
break;
case 3:
payChannelName = "支付宝";
break;
case 4:
payChannelName = "混合支付";
break;
}
return payChannelName;
}
public List<AssortmentOpenPlatformPartnerWxappConfig> cacheSelectDefaultPage(String wxAppId, String type) {
if (!StringUtils.isEmpty(wxAppId) && !StringUtils.isEmpty(type)) {
String hashKey = "ecology:kgd:wxappconfig:open_platform_partner_wxapp_config:appkey_" + wxAppId;
......@@ -3641,4 +3555,136 @@ public class OrderAdapter {
activityUpdateStockRequest.setActivityList(CollectionUtils.isNotEmpty(activityList) ? activityList : null);
return activityUpdateStockRequest;
}
/**
* svc卡支付+现金支付
* @param cashAmount
* @param svcAmount
* @param payChannelType
* @return
*/
public List<OrderPayItemCreateReq> setOrderPayItem(BigDecimal cashAmount,BigDecimal svcAmount, Byte payChannelType){
List<OrderPayItemCreateReq> orderPayItemCreateReqs = new ArrayList<>(0);
OrderPayItemCreateReq orderPayItemCreateReqSvc = new OrderPayItemCreateReq();
//svc卡
orderPayItemCreateReqSvc.setPayAmount(svcAmount);
orderPayItemCreateReqSvc.setPayChannelType(PayChannelType.SVC.getIndex().intValue());
orderPayItemCreateReqSvc.setPayChannelName(PayChannelType.SVC.getName());
orderPayItemCreateReqSvc.setPayEbCode(PayChannelType.SVC.getEbcode());
orderPayItemCreateReqs.add(orderPayItemCreateReqSvc);
//现金支付
OrderPayItemCreateReq orderPayItemCreateReqOther = new OrderPayItemCreateReq();
orderPayItemCreateReqOther.setPayAmount(cashAmount);
orderPayItemCreateReqOther.setPayChannelType(PayChannelType.getByIndex(payChannelType).getIndex().intValue());
orderPayItemCreateReqOther.setPayChannelName(PayChannelType.getByIndex(payChannelType).getName());
orderPayItemCreateReqOther.setPayEbCode(PayChannelType.getByIndex(payChannelType).getEbcode());
orderPayItemCreateReqs.add(orderPayItemCreateReqOther);
return orderPayItemCreateReqs;
}
/**
* 混合支付预支付信息转换
* @param paymentRequest
* @param createPrepayRequestDto
* @param partnerPayOvertime
* @return
*/
public CombPayRequest convent2CombPayOrderRequest(PaymentRequest paymentRequest
, CreatePrepayRequestDto createPrepayRequestDto
, String partnerPayOvertime,String orderClient) {
CombPayRequest orderPayDto = new CombPayRequest();
orderPayDto.setEbCode(paymentRequest.getPayCode());
orderPayDto.setPartner_id(createPrepayRequestDto.getPartnerId());
orderPayDto.setBody(paymentRequest.getPrincipalName());
orderPayDto.setNotify_url(paymentRequest.getReverseNotifyiDcUrl());
orderPayDto.setStore_id(createPrepayRequestDto.getStoreId());
orderPayDto.setOpen_id(paymentRequest.getOpenId());
String businessDate = com.freemud.application.sdk.api.util.DateUtil.convert2String(new Date(), "yyyyMMdd");
orderPayDto.setBusiness_date(businessDate);
orderPayDto.setAmount(createPrepayRequestDto.getTotalAmount());
orderPayDto.setVip_amount(0L);
orderPayDto.setAppId(paymentRequest.getWxAppId());
orderPayDto.setPayCode(paymentRequest.getPayCode());
orderPayDto.setVer("V1");
orderPayDto.setPayTimeOutTime(StringUtils.defaultIfBlank(partnerPayOvertime, "30"));
List<ProductVO> productVOS = new ArrayList<ProductVO>();
if (CollectionUtils.isNotEmpty(createPrepayRequestDto.getFatherOrderBean().getProductList())) {
for (QueryOrdersResponse.DataBean.OrderBean.ProductBean product : createPrepayRequestDto.getFatherOrderBean().getProductList()) {
ProductVO productBean = new ProductVO();
productBean.setId(product.getProductId());
productBean.setQuantity(product.getNumber());
productBean.setSeq(product.getSequence());
productBean.setSalesType("NORMAL");
productBean.setPrice(product.getPrice());
productBean.setName(product.getProductName());
productVOS.add(productBean);
}
}
orderPayDto.setProducts(productVOS);
List<PayPlatformVO> platforms = new ArrayList<>();
if(null != createPrepayRequestDto.getOrderPayItemCreateReqList() && createPrepayRequestDto.getOrderPayItemCreateReqList().size()>0){
for (OrderPayItemCreateReq orderPayItemCreateReq : createPrepayRequestDto.getOrderPayItemCreateReqList()) {
PayPlatformVO payPlatformVO = new PayPlatformVO();
payPlatformVO.setAmount(orderPayItemCreateReq.getPayAmount().longValue());
payPlatformVO.setEbcode(orderPayItemCreateReq.getPayEbCode());
if (orderPayItemCreateReq.getPayEbCode().equals(PayChannelType.SVC.getEbcode())) {
payPlatformVO.setClientCode(orderPayItemCreateReq.getPayEbCode());
}
else if (orderPayItemCreateReq.getPayEbCode().equals(PayChannelType.WECHAT.getEbcode())) {
payPlatformVO.setClientCode(orderClient);
}
else if (orderPayItemCreateReq.getPayEbCode().equals(PayChannelType.ALIPAY.getEbcode())) {
payPlatformVO.setClientCode(orderClient);
}
platforms.add(payPlatformVO);
}
}
orderPayDto.setPlatforms(platforms);
orderPayDto.setOut_order_no(createPrepayRequestDto.getFatherOrderBean().getOid());
orderPayDto.setCardCode(createPrepayRequestDto.getCardCode());
return orderPayDto;
}
/**
* 混合支付返回的支付参数
* @param payPlatforms
* @return
*/
public OrderPayResponse convent2OrderCombPayResponse(List<CombPayResponse.PayPlatform> payPlatforms,String partnerId) {
CombPayResponse.PayPlatform payPlatform = payPlatforms
.stream()
.filter(f -> !PayChannelType.SVC.getEbcode().equals(f.getEbCode())).findFirst()
.orElse(null);
OrderPayResponse responseDto = new OrderPayResponse();
responseDto.setMsg("succ");
responseDto.setPayEbcode(payPlatform.getEbCode());
responseDto.setPayId("");
OrderPayResponse.PayOrderBean payBean = new OrderPayResponse.PayOrderBean();
responseDto.setPayTransId(payPlatform.getTransId());
responseDto.setFmId(payPlatform.getFmTradeNo());
CombPayResponse.PayPlatform.PayOrderBean payOrderBean = payPlatform.getPayOrder();
if (null != payOrderBean) {
payBean.setAppid(payOrderBean.getAppId());
payBean.setNonceStr(payOrderBean.getNonceStr());
payBean.setPackageX(payOrderBean.getPackageX());
payBean.setSign(payOrderBean.getPaySign());
payBean.setSignType(payOrderBean.getSignType());
payBean.setTimestamp(payOrderBean.getTimeStamp());
payBean.setAliPayOrder(payOrderBean.getAliPayOrder());
responseDto.setPayOrder(payBean);
}
//供修改订单
for (CombPayResponse.PayPlatform pt : payPlatforms) {
PayItem payItem = new PayItem();
payItem.setFmTradeNo(pt.getFmTradeNo());
payItem.setPayChannelType(PayChannelType.getByEbcode(pt.getEbCode()).getIndex().intValue());
payItem.setTransId(pt.getTransId());
payItem.setPartnerId(partnerId);
responseDto.getPayItem().add(payItem);
}
return responseDto;
}
}
......@@ -17,6 +17,7 @@ public class ResponseCodeConstant {
// 电子风味卡,密码错误或者余额不足,需要特殊处理
public final static String PASSWORD_WRONG = "8200407";
public final static String NOT_SUFFICIENT_FUND = "8200407";
public final static Integer PAYMENT_RESPONSE_SUCCESS = 200;
private final static Set<Object> successResponseCodeSet = new HashSet<>();
......
......@@ -7,6 +7,7 @@ import com.freemud.application.sdk.api.ordercenter.request.create.OrderPayItemCr
import com.freemud.sdk.api.assortment.order.response.order.QueryOrdersResponse;
import lombok.Data;
import java.math.BigDecimal;
import java.util.List;
@Data
......@@ -72,4 +73,13 @@ public class CreatePrepayRequestDto {
private CreateOrderVo.UnionPayCard unionPayCard;
private List<OrderPayItemCreateReq> orderPayItemCreateReqList;
/**
* svc支付金额
*/
private BigDecimal svcAmount;
/**
* 现金支付金额
*/
private BigDecimal cashAmount;
private String storeId;
}
/**
* All rights Reserved, Designed By www.freemud.cn
*
* @Title: OrderPayResponseDto
* @Package cn.freemud.entities.dto
* @Description:
* @author: liming.guo
* @date: 2018/5/25 17:10
* @version V1.0
* @Copyright: 2018 www.freemud.cn Inc. All rights reserved.
* 注意:本内容仅限于上海非码科技内部传阅,禁止外泄以及用于其他的商业目
*/
package cn.freemud.entities.dto.pay;
import com.fasterxml.jackson.annotation.JsonProperty;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;
import java.util.List;
@NoArgsConstructor
@Data
@ToString
public class CombPayResponse {
private int code;
@ApiModelProperty(value = "提示信息")
private String msg;
private PayPlatforms data;
@Data
public static class PayPlatforms {
private List<PayPlatform> payPlatformResponseList;
}
@Data
static public class PayPlatform {
@ApiModelProperty(value = "app_id编号(微信使用)")
private String appId;
@ApiModelProperty(value = "支付渠道编号")
private String ebCode;
@ApiModelProperty(value = "非码交易流水号")
private String fmTradeNo;
@ApiModelProperty(value = "随机字符串(微信使用)")
private String nonceStr;
@ApiModelProperty(value = "外部交易流水号,由上游系统生成,需保证唯一")
private String outOrderNo;
@ApiModelProperty(value = "支付帐号")
private String payAccount;
@ApiModelProperty(value = "第三方支付交易序号")
private String platformTradeNo;
@ApiModelProperty(value = "间联单号")
private String transId;
@ApiModelProperty(value = "")
private PayOrderBean payOrder;
@Data
public static class PayOrderBean {
/**
* appid : wx3ab08e23966343fe
* package : prepay_id=wx25143630149413bcd9fbad100070370076
* nonce_str : -610630281
* sign : D320B2B74D858EBE16841F43AE70E757
* timestamp : 1527230190
* signType : MD5
*/
private String appId;
@JsonProperty("package")
private String packageX;
//@JsonProperty("nonce_str")
private String nonceStr;
/**
* 支付签名
*/
private String paySign;
private String timeStamp;
/**
* 加密方式
*/
private String signType;
private String aliPayOrder;
}
}
}
......@@ -14,10 +14,8 @@ package cn.freemud.entities.vo;
import cn.freemud.entities.dto.UserDeliveryInfoDto;
import io.swagger.annotations.ApiModel;
import com.freemud.application.sdk.api.ordercenter.request.create.OrderPayItemCreateReq;
import io.swagger.annotations.ApiModelProperty;
import cn.freemud.entities.dto.delivery.WeixinDeliveryAddressDto;
import io.swagger.annotations.ApiModelProperty;
import lombok.Builder;
import lombok.Data;
import org.hibernate.validator.constraints.NotEmpty;
......@@ -25,7 +23,6 @@ import org.hibernate.validator.constraints.NotEmpty;
import javax.validation.Valid;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Pattern;
import java.util.ArrayList;
import java.util.List;
......
......@@ -12,7 +12,7 @@
*/
package cn.freemud.service.impl;
import cn.freemud.base.constant.Version;
import cn.freemud.adapter.OrderAdapter;
import cn.freemud.base.util.DateUtil;
import cn.freemud.constant.ResponseCodeConstant;
import cn.freemud.constant.StoreConstant;
......@@ -21,19 +21,14 @@ import cn.freemud.entities.dto.order.BusinessDate;
import cn.freemud.entities.dto.shoppingCart.GetShoppingCartGoodsApportionDto;
import cn.freemud.entities.dto.shoppingCart.ShoppingCartGoodsDto;
import cn.freemud.entities.vo.*;
import cn.freemud.enums.CouponFlag;
import cn.freemud.enums.CreateOrderType;
import cn.freemud.enums.ResponseResult;
import cn.freemud.enums.*;
import cn.freemud.interceptor.ServiceException;
import cn.freemud.manager.StoreTableNumberManager;
import cn.freemud.service.CouponService;
import cn.freemud.service.adapter.OrderCheckAdapter;
import cn.freemud.service.thirdparty.ShoppingCartClient;
import cn.freemud.service.thirdparty.StockClient;
import cn.freemud.utils.LogUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.TypeReference;
import com.freemud.api.assortment.datamanager.entity.db.AssortmentOpenPlatformIappWxappConfig;
import com.freemud.api.assortment.datamanager.entity.db.AssortmentOpenPlatformPartnerStoreDeliveryConfig;
import com.freemud.api.assortment.datamanager.entity.vo.AssortmentCustomerInfoVo;
......@@ -41,7 +36,6 @@ import com.freemud.api.assortment.datamanager.manager.AssortmentOpenPlatformIapp
import com.freemud.api.assortment.datamanager.manager.AssortmentOpenPlatformPartnerStoreDeliveryConfigManager;
import com.freemud.api.assortment.datamanager.manager.customer.AssortmentCustomerInfoManager;
import com.freemud.application.sdk.api.base.BaseResponse;
import com.freemud.application.sdk.api.couponcenter.offline.response.CouponQueryResponse;
import com.freemud.application.sdk.api.log.LogThreadLocal;
import com.freemud.application.sdk.api.membercenter.request.QueryReceiveAddressRequest;
import com.freemud.application.sdk.api.membercenter.request.StatisticalPropertyRequest;
......@@ -49,12 +43,15 @@ import com.freemud.application.sdk.api.membercenter.response.GetSvcInfoByMemberI
import com.freemud.application.sdk.api.membercenter.response.QueryReceiveAddressResponse;
import com.freemud.application.sdk.api.membercenter.service.MemberCenterService;
import com.freemud.application.sdk.api.membercenter.service.MemberPropertyService;
import com.freemud.application.sdk.api.ordercenter.enums.PayChannelType;
import com.freemud.application.sdk.api.paymentcenter.client.request.SVCCardAmountRequest;
import com.freemud.application.sdk.api.paymentcenter.client.response.SVCCardAmountResponse;
import com.freemud.application.sdk.api.paymentcenter.client.service.PaymentNewService;
import com.freemud.application.sdk.api.storecenter.request.QueryDeliveryRequest;
import com.freemud.application.sdk.api.storecenter.request.StoreInfoRequest;
import com.freemud.application.sdk.api.storecenter.response.QueryDeliverDetailResponse;
import com.freemud.application.sdk.api.storecenter.response.StoreResponse;
import com.freemud.application.sdk.api.storecenter.service.StoreCenterService;
import cn.freemud.enums.CouponReqTypeEnum;
import com.google.common.collect.Lists;
import com.google.gson.Gson;
import org.apache.commons.collections4.CollectionUtils;
......@@ -65,6 +62,7 @@ import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import java.awt.geom.Point2D;
import java.math.BigDecimal;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;
......@@ -103,14 +101,15 @@ public class CheckOrder {
// private OrderAdapter orderAdapter;
@Autowired
private StoreServiceImpl storeService;
@Autowired
private StockClient stockClient;
@Autowired
private ItemServiceImpl itemService;
@Autowired
private CouponService couponService;
private static Gson gson = new Gson();
@Autowired
private PaymentNewService paymentNewService;
@Autowired
private OrderAdapter orderAdapter;
/**
* 下单会员相关校验
*/
......@@ -738,4 +737,43 @@ public class CheckOrder {
// }
}
/**
* 混合支付
* @param createOrderVo
* @param shoppingCartGoodsDto
* @param trackingNo
* @return
*/
public boolean checkSvcPay(CreateOrderVo createOrderVo,ShoppingCartGoodsDto shoppingCartGoodsDto,String trackingNo) {
if (StringUtils.isBlank(createOrderVo.getCardCode())) {
return false;
}
SVCCardAmountRequest request = new SVCCardAmountRequest();
request.setPartnerId(createOrderVo.getPartnerId());
request.setCardCodes(Arrays.asList(createOrderVo.getCardCode()));
BaseResponse<SVCCardAmountResponse> svcCardAmount = paymentNewService.querySVCCardAmount(request, trackingNo);
if (svcCardAmount==null || svcCardAmount.getData()==null ||!ResponseResult.SUCCESS.getCode().equals(svcCardAmount.getCode())) {
throw new ServiceException(ResponseResult.USER_SVC_CARD_ERROR);
}
Integer svcAmount = 0 ;
Integer svcVAmount = 0 ;
Long totalVAmount = shoppingCartGoodsDto.getTotalAmount();
if (svcCardAmount.getData().getData().getCardSimpleInfos().size()>0) {
svcAmount = svcCardAmount.getData().getData().getCardSimpleInfos().get(0).getAmount();
svcVAmount = svcCardAmount.getData().getData().getCardSimpleInfos().get(0).getVamount();
//todo : svc卡的金额小于订单金额
if(svcAmount + svcVAmount >0 && totalVAmount> svcAmount + svcVAmount){
BigDecimal total = new BigDecimal(totalVAmount);
BigDecimal svcAmounts = new BigDecimal(svcAmount + svcVAmount);
BigDecimal cashAmout = total.subtract(svcAmounts);
createOrderVo.setOrderPayItemCreateReqList(orderAdapter.setOrderPayItem(cashAmout,svcAmounts,Byte.parseByte(createOrderVo.getChannel())));
createOrderVo.setPayChannelType(PayChannelType.COMB.getIndex());
createOrderVo.setCashAmount(cashAmout);
createOrderVo.setSvcAmount(svcAmounts);
return true;
}
}
return false;
}
}
......@@ -214,8 +214,8 @@ public class OrderAdapterServiceImpl implements OrderAdapterService {
}
try {
ConfirmOrderDto confirmOrderDto = orderAdapter.convent2ConfirmOrderDto(message);
// 通过交易号从缓存中拿订单号,如果有数据则实际订单号为其value值
String orderId = redisCache.getValue(RedisUtil.getPaymentTransIdOrderKey(confirmOrderDto.getOrderId()));
// 蜜雪+混合支付专用:通过交易号从缓存中拿订单号,如果有数据则实际订单号为其value值
String orderId = redisCache.getValue(RedisUtil.getPaymentTransIdOrderKey(message.getTrans_id()));
if (StringUtils.isNotBlank(orderId)) {
log.info("从缓存中获取的订单数据,trackingNo:{},transId:{},orderId:{}", LogTreadLocal.getTrackingNo(), confirmOrderDto.getOrderId(), orderId);
confirmOrderDto.setOrderId(orderId);
......
......@@ -37,6 +37,7 @@ import cn.freemud.entities.dto.order.CreateOrderOperateDto;
import cn.freemud.entities.dto.order.CreatePrepayRequestDto;
import cn.freemud.entities.dto.order.FacePayRequestDto;
import cn.freemud.entities.dto.order.FacePayResponseDto;
import cn.freemud.entities.dto.pay.CombPayResponse;
import cn.freemud.entities.dto.product.AttributeValue;
import cn.freemud.entities.dto.product.GroupDetail;
import cn.freemud.entities.dto.product.ProductAttributeGroup;
......@@ -48,10 +49,7 @@ import cn.freemud.enums.*;
import cn.freemud.interceptor.ServiceException;
import cn.freemud.management.thirdparty.MulitiPaymentClient;
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.*;
import cn.freemud.service.thirdparty.*;
import cn.freemud.utils.*;
import com.alibaba.fastjson.JSON;
......@@ -79,6 +77,7 @@ import com.freemud.application.sdk.api.log.ErrorLog;
import com.freemud.application.sdk.api.log.LogThreadLocal;
import com.freemud.application.sdk.api.ordercenter.enums.AfterSalesType;
import com.freemud.application.sdk.api.ordercenter.enums.OrderClientType;
import com.freemud.application.sdk.api.ordercenter.enums.PayChannelType;
import com.freemud.application.sdk.api.ordercenter.request.OrderConditionsReq;
import com.freemud.application.sdk.api.ordercenter.request.OrderExtInfoDto;
import com.freemud.application.sdk.api.ordercenter.request.OrderExtendedReq;
......@@ -112,6 +111,7 @@ import com.freemud.sdk.api.assortment.message.service.IMessageTemplatePushServic
import com.freemud.sdk.api.assortment.order.adapter.OrderSdkAdapter;
import com.freemud.sdk.api.assortment.order.enums.OldOrderStatus;
import com.freemud.sdk.api.assortment.order.request.order.*;
import com.freemud.sdk.api.assortment.order.request.payment.CombPayRequest;
import com.freemud.sdk.api.assortment.order.request.payment.UnifiedOrderApplicationRequest;
import com.freemud.sdk.api.assortment.order.response.order.*;
import com.freemud.sdk.api.assortment.order.response.payment.OrderPayResponse;
......@@ -155,12 +155,14 @@ import java.util.function.Function;
import java.util.stream.Collectors;
import static cn.freemud.constant.OrderRefundConstant.ALLOW_REFUND;
import static com.freemud.sdk.api.assortment.order.domain.ResponseCodeConstant.RESPONSE_SUCCESS_STR;
@Service
@Slf4j
public class OrderServiceImpl implements Orderservice {
private final Integer RESPONSE_SUCCESS_CODE = 100;
private static Gson gson = new Gson();
@Value("${saas.reverseNotifyiDcUrl}")
......@@ -267,6 +269,14 @@ public class OrderServiceImpl implements Orderservice {
@Autowired
private PaymentApplicationClient paymentApplicationClient;
@Autowired
private CustomerExtendClient extendClient;
@Autowired
private ComPayClient comPayClient;
@Autowired
private AssortmentOpenPlatformIappWxappStoreManager assortmentOpenPlatformIappWxappStoreManager;
@Override
public BaseResponse checkBeforeCreateOrder(CheckBeforeCreateOrderRequestVo requestVo) {
String trackingNo = LogTreadLocal.getTrackingNo();
......@@ -324,23 +334,23 @@ public class OrderServiceImpl implements Orderservice {
// 查询小程序自提外卖配置信息 校验当前订单类型的下单参数 校验外卖是否满足起送条件
Integer pushOrderTime = checkOrder.checkOrderByOrderType(createOrderVo, userLoginInfoDto, storeResponseDto, shoppingCartGoodsDto, trackingNo);
OrderExtInfoDto extInfo = getExtInfo(userLoginInfoDto, storeResponseDto, pushOrderTime, createOrderVo, shoppingCartGoodsDto);
boolean svcPay = checkOrder.checkSvcPay(createOrderVo, shoppingCartGoodsDto, trackingNo);
//1.9.2套餐需求同步优化创建订单代码
BaseResponse createOrderOperateDtoResponse = this.sdkCreateOrder(createOrderVo, storeResponseDto, shoppingCartGoodsDto, userLoginInfoDto);
if(createOrderOperateDtoResponse == null || !ResponseResult.SUCCESS.getCode().equals(createOrderOperateDtoResponse.getCode()) || createOrderOperateDtoResponse.getResult() == null ) {
return createOrderOperateDtoResponse;
}
CreateOrderOperateDto createOrderOperateDto = (CreateOrderOperateDto)createOrderOperateDtoResponse.getResult();
//创建支付 ,混合支付走单独的逻辑,其他的都单独逻辑
//创建支付
CreatePrepayRequestDto createPrepayRequestDto = orderAdapter.convertToCreatePrepayRequestDto(userLoginInfoDto, createOrderVo, createOrderOperateDto, extInfo);
if(null != createOrderVo.getPayChannelType() && createOrderVo.getPayChannelType().equals(PayChannelType.COMB.getIndex())) {
log.info("createCombpayOrder {}" + JsonUtil.toJSONString(createPrepayRequestDto));
createPrepayRequestDto.setOrderPayItemCreateReqList(createOrderVo.getOrderPayItemCreateReqList());
createPrepayRequestDto.setPayCode(createOrderVo.getPayChannelType().toString());
if (svcPay) {
return this.createCombpayOrder(createPrepayRequestDto);
}else{
log.info("createPrepayOrder {}" + JsonUtil.toJSONString(createPrepayRequestDto));
}
else {
return this.createPrepayOrder(createPrepayRequestDto);
}
}
/**
......@@ -384,9 +394,29 @@ public class OrderServiceImpl implements Orderservice {
} catch (Exception e) {
log.info("paymentQueueService.paymentCallback" + dto + " error" + e);
}
}
/**
* 获取预支付成功,将信息放入死心队列,当支付成功没有回掉的时候处理
*
* @param partnerId
* @param storeId
* @param fmId
* @param orderId
*/
public void putDelMq(String partnerId, String storeId, String fmId, String orderId,Integer payChanelType) {
PaymentMqMessageDto dto = new PaymentMqMessageDto();
try {
dto.setFmId(fmId);
dto.setOrderId(orderId);
dto.setPartnerId(partnerId);
dto.setStoreId(storeId);
dto.setPayChannelType(payChanelType);
dto.setTrackingNo(LogThreadLocal.getTrackingNo());
paymentQueueService.paymentCallback(dto);
} catch (Exception e) {
log.info("paymentQueueService.paymentCallback" + dto + " error" + e);
}
}
@Override
public String paySuccessCallback(PaysuccessNoticeMessage message, ConfirmOrderDto confirmOrderDto, Map<String, QueryOrdersResponseDto.DataBean.OrderBean> orderBeans) {
OrderBean orderBean = orderBeans.get(OrderBeanType.SAASORDER.getCode());
......@@ -550,7 +580,6 @@ public class OrderServiceImpl implements Orderservice {
/**
* 开通会员卡
*
* @param partnerId 商户号
* @param ruleId 会员规则ID
* @param oid 订单号
......@@ -2416,7 +2445,6 @@ 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, String transId, String partnerPayOvertime) {
public OrderPayResponse getPreOrderPay(QueryOrdersResponse.DataBean.OrderBean orderBean, PaymentRequest paymentRequest, String trackingNo, Integer cardAmount, String transId, String partnerPayOvertime, OrderExtInfoDto orderExtInfoDto) {
OrderPayResponse orderPayResponse;
try {
......@@ -2619,6 +2647,12 @@ public class OrderServiceImpl implements Orderservice {
JSONObject.toJSONString(orderExtInfo));
orderEditRequest.setOrderId(orderBean.getOid());
orderEditRequest.setTrackingNo(trackingNo);
/**
* 混合支付项
*/
if (CollectionUtils.isNotEmpty(orderPayResponse.getPayItem())) {
orderEditRequest.setOrderPayItem(orderPayResponse.getPayItem());
}
BaseOrderResponse baseOrderResponse = orderCenterSdkService.orderEdit(orderEditRequest);
if (!ObjectUtils.equals(ResponseCodeConstant.RESPONSE_SUCCESS, baseOrderResponse.getErrcode())) {
CancelOrderRequest cancelOrderRequest = orderAdapter.convent2CancelOrderRequest(orderBean.getOid(), orderBean.getCompanyId(),
......@@ -3027,6 +3061,21 @@ public class OrderServiceImpl implements Orderservice {
}
/**
* 获取商户支付超时时间
* @param partnerId 商户Id
* @return 超时时间
*/
private String getPartnerPayOvertime(String partnerId) {
return Optional.ofNullable(openPlatformPartnerConfigManager.selectPartnerConfigByPartnerKey(partnerId, RedisKeyConstant.PARTNER_PAY_OVERTIME))
.orElseGet(() -> {
AssortmentOpenPlatformPartnerConfig config = new AssortmentOpenPlatformPartnerConfig();
config.setPartnerValue("30");
openPlatformPartnerConfigManager.addPartnerConfig(partnerId, RedisKeyConstant.PARTNER_PAY_OVERTIME, config);
return config;
}).getPartnerValue();
}
/**
* 催单
* @param reminderVo
* @return
......@@ -3104,49 +3153,49 @@ public class OrderServiceImpl implements Orderservice {
}
return mealCodeRule;
}
/**
* 获取商户支付超时时间
* @param partnerId 商户Id
* @return 超时时间
*/
private String getPartnerPayOvertime(String partnerId) {
return Optional.ofNullable(openPlatformPartnerConfigManager.selectPartnerConfigByPartnerKey(partnerId, RedisKeyConstant.PARTNER_PAY_OVERTIME))
.orElseGet(() -> {
AssortmentOpenPlatformPartnerConfig config = new AssortmentOpenPlatformPartnerConfig();
config.setPartnerValue("30");
openPlatformPartnerConfigManager.addPartnerConfig(partnerId, RedisKeyConstant.PARTNER_PAY_OVERTIME, config);
return config;
}).getPartnerValue();
}
/**
* 创建预支付订单
* 创建混合支付预支付
*/
public BaseResponse createCombpayOrder(CreatePrepayRequestDto createPrepayRequestDto) {
CreateOrderResponseVo createOrderResponse;
OrderPayResponse orderPayResponse = null;
PaymentRequest paymentRequest = orderBodyConvertToPaymentBody(createPrepayRequestDto.getOpenId(), createPrepayRequestDto.getPartnerId(), createPrepayRequestDto.getWxAppId(), createPrepayRequestDto.getPayCode());
PaymentRequest paymentRequest = orderBodyConvertToPaymentBody(createPrepayRequestDto.getOpenId()
, createPrepayRequestDto.getPartnerId()
, createPrepayRequestDto.getWxAppId()
, null);
long totalAmount = createPrepayRequestDto.getTotalAmount();
String cardCode = createPrepayRequestDto.getCardCode();
if (totalAmount < 0) {
throw new ServiceException(ResponseResult.PAY_AMOUNT_ERROR);
}else{
String partnerPayOvertime = this.getPartnerPayOvertime(createPrepayRequestDto.getPartnerId());
orderPayResponse = comPayOrder(createPrepayRequestDto.getOrderPayItemCreateReqList(),createPrepayRequestDto.getFatherOrderBean(), paymentRequest, LogThreadLocal.getTrackingNo(),createPrepayRequestDto.getCardAmount(),partnerPayOvertime);
}
String partnerPayOvertime = this.getPartnerPayOvertime(createPrepayRequestDto.getPartnerId());
orderPayResponse = comPayOrder(paymentRequest,createPrepayRequestDto,partnerPayOvertime,LogThreadLocal.getTrackingNo());
if (orderPayResponse == null || Objects.isNull(orderPayResponse.getFmId())) {
return failPreOrderPay(LogThreadLocal.getTrackingNo(), createPrepayRequestDto.getProductOrderBean(), cardCode, createPrepayRequestDto.getOrderClient(),
Objects.isNull(orderPayResponse) ? null : orderPayResponse.getMsg());
return failPreOrderPay(LogThreadLocal.getTrackingNo()
, createPrepayRequestDto.getProductOrderBean()
, cardCode
, createPrepayRequestDto.getOrderClient()
, Objects.isNull(orderPayResponse) ? null : orderPayResponse.getMsg());
}
createOrderResponse = orderAdapter.convent2CreateFatherSonOrderResponseVo(orderPayResponse, createPrepayRequestDto.getProductOrderBean());
BaseResponse baseEditResponse = this.updateOrderInfo(orderPayResponse, createPrepayRequestDto.getOrderExtInfoDTO(), createPrepayRequestDto.getProductOrderBean(), LogThreadLocal.getTrackingNo());
if (baseEditResponse != null) {
return baseEditResponse;
}
/*
if (totalAmount > 0 && StringUtils.isBlank(cardCode)) {
createOrderResponse.setPaySuccess(false);
} else {
createOrderResponse.setPaySuccess(true);
}
*/
createOrderResponse.setPaySuccess(false);
// 推荐优惠插件用户下单数据上报
if (!createOrderResponse.getPaySuccess()) {
return ResponseUtil.success(createOrderResponse);
......@@ -3165,31 +3214,97 @@ public class OrderServiceImpl implements Orderservice {
}
}
public OrderPayResponse comPayOrder(List<OrderPayItemCreateReq> orderPayItemCreateReqList, QueryOrdersResponse.DataBean.OrderBean orderBean, PaymentRequest paymentRequest, String trackingNo, Integer cardAmount, String partnerPayOvertime) {
/**
* 创建混合支付
* @param paymentRequest
* @param createPrepayRequestDto
* @param partnerPayOvertime
* @return
*/
private OrderPayResponse comPayOrder(PaymentRequest paymentRequest
, CreatePrepayRequestDto createPrepayRequestDto
, String partnerPayOvertime
, String trackingNo) {
OrderPayResponse orderPayResponse;
OrderPayResponse orderPayResponse = null;
CombPayResponse responseBase = null;
CombPayRequest combPayRequest = null;
CombPayResponse.PayPlatform payPlatform = null;
try {
//微信或者支付宝支付
UnifiedOrderApplicationRequest request = orderAdapter.convent2CombPayOrderRequest(orderPayItemCreateReqList,orderBean, paymentRequest, orderBean.getAmount(), cardAmount, partnerPayOvertime);
UnifiedOrderApiResponse responseBase = paymentApplicationClient.unifiedOrder(request,orderBean.getCompanyId());
if (!ResponseCodeConstant.RESPONSE_SUCCESS.equals(responseBase.getCode())) {
log.error("混合支付返回信息错误,trackingNo:{} request:{} response:{}", trackingNo, JSONObject.toJSONString(request), JSONObject.toJSONString(responseBase));
String orderClient = this.getPayCodeByChanel(createPrepayRequestDto);
if (StringUtils.isBlank(orderClient)) {
orderPayResponse = new OrderPayResponse();
orderPayResponse.setMsg(responseBase.getMessage());
} else {
putDelMq(request.getPartnerId(), request.getStoreId(), responseBase.getFmTradeNo(), orderBean.getOid());
orderPayResponse = orderAdapter.convent2OrderCombPayResponse(responseBase);
orderPayResponse.setWxAppid(paymentRequest.getWxAppId());
orderPayResponse.setMsg("渠道码没有配置");
return orderPayResponse;
}
combPayRequest = orderAdapter.convent2CombPayOrderRequest(paymentRequest,createPrepayRequestDto,partnerPayOvertime,orderClient);
responseBase = comPayClient.combPay(combPayRequest,combPayRequest.getPartner_id());
if (!ResponseCodeConstant.PAYMENT_RESPONSE_SUCCESS.equals(responseBase.getCode())|| responseBase.getData().getPayPlatformResponseList().size()==0) {
log.info("混合支付返回信息错误,trackingNo:{} request:{} response:{}",trackingNo, JSONObject.toJSONString(combPayRequest), JSONObject.toJSONString(responseBase));
orderPayResponse = new OrderPayResponse();
orderPayResponse.setMsg(responseBase.getMsg());
}
else {
/**
* 生成预支付参数
*/
payPlatform = responseBase.getData().getPayPlatformResponseList()
.stream()
.filter(f -> !PayChannelType.SVC.getEbcode().equals(f.getEbCode())).findFirst()
.orElse(null);
if(payPlatform==null) {
orderPayResponse = new OrderPayResponse();
orderPayResponse.setMsg("提取现金支付失败");
}
else {
orderPayResponse = orderAdapter.convent2OrderCombPayResponse(responseBase.getData().getPayPlatformResponseList(),createPrepayRequestDto.getPartnerId());
orderPayResponse.setOpenId(paymentRequest.getOpenId());
orderPayResponse.setPartnerId(orderBean.getCompanyId());
orderPayResponse.setOrderId(orderBean.getOid());
orderPayResponse.setWxAppid(paymentRequest.getWxAppId());
orderPayResponse.setPartnerId(createPrepayRequestDto.getPartnerId());
orderPayResponse.setOrderId(createPrepayRequestDto.getTransId());
//隐射关系
redisCache.save(RedisUtil.getPaymentTransIdSequenceKey(payPlatform.getTransId()),createPrepayRequestDto.getTransId(),1L,TimeUnit.DAYS);
//加入轮训队列
putDelMq(createPrepayRequestDto.getPartnerId()
, createPrepayRequestDto.getStoreId()
, orderPayResponse.getFmId()
, createPrepayRequestDto.getTransId()
, PayChannelType.getByEbcode(payPlatform.getEbCode()).getIndex().intValue());
}
} catch (Exception e) {
LogUtil.error("comPay_error", JSONObject.toJSONString(orderBean), JSONObject.toJSONString(paymentRequest));
}
}
catch (Exception e) {
//TODO 邮件告警
LogUtil.error("comPay_error", JSONObject.toJSONString(responseBase), JSONObject.toJSONString(paymentRequest), e);
orderPayResponse = new OrderPayResponse();
orderPayResponse.setMsg("comPay_error");
}
return orderPayResponse;
}
/**
* 通过payCode ->clientCode
* @param createPrepayRequestDto
* @return
*/
private String getPayCodeByChanel(CreatePrepayRequestDto createPrepayRequestDto) {
if (CollectionUtils.isEmpty(createPrepayRequestDto.getOrderPayItemCreateReqList())) return "";
OrderPayItemCreateReq payItem = createPrepayRequestDto.getOrderPayItemCreateReqList()
.stream()
.filter(d -> !d.getPayEbCode().equals(PayChannelType.SVC.getEbcode()))
.findFirst()
.orElse(null);
if (payItem == null) return "";
AssortmentOpenPlatformIappWxappStore wxAppStore = assortmentOpenPlatformIappWxappStoreManager.selectWxappStoreByWxAppIdAndStoreId(createPrepayRequestDto.getWxAppId()
, createPrepayRequestDto.getStoreId()
, payItem.getPayEbCode());
if (StringUtils.isNotBlank(wxAppStore.getClientCode())) {
return wxAppStore.getClientCode();
}
return "";
}
}
/**
* All rights Reserved, Designed By www.freemud.cn
*
* @Title: PaymentClient
* @Package cn.freemud.service.thirdparty
* @Description: 支付服务
* @author: liming.guo
* @date: 2018/5/12519:24
* @version V1.0
* @Copyright: 2018 www.freemud.cn Inc. All rights reserved.
* 注意:本内容仅限于上海非码科技内部传阅,禁止外泄以及用于其他的商业目
*/
package cn.freemud.service.thirdparty;
import cn.freemud.entities.dto.pay.CombPayResponse;
import com.freemud.sdk.api.assortment.order.request.payment.CombPayRequest;
import org.springframework.cloud.netflix.feign.FeignClient;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RequestMapping;
@FeignClient(name = "payment-center-application-api",url="${saas.paymentcenter.application.api.feign.url}")
@RequestMapping(produces = {"application/json;charset=UTF-8"})
public interface ComPayClient {
/**
* 统一下单
*/
@PostMapping("/payment/application/pay")
CombPayResponse combPay(@RequestBody CombPayRequest combPayRequest, @RequestHeader("partnerId") String partnerId);
}
package com.freemud.application.sdk.api.ordercenter.entities;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* All rights Reserved, Designed By www.freemud.cn
*
* @Title: com.freemud.application.sdk.api.ordercenter.entities PayItem
* @Description: TDO 描述....
* @author: 铁牌灵魂工程师
* @date: 2020/11/7
* @Copyright: www.freemud.cn Inc. All rights reserved.
* 注意:本内容仅限于上海非码科技内部传阅,禁止外泄以及用于其他的商业目
*/
@NoArgsConstructor
@Data
public class PayItem {
private String partnerId;
private String fmTradeNo;
private Integer payChannelType;
private String transId;
}
package com.freemud.application.sdk.api.ordercenter.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
@Getter
@AllArgsConstructor
public enum PayChannelType {
WECHAT((byte)1,"10211","微信"),
ALIPAY((byte)2,"10300","支付宝"),
SVC((byte)3,"10102","储值卡"),
COMB((byte)4,"10212","混合支付"),
USVCP((byte)5,"10556", "电子风味卡支付");
private Byte index;
private String ebcode;
private String name;
public static final String API_DESC = "订单支付渠道类型 1:微信 2:储值卡 3:支付宝 4:混合支付,5:电子风味卡支付";
public static PayChannelType getByIndex(byte index) {
for (PayChannelType payType : values()) {
if (payType.getIndex().equals(index)) {
return payType;
}
}
return null;
}
public static PayChannelType getByEbcode(String ebcode) {
for (PayChannelType payType : values()) {
if (payType.getEbcode().equals(ebcode)) {
return payType;
}
}
return null;
}
}
......@@ -12,8 +12,11 @@
*/
package com.freemud.application.sdk.api.ordercenter.request;
import com.freemud.application.sdk.api.ordercenter.entities.PayItem;
import lombok.Data;
import java.util.List;
@Data
public class UpdateOrderReq {
......@@ -24,5 +27,6 @@ public class UpdateOrderReq {
private String extInfo;
private Integer orderClient;
private List<PayItem> orderPayItem;
}
......@@ -214,6 +214,6 @@ public class CreateOrderRequest extends BaseRequest {
private String appId;
private Byte payChannelType;
private List<OrderPayItemCreateReq> orderPayItemCreateReqList;
}
package com.freemud.application.sdk.api.ordercenter.request.create;
import lombok.Data;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
import org.springframework.format.annotation.DateTimeFormat;
import java.math.BigDecimal;
import java.util.Date;
@Data
public class OrderPayItemCreateReq {
......@@ -21,9 +16,13 @@ public class OrderPayItemCreateReq {
private String storeId;
private String payChannelType;
private Integer payChannelType;
private String payChannelName;
/**
* 支付渠道码
*/
private String payEbCode;
private String operator;
......
......@@ -13,7 +13,6 @@
package com.freemud.application.sdk.api.ordercenter.response.orderInfo;
import com.freemud.application.sdk.api.ordercenter.request.OrderExtendedReq;
import com.freemud.application.sdk.api.ordercenter.request.OrderTraceInfoResp;
import lombok.Data;
import java.math.BigDecimal;
......@@ -271,4 +270,9 @@ public class OrderInfoReqs {
//支付渠道类型
private String payChannelType;
/**
* 支付信息
*/
private List<OrderPayItemReqs> orderPayItemCreateReqList;
}
package com.freemud.application.sdk.api.ordercenter.response.orderInfo;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.math.BigDecimal;
/**
* All rights Reserved, Designed By www.freemud.cn
*
* @Title: com.freemud.application.sdk.api.ordercenter.request OrderPayItemReq
* @Description: TDO 描述....
* @author: 铁牌灵魂工程师
* @date: 2020/11/5
* @Copyright: www.freemud.cn Inc. All rights reserved.
* 注意:本内容仅限于上海非码科技内部传阅,禁止外泄以及用于其他的商业目
*/
@Data
@NoArgsConstructor
public class OrderPayItemReqs {
private Long id;
private Long orderId;
/**
* 订单号
*/
private String orderCode;
/**
* 商户号
*/
private String partnerId;
/**
* 门店ID
*/
private String storeId;
/**
* 支付类型
*/
private Integer payChannelType;
private String ebCode;
private String payChannelName;
/**
* 支付交易号
*/
private String orderPayItemCode;
private BigDecimal payAmount;
}
......@@ -15,6 +15,7 @@ package cn.freemud.entities.vo;
import lombok.Builder;
import lombok.Data;
import java.math.BigDecimal;
import java.util.List;
@Data
......@@ -140,6 +141,10 @@ public class ShoppingCartGoodsResponseVo extends ShoppingCartGoodsBaseResponseV
* 麦咖啡-咖啡月卡价格
*/
private Long payCardFee;
/**
* svc卡支付金额
*/
private BigDecimal svcPayAmount;
/**
* 各类券信息
......
......@@ -1653,20 +1653,32 @@ public class ShoppingCartNewServiceImpl implements ShoppingCartNewService {
throw new ServiceException(ResponseResult.USER_SVC_CARD_ERROR);
}
//获取实际配送费
Integer deliveryAmount = 0;
if (StringUtils.isNotBlank(receiveId) && shoppingCartGoodsResponseVo.getDiscountDeliveryAmount() != null) {
// Integer deliveryAmount = getDeliveryAmount(receiveId, partnerId, storeId);
Integer deliveryAmount = shoppingCartGoodsResponseVo.getDiscountDeliveryAmount().intValue();
//Integer deliveryAmount = getDeliveryAmount(receiveId, partnerId, storeId);
deliveryAmount = shoppingCartGoodsResponseVo.getDiscountDeliveryAmount().intValue();
orderAmount += deliveryAmount;
}
//混合支付无需校验svc卡余额,但是配送和包装费不计算在svc卡支付
Integer amount1 = response.getData().getData().getCardSimpleInfos().get(0).getAmount();
Integer vamount = response.getData().getData().getCardSimpleInfos().get(0).getVamount();
BigDecimal svcPayAmount = BigDecimal.ZERO;
//本金+赠送金额
if (orderAmount > amount1 + vamount) {
throw new ServiceException(ResponseResult.USER_SVC_CARD_AMOUNT_DEFICIENCY);
//throw new ServiceException(ResponseResult.USER_SVC_CARD_AMOUNT_DEFICIENCY);
svcPayAmount = new BigDecimal(amount1 + vamount).divide(new BigDecimal(100)).setScale(2, BigDecimal.ROUND_HALF_UP);
shoppingCartGoodsResponseVo.setTotalAmount(orderAmount - svcPayAmount.multiply(new BigDecimal(100)).longValue());
}
BigDecimal bigDecimal = new BigDecimal(orderAmount);
String amountStr = bigDecimal.divide(new BigDecimal(100)).setScale(2, BigDecimal.ROUND_HALF_UP).toString();
shoppingCartGoodsResponseVo.setTotalAmount(0L);
shoppingCartGoodsResponseVo.setSvcDiscountDesc("储值卡支付¥" + amountStr);
else {
svcPayAmount = new BigDecimal(orderAmount - deliveryAmount).divide(new BigDecimal(100)).setScale(2, BigDecimal.ROUND_HALF_UP);
shoppingCartGoodsResponseVo.setTotalAmount(deliveryAmount.longValue());
}
shoppingCartGoodsResponseVo.setSvcPayAmount(svcPayAmount);
shoppingCartGoodsResponseVo.setSvcDiscountDesc("储值卡支付¥" + svcPayAmount);
//BigDecimal bigDecimal = new BigDecimal(orderAmount);
//String amountStr = bigDecimal.divide(new BigDecimal(100)).setScale(2, BigDecimal.ROUND_HALF_UP).toString();
//shoppingCartGoodsResponseVo.setTotalAmount(0L);
//shoppingCartGoodsResponseVo.setSvcDiscountDesc("储值卡支付¥" + amountStr);
}
/**
......
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