uni-app黑马优购项目学习记录(十)(下篇)

207 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第2天,点击查看活动详情

10.5 微信支付

10.5.1 在请求头中添加 Token 身份认证的字段

  1. 原因说明:只有在登录之后才允许调用支付相关的接口,所以必须为有权限的接口添加身份认证的请求头字段

  2. 打开项目根目录下的 main.js,改造 $http.beforeRequest 请求拦截器中的代码如下:

    // 请求开始之前做一些事情
    $http.beforeRequest = function(options) {
      uni.showLoading({
        title: '数据加载中...',
      })
    
      // 判断请求的是否为有权限的 API 接口
      if (options.url.indexOf('/my/') !== -1) {
        // 为请求头添加身份认证字段
        options.header = {
          // 字段的值可以直接从 vuex 中进行获取
          Authorization: store.state.m_user.token,
        }
      }
    }
    

10.5.2 微信支付的流程

  1. 创建订单

    -- 请求创建订单的 API 接口:把(订单金额、收货地址、订单中包含的商品信息)发送到服务器

    -- 服务器响应的结果:订单编号

  2. 订单预支付

    -- 请求订单预支付的 API 接口:把(订单编号)发送到服务器

    -- 服务器响应的结果:订单预支付的参数对象,里面包含了订单支付相关的必要参数

  3. 发起微信支付

    -- 调用 uni.requestPayment() 这个 API,发起微信支付;把步骤 2 得到的 “订单预支付对象” 作为参数传递给 uni.requestPayment() 方法

    -- 监听 uni.requestPayment() 这个 API 的 successfailcomplete 回调函数

10.5.3 创建订单

  1. 改造 my-settle 组件中的 settlement 方法,当前三个判断条件通过之后,调用实现微信支付的方法:

    // 点击了结算按钮
    settlement() {
      // 1. 先判断是否勾选了要结算的商品
      if (!this.checkedCount) return uni.$showMsg('请选择要结算的商品!')
    
      // 2. 再判断用户是否选择了收货地址
      if (!this.addstr) return uni.$showMsg('请选择收货地址!')
    
      // 3. 最后判断用户是否登录了
      // if (!this.token) return uni.$showMsg('请先登录!')
      if (!this.token) return this.delayNavigate()
    
      // 4. 实现微信支付功能
      this.payOrder()
    },
    
  2. my-settle 组件中定义 payOrder 方法如下,先实现创建订单的功能:

    // 微信支付
    async payOrder() {
      // 1. 创建订单
      // 1.1 组织订单的信息对象
      const orderInfo = {
        // 开发期间,注释掉真实的订单价格,
        // order_price: this.checkedGoodsAmount,
        // 写死订单总价为 1 分钱
        order_price: 0.01,
        consignee_addr: this.addstr,
        goods: this.cart.filter(x => x.goods_state).map(x => ({ goods_id: x.goods_id, goods_number: x.goods_count, goods_price: x.goods_price }))
      }
      // 1.2 发起请求创建订单
      const { data: res } = await uni.$http.post('/api/public/v1/my/orders/create', orderInfo)
      if (res.meta.status !== 200) return uni.$showMsg('创建订单失败!')
      // 1.3 得到服务器响应的“订单编号”
      const orderNumber = res.message.order_number
    
       // 2. 订单预支付
    
       // 3. 发起微信支付
     }
    

10.5.4 订单预支付

  1. 改造 my-settle 组件的 payOrder 方法,实现订单预支付功能:

    // 微信支付
    async payOrder() {
      // 1. 创建订单
      // 1.1 组织订单的信息对象
      const orderInfo = {
        // 开发期间,注释掉真实的订单价格,
        // order_price: this.checkedGoodsAmount,
        // 写死订单总价为 1 分钱
        order_price: 0.01,
        consignee_addr: this.addstr,
        goods: this.cart.filter(x => x.goods_state).map(x => ({ goods_id: x.goods_id, goods_number: x.goods_count, goods_price: x.goods_price }))
      }
      // 1.2 发起请求创建订单
      const { data: res } = await uni.$http.post('/api/public/v1/my/orders/create', orderInfo)
      if (res.meta.status !== 200) return uni.$showMsg('创建订单失败!')
      // 1.3 得到服务器响应的“订单编号”
      const orderNumber = res.message.order_number
    
      // 2. 订单预支付
      // 2.1 发起请求获取订单的支付信息
      const { data: res2 } = await uni.$http.post('/api/public/v1/my/orders/req_unifiedorder', { order_number: orderNumber })
      // 2.2 预付订单生成失败
      if (res2.meta.status !== 200) return uni.$showError('预付订单生成失败!')
      // 2.3 得到订单支付相关的必要参数
      const payInfo = res2.message.pay
    
       // 3. 发起微信支付
     }
    

10.5.5 发起微信支付

  1. 改造 my-settle 组件的 payOrder 方法,实现微信支付的功能:

    // 微信支付
    async payOrder() {
      // 1. 创建订单
      // 1.1 组织订单的信息对象
      const orderInfo = {
        // 开发期间,注释掉真实的订单价格,
        // order_price: this.checkedGoodsAmount,
        // 写死订单总价为 1 分钱
        order_price: 0.01,
        consignee_addr: this.addstr,
        goods: this.cart.filter(x => x.goods_state).map(x => ({ goods_id: x.goods_id, goods_number: x.goods_count, goods_price: x.goods_price }))
      }
      // 1.2 发起请求创建订单
      const { data: res } = await uni.$http.post('/api/public/v1/my/orders/create', orderInfo)
      if (res.meta.status !== 200) return uni.$showMsg('创建订单失败!')
      // 1.3 得到服务器响应的“订单编号”
      const orderNumber = res.message.order_number
    
       // 2. 订单预支付
       // 2.1 发起请求获取订单的支付信息
       const { data: res2 } = await uni.$http.post('/api/public/v1/my/orders/req_unifiedorder', { order_number: orderNumber })
       // 2.2 预付订单生成失败
       if (res2.meta.status !== 200) return uni.$showError('预付订单生成失败!')
       // 2.3 得到订单支付相关的必要参数
       const payInfo = res2.message.pay
    
       // 3. 发起微信支付
       // 3.1 调用 uni.requestPayment() 发起微信支付
       const [err, succ] = await uni.requestPayment(payInfo)
       // 3.2 未完成支付
       if (err) return uni.$showMsg('订单未支付!')
       // 3.3 完成了支付,进一步查询支付的结果
       const { data: res3 } = await uni.$http.post('/api/public/v1/my/orders/chkOrder', { order_number: orderNumber })
       // 3.4 检测到订单未支付
       if (res3.meta.status !== 200) return uni.$showMsg('订单未支付!')
       // 3.5 检测到订单支付完成
       uni.showToast({
         title: '支付完成!',
         icon: 'success'
       })
     }
    

10.6 分支的合并与提交

  1. settle 分支进行本地提交:

    git add .
    git commit -m "完成了登录和支付功能的开发"
    
  2. 将本地的 settle 分支推送到码云:

    git push -u origin settle
    
  3. 将本地 settle 分支中的代码合并到 master 分支:

    git checkout master
    git merge settle
    git push
    
  4. 删除本地的 settle 分支:

    git branch -d settle