jincanyu

支付流程

  • 整个支付流程分为四个步骤:

    1. 获取令牌token

    2. 创建订单

    3. 预支付,获取支付参数对象pay

    4. 发起微信支付

    5. 收尾工作。跳转到订单页面,删除购物车中已购买的商品

  • 请求方式:POST

    整个支付过程中用到的网络请求较多,并且有很多的共性,建议封装到request.js中

  • 整个支付过程都要用try-catch包裹(我没有用)

[温馨提示]:支付流程中的url已失效

获取令牌token

  • 获取令牌token
// 点击支付
async handleOrderPay() {
  // 从缓存中获取token
  const token = wx.getStorageSync(\'token\')
  // 如果token不存在,跳转到授权页面获取token
  if (!token) {
    wx.navigateTo({
      url: \'/pages/auth/auth\',
    })
 }
<!-- 点击按钮获取用户信息 -->
<button type="primary" plain open-type="getUserInfo" bindgetuserinfo="handleGetUserInfo">授权</button>
  • 缓存中不存在token,授权!
// 授权操作
// pages/auth/auth.js
import {request} from \'../../request/index.js\' //网络请求
import regeneratorRuntime from \'../../lib/runtime/runtime\' //使用es7语法
import {login} from \'../../utils/asyncWx.js\' //内部封装了wx.login(),通过该方法获取一个必须参数code

Page({
  // 获取用户信息
  async handleGetUserInfo(e) {
    try {
      // 获取小程序登录成功后的五个必须参数
      const {
        encryptedData,
        rawData,
        iv,
        signature
      } = e.detail
      const {
        code
      } = await login()
      // 将这五个参数存入loginParams自定义对象中
      const loginParams = {
        encryptedData,
        rawData,
        iv,
        signature,
        code
      }
      // 获取token
      const {
        token
      } = await request({
        url: \'/users/wxlogin\',
        // 传入这五个必须参数
        data: loginParams,
        method: \'POST\'
      })
      // 将token存入缓存中,同时跳转到上一个页面
      wx.setStorageSync(\'token\', token)
      wx.navigateBack({
        // delta表示返回的层级,1表示返回上一层,2表示返回上两层
        delta: 1,
      })
    } catch (error) {
      console.log(error)
    }
  }
})

创建订单

  • 获取到5个必须参数
// 创建订单
    // 请求头参数,这个参数会贯穿整个支付过程中的网络请求
    const header = {
      // 授权参数即为token
      Authorization: token
    }
    // 请求体参数
    const order_price = this.data.totalPrice //总价格
    const consignee_addr = this.data.address.all //详细收获地址
    const cart = this.data.cart 
    let goods = [] //订单数组,从购物车中提取出几个所需要的属性组成的数组
    goods = cart.forEach(v => {
      goods_id: v.goods_id
      goods_number: v.num
      goods_price: v.goods_price
    })
	// 将所需要的订单参数存入orderParams
    const orderParams = {
      order_price,
      consignee_addr,
      goods
    }
  • 获取订单编号
    // 获取订单编号
    const {order_number} = await request({
      url: \'/my/orders/create\',
      method: \'POST\',
      // 将之前获得的订单参数传入
      data: orderParams,
      header
    })
    console.log(order_number)
  }

预支付

  • 根据订单编号获取到支付参数对象pay
    const {pay} = await request({
      url: \'/my/orders/req_unifiedorder\',
      method: "POST",
      header,
      // 传入订单编号
      data: {
        order_number
      }
    })
    console.log(\'pay\')

image-20210126233230477

发起微信支付

  • 将支付参数pay传入到requestPayment中即可
	await requestPayment(pay)

收尾工作

  • 跳转到订单页面,同时删除购物车中以购买的商品
await showToast(\'支付成功\')
      // 删除缓存中已经被选中的商品
      let newCart = wx.getStorageSync(\'cart\')
      newCart = newCart.filter(v => !v.checked)
      wx.setStorageSync(\'cart\', newCart)
      // 此时跳转到订单页面
      wx.navigateTo({
        url: \'/pages/order/order\',
      })

分类:

技术点:

相关文章: