diff --git a/jsowell-admin/src/main/java/com/jsowell/api/uniapp/PayController.java b/jsowell-admin/src/main/java/com/jsowell/api/uniapp/PayController.java index 8c73a5734..0acacfc68 100644 --- a/jsowell-admin/src/main/java/com/jsowell/api/uniapp/PayController.java +++ b/jsowell-admin/src/main/java/com/jsowell/api/uniapp/PayController.java @@ -129,10 +129,10 @@ public class PayController extends BaseController { } response = new RestApiResponse<>(map); } catch (BusinessException e) { - logger.warn("wechatpay支付订单 warn param:{}", dto.toString(), e); + logger.warn("wechatpay支付订单 warn param:{}", dto, e); response = new RestApiResponse<>(e.getCode(), e.getMessage()); } catch (Exception e) { - logger.error("wechatpay支付订单 error param:{}", dto.toString(), e); + logger.error("wechatpay支付订单 error param:{}", dto, e); response = new RestApiResponse<>(ReturnCodeEnum.CODE_ORDER_PAY_ERROR); } finally { // 支付订单解锁 @@ -328,15 +328,16 @@ public class PayController extends BaseController { } /** - * 支付占桩订单 + * 支付占桩订单/占桩订单支付 + * https://api.jsowellcloud.com/uniapp/pay/payOccupyPileOrder */ @PostMapping("/payOccupyPileOrder") public RestApiResponse payOccupyPileOrder(HttpServletRequest request, @RequestBody PayOrderDTO dto) { - logger.info("wechatpay支付订单 param:{}", dto.toString()); + logger.info("支付占桩订单 param:{}", dto.toString()); RestApiResponse response; // 支付订单加锁 - String lockKey = "pay_order_" + dto.getOrderCode(); + String lockKey = "pay_occupy_order_" + dto.getOrderCode(); String lockValue = IdUtils.fastUUID(); try { String memberId = getMemberIdByAuthorization(request); @@ -354,7 +355,7 @@ public class PayController extends BaseController { if (isLock) { String appId = request.getHeader("appId"); dto.setWechatAppId(appId); - map = orderService.payOrder(dto); + map = orderService.payOccupyPileOrder(dto); } response = new RestApiResponse<>(map); } catch (BusinessException e) { diff --git a/jsowell-admin/src/main/java/com/jsowell/api/uniapp/TempController.java b/jsowell-admin/src/main/java/com/jsowell/api/uniapp/TempController.java index 1107e2141..b896a0144 100644 --- a/jsowell-admin/src/main/java/com/jsowell/api/uniapp/TempController.java +++ b/jsowell-admin/src/main/java/com/jsowell/api/uniapp/TempController.java @@ -3,7 +3,7 @@ package com.jsowell.api.uniapp; import com.alibaba.fastjson2.JSON; import com.alibaba.fastjson2.JSONObject; import com.jsowell.adapay.dto.BalancePaymentRequestDTO; -import com.jsowell.adapay.service.AdapayMemberService; +import com.jsowell.adapay.service.AdapayService; import com.jsowell.common.annotation.Anonymous; import com.jsowell.common.core.controller.BaseController; import com.jsowell.common.enums.ykc.ReturnCodeEnum; @@ -48,7 +48,7 @@ public class TempController extends BaseController { private IAdapayMemberAccountService adapayMemberAccountService; @Autowired - private AdapayMemberService adapayMemberService; + private AdapayService adapayMemberService; @Autowired private IMemberBasicInfoService memberBasicInfoService; diff --git a/jsowell-admin/src/main/java/com/jsowell/service/OrderService.java b/jsowell-admin/src/main/java/com/jsowell/service/OrderService.java index 4b64fe8bd..30747cd6d 100644 --- a/jsowell-admin/src/main/java/com/jsowell/service/OrderService.java +++ b/jsowell-admin/src/main/java/com/jsowell/service/OrderService.java @@ -46,6 +46,7 @@ import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import java.math.BigDecimal; import java.text.ParseException; @@ -111,9 +112,11 @@ public class OrderService { @Autowired private MemberAdapayRecordService memberAdapayRecordService; + @Resource + private OrderPileOccupyService orderPileOccupyService; + /** * 生成订单 - * * @param dto * @return */ @@ -125,18 +128,8 @@ public class OrderService { return null; } - /** - * 获取到vin 查询对应的用户,得到余额 - * - * 生成订单 - * - * 支付订单 - * - */ - /** * 订单支付 - * * @param dto */ public Map payOrder(PayOrderDTO dto) throws Exception { @@ -154,7 +147,7 @@ public class OrderService { // 查询订单详情,验证订单中的桩编号是否正确 OrderBasicInfo orderBasicInfo = orderBasicInfoService.getOrderInfoByOrderCode(dto.getOrderCode()); if (orderBasicInfo == null) { - throw new BusinessException(ReturnCodeEnum.CODE_QUERY_ORDER_NULL_ERROR); + throw new BusinessException(ReturnCodeEnum.CODE_QUERY_ORDER_INFO_IS_NULL); } if (!(StringUtils.equals(orderBasicInfo.getPileSn(), dto.getPileSn()) && StringUtils.equals(orderBasicInfo.getConnectorCode(), dto.getConnectorCode()))) { @@ -241,7 +234,7 @@ public class OrderService { // 查订单 OrderBasicInfo orderInfo = orderBasicInfoService.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.getOrderStatus(), OrderStatusEnum.ORDER_COMPLETE.getValue())) { @@ -540,7 +533,7 @@ public class OrderService { public UniAppOrderVO getUniAppOrderDetail(String orderCode) { OrderBasicInfo orderBasicInfo = orderBasicInfoService.getOrderInfoByOrderCode(orderCode); if (orderBasicInfo == null) { - throw new BusinessException(ReturnCodeEnum.CODE_QUERY_ORDER_NULL_ERROR); + throw new BusinessException(ReturnCodeEnum.CODE_QUERY_ORDER_INFO_IS_NULL); } UniAppOrderVO vo = new UniAppOrderVO(); vo.setOrderCode(orderBasicInfo.getOrderCode()); @@ -1148,5 +1141,7 @@ public class OrderService { log.info("支付撤销失败 data:{}", JSON.toJSONString(data)); } - + public Map payOccupyPileOrder(PayOrderDTO dto) { + return orderPileOccupyService.payOccupyPileOrder(dto); + } } diff --git a/jsowell-admin/src/main/java/com/jsowell/web/controller/pile/AdapayMemberController.java b/jsowell-admin/src/main/java/com/jsowell/web/controller/pile/AdapayMemberController.java index 220c34c8f..55073ae76 100644 --- a/jsowell-admin/src/main/java/com/jsowell/web/controller/pile/AdapayMemberController.java +++ b/jsowell-admin/src/main/java/com/jsowell/web/controller/pile/AdapayMemberController.java @@ -6,7 +6,7 @@ import com.jsowell.adapay.dto.AdapayMemberInfoDTO; import com.jsowell.adapay.dto.SettleAccountDTO; import com.jsowell.adapay.dto.UpdateAccountConfigDTO; import com.jsowell.adapay.dto.WithdrawDTO; -import com.jsowell.adapay.service.AdapayMemberService; +import com.jsowell.adapay.service.AdapayService; import com.jsowell.adapay.vo.AdapayAccountBalanceVO; import com.jsowell.common.core.controller.BaseController; import com.jsowell.common.core.domain.AjaxResult; @@ -26,7 +26,7 @@ import java.util.Map; public class AdapayMemberController extends BaseController { @Autowired - private AdapayMemberService adapayMemberService; + private AdapayService adapayMemberService; /** * 创建结算账户 diff --git a/jsowell-admin/src/test/java/SpringBootTestController.java b/jsowell-admin/src/test/java/SpringBootTestController.java index 4ad029699..a7e9e8d4d 100644 --- a/jsowell-admin/src/test/java/SpringBootTestController.java +++ b/jsowell-admin/src/test/java/SpringBootTestController.java @@ -15,7 +15,7 @@ import com.huifu.adapay.model.Refund; import com.jsowell.JsowellApplication; import com.jsowell.adapay.config.AbstractAdapayConfig; import com.jsowell.adapay.factory.AdapayConfigFactory; -import com.jsowell.adapay.service.AdapayMemberService; +import com.jsowell.adapay.service.AdapayService; import com.jsowell.common.constant.CacheConstants; import com.jsowell.common.constant.Constants; import com.jsowell.common.core.domain.entity.SysDictData; @@ -175,7 +175,7 @@ public class SpringBootTestController { private IAdapayRefundRecordService adapayRefundRecordService; @Autowired - private AdapayMemberService adapayMemberService; + private AdapayService adapayMemberService; @Autowired private AMapService aMapService; @@ -371,7 +371,7 @@ public class SpringBootTestController { payOrderDTO.setMemberId(dto.getMemberId()); // payOrderDTO.setCode(); // payOrderDTO.setLockValue(); - payOrderDTO.setOrderBasicInfo(basicInfo); + // payOrderDTO.setOrderBasicInfo(basicInfo); Map map = orderBasicInfoService.payOrder(payOrderDTO); diff --git a/jsowell-common/src/main/java/com/jsowell/common/enums/uniapp/OrderPileOccupyPayStatusEnum.java b/jsowell-common/src/main/java/com/jsowell/common/enums/uniapp/OrderPileOccupyPayStatusEnum.java index 38cd53f47..d184bcc2b 100644 --- a/jsowell-common/src/main/java/com/jsowell/common/enums/uniapp/OrderPileOccupyPayStatusEnum.java +++ b/jsowell-common/src/main/java/com/jsowell/common/enums/uniapp/OrderPileOccupyPayStatusEnum.java @@ -8,7 +8,7 @@ package com.jsowell.common.enums.uniapp; */ public enum OrderPileOccupyPayStatusEnum { UN_PAY("0", "未支付"), - PAYMENT_COMPLETION("1", "未支付"), + PAYMENT_COMPLETION("1", "支付完成"), NO_PAYMENT_REQUIRED("2", "无需支付"), ; diff --git a/jsowell-common/src/main/java/com/jsowell/common/enums/ykc/ReturnCodeEnum.java b/jsowell-common/src/main/java/com/jsowell/common/enums/ykc/ReturnCodeEnum.java index d45a465aa..891803c2f 100644 --- a/jsowell-common/src/main/java/com/jsowell/common/enums/ykc/ReturnCodeEnum.java +++ b/jsowell-common/src/main/java/com/jsowell/common/enums/ykc/ReturnCodeEnum.java @@ -42,7 +42,7 @@ public enum ReturnCodeEnum { CODE_ORDER_INFO_ERROR("00100019", "订单信息有误"), - CODE_QUERY_ORDER_NULL_ERROR("00100020", "查询订单为空"), + CODE_QUERY_ORDER_INFO_IS_NULL("00100020", "未查到相关订单信息"), CODE_ORDER_PILE_MAPPING_ERROR("00100021", "订单与当前桩不匹配"), @@ -148,8 +148,6 @@ public enum ReturnCodeEnum { CODE_USER_UNBIND_CARNO_ERROR("00500003", "用户解绑车牌号异常"), - CODE_QUERY_ORDER_INFO_IS_NULL("00400011", "未查到相关订单信息!"), - CODE_PILE_NOT_INFO("00400012", "未查到该该桩的信息,请检查!"), CODE_SECRET_KEY_ERROR("00400013", "填写的桩密钥有误,请检查!"), diff --git a/jsowell-pile/src/main/java/com/jsowell/adapay/service/AdapayMemberService.java b/jsowell-pile/src/main/java/com/jsowell/adapay/service/AdapayService.java similarity index 90% rename from jsowell-pile/src/main/java/com/jsowell/adapay/service/AdapayMemberService.java rename to jsowell-pile/src/main/java/com/jsowell/adapay/service/AdapayService.java index 63c2a9b6a..6c6bcc1fd 100644 --- a/jsowell-pile/src/main/java/com/jsowell/adapay/service/AdapayMemberService.java +++ b/jsowell-pile/src/main/java/com/jsowell/adapay/service/AdapayService.java @@ -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 createPayment(PayOrderDTO dto) { + log.info("===============使用汇付支付-获取支付参数"); + // 相同参数重复请求,返回同一个支付对象 + String redisKey = CacheConstants.ADAPAY_ORDER_PARAM + dto.getOrderCode(); + Map 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 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 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 resultMap = JSONObject.parseObject(pay_info.toJSONString(), new TypeReference>() {}); + if (resultMap != null) { + // 请求参数放入缓存,15分钟以内返回同一个支付参数 + redisCache.setCacheObject(redisKey, resultMap, 15, TimeUnit.MINUTES); + } + return resultMap; + } + } catch (BaseAdaPayException e) { + log.error("汇付-获取支付对象发生异常", e); + } + return null; + } + /** * 创建结算账户 * diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/dto/PayOrderDTO.java b/jsowell-pile/src/main/java/com/jsowell/pile/dto/PayOrderDTO.java index bf17dbafe..ed132d61b 100644 --- a/jsowell-pile/src/main/java/com/jsowell/pile/dto/PayOrderDTO.java +++ b/jsowell-pile/src/main/java/com/jsowell/pile/dto/PayOrderDTO.java @@ -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; } diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/service/OrderPileOccupyService.java b/jsowell-pile/src/main/java/com/jsowell/pile/service/OrderPileOccupyService.java index 40914b36c..02231f390 100644 --- a/jsowell-pile/src/main/java/com/jsowell/pile/service/OrderPileOccupyService.java +++ b/jsowell-pile/src/main/java/com/jsowell/pile/service/OrderPileOccupyService.java @@ -1,11 +1,14 @@ package com.jsowell.pile.service; import com.jsowell.pile.domain.OrderPileOccupy; +import com.jsowell.pile.dto.PayOrderDTO; import com.jsowell.pile.dto.GenerateOccupyOrderDTO; import com.jsowell.pile.dto.QueryOccupyOrderDTO; import com.jsowell.pile.vo.uniapp.OrderPileOccupyVO; import java.util.List; +import java.util.Map; + public interface OrderPileOccupyService{ int deleteByPrimaryKey(Integer id); @@ -52,6 +55,8 @@ public interface OrderPileOccupyService{ */ List queryUnPayOrderByMemberId(String memberId); + Map payOccupyPileOrder(PayOrderDTO dto); + /** * 查询占桩订单列表 * @param memberId diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/OrderBasicInfoServiceImpl.java b/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/OrderBasicInfoServiceImpl.java index cfd2f9b42..70cf57ea8 100644 --- a/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/OrderBasicInfoServiceImpl.java +++ b/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/OrderBasicInfoServiceImpl.java @@ -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 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 weixinMap = adapayPayOrder(dto); + dto.setGoodsTitle("充电费用"); + dto.setGoodsDesc("充电桩预付款金额"); + Map 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 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 adapayPayOrder(PayOrderDTO dto) { + /*private Map 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; - } + }*/ /** * 余额支付订单逻辑 @@ -2911,7 +2907,7 @@ public class OrderBasicInfoServiceImpl implements IOrderBasicInfoService { throw new BusinessException(ReturnCodeEnum.CODE_BALANCE_IS_INSUFFICIENT); } BigDecimal principalAmount = memberVO.getPrincipalBalance(); // 会员剩余本金金额 - // BigDecimal giftAmount = memberVO.getGiftBalance(); // 会员剩余赠送余额 + BigDecimal giftAmount = memberVO.getGiftBalance(); // 会员剩余赠送余额 BigDecimal principalPay = null; // 30 BigDecimal giftPay = null; // 10 diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/OrderPileOccupyServiceImpl.java b/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/OrderPileOccupyServiceImpl.java index 357325191..3cb50cd34 100644 --- a/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/OrderPileOccupyServiceImpl.java +++ b/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/OrderPileOccupyServiceImpl.java @@ -1,7 +1,13 @@ 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.MemberWalletEnum; +import com.jsowell.common.enums.ykc.OrderPayModeEnum; +import com.jsowell.common.enums.ykc.ReturnCodeEnum; +import com.jsowell.common.exception.BusinessException; import com.jsowell.common.enums.uniapp.OrderPileOccupyPayStatusEnum; import com.jsowell.common.enums.uniapp.OrderPileOccupyStatusEnum; import com.jsowell.common.util.DateUtils; @@ -9,18 +15,18 @@ import com.jsowell.common.util.PageUtils; 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.GenerateOccupyOrderDTO; import com.jsowell.pile.dto.QueryOccupyOrderDTO; import com.jsowell.pile.dto.QueryOrderDTO; import com.jsowell.pile.mapper.OrderPileOccupyMapper; -import com.jsowell.pile.service.IOrderBasicInfoService; -import com.jsowell.pile.service.IPileBasicInfoService; -import com.jsowell.pile.service.IPileBillingTemplateService; -import com.jsowell.pile.service.OrderPileOccupyService; +import com.jsowell.pile.service.*; import com.jsowell.pile.vo.base.PileInfoVO; +import com.jsowell.pile.vo.uniapp.MemberVO; import com.jsowell.pile.vo.uniapp.OrderPileOccupyVO; import com.jsowell.pile.vo.web.BillingTemplateVO; import com.jsowell.pile.vo.web.OrderListVO; +import com.jsowell.pile.vo.web.UpdateMemberBalanceDTO; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; @@ -28,10 +34,11 @@ import javax.annotation.Resource; import java.math.BigDecimal; import java.util.Date; import java.util.List; +import java.util.Map; @Slf4j @Service -public class OrderPileOccupyServiceImpl implements OrderPileOccupyService{ +public class OrderPileOccupyServiceImpl implements OrderPileOccupyService { @Resource private OrderPileOccupyMapper orderPileOccupyMapper; @@ -45,6 +52,12 @@ public class OrderPileOccupyServiceImpl implements OrderPileOccupyService{ @Resource private IPileBillingTemplateService pileBillingTemplateService; + @Resource + private AdapayService adapayService; + + @Resource + private IMemberBasicInfoService memberBasicInfoService; + @Override public int deleteByPrimaryKey(Integer id) { return orderPileOccupyMapper.deleteByPrimaryKey(id); @@ -102,6 +115,7 @@ public class OrderPileOccupyServiceImpl implements OrderPileOccupyService{ /** * 根据占桩订单编号查询占桩订单 + * * @param occupyCode 占桩订单编号 * @return */ @@ -115,6 +129,7 @@ public class OrderPileOccupyServiceImpl implements OrderPileOccupyService{ /** * 查询占桩订单列表 + * * @param dto * @return */ @@ -126,6 +141,7 @@ public class OrderPileOccupyServiceImpl implements OrderPileOccupyService{ /** * 生成占桩订单 * 在会员操作降地锁后,就生成占桩订单 + * * @param dto 会员id 充电桩编号 充电桩枪口号 */ @Override @@ -157,6 +173,7 @@ public class OrderPileOccupyServiceImpl implements OrderPileOccupyService{ /** * 收到地锁升起指令,调用这个方法,停止计时 * 占桩订单停止计费/停止占桩订单计费 + * * @param pileSn * @param connectorCode */ @@ -270,6 +287,7 @@ public class OrderPileOccupyServiceImpl implements OrderPileOccupyService{ /** * 查询占桩订单列表 + * * @param memberId * @return */ @@ -297,6 +315,68 @@ public class OrderPileOccupyServiceImpl implements OrderPileOccupyService{ public OrderPileOccupy getOrderInfoByPile(String pileSn, String connectorCode) { return orderPileOccupyMapper.getOrderInfoByPile(pileSn, connectorCode); } + /* + * 支付占桩订单 + * + * @param dto + * @return + */ + @Override + public Map payOccupyPileOrder(PayOrderDTO dto) { + // 查询占桩订单详情 + OrderPileOccupy orderPileOccupy = queryByOccupyCode(dto.getOrderCode()); + if (orderPileOccupy == null) { + throw new BusinessException(ReturnCodeEnum.CODE_QUERY_ORDER_INFO_IS_NULL); + } + // 支付方式 + Map 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 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) { + // 查会员余额 + MemberVO memberVO = memberBasicInfoService.queryMemberInfoByMemberId(dto.getMemberId()); + if (memberVO == null) { + throw new BusinessException(ReturnCodeEnum.CODE_MEMBER_NOT_FOUND_ERROR); + } + // 校验金额 + BigDecimal principalBalance = memberVO.getPrincipalBalance(); + if (dto.getPayAmount().compareTo(principalBalance) > 0) { + throw new BusinessException(ReturnCodeEnum.CODE_BALANCE_IS_INSUFFICIENT); + } + // 扣除会员余额 + UpdateMemberBalanceDTO updateMemberBalanceDTO = new UpdateMemberBalanceDTO(); + updateMemberBalanceDTO.setMemberId(dto.getMemberId()); + updateMemberBalanceDTO.setUpdatePrincipalBalance(dto.getPayAmount()); // 更新会员本金金额,单位元 + updateMemberBalanceDTO.setType(MemberWalletEnum.TYPE_OUT.getValue()); + updateMemberBalanceDTO.setSubType(MemberWalletEnum.SUBTYPE_PAYMENT_FOR_ORDER.getValue()); + memberBasicInfoService.updateMemberBalance(updateMemberBalanceDTO); + + // 更新占桩订单状态 + OrderPileOccupy orderPileOccupy = queryByOccupyCode(dto.getOrderCode()); + orderPileOccupy.setStatus(OrderPileOccupyStatusEnum.ORDER_COMPLETE.getValue()); + orderPileOccupy.setPayStatus(OrderPileOccupyPayStatusEnum.PAYMENT_COMPLETION.getValue()); + updateByPrimaryKeySelective(orderPileOccupy); + } + + private void whiteListPayOccupyPileOrder(PayOrderDTO dto) { + // 更新占桩订单状态 + OrderPileOccupy orderPileOccupy = queryByOccupyCode(dto.getOrderCode()); + orderPileOccupy.setStatus(OrderPileOccupyStatusEnum.ORDER_COMPLETE.getValue()); + orderPileOccupy.setPayStatus(OrderPileOccupyPayStatusEnum.NO_PAYMENT_REQUIRED.getValue()); + updateByPrimaryKeySelective(orderPileOccupy); + } } diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/vo/uniapp/MemberVO.java b/jsowell-pile/src/main/java/com/jsowell/pile/vo/uniapp/MemberVO.java index 1f105491a..24a874c27 100644 --- a/jsowell-pile/src/main/java/com/jsowell/pile/vo/uniapp/MemberVO.java +++ b/jsowell-pile/src/main/java/com/jsowell/pile/vo/uniapp/MemberVO.java @@ -47,7 +47,7 @@ public class MemberVO { /** * 赠送金额 */ - // private BigDecimal giftBalance; + private BigDecimal giftBalance; /** * 总账户余额