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 c939fe895..438af38fa 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 @@ -169,54 +169,6 @@ public class PayController extends BaseController { return response; } - /** - * 使用adapay支付订单 - * http://localhost:8080/uniapp/pay/payOrderWithAdapay - * @param request - * @param dto - * @return - */ - @PostMapping("/payOrderWithAdapay") - public RestApiResponse payOrderWithAdapay(HttpServletRequest request, @RequestBody PayOrderDTO dto) { - logger.info("adapay支付订单 param:{}", dto.toString()); - RestApiResponse response; - - // 支付订单加锁 - String lockKey = "pay_order_" + dto.getOrderCode(); - String lockValue = IdUtils.fastUUID(); - try { - String memberId = getMemberIdByAuthorization(request); - if (StringUtils.isBlank(memberId)) { - throw new BusinessException(ReturnCodeEnum.CODE_TOKEN_ERROR); - } - if (dto.getPayAmount() == null) { - throw new BusinessException(ReturnCodeEnum.CODE_PARAM_NOT_NULL_ERROR); - } - dto.setMemberId(memberId); - dto.setLockValue(lockValue); - // redis锁 - Boolean isLock = redisCache.lock(lockKey, lockValue, 60); - Map map = null; - if (isLock) { - map = orderService.payOrderWithAdapay(dto); - } - response = new RestApiResponse<>(map); - } catch (BusinessException e) { - logger.warn("adapay支付订单 warn param:{}", dto.toString(), e); - response = new RestApiResponse<>(e.getCode(), e.getMessage()); - } catch (Exception e) { - logger.error("adapay支付订单 error param:{}", dto.toString(), e); - response = new RestApiResponse<>(ReturnCodeEnum.CODE_ORDER_PAY_ERROR); - } finally { - // 支付订单解锁 - if (lockValue.equals(redisCache.getCacheObject(lockKey).toString())) { - redisCache.unLock(lockKey); - } - } - logger.info("adapay支付订单 result:{}", JSONObject.toJSONString(response)); - return response; - } - /** * 7003 获取支付方式 * http://localhost:8080/uniapp/pay/getPayMode 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 41ea0dfb2..01d74de27 100644 --- a/jsowell-admin/src/main/java/com/jsowell/service/OrderService.java +++ b/jsowell-admin/src/main/java/com/jsowell/service/OrderService.java @@ -2,22 +2,15 @@ package com.jsowell.service; import com.alibaba.fastjson2.JSON; import com.alibaba.fastjson2.JSONObject; -import com.alibaba.fastjson2.TypeReference; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.PropertyNamingStrategies; import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; -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.AdapayCore; -import com.huifu.adapay.core.exception.BaseAdaPayException; import com.huifu.adapay.core.util.AdapaySign; -import com.huifu.adapay.model.Payment; -import com.jsowell.adapay.common.CreateAdaPaymentParam; -import com.jsowell.common.constant.CacheConstants; import com.jsowell.common.constant.Constants; import com.jsowell.common.core.domain.vo.AuthorizedDeptVO; import com.jsowell.common.core.domain.ykc.RealTimeMonitorData; @@ -30,7 +23,6 @@ import com.jsowell.common.enums.MemberWalletEnum; import com.jsowell.common.enums.adapay.AdapayEventEnum; import com.jsowell.common.enums.ykc.*; import com.jsowell.common.exception.BusinessException; -import com.jsowell.common.util.AdapayUtil; import com.jsowell.common.util.DateUtils; import com.jsowell.common.util.SecurityUtils; import com.jsowell.common.util.StringUtils; @@ -43,9 +35,11 @@ import com.jsowell.pile.vo.base.OrderAmountDetailVO; import com.jsowell.pile.vo.base.OrderPeriodAmountVO; import com.jsowell.pile.vo.base.PileInfoVO; import com.jsowell.pile.vo.base.StationInfoVO; -import com.jsowell.pile.vo.uniapp.InvoiceRecordVO; import com.jsowell.pile.vo.uniapp.*; -import com.jsowell.pile.vo.web.*; +import com.jsowell.pile.vo.web.OrderDetailInfoVO; +import com.jsowell.pile.vo.web.PileStationVO; +import com.jsowell.pile.vo.web.PlatformTesterVO; +import com.jsowell.pile.vo.web.UpdateMemberBalanceDTO; import com.jsowell.wxpay.dto.WeChatRefundDTO; import com.jsowell.wxpay.response.WechatPayNotifyParameter; import org.apache.commons.collections4.CollectionUtils; @@ -53,7 +47,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 javax.servlet.http.HttpServletRequest; @@ -61,7 +54,6 @@ import java.math.BigDecimal; import java.text.ParseException; import java.time.LocalDateTime; import java.util.*; -import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; @Service @@ -164,264 +156,6 @@ public class OrderService { return resultMap; } - /** - * 使用adapay支付订单 - * @param dto - * @return - */ - public Map payOrderWithAdapay(PayOrderDTO dto) { - OrderBasicInfo orderInfo = orderBasicInfoService.getOrderInfoByOrderCode(dto.getOrderCode()); - if (orderInfo == null) { - throw new BusinessException(ReturnCodeEnum.CODE_QUERY_ORDER_NULL_ERROR); - } - if (!StringUtils.equals(orderInfo.getPayStatus(), "0")) { - // 订单已支付 - throw new BusinessException(ReturnCodeEnum.CODE_ORDER_IS_NOT_TO_BE_PAID_ERROR); - } - Map resultMap = Maps.newHashMap(); - if (StringUtils.equals(dto.getPayMode(), OrderPayModeEnum.PAYMENT_OF_BALANCE.getValue())) { - // 余额支付 - balancePayOrder(dto); - } else if (StringUtils.equals(dto.getPayMode(), OrderPayModeEnum.PAYMENT_OF_WECHATPAY.getValue())) { - // 微信支付 使用adapay - dto.setOrderBasicInfo(orderInfo); - Map weixinMap = adapayPayOrder(dto); - // 返回微信支付参数 - resultMap.put("weixinMap", weixinMap); - } else if (StringUtils.equals(dto.getPayMode(), OrderPayModeEnum.PAYMENT_OF_ALIPAY.getValue())) { // 支付宝支付 - // TODO 返回支付宝支付参数 - } else if (StringUtils.equals(dto.getPayMode(), OrderPayModeEnum.PAYMENT_OF_WHITELIST.getValue())) { // 白名单支付 - // 白名单支付可以直接调支付回调方法 - dto.setPayAmount(new BigDecimal("500")); - whiteListPayOrder(dto); - } - return resultMap; - } - - /** - * 白名单支付订单逻辑 - * @param dto - */ - private void whiteListPayOrder(PayOrderDTO dto) { - String orderCode = dto.getOrderCode(); - BigDecimal payAmount = dto.getPayAmount(); - String payMode = dto.getPayMode(); - PayOrderSuccessCallbackDTO callbackDTO = PayOrderSuccessCallbackDTO.builder() - .orderCode(orderCode) - .payAmount(payAmount) - .payMode(payMode) - .build(); - orderBasicInfoService.payOrderSuccessCallback(callbackDTO); - } - - /** - * 使用汇付支付 - * @param dto - * @return - */ - private Map adapayPayOrder(PayOrderDTO dto) { - log.info("===============使用汇付支付"); - // 相同参数重复请求,返回同一个支付对象 - String redisKey = CacheConstants.ADAPAY_ORDER_PARAM + dto.getOrderCode(); - Map cacheObject = redisCache.getCacheObject(redisKey); - if (cacheObject != null) { - return cacheObject; - } - - OrderBasicInfo orderInfo = dto.getOrderBasicInfo(); - if (orderInfo == null) { - // 订单为空重新查询 - orderInfo = orderBasicInfoService.getOrderInfoByOrderCode(dto.getOrderCode()); - } - // 获取openId - String openId = memberService.getOpenIdByCode(dto.getCode()); - if (StringUtils.isBlank(openId)) { - throw new BusinessException(ReturnCodeEnum.CODE_GET_OPEN_ID_BY_CODE_ERROR); - } - - // 封装对象 - String amount = AdapayUtil.formatAmount(dto.getPayAmount()); // 用户支付金额 - CreateAdaPaymentParam createAdaPaymentParam = new CreateAdaPaymentParam(); - createAdaPaymentParam.setOrder_no(orderInfo.getOrderCode()); - createAdaPaymentParam.setPay_amt(amount); - createAdaPaymentParam.setApp_id(ADAPAY_APP_ID); - createAdaPaymentParam.setPay_channel("wx_lite"); // todo 如果以后有支付宝等别的渠道,这里需要做修改,判断是什么渠道的请求 - createAdaPaymentParam.setGoods_title("充电费用"); - createAdaPaymentParam.setGoods_desc("充电桩预付款金额"); // 这个字段是微信支付凭证的商品名 - Map map = Maps.newHashMap(); - map.put("type", ScenarioEnum.ORDER.getValue()); - map.put("orderCode", dto.getOrderCode()); - 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))); - - // 分账对象信息 - // String adapayMemberId = adapayMemberAccountService.selectAdapayMemberIdByStationId(orderInfo.getStationId()); - // if (StringUtils.isNotBlank(adapayMemberId)) { - // JSONObject jsonObject = new JSONObject(); - // jsonObject.put("member_id", adapayMemberId); - // jsonObject.put("amount", amount); - // jsonObject.put("fee_flag", Constants.Y); - // - // // 分账对象信息列表,最多仅支持7个分账方,json 数组形式 - // JSONArray jsonArray = new JSONArray(); - // jsonArray.add(jsonObject); - // createAdaPaymentParam.setDiv_members(jsonArray.toString()); - // } - - // 延时分账 - createAdaPaymentParam.setPay_mode("delay"); - try { - log.info("创建汇付支付参数:{}", JSONObject.toJSONString(createAdaPaymentParam)); - Map response = Payment.create(BeanMap.create(createAdaPaymentParam)); - 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) { - // 表示已经获取到支付参数了,后续再有支付请求就拒绝 - redisCache.setCacheObject(redisKey, resultMap, 15, TimeUnit.MINUTES); - } - return resultMap; - } - } catch (BaseAdaPayException e) { - log.error("汇付-获取支付对象发生异常", e); - } - return null; - } - - /** - * 微信支付订单逻辑 获取支付参数 - * @param dto - * @return - * @throws Exception - */ - private Map wechatPayOrder(PayOrderDTO dto) throws Exception { - // 相同参数重复请求,返回同一个支付对象 - String redisKey = CacheConstants.WECHAT_PAY_ORDER_PARAM + dto.getOrderCode(); - Map cacheObject = redisCache.getCacheObject(redisKey); - if (cacheObject != null) { - return cacheObject; - } - - OrderBasicInfo orderInfo = dto.getOrderBasicInfo(); - if (orderInfo == null) { - orderInfo = orderBasicInfoService.getOrderInfoByOrderCode(dto.getOrderCode()); - } - String openId = memberService.getOpenIdByCode(dto.getCode()); - if (StringUtils.isBlank(openId)) { - throw new BusinessException(ReturnCodeEnum.CODE_GET_OPEN_ID_BY_CODE_ERROR); - } - WeixinPayDTO weixinPayDTO = new WeixinPayDTO(); - weixinPayDTO.setOpenId(openId); - weixinPayDTO.setAmount(dto.getPayAmount().toString()); - // 支付订单 附加参数 - PaymentScenarioDTO paymentScenarioDTO = PaymentScenarioDTO.builder() - .type(ScenarioEnum.ORDER.getValue()) - .orderCode(dto.getOrderCode()) - .memberId(orderInfo.getMemberId()) - .build(); - weixinPayDTO.setAttach(JSONObject.toJSONString(paymentScenarioDTO)); - weixinPayDTO.setDescription("充电费用"); - Map payV3 = this.weixinPayV3(weixinPayDTO); - if (payV3 != null) { - // 表示已经获取到支付参数了,后续再有支付请求就拒绝 - redisCache.setCacheObject(redisKey, payV3, 15, TimeUnit.MINUTES); - } - return payV3; - } - - /** - * 余额支付订单逻辑 - * @param dto - */ - private void balancePayOrder(PayOrderDTO dto) { - // 记录支付流水 - List payRecordList = Lists.newArrayList(); - String orderCode = dto.getOrderCode(); - BigDecimal chargeAmount = dto.getPayAmount(); - // 查询该会员的余额 - MemberVO memberVO = memberService.getMemberInfoByMemberId(dto.getMemberId()); - BigDecimal totalAccountAmount = memberVO.getTotalAccountAmount(); - - if (totalAccountAmount.compareTo(chargeAmount) < 0) { - // 总余额小于充电金额 - throw new BusinessException(ReturnCodeEnum.CODE_BALANCE_IS_INSUFFICIENT); - } - BigDecimal principalAmount = memberVO.getPrincipalBalance(); // 会员剩余本金金额 - // BigDecimal giftAmount = memberVO.getGiftBalance(); // 会员剩余赠送余额 - - BigDecimal principalPay = null; // 30 - BigDecimal giftPay = null; // 10 - // 先扣除本金金额,再扣除赠送金额 - BigDecimal subtract = principalAmount.subtract(chargeAmount); - if (subtract.compareTo(BigDecimal.ZERO) >= 0) { - principalPay = chargeAmount; - } else { - if (principalAmount.compareTo(BigDecimal.ZERO) > 0) { - principalPay = principalAmount; - } - giftPay = subtract.negate(); - } - - // 更新会员钱包 - UpdateMemberBalanceDTO updateMemberBalanceDTO = UpdateMemberBalanceDTO.builder() - .memberId(dto.getMemberId()) - .type(MemberWalletEnum.TYPE_OUT.getValue()) - .subType(MemberWalletEnum.SUBTYPE_PAYMENT_FOR_ORDER.getValue()) - .updatePrincipalBalance(principalPay) - .updateGiftBalance(giftPay) - .relatedOrderCode(orderCode) - .build(); - memberBasicInfoService.updateMemberBalance(updateMemberBalanceDTO); - - // 记录流水 - if (principalPay != null) { - payRecordList.add(OrderPayRecord.builder() - .orderCode(orderCode) - .payMode(OrderPayRecordEnum.PRINCIPAL_BALANCE_PAYMENT.getValue()) - .payAmount(principalPay) - .acquirer(AcquirerEnum.LOCAL.getValue()) - .createBy(dto.getMemberId()) - .build()); - } - if (giftPay != null) { - payRecordList.add(OrderPayRecord.builder() - .orderCode(orderCode) - .payMode(OrderPayRecordEnum.GIFT_BALANCE_PAYMENT.getValue()) - .payAmount(giftPay) - .acquirer(AcquirerEnum.LOCAL.getValue()) - .createBy(dto.getMemberId()) - .build()); - } - // 余额支付可以直接调支付回调方法 - PayOrderSuccessCallbackDTO callbackDTO = PayOrderSuccessCallbackDTO.builder() - .orderCode(orderCode) - .payAmount(chargeAmount) - .payMode(dto.getPayMode()) - .build(); - orderBasicInfoService.payOrderSuccessCallback(callbackDTO); - - // 余额支付订单 记录会员交易流水 - MemberTransactionRecord record = MemberTransactionRecord.builder() - .orderCode(orderCode) - .scenarioType(ScenarioEnum.ORDER.getValue()) - .memberId(memberVO.getMemberId()) - .actionType(ActionTypeEnum.FORWARD.getValue()) - .payMode(PayModeEnum.PAYMENT_OF_BALANCE.getValue()) - .paymentInstitutions(PaymentInstitutionsEnum.LOCAL_ACCOUNTS.getValue()) - .amount(dto.getPayAmount()) // 单位元 - .build(); - memberTransactionRecordService.insertSelective(record); - - // 订单支付流水入库 - if (CollectionUtils.isNotEmpty(payRecordList)) { - orderPayRecordService.batchInsert(payRecordList); - } - } - /** * 结算订单 * endCharging