支付业务模块

Posted Panda_Java

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了支付业务模块相关的知识,希望对你有一定的参考价值。

支付业务逻辑

1. 生成订单信息

 @ApiOperation("生成订单信息")
    @RequestMapping(value = "/saveOrder")
    @ResponseBody
    @Transactional
    public ApiResult<Long> saveOrder(@Valid @RequestBody OrderRequest request) 

        PaymentOrder order = new PaymentOrder();
        order.setAccountId(request.getAccountId());
        order.setTeamId(request.getTeamId());
        order.setTotalAmount(request.getTotalAmount());
        order.setPayType(0);
        order.setDescription(request.getDescription());
        order.setOrderType(request.getOrderType());
        order.setCompany(request.getCompany());
        order.setRemarks(request.getRemarks());
        order.setPayStatus(PaymentStatusEnum.NOT_PAID.getType());
        order.setCreateTime(LocalDateTime.now());

        Long id = paymentOrderService.saveOrder(order);

        List<OrderProductRequest> orderProductRequestList = request.getOrderProductList();
        if (orderProductRequestList == null) 
            throw new PaymentException(ResponseContants.NOT_EXISTS, ResponseContants.NOT_EXIST_MSG);
        

        Boolean b = paymentOrderService.checkMoney(orderProductRequestList, request.getTotalAmount());

        List<PaymentOrderProduct> orderProductList = new ArrayList<>();
        for (OrderProductRequest orderProductRequest : orderProductRequestList) 
            PaymentOrderProduct orderProduct = new PaymentOrderProduct();
            BeanUtil.copyProperties(orderProductRequest, orderProduct);
            orderProduct.setOrderId(id);
            orderProductList.add(orderProduct);
        
        paymentOrderProductService.saveOrderProductList(orderProductList);

        //获得支付方式
//        Integer payType = request.getPayType();
//        switch (payType) 
//            case 1:
//                //微信
//
//                break;
//            case 2:
//                //支付宝
//                String s = paymentOrderService.aliPayPage(id);
//                System.out.println(s);
//                break;
//        
       return ApiResult.success(id);
    

2. 通过订单id获取订单

   @ApiOperation("通过订单id获取订单信息")
    @RequestMapping(value = "/getOrderById")
    @ResponseBody
    public ApiResult<OrderVo> getOrderById(@RequestBody @Valid OrderByIdQuery query) 
        PaymentOrder order = paymentOrderService.getOrderById(query.getId());
        if (order == null) 
            return ApiResult.resultIsEmpty();
        
        OrderVo vo = new OrderVo();
        BeanUtil.copyProperties(order, vo);
        List<PaymentOrderProduct> orderProductList = paymentOrderProductService.getOrderProductList(query.getId());
        List<OrderProductVo> orderProductVoList = new ArrayList<>();
        for (PaymentOrderProduct orderProduct : orderProductList) 
            OrderProductVo orderProductVo = new OrderProductVo();
            BeanUtil.copyProperties(orderProduct, orderProductVo);

            //具体的商品类
            Object obj = paymentOrderProductService.getProductObject(orderProductVo.getProductType(), orderProductVo.getProductId());
            orderProductVo.setProductObject(obj);

            orderProductVoList.add(orderProductVo);
        
        vo.setOrderProductList(orderProductVoList);
        return ApiResult.success(vo);
    

3. 通过账户id获取订单列表

    @ApiOperation("通过账户id获取订单列表")
    @RequestMapping(value = "/getOrderListByAccountId")
    @ResponseBody
    public ApiResult<List<OrderVo>> getOrderListByAccountId(@RequestBody @Valid OrderByAccountIdQuery query) 
        List<PaymentOrder> orderList = paymentOrderService.getOrderListByAccountId(query.getAccountId());
        if (orderList == null) 
            return ApiResult.resultIsEmpty();
        
        List<OrderVo> orderVoList = new ArrayList<>();
        for (PaymentOrder order : orderList) 
            OrderVo vo = new OrderVo();
            BeanUtil.copyProperties(order, vo);
            List<PaymentOrderProduct> orderProductList = paymentOrderProductService.getOrderProductList(order.getId());
            List<OrderProductVo> orderProductVoList = new ArrayList<>();
            for (PaymentOrderProduct orderProduct : orderProductList) 
                OrderProductVo orderProductVo = new OrderProductVo();
                BeanUtil.copyProperties(orderProduct, orderProductVo);

                //具体的商品类
                Object obj = paymentOrderProductService.getProductObject(orderProductVo.getProductType(), orderProductVo.getProductId());
                orderProductVo.setProductObject(obj);

                orderProductVoList.add(orderProductVo);
            
            vo.setOrderProductList(orderProductVoList);
            orderVoList.add(vo);
        
        return ApiResult.success(orderVoList);
    

