Commit 0df7c7e1 by ping.wu

积分商城二期现金支付

parent 73b5a015
package cn.freemud.entities.dto.order;
import cn.freemud.entities.dto.pay.PayOrderDto;
import lombok.Data;
/**
......@@ -27,4 +28,11 @@ public class FacePayResponseDto {
private Integer merchantCoupon;
private Integer platformCoupon;
// private Integer resultCode;
// private String resultMsg;
private String transId;
// private String fmId;
// private String payCode;
private PayOrderDto payOrder;
}
package cn.freemud.entities.dto.pay;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
@Data
public class PayOrderDto {
private String appid;
@JsonProperty("package")
private String packageX;
@JsonProperty("nonce_str")
private String nonceStr;
private String sign;
private String timestamp;
private String signType;
private String aliPayOrder;
private String paySign;
private String bizContent;
private String thirdPartTradeNo;
}
package cn.freemud.entities.dto.pay;
import lombok.Data;
@Data
public class PayProductDto {
private String id;
private Integer quantity;
private Long price;
private String name;
}
package cn.freemud.entities.dto.pay;
import lombok.Data;
import java.util.List;
import java.util.Map;
@Data
public class UnifiedOrderRequestDto {
/**
* * {"amount":1800,"body":"蜜雪冰城900507店","businessDate":"20210831","clientCode":130465,"foodOrderType":"pre_order",
* * "notifyUrl":"http://open-store-order-application-service.open-store.svc:9212/order/newPaySuccessCallback","openId":"2088332790804910",
* * "operatorId":"1","partnerId":2080,"payTimeOutTime":"25","products":[{"id":"209430924058928948","name":"鲜橙益菌多","price":900,"quantity":1},
* * {"id":"209516210115815203","name":"芝士奶盖红茶","price":900,"quantity":1}],"stationId":"1","storeId":"900507","transId":"22057814343976884800004",
* * "ver":"2","vipAmount":0}
*/
private String ver = "2";
private Integer reqtype;
private String unifyid;
private String partnerId;
private String storeId;
private String stationId = "1";
private String operatorId = "1";
private String transId;
private String openId;
private String businessDate;
private Long clientCode;
private Long amount;
private Long undisAmount;
private String goodsTag;
private List<PayProductDto> products;
private String body;
private String payCode;
private String notifyUrl;
private Long vipAmount = 0L;
private String foodOrderType;
private Integer invoiceFlag;
private Map<String, String> extendParams;
private String divideDetail;
private String payTimeOutTime;
private Long merchantDiscount;
}
......@@ -3,11 +3,16 @@ package cn.freemud.service.impl;
import cn.freemud.amp.service.SendCouponService;
import cn.freemud.base.entity.BaseResponse;
import cn.freemud.base.util.DateUtil;
import cn.freemud.constant.RedisKeyConstant;
import cn.freemud.constant.ResponseCodeConstant;
import cn.freemud.entities.Active;
import cn.freemud.entities.dto.BatchQueryActivityInfoRequestDto;
import cn.freemud.entities.dto.BatchQueryActivityInfoResponseDto;
import cn.freemud.entities.dto.delivery.WeixinDeliveryAddressDto;
import cn.freemud.entities.dto.order.FacePayResponseDto;
import cn.freemud.entities.dto.pay.PayOrderDto;
import cn.freemud.entities.dto.pay.PayProductDto;
import cn.freemud.entities.dto.pay.UnifiedOrderRequestDto;
import cn.freemud.entities.dto.product.pointsmall.*;
import cn.freemud.entities.dto.user.CustomerPropertyBaseResponse;
import cn.freemud.entities.dto.user.StatislScoreResponse;
......@@ -19,16 +24,22 @@ import cn.freemud.enums.integralproduct.IntegralProductStatusEnum;
import cn.freemud.service.CouponService;
import cn.freemud.service.PointsMallOrderService;
import cn.freemud.service.thirdparty.CustomerPropertyClient;
import cn.freemud.service.thirdparty.PaymentNewClient;
import cn.freemud.service.thirdparty.PointMallProductClient;
import cn.freemud.utils.AppLogUtil;
import cn.freemud.utils.ResponseUtil;
import com.alibaba.fastjson.JSONObject;
import com.freemud.api.assortment.datamanager.entity.db.AssortmentOpenPlatformIappWxappStore;
import com.freemud.api.assortment.datamanager.entity.db.AssortmentOpenPlatformPartnerConfig;
import com.freemud.api.assortment.datamanager.entity.vo.AssortmentCustomerInfoVo;
import com.freemud.api.assortment.datamanager.manager.AssortmentOpenPlatformIappWxappStoreManager;
import com.freemud.api.assortment.datamanager.manager.AssortmentOpenPlatformPartnerConfigManager;
import com.freemud.api.assortment.datamanager.manager.customer.AssortmentCustomerInfoManager;
import com.freemud.application.sdk.api.log.LogThreadLocal;
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.OrderType;
import com.freemud.application.sdk.api.ordercenter.enums.PayChannelType;
import com.freemud.application.sdk.api.ordercenter.request.OrderAffirmReq;
import com.freemud.application.sdk.api.ordercenter.request.OrderUserConditionsReq;
import com.freemud.application.sdk.api.ordercenter.request.PaySuccessReq;
......@@ -48,6 +59,7 @@ import com.freemud.sdk.api.assortment.order.request.order.ProductBindingCouponTy
import org.apache.commons.collections.CollectionUtils;
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.*;
......@@ -70,6 +82,16 @@ public class PointsMallOrderServiceImpl implements PointsMallOrderService {
private SendCouponService sendCouponService;
@Autowired
private OrderDownLoadSdkService orderDownLoadSdkService;
@Autowired
private PaymentNewClient paymentNewClient;
@Autowired
private AssortmentOpenPlatformPartnerConfigManager openPlatformPartnerConfigManager;
@Autowired
private AssortmentOpenPlatformIappWxappStoreManager assortmentOpenPlatformIappWxappStoreManager;
@Value("${saas.reverseNotifyiDcUrl}")
private String reverseNotifyiDcUrl;
@Override
......@@ -83,6 +105,7 @@ public class PointsMallOrderServiceImpl implements PointsMallOrderService {
String partnerId = userLoginInfoDto.getPartnerId();
String storeId = "99999";
String memberId = userLoginInfoDto.getMemberId();
String openId = userLoginInfoDto.getOpenId();
String appId = userLoginInfoDto.getAppId();
String skuId = "";
if (CollectionUtils.isNotEmpty(createOrderVo.getProducts())) {
......@@ -108,10 +131,8 @@ public class PointsMallOrderServiceImpl implements PointsMallOrderService {
if (!Objects.equals(1, integralProductType.getExchangeType())) {
return ResponseUtil.error(ResponseCodeConstant.RESPONSE_ERROR_STR, "积分商城暂不支持现金兑换");
}
// integralProductType.setIntegralPrice(2);
// integralProductType.setCashPrice(0);
// integralProductType.setExchangeType(1);
Integer points = integralProductType.getIntegralPrice();
Integer cashPrice = integralProductType.getCashPrice();
Integer exchangeType = integralProductType.getExchangeType();
boolean isCoupon = integralProductType.getProductType() == 1;
WeixinDeliveryAddressDto weixinDeliveryAddress = createOrderVo.getWeixinDeliveryAddress();
......@@ -153,7 +174,35 @@ public class PointsMallOrderServiceImpl implements PointsMallOrderService {
if (!Objects.equals(ResponseCodeConstant.RESPONSE_SUCCESS_STR, createOrderResponseDto.getCode())) {
return ResponseUtil.error(createOrderResponseDto.getCode(), "创建订单异常");
}
String orderCode = createOrderResponseDto.getResult().getOrderCode();
OrderInfoReqs result = createOrderResponseDto.getResult();
String orderCode = result.getOrderCode();
CreateOrderResponseVo createOrderResponseVo = new CreateOrderResponseVo();
//线上现金支付,创建预支付订单,唤起支付
com.freemud.application.sdk.api.base.BaseResponse<FacePayResponseDto> response = null;
if (!Objects.equals(1, integralProductType.getExchangeType()) && cashPrice != null && cashPrice > 0) {
UnifiedOrderRequestDto requestDto = convert2UnifiedOrderRequestDto(result,openId,cashPrice);
response = paymentNewClient.unifiedOrder(requestDto);
if (!Objects.equals(ResponseCodeConstant.RESPONSE_SUCCESS, response.getStatusCode())) {
return ResponseUtil.error(createOrderResponseDto.getCode(), "支付异常");
}
if (!Objects.equals(ResponseCodeConstant.RESPONSE_SUCCESS, response.getData().getResultCode())) {
return ResponseUtil.error(createOrderResponseDto.getCode(), "支付异常," + response.getData().getResultMsg());
}
createOrderResponseVo.setOid(orderCode);
createOrderResponseVo.setWxappId(result.getAppId());
createOrderResponseVo.setFmId(response.getData().getFmId());
PayOrderDto payOrder = response.getData().getPayOrder();
if(payOrder != null){
createOrderResponseVo.setTimestamp(payOrder.getTimestamp());
createOrderResponseVo.setNonceStr(payOrder.getNonceStr());
createOrderResponseVo.setPackageX(payOrder.getPackageX());
createOrderResponseVo.setSignType(payOrder.getSignType());
createOrderResponseVo.setSign(payOrder.getSign());
createOrderResponseVo.setOrderStr(payOrder.getAliPayOrder());
}
}
//扣减积分商品商品库存
UpdatePointsMallStocksRequest updatePointsMallStocksRequest = new UpdatePointsMallStocksRequest();
updatePointsMallStocksRequest.setPartnerId(partnerId);
......@@ -215,9 +264,8 @@ public class PointsMallOrderServiceImpl implements PointsMallOrderService {
createOrderFail(false, true, partnerId, memberId, orderCode, skuId, points, appId);
return ResponseUtil.error(updateOrderStateResp.getCode(), "创建订单异常");
}
CreateOrderResponseVo createOrderResponse = new CreateOrderResponseVo();
createOrderResponse.setOid(orderCode);
return ResponseUtil.success(createOrderResponse);
return ResponseUtil.success(createOrderResponseVo);
}
......@@ -539,4 +587,106 @@ public class PointsMallOrderServiceImpl implements PointsMallOrderService {
}
/**
* 预支付接口获取类型
*
* @return
*/
private String getFoodOrderType(Integer orderType) {
//1=外卖 4=自提,5=堂食
//qr_order(店内扫码点餐),pre_order(预点到店自提),home_delivery (外送到家)
String foodOrderType;
switch (orderType) {
case 1:
foodOrderType = "home_delivery";
break;
case 4:
foodOrderType = "pre_order";
break;
case 5:
default:
foodOrderType = "qr_order";
break;
}
return foodOrderType;
}
/**
* 获取商户支付超时时间
*
* @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();
}
private Long getPayClientCode(String wxAppId, String storeId, String payCode,String orderClient){
//抖音支付的payCode = 10066
if (Objects.equals(OrderClientType.TIKTOKPAY.getIndex().toString(),orderClient)) {
payCode = PayChannelType.TIKTOKPAY.getEbcode();
}
AssortmentOpenPlatformIappWxappStore wxAppStore = assortmentOpenPlatformIappWxappStoreManager.selectWxappStoreByWxAppIdAndStoreId(wxAppId, storeId,payCode);
payCode = wxAppStore != null && StringUtils.isNotBlank(wxAppStore.getPayCode())?wxAppStore.getPayCode():null;
String clientCode = wxAppStore != null && StringUtils.isNotBlank(wxAppStore.getClientCode()) ? wxAppStore.getClientCode() : "0";
return Long.parseLong(clientCode);
}
private UnifiedOrderRequestDto convert2UnifiedOrderRequestDto(OrderInfoReqs orderInfo,String openId, Integer cashPrice){
String partnerId = orderInfo.getPartnerId();
String storeId = orderInfo.getStoreId();
String appId = orderInfo.getAppId();
//现金支付唤起线上支付
UnifiedOrderRequestDto requestDto = new UnifiedOrderRequestDto();
requestDto.setTransId(orderInfo.getOrderCode());
requestDto.setPartnerId(partnerId);
requestDto.setStoreId(storeId);
requestDto.setAmount(cashPrice.longValue());
String businessDate = DateUtil.convert2String(new Date(), "yyyyMMdd");
requestDto.setBusinessDate(businessDate);
requestDto.setClientCode(getPayClientCode(appId,storeId,null,null));
requestDto.setFoodOrderType(getFoodOrderType(1));
requestDto.setNotifyUrl(reverseNotifyiDcUrl);
requestDto.setOpenId(openId);
requestDto.setPayTimeOutTime(getPartnerPayOvertime(partnerId));
List<PayProductDto> productBeans = new ArrayList<>();
String payProductName ="";
if (CollectionUtils.isNotEmpty(orderInfo.getOrderItemList())) {
for (OrderItemResp orderProductBean : orderInfo.getOrderItemList()){
PayProductDto productBean = new PayProductDto();
productBean.setId(orderProductBean.getProductId());
productBean.setQuantity(orderProductBean.getProductQuantity());
// productBean.setSeq(orderProductBean.getProductSeq());
// productBean.setSalesType("NORMAL");
productBean.setPrice(orderProductBean.getProductPrice().longValue());
if(StringUtils.isNotBlank(payProductName)){
payProductName = orderProductBean.getProductName();
}else if(payProductName.endsWith("...")){
//不处理
}else {
payProductName = payProductName + "...";
}
productBean.setName(orderProductBean.getProductName());
productBeans.add(productBean);
}
}
requestDto.setBody(payProductName);
return requestDto;
}
}
package cn.freemud.service.thirdparty;
import cn.freemud.annotations.LogIgnoreFeign;
import cn.freemud.constant.ResponseCodeKeyConstant;
import cn.freemud.entities.dto.order.FacePayRequestDto;
import cn.freemud.entities.dto.order.FacePayResponseDto;
import cn.freemud.entities.dto.pay.UnifiedOrderRequestDto;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
......@@ -29,8 +31,16 @@ public interface PaymentNewClient {
/**
* 扫脸支付
*/
@LogIgnoreFeign(logMessage="facePay")
@LogIgnoreFeign(logMessage="facePay",statusCodeFieldName= ResponseCodeKeyConstant.STATUS_CODE)
@PostMapping("paymentcenter/facePay")
com.freemud.application.sdk.api.base.BaseResponse<FacePayResponseDto> facePay(@RequestBody FacePayRequestDto orderPayDto);
/**
* 创建预支付订单,唤起支付
*/
@LogIgnoreFeign(logMessage="unifiedOrder",statusCodeFieldName= ResponseCodeKeyConstant.STATUS_CODE)
@PostMapping("paymentcenter/unifiedOrder")
com.freemud.application.sdk.api.base.BaseResponse<FacePayResponseDto> unifiedOrder(@RequestBody UnifiedOrderRequestDto requestDto);
}
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