微信小程序支付流程

Posted 郭郭郭牧鑫

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了微信小程序支付流程相关的知识,希望对你有一定的参考价值。

 

微信小程序支付功能的简单介绍

关于微信小程序的支付功能来讲,我们遇见这个大部分都是在购物是会接触到的功能之一,也算微信小程序功能中的一个小难点,也很常见,我们今天来了解一下

我们来用购物车举例子,在结算中会牵扯到我们的支付功能,那么我们今天来说一下

首先我们应该有一个这样的布局,流程大致就是当我们点击结算的时候,我们应该用一些判断,满足那些判断后,我们才可进入支付的界面,那么我们就先来看看要满足那些条件

1.我们点击结算时应该有用户的地址

2.我们应该够物品被选中

当我们的这两个条件满足时,我们就可以进入支付的页面了

那么我们就先来进行条件的判断

//结算按钮的点击事件
reckon(){
    //我们进行判断有没有获取到地址
    const address=wx.getStorageSync('address')

    if(!address){
        wx.showToast({
             title: '没有选择收货地址',
             icon: 'success',
             duration: 1000
        })
        return
    }
    
    var that = this;
    let carts = that.data.cart;

    let cart= [];

    var qqq = 0

    for (var i = 0; i < carts.length; i++) {
      if (carts[i].checked) {
        cart[qqq] = carts[i];
        qqq++;
      }
    }

    if (cart.length <= 0) {
      wx.showToast({
        title: '未选择商品',
        icon: 'success',
        duration: 1000
      })
      return;
    }
    wx.setStorageSync('cart', cart);//存入缓存的数据
    //当条件都满足时,我们进行跳转
    wx.navigateTo({
      url: '/pages/pay/index'
    });
}

当我们的判断通过时,我们就可以跳转到支付的页面了

进入到支付页面大致是这个效果,在支付页面,我们进行的判断就是用户的token,当然结算的时候我们也可以请求进行判断,然后就是支付的订单,订单编号,和支付口等

为了更好的书写,我们封装两个函数

//封装一个showToast
export const showToast=({title})=>{
  return new Promise((resolve,reject)=>{
    wx.showToast({
      title: title,
      icon: 'none',
      success :(res) =>{
        resolve(res);
      },
      fail:(err)=>{
        reject(err);
      }
    })
  })
}

微信接口请求封装


  //promise 形式的 小程序的微信支付
  //@param {object} pay 支付所必要的参数
 
export const requestPayment=(pay)=>{
  return new Promise((resolve,reject)=>{
   wx.requestPayment({
      ...pay,
     success: (result) => {
      resolve(result)
     },
     fail: (err) => {
       reject(err);
     }
   });
  })
}

 

这个是我们封装的request

// 同时发送异步代码的次数
let ajaxTimes=0;
export const request=(params)=>{
  let header={...params.header};
  if(params.url.includes("/my/")){
    // header+token拼接
    header["Authorization"]=wx.getStorageSync("token");
  }

  ajaxTimes++;
  // 加载中效果
  wx.showLoading({
    title: "加载中",
    mask: true
  });
    
  // 定义公共的url
  const baseUrl="https://api-hmugo-web.itheima.net/api/public/v1";
  
  //加载效果
  return new Promise((resolve,reject)=>{
    wx.request({
     ...params,
     header:header,
     url:baseUrl+params.url,
     success:(result)=>{
       resolve(result.data.message);
     },
     fail:(err)=>{
       reject(err);
     },
     complete:()=>{
      ajaxTimes--;
      if(ajaxTimes===0){
        //  关闭正在等待的图标
        wx.hideLoading();
      }
     }
    });
  })
}

 支付按钮的代码

import {showToast,requestPayment} from "../../utils/asyncWx.js";
import { request } from "../../request/index.js";
Page({
/**
   * 页面的初始数据
   */
  data: {
      jscart:{},
      totalPrice:0,
      totalNum: 0,
      address:{}
  },

  /**
   * 生命周期函数--监听页面加载
   */
  onLoad: function (options) {
   let jscart=wx.getStorageSync('jscart')||[]
   let address=wx.getStorageSync('address')||[]
   this.setData({
    jscart:jscart,
    address:address
   })
  },

  /**
   * 生命周期函数--监听页面显示
   */
  onShow: function () {
    let jscart=wx.getStorageSync('jscart')||[]
    let totalPrice = 0;
    let totalNum = 0;
    for (let i = 0; i < jscart.length; i++) {     
      if (jscart[i].checked) {                
        totalPrice += jscart[i].num * jscart[i].goods_price;   
        totalNum += jscart[i].num;
      }
    }
    this.setData({
      jscart:jscart,
      totalPrice:totalPrice,
      totalNum:totalNum
    });
    console.log(totalPrice);
  },
   handleOrderPay(){
    try {

      // 判断缓存中有没有token 
      const token = wx.getStorageSync("token");
      if (!token) {
        wx.navigateTo({
          url: '/pages/auth/index'
        });
        return;
      }
      // 创建订单
      const order_price = this.data.totalPrice;
      const consignee_addr = this.data.address.all;
      const cart = this.data.jscart;
      let goods = [];
      if(!cart){
        return;
      }
      cart.forEach(v => goods.push({
        goods_id: v.goods_id,
        goods_number: v.num,
        goods_price: v.goods_price
      }))
      const orderParams = { order_price, consignee_addr, goods };


      //创建订单获取订单编号
      const { order_number } = request({ url: "/my/orders/create", method: "POST", data: orderParams });
      // 发起预支付接口
      const { pay } = request({ url: "/my/orders/req_unifiedorder", method: "POST", data: { order_number } });

      // 发起微信支付 
       requestPayment(pay);

      // 查询订单状态
      const res = request({ url: "/my/orders/chkOrder", method: "POST", data: { order_number } });
       showToast({ title: "支付成功" });


      // 删除缓存中已经支付了的商品
      let newCart=wx.getStorageSync("jscart");
      newCart=newCart.filter(v=>!v.checked);
      wx.setStorageSync("cart", newCart);
  
      //跳转到订单页面
      wx.navigateTo({
        url: '/pages/order/index'
      });
        
    } 
      //支付失败
      catch (error) {
       showToast({ title: "支付失败" })
      console.log(error);
    }
  },
})

 

 

以上是关于微信小程序支付流程的主要内容,如果未能解决你的问题,请参考以下文章

PHP实现微信小程序支付

微信小程序发起支付流程

微信小程序支付流程

微信小程序支付完整流程(前端)

微信小程序实现支付功能

微信小程序怎么开通支付功能?