package com.dsh.account.service.impl;
|
|
import com.alibaba.fastjson.JSON;
|
import com.alibaba.fastjson.JSONArray;
|
import com.alibaba.fastjson.JSONObject;
|
import com.alipay.api.response.AlipayTradeQueryResponse;
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
import com.dsh.account.entity.TAppUser;
|
import com.dsh.account.entity.Vip;
|
import com.dsh.account.entity.VipPayment;
|
import com.dsh.account.feignclient.activity.UserConponClient;
|
import com.dsh.account.feignclient.activity.UserCouponPaymentClient;
|
import com.dsh.account.feignclient.activity.model.GrantCoupon;
|
import com.dsh.account.feignclient.other.VipClient;
|
import com.dsh.account.mapper.VipPaymentMapper;
|
import com.dsh.account.model.IncomeQuery;
|
import com.dsh.account.service.IVipPaymentService;
|
import com.dsh.account.service.TAppUserService;
|
import com.dsh.account.util.DateUtil;
|
import com.dsh.account.util.PayMoneyUtil;
|
import com.dsh.account.util.RedisUtil;
|
import com.dsh.account.util.ResultUtil;
|
import com.dsh.account.util.wx.WxV3PayConfig;
|
import com.dsh.account.vo.CouponVipResp;
|
import org.apache.commons.lang.time.DateUtils;
|
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.stereotype.Service;
|
import org.springframework.util.StringUtils;
|
|
import javax.annotation.Resource;
|
import java.math.BigDecimal;
|
import java.time.LocalDateTime;
|
import java.time.ZoneId;
|
import java.util.Calendar;
|
import java.util.Date;
|
import java.util.List;
|
import java.util.Map;
|
|
/**
|
* @author zhibing.pu
|
* @date 2023/6/24 10:03
|
*/
|
@Service
|
public class VipPaymentServiceImpl extends ServiceImpl<VipPaymentMapper, VipPayment> implements IVipPaymentService {
|
|
@Autowired
|
private TAppUserService appUserService;
|
|
@Autowired
|
private PayMoneyUtil payMoneyUtil;
|
|
@Resource
|
private UserConponClient userConponClient;
|
|
@Autowired
|
private RedisUtil redisUtil;
|
@Autowired
|
private VipClient vipClient;
|
|
|
|
/**
|
* 购买年度会员
|
*
|
* @param uid
|
* @return
|
* @throws Exception
|
*/
|
@Override
|
public ResultUtil addVipPayment(Integer uid, Integer payType, Integer vipId) throws Exception {
|
if (vipId == null) {
|
return ResultUtil.error("会员id未传参");
|
}
|
List<Vip> vipByIds = vipClient.getVipByIds(vipId.toString());
|
if (vipByIds.isEmpty()) {
|
return ResultUtil.error("会员不存在");
|
}
|
Vip vip = vipByIds.get(0);
|
VipPayment vipPayment = new VipPayment();
|
vipPayment.setCode(VipPayment.CODE());
|
vipPayment.setAmount(vip.getPrice().doubleValue());
|
vipPayment.setAppUserId(uid);
|
vipPayment.setInsertTime(new Date());
|
vipPayment.setPayStatus(1);
|
vipPayment.setState(1);
|
vipPayment.setPayType(payType);
|
vipPayment.setVipId(vip.getId());
|
vipPayment.setCouponJson(vip.getCouponJson());
|
vipPayment.setTicketJson(vip.getTicketJson());
|
this.baseMapper.insert(vipPayment);
|
if (payType == 1) {//微信
|
return weixinpay(vipPayment);
|
}
|
if (payType == 2) {//支付宝
|
return alipay(vipPayment);
|
}
|
return ResultUtil.success();
|
}
|
|
|
/**
|
* 微信
|
*
|
* @param vipPayment
|
* @return
|
* @throws Exception
|
*/
|
public ResultUtil weixinpay(VipPayment vipPayment) throws Exception {
|
String code = vipPayment.getCode();
|
ResultUtil weixinpay = payMoneyUtil.weixinpay("购买会员", "", code, vipPayment.getAmount().toString(),
|
"/base/appUser/addVipPaymentWeChatCallback", "APP", "");
|
// ResultUtil weixinpay = payMoneyUtil.weixinpayV3(WxV3PayConfig.smidVx,"购买年度会员",
|
// code,"/base/appUser/addVipPaymentWeChatCallback1",
|
// Long.valueOf(vipPayment.getAmount().toString()));
|
return weixinpay;
|
}
|
|
/**
|
* 支付宝
|
*
|
* @param vipPayment
|
* @return
|
* @throws Exception
|
*/
|
private String smid = "2088330203191220";//平台支付宝商户号
|
|
public ResultUtil alipay(VipPayment vipPayment) throws Exception {
|
String code = vipPayment.getCode();
|
String amount = vipPayment.getAmount().toString();
|
ResultUtil alipay = payMoneyUtil.alipay
|
(smid, "购买年度会员", "购买年度会员",
|
vipPayment.getAppUserId() + "",
|
code, vipPayment.getAmount().toString(),
|
"/base/appUser/addVipPaymentAliCallback");
|
if (alipay.getCode() == 200) {
|
new Thread(new Runnable() {
|
@Override
|
public void run() {
|
try {
|
int num = 1;
|
int wait = 0;
|
while (num <= 10) {
|
int min = 5000;
|
wait += (min * num);
|
VipPayment vipPayment1 = VipPaymentServiceImpl.this.getOne(new QueryWrapper<VipPayment>().eq("code", code));
|
if (vipPayment1.getPayStatus() != 1) {
|
return;
|
}
|
|
/**
|
* 交易状态:
|
* WAIT_BUYER_PAY(交易创建,等待买家付款)、
|
* TRADE_CLOSED(未付款交易超时关闭,或支付完成后全额退款)、
|
* TRADE_SUCCESS(交易支付成功)、
|
* TRADE_FINISHED(交易结束,不可退款)
|
*/
|
AlipayTradeQueryResponse resultUtil = payMoneyUtil.queryALIOrder(code);
|
|
if (resultUtil.getCode().equals("10000")) {
|
String tradeNo = resultUtil.getTradeNo();
|
String tradeStatus = resultUtil.getTradeStatus();
|
System.out.println("ssssss" + tradeStatus);
|
if ("TRADE_CLOSED".equals(tradeStatus) || "TRADE_FINISHED".equals(tradeStatus)) {
|
vipPayment1.setState(3);
|
VipPaymentServiceImpl.this.updateById(vipPayment1);
|
|
return;
|
}
|
if ("TRADE_SUCCESS".equals(tradeStatus)) {
|
vipPayment1.setPayStatus(2);
|
vipPayment1.setPayTime(new Date());
|
vipPayment1.setOrderNumber(tradeNo);
|
VipPaymentServiceImpl.this.updateById(vipPayment1);
|
|
TAppUser appUser = appUserService.getById(vipPayment1.getAppUserId());
|
Date vipEndTime = appUser.getVipEndTime();
|
appUser.setIsVip(1);
|
if (null == vipEndTime) {
|
vipEndTime = new Date();
|
}
|
Calendar calendar = Calendar.getInstance();
|
calendar.setTime(vipEndTime);
|
calendar.set(Calendar.YEAR, calendar.get(Calendar.YEAR) + 1);
|
appUser.setVipEndTime(calendar.getTime());
|
appUserService.updateById(appUser);
|
// 注册会员送券 先判断是否有注册送券类型的优惠券 判断优惠券状态 审核是否通过 是否删除 是否在有效期内 是否领取数量达上限
|
List<Long> longs = userConponClient.queryCouponByUser(appUser.getId());
|
redisUtil.setStrValue("VIP_P_" + vipPayment1.getAppUserId(), JSON.toJSONString(longs), 3600);
|
Thread.sleep(30000);
|
payMoneyUtil.confirm(smid, code, tradeNo, amount);
|
return;
|
}
|
if ("WAIT_BUYER_PAY".equals(tradeStatus)) {
|
Thread.sleep(wait);
|
num++;
|
}
|
} else {
|
Thread.sleep(wait);
|
num++;
|
}
|
if (10 == num) {
|
vipPayment1.setState(3);
|
VipPaymentServiceImpl.this.updateById(vipPayment1);
|
}
|
}
|
} catch (Exception e) {
|
e.printStackTrace();
|
}
|
}
|
}).start();
|
}
|
return alipay;
|
}
|
|
|
/**
|
* 购买年度会员支付回调处理
|
*
|
* @param code
|
* @param orderNumber
|
* @throws Exception
|
*/
|
@Override
|
public synchronized ResultUtil addVipPaymentCallback(String code, String orderNumber) throws Exception {
|
VipPayment vipPayment1 = VipPaymentServiceImpl.this.getOne(new QueryWrapper<VipPayment>().eq("code", code));
|
if (vipPayment1.getPayStatus() == 2) {
|
return ResultUtil.success();
|
}
|
vipPayment1.setPayStatus(2);
|
vipPayment1.setPayTime(new Date());
|
vipPayment1.setOrderNumber(orderNumber);
|
VipPaymentServiceImpl.this.updateById(vipPayment1);
|
|
TAppUser appUser = appUserService.getById(vipPayment1.getAppUserId());
|
Date vipEndTime = appUser.getVipEndTime();
|
if (null == vipEndTime) {
|
vipEndTime = new Date();
|
}
|
// 将Date类型 转化为LocalDateTime
|
LocalDateTime localDateTime = LocalDateTime.ofInstant(vipEndTime.toInstant(), ZoneId.systemDefault());
|
List<Vip> vipByIds = vipClient.getVipByIds(vipPayment1.getVipId() + "");
|
if (vipByIds.isEmpty()) {
|
return ResultUtil.error("会员不存在");
|
}
|
Vip vip = vipByIds.get(0);
|
Integer time = vip.getTime();
|
|
// 根据time和时间类型 决定给会员加多少天
|
switch (vip.getTimeType()) {
|
case 1:
|
// 天
|
localDateTime.plusDays(time);
|
break;
|
case 2:
|
// 月
|
localDateTime.plusMonths(time);
|
|
break;
|
case 3:
|
// 年
|
localDateTime.plusYears(time);
|
break;
|
}
|
appUser.setIsVip(1);
|
Date date = Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant());
|
appUser.setVipEndTime(date);
|
appUserService.updateById(appUser);
|
// 会员权益送券和门票
|
String couponJson = vipPayment1.getCouponJson();
|
GrantCoupon grantCoupon = new GrantCoupon();
|
|
if (StringUtils.hasLength(couponJson)) {
|
grantCoupon.setCouponJson(couponJson);
|
grantCoupon.setUserId(vipPayment1.getAppUserId());
|
grantCoupon.setVipPaymentId(vipPayment1.getId());
|
}
|
String ticketJson = vipPayment1.getTicketJson();
|
if (StringUtils.hasLength(ticketJson)) {
|
grantCoupon.setTicketJson(ticketJson);
|
}
|
// 远程调用 给用户送优惠券和门票
|
userConponClient.granCoupon(grantCoupon);
|
|
// 注册会员送券 先判断是否有注册送券类型的优惠券 判断优惠券状态 审核是否通过 是否删除 是否在有效期内 是否领取数量达上限
|
List<Long> longs = userConponClient.queryCouponByUser(appUser.getId());
|
redisUtil.setStrValue("VIP_P_" + vipPayment1.getAppUserId(), JSON.toJSONString(longs), 3600);
|
return ResultUtil.success();
|
}
|
|
|
}
|