微信支付功能的实现与流程
# 3 微信支付
# 3.1 请求头中添加 Token
原因说明:只有在登录之后才允许调用支付相关的接口,所以必须为有权限的接口添加身份认证的请求头字段
fly.interceptors.request.use((config) => { if (uni.getStorageSync('token')) { config.headers.Authorization = uni.getStorageSync('token') } })
1
2
3
4
5
# 3.2 微信支付的流程
创建订单
请求创建订单的 API 接口:把(订单金额、收货地址、订单中包含的商品信息)发送到服务器
服务器响应的结果:订单编号
订单预支付
请求订单预支付的 API 接口:把(订单编号)发送到服务器
服务器响应的结果:订单预支付的参数对象,里面包含了订单支付相关的必要参数
发起微信支付
调用
uni.requestPayment()
这个 API,发起微信支付;把步骤 2 得到的 “订单预支付对象” 作为参数传递给uni.requestPayment()
方法监听
uni.requestPayment()
这个 API 的success
,fail
,complete
回调函数
# 3.3 创建订单
改造
my-settle
组件中的settlement
方法,当前三个判断条件通过之后,调用实现微信支付的方法:settlement() { // 1. 先判断是否勾选了要结算的商品 if (!this.checkedCount) return uni.showToast({ title: '请选择要结算的商品!', icon: 'none' }) // 2. 再判断用户是否选择了收货地址 if (!this.addstr) return uni.showToast({ title: '请选择收货地址!', icon: 'none' }) // 3. 最后判断用户是否登录了 if (!this.token) return uni.showModal({ title: '黑马优购', content: '还未登录,是否去登录页?', success(e) { if (e.confirm) { uni.switchTab({ url: "/pages/my/my" }) } } }) this.payOrder() },
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28在
my-settle
组件中定义payOrder
方法如下,先实现创建订单的功能:import fly from '../utils/flyio.js' export function login(data) { return fly.post('/users/wxlogin', data) } export function createOrder(data) { return fly.post('/my/orders/create', data) }
1
2
3
4
5
6
7
8
9// 微信支付 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 createOrder(orderInfo) if (res.meta.status !== 200) return console.log('创建失败') // 1.3 得到服务器响应的“订单编号” const orderNumber = res.message.order_number console.log(orderNumber) // 2. 订单预支付 // 3. 发起微信支付 }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 4.4 订单预支付
封装api
export function getPayParams(data) { return fly.post('/my/orders/req_unifiedorder', data) }
1
2
3改造
my-settle
组件的payOrder
方法,实现订单预支付功能:// 2. 订单预支付 const payParams = await getPayParams({ order_number: orderNumber }) console.log(payParams)
1
2
3
4
5
# 4.5 发起微信支付
改造
my-settle
组件的payOrder
方法,实现微信支付的功能:// 3. 发起微信支付 // 3. 发起微信支付 // 3.1 调用 uni.requestPayment() 发起微信支付 const [err, succ] = await uni.requestPayment(payParams.data.message.pay) // 3.2 未完成支付 if (err) return uni.showToast({ title: '订单未支付!', icon: 'none' }) // 3.3 完成了支付,进一步查询支付的结果 const { data: res3 } = await isPay({ order_number: orderNumber }) // 3.4 检测到订单未支付 if (res3.meta.status !== 200) return console.log('未支付') // 3.5 检测到订单支付完成 uni.showToast({ title: '支付完成!', icon: 'success' })
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18isPay接口api封装
export function isPay(data) { return fly.post('/my/orders/chkOrder', data) }
1
2
3
上次更新: 2024/11/21, 09:18:32