使用 SpringBoot 轻松实现网站微信扫码支付 以及 支付后回调逻辑处理(含代码示例,基于JavaJDK实现)

目录

准备工作

项目部分导入

时序图理解支付流程

支付流程

支付请求

支付完成回调

前端收尾工作


准备工作

使用扫码微信支付需要在微信支付商户平台申请 native支付,如图

 以及基本的商户号等支付基本信息

项目部分导入

将以下项目模块导入,包含 JSAPI支付模块 ,可用于小程序支付。

开源项目为一个展示示例,为一个独立的 SpringBoot 项目,配置相关的信息后可以单独运行。

ps: 由于代码量不多,在测试后可以直接复制有关代码进行导入,便于拓展

 github

GitHub - Durancer/wxpay-based-on-javaSDK: 基于微信支付javaSDK的接口层封装(技术栈:springboot),调用接口直接返回 JSAPI 或 扫码 调起支付所需参数。适用于 微信小程序 等 JSAPI 支付场景。使用简单,封装签名过程,不用理解太多的逻辑,直接使用。


gitee

Wxpay-based-on-javaSDK: 基于微信支付javaSDK的接口层封装(技术栈:springboot),调用接口直接返回 JSAPI 调起支付所需参数。适用于 微信小程序 等 JSAPI 支付场景。使用简单,封装签名过程,不用理解太多的逻辑,直接使用。

项目中还包括 JSAPI 调起的微信支付接口提供使用 (就是小程序内调起微信支付)

时序图理解支付流程

为了能够更好的理解本套方案的支付流程和支付逻辑,我们先写阅读一遍 时序图

支付流程

支付请求

我们需要向服务器发送请求拿到二维码的链接

请求参数封装

        //根据官方文档 必填值封装数据
        Map<String, String> map = new HashMap<>();
        map.put("body", "产品信息");
        // 传入订单号
        String trade = UUID.randomUUID().toString().replaceAll("-", "");
        map.put("out_trade_no", trade);
        map.put("total_fee", "1");
        map.put("spbill_create_ip", ip);
        map.put("notify_url", "回调地址");
        map.put("trade_type", "NATIVE");
        // 创建pay表数据,检测状态
        PayDTO payDTO = new PayDTO();
        payDTO.setOrderId(orderId);
        payDTO.setTrade(trade);
        payService.save(payDTO);

在本项目中是调用 /pay/qrcode  (返回native扫码支付相关参数)

请求成功后将返回  code_url (就是 转化成付款码的链接

能够收到这个信息说明已经请求成功了

  • 此时注意,根据时序图的流程,我们在代码中已经根据生成的 trade 在数据库创建了一条数据用于检测订单是否支付
  •  在前端接收到响应数据之后,使用  qrcode工具 转化成二维码即可进行支付,从前端拿到二维码数据时,即开始轮询刚才在数据库创建的数据状态

支付完成回调

由于扫码支付我们不能直接编写回调函数 (因为无法判断用户何时支付订单) ,因此我们需要通过微信服务器通知来进行一个回调的逻辑处理,同时,微信服务器 也会告知我们订单相关的数据。包括 trade值 (我们将根据此字段来修改数据库的订单状态)

用户付款后,微信服务器会发请求到此接口,回调地址为刚才发送请求的 notify_url


回调接口代码参考

    @RequestMapping("qrcode/success")
    public String qrcodeSuccess(HttpServletRequest request) throws Exception {
        // 获取微信带来的订单信息
        String xml = ConvertUtils.convertToString(request.getInputStream());
        Map<String, String> orderMap = WXPayUtil.xmlToMap(xml);
        System.out.println("orderMap = " + orderMap);
        String out_trade_no = orderMap.get("out_trade_no");

        // 修改和查询支付状态
        QueryWrapper<PayDTO> wrapper = new QueryWrapper<>();
        wrapper.eq("trade", out_trade_no);
        PayDTO payDTO = new PayDTO();
        payDTO.setStatus("success");
        payService.update(payDTO, wrapper);
        PayDTO pay = payService.getOne(wrapper);

        // 修改订单支付状态
        Order order = new Order();
        order.setId(pay.getOrderId());
        order.setStatus("待发货");
        orderService.updateById(order);

        // 响应流程,需要获取请求参数return_code,如果为SUCCESS,则封装请求
        Map<String, String> map = new HashMap<>();
        map.put("return_code", "SUCCESS");
        map.put("return_msg", "OK");
        return WXPayUtil.mapToXml(map);
    }

前端收尾工作

执行完回调接口的内容后,数据库那条订单信息 的 支付状态 已经变为了 已支付。

当前端轮询至订单已支付,结束轮询,发送请求 删除该条支付检测数据,避免造成 垃圾数据残留。最后完成支付。

检测数据库状态的操作有很多,轮询 是其中比较简单的一种,可以根据自己项目的需求在回调方法里执行自己想要的逻辑。

这些操作在开源项目里都做了封装,可以直接 clone 导入项目。

github

GitHub - Durancer/wxpay-based-on-javaSDK: 基于微信支付javaSDK的接口层封装(技术栈:springboot),调用接口直接返回 JSAPI 或 扫码 调起支付所需参数。适用于 微信小程序 等 JSAPI 支付场景。使用简单,封装签名过程,不用理解太多的逻辑,直接使用。


gitee

Wxpay-based-on-javaSDK: 基于微信支付javaSDK的接口层封装(技术栈:springboot),调用接口直接返回 JSAPI 调起支付所需参数。适用于 微信小程序 等 JSAPI 支付场景。使用简单,封装签名过程,不用理解太多的逻辑,直接使用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

durancer

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值