4. 取消订单

   @RequestMapping(value = "/cancelOrder")
    @ResponseBody
    public ApiResult<Boolean> cancelOrder(@RequestBody @Valid OrderByIdRequest request) 
        Boolean status = paymentOrderService.cancelOrder(request.getId());
        System.out.println(status);
        return ApiResult.success(status);
    

5. 查询订单支付状态

 @RequestMapping(value = "/getPaymentStatus")
    @ResponseBody
    public ApiResult<PaymentStatusVo> getPaymentStatus(@RequestBody @Valid OrderByIdQuery query) 
        PaymentOrder order = paymentOrderService.getOrderById(query.getId());
        PaymentStatusVo vo = new PaymentStatusVo();
        vo.setOrderId(order.getId());
        vo.setPayStatus(order.getPayStatus());
        vo.setPayType(order.getPayType());
        vo.setRemarks(order.getRemarks());
        //PaymentStatusVo paymentStatusVo = paymentOrderService.getPaymentStatus(query.getId());
        return ApiResult.success(vo);
    

6. 提供调用的查询订单结果类

@RequestMapping(value = "/getPaymentResult")
    @ResponseBody
    public ApiResult<List<PaymentResultVo>> getPaymentResult(@RequestBody @Valid PaymentResultQuery query) 
        List<PaymentResult> paymentResultList = paymentOrderService.getPaymentResult(query.getAccountId(), query.getProductType(), query.getProductId(), query.getTeamId(), query.getSecondaryId());
        List<PaymentResultVo> paymentResultVoList = new ArrayList<>();
        for (PaymentResult paymentResult : paymentResultList) 
            PaymentResultVo vo = new PaymentResultVo();
            BeanUtil.copyProperties(paymentResult, vo);
            paymentResultVoList.add(vo);
        

        return ApiResult.success(paymentResultVoList);
    
@RequestMapping(value = "/usePaymentResult")
    @ResponseBody
    public ApiResult<Boolean> usePaymentResult(@RequestBody @Valid PaymentResultRequest request) 
        Boolean b = paymentOrderService.usePaymentResult(request.getId(), request.getNum());
        return ApiResult.success(b);
    

7. 申请退款

@RequestMapping(value = "/refundOrder")
    @ResponseBody
    public ApiResult<Boolean> refundOrder(@RequestBody @Valid OrderByIdRequest request) throws Exception 
        //更改订单状态,返回支付方式
        RefundDto refundDto = paymentOrderService.refundOrder(request.getId());

        //查看是否符合退款条件,可以提供可退款的金额
        //TODO

        //退款操作
        //TODO
        Integer payType = refundDto.getPayType();
        Boolean back = null;
        //微信
        if (PaymentTypeEnum.WEPAY.getType() == payType) 
            back = paymentOrderService.refundMoneyWePay(refundDto);
        
        //支付宝
        if (PaymentTypeEnum.ALIPAY.getType() == payType) 
            back = paymentOrderService.refundMoneyAli(refundDto);
        
        return ApiResult.success(back);
    

8. 支付宝支付 输出支付宝支付页面

    @RequestMapping(value = "/aliPay")
    @ResponseBody
    public ApiResult<String> aliPay(@RequestBody @Valid OrderByIdQuery query) 
        //是一个支付的form表单
        String payPage = paymentOrderService.aliPayPage(query.getId());
        System.out.println(payPage);
        return ApiResult.success(payPage);
    

