zoukankan      html  css  js  c++  java
  • 微信小程序支付功能完整流程

    支付流程

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

      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',
          })
    
  • 相关阅读:
    session的使用
    不可变对象的魅力
    协变和逆变
    LaTeX 学习小结
    KMP 算法的两种实现
    MySQL MVCC
    Java 并发之 Executor 框架
    Java 动态代理的简单使用和理解
    Java 偏向锁、轻量级锁和重量级锁
    事件循环和协程
  • 原文地址:https://www.cnblogs.com/jincanyu/p/14349219.html
Copyright © 2011-2022 走看看