最近接了一个社区团购的私活,核心需求就一句话:用户提前下单,过几天到自提点拿货。听起来简单,但真做起来,库存、支付、核销、自提点管理这几块全是坑。这篇文章把「预售自提小程序」从业务拆解到代码落地完整讲一遍,都是我踩过的坑。
一、先搞清楚预售自提的业务链路
和普通电商小程序最大的区别在于:下单和履约在时间上是分离的。用户今天付款,可能三天后才去自提点拿货。这条链路拆开是:
- 浏览预售商品 → 选择自提点 → 下单支付
- 平台备货 → 到货后通知用户 → 用户到店出示核销码
- 自提点核销 → 订单完成
关键点在于库存锁定和核销凭证这两块,下面重点讲。
二、库存锁定:别让超卖毁掉口碑
预售商品通常是限量供应,比如「本周到货 200 箱车厘子」。如果并发下单时不锁库存,很容易超卖。我的做法是在下单时用数据库原子操作扣减:
// 扣减预售库存(伪代码,以 MySQL 为例)
const result = await db.query(
`UPDATE pre_sale_stock
SET locked = locked + ?
WHERE sku_id = ? AND (total - locked) >= ?`,
[quantity, skuId, quantity]
);
if (result.affectedRows === 0) {
throw new Error('库存不足');
}
注意这里用的是 locked(锁定数)而不是直接扣 total。因为用户可能支付失败或超时未付,需要有个释放机制。建议加一个定时任务,把超过 15 分钟未支付的订单释放库存:
// 定时释放超时未支付订单的库存
await db.query(
`UPDATE pre_sale_stock s
JOIN orders o ON s.sku_id = o.sku_id
SET s.locked = s.locked - o.quantity
WHERE o.status = 'unpaid'
AND o.created_at < DATE_SUB(NOW(), INTERVAL 15 MINUTE)`
);
三、自提点管理:多门店的数据隔离
如果只有一两个自提点,随便建张表就行。但社区团购往往是「一个团长一个自提点」,几十上百个点很常见。表结构建议这样设计:
pickup_points:自提点信息(名称、地址、经纬度、团长 openid、营业时间)orders表加pickup_point_id字段,下单时必须选择- 核销权限绑定到团长,只有该自提点的团长能核销对应订单
用户下单时,根据收货地址或定位推荐最近的自提点,这里可以用高德或腾讯地图的逆地址解析接口。别自己写经纬度计算,直接调 API 省事。
四、核销码:一次性凭证的设计
核销码是自提环节的核心。我的方案是动态二维码 + 6 位数字码双保险:
// 生成核销码(Node.js 示例)
const crypto = require('crypto');
function genPickupCode(orderId) {
const raw = `${orderId}-${Date.now()}-${Math.random()}`;
const hash = crypto.createHash('md5').update(raw).digest('hex');
return hash.slice(0, 12).toUpperCase();
}
用户端展示二维码(内容为核销码),团长端用小程序 wx.scanCode 扫码核销。核销接口要做幂等处理,防止重复核销:
// 核销接口,用数据库唯一索引兜底
await db.query(
`UPDATE orders
SET status = 'completed', verified_at = NOW()
WHERE pickup_code = ? AND status = 'paid'`,
[code]
);
// affectedRows 为 0 说明已核销或状态不对
更稳妥的做法是给 pickup_code 加唯一索引,并在核销时加行锁 SELECT ... FOR UPDATE,避免并发扫码。
五、支付与分账:别忘了团长的那份
预售自提小程序通常涉及多方分账:平台抽成、团长佣金。微信支付的服务商模式支持分账,但个人开发者拿不到服务商资质。我的建议是先做简单版:用户付款到平台账户,订单完成后手动或定时给团长结算。等业务量起来再接入分账 API。
支付回调里要注意:必须验签,并且更新订单状态时要判断当前状态,避免重复回调导致状态错乱。
六、几个容易翻车的细节
- 到货通知:用订阅消息,用户下单时就要引导授权,别等到货了才发现没授权
- 退款处理:预售商品退款要同步释放库存,别只退钱不还库存
- 自提点营业时间:用户到店发现关门,体验极差,下单页要明确展示
- 订单超时:预售周期长,建议设置「到货后 7 天未取自动完成」,避免订单一直挂着
七、小结
预售自提小程序的技术难点不在页面,而在库存并发控制、核销幂等、多自提点数据隔离这三块。把这三块做扎实,剩下的就是常规的增删改查。如果你也在做类似项目,欢迎留言交流,尤其是分账那块有更好方案的朋友,求指教。
评论 (0)
还没有评论,快来抢沙发吧~