9. 支付宝支付 回调

 @RequestMapping(value = "/aliPayNotify")
    public void aliPayNotify(HttpServletRequest request, HttpServletResponse response) 

        System.out.println("begin aliPay notify---");

        //将异步通知中收到的所有参数都存放到params中
        Map<String, String> params = new HashMap<>();
        Map<String, String[]> requestParams = request.getParameterMap();
        for (Iterator<String> iter = requestParams.keySet().iterator(); iter.hasNext(); ) 
            String name = iter.next();
            String[] values = requestParams.get(name);
            String valueStr = "";
            for (int i = 0; i < values.length; i++) 
                valueStr = (i == values.length - 1) ? valueStr + values[i]
                        : valueStr + values[i] + ",";
            
            params.put(name, valueStr);
        
        //调用SDK验证签名
        boolean signVerified = false;
        try 
            signVerified = AlipaySignature.rsaCheckV1(params, alipayPublicKey, charset, signType);

            // 返回结果集
            Map<String, String> outMap = new TreeMap<String, String>();

            if (signVerified) 
                // TODO 验签成功后,按照支付结果异步通知中的描述,对支付结果中的业务内容进行二次校验,校验成功后在response中返回success并继续商户自身业务处理,校验失败返回failure

                //商户订单号
                String outTradeNo = request.getParameter("out_trade_no");

                //支付宝交易号
                String trade_no = request.getParameter("trade_no");

                //交易状态
                String trade_status = request.getParameter("trade_status");

                String trade_success = "TRADE_SUCCESS";

                if (trade_success.equals(trade_status)) 

                    paymentOrderService.handlePayNotify(Long.valueOf(outTradeNo), PaymentTypeEnum.ALIPAY);

                    outMap.put("return_code", "SUCCESS");
                    outMap.put("return_msg", "OK");
                    //当商户收到服务器异步通知并打印出 success 时,服务器异步通知参数 notify_id 才会失效
                    response.getWriter().print("success");
                    System.out.println("success");
                    log.info("支付宝支付成功!out_trade_no:" + outTradeNo + ", trade_status:" + trade_status);
                 else 
                    outMap.put("trade_status", trade_status);
                    log.error("支付宝支付通信失败!" + trade_status);
                

             else 
                // TODO 验签失败则记录异常日志,并在response中返回failure.
                outMap.put("return_code", "FAILURE");
                outMap.put("return_msg", "验签失败");
                log.error("验签失败");
            

            String respMessage = null;

            respMessage = XMLUtil.mapToXml(outMap);
            PrintWriter out = response.getWriter();
            out.print(respMessage);
            out.flush();
            out.close();
         catch (Exception e) 
            e.printStackTrace();
        

    

10. 微信支付 输出二维码图片

 @RequestMapping(value = "/wePayQR")
    @ResponseBody
    public ApiResult<Boolean> wePayQR(@RequestBody @Valid OrderByIdQuery query, HttpServletResponse response) throws IOException 
        String codeUrl = paymentOrderService.wePayUrl(query.getId());

        response.setContentType("image/jpeg;charset=UTF-8");
        response.setHeader("Pragma", "No-cache");
        response.setHeader("Cache-Control", "no-cache");
        response.setDateHeader("Expires", 0);
        try 
            String size = "300";
            int qrCodeSize = QRCodeUtil.QRCODE_SIZE;
            if (Validator.isNotNull(size)) 
                qrCodeSize = Integer.parseInt(size);
            
            OutputStream out = response.getOutputStream();
            BufferedImage bi = QRCodeUtil.createImage(codeUrl, qrCodeSize);
            ImageIO.write(bi, "JPEG", out);
            out.flush();
            out.close();
         catch (IOException | WriterException e) 
            e.printStackTrace();
            log.error("error:::", e);
        
        return ApiResult.success(true);
    
  @RequestMapping(value = "/wePayCodeUrl")
    @ResponseBody

以上是关于支付业务模块的主要内容,如果未能解决你的问题,请参考以下文章

app微信支付宝支付后台的插件模式+回调通过spring广播处理后续业务(已亲测可用)

存储付款详情和订阅详情

支付业务的优化(命令模式的应用)

支付模式优化

如何构建自己的支付系统

如何构建自己的支付系统