专注小程序 / APP 开发,用代码改变生活

获取方案
全国分站 主站首页 北京分站 石家庄分站 唐山分站 保定分站 廊坊分站 沧州分站 郑州分站

预售自提小程序开发实战指南

小程序开发 2026-10-12 3 阅读 0 点赞 原创

最近接了一个社区团购的私活,核心需求就一句话:用户提前下单,过几天到自提点拿货。听起来简单,但真做起来,库存、支付、核销、自提点管理这几块全是坑。这篇文章把「预售自提小程序」从业务拆解到代码落地完整讲一遍,都是我踩过的坑。

一、先搞清楚预售自提的业务链路

和普通电商小程序最大的区别在于:下单和履约在时间上是分离的。用户今天付款,可能三天后才去自提点拿货。这条链路拆开是:

  • 浏览预售商品 → 选择自提点 → 下单支付
  • 平台备货 → 到货后通知用户 → 用户到店出示核销码
  • 自提点核销 → 订单完成

关键点在于库存锁定和核销凭证这两块,下面重点讲。

二、库存锁定:别让超卖毁掉口碑

预售商品通常是限量供应,比如「本周到货 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)

还没有评论,快来抢沙发吧~

好想法,值得被认真交付

从小程序、APP 到全栈网站,一站式把想法变成可落地的产品

微信咨询

微信扫码,直接沟通需求