微信支付产品

微信支付流程、Spring Task以及WebSocket_HTTP

微信支付接入流程

微信支付流程、Spring Task以及WebSocket_cron表达式_02

时序图

微信支付流程、Spring Task以及WebSocket_HTTP_03

JSAPl下单

商户系统调用该接口在微信支付服务后台生成预支付交易单

微信支付流程、Spring Task以及WebSocket_微信支付_04

微信小程序调起支付

通过JSAPI下单接口获取到发起支付的必要参数prepay_id,然后使用微信支付提供的小程序方法调起小程序支付

微信支付流程、Spring Task以及WebSocket_cron表达式_05

准备工作

获取微信支付平台证书、商户私钥文件

微信支付流程、Spring Task以及WebSocket_WebSocket_06

获取临时域名

支付成功后微信服务通过该域名回调我们的程序

这里可以使用内网穿透


Spring Task

介绍

Spring Task是Spring框架提供的任务调度工具,可以按照约定的时间自动执行某个代码逻辑。

定位:定时任务框架
作用:定时自动执行某段java代码
应用场景
  • 信用卡每月还款提醒
  • 银行贷款每月还款提醒
  • 火车票售票系统处理未支付订单
  • 入职纪念日为用户发送通知

cron表达式

cron表达式其实就是一个字符串,通过cron表达式可以定义任务触发的时间

构成规则:分为6或7个域,由空格分隔开,每个域代表一个含义

每个域的含义分别为:秒、分钟、小时、日、月、周、年(可选)

例如;

微信支付流程、Spring Task以及WebSocket_微信支付_07

cron在线生成器:https://cron.qqe2.com

使用步骤

导入maven坐标spring-context

启动类添加注解@EnableScheduling开启任务调度

微信支付流程、Spring Task以及WebSocket_HTTP_08

自定义定时任务类及案列

微信支付流程、Spring Task以及WebSocket_HTTP_09

/**
     * 处理超市订单
     */
    @Scheduled(cron = "0 * * * * ? ")//每分钟触发一次
    public void processTimeoutOrder(){
        log.info("定时处理超时订单:{}", LocalDateTime.now());

        LocalDateTime time = LocalDateTime.now().plusMinutes(-15);

        List<Orders> ordersList = orderMapper.getBystatusAndOrderTimeLT(Orders.PENDING_PAYMENT, time);

        if(ordersList!=null && ordersList.size()>0){
            for(Orders orders : ordersList){
                orders.setStatus(Orders.CANCELLED);
                orders.setCancelReason("订单超时,自动取消");
                orders.setCancelTime(LocalDateTime.now());
                orderMapper.update(orders);
            }
        }
    }
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
/**
     * 处理一直处于派送中的订单状态
     */
    @Scheduled(cron = "0 0 1 * * ?")//每天凌晨一点触发一次
    public void processDeliveryOrder(){
        log.info("定时出来处于派送中的订单:{}",LocalDateTime.now());

        LocalDateTime time = LocalDateTime.now().plusMinutes(-60);

        List<Orders> ordersList = orderMapper.getBystatusAndOrderTimeLT(Orders.DELIVERY_IN_PROGRESS, time);

        if(ordersList!=null && ordersList.size()>0){
            for(Orders orders : ordersList){
                orders.setStatus(Orders.COMPLETED);
                orderMapper.update(orders);
            }
        }

    }
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.

WebSocket

WebSocket是基于TCP的一种新的网络协议。它实现了浏览器与服务器全双工通信一浏览器和服务器只需要完成一次握手,两者之间就可以创建持久性的连接,并进行双向数据传输。

HTTP协议和WebSocket协议对比

  • HTTP是短连接
  • WebSocket是长连接
  • HTTP通信是单向的,基于请求响应模式
  • WebSocket支持双向通信
  • HTTP和WebSocket底层都是TCP连接

应用场景

  • 视频弹幕
  • 网页聊天
  • 体育实况更新
  • 股票基金报价实时更新

实现步骤

导入WebSocket的maven坐标

导入WebSocket服务端组件WebSocketServer,用于和客户端通信

导入配置类WebSocketConfiguration,注册WebSocket的服务端组件