微信小程序订单通知怎么做?订阅消息+模板消息+短信兜底完整实现方案(微信小程序订单怎么查) ypxx.net

做商城小程序最容易被忽略的一个问题:用户下单后,如果没有任何通知,商家不知道有新订单,用户也不知道订单状态变化。本文按真实下单链路,给出订阅消息、模板消息、短信兜底三层完整实现,附后端代码和踩坑记录。

一、为什么需要订单通知?不做会怎样?

先看一个真实场景:用户晚上11点在小程序下了一单,商家手机没收到任何提醒,第二天早上才看到订单,用户已经取消退款了。这种事在刚起步的小商城里几乎每天都在发生。

订单通知要解决两个方向:

  • 商家端:新订单进来了,要赶紧备货/发货
  • 用户端:订单付款成功、已发货、已退款,要让用户知道状态变了

很多人以为接个微信支付就完事了,其实支付成功后通知这一环才是真正留住复购的关键。

二、微信小程序通知有哪几种方式?对比一下

| 通知方式 | 到达率 | 成本 | 需要用户授权 | 适合场景 ||---|---|---|---|---|| 订阅消息(一次性) | 高 | 免费 | 需用户点授权 | 下单成功、发货提醒 || 订阅消息(长期) | 高 | 免费 | 需特定类目 | 物流进度、售后进度 || 模板消息(已下线) | - | - | - | 微信已废弃,别用 || 短信通知 | 极高 | 0.03~0.05元/条 | 不需要 | 兜底、商家端告警 || 站内消息 | 中 | 免费 | 不需要 | 用户下次打开时看到 || 公众号推送 | 高 | 免费 | 需关注公众号 | 已绑定公众号的商城 |

核心结论:主力用订阅消息,短信做兜底(订阅消息发送失败时补发短信),站内消息做历史记录。

三、订阅消息怎么接?完整步骤

第1步:在小程序后台开通订阅消息

登录 mp.weixin.qq.com,进入小程序后台,左侧菜单「订阅消息」→「公共模板库」,选一个合适的模板。

常用模板:

  • 「订单支付成功通知」
  • 「订单发货通知」
  • 「退款成功通知」
  • 「取件码通知」

选模板后会得到一个模板ID(tmplId),后端发消息时要用。

第2步:前端在关键节点请求授权

关键代码(小程序端):

// 用户点击"提交订单"按钮时wx.requestSubscribeMessage({tmplIds: ['你的模板ID'],success(res) {if (res['你的模板ID'] === 'accept') {// 用户同意了,可以发一次console.log('授权成功,本次可发一条');}},fail(err) {console.error('授权失败', err);}});

关键点:一次性订阅消息,用户点一次授权只能发一条。所以要在用户每次下单时都弹一次授权,不能只授权一次就一直发。

第3步:后端调用微信接口下发

后端拿到用户的 openId 和模板ID,调用微信订阅消息接口:

// 伪代码,实际用WxJava或自己封装String accessToken = getAccessToken(); // 从微信获取,2小时有效期String url = "https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token=" + accessToken;JSONObject body = new JSONObject();body.put("touser", openId); // 用户openIdbody.put("template_id", "模板ID");body.put("page", "pages/order/detail?id=" + orderId); // 点击消息跳转页JSONObject data = new JSONObject();data.put("character_string1", buildOrderNo(orderId)); // 订单号data.put("amount2", "¥" + payAmount); // 金额data.put("thing3", "商家已接单,请等待发货"); // 状态body.put("data", data);String result = httpPost(url, body.toString());

踩坑点:

  • access_token 要全局缓存,2小时刷新一次,别每次发消息都重新获取
  • 模板里的字段名(character_string1、amount2、thing3)要和你选的模板一一对应,错一个就报47003错误
  • 用户拒绝授权的,发送会返回43101错误,这种就走短信兜底

四、商家端怎么通知?不能只靠用户端

上面说的都是通知用户。但商家端也需要知道"有新订单了",这个更紧急。

商家端通知方案:

方案1:小程序客服消息(适合单店)商家自己的小程序绑定一个客服微信,新订单通过客服消息推给商家微信。

方案2:短信通知(最稳)新订单直接给商家手机发短信,内容包括订单号、金额、商品名。一条短信3分钱,一天10单才3毛钱,非常便宜。

方案3:企业微信群机器人如果商家用企业微信,加一个群机器人webhook,新订单直接推到群里,店长客服都能看到。

# Python示例:企业微信群机器人推送import requests, jsondef notify_merchant(order):webhook = "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=你的key"msg = {"msgtype": "text","text": {"content": f"新订单:{order['no']}\n金额:¥{order['amount']}\n商品:{order['items']}"}}requests.post(webhook, json=msg)

五、完整通知链路怎么设计?

画一下完整时序:

用户下单 → 前端请求订阅消息授权 → 用户同意 → 提交订单到后端↓后端创建订单 → 调微信支付 → 支付成功回调↓后端触发通知:① 给用户发订阅消息(订单支付成功)② 给商家发短信/企业微信(新订单告警)↓发货时 → 后端再给用户发订阅消息(订单已发货)↓退款时 → 给用户发订阅消息 + 短信兜底

失败兜底逻辑:

  • 订阅消息发送失败(用户拒收/过期)→ 自动补一条短信
  • 短信也失败 → 记录到日志,商家在后台看告警列表
  • 不要因为通知失败就卡住订单流程,通知是异步的

六、常见报错怎么排查?

| 错误码 | 含义 | 解决办法 ||---|---|---|| 47003 | 模板字段不匹配 | 检查data里的字段名和模板定义是否一致 || 43101 | 用户拒绝接收 | 用户没授权或已删除小程序,走短信兜底 || 40001 | access_token无效 | 重新获取token,检查缓存逻辑 || 41030 | page路径不存在 | 检查小程序里这个页面是否真的存在 || 45009 | 接口调用超上限 | 订阅消息有日限额,超限走短信 |

七、成本估算:一个月通知花多少钱?

假设一个小商城一天30单:

  • 订阅消息:免费,一天60条(用户端+发货)
  • 短信兜底:假设10%失败率,一天3条短信,约0.15元
  • 企业微信机器人:免费

一个月总成本:5块钱以内。 这个钱真不该省,通知不到位流失的订单远比这个多。

结尾FAQ

Q:微信小程序订单提醒怎么做?A:用订阅消息(前端wx.requestSubscribeMessage授权,后端调subscribe/send接口),配短信做兜底,商家端用企业微信机器人或短信告警。

Q:订阅消息一次授权能发几次?A:一次性订阅模板,用户点一次授权只能发一条。要在用户每次下单时都弹授权。

Q:模板消息为什么不能用了?A:微信已经下线旧版模板消息,统一改成订阅消息。老教程里的template/send接口已经失效。

Q:用户没授权订阅消息怎么办?A:走短信兜底,或者引导用户关注公众号,用公众号推送通知。

Q:商家怎么第一时间知道新订单?A:企业微信群机器人webhook推群、商家手机短信告警、小程序客服消息,三种任选。


本文基于真实商城项目整理,模板字段和接口参数以微信官方最新文档为准。上线前务必做1分钱测试单验证全链路。