| | |
| | | |
| | | 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.service.VipCenterService; |
| | | import com.ks.vip.service.VipComboService; |
| | | import com.ks.vip.service.VipOrederPayService; |
| | | 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.util.Date; |
| | | 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 addOrderByBuy(VipOrderDTO t) throws VipOrderException { |
| | | if(t.getComboId() == null || t.getComboId() <= 0){ |
| | | 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())){ |
| | | if (StringUtil.isNullOrEmpty(t.getUid())) { |
| | | throw new VipOrderException(1, "用户ID不能为空"); |
| | | } |
| | | if(t.getPayWay() == null){ |
| | | if (t.getPayWay() == null) { |
| | | throw new VipOrderException(1, "付款方式不能为空"); |
| | | } |
| | | if(StringUtil.isNullOrEmpty(t.getThreeOrderId())){ |
| | | if (StringUtil.isNullOrEmpty(t.getThreeOrderId())) { |
| | | throw new VipOrderException(1, "付款订单号不能为空"); |
| | | } |
| | | |
| | |
| | | } |
| | | |
| | | // 判断订单类型: 首单、续费 |
| | | String orderType = OrderTypeEnum.buyNewly.name(); |
| | | OrderTypeEnum orderType = OrderTypeEnum.buyNewly; |
| | | long count = vipOrderMapper.countByTypeAndUid(t.getUid(), orderType); |
| | | if(count > 0) { |
| | | orderType = OrderTypeEnum.buyRenew.name(); |
| | | 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(); |
| | | } |
| | | // 支付方式 |
| | | return payOrder(newOrder); |
| | | 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) { |
| | | 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.getId() + ""; |
| | | String orderId = order.getThreeOrderId() + ""; |
| | | switch (order.getPayWay()) { |
| | | case "alipay": //生成支付宝支付订单 |
| | | if (order.getState() == VipOrder.STATE_PAY) { |
| | | return new PayWayInfoDTO(PayWayEnum.alipay.getWay(), PayUtil.getPaySuccessUrl(orderId)); |
| | | //生成支付宝支付订单 |
| | | case "alipay": |
| | | String form = PayUtil.getVipChargeAlipayForm(goodsTitle, orderId, order.getPayMoney(), notifyUrl, returnUrl); |
| | | if (StringUtil.isNullOrEmpty(form)) { |
| | | throw new OrderPayException(OrderPayException.CODE_CREATE_PAY_ORDER_FAIL, "创建支付宝支付订单失败"); |
| | | } |
| | | String form = PayUtil.getVipChargeAlipayForm(orderId, goodsTitle, orderId, order.getPayMoney()); |
| | | //暂存2分钟 |
| | | String id = StringUtil.Md5(UUID.randomUUID().toString() + "#" + System.currentTimeMillis()); |
| | | redisManager.cacheCommonString(id, form, 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 { |
| | | if (order.getState() == VipOrder.STATE_PAY) { |
| | | return new PayWayInfoDTO(PayWayEnum.weChat.getWay(), PayUtil.getPaySuccessUrl(orderId)); |
| | | } |
| | | |
| | | String formWX = PayUtil.createWXOrder(orderId, null, orderId, order.getPayMoney() ,goodsTitle); |
| | | //暂存2分钟 |
| | | String idWX = StringUtil.Md5(UUID.randomUUID().toString() + "#" + System.currentTimeMillis()); |
| | | redisManager.cacheCommonString(formWX, formWX, 120); |
| | | String payUrlWX = Constant.HOST + "/BuWan/alipay/printPayForm?formId=" + idWX; |
| | | return new PayWayInfoDTO(PayWayEnum.weChat.getWay(), payUrlWX); |
| | | 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 |
| | | public String getAlipayForm(String formId) { |
| | | Jedis jedis = jedisPool.getResource(); |
| | | try { |
| | | return jedis.get(formId); |
| | | } finally { |
| | | jedis.close(); |
| | | } |
| | | } |
| | | |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public VipOrder checkOrderPayState(Long id) { |
| | | public VipOrder checkOrderPayState(Long id) throws VipOrderException, OrderPayException { |
| | | VipOrder order = vipOrderMapper.selectByPrimaryKey(id); |
| | | if (order == null || order.getState() == VipOrder.STATE_PAY) { |
| | | if (order == null) { |
| | | throw new VipOrderException(VipOrderException.CODE_NOT_EXIST, "订单不存在"); |
| | | } |
| | | if (order.getState() == VipOrder.STATE_PAY) { |
| | | return order; |
| | | } |
| | | switch (order.getPayWay()) { |
| | | case "alipay": //支付宝 |
| | | //支付宝 |
| | | case "alipay": |
| | | AlipayTradeQueryResponse res = null; |
| | | try { |
| | | res = AlipayH5PayUtil.queryOrder(PayUtil.getAlipayApp(), id+"" , null); |
| | | res = AlipayH5PayUtil.queryOrder(PayUtil.getAlipayApp(), order.getThreeOrderId(), null); |
| | | //支付成功 |
| | | if (res.isSuccess() && "TRADE_SUCCESS".equalsIgnoreCase(res.getTradeStatus())) { |
| | | try { |
| | | return paySuccess(order); |
| | | } catch (Exception e) { |
| | | e.printStackTrace(); |
| | | } |
| | | return paySuccess(order); |
| | | } else { |
| | | throw new OrderPayException(OrderPayException.CODE_PAY_FAIL, "支付宝付款未成功"); |
| | | } |
| | | } catch (AlipayApiException e) { |
| | | e.printStackTrace(); |
| | | throw new OrderPayException(OrderPayException.CODE_API_ERROR, "支付宝接口请求出错:" + e.getErrMsg()); |
| | | } |
| | | case "weChat": //微信 |
| | | //微信 |
| | | case "weChat": |
| | | WXPayOrderInfoV3 info = null; |
| | | try { |
| | | WXPayOrderInfoV3 info = WXPayV3Util.getPayOrderInfo(id+"" , PayUtil.getWXAPP()); |
| | | if (info != null && info.getTrade_state().equalsIgnoreCase("SUCCESS")) { |
| | | paySuccess(order); |
| | | return order; |
| | | } |
| | | info = WXPayV3Util.getPayOrderInfo(order.getThreeOrderId(), PayUtil.getWXAPP()); |
| | | } catch (Exception e) { |
| | | e.printStackTrace(); |
| | | 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, "付款方式不存在"); |
| | | } |
| | | return null; |
| | | } |
| | | } |
| | | |
| | | @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 |
| | | */ |
| | |
| | | Integer validDays = vipCombo.getValidDays(); |
| | | |
| | | // 判断订单类型 |
| | | String orderType = OrderTypeEnum.buyNewly.name(); |
| | | OrderTypeEnum orderType = OrderTypeEnum.buyNewly; |
| | | long count = vipOrderMapper.countByTypeAndUid(order.getUid(), orderType); |
| | | if(count > 0) { |
| | | orderType = OrderTypeEnum.buyRenew.name(); |
| | | 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); |
| | | order.setState(VipOrder.STATE_PAY); |
| | | order.setPayTime(new Date()); |
| | | order.setUpdateTime(new Date()); |
| | | vipOrderMapper.updateByPrimaryKeySelective(order); |
| | | |
| | | // 更新等级 |
| | | vipCenterService.saveVipCenter(order.getUid(), vipCombo.getGradeId(), validDays, order.getId() ); |
| | | // 更新等级 |
| | | vipCenterService.saveVipCenter(order.getUid(), vipCombo.getGradeId(), validDays * 24, order.getId()); |
| | | |
| | | return order; |
| | | } |
| | | return order; |
| | | } |
| | | |
| | | } |