无关风月
1 天以前 ac3e9a7f0b21fb630049f9e191bd760eefd21467
cloud-server-account/src/main/java/com/dsh/account/service/impl/VipPaymentServiceImpl.java
@@ -1,25 +1,37 @@
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;
@@ -43,28 +55,44 @@
    @Autowired
    private RedisUtil redisUtil;
    @Autowired
    private VipClient vipClient;
    /**
     * 购买年度会员
     *
     * @param uid
     * @return
     * @throws Exception
     */
    @Override
    public ResultUtil addVipPayment(Integer uid, Integer payType) throws Exception {
    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(0.01D);
        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){//微信
        if (payType == 1) {//微信
            return weixinpay(vipPayment);
        }
        if(payType == 2){//支付宝
        if (payType == 2) {//支付宝
            return alipay(vipPayment);
        }
        return ResultUtil.success();
@@ -73,115 +101,50 @@
    /**
     * 微信
     *
     * @param vipPayment
     * @return
     * @throws Exception
     */
    public ResultUtil weixinpay(VipPayment vipPayment) throws Exception{
    public ResultUtil weixinpay(VipPayment vipPayment) throws Exception {
        String code = vipPayment.getCode();
        ResultUtil weixinpay = payMoneyUtil.weixinpay("购买年度会员", "", code, vipPayment.getAmount().toString(),
        ResultUtil weixinpay = payMoneyUtil.weixinpay("购买会员", "", code, vipPayment.getAmount().toString(),
                "/base/appUser/addVipPaymentWeChatCallback", "APP", "");
        if(weixinpay.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() == 2){
                                return;
                            }
                            /**
                             * SUCCESS--支付成功
                             * REFUND--转入退款
                             * NOTPAY--未支付
                             * CLOSED--已关闭
                             * REVOKED--已撤销(刷卡支付)
                             * USERPAYING--用户支付中
                             * PAYERROR--支付失败(其他原因,如银行返回失败)
                             * ACCEPT--已接收,等待扣款
                             */
                            ResultUtil<Map<String, String>> resultUtil = payMoneyUtil.queryWXOrder(code, "");
                            if(resultUtil.getCode() == 200){
                                Map<String, String> map = resultUtil.getData();
                                String trade_type = map.get("trade_type");
                                String trade_state = map.get("trade_state");
                                String transaction_id = map.get("transaction_id");
                                if("REFUND".equals(trade_state) || "NOTPAY".equals(trade_state) || "CLOSED".equals(trade_state) || "REVOKED".equals(trade_state) || "PAYERROR".equals(trade_state)){
                                    vipPayment1.setState(3);
                                    VipPaymentServiceImpl.this.updateById(vipPayment1);
                                    return;
                                }
                                if("SUCCESS".equals(trade_state)){
                                    vipPayment1.setPayStatus(2);
                                    vipPayment1.setPayTime(new Date());
                                    vipPayment1.setOrderNumber(transaction_id);
                                    VipPaymentServiceImpl.this.updateById(vipPayment1);
                                    TAppUser appUser = appUserService.getById(vipPayment1.getAppUserId());
                                    Date vipEndTime = appUser.getVipEndTime();
                                    if(null == vipEndTime){
                                        vipEndTime = new Date();
                                    }
                                    Calendar calendar = Calendar.getInstance();
                                    calendar.setTime(vipEndTime);
                                    calendar.set(Calendar.YEAR, calendar.get(Calendar.YEAR) + 1);
                                    appUser.setIsVip(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);
                                    return;
                                }
                                if("USERPAYING".equals(trade_state) || "ACCEPT".equals(trade_state)){
                                    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();
        }
//        ResultUtil weixinpay = payMoneyUtil.weixinpayV3(WxV3PayConfig.smidVx,"购买年度会员",
//                code,"/base/appUser/addVipPaymentWeChatCallback1",
//                Long.valueOf(vipPayment.getAmount().toString()));
        return weixinpay;
    }
    /**
     * 支付宝
     *
     * @param vipPayment
     * @return
     * @throws Exception
     */
    public ResultUtil alipay(VipPayment vipPayment) throws Exception{
    private String smid = "2088330203191220";//平台支付宝商户号
    public ResultUtil alipay(VipPayment vipPayment) throws Exception {
        String code = vipPayment.getCode();
        ResultUtil alipay = payMoneyUtil.alipay("购买年度会员", "购买年度会员", vipPayment.getAppUserId()+"", code, vipPayment.getAmount().toString(),
                "/base/appUser/addVipPaymentAliCallback");
        if(alipay.getCode() == 200){
        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){
                        while (num <= 10) {
                            int min = 5000;
                            wait += (min * num);
                            VipPayment vipPayment1 = VipPaymentServiceImpl.this.getOne(new QueryWrapper<VipPayment>().eq("code", code));
                            if(vipPayment1.getPayStatus() != 1){
                            if (vipPayment1.getPayStatus() != 1) {
                                return;
                            }
@@ -194,20 +157,17 @@
                             */
                            AlipayTradeQueryResponse resultUtil = payMoneyUtil.queryALIOrder(code);
                            if(resultUtil.getCode().equals("10000")){
//                                Map<String, String> map = resultUtil.getData();
//                                String tradeStatus = map.get("tradeStatus");
//                                String tradeNo = map.get("tradeNo");
                            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)){
                                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)){
                                if ("TRADE_SUCCESS".equals(tradeStatus)) {
                                    vipPayment1.setPayStatus(2);
                                    vipPayment1.setPayTime(new Date());
                                    vipPayment1.setOrderNumber(tradeNo);
@@ -216,7 +176,7 @@
                                    TAppUser appUser = appUserService.getById(vipPayment1.getAppUserId());
                                    Date vipEndTime = appUser.getVipEndTime();
                                    appUser.setIsVip(1);
                                    if(null == vipEndTime){
                                    if (null == vipEndTime) {
                                        vipEndTime = new Date();
                                    }
                                    Calendar calendar = Calendar.getInstance();
@@ -227,22 +187,24 @@
                                    // 注册会员送券 先判断是否有注册送券类型的优惠券 判断优惠券状态 审核是否通过 是否删除 是否在有效期内 是否领取数量达上限
                                    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)){
                                if ("WAIT_BUYER_PAY".equals(tradeStatus)) {
                                    Thread.sleep(wait);
                                    num++;
                                }
                            }else{
                            } else {
                                Thread.sleep(wait);
                                num++;
                            }
                            if(10 == num){
                            if (10 == num) {
                                vipPayment1.setState(3);
                                VipPaymentServiceImpl.this.updateById(vipPayment1);
                            }
                        }
                    }catch (Exception e){
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
@@ -252,10 +214,9 @@
    }
    /**
     * 购买年度会员支付回调处理
     *
     * @param code
     * @param orderNumber
     * @throws Exception
@@ -263,7 +224,7 @@
    @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){
        if (vipPayment1.getPayStatus() == 2) {
            return ResultUtil.success();
        }
        vipPayment1.setPayStatus(2);
@@ -272,11 +233,55 @@
        VipPaymentServiceImpl.this.updateById(vipPayment1);
        TAppUser appUser = appUserService.getById(vipPayment1.getAppUserId());
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(new Date());
        calendar.set(Calendar.YEAR, calendar.get(Calendar.YEAR) + 1);
        appUser.setVipEndTime(calendar.getTime());
        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);