SpringBoot项目中引入支付功能要怎么做呢?(四)

开课吧开课吧锤锤2021-04-07 11:18

    Java编程语言是一种简单、面向对象、分布式、解释型、健壮安全、与系统无关、可移植、高性能、多线程和动态的语言。如今Java已经广泛应用于各个领域的编程开发。

    5.2验证订单是否被支付

    一样的逻辑,从Demo中找到验证订单的代码,放入TradeServiceImpl中

    @Override
    public String alipayTradeQuery(String orderSn){
        //返回信息
        String responseResult="";
        // (必填) 商户订单号,通过此商户订单号查询当面付的交易状态
        String outTradeNo = orderSn;
        // 创建查询请求builder,设置请求参数
        AlipayTradeQueryRequestBuilder builder = new AlipayTradeQueryRequestBuilder()
                .setOutTradeNo(outTradeNo);

        AlipayF2FQueryResult result = tradeService.queryTradeResult(builder);
        switch (result.getTradeStatus()) {
            case SUCCESS:
                responseResult="查询返回该订单支付成功";
                log.info("查询返回该订单支付成功: )");

                AlipayTradeQueryResponse response = result.getResponse();
                dumpResponse(response);

                log.info(response.getTradeStatus());
                if (Utils.isListNotEmpty(response.getFundBillList())) {
                    for (TradeFundBill bill : response.getFundBillList()) {
                        log.info(bill.getFundChannel() + ":" + bill.getAmount());
                    }
                }
                break;

            case FAILED:
                responseResult="查询返回该订单支付失败或被关闭";
                log.error("查询返回该订单支付失败或被关闭!!!");
                break;

            case UNKNOWN:
                responseResult="系统异常,订单支付状态未知";
                log.error("系统异常,订单支付状态未知!!!");
                break;

            default:
                responseResult="不支持的交易状态,交易返回异常";
                log.error("不支持的交易状态,交易返回异常!!!");
                break;
        }

        return responseResult;
    }

    在Controller中加一个接口

    //查询订单情况
    @PostMapping("/queryOrderStatus")
    public CommonResult queryOrderStatus(@RequestParam("orderSn") String orderSn){
        String result = tradeService.alipayTradeQuery(orderSn);
        if (StringUtils.isEmpty(result)){
            return CommonResult.fail();
        }else {
            return CommonResult.success(result);
        }
    }

    5.3设置一个回调的接口

    可以通过5.2中的方法定时轮询订单是否被支付,也可以写一个回调接口给支付宝调用,但是这个接口必须确保能被支付宝外网访问到,这里我给出代码示例:

    @PostMapping("payCallback")
    public void payCallback(){
        Map<String,String> map=new HashMap<>();
        Enumeration<String> parameterNames = getRequest().getParameterNames();
        while (parameterNames.hasMoreElements()){
            String parameter = parameterNames.nextElement();
            if (!parameter.toLowerCase().equals("sign_type")){
                map.put(parameter,getRequest().getParameter(parameter));
            }
        }
        try {
            boolean result = AlipaySignature.rsaCertCheckV2(map, Configs.getPublicKey(), "utf-8", Configs.getSignType());
            PrintWriter writer = getResponse().getWriter();
            if (result){
                writer.print("success");
            }else {
                writer.print("unSuccess");
            }
        } catch (AlipayApiException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    然后在生成二维码的代码中增加回调接口

Java

    六)总结

    到这里,当面付的功能我们就开发好了,说简单也不简单,各种步骤都比较繁琐,但是只要把整体逻辑理清楚了,后续其他支付功能的开发就会很简单了。

    以上内容由开课吧老师Java鱼仔提供,更多Java教程尽在开课吧广场Java教程频道。

有用
分享