All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.nbsaas.boot.pay.ext.resource.CashPaymentExtResource Maven / Gradle / Ivy

package com.nbsaas.boot.pay.ext.resource;

import com.github.binarywang.wxpay.bean.entpay.EntPayRequest;
import com.github.binarywang.wxpay.bean.entpay.EntPayResult;
import com.github.binarywang.wxpay.config.WxPayConfig;
import com.github.binarywang.wxpay.exception.WxPayException;
import com.github.binarywang.wxpay.service.EntPayService;
import com.github.binarywang.wxpay.service.WxPayService;
import com.github.binarywang.wxpay.service.impl.EntPayServiceImpl;
import com.github.binarywang.wxpay.service.impl.WxPayServiceImpl;
import com.github.binarywang.wxpay.util.XmlConfig;
import com.nbsaas.boot.pay.api.apis.CashConfigApi;
import com.nbsaas.boot.pay.api.apis.CashPaymentApi;
import com.nbsaas.boot.pay.api.apis.PayUserApi;
import com.nbsaas.boot.pay.api.domain.enums.FeeType;
import com.nbsaas.boot.pay.api.domain.enums.SendState;
import com.nbsaas.boot.pay.api.domain.request.CashPaymentDataRequest;
import com.nbsaas.boot.pay.api.domain.request.PayUserDataRequest;
import com.nbsaas.boot.pay.api.domain.response.CashConfigResponse;
import com.nbsaas.boot.pay.api.domain.response.CashPaymentResponse;
import com.nbsaas.boot.pay.api.domain.response.PayUserResponse;
import com.nbsaas.boot.pay.data.entity.CashConfig;
import com.nbsaas.boot.pay.data.entity.PayUser;
import com.nbsaas.boot.pay.ext.apis.CashPaymentExtApi;
import com.nbsaas.boot.pay.ext.domain.request.WithdrawalRequest;
import com.nbsaas.boot.rest.filter.Filter;
import com.nbsaas.boot.rest.response.ResponseObject;
import com.nbsaas.boot.trade.api.domain.response.TradeAccountResponse;
import com.nbsaas.boot.trade.ext.apis.BasicTradeAccountExtApi;
import com.nbsaas.boot.trade.ext.apis.TradeExtApi;
import com.nbsaas.boot.trade.ext.domain.request.TradeRequest;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Isolation;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.StringUtils;

import javax.annotation.Resource;
import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Random;


@Service
public class CashPaymentExtResource implements CashPaymentExtApi {

    @Resource
    private CashPaymentApi cashPaymentApi;

    @Resource
    private PayUserApi payUserApi;

    @Resource
    private TradeExtApi tradeExtApi;

    @Resource
    private CashConfigApi cashConfigApi;

    @Autowired
    private BasicTradeAccountExtApi basicTradeAccountExtApi;


    @Transactional(isolation = Isolation.SERIALIZABLE)
    @Override
    public ResponseObject cashAuto(WithdrawalRequest request) {
        ResponseObject result=new ResponseObject<>();

        result=cash(request);
        pay(result.getData());


        return result;
    }

    @Transactional(isolation = Isolation.SERIALIZABLE)
    @Override
    public ResponseObject back(CashPaymentDataRequest request) {
        ResponseObject result=new ResponseObject<>();

        CashPaymentResponse payment = cashPaymentApi.oneData(Filter.eq("id", request.getId()));
        if (payment == null) {
            result.setCode(501);
            result.setMsg("无效退款id");
            return result;
        }
        if (payment.getSendState() == SendState.send) {
            result.setCode(502);
            result.setMsg("付款单据不能退款");
            return result;
        }
        if (payment.getSendState() == SendState.back) {
            result.setCode(503);
            result.setMsg("该单据已经退过款了");
            return result;
        }
        if (payment.getOpenId() == null) {
            result.setCode(504);
            result.setMsg("单据openId不存在");
            return result;
        }
        Long account = payment.getTradeAccount();
        if (account == null) {
            result.setCode(505);
            result.setMsg("单据无付款账号");
            return result;
        }

        TradeAccountResponse paymentAccount = basicTradeAccountExtApi.initSpecial("payment");

        TradeRequest cashRequest = new TradeRequest();
        cashRequest.setAmount(payment.getCash());
        cashRequest.setFrom(paymentAccount.getId());
        cashRequest.setTo(account);
        cashRequest.setChangeType(1001);
        cashRequest.setNote("提现退回");
        tradeExtApi.trade(cashRequest);



        CashPaymentDataRequest form=new CashPaymentDataRequest();
        form.setId(payment.getId());
        form.setSendState(SendState.back);
        cashPaymentApi.updateData(form);

        return result;

    }

