| | |
| | | |
| | | import com.alibaba.fastjson2.JSONObject; |
| | | import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; |
| | | import com.xinquan.common.core.constant.Constants; |
| | | import com.xinquan.common.core.constant.SecurityConstants; |
| | | import com.xinquan.common.core.enums.ChargeTypeEnum; |
| | | import com.xinquan.common.core.enums.DisabledEnum; |
| | |
| | | import com.xinquan.common.core.enums.PaymentTypeEnum; |
| | | import com.xinquan.common.core.exception.ServiceException; |
| | | import com.xinquan.common.core.utils.ip.IpUtils; |
| | | import com.xinquan.common.security.utils.SecurityUtils; |
| | | import com.xinquan.common.security.service.TokenService; |
| | | import com.xinquan.course.api.domain.Course; |
| | | import com.xinquan.course.api.feign.RemoteCourseService; |
| | | import com.xinquan.meditation.api.domain.Meditation; |
| | |
| | | import com.xinquan.order.mapper.OrderMapper; |
| | | import com.xinquan.order.service.OrderPaymentRecordService; |
| | | import com.xinquan.order.service.OrderService; |
| | | import com.xinquan.order.utils.JuHeFuUtil; |
| | | import com.xinquan.common.core.utils.JuHeFuUtil; |
| | | import com.xinquan.order.utils.OrderUtil; |
| | | import com.xinquan.user.api.domain.AppUser; |
| | | import com.xinquan.system.api.domain.AppUser; |
| | | import com.xinquan.system.api.domain.AppUserWalletRecord; |
| | | import com.xinquan.system.api.model.LoginUser; |
| | | import com.xinquan.user.api.domain.dto.AppUserDTO; |
| | | import com.xinquan.user.api.feign.RemoteAppUserService; |
| | | import java.math.BigDecimal; |
| | | import java.math.RoundingMode; |
| | | import java.time.LocalDateTime; |
| | | import java.util.List; |
| | | |
| | | import lombok.Data; |
| | | import lombok.RequiredArgsConstructor; |
| | | import org.jetbrains.annotations.NotNull; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.stereotype.Service; |
| | | import org.springframework.transaction.annotation.Transactional; |
| | | |
| | |
| | | private RemoteAppUserService remoteAppUserService; |
| | | @Resource |
| | | private OrderPaymentRecordService orderPaymentRecordService; |
| | | |
| | | @Autowired |
| | | private TokenService tokenService; |
| | | /** |
| | | * 创建待支付订单 |
| | | * |
| | |
| | | */ |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public ClientPlaceOrderVO placeOrder(Long targetId, Integer orderFrom, Long receiverId, |
| | | Integer balanceFlag, Integer payType) throws Exception { |
| | | public ClientPlaceOrderVO placeOrder(Long targetId, Integer orderFrom, Long receiverId, Long orderId, |
| | | Integer balanceFlag, Integer payType,BigDecimal amount,Integer vipType,Integer type) throws Exception { |
| | | // 获取当前登录用户id |
| | | Long userId = SecurityUtils.getUserId(); |
| | | LoginUser loginUser = tokenService.getLoginUser(); |
| | | if (loginUser==null){ |
| | | return new ClientPlaceOrderVO(); |
| | | } |
| | | Long userId = loginUser.getUserid(); |
| | | if (amount!=null){ |
| | | amount = amount.setScale(2, RoundingMode.HALF_DOWN); |
| | | } |
| | | // 获取用户信息 |
| | | AppUser appUser = getAppUserById(userId); |
| | | ClientPlaceOrderVO clientPlaceOrderVO = new ClientPlaceOrderVO(); |
| | | Order order = new Order(); |
| | | order.setPayType(payType); |
| | | AppUser data = remoteAppUserService.getAppUserById(userId + "").getData(); |
| | | |
| | | // 购买冥想音频 |
| | | if (orderFrom == 1) { |
| | | Meditation meditation = remoteMeditationService.getMeditationById(targetId, |
| | | SecurityConstants.INNER).getData(); |
| | | String meditationTitle = meditation.getMeditationTitle(); |
| | | String detailDescription = meditation.getDetailDescription(); |
| | | String detailDescription = "购买疗愈音频"; |
| | | String wxOpenId = appUser.getWxOpenId(); |
| | | // 创建订单 |
| | | String orderNo = OrderUtil.getOrderNoForPrefix("MX"); |
| | | order.setOrderFrom(orderFrom); |
| | | order.setBizOrderNo(orderNo); |
| | | order.setBusinessId(meditation.getId()); |
| | | order.setAppUserId(userId); |
| | | order.setTotalAmount(meditation.getGeneralPrice()); |
| | | this.save(order); |
| | | Long orderId = order.getId(); |
| | | clientPlaceOrderVO.setOrderNo(orderNo); |
| | | clientPlaceOrderVO.setId(orderId); |
| | | // 如果冥想音频价格设定为单独收费,且需要使用余额抵扣 |
| | | if (balanceFlag.equals(1) && meditation.getChargeType() |
| | | .equals(ChargeTypeEnum.SEPARATE_CHARGE.getCode())) { |
| | | BigDecimal needPayAmount = handleBalancePayment(appUser, |
| | | meditation.getGeneralPrice(), |
| | | orderId); |
| | | if (orderId==null){ |
| | | order.setPayType(payType); |
| | | order.setOrderFrom(orderFrom); |
| | | order.setBizOrderNo(orderNo); |
| | | order.setBusinessId(meditation.getId()); |
| | | order.setAppUserId(userId); |
| | | order.setRealPayAmount(type==null?meditation.getGeneralPrice():meditation.getIosPrice()); |
| | | order.setTotalAmount(type==null?meditation.getGeneralPrice():meditation.getIosPrice()); |
| | | order.setPayType(payType); |
| | | order.setBuyContent("购买疗愈【"+meditationTitle+"】"); |
| | | order.setGiveUserId(receiverId); |
| | | this.save(order); |
| | | }else{ |
| | | order = this.getById(orderId); |
| | | order.setBizOrderNo(orderNo); |
| | | order.setBuyContent("购买疗愈【"+meditationTitle+"】"); |
| | | this.updateById(order); |
| | | } |
| | | |
| | | Long orderId9 = order.getId(); |
| | | clientPlaceOrderVO.setOrderNo(orderNo); |
| | | clientPlaceOrderVO.setId(orderId9); |
| | | |
| | | // 如果冥想音频价格设定为单独收费,且需要使用余额抵扣 |
| | | if (data.getBalance().compareTo(new BigDecimal("0")) > 0 && balanceFlag.equals(1) && meditation.getChargeType().equals(ChargeTypeEnum.SEPARATE_CHARGE.getCode())) { |
| | | BigDecimal needPayAmount = handleBalancePayment(appUser, |
| | | type==null?meditation.getGeneralPrice():meditation.getIosPrice(), |
| | | orderId9); |
| | | if (needPayAmount.compareTo(BigDecimal.ZERO) <= 0) { |
| | | clientPlaceOrderVO.setZeroFlag(DisabledEnum.YES.getCode()); |
| | | // 抵扣后金额为0 为余额支付 |
| | | order.setPayType(4); |
| | | order.setBuyContent("购买疗愈【"+meditationTitle+"】"); |
| | | this.updateById(order); |
| | | return clientPlaceOrderVO; |
| | | } |
| | | if (payType==1){ |
| | | // 微信+余额 |
| | | order.setPayType(5); |
| | | }else if (payType == 2){ |
| | | // 支付宝+余额 |
| | | order.setPayType(6); |
| | | } |
| | | order.setBuyContent("购买疗愈【"+meditationTitle+"】"); |
| | | this.updateById(order); |
| | | // 创建支付订单 |
| | | createPayment(payType, orderNo, needPayAmount, meditationTitle, detailDescription, |
| | | wxOpenId, orderId, clientPlaceOrderVO); |
| | | createPayment(payType, orderNo, needPayAmount, meditationTitle, "购买疗愈", |
| | | wxOpenId, orderId9, clientPlaceOrderVO); |
| | | } else { |
| | | // 创建支付订单 |
| | | createPayment(payType, orderNo, meditation.getGeneralPrice(), meditationTitle, |
| | | detailDescription, wxOpenId, orderId, clientPlaceOrderVO); |
| | | createPayment(payType, orderNo, type==null?order.getRealPayAmount():order.getRealPayAmount(), meditationTitle, |
| | | "购买疗愈", wxOpenId, orderId9, clientPlaceOrderVO); |
| | | } |
| | | } else { |
| | | } |
| | | else if (orderFrom == 2){ |
| | | // 购买课程 |
| | | Course course = remoteCourseService.getCourseById(targetId, |
| | | SecurityConstants.INNER).getData(); |
| | | Course course = remoteCourseService.getCourseById(targetId).getData(); |
| | | String courseTitle = course.getCourseTitle(); |
| | | String wxOpenId = appUser.getWxOpenId(); |
| | | String description = course.getDescription(); |
| | | String description = "购买课程"; |
| | | |
| | | // 创建订单 |
| | | String orderNo = OrderUtil.getOrderNoForPrefix("KC"); |
| | | order.setOrderFrom(orderFrom); |
| | | order.setBizOrderNo(orderNo); |
| | | order.setBusinessId(course.getId()); |
| | | order.setAppUserId(userId); |
| | | order.setTotalAmount(course.getGeneralPrice()); |
| | | this.save(order); |
| | | Long orderId = order.getId(); |
| | | clientPlaceOrderVO.setOrderNo(orderNo); |
| | | clientPlaceOrderVO.setId(orderId); |
| | | if (orderId==null){ |
| | | order.setOrderFrom(orderFrom); |
| | | order.setBizOrderNo(orderNo); |
| | | order.setGiveUserId(receiverId); |
| | | order.setBusinessId(course.getId()); |
| | | |
| | | if (balanceFlag.equals(1) && course.getChargeType() |
| | | order.setAppUserId(userId); |
| | | order.setBuyContent("购买课程【"+courseTitle+"】"); |
| | | order.setRealPayAmount(type==null?course.getGeneralPrice():course.getIosPrice()); |
| | | order.setTotalAmount(type==null?course.getGeneralPrice():course.getIosPrice()); |
| | | this.save(order); |
| | | }else{ |
| | | order = this.getById(orderId); |
| | | order.setBuyContent("购买课程【"+courseTitle+"】"); |
| | | order.setBizOrderNo(orderNo); |
| | | this.updateById(order); |
| | | |
| | | } |
| | | Long orderId8 = order.getId(); |
| | | clientPlaceOrderVO.setOrderNo(orderNo); |
| | | clientPlaceOrderVO.setId(orderId8); |
| | | |
| | | if (data.getBalance().compareTo(new BigDecimal("0")) > 0 && balanceFlag.equals(1) && course.getChargeType() |
| | | .equals(ChargeTypeEnum.SEPARATE_CHARGE.getCode())) { |
| | | BigDecimal needPayAmount = handleBalancePayment(appUser, course.getGeneralPrice(), |
| | | orderId); |
| | | BigDecimal needPayAmount = handleBalancePayment(appUser, type==null?course.getGeneralPrice():course.getIosPrice(), |
| | | orderId8); |
| | | |
| | | if (needPayAmount.compareTo(BigDecimal.ZERO) <= 0) { |
| | | clientPlaceOrderVO.setZeroFlag(DisabledEnum.YES.getCode()); |
| | | // 抵扣后金额为0 为余额支付 |
| | | order.setPayType(4); |
| | | order.setBuyContent("购买课程【"+courseTitle+"】"); |
| | | |
| | | this.updateById(order); |
| | | return clientPlaceOrderVO; |
| | | } |
| | | if (payType==1){ |
| | | // 微信+余额 |
| | | order.setPayType(5); |
| | | }else if (payType == 2){ |
| | | // 支付宝+余额 |
| | | order.setPayType(6); |
| | | } |
| | | order.setBuyContent("购买课程【"+courseTitle+"】"); |
| | | |
| | | this.updateById(order); |
| | | // 创建支付订单 |
| | | createPayment(payType, orderNo, needPayAmount, courseTitle, description, |
| | | wxOpenId, orderId, clientPlaceOrderVO); |
| | | createPayment(payType, orderNo, needPayAmount, courseTitle, "购买课程", |
| | | wxOpenId, orderId8, clientPlaceOrderVO); |
| | | } else { |
| | | // 创建支付订单 |
| | | createPayment(payType, orderNo, course.getGeneralPrice(), courseTitle, |
| | | description, wxOpenId, orderId, clientPlaceOrderVO); |
| | | createPayment(payType, orderNo, order.getRealPayAmount(), courseTitle, |
| | | "购买课程", wxOpenId, orderId8, clientPlaceOrderVO); |
| | | } |
| | | } |
| | | else if (orderFrom == 3){ |
| | | String wxOpenId = appUser.getWxOpenId(); |
| | | // 创建订单 |
| | | String orderNo = OrderUtil.getOrderNoForPrefix("HY"); |
| | | order.setOrderFrom(orderFrom); |
| | | order.setBizOrderNo(orderNo); |
| | | order.setAppUserId(userId); |
| | | order.setTotalAmount(amount); |
| | | order.setPayType(payType); |
| | | order.setRealPayAmount(amount); |
| | | String vipType1 =""; |
| | | switch (vipType){ |
| | | case 1: |
| | | vipType1="月会员"; |
| | | break; |
| | | case 2: |
| | | vipType1="季会员"; |
| | | break; |
| | | case 3: |
| | | vipType1="年会员"; |
| | | break; |
| | | } |
| | | order.setBuyContent(vipType1); |
| | | this.save(order); |
| | | Long orderId7 = order.getId(); |
| | | clientPlaceOrderVO.setOrderNo(orderNo); |
| | | clientPlaceOrderVO.setId(orderId7); |
| | | // 创建支付订单 |
| | | createPayment(payType, orderNo, amount, "购买会员", |
| | | vipType1, wxOpenId, orderId7, clientPlaceOrderVO); |
| | | |
| | | }else { |
| | | // 充值 |
| | | String wxOpenId = appUser.getWxOpenId(); |
| | | // 创建订单 |
| | | String orderNo = OrderUtil.getOrderNoForPrefix("CZ"); |
| | | order.setOrderFrom(orderFrom); |
| | | order.setBizOrderNo(orderNo); |
| | | order.setAppUserId(userId); |
| | | order.setTotalAmount(amount); |
| | | order.setRealPayAmount(amount); |
| | | order.setPayType(payType); |
| | | order.setBuyContent("充值"); |
| | | this.save(order); |
| | | Long orderId6 = order.getId(); |
| | | clientPlaceOrderVO.setOrderNo(orderNo); |
| | | clientPlaceOrderVO.setId(orderId6); |
| | | // 创建支付订单 |
| | | createPayment(payType, orderNo, amount, "充值余额", |
| | | "充值余额", wxOpenId, orderId6, clientPlaceOrderVO); |
| | | } |
| | | return clientPlaceOrderVO; |
| | | } |
| | |
| | | if (appUser.getBalance().compareTo(BigDecimal.ZERO) < 0) { |
| | | throw new ServiceException("用户可用余额不足,请重新选择支付方案"); |
| | | } |
| | | // 更新用户余额 |
| | | remoteAppUserService.updateAppUser( |
| | | AppUserDTO.builder().balance( |
| | | appUser.getBalance().subtract(generalPrice)) |
| | | .build(), SecurityConstants.INNER); |
| | | Order one = this.lambdaQuery().eq(Order::getId, orderId).one(); |
| | | |
| | | OrderPaymentRecord balancePaymentRecord = new OrderPaymentRecord(); |
| | | balancePaymentRecord.setOrderId(orderId); |
| | | balancePaymentRecord.setPaymentType(PaymentTypeEnum.BALANCE_PAY.getCode()); |
| | | balancePaymentRecord.setPaymentStatus(PaymentStatusEnum.COMPLETED.getCode()); |
| | | orderPaymentRecordService.save(balancePaymentRecord); |
| | | // 如果余额大于通用价格 则实际支付价格为0 |
| | | if (appUser.getBalance().compareTo(one.getRealPayAmount())>=0){ |
| | | // 更新用户余额 |
| | | // remoteAppUserService.updateAppUser( |
| | | // AppUserDTO.builder().balance( |
| | | // appUser.getBalance().subtract(one.getRealPayAmount())) |
| | | // .build(), SecurityConstants.INNER); |
| | | OrderPaymentRecord balancePaymentRecord = new OrderPaymentRecord(); |
| | | balancePaymentRecord.setOrderId(orderId); |
| | | balancePaymentRecord.setPayAmount(one.getRealPayAmount()); |
| | | balancePaymentRecord.setPaymentType(PaymentTypeEnum.BALANCE_PAY.getCode()); |
| | | balancePaymentRecord.setPaymentStatus(PaymentStatusEnum.COMPLETED.getCode()); |
| | | List<OrderPaymentRecord> list = orderPaymentRecordService.lambdaQuery().eq(OrderPaymentRecord::getOrderId, orderId) |
| | | .eq(OrderPaymentRecord::getPaymentType, 4).list(); |
| | | if (list.isEmpty()){ |
| | | orderPaymentRecordService.save(balancePaymentRecord); |
| | | } |
| | | |
| | | // 计算除去余额还需支付的金额 |
| | | return generalPrice |
| | | .subtract(appUser.getBalance()); |
| | | return new BigDecimal("0"); |
| | | }else { |
| | | // 更新用户余额 |
| | | // remoteAppUserService.updateAppUser( |
| | | // AppUserDTO.builder().balance( |
| | | // one.getRealPayAmount().subtract(appUser.getBalance())) |
| | | // .build(), SecurityConstants.INNER); |
| | | |
| | | OrderPaymentRecord balancePaymentRecord = new OrderPaymentRecord(); |
| | | balancePaymentRecord.setOrderId(orderId); |
| | | balancePaymentRecord.setPaymentType(PaymentTypeEnum.BALANCE_PAY.getCode()); |
| | | balancePaymentRecord.setPaymentStatus(PaymentStatusEnum.COMPLETED.getCode()); |
| | | balancePaymentRecord.setPayAmount(appUser.getBalance()); |
| | | List<OrderPaymentRecord> list = orderPaymentRecordService.lambdaQuery().eq(OrderPaymentRecord::getOrderId, orderId) |
| | | .eq(OrderPaymentRecord::getPaymentType, 4).list(); |
| | | if (list.isEmpty()){ |
| | | orderPaymentRecordService.save(balancePaymentRecord); |
| | | } |
| | | // 计算除去余额还需支付的金额 |
| | | return one.getRealPayAmount() |
| | | .subtract(appUser.getBalance()); |
| | | } |
| | | |
| | | } |
| | | |
| | | /** |
| | |
| | | * @return AppUser |
| | | */ |
| | | private AppUser getAppUserById(Long userId) { |
| | | return remoteAppUserService.getUserByCondition( |
| | | AppUserDTO.builder().id(userId).build(), |
| | | SecurityConstants.INNER).getData(); |
| | | return remoteAppUserService.getAppUserById(userId+"").getData(); |
| | | } |
| | | |
| | | /** |
| | |
| | | private void createPayment(Integer payType, String orderNo, BigDecimal needPayAmount, |
| | | String goodsTitle, String goodsDesc, String wxOpenId, Long orderId, |
| | | ClientPlaceOrderVO clientPlaceOrderVO) throws Exception { |
| | | // 截取前42个字符 商品描述信息,微信小程序和微信公众号该字段,最大长度 42 个字符 |
| | | goodsDesc = goodsDesc.substring(0, 42); |
| | | // 调用第三方支付获取支付信息 |
| | | JSONObject payInfo = JuHeFuUtil.createPayment(orderNo, payType, |
| | | needPayAmount.toString(), goodsTitle, goodsDesc, |
| | | IpUtils.getIpAddr(), wxOpenId, Constants.PAYMENT_NOTIFY_URL); |
| | | // 第三方支付记录 |
| | | OrderPaymentRecord paymentRecord = new OrderPaymentRecord(); |
| | | paymentRecord.setOrderId(orderId); |
| | | |
| | | if (payType == 1) { |
| | | clientPlaceOrderVO.setPayInfo(payInfo.getString("pay_info")); |
| | | if (payType == 1){ |
| | | // 微信托管支付 |
| | | // 截取前42个字符 商品描述信息,微信小程序和微信公众号该字段,最大长度 42 个字符 |
| | | // 调用第三方支付获取支付信息 |
| | | JSONObject payInfo = JuHeFuUtil.createPayment1(orderNo, payType, |
| | | needPayAmount.toString(), goodsTitle, goodsDesc, |
| | | IpUtils.getIpAddr(), wxOpenId, |
| | | "https://xq.xqzhihui.com/api/order/client/order/order/base/callback" |
| | | // "https://xq.xqzhihui.com/api/order/client/order/order/base/callback" |
| | | ); |
| | | // 第三方支付记录 |
| | | OrderPaymentRecord paymentRecord = new OrderPaymentRecord(); |
| | | paymentRecord.setOrderId(orderId); |
| | | Order byId = this.getById(orderId); |
| | | this.updateById(byId); |
| | | clientPlaceOrderVO.setPayAmt(payInfo.getString("pay_amt")); |
| | | clientPlaceOrderVO.setPath(payInfo.getJSONObject("expend").getString("path")); |
| | | clientPlaceOrderVO.setPayInfo(payInfo.getJSONObject("expend").getString("pay_info")); |
| | | clientPlaceOrderVO.setOrgId(payInfo.getJSONObject("expend").getString("orgId")); |
| | | clientPlaceOrderVO.setAppId(payInfo.getJSONObject("expend").getString("appId")); |
| | | paymentRecord.setPaymentType(PaymentTypeEnum.WECHAT_PAY.getCode()); |
| | | } else { |
| | | clientPlaceOrderVO.setQrcodeUrl(payInfo.getString("qrcode_url")); |
| | | paymentRecord.setPayOrderNo(payInfo.getString("id")); |
| | | clientPlaceOrderVO.setOrderId(payInfo.getString("id")); |
| | | paymentRecord.setPaymentStatus(PaymentStatusEnum.TO_BE_PAID.getCode()); |
| | | paymentRecord.setPayAmount(needPayAmount); |
| | | OrderPaymentRecord list = orderPaymentRecordService.lambdaQuery().eq(OrderPaymentRecord::getOrderId, orderId) |
| | | .ne(OrderPaymentRecord::getPaymentType, 4).one(); |
| | | if (list==null){ |
| | | orderPaymentRecordService.save(paymentRecord); |
| | | }else{ |
| | | list.setPayOrderNo(payInfo.getString("id")); |
| | | orderPaymentRecordService.updateById(list); |
| | | } |
| | | // 设置订单是否需要支付标识 |
| | | clientPlaceOrderVO.setZeroFlag(DisabledEnum.NO.getCode()); |
| | | }else{ |
| | | // 调用第三方支付获取支付信息 |
| | | JSONObject payInfo = JuHeFuUtil.createPayment(orderNo, payType, |
| | | needPayAmount.toString(), goodsTitle, goodsDesc, |
| | | IpUtils.getIpAddr(), wxOpenId, |
| | | "https://xq.xqzhihui.com/api/order/client/order/order/base/callback" |
| | | // "https://xq.xqzhihui.com/api/order/client/order/order/base/callback" |
| | | |
| | | ); |
| | | // 第三方支付记录 |
| | | OrderPaymentRecord paymentRecord = new OrderPaymentRecord(); |
| | | paymentRecord.setOrderId(orderId); |
| | | paymentRecord.setPayAmount(needPayAmount); |
| | | Order byId = this.getById(orderId); |
| | | this.updateById(byId); |
| | | JSONObject expend = payInfo.getJSONObject("expend"); |
| | | String string = expend.getString("qrcode_url"); |
| | | clientPlaceOrderVO.setQrcodeUrl(string); |
| | | paymentRecord.setPaymentType(PaymentTypeEnum.ALI_PAY.getCode()); |
| | | paymentRecord.setPaymentStatus(PaymentStatusEnum.TO_BE_PAID.getCode()); |
| | | paymentRecord.setPayOrderNo(payInfo.getString("id")); |
| | | OrderPaymentRecord list = orderPaymentRecordService.lambdaQuery().eq(OrderPaymentRecord::getOrderId, orderId) |
| | | .ne(OrderPaymentRecord::getPaymentType, 4).one(); |
| | | if (list==null){ |
| | | orderPaymentRecordService.save(paymentRecord); |
| | | }else{ |
| | | list.setPayOrderNo(payInfo.getString("id")); |
| | | orderPaymentRecordService.updateById(list); |
| | | } |
| | | clientPlaceOrderVO.setPayAmt(payInfo.getString("pay_amt")); |
| | | clientPlaceOrderVO.setOrderId(payInfo.getString("id")); |
| | | // 设置订单是否需要支付标识 |
| | | clientPlaceOrderVO.setZeroFlag(DisabledEnum.NO.getCode()); |
| | | } |
| | | |
| | | paymentRecord.setPaymentStatus(PaymentStatusEnum.TO_BE_PAID.getCode()); |
| | | orderPaymentRecordService.save(paymentRecord); |
| | | // 设置订单是否需要支付标识 |
| | | clientPlaceOrderVO.setZeroFlag(DisabledEnum.NO.getCode()); |
| | | } |
| | | |
| | | /** |
| | |
| | | return this.lambdaQuery().eq(Order::getAppUserId, userId).eq(Order::getOrderFrom, orderFrom) |
| | | .eq(Order::getPaymentStatus, PaymentStatusEnum.COMPLETED.getCode()).list(); |
| | | } |
| | | |
| | | @Override |
| | | public String placeOrderApple(Long targetId, Integer orderFrom, |
| | | Long receiverId, Integer balanceFlag, |
| | | BigDecimal amount, Integer vipType, String transactionIdentifier) { |
| | | // 获取当前登录用户id |
| | | Long userId = tokenService.getLoginUser().getUserid(); |
| | | // 获取用户信息 |
| | | AppUser appUser = getAppUserById(userId); |
| | | ClientPlaceOrderVO clientPlaceOrderVO = new ClientPlaceOrderVO(); |
| | | Order order = new Order(); |
| | | // 购买冥想音频 |
| | | if (orderFrom == 1) { |
| | | Meditation meditation = remoteMeditationService.getMeditationById(targetId, |
| | | SecurityConstants.INNER).getData(); |
| | | // 创建订单 |
| | | String orderNo = OrderUtil.getOrderNoForPrefix("MX"); |
| | | order.setOrderFrom(orderFrom); |
| | | order.setBizOrderNo(orderNo); |
| | | order.setBusinessId(meditation.getId()); |
| | | order.setAppUserId(userId); |
| | | order.setTotalAmount(meditation.getIosPrice()); |
| | | order.setPayType(3); |
| | | order.setBuyContent("购买疗愈"); |
| | | this.save(order); |
| | | Long orderId = order.getId(); |
| | | clientPlaceOrderVO.setOrderNo(orderNo); |
| | | clientPlaceOrderVO.setId(orderId); |
| | | // 如果冥想音频价格设定为单独收费,且需要使用余额抵扣 |
| | | if (balanceFlag.equals(1) && meditation.getChargeType().equals(ChargeTypeEnum.SEPARATE_CHARGE.getCode())) { |
| | | BigDecimal needPayAmount = handleBalancePayment(appUser, |
| | | meditation.getIosPrice(), |
| | | orderId); |
| | | if (needPayAmount.compareTo(BigDecimal.ZERO) <= 0) { |
| | | clientPlaceOrderVO.setZeroFlag(DisabledEnum.YES.getCode()); |
| | | // 抵扣后金额为0 为余额支付 |
| | | order.setPayType(4); |
| | | order.setRealPayAmount(meditation.getIosPrice()); |
| | | this.updateById(order); |
| | | return order.getId().toString(); |
| | | }else{ |
| | | order.setPayType(7); |
| | | this.updateById(order); |
| | | // 创建支付订单 |
| | | OrderPaymentRecord paymentRecord = new OrderPaymentRecord(); |
| | | paymentRecord.setPayAmount(meditation.getIosPrice()); |
| | | paymentRecord.setPayOrderNo(transactionIdentifier); |
| | | paymentRecord.setOrderId(orderId); |
| | | paymentRecord.setPaymentType(PaymentTypeEnum.IOS_PAY.getCode()); |
| | | paymentRecord.setPaymentStatus(PaymentStatusEnum.TO_BE_PAID.getCode()); |
| | | orderPaymentRecordService.save(paymentRecord); |
| | | } |
| | | |
| | | } else { |
| | | order.setPayType(3); |
| | | this.updateById(order); |
| | | // 纯内购支付 |
| | | OrderPaymentRecord paymentRecord = new OrderPaymentRecord(); |
| | | paymentRecord.setPayAmount(meditation.getIosPrice()); |
| | | paymentRecord.setPayOrderNo(transactionIdentifier); |
| | | paymentRecord.setOrderId(orderId); |
| | | paymentRecord.setPaymentType(PaymentTypeEnum.IOS_PAY.getCode()); |
| | | paymentRecord.setPaymentStatus(PaymentStatusEnum.TO_BE_PAID.getCode()); |
| | | orderPaymentRecordService.save(paymentRecord); |
| | | } |
| | | } |
| | | else if (orderFrom == 2){ |
| | | // 购买课程 |
| | | Course course = remoteCourseService.getCourseById(targetId).getData(); |
| | | // 创建订单 |
| | | String orderNo = OrderUtil.getOrderNoForPrefix("KC"); |
| | | order.setOrderFrom(orderFrom); |
| | | order.setBuyContent("购买课程"); |
| | | order.setBizOrderNo(orderNo); |
| | | order.setPayOrderNo(transactionIdentifier); |
| | | order.setGiveUserId(receiverId); |
| | | order.setBusinessId(course.getId()); |
| | | order.setAppUserId(userId); |
| | | order.setTotalAmount(course.getIosPrice()); |
| | | this.save(order); |
| | | Long orderId = order.getId(); |
| | | clientPlaceOrderVO.setOrderNo(orderNo); |
| | | clientPlaceOrderVO.setId(orderId); |
| | | if (balanceFlag.equals(1) && course.getChargeType() |
| | | .equals(ChargeTypeEnum.SEPARATE_CHARGE.getCode())) { |
| | | BigDecimal needPayAmount = handleBalancePayment(appUser, course.getGeneralPrice(), |
| | | orderId); |
| | | if (needPayAmount.compareTo(BigDecimal.ZERO) <= 0) { |
| | | clientPlaceOrderVO.setZeroFlag(DisabledEnum.YES.getCode()); |
| | | // 抵扣后金额为0 为余额支付 |
| | | order.setPayType(4); |
| | | order.setRealPayAmount(course.getGeneralPrice()); |
| | | this.updateById(order); |
| | | return order.getId()+""; |
| | | }else{ |
| | | order.setPayType(7); |
| | | this.updateById(order); |
| | | // 创建支付订单 |
| | | OrderPaymentRecord paymentRecord = new OrderPaymentRecord(); |
| | | paymentRecord.setPayAmount(course.getIosPrice()); |
| | | paymentRecord.setPayOrderNo(transactionIdentifier); |
| | | paymentRecord.setOrderId(orderId); |
| | | paymentRecord.setPaymentType(PaymentTypeEnum.IOS_PAY.getCode()); |
| | | paymentRecord.setPaymentStatus(PaymentStatusEnum.TO_BE_PAID.getCode()); |
| | | orderPaymentRecordService.save(paymentRecord); |
| | | } |
| | | } else { |
| | | order.setPayType(3); |
| | | this.updateById(order); |
| | | // 创建支付订单 |
| | | OrderPaymentRecord paymentRecord = new OrderPaymentRecord(); |
| | | paymentRecord.setPayAmount(course.getIosPrice()); |
| | | paymentRecord.setPayOrderNo(transactionIdentifier); |
| | | paymentRecord.setOrderId(orderId); |
| | | paymentRecord.setPaymentType(PaymentTypeEnum.IOS_PAY.getCode()); |
| | | paymentRecord.setPaymentStatus(PaymentStatusEnum.TO_BE_PAID.getCode()); |
| | | orderPaymentRecordService.save(paymentRecord); |
| | | } |
| | | } |
| | | else if (orderFrom == 3){ |
| | | // 创建订单 |
| | | String orderNo = OrderUtil.getOrderNoForPrefix("HY"); |
| | | order.setOrderFrom(orderFrom); |
| | | order.setBizOrderNo(orderNo); |
| | | order.setAppUserId(userId); |
| | | order.setTotalAmount(amount); |
| | | order.setRealPayAmount(amount); |
| | | String vipType1 =""; |
| | | switch (vipType){ |
| | | case 1: |
| | | vipType1="月会员"; |
| | | break; |
| | | case 2: |
| | | vipType1="季会员"; |
| | | break; |
| | | case 3: |
| | | vipType1="年会员"; |
| | | break; |
| | | } |
| | | order.setBuyContent(vipType1); |
| | | this.save(order); |
| | | Long orderId = order.getId(); |
| | | |
| | | order.setPayType(3); |
| | | this.updateById(order); |
| | | // 创建支付订单 |
| | | OrderPaymentRecord paymentRecord = new OrderPaymentRecord(); |
| | | paymentRecord.setPayAmount(amount); |
| | | paymentRecord.setPayOrderNo(transactionIdentifier); |
| | | paymentRecord.setOrderId(orderId); |
| | | paymentRecord.setPaymentType(PaymentTypeEnum.IOS_PAY.getCode()); |
| | | paymentRecord.setPaymentStatus(PaymentStatusEnum.TO_BE_PAID.getCode()); |
| | | orderPaymentRecordService.save(paymentRecord); |
| | | }else { |
| | | // 充值 |
| | | String wxOpenId = appUser.getWxOpenId(); |
| | | // 创建订单 |
| | | String orderNo = OrderUtil.getOrderNoForPrefix("CZ"); |
| | | order.setOrderFrom(orderFrom); |
| | | order.setBizOrderNo(orderNo); |
| | | order.setAppUserId(userId); |
| | | order.setTotalAmount(amount); |
| | | order.setRealPayAmount(amount); |
| | | |
| | | order.setBuyContent("充值"); |
| | | this.save(order); |
| | | Long orderId = order.getId(); |
| | | order.setPayType(3); |
| | | this.updateById(order); |
| | | // 创建支付订单 |
| | | OrderPaymentRecord paymentRecord = new OrderPaymentRecord(); |
| | | paymentRecord.setPayAmount(amount); |
| | | paymentRecord.setPayOrderNo(transactionIdentifier); |
| | | paymentRecord.setOrderId(orderId); |
| | | paymentRecord.setPaymentType(PaymentTypeEnum.IOS_PAY.getCode()); |
| | | paymentRecord.setPaymentStatus(PaymentStatusEnum.TO_BE_PAID.getCode()); |
| | | orderPaymentRecordService.save(paymentRecord); |
| | | } |
| | | return order.getId()+""; |
| | | } |
| | | |
| | | |
| | | |
| | | @Override |
| | | public String refund(Long uid) throws Exception { |
| | | Order byId = this.getById(uid); |
| | | OrderPaymentRecord two = orderPaymentRecordService.lambdaQuery() |
| | | .eq(OrderPaymentRecord::getPaymentType,4) |
| | | .eq(OrderPaymentRecord::getOrderId, uid) |
| | | .one(); |
| | | if (byId.getPayType() == 4){ |
| | | // 纯余额支付 直接退还余额 |
| | | // 回退余额记录 |
| | | AppUserWalletRecord appUserWalletRecord = new AppUserWalletRecord(); |
| | | appUserWalletRecord.setAppUserId(byId.getAppUserId()); |
| | | appUserWalletRecord.setChangeType(1); |
| | | appUserWalletRecord.setReason("后台退款"); |
| | | appUserWalletRecord.setOrderId(byId.getId()); |
| | | appUserWalletRecord.setAmount(two.getPayAmount()); |
| | | remoteAppUserService.addBalanceRecord(appUserWalletRecord); |
| | | remoteAppUserService.addBalance(byId.getAppUserId(),two.getPayAmount()); |
| | | byId.setRefundStatus(3); |
| | | byId.setRefundRemark("后台退款"); |
| | | byId.setRefundTime(LocalDateTime.now()); |
| | | byId.setPaymentStatus(3); |
| | | byId.setCancelTime(LocalDateTime.now()); |
| | | two.setPaymentStatus(3); |
| | | |
| | | this.updateById(byId); |
| | | orderPaymentRecordService.updateById(two); |
| | | switch (byId.getOrderFrom()){ |
| | | case 1: |
| | | // 冥想订单 删除 |
| | | break; |
| | | case 2: |
| | | // 删除用户与课程的关系表 |
| | | remoteAppUserService.deleteAppUserCourse(byId.getBusinessId(),byId.getAppUserId()); |
| | | break; |
| | | case 3: |
| | | // 会员订单 将用户会员到期时间回退 |
| | | if (byId.getBuyContent().contains("月")){ |
| | | remoteAppUserService.subVipExpireTime(byId.getAppUserId(),1); |
| | | }else if (byId.getBuyContent().contains("季")){ |
| | | remoteAppUserService.subVipExpireTime(byId.getAppUserId(),2); |
| | | }else if (byId.getBuyContent().contains("年")){ |
| | | remoteAppUserService.subVipExpireTime(byId.getAppUserId(),3); |
| | | } |
| | | break; |
| | | } |
| | | return "success"; |
| | | }else if (byId.getPayType() == 5 || byId.getPayType() == 6 || byId.getPayType() == 7){ |
| | | OrderPaymentRecord one = orderPaymentRecordService.lambdaQuery() |
| | | .eq(OrderPaymentRecord::getOrderId, uid) |
| | | .ne(OrderPaymentRecord::getPaymentType, 4) |
| | | .ne(OrderPaymentRecord::getPaymentType, 3) |
| | | .one(); |
| | | JSONObject refund = JuHeFuUtil.refund(one.getPayOrderNo(), byId.getBizOrderNo()); |
| | | if (refund.getString("error_msg")!=null){ |
| | | return refund.getString("error_msg"); |
| | | } |
| | | // 回退余额记录 |
| | | AppUserWalletRecord appUserWalletRecord = new AppUserWalletRecord(); |
| | | appUserWalletRecord.setAppUserId(byId.getAppUserId()); |
| | | appUserWalletRecord.setChangeType(1); |
| | | appUserWalletRecord.setReason("后台退款"); |
| | | appUserWalletRecord.setOrderId(byId.getId()); |
| | | appUserWalletRecord.setAmount(two.getPayAmount()); |
| | | remoteAppUserService.addBalanceRecord(appUserWalletRecord); |
| | | remoteAppUserService.addBalance(byId.getAppUserId(),two.getPayAmount()); |
| | | byId.setRefundStatus(3); |
| | | byId.setRefundRemark("后台退款"); |
| | | byId.setRefundTime(LocalDateTime.now()); |
| | | byId.setPaymentStatus(3); |
| | | byId.setCancelTime(LocalDateTime.now()); |
| | | two.setPaymentStatus(3); |
| | | this.updateById(byId); |
| | | orderPaymentRecordService.updateById(two); |
| | | |
| | | switch (byId.getOrderFrom()){ |
| | | case 1: |
| | | // 冥想订单 删除 |
| | | break; |
| | | case 2: |
| | | // 删除用户与课程的关系表 |
| | | remoteAppUserService.deleteAppUserCourse(byId.getBusinessId(),byId.getAppUserId()); |
| | | break; |
| | | case 3: |
| | | // 会员订单 将用户会员到期时间回退 |
| | | if (byId.getBuyContent().contains("月")){ |
| | | remoteAppUserService.subVipExpireTime(byId.getAppUserId(),1); |
| | | }else if (byId.getBuyContent().contains("季")){ |
| | | remoteAppUserService.subVipExpireTime(byId.getAppUserId(),2); |
| | | }else if (byId.getBuyContent().contains("年")){ |
| | | remoteAppUserService.subVipExpireTime(byId.getAppUserId(),3); |
| | | } |
| | | break; |
| | | } |
| | | return "success"; |
| | | } |
| | | OrderPaymentRecord one = orderPaymentRecordService.lambdaQuery() |
| | | .eq(OrderPaymentRecord::getOrderId, uid) |
| | | .ne(OrderPaymentRecord::getPaymentType, 4) |
| | | .ne(OrderPaymentRecord::getPaymentType, 3) |
| | | .one(); |
| | | JSONObject refund = JuHeFuUtil.refund(one.getPayOrderNo(), byId.getBizOrderNo()); |
| | | if (refund.getString("error_msg")!=null){ |
| | | return refund.getString("error_msg"); |
| | | } |
| | | one.setPaymentStatus(3); |
| | | |
| | | orderPaymentRecordService.updateById(one); |
| | | String string = refund.getString("payment_id"); |
| | | if (string!=null){ |
| | | byId.setRefundCode(string); |
| | | } |
| | | byId.setRefundTime(LocalDateTime.now()); |
| | | byId.setRefundStatus(3); |
| | | byId.setRefundRemark("后台退款"); |
| | | this.updateById(byId); |
| | | switch (byId.getOrderFrom()){ |
| | | case 1: |
| | | // 冥想订单 删除 |
| | | break; |
| | | case 2: |
| | | // 删除用户与课程的关系表 |
| | | remoteAppUserService.deleteAppUserCourse(byId.getBusinessId(),byId.getAppUserId()); |
| | | break; |
| | | case 3: |
| | | // 会员订单 将用户会员到期时间回退 |
| | | if (byId.getBuyContent().contains("月")){ |
| | | remoteAppUserService.subVipExpireTime(byId.getAppUserId(),1); |
| | | }else if (byId.getBuyContent().contains("季")){ |
| | | remoteAppUserService.subVipExpireTime(byId.getAppUserId(),2); |
| | | }else if (byId.getBuyContent().contains("年")){ |
| | | remoteAppUserService.subVipExpireTime(byId.getAppUserId(),3); |
| | | } |
| | | break; |
| | | } |
| | | return "success"; |
| | | } |
| | | } |