MinaOrderPayController.java 6.1 KB
Newer Older
苗卫卫 committed
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137
package com.boco.nbd.wios.wx.controller;

import cn.hutool.core.lang.Assert;
import com.boco.nbd.cams.core.constant.CamsConstant;
import com.boco.nbd.wios.manage.contants.WiosConstant;
import com.boco.nbd.wios.manage.entity.bo.UserPayBill;
import com.boco.nbd.wios.manage.entity.settlement.vo.InvoiceVo;
import com.boco.nbd.wios.manage.service.impl.InvoiceService;
import com.boco.nbd.wios.manage.service.impl.UserPayBillService;
import com.boco.nbd.wios.wx.permisson.MinaPermission;
import com.boco.nbd.wios.wx.service.WeixinPayCore;
import com.boco.nbd.wios.wx.service.WxOrderService;
import com.boco.nbd.wios.wx.vo.WxBillVO;
import com.boco.nbd.wios.wx.vo.WxInvoiceVO;
import com.boco.nbd.wios.wx.weixin.WeixinPayTradeType;
import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
import com.ihidea.component.api.v2.BaseResponse;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.Date;
import java.util.Map;

/**
 * @author kevin
 * @create 2020/10/28 20:59
 */
@Api(tags = "微信小程序订单支付相关接口")
@MinaPermission
@RestController
@RequestMapping("/mina")
public class MinaOrderPayController {

    @Autowired
    private UserPayBillService userPayBillService;

    @Autowired
    private WeixinPayController weixinPayController;

    @Autowired
    private InvoiceService invoiceService;

    @Autowired
    private WxOrderService wxOrderService;

    @ApiOperationSupport(order = 30)
    @ApiOperation(value = "订单付款二维码生成")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "orderId", value = "订单id", dataType = "String", paramType = "query", required = true),
    })
    @GetMapping(value = "/order/payQrcode/generate")
    public BaseResponse<Object> generatePayQrcode(String orderId) {
        Assert.notBlank(orderId, WiosConstant.EMPTY_ORDER_ID);

        String codeUrl = userPayBillService.genPayQrcode(orderId);
        return new BaseResponse<>("/generateQrcode.do?url="+codeUrl);
    }

    @MinaPermission(require=false)
    @ApiOperation(value="订单付款查询", notes = "查询微信支付服务器中订单实际支付结果,由于支付存在扫码付款和公众号付款两种方式,会逐个方式去查询,如果其中一个支付成功,则自动更新支付数据")
    @GetMapping("/order/queryPay")
    public BaseResponse<String> queryPay(String orderId){
        UserPayBill bill = userPayBillService.getByRefId(orderId);
        Assert.notNull(bill, "付款订单不存在");
        // 由于支付存在两种方式,商户订单号根据支付类型区分,所以查询时需要分两种方式查询
        Map<String, Object> payResult= WeixinPayCore.queryOrder(bill.getId()+ CamsConstant.UNDER_LINE+ WeixinPayTradeType.JSAPI);
        if(payResult==null){
            payResult=WeixinPayCore.queryOrder(bill.getId()+CamsConstant.UNDER_LINE+ WeixinPayTradeType.NATIVE);
        }

        if(payResult!=null){
            weixinPayController.payBillSuccess(payResult);
            return new BaseResponse("已支付成功");
        }
        return new BaseResponse("支付失败或未找到支付信息");
    }

    @MinaPermission(require=false)
    @ApiOperation(value = "订单账单作废", notes="该操作会删除账单和缓存的付款码,操作后不可恢复,谨慎使用(需确认客户未支付并通知客户停止支付,重新生成后再支付)")
    @GetMapping("/order/billDelete")
    public BaseResponse<String> billDelete(String orderId){
        userPayBillService.deleteBill(orderId);
        return new BaseResponse("操作成功");
    }

    @MinaPermission(require=false)
    @ApiOperation("订单付款成功接口-仅测试用,未实际支付,上线后需关闭")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "orderId", value = "订单id", dataType = "String", paramType = "query", required = true),
            @ApiImplicitParam(name = "source", value = "付款来源 1-公众号 2-扫码支付 3-APP支付", dataType = "int", paramType = "query", required = true),
    })
    @GetMapping("/order/paySuccess")
    public BaseResponse<String> paySuccess(String orderId, Integer source){
        UserPayBill bill = userPayBillService.getByRefId(orderId);
        Assert.notNull(bill, "付款订单不存在");
        Assert.isTrue(bill.getStatus()==0, "付款订单已支付");

        userPayBillService.paySuccess(bill.getId(), 3, "xxxxxxx", "2020xxxxxxxxx", new Date(), source);
        return new BaseResponse("支付成功");
    }

    @ApiOperation("账单详情")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "orderId", value = "安装工单编号", dataType = "String", paramType = "query", required = true),
    })
    @GetMapping("/billDetail")
    public BaseResponse<WxBillVO> billDetail(String orderId){
        Assert.notBlank(orderId, "安装工单编号不能为空");
        return new BaseResponse(wxOrderService.getBillDetail(orderId));
    }

    @ApiOperation("安装订单发票申请")
    @PostMapping("/billInvoiceApply")
    public BaseResponse billInvoiceApply(WxInvoiceVO wxInvoiceVO) throws Exception{
        invoiceService.applyInvoice(wxInvoiceVO);

        return new BaseResponse();
    }

    @ApiOperation("安装订单发票详情")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "billId", value = "工单账单编号", dataType = "String", paramType = "query", required = true),
    })
    @GetMapping("/billInvoiceDetail")
    public BaseResponse<WxInvoiceVO> billInvoiceDetail(String billId) throws Exception{
        Assert.notBlank(billId, "工单账单编号不能为空");
        InvoiceVo invoice = invoiceService.getInvoiceByBillId(billId);
        return new BaseResponse(invoice);
    }
}