    public  ResponseObject cash(WithdrawalRequest request) {
        ResponseObject result = new ResponseObject<>();
        if (request.getMoney() == null || request.getMoney().compareTo(new BigDecimal(0)) <= 0) {
            result.setCode(-1);
            result.setMsg("无效金额");
            return result;
        }
        PayUserResponse user = payUserApi.oneData(Filter.eq("id", request.getUser()));
        if (user == null) {
            result.setCode(1001);
            result.setMsg("无效token");
            return result;
        }
        if (request.getOpenId() == null) {
            result.setCode(1002);
            result.setMsg("无效微信用户");
            return result;
        }

        if (user.getTradeAccount() == null) {
            user.setTradeAccount(tradeExtApi.initNormal().getId());

            PayUserDataRequest staffForm = new PayUserDataRequest();
            staffForm.setId(user.getId());
            staffForm.setTradeAccount(staffForm.getTradeAccount());
            payUserApi.update(staffForm);
        }
        if (user.getTradeAccountAmount().compareTo(request.getMoney()) < 0) {
            result.setCode(-303);
            result.setMsg("余额不足");
            return result;
        }

        TradeAccountResponse paymentAccount = basicTradeAccountExtApi.initSpecial("payment");

        TradeAccountResponse feeAccount = basicTradeAccountExtApi.initSpecial( "feeAccount");


        CashConfigResponse cashConfig = cashConfigApi.oneData(
                Filter.eq("key", request.getKey()));
        BigDecimal fee = null;
        BigDecimal money = null;
        if (cashConfig == null) {
            result.setCode(503);
            result.setMsg("提现配置没设置");
            return result;
        }

        FeeType feeType = cashConfig.getFeeType();
        if (feeType == null) {
            feeType = FeeType.single;
        }
        if (feeType == FeeType.single) {
            fee = cashConfig.getFee();
        } else {
            BigDecimal rate = cashConfig.getRate();
            if (rate == null) {
                rate = new BigDecimal(0);
            }
            fee = request.getMoney().multiply(rate).divide(new BigDecimal(100));
        }
        if (fee == null) {
            fee = new BigDecimal(0);
        }

        if (fee.compareTo(new BigDecimal(0.001)) > 0) {
            money = request.getMoney().subtract(fee);
            if (money.compareTo(new BigDecimal(0.001)) < 0) {
                result.setCode(-304);
                result.setMsg("手续费大于提现金额");
                return result;
            }

            TradeRequest feeRequest = new TradeRequest();
            feeRequest.setAmount(fee);
            feeRequest.setFrom(user.getTradeAccount());
            feeRequest.setTo(feeAccount.getId());
            feeRequest.setChangeType(3);
            feeRequest.setNote("手续费");
            tradeExtApi.trade(feeRequest);
        }else{
            money=request.getMoney();
        }

        Long userAccount = user.getTradeAccount();
        TradeRequest cashRequest = new TradeRequest();
        cashRequest.setAmount(money);
        cashRequest.setFrom(userAccount);
        cashRequest.setTo(paymentAccount.getId());
        cashRequest.setChangeType(2);
        cashRequest.setNote("微信提现");
        tradeExtApi.trade(cashRequest);

        CashPaymentDataRequest cashPayment = new CashPaymentDataRequest();
        cashPayment.setTradeAccount(userAccount);
        cashPayment.setCashConfig(cashConfig.getId());
        cashPayment.setName(request.getName());
        cashPayment.setMoney(money);
        cashPayment.setSendState(SendState.init);
        cashPayment.setOpenId(request.getOpenId());
        cashPayment.setCashNo(getOrderNo());
        cashPayment.setNote("微信余额提现");
        cashPayment.setFee(fee);
        cashPayment.setCash(request.getMoney());
        cashPayment.setUser(user.getId());
        cashPayment.setPhone(request.getPhone());
        cashPayment.setIdNo(request.getNo());
        cashPayment.setAppId(cashConfig.getAppId());
        cashPayment.setTradeAccount(userAccount);
        CashPaymentResponse res = cashPaymentApi.createData(cashPayment);


        result.setData(res.getId());

        return result;
    }
    private String getOrderNo() {

        SimpleDateFormat format = new SimpleDateFormat("yyyyMMddHHmmss");
        Random rand=new Random();
        return "TX"+format.format(new Date()) + "" +(rand.nextInt(99999)+10000);
    }
    @Transactional(isolation = Isolation.SERIALIZABLE)
    public ResponseObject pay(Long id) {
        ResponseObject result=new ResponseObject<>();

        CashPaymentResponse temp = cashPaymentApi.oneData(Filter.eq("id", id));

        if (temp == null) {
            result.setCode(501);
            result.setMsg("无效信息");
            return result;
        }
        Long cashConfigId = temp.getCashConfig();
        if (cashConfigId == null) {
            result.setCode(502);
            result.setMsg("提现单无配置信息");
            return result;
        }
        CashConfigResponse cashConfig=cashConfigApi.oneData(Filter.eq("id",cashConfigId));
        if (temp.getSendState() == SendState.send) {
            result.setCode(502);
            result.setMsg("该提现单已经支付");
            return result;
        }
        if (temp.getSendState() == SendState.back) {
            result.setCode(503);
            result.setMsg("该提现单已经退回");
            return result;
        }
        if (temp.getSendState() == SendState.fail) {
            result.setCode(504);
            result.setMsg("该提现单无法处理");
            return result;
        }
        XmlConfig.fastMode=true;
        EntPayRequest request = new EntPayRequest();
        request.setAmount(temp.getMoney().multiply(new BigDecimal(100)).intValue());
        request.setPartnerTradeNo(getOrderNo());
        request.setReUserName(temp.getName());
        request.setCheckName("FORCE_CHECK");
        request.setDescription(temp.getNote());
        request.setOpenid(temp.getOpenId());
        request.setSpbillCreateIp("119.23.149.178");

        WxPayConfig payConfig = new WxPayConfig();
        payConfig.setAppId(cashConfig.getAppId());
        payConfig.setMchId(cashConfig.getMchId());
        payConfig.setMchKey(cashConfig.getMchKey());
        payConfig.setKeyPath(cashConfig.getKeyPath());
        //payConfig.setSignType("MD5");
        WxPayService wxPayService = new WxPayServiceImpl();
        wxPayService.setConfig(payConfig);
        EntPayService entPayService = new EntPayServiceImpl(wxPayService);
        try {
            EntPayResult entPayResult = entPayService.entPay(request);

            CashPaymentDataRequest cashPaymentDataRequest=new CashPaymentDataRequest();
            cashPaymentDataRequest.setId(temp.getId());
            cashPaymentDataRequest.setSendState(SendState.send);
            cashPaymentDataRequest.setBussNo(entPayResult.getPaymentNo());
            cashPaymentApi.updateData(cashPaymentDataRequest);
        } catch (WxPayException exception) {
            result.setCode(503);
            result.setMsg("付款失败");
            result.setMsg(exception.getErrCodeDes());
            temp.setDemo(exception.getErrCodeDes());
            exception.printStackTrace();
            throw new RuntimeException(exception.getErrCodeDes());
        }
        return result;
    }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy