| | |
| | | package com.ks.vip.service.remote; |
| | | |
| | | import com.alipay.api.AlipayApiException; |
| | | import com.alipay.api.response.AlipayTradeQueryResponse; |
| | | import com.ks.vip.exception.OrderPayException; |
| | | import com.ks.vip.exception.VipOrderException; |
| | | import com.ks.vip.mapper.VipOrderMapper; |
| | | import com.ks.vip.pojo.DO.VipCombo; |
| | |
| | | import com.ks.vip.pojo.DTO.VipOrderDTO; |
| | | import com.ks.vip.pojo.Enums.OrderTypeEnum; |
| | | import com.ks.vip.pojo.Enums.PayWayEnum; |
| | | import com.ks.vip.query.VipOrderQuery; |
| | | import com.ks.vip.service.VipCenterService; |
| | | import com.ks.vip.service.VipComboService; |
| | | import com.ks.vip.service.VipOrederPayService; |
| | | import com.ks.vip.service.VipOrederService; |
| | | import com.ks.vip.service.manager.RedisManager; |
| | | import com.ks.vip.util.Constant; |
| | | import com.ks.vip.util.PayUtil; |
| | | import org.apache.dubbo.config.annotation.Service; |
| | | import org.slf4j.Logger; |
| | | import org.slf4j.LoggerFactory; |
| | | import org.springframework.transaction.annotation.Transactional; |
| | | import org.yeshi.utils.StringUtil; |
| | | import org.yeshi.utils.alipay.AlipayH5PayUtil; |
| | | import org.yeshi.utils.entity.wx.WXPayOrderInfoV3; |
| | | import org.yeshi.utils.wx.WXPayV3Util; |
| | | import redis.clients.jedis.Jedis; |
| | | import redis.clients.jedis.JedisPool; |
| | | |
| | | import javax.annotation.Resource; |
| | | import java.math.BigDecimal; |
| | | import java.math.RoundingMode; |
| | | import java.util.Date; |
| | | import java.util.List; |
| | | import java.util.Map; |
| | | import java.util.UUID; |
| | | |
| | | @Service(version = "1.0") |
| | | public class VipOrderPayServiceImpl implements VipOrederPayService { |
| | | |
| | | Logger logger = LoggerFactory.getLogger(VipOrederPayService.class); |
| | | |
| | | @Resource |
| | | private VipOrderMapper vipOrderMapper; |
| | |
| | | private VipCenterService vipCenterService; |
| | | |
| | | @Resource |
| | | private RedisManager redisManager; |
| | | private JedisPool jedisPool; |
| | | |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public PayWayInfoDTO payOrder(VipOrder order) { |
| | | String title = Constant.ORDER_PAY_TITLE; |
| | | String orderId = order.getId() + ""; |
| | | public PayWayInfoDTO addOrderWithPay(VipOrderDTO t, String notifyUrl, String returnUrl, String ip) throws VipOrderException { |
| | | if (t.getComboId() == null || t.getComboId() <= 0) { |
| | | throw new VipOrderException(1, "套餐ID不能为空"); |
| | | } |
| | | if (StringUtil.isNullOrEmpty(t.getUid())) { |
| | | throw new VipOrderException(1, "用户ID不能为空"); |
| | | } |
| | | if (t.getPayWay() == null) { |
| | | throw new VipOrderException(1, "付款方式不能为空"); |
| | | } |
| | | if (StringUtil.isNullOrEmpty(t.getThreeOrderId())) { |
| | | throw new VipOrderException(1, "付款订单号不能为空"); |
| | | } |
| | | |
| | | // 检查是否已记录 |
| | | VipOrder order = vipOrderMapper.getByThreeOrderId(t.getThreeOrderId()); |
| | | if (order != null) { |
| | | throw new VipOrderException(1, "该付款订单号已存在"); |
| | | } |
| | | |
| | | // 判断订单类型: 首单、续费 |
| | | OrderTypeEnum orderType = OrderTypeEnum.buyNewly; |
| | | long count = vipOrderMapper.countByTypeAndUid(t.getUid(), orderType); |
| | | if (count > 0) { |
| | | orderType = OrderTypeEnum.buyRenew; |
| | | } |
| | | |
| | | // 插入订单信息 |
| | | VipOrder newOrder = new VipOrder(); |
| | | newOrder.setState(VipOrder.STATE_INIT); |
| | | newOrder.setComboId(t.getComboId()); |
| | | newOrder.setUid(t.getUid()); |
| | | newOrder.setThreeOrderId(t.getThreeOrderId()); |
| | | newOrder.setPayWay(t.getPayWay().name()); |
| | | newOrder.setType(orderType); |
| | | newOrder.setPayMoney(t.getPayMoney()); |
| | | newOrder.setCreateTime(new Date()); |
| | | vipOrderMapper.insertSelective(newOrder); |
| | | |
| | | if (returnUrl != null) { |
| | | returnUrl += "?id=" + newOrder.getId(); |
| | | } |
| | | // 支付方式 |
| | | try { |
| | | return payOrder(newOrder, notifyUrl, returnUrl, ip); |
| | | } catch (OrderPayException e) { |
| | | e.printStackTrace(); |
| | | throw new VipOrderException(VipOrderException.CODE_CREATE_PAY_ORDER_FAIL, e.getMsg()); |
| | | } |
| | | } |
| | | |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public PayWayInfoDTO payOrder(VipOrder order, String notifyUrl, String returnUrl, String ip) throws OrderPayException { |
| | | if (order.getState() == VipOrder.STATE_PAY) { |
| | | throw new OrderPayException(OrderPayException.CODE_ALREADY_PAY, "已经完成支付"); |
| | | } |
| | | String goodsTitle = Constant.ORDER_PAY_TITLE; |
| | | String orderId = order.getThreeOrderId() + ""; |
| | | switch (order.getPayWay()) { |
| | | //生成支付宝支付订单 |
| | | case "alipay": |
| | | String formAlipay = PayUtil.getVipChargeAlipayForm(orderId, title, orderId, order.getPayMoney()); |
| | | String form = PayUtil.getVipChargeAlipayForm(goodsTitle, orderId, order.getPayMoney(), notifyUrl, returnUrl); |
| | | if (StringUtil.isNullOrEmpty(form)) { |
| | | throw new OrderPayException(OrderPayException.CODE_CREATE_PAY_ORDER_FAIL, "创建支付宝支付订单失败"); |
| | | } |
| | | //暂存2分钟 |
| | | String id = StringUtil.Md5(UUID.randomUUID().toString() + "#" + System.currentTimeMillis()); |
| | | redisManager.cacheCommonString(id, formAlipay, 120); |
| | | String payUrl = Constant.HOST + "/BuWan/alipay/printPayForm?formId=" + id; |
| | | return new PayWayInfoDTO(PayWayEnum.alipay.getWay(), payUrl); |
| | | Jedis jedis = jedisPool.getResource(); |
| | | try { |
| | | jedis.set(id, form); |
| | | jedis.expire(id, 120); |
| | | } finally { |
| | | jedis.close(); |
| | | } |
| | | return new PayWayInfoDTO(PayWayEnum.alipay, null, id); |
| | | case "weChat": |
| | | try{ |
| | | String formWX = PayUtil.createWXOrder(orderId, null, orderId,order.getPayMoney() ,title); |
| | | //暂存2分钟 |
| | | String idwx = StringUtil.Md5(UUID.randomUUID().toString() + "#" + System.currentTimeMillis()); |
| | | redisManager.cacheCommonString(idwx, formWX, 120); |
| | | String payUrlwx = Constant.HOST + "/BuWan/alipay/printPayForm?formId=" + idwx; |
| | | return new PayWayInfoDTO(PayWayEnum.weChat.getWay(), payUrlwx); |
| | | try { |
| | | String payUrl = PayUtil.createWXOrder(ip, orderId, order.getPayMoney(), goodsTitle, notifyUrl, returnUrl); |
| | | return new PayWayInfoDTO(PayWayEnum.weChat, payUrl, null); |
| | | } catch (Exception e) { |
| | | |
| | | logger.error("创建微信支付出错", e); |
| | | throw new OrderPayException(OrderPayException.CODE_CREATE_PAY_ORDER_FAIL, e.getMessage()); |
| | | } |
| | | } |
| | | return null; |
| | | } |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public VipOrder checkOrderPayState(Long id) { |
| | | VipOrder vipOrder = vipOrderMapper.selectByPrimaryKey(id); |
| | | if (vipOrder == null || vipOrder.getState() == VipOrder.STATE_PAY) { |
| | | return vipOrder; |
| | | public String getAlipayForm(String formId) { |
| | | Jedis jedis = jedisPool.getResource(); |
| | | try { |
| | | return jedis.get(formId); |
| | | } finally { |
| | | jedis.close(); |
| | | } |
| | | |
| | | |
| | | |
| | | // OrderRecord record = vipOrderRecordDao.find(OrderRecord.class, id); |
| | | // if (record.getState() == OrderRecord.STATE_PAY) |
| | | // return record; |
| | | // |
| | | // switch (record.getPayWay()) { |
| | | // case OrderRecord.PAY_WAY_ALIPAY_GOLDCORN: |
| | | // case OrderRecord.PAY_WAY_ALIPAY: { |
| | | // //支付宝 |
| | | // AlipayTradeQueryResponse res = null; |
| | | // try { |
| | | // res = AlipayH5PayUtil.queryOrder(VipUtil.getAlipayApp(), VIPOrderUtil.getOutOrderNo(record.getOrderType(), id), null); |
| | | // //支付成功 |
| | | // if (res.isSuccess() && "TRADE_SUCCESS".equalsIgnoreCase(res.getTradeStatus())) { |
| | | // try { |
| | | // return paySuccess(id, OrderRecord.PAY_WAY_ALIPAY, new BigDecimal(res.getTotalAmount()), new Date()); |
| | | // } catch (Exception e) { |
| | | // e.printStackTrace(); |
| | | // } |
| | | // } |
| | | // } catch (AlipayApiException e) { |
| | | // e.printStackTrace(); |
| | | // } |
| | | // } |
| | | // |
| | | // break; |
| | | // case OrderRecord.PAY_WAY_WX_GOLDCORN: |
| | | // case OrderRecord.PAY_WAY_WX: { |
| | | // //微信 |
| | | // try { |
| | | // WXPayOrderInfoV3 info = WXPayV3Util.getPayOrderInfo(VIPOrderUtil.getOutOrderNo(record.getOrderType(), id), VipUtil.getWXAPP()); |
| | | // if (info != null && info.getTrade_state().equalsIgnoreCase("SUCCESS")) { |
| | | // paySuccess(id, record.getPayWay(), new BigDecimal(info.getAmount().getPayer_total()).divide(new BigDecimal(100), 2, RoundingMode.FLOOR), new Date()); |
| | | // return record; |
| | | // } |
| | | // } catch (Exception e) { |
| | | // e.printStackTrace(); |
| | | // } |
| | | // } |
| | | // break; |
| | | // } |
| | | |
| | | |
| | | |
| | | return null; |
| | | } |
| | | |
| | | |
| | | // @Transactional(rollbackFor = Exception.class) |
| | | // @Override |
| | | // public PayWayInfoDTO payOrder(OrderRecord record) throws OrderException, GoldCornException, PayException, VIPException, PPTVException, VideoBuyRecordException { |
| | | // String orderNo = VIPOrderUtil.getOutOrderNo(record.getOrderType(), record.getId()); |
| | | // switch (record.getPayWay()) { |
| | | // case OrderRecord.PAY_WAY_ALIPAY_GOLDCORN: |
| | | // try { |
| | | // goldCornManager.consumeGoldCorn(record, record.getGoldCorn()); |
| | | // } catch (Exception e) { |
| | | // throw new GoldCornException(1, "影视豆扣除出错"); |
| | | // } |
| | | // paySuccess(record.getId(), OrderRecord.PAY_WAY_GOLDCORN, null, new Date()); |
| | | // |
| | | // case OrderRecord.PAY_WAY_ALIPAY: { |
| | | // if (record.getMoney() != null && record.getMoney().compareTo(new BigDecimal(0)) == 0) { |
| | | // return new PayWayInfoDTO(0, VipUtil.getPaySuccessUrl(record.getId())); |
| | | // } |
| | | // //生成支付宝支付订单 |
| | | // String form = VipUtil.getVipChargeAlipayForm(record.getId(), record.getOrderType(), orderNo, record.getMoney()); |
| | | // //暂存2分钟 |
| | | // String id = StringUtil.Md5(UUID.randomUUID().toString() + "#" + System.currentTimeMillis()); |
| | | // redisManager.cacheCommonString(id, form, 120); |
| | | // String payUrl = Constant.HOST + "/BuWan/alipay/printPayForm?formId=" + id; |
| | | // orderLogger.info("订单创建支付宝支付链接成功:id-{} 链接-{}", record.getId(), payUrl); |
| | | // return new PayWayInfoDTO(OrderRecord |
| | | // .PAY_WAY_ALIPAY, payUrl); |
| | | // } |
| | | // case OrderRecord.PAY_WAY_WX_GOLDCORN: |
| | | // try { |
| | | // goldCornManager.consumeGoldCorn(record, record.getGoldCorn()); |
| | | // } catch (){ |
| | | // } |
| | | // } |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public VipOrder checkOrderPayState(Long id) throws VipOrderException, OrderPayException { |
| | | VipOrder order = vipOrderMapper.selectByPrimaryKey(id); |
| | | if (order == null) { |
| | | throw new VipOrderException(VipOrderException.CODE_NOT_EXIST, "订单不存在"); |
| | | } |
| | | if (order.getState() == VipOrder.STATE_PAY) { |
| | | return order; |
| | | } |
| | | switch (order.getPayWay()) { |
| | | //支付宝 |
| | | case "alipay": |
| | | AlipayTradeQueryResponse res = null; |
| | | try { |
| | | res = AlipayH5PayUtil.queryOrder(PayUtil.getAlipayApp(), order.getThreeOrderId(), null); |
| | | //支付成功 |
| | | if (res.isSuccess() && "TRADE_SUCCESS".equalsIgnoreCase(res.getTradeStatus())) { |
| | | return paySuccess(order); |
| | | } else { |
| | | throw new OrderPayException(OrderPayException.CODE_PAY_FAIL, "支付宝付款未成功"); |
| | | } |
| | | } catch (AlipayApiException e) { |
| | | throw new OrderPayException(OrderPayException.CODE_API_ERROR, "支付宝接口请求出错:" + e.getErrMsg()); |
| | | } |
| | | //微信 |
| | | case "weChat": |
| | | WXPayOrderInfoV3 info = null; |
| | | try { |
| | | info = WXPayV3Util.getPayOrderInfo(order.getThreeOrderId(), PayUtil.getWXAPP()); |
| | | } catch (Exception e) { |
| | | throw new OrderPayException(OrderPayException.CODE_API_ERROR, "微信支付接口请求出错:" + e.getMessage()); |
| | | } |
| | | if (info != null && info.getTrade_state().equalsIgnoreCase("SUCCESS")) { |
| | | paySuccess(order); |
| | | return order; |
| | | } else { |
| | | throw new OrderPayException(OrderPayException.CODE_PAY_FAIL, "微信付款未成功"); |
| | | } |
| | | default: |
| | | throw new OrderPayException(OrderPayException.CODE_PAY_WAY_NOT_EXIST, "付款方式不存在"); |
| | | } |
| | | } |
| | | |
| | | @Override |
| | | public String getWXPaySuccessOutOrderNo(String notifyContent) throws Exception { |
| | | return WXPayV3Util.getPaySuccessOutOrderNo(notifyContent, PayUtil.getWXAPP()); |
| | | } |
| | | |
| | | @Override |
| | | public String getAlipayPaySuccessOutOrderNo(Map<String, String> params) throws Exception { |
| | | return AlipayH5PayUtil.getPaySuccessNotifyOutOrderNo(params, PayUtil.getAlipayApp()); |
| | | } |
| | | |
| | | |
| | | /** |
| | | * 支付成功更新处理 |
| | | * |
| | | * @param order |
| | | * @return |
| | | */ |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public VipOrder paySuccess(VipOrder order) throws VipOrderException { |
| | | |
| | | // @Transactional(rollbackFor = Exception.class) |
| | | // @Override |
| | | // public OrderRecord checkOrderPayState(String id) { |
| | | // OrderRecord record = vipOrderRecordDao.find(OrderRecord.class, id); |
| | | // if (record.getState() == OrderRecord.STATE_PAY) |
| | | // return record; |
| | | // |
| | | // switch (record.getPayWay()) { |
| | | // case OrderRecord.PAY_WAY_ALIPAY_GOLDCORN: |
| | | // case OrderRecord.PAY_WAY_ALIPAY: { |
| | | // //支付宝 |
| | | // AlipayTradeQueryResponse res = null; |
| | | // try { |
| | | // res = AlipayH5PayUtil.queryOrder(VipUtil.getAlipayApp(), VIPOrderUtil.getOutOrderNo(record.getOrderType(), id), null); |
| | | // //支付成功 |
| | | // if (res.isSuccess() && "TRADE_SUCCESS".equalsIgnoreCase(res.getTradeStatus())) { |
| | | // try { |
| | | // return paySuccess(id, OrderRecord.PAY_WAY_ALIPAY, new BigDecimal(res.getTotalAmount()), new Date()); |
| | | // } catch (Exception e) { |
| | | // e.printStackTrace(); |
| | | // } |
| | | // } |
| | | // } catch (AlipayApiException e) { |
| | | // e.printStackTrace(); |
| | | // } |
| | | // } |
| | | // |
| | | // break; |
| | | // case OrderRecord.PAY_WAY_WX_GOLDCORN: |
| | | // case OrderRecord.PAY_WAY_WX: { |
| | | // //微信 |
| | | // try { |
| | | // WXPayOrderInfoV3 info = WXPayV3Util.getPayOrderInfo(VIPOrderUtil.getOutOrderNo(record.getOrderType(), id), VipUtil.getWXAPP()); |
| | | // if (info != null && info.getTrade_state().equalsIgnoreCase("SUCCESS")) { |
| | | // paySuccess(id, record.getPayWay(), new BigDecimal(info.getAmount().getPayer_total()).divide(new BigDecimal(100), 2, RoundingMode.FLOOR), new Date()); |
| | | // return record; |
| | | // } |
| | | // } catch (Exception e) { |
| | | // e.printStackTrace(); |
| | | // } |
| | | // } |
| | | // break; |
| | | // } |
| | | // return record; |
| | | // |
| | | // } |
| | | VipCombo vipCombo = vipComboService.selectByPrimaryKey(order.getComboId()); |
| | | if (vipCombo == null) { |
| | | throw new VipOrderException(1, "该套餐不存在"); |
| | | } |
| | | // 有效天数 |
| | | Integer validDays = vipCombo.getValidDays(); |
| | | |
| | | // 判断订单类型 |
| | | OrderTypeEnum orderType = OrderTypeEnum.buyNewly; |
| | | long count = vipOrderMapper.countByTypeAndUid(order.getUid(), orderType); |
| | | if (count > 0) { |
| | | orderType = OrderTypeEnum.buyRenew; |
| | | } |
| | | |
| | | // order.setThreeOrderId(); TODO |
| | | order.setState(VipOrder.STATE_PAY); |
| | | order.setPayTime(new Date()); |
| | | order.setUpdateTime(new Date()); |
| | | vipOrderMapper.updateByPrimaryKeySelective(order); |
| | | |
| | | // 更新等级 |
| | | vipCenterService.saveVipCenter(order.getUid(), vipCombo.getGradeId(), validDays * 24, order.getId()); |
| | | |
| | | return order; |
| | | } |
| | | |
| | | } |