支付占桩订单

This commit is contained in:
2023-08-18 09:52:12 +08:00
parent fe5389ce7a
commit 4af9c7a184
11 changed files with 194 additions and 73 deletions

View File

@@ -2,10 +2,13 @@ package com.jsowell.adapay.service;
import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONObject;
import com.alibaba.fastjson2.TypeReference;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.huifu.adapay.core.exception.BaseAdaPayException;
import com.huifu.adapay.model.*;
import com.jsowell.adapay.common.CreateAdaPaymentParam;
import com.jsowell.adapay.common.DivMember;
import com.jsowell.adapay.config.AbstractAdapayConfig;
import com.jsowell.adapay.dto.SettleAccountDTO;
@@ -17,10 +20,13 @@ import com.jsowell.adapay.vo.AdapayAccountBalanceVO;
import com.jsowell.adapay.vo.AdapayCorpMemberVO;
import com.jsowell.adapay.vo.AdapayMemberInfoVO;
import com.jsowell.adapay.vo.AdapaySettleAccountVO;
import com.jsowell.common.constant.CacheConstants;
import com.jsowell.common.constant.Constants;
import com.jsowell.common.core.redis.RedisCache;
import com.jsowell.common.enums.DelFlagEnum;
import com.jsowell.common.enums.adapay.AdapayStatusEnum;
import com.jsowell.common.enums.ykc.ReturnCodeEnum;
import com.jsowell.common.enums.ykc.ScenarioEnum;
import com.jsowell.common.exception.BusinessException;
import com.jsowell.common.util.AdapayUtil;
import com.jsowell.common.util.StringUtils;
@@ -29,14 +35,17 @@ import com.jsowell.common.util.id.IdUtils;
import com.jsowell.pile.domain.AdapayMemberAccount;
import com.jsowell.pile.domain.ClearingBillInfo;
import com.jsowell.pile.domain.ClearingWithdrawInfo;
import com.jsowell.pile.dto.PayOrderDTO;
import com.jsowell.pile.service.ClearingBillInfoService;
import com.jsowell.pile.service.ClearingWithdrawInfoService;
import com.jsowell.pile.service.IAdapayMemberAccountService;
import com.jsowell.pile.service.IPileMerchantInfoService;
import com.jsowell.wxpay.service.WxAppletRemoteService;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cglib.beans.BeanMap;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
@@ -46,11 +55,15 @@ import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
@Slf4j
@Service
public class AdapayMemberService {
public class AdapayService {
@Autowired
private RedisCache redisCache;
@Value("${adapay.jsowell.appId}")
private String ADAPAY_APP_ID;
@@ -70,6 +83,75 @@ public class AdapayMemberService {
@Autowired
private IPileMerchantInfoService pileMerchantInfoService;
@Autowired
private WxAppletRemoteService wxAppletRemoteService;
/**
* 获取支付参数
*/
public Map<String, Object> createPayment(PayOrderDTO dto) {
log.info("===============使用汇付支付-获取支付参数");
// 相同参数重复请求返回同一个支付对象
String redisKey = CacheConstants.ADAPAY_ORDER_PARAM + dto.getOrderCode();
Map<String, Object> cacheObject = redisCache.getCacheObject(redisKey);
if (cacheObject != null) {
// 表示已经获取到支付参数了后续再有支付请求就拒绝
return cacheObject;
}
// 获取支付配置
AbstractAdapayConfig config = AdapayConfigFactory.getConfig(dto.getWechatAppId());
if (config == null) {
throw new BusinessException(ReturnCodeEnum.CODE_ADAPAY_CONFIG_IS_NULL_ERROR);
}
// 获取openId
String openId = wxAppletRemoteService.getOpenIdByCode(dto.getCode());
if (StringUtils.isBlank(openId)) {
throw new BusinessException(ReturnCodeEnum.CODE_GET_OPEN_ID_BY_CODE_ERROR);
}
// 封装对象
String amount = AdapayUtil.formatAmount(dto.getPayAmount()); // 用户支付金额
String payMode = Constants.ADAPAY_PAY_MODE_DELAY; // 汇付延时分账
CreateAdaPaymentParam createAdaPaymentParam = new CreateAdaPaymentParam();
createAdaPaymentParam.setOrder_no(dto.getOrderCode());
createAdaPaymentParam.setPay_amt(amount);
createAdaPaymentParam.setApp_id(config.getAdapayAppId());
createAdaPaymentParam.setPay_channel("wx_lite"); // todo 如果以后有支付宝等别的渠道这里需要做修改判断是什么渠道的请求
createAdaPaymentParam.setGoods_title(dto.getGoodsTitle());
createAdaPaymentParam.setGoods_desc(dto.getGoodsDesc()); // 这个字段是微信支付凭证的商品名
Map<String, String> map = Maps.newHashMap();
map.put("type", ScenarioEnum.ORDER.getValue());
map.put("orderCode", dto.getOrderCode());
map.put("payMode", payMode);
map.put("memberId", dto.getMemberId());
createAdaPaymentParam.setDescription(JSON.toJSONString(map));
// 异步通知地址url为http/https路径服务器POST回调URL 上请勿附带参数
createAdaPaymentParam.setNotify_url(ADAPAY_CALLBACK_URL);
createAdaPaymentParam.setExpend(JSONObject.toJSONString(ImmutableMap.of("open_id", openId)));
// 延时分账
createAdaPaymentParam.setPay_mode(payMode);
try {
log.info("创建汇付支付参数:{}", JSONObject.toJSONString(createAdaPaymentParam));
Map<String, Object> response = Payment.create(BeanMap.create(createAdaPaymentParam), config.getWechatAppId());
if (response != null && !response.isEmpty()) {
JSONObject expend = JSONObject.parseObject(response.get("expend").toString());
JSONObject pay_info = expend.getJSONObject("pay_info");
Map<String, Object> resultMap = JSONObject.parseObject(pay_info.toJSONString(), new TypeReference<Map<String, Object>>() {});
if (resultMap != null) {
// 请求参数放入缓存15分钟以内返回同一个支付参数
redisCache.setCacheObject(redisKey, resultMap, 15, TimeUnit.MINUTES);
}
return resultMap;
}
} catch (BaseAdaPayException e) {
log.error("汇付-获取支付对象发生异常", e);
}
return null;
}
/**
* 创建结算账户
*

View File

@@ -1,9 +1,6 @@
package com.jsowell.pile.dto;
import com.jsowell.pile.domain.OrderBasicInfo;
import lombok.Data;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
import java.math.BigDecimal;
@@ -49,21 +46,21 @@ public class PayOrderDTO {
*/
private String lockValue;
private OrderBasicInfo orderBasicInfo;
// private OrderBasicInfo orderBasicInfo;
/**
* 微信小程序appId
*/
private String wechatAppId;
@Override
public String toString() {
return new ToStringBuilder(this, ToStringStyle.JSON_STYLE)
.append("memberId", memberId)
.append("orderCode", orderCode)
.append("payMode", payMode)
.append("payAmount", payAmount)
.append("code", code)
.toString();
}
/**
* 商品标题
*/
private String goodsTitle;
/**
* 商品描述信息微信小程序和微信公众号该字段最大长度42个字符
* 这个字段是微信支付凭证的商品名
*/
private String goodsDesc;
}

View File

@@ -1,9 +1,12 @@
package com.jsowell.pile.service;
import com.jsowell.pile.domain.OrderPileOccupy;
import com.jsowell.pile.dto.PayOrderDTO;
import com.jsowell.pile.dto.QueryOccupyOrderDTO;
import java.util.List;
import java.util.Map;
public interface OrderPileOccupyService{
int deleteByPrimaryKey(Integer id);
@@ -49,4 +52,6 @@ public interface OrderPileOccupyService{
* @return
*/
List<OrderPileOccupy> queryUnPayOrderByMemberId(String memberId);
Map<String, Object> payOccupyPileOrder(PayOrderDTO dto);
}

View File

@@ -2,23 +2,17 @@ package com.jsowell.pile.service.impl;
import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONObject;
import com.alibaba.fastjson2.TypeReference;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.google.common.base.Joiner;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.google.common.collect.Sets;
import com.huifu.adapay.core.exception.BaseAdaPayException;
import com.huifu.adapay.model.Payment;
import com.huifu.adapay.model.PaymentConfirm;
import com.jsowell.adapay.common.CreateAdaPaymentParam;
import com.jsowell.adapay.common.DivMember;
import com.jsowell.adapay.config.AbstractAdapayConfig;
import com.jsowell.adapay.factory.AdapayConfigFactory;
import com.jsowell.adapay.response.PaymentConfirmResponse;
import com.jsowell.adapay.response.PaymentReverseResponse;
import com.jsowell.adapay.service.AdapayMemberService;
import com.jsowell.adapay.service.AdapayService;
import com.jsowell.adapay.vo.OrderSettleResult;
import com.jsowell.common.constant.CacheConstants;
import com.jsowell.common.constant.Constants;
@@ -58,7 +52,6 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cglib.beans.BeanMap;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@@ -168,7 +161,7 @@ public class OrderBasicInfoServiceImpl implements IOrderBasicInfoService {
private IPileStationWhitelistService pileStationWhitelistService;
@Autowired
private AdapayMemberService adapayMemberService;
private AdapayService adapayService;
@Autowired
private MemberAdapayRecordService memberAdapayRecordService;
@@ -1166,7 +1159,7 @@ public class OrderBasicInfoServiceImpl implements IOrderBasicInfoService {
String paymentId = vo.getPaymentId();
BigDecimal deductionAmount = vo.getDeductionAmount();
// 调汇付的分账接口 确认交易
PaymentConfirmResponse paymentConfirmResponse = adapayMemberService.createPaymentConfirmRequest(paymentId, adapayMemberAccount, deductionAmount, orderCode);
PaymentConfirmResponse paymentConfirmResponse = adapayService.createPaymentConfirmRequest(paymentId, adapayMemberAccount, deductionAmount, orderCode);
if (paymentConfirmResponse != null) {
confirmAmt = confirmAmt.add(new BigDecimal(paymentConfirmResponse.getConfirmed_amt()));
feeAmt = feeAmt.add(new BigDecimal(paymentConfirmResponse.getFee_amt()));
@@ -2145,7 +2138,7 @@ public class OrderBasicInfoServiceImpl implements IOrderBasicInfoService {
payOrderDTO.setStartMode(dto.getStartMode());
// payOrderDTO.setCode();
// payOrderDTO.setLockValue();
payOrderDTO.setOrderBasicInfo(basicInfo);
// payOrderDTO.setOrderBasicInfo(basicInfo);
payOrder(payOrderDTO);
@@ -2358,10 +2351,10 @@ public class OrderBasicInfoServiceImpl implements IOrderBasicInfoService {
String payMode = "delay";
if (StringUtils.equals("", payMode)) {
// 延迟分账确认的调退款接口
adapayMemberService.createRefundRequest(paymentId, refundAmount);
adapayService.createRefundRequest(paymentId, refundAmount);
} else {
// 延迟分账未确认调撤销调撤销接口退款
PaymentReverseResponse response = adapayMemberService.createPaymentReverseRequest(
PaymentReverseResponse response = adapayService.createPaymentReverseRequest(
paymentId, refundAmount, dto.getWechatAppId(), dto.getMemberId(), ScenarioEnum.ORDER.getValue(),
dto.getOrderCode());
if (response != null) {
@@ -2405,7 +2398,7 @@ public class OrderBasicInfoServiceImpl implements IOrderBasicInfoService {
BigDecimal deductionAmount = vo.getDeductionAmount();
// 调汇付的交易撤销接口
adapayMemberService.createPaymentReverseRequest(paymentId, deductionAmount, dto.getWechatAppId(),
adapayService.createPaymentReverseRequest(paymentId, deductionAmount, dto.getWechatAppId(),
dto.getMemberId(), ScenarioEnum.BALANCE.getValue(), null);
// 更新这笔交易的剩余金额
@@ -2623,7 +2616,7 @@ public class OrderBasicInfoServiceImpl implements IOrderBasicInfoService {
public Map<String, Object> payOrder(PayOrderDTO dto) {
OrderBasicInfo orderInfo = this.getOrderInfoByOrderCode(dto.getOrderCode());
if (orderInfo == null) {
throw new BusinessException(ReturnCodeEnum.CODE_QUERY_ORDER_NULL_ERROR);
throw new BusinessException(ReturnCodeEnum.CODE_QUERY_ORDER_INFO_IS_NULL);
}
if (!StringUtils.equals(orderInfo.getPayStatus(), OrderPayStatusEnum.unpaid.getValue())) {
// 订单已支付
@@ -2635,10 +2628,12 @@ public class OrderBasicInfoServiceImpl implements IOrderBasicInfoService {
balancePayOrder(dto);
} else if (StringUtils.equals(dto.getPayMode(), OrderPayModeEnum.PAYMENT_OF_WECHATPAY.getValue())) {
// 微信支付
dto.setOrderBasicInfo(orderInfo);
// dto.setOrderBasicInfo(orderInfo);
// 2023-07-11 全部改为汇付支付
Map<String, Object> weixinMap = adapayPayOrder(dto);
dto.setGoodsTitle("充电费用");
dto.setGoodsDesc("充电桩预付款金额");
Map<String, Object> weixinMap = adapayService.createPayment(dto);
// 返回微信支付参数
resultMap.put("weixinMap", weixinMap);
@@ -2751,7 +2746,7 @@ public class OrderBasicInfoServiceImpl implements IOrderBasicInfoService {
// 通过支付id查询退款记录
String paymentId = adapayCallbackRecord.getPaymentId();
try {
resultList = adapayMemberService.queryPaymentReverse(paymentId, wechatAppId);
resultList = adapayService.queryPaymentReverse(paymentId, wechatAppId);
} catch (BaseAdaPayException e) {
logger.error("查询支付撤销对象发生异常", e);
}
@@ -2798,7 +2793,7 @@ public class OrderBasicInfoServiceImpl implements IOrderBasicInfoService {
List<PaymentReverseResponse> paymentReverses = queryOrderAdapayRefund(orderBasicInfo);
if (CollectionUtils.isEmpty(paymentReverses)) {
// 如果没有退款过,重新执行一遍退款
PaymentReverseResponse response = adapayMemberService.createPaymentReverseRequest(
PaymentReverseResponse response = adapayService.createPaymentReverseRequest(
paymentId, refundAmount, wechatAppId, memberId, ScenarioEnum.ORDER.getValue(),
orderCode);
logger.info("重试订单退款response:{}", JSON.toJSONString(response));
@@ -2822,7 +2817,7 @@ public class OrderBasicInfoServiceImpl implements IOrderBasicInfoService {
* @param dto
* @return
*/
private Map<String, Object> adapayPayOrder(PayOrderDTO dto) {
/*private Map<String, Object> adapayPayOrder(PayOrderDTO dto) {
logger.info("===============使用汇付支付");
// 相同参数重复请求,返回同一个支付对象
String redisKey = CacheConstants.ADAPAY_ORDER_PARAM + dto.getOrderCode();
@@ -2837,11 +2832,12 @@ public class OrderBasicInfoServiceImpl implements IOrderBasicInfoService {
throw new BusinessException(ReturnCodeEnum.CODE_ADAPAY_CONFIG_IS_NULL_ERROR);
}
OrderBasicInfo orderInfo = dto.getOrderBasicInfo();
if (orderInfo == null) {
// 订单为空重新查询
orderInfo = this.getOrderInfoByOrderCode(dto.getOrderCode());
}
// OrderBasicInfo orderInfo = dto.getOrderBasicInfo();
// if (orderInfo == null) {
// // 订单为空重新查询
// orderInfo = this.getOrderInfoByOrderCode(dto.getOrderCode());
// }
// 获取openId
String openId = wxAppletRemoteService.getOpenIdByCode(dto.getCode());
if (StringUtils.isBlank(openId)) {
@@ -2852,7 +2848,7 @@ public class OrderBasicInfoServiceImpl implements IOrderBasicInfoService {
String amount = AdapayUtil.formatAmount(dto.getPayAmount()); // 用户支付金额
String payMode = Constants.ADAPAY_PAY_MODE_DELAY; // 汇付延时分账
CreateAdaPaymentParam createAdaPaymentParam = new CreateAdaPaymentParam();
createAdaPaymentParam.setOrder_no(orderInfo.getOrderCode());
createAdaPaymentParam.setOrder_no(dto.getOrderCode());
createAdaPaymentParam.setPay_amt(amount);
createAdaPaymentParam.setApp_id(config.getAdapayAppId());
createAdaPaymentParam.setPay_channel("wx_lite"); // todo 如果以后有支付宝等别的渠道,这里需要做修改,判断是什么渠道的请求
@@ -2890,7 +2886,7 @@ public class OrderBasicInfoServiceImpl implements IOrderBasicInfoService {
logger.error("汇付-获取支付对象发生异常", e);
}
return null;
}
}*/
/**
* 余额支付订单逻辑

View File

@@ -1,11 +1,17 @@
package com.jsowell.pile.service.impl;
import com.google.common.collect.Maps;
import com.jsowell.adapay.service.AdapayService;
import com.jsowell.common.constant.Constants;
import com.jsowell.common.enums.DelFlagEnum;
import com.jsowell.common.enums.ykc.OrderPayModeEnum;
import com.jsowell.common.enums.ykc.ReturnCodeEnum;
import com.jsowell.common.exception.BusinessException;
import com.jsowell.common.util.DateUtils;
import com.jsowell.common.util.StringUtils;
import com.jsowell.common.util.id.IdUtils;
import com.jsowell.pile.domain.OrderPileOccupy;
import com.jsowell.pile.dto.PayOrderDTO;
import com.jsowell.pile.dto.QueryOccupyOrderDTO;
import com.jsowell.pile.dto.QueryOrderDTO;
import com.jsowell.pile.mapper.OrderPileOccupyMapper;
@@ -23,6 +29,7 @@ import javax.annotation.Resource;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
import java.util.Map;
@Slf4j
@Service
@@ -40,6 +47,9 @@ public class OrderPileOccupyServiceImpl implements OrderPileOccupyService{
@Resource
private IPileBillingTemplateService pileBillingTemplateService;
@Resource
private AdapayService adapayService;
@Override
public int deleteByPrimaryKey(Integer id) {
return orderPileOccupyMapper.deleteByPrimaryKey(id);
@@ -260,5 +270,42 @@ public class OrderPileOccupyServiceImpl implements OrderPileOccupyService{
return orderPileOccupyMapper.queryUnPayOrderByMemberId(memberId);
}
/**
* 支付占桩订单
* @param dto
* @return
*/
@Override
public Map<String, Object> payOccupyPileOrder(PayOrderDTO dto) {
// 查询占桩订单详情
OrderPileOccupy orderPileOccupy = queryByOccupyCode(dto.getOrderCode());
if (orderPileOccupy == null) {
throw new BusinessException(ReturnCodeEnum.CODE_QUERY_ORDER_INFO_IS_NULL);
}
// 校验订单状态
// 支付方式
Map<String, Object> resultMap = Maps.newHashMap();
if (StringUtils.equals(dto.getPayMode(), OrderPayModeEnum.PAYMENT_OF_BALANCE.getValue())) {
// 余额支付占桩订单
balancePayOccupyPileOrder(dto);
} else if (StringUtils.equals(dto.getPayMode(), OrderPayModeEnum.PAYMENT_OF_WECHATPAY.getValue())) {
// 返回支付参数
dto.setGoodsTitle("占桩费用");
dto.setGoodsDesc("占桩订单金额");
Map<String, Object> weixinMap = adapayService.createPayment(dto);
resultMap.put("weixinMap", weixinMap);
} else if (StringUtils.equals(dto.getPayMode(), OrderPayModeEnum.PAYMENT_OF_WHITELIST.getValue())) { // 白名单支付
whiteListPayOccupyPileOrder(dto);
}
return resultMap;
}
private void balancePayOccupyPileOrder(PayOrderDTO dto) {
}
private void whiteListPayOccupyPileOrder(PayOrderDTO dto) {
}
}