PaymentManageImpl.java 5.61 KB
package com.hotent.lpg.user.manager.impl;

import cn.hutool.core.util.RandomUtil;
import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson.JSONObject;
import com.github.binarywang.wxpay.bean.notify.WxPayNotifyResponse;
import com.github.binarywang.wxpay.bean.notify.WxPayOrderNotifyResult;
import com.github.binarywang.wxpay.bean.request.WxPayUnifiedOrderRequest;
import com.github.binarywang.wxpay.exception.WxPayException;
import com.github.binarywang.wxpay.service.WxPayService;

import com.hotent.base.util.BeanUtils;
import com.hotent.lpg.common.model.WDd;
import com.hotent.lpg.user.dao.DdDao;
import com.hotent.lpg.user.enums.PayTypeEnum;
import com.hotent.lpg.user.manager.PaymentManage;
import com.hotent.lpg.user.util.LocalDateTimeUtils;
import com.hotent.lpg.user.util.WxPayConfiguration;
import com.hotent.lpg.user.vo.ResultData;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.math.BigDecimal;
import java.time.LocalDateTime;

@Service
@Transactional
@AllArgsConstructor
@Slf4j
public class PaymentManageImpl implements PaymentManage {
    private final DdDao ddDao;

    @Override
    public ResultData pay(String ddid, String payType) {

        WDd wDd = ddDao.selectById(ddid);
        if (BeanUtils.isEmpty(wDd)) {
            return ResultData.error("订单不存在");
        }
        if (payType.equals(PayTypeEnum.WX.getName())) {
            wDd.setFZffs(PayTypeEnum.WX.getName());
            return wxPay(wDd);
        }
        return ResultData.error("支付方式错误");
    }


    private ResultData wxPay(WDd wDd) {
        try {
            String tradeType = wDd.getFZffs();
            if (StrUtil.isBlank(tradeType)) {
                return ResultData.error("支付方式错误");
            }

            // 防止重新启动支付时报“商户订单号重复”,前面增加8位随机数,product_id最大32位
            String outTradeNo = RandomUtil.randomString(8) + "_" + wDd.getId();
            String body = wDd.getFDddh();
            body = body.length() > 40 ? body.substring(0,39) : body;

            WxPayUnifiedOrderRequest wxPayUnifiedOrderRequest = new WxPayUnifiedOrderRequest();
            wxPayUnifiedOrderRequest.setAppid(WxPayConfiguration.appId);
            wxPayUnifiedOrderRequest.setOpenid(null);
            wxPayUnifiedOrderRequest.setBody(body);
            wxPayUnifiedOrderRequest.setOutTradeNo(outTradeNo);
            wxPayUnifiedOrderRequest.setTotalFee(wDd.getFDdje().multiply(new BigDecimal(100)).intValue());
            wxPayUnifiedOrderRequest.setTradeType(tradeType);

            JSONObject scene_info = new JSONObject();
            scene_info.put("id", "LPG");
            scene_info.put("name", "燃气");
            wxPayUnifiedOrderRequest.setSceneInfo(scene_info.toString());
            wxPayUnifiedOrderRequest.setNotifyUrl("https://zaoyin.peony.cn/server/hzys/payment/v1/notify-order");   // 支付回调地址,开放不用登录
            wxPayUnifiedOrderRequest.setSpbillCreateIp("127.0.0.1");

            // trade_type=APP时
            if("APP".equals(wxPayUnifiedOrderRequest.getTradeType())){

            }
            // trade_type=NATIVE时
            if("NATIVE".equals(wxPayUnifiedOrderRequest.getTradeType())){
                wxPayUnifiedOrderRequest.setProductId(wxPayUnifiedOrderRequest.getOutTradeNo());
            }
            if ("JSAPI".equals(wxPayUnifiedOrderRequest.getTradeType())) {

            }
            if ("MWEB".equals(wxPayUnifiedOrderRequest.getTradeType())) {

            }
            WxPayService wxPayService = WxPayConfiguration.getPayService();
            ddDao.updateById(wDd);
            return ResultData.success(wxPayService.createOrder(wxPayUnifiedOrderRequest));
        } catch (WxPayException e) {
            if("INVALID_REQUEST".equals(e.getErrCode())){
                return ResultData.error("订单号重复,请重新下单");
            }
            e.printStackTrace();
            return ResultData.error(e.getReturnMsg() + "" + e.getCustomErrorMsg() + "" + e.getErrCodeDes());
        }
    }


    @Override
    public String notifyOrder(String xmlData) {
        WxPayService wxPayService = WxPayConfiguration.getPayService();
        try {
            WxPayOrderNotifyResult notifyResult = wxPayService.parseOrderNotifyResult(xmlData);
            String ddid = notifyResult.getOutTradeNo().split("_")[1];
            WDd wDd = ddDao.selectById(ddid);
            if (null == wDd) {
                return WxPayNotifyResponse.fail("订单不存在");
            }
            BigDecimal payPrice = wDd.getFDdje();
            if (payPrice.multiply(new BigDecimal(100)).intValue() != notifyResult.getTotalFee()) {
                return WxPayNotifyResponse.fail("付款金额与订单金额不等");
            }

            String timeEnd = notifyResult.getTimeEnd();
            LocalDateTime paymentTime = LocalDateTimeUtils.parse(timeEnd);
//            wDdb.setfFksj(paymentTime);
//            wDdb.setfZfdh(notifyResult.getTransactionId());
//            wDdb.setfSffk("是");
//            wDdb.setfDdzt("已付款");
//            wDdb.setfPtddzt("待审批");
//            wDdbDao.updateById(wDdb);
//
//            if (StrUtil.isNotBlank(wDdb.getfZpid())) {
//                WZp wZp = wZpDao.selectById(wDdb.getfZpid());
//                wZp.setfZt("定制中");
//                wZpDao.updateById(wZp);
//            }
            return WxPayNotifyResponse.success("成功");
        } catch (WxPayException e) {
            return WxPayNotifyResponse.fail(e.getErrCodeDes());
        }
    }
}