Spring Boot中的微信支付(小程序)

前言

一、申请流程和步骤

图1-1
    搭建SpringBoot工程编写后台支付接口 发布部署接口服务项目 支付接口的封装 配置jwt或者openid的token派发

二、注册商家

2.1商户平台

图2-1

2.2商户id


三、API私钥(支付密钥)

图3-1

如图4-1所示:

图4-1

五、配置回调地址


六、小程序获取APPID

图6-1

注册成功后即可获得小程序唯一的APPID。如图6-2所示:

图6-2
图7-1

八、实战部分


8.1SpringBoot框架搭建

8.2微信支付相关接口

8.2.1小程序用户登录接口

具体的登录流程如图8-1所示:

图8-1

此时调用服务端接口,请求参数如图8-2所示:

图8-2

用户登录后的返回参数,如图8-3所示:

图8-3
8.2.2统一下单接口

用户登录小程序后,在小程序页面拉起支付请求时,会调用统一的下单接口。

在拉起支付请求时,下单接口参数需要两部分:一是商户、小程序相关的openid,appid等,二是需要商品相关的价格,名称,数量等参数。

统一下单接口
8.2.3创建订单接口
创建订单接口

用户可以在商品页面对某个商品进行下单,此时需要创建该用户购买某个商品的订单。

该过程主要是通过接口去请求用户信息、商品信息等参数,经过逻辑判断(是否存在已购买的订单)后创建(数据库插入相关信息)新的订单,最后返回该订单的所需数据。

8.2.4取消订单接口
取消订单接口

该接口可以通过订单id来作为请求参数,首先判断数据库中是否存在该订单信息,接着对可以取消支付的订单类型进行限制,最后更新数据库表(订单、商品和声明周期)状态。

@ApiOperation(value = "取消订单")
@RequestMapping(value = "/cancel/{orderId}",method = RequestMethod.PUT)
    public AjaxResult cancel(@PathVariable Long orderId){
          
   
        //判断订单是否存在
        SysOrders sysOrders = sysOrdersService.getById(orderId);
        if(sysOrders==null){
          
   
            return AjaxResult.error("订单不存在");
        }
        //只有未支付的订单能取消
        if(!CommonConstants.NO.equals(sysOrders.getIsPay())){
          
   
            return AjaxResult.error(MyReturnCode.ERR_70001.getCode(), MyReturnCode.ERR_70001.getMsg());
        }
        sysOrdersService.orderCancel(sysOrders);
        return AjaxResult.success();
    }
8.2.5订单详情接口
订单详情接口

当订单生成后,用户可以在页面查看该商品订单的详情。

该接口通过订单id即可从数据库获取详情信息,而该页面展示的数据由业务需求确定。

@ApiOperation(value = "订单详情")
@RequestMapping(value = "/myOrderDetail/{orderId}",method = RequestMethod.GET)
@ApiImplicitParams({@ApiImplicitParam(name = "orderId", value = "订单Id")})
     public AjaxResult myOrderDetail(@PathVariable Long orderId){
     //从数据库获取详情参数
     SysOrderDetailResponse detailResponse = sysOrdersService.getDetail(orderId);
     return AjaxResult.success(detailResponse);
     }
订单详情逻辑
/**
     * 订单详情页面参数处理
     * @param orderId
     * @return sysOrderDetailResponse
     */
    @Override
    public SysOrderDetailResponse getDetail(Long orderId) {
          
   
        SysOrderDetailResponse sysOrderDetailResponse =  orderMapper.getDetail(orderId);
        //对页面的手机号做处理
        String phoneNum = sysOrderDetailResponse.getMobile();
        sysOrderDetailResponse.setMobile(phoneNum.substring(0,3) + "****" +       phoneNum.substring(7,phoneNum.length()));
        //根据订单状态不同,显示不同的数据
        //计算剩余待支付时间并展示
        return sysOrderDetailResponse;
    }
8.2.6支付回调接口
支付回调接口

其中,notifyOrder方法的作用是在支付成功后在数据库更新订单的状态。

notifyOrder(SysOrders sysOrders)方法
@Override
    @Transactional(rollbackFor = Exception.class)
    public void notifyOrder(SysOrders sysOrders) {
          
   
       //只有未支付订单能操作,即is_pay字段为0的订单
       if(CommonConstants.NO.equals(sysOrders.getIsPay())) {
          
   
       //更新订单支付状态
       sysOrders.setIsPay(CommonConstants.YES);
       sysOrders.setStatus(OrderInfoEnum.STATUS_1.getValue());
       sysOrdersMapper.updateById(sysOrders);
       //更新商品表状态
       //更新订单生命周期表
       }
    }
经验分享 程序员 微信小程序 职场和发展