支付流程

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

    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')

发起微信支付

  • 将支付参数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',
})

微信小程序支付功能完整流程的更多相关文章

  1. 微信小程序支付功能前端流程

    只是分享一下小程序支付功能的前端流程和代码, 仅供参考(使用的是uni app). handleCreate () { /** 第一步:前台将商品数据发送到后台,后台创建订单入库并返回订单id等信息 ...

  2. 微信小程序支付功能 C# .NET开发

    微信小程序支付功能的开发的时候坑比较多,不过对于钱的事谨慎也是好事.网上关于小程序支付的实例很多,但是大多多少有些问题,C#开发的更少.此篇文档的目的是讲开发过程中遇到的问题做一个备注,也方便其他开发 ...

  3. 微信小程序支付及退款流程详解

    微信小程序的支付和退款流程 近期在做微信小程序时,涉及到了小程序的支付和退款流程,所以也大概的将这方面的东西看了一个遍,就在这篇博客里总结一下. 首先说明一下,微信小程序支付的主要逻辑集中在后端,前端 ...

  4. 实战:微信小程序支付开发具体流程

    来源:授权地址作者:会编码的熊 该文章纪录了我在开发小程序支付过程中的具体流程 1. 申请微信支付 小程序认证后进入微信支付申请小程序的微信支付 填写企业信息对公账户并上传凭证后,微信支付会打一笔随机 ...

  5. Python实现微信小程序支付功能

    由于最近自己在做小程序的支付,就在这里简单介绍一下讲一下用python做小程序支付这个流程.当然在进行开发之前还是建议读一下具体的流程,清楚支付的过程. 1.支付交互流程 当然具体的参数配置可以参考官 ...

  6. 微信小程序支付功能讲解(1)

    前言:虽然小程序做过很多,但是一直觉得微信支付功能很是神秘,现在终于有机会接触心里还是有点小激动的,经过一番折腾发现支付也不过如此,在此记录下支付功能的实现过程 小程序的官方文档介绍到发起微信支付即调 ...

  7. 微信小程序支付功能讲解(2)

    小程序支付 业务流程时序图 官方文档 步骤: 1. Openid 在小程序初次加载的时候就已经获取(详情见 小程序登录) 2. 生成商户订单 1.商品信息由小程序端提供 2.提供支付统一下单接口所需参 ...

  8. 微信小程序支付功能讲解

    前言:虽然小程序做过很多,但是一直觉得微信支付功能很是神秘,现在终于有机会接触心里还是有点小激动的,经过一番折腾发现支付也不过如此,在此记录下支付功能的实现过程 小程序的官方文档介绍到发起微信支付即调 ...

  9. 微信小程序 支付功能(前端)的实现

    只提供微信小程序端代码: var app = getApp(); Page({ data: {}, onLoad: function (options) { // 页面初始化 options为页面跳转 ...

随机推荐

  1. MD摘要算法

    import static org.junit.Assert.*; import java.security.MessageDigest; //消息摘要 public class MDCoder { ...

  2. 输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。

    题目描述 输入一个字符串,按字典序打印出该字符串中字符的所有排列.例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba. 输入描述: 输 ...

  3. P1060_开心的金明(JAVA语言)

    思路 0/1背包问题 模板 //暴力出奇迹 题目描述 金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间他自己专用的很宽敞的房间.更让他高兴的是,妈妈昨天对他说:"你的房间需要购买哪些 ...

  4. Web 前端 - 浅谈外部手动控制 Promise 状态

    前言 当有多个共享资源.协同操作的时候,往往需要根据动态亦或是复杂的条件以控制和调用程序逻辑. 还是那句话,懂的人自然懂,不懂的人也搜不到这个随笔. 设计 PendingPromise<T> ...

  5. LibTorch实战六:C++版本YOLOV5.4的部署

    一.环境配置 win10 vs2017 libtorch-win-shared-with-deps-debug-1.8.1+cpu opencv349 由于yolov5代码,作者还在更新(写这篇博客的 ...

  6. Database | 浅谈Query Optimization (2)

    为什么选择左深连接树 对于n个表的连接,数量为卡特兰数,近似\(4^n\),因此为了减少枚举空间,早期的优化器仅考虑左深连接树,将数量减少为\(n!\) 但为什么是左深连接树,而不是其他样式呢? 如果 ...

  7. 【笔记】《Redis设计与实现》chapter18 发布与订阅

    chapter18 发布与订阅 客户端订阅频道. 客户端向频道发送消息, 消息被传递至各个订阅者. 匹配模式 客户端订阅模式. 客户端向频道发送消息, 消息被传递给正在订阅匹配模式的订阅者. 另一个模 ...

  8. linux 在某个路径下,查找某个文件

    find /cephfs/netdisk/ -name "*.sql"

  9. map的遍历方法 map.entrySet()

    代码: @Test public void TestMap() throws Exception { Map<String, String> map = new HashMap<&g ...

  10. Spring Boot的自动配置原理及启动流程源码分析

    概述 Spring Boot 应用目前应该是 Java 中用得最多的框架了吧.其中 Spring Boot 最具特点之一就是自动配置,基于Spring Boot 的自动配置,我们可以很快集成某个模块, ...