| | |
| | | import com.ruoyi.errand.mapper.VipOrderMapper; |
| | | import com.ruoyi.errand.mapper.VipSettingMapper; |
| | | import com.ruoyi.errand.object.dto.app.VipPaymentDTO; |
| | | import com.ruoyi.errand.object.vo.sys.OrderSysDetailVO; |
| | | import com.ruoyi.errand.service.VipOrderService; |
| | | import com.ruoyi.errand.utils.CloseOrderResult; |
| | | import com.ruoyi.errand.utils.PaymentUtil; |
| | | import com.ruoyi.errand.utils.UniPayCallbackResult; |
| | | import com.ruoyi.errand.utils.UniPayResult; |
| | | import com.ruoyi.errand.utils.wx.PayResult; |
| | | import com.ruoyi.errand.utils.wx.WechatPayService; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.springframework.data.redis.core.RedisTemplate; |
| | | import org.springframework.security.core.context.SecurityContextHolder; |
| | |
| | | import java.text.SimpleDateFormat; |
| | | import java.time.LocalDateTime; |
| | | import java.time.ZoneOffset; |
| | | import java.util.Arrays; |
| | | import java.util.Date; |
| | | import java.util.List; |
| | | import java.util.Set; |
| | | import java.util.*; |
| | | |
| | | @Service |
| | | @Slf4j |
| | |
| | | private RedisTemplate redisTemplate; |
| | | @Resource |
| | | private AppUserMapper appUserMapper; |
| | | @Resource |
| | | private WechatPayService wechatPayService; |
| | | |
| | | @Override |
| | | public R vipPayment(VipPaymentDTO vipPaymentDTO) { |
| | |
| | | vipOrder.setAppUserId(appuser.getId()); |
| | | |
| | | VipSetting vipSetting = vipSettingMapper.selectById(vipPaymentDTO.getId()); |
| | | vipOrder.setOrderAmount(vipSetting.getVip_price()); |
| | | vipOrder.setPaymentAmount(vipSetting.getVip_price()); |
| | | vipOrder.setOrderAmount(vipSetting.getVipPrice()); |
| | | vipOrder.setPaymentAmount(vipSetting.getVipPrice()); |
| | | SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS"); |
| | | vipOrder.setOrderNumber("QJS" + getNumber(3) + sdf.format(new Date())); |
| | | vipOrder.setPayStatus(1); |
| | |
| | | BigDecimal paymentMoney = vipOrder.getOrderAmount(); |
| | | if ( BigDecimal.ZERO.compareTo(paymentMoney) < 0){ |
| | | //调起微信支付 |
| | | String vipName = vipSetting.getVip_name(); |
| | | UniPayResult uniPayResult = PaymentUtil.uniPay(vipOrder.getOrderNumber(), paymentMoney.doubleValue(), "购买会员", |
| | | vipName, "", "/app/vipOrder/orderPaymentCallback", appuser.getWxOpenid(), null); |
| | | if(null == uniPayResult || !"100".equals(uniPayResult.getRa_Code())){ |
| | | return R.fail(null == uniPayResult ? "支付失败" : uniPayResult.getRb_CodeMsg()); |
| | | String vipName = vipSetting.getVipName(); |
| | | try { |
| | | R r = wechatPayService.unifiedOrder(vipOrder.getId().toString(), vipOrder.getOrderNumber(), paymentMoney.toString(), "购买"+vipName,appuser.getWxOpenid(),"/app/vipOrder/orderPaymentCallback"); |
| | | if (null == r || 200 != r.getCode()) { |
| | | //支付失败 删除订单 |
| | | vipOrder.setDelFlag(1); |
| | | this.updateById(vipOrder); |
| | | //返回报错信息 |
| | | return R.fail(null == r ? "支付失败" : r.getMsg()); |
| | | } |
| | | //将支付数据添加到redis队列中,便于定时任务去校验是否完成支付,没有完成支付支付,15分钟后关闭订单。 |
| | | long second = LocalDateTime.now().plusMinutes(15).toEpochSecond(ZoneOffset.UTC); |
| | | redisTemplate.opsForZSet().add("VipOrderPayment", vipOrder.getOrderNumber(), second); |
| | | return r; |
| | | } catch (Exception e) { |
| | | throw new RuntimeException(e); |
| | | } |
| | | String rc_result = uniPayResult.getRc_Result(); |
| | | JSONObject jsonObject = JSON.parseObject(rc_result); |
| | | jsonObject.put("orderId", vipOrder.getId().toString()); |
| | | //将支付数据添加到redis队列中,便于定时任务去校验是否完成支付,没有完成支付支付,15分钟后关闭订单。 |
| | | long second = LocalDateTime.now().plusMinutes(15).toEpochSecond(ZoneOffset.UTC); |
| | | redisTemplate.opsForZSet().add("VipOrderPayment", vipOrder.getOrderNumber(), second); |
| | | return R.ok(jsonObject.toJSONString()); |
| | | } |
| | | //设置vipOrder信息 |
| | | vipOrder.setPayStatus(2);//已支付 |
| | | vipOrder.setOrderTime(LocalDateTime.now());//下单时间 |
| | | vipOrder.setOrderStatus(4); |
| | | this.updateById(vipOrder); |
| | | //更新用户信息 |
| | | Long appUserId = vipOrder.getAppUserId(); |
| | |
| | | } |
| | | |
| | | @Override |
| | | public R orderPaymentCallback(UniPayCallbackResult uniPayCallbackResult) { |
| | | VipOrder vipOrder = this.getBaseMapper().selectOne(new LambdaQueryWrapper<VipOrder>().eq(VipOrder::getOrderNumber, uniPayCallbackResult.getR2_OrderNo())); |
| | | public R orderPaymentCallback(PayResult payResult) { |
| | | VipOrder vipOrder = this.getBaseMapper().selectOne(new LambdaQueryWrapper<VipOrder>().eq(VipOrder::getOrderNumber, payResult.getOrderNumber())); |
| | | if(null == vipOrder || vipOrder.getPayStatus() == 2){ |
| | | return R.ok(); |
| | | } |
| | | //设置vipOrder信息 |
| | | vipOrder.setPayStatus(2);//已支付 |
| | | vipOrder.setOrderTime(LocalDateTime.now());//下单时间 |
| | | String r7TrxNo = uniPayCallbackResult.getR9_BankTrxNo(); |
| | | String r7TrxNo = payResult.getTransactionId(); |
| | | vipOrder.setSerialNumber(r7TrxNo); |
| | | vipOrder.setOrderStatus(4); |
| | | this.updateById(vipOrder); |
| | | //更新用户信息 |
| | | //检查是否续期的 |
| | |
| | | // 根据 vipId 计算会员到期时间 |
| | | LocalDateTime endTime = calculateEndTime(appUser.getEndTime(), vipOrder.getVipId()); |
| | | appUser.setEndTime(endTime); |
| | | |
| | | appUserMapper.updateById(appUser); |
| | | return R.ok(); |
| | | } |
| | |
| | | continue; |
| | | } |
| | | //开始执行关闭订单操作 |
| | | CloseOrderResult closeOrderResult = PaymentUtil.closeOrder(order.getOrderNumber()); |
| | | if((null == closeOrderResult || !closeOrderResult.getRa_Status().equals("100")) && |
| | | Arrays.asList("0", "4", "101", "10080000", "10080002", "10083004", "10083005").contains(closeOrderResult.getRb_Code())){ |
| | | Map<String, String> map = wechatPayService.closeOrder(order.getOrderNumber()); |
| | | if((null == map || !map.get("return_code").equals("SUCCESS"))){ |
| | | redisTemplate.opsForZSet().add("VipOrderPayment", order.getOrderNumber(), 0); |
| | | log.error("关闭订单失败:{}---->{}",order.getOrderNumber(), JSON.toJSONString(closeOrderResult)); |
| | | log.error("关闭订单失败:{}---->{}", order.getOrderNumber(), map.get("return_msg")); |
| | | } |
| | | redisTemplate.opsForZSet().remove("VipOrderPayment", order.getOrderNumber()); |
| | | //删除订单 |
| | |
| | | } |
| | | } |
| | | |
| | | @Override |
| | | public OrderSysDetailVO detail(Integer id) { |
| | | |
| | | return this.getBaseMapper().detail(id); |
| | | } |
| | | |
| | | |
| | | private LocalDateTime calculateEndTime(LocalDateTime startTime, Integer vipId) { |
| | | switch (vipId) { |