本文主要侧重于讲述小程序在线支付功能中的编程思想和编程模式,并在必要的地方提供关键代码示例。(文末也将附上关键的 js 代码)
为方便演示,这里将实现一个最简单的虚拟商品的订单支付功能,订单略去了收货地址和多规格、多数量的情况,示例中仅讨论在商品详情页中直接创建订单并发起支付的情况。需要分别定义 Product 表和 Order 表进行数据存取,在 BaaS 后台中创建两张数据表。
一、数据表结构设计
Product 表:
数据表录入权限:所有人
数据行读写权限:创建者可写,所有人可读
Order 表:
数据表录入权限:所有人
数据行读写权限:创建者可写,创建者可读
商品的订单结算和支付流程一般包括“创建订单 -> 支付 -> 更新订单状态”三个步骤。下文中将分析几种实现该流程的方案,供我们一起探讨。
二、客户端创建订单,客户端更新订单状态
我们先来看下只在客户端中如何处理这些逻辑。
1) 创建订单:Order 表中创建一条新记录,status 字段默认值为 “no_paid”,保存订单金额,商品快照和商品 id 以及订单创建者,其中订单创建者由 BaaS 的用户系统自动处理,值为创建订单的用户 id:
/**
* 创建订单处理函数
*/
createOrderHandle() {
const orderTableId = 12345678
const tableObject = new wx.BaaS.TableObject(orderTableId)
const createObject = tableObject.create()
const product = this.data.product
const data = {
product_id: product.id,
product_snapshot: product,
total_cost: product.price,
status: 'no_paid',
}
// 客户端创建订单,客户端更新订单状态
return createObject.set(data).save().then(res => {
this.order = res.data || {}
return this.pay(this.order)
}).then(transactionNo => {
return this.updateOrder(transactionNo)
}).then(res => {
wx.navigateTo({ url: '../order/order' })
})
2)支付:调用 BaaS SDK 提供的支付方法 wx.BaaS.pay,调起微信支付:
/**
* 发起微信支付
* @param {Object} order
*/
pay(order) {
const product = this.data.product
const orderTableId = 12345678
const params = {
totalCost: order.total_cost,
merchandiseDescription: product.title,
merchandiseSchemaID: orderTableId,
merchandiseRecordID: order.id,
merchandiseSnapshot: product,
}
return wx.BaaS.pay(params).then(res => {
return res.transaction_no
})
}
3)更新订单状态:支付成功后,更新 status 字段值为 "paid",并更新微信支付序列号:
/**
* 更新订单状态
* 仅在由客户端更新订单状态时使用
* @param {String} transaction_no 支付成功后由微信返回的微信支付序列号
*/
updateOrder(transaction_no) {
const orderTableId = 12345678
const tableObject = new wx.BaaS.TableObject(orderTableId)
const recordId = this.order.id
const record = tableObject.getWithoutData(recordId)

本文通过实例介绍了如何使用云函数和触发器,分四步提高微信小程序支付的安全性。从客户端创建订单到云函数校验支付状态,详细探讨了支付流程中的潜在风险及解决方案,确保数据的准确性和安全性。
最低0.47元/天 解锁文章
2536





