Shopify 的结账校验使用 Shopify Functions 在 Shopify 自身的结账引擎内部、服务端执行业务规则。与客户端 JavaScript 绕过手段或主题级别的小聪明不同,结账校验无法被绕过 — 它会在每一次结账尝试中运行,包括 Shop Pay、Apple Pay、Google Pay 与无头店铺。OrderRules 用这个 API 在购买的瞬间强制执行订单上限、按客户上限和消费上限。
什么是结账校验
Shopify Functions 是一项较新的 Shopify 技术,允许应用编写在 Shopify 基础设施内部运行的服务端逻辑。当你为店铺添加一个结账校验函数时,它就成为 Shopify 结账引擎自身的一部分 — 不是独立服务,不是主题脚本,不是第三方 API 调用。
它的与众不同之处:
- 服务端:函数运行在 Shopify 的服务器上,不在客户的浏览器里。商家保持完全控制。
- 在所有路径上运行:无论客户使用网页结账、Shop Pay、Apple Pay、Google Pay 还是无头店铺,相同的校验规则都会生效。
- 无法绕过:客户不能通过禁用 JavaScript、修改 DOM 或构造请求来绕过它。它直接内嵌在结账流程中。
- 快速:函数在 Shopify 的 WebAssembly 运行时中以小于 5 毫秒完成。对结账速度没有可感知的影响。
结账校验专门拦截支付步骤。在 Shopify 处理支付之前,你的函数先运行。如果订单违反任何规则,Shopify 会拦截结账并展示一条自定义错误信息。如果所有规则都通过,结账继续正常进行。
为什么客户端校验会失败
许多 Shopify 店主试图通过主题代码或在购物车页面注入 JavaScript 的第三方应用来限制订单。理论上看起来不错,实践中却失败连连 — 而商家往往为时已晚才发现。
JavaScript 可以被关闭。 客户可以在浏览器里关掉 JavaScript,从而完全跳过你的校验。大多数现代浏览器都很容易做到。
主题小聪明会随 Shopify 升级失效。 当 Shopify 发布新主题版本时,自定义代码可能停止工作或表现异常。你只能不断维护这些临时方案。
草稿订单绕过主题代码。 如果店主(或管理员)用 Shopify 的草稿订单工具直接创建订单,购物车页面根本不会加载。主题校验也就不会执行。
无头店铺不走主题。 如果你用 Hydrogen 或自定义 React 应用搭建店铺,Shopify 主题代码并不存在。你只能在前端重写一遍校验逻辑 — 而且依然是客户端。
POS 订单不受影响。 如果你用 Shopify POS 做线下销售,购物车页面就不存在。主题代码与此无关。
下面是真正有效的方案对比:
| 方法 | 网页结账 | Shop Pay | Apple Pay | Google Pay | POS | 无头 | 防绕过 |
|---|---|---|---|---|---|---|---|
| 主题 JavaScript | ✓ | ✗ | ✗ | ✗ | ✗ | ✗ | ✗ |
| 购物车页面脚本 | ✓ | ✗ | ✗ | ✗ | ✗ | ✗ | ✗ |
| Shopify Functions | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
结账校验是唯一覆盖所有路径且无法绕过的方法。
OrderRules 如何使用 Shopify Functions
OrderRules 接入结账校验 API。当客户进入支付环节时,我们的函数运行并检查你配置的所有订单规则:
- 每日/每周/每月订单上限:限制店铺在某个时间窗口内可以接收的订单总数。
- 按商品上限:限制特定商品按客户或按订单的购买数量。
- 按客户订单上限:限制单个客户能下的订单数(终身或在某个周期内)。
- 消费上限:拦截超过最大订单金额(总额或按客户)的订单。
- 营业时间:阻止营业时间外的下单。
- 最小订购数量:确保订单达到最小数量。
任何一条规则未通过,结账就会被拦截。不会尝试支付。客户会看到一条清晰友好的提示,说明原因和下一步操作。
如果所有规则都通过,函数静默返回,Shopify 继续正常的支付处理。
后端的样子大致如下:
// Simplified pseudocode — actual implementation is more complex
function validateCheckout(input) {
const cart = input.cart;
// Check daily order limit
const ordersToday = countOrdersToday();
if (ordersToday >= dailyLimit) {
return {
errors: [{
message: "We've reached our daily order limit. Please try again tomorrow!"
}]
};
}
// Check per-customer limit
const customerOrders = countCustomerOrders(cart.buyerIdentity.email);
if (customerOrders >= perCustomerLimit) {
return {
errors: [{
message: "You've reached your order limit. Contact support for exceptions."
}]
};
}
// All rules passed
return { errors: [] };
}
返回错误时,Shopify 会在结账页展示它们并阻止支付。返回空的 errors 数组时,结账继续正常进行。
客户看到的内容
规则通过时结账校验是不可见的 — 客户照常完成购买。
当某条规则被违反时,客户在支付步骤会看到:

不是坏掉的页面。不是奇怪的 500 错误。是一句清晰友好的提示:
「我们今日的订单上限已满。请明天再试!」
或者
「您本周已下了 3 单。我们的上限是 2 单。请下周再来。」
这些文案可自定义 — 你在 OrderRules 控制台里写好它们,会以客户的语言显示(如果你的店铺是多语言店铺)。
客户无法继续进入支付。也无法绕过这条提示。他们要么等待规则允许其下单,要么联系客服申请例外。

技术细节
一些对开发者有用的技术说明:
Shopify 的函数上限:每家店铺最多可部署 25 个校验函数(这是 Shopify API 的上限)。OrderRules 使用一个整合好的函数,因此这并非约束。
性能:函数在 Shopify 的 WebAssembly 运行时中运行,执行时间不到 5 毫秒。足够快,客户不会感受到任何额外延迟。
兼容性:结账校验兼容:
- Online Store 2.0(最新的 Shopify 主题体系)
- Shopify Plus(企业级套餐)
- 使用 Hydrogen 或自定义框架的无头店铺
- POS(门店销售)
- Shop Pay 和加速结账
无需自定义域名或 IP 白名单:函数由 Shopify 部署和管理。你无需操心基础设施、扩容或可靠性。
零代码上手
尽管 Shopify Functions 的技术含量不低,OrderRules 替你打理了所有实现细节。
你不需要:
- 编写函数代码
- 通过 Shopify CLI 部署
- 管理 WebAssembly 二进制
- 监控函数日志
你只需要:
- 从 Shopify App Store 安装 OrderRules
- 打开 OrderRules 控制台
- 设置你的订单规则(每日上限、按客户上限、消费上限)
- 保存
就这样。结账校验立即生效。无需代码、无需部署、无需等待 CLI 构建。
阅读更多:如何在 Shopify 上设置订单上限
何时使用结账校验,何时使用其他方法
适合使用结账校验的场景:
- 绝不可被打破的硬性规则(法律下限、产能约束、库存阈值)
- 适用于所有渠道(网页、移动端、POS、无头)的规则
- 不能被绕过的规则
例子:「我们每周只生产 100 件,必须严格执行」或「行业法规要求每位客户每月不超过 5 单。」
适合使用主题级文案的场景:
- 温和的提醒与紧迫感触发
- 实时库存计数器(「仅剩 3 件!」)
- 促销文案(「快下单 — 周五上限将提升!」)
- 与品牌风格匹配的视觉设计
例子:「库存即将告罄」横幅或「2 天后上限将提升」。
最佳实践:两者结合。OrderRules 提供结账校验(硬性规则),你可以再叠加主题级文案,在客户达到上限之前营造紧迫感、做出引导。客户尝试超额时会看到友好的报错;要减少用户挫败感,可以在更早的页面给出提示。
阅读更多:动态店铺前台文案
没有绕过手段,也没有头疼
结账校验解决了一个客户端方法永远无法彻底解决的问题:商家需要确信他们的订单规则真的被执行 — 在每一个订单上,无论客户通过哪条路径到达结账。
有了 Shopify Functions,这种信任是内建的。规则运行在 Shopify 的服务器上,无法被关闭、修改或绕过。实现过程也极为透明,店主甚至不需要去关心技术细节 — 设定规则之后继续做生意就好。
对于需要管理产能、控制按客户购买行为或强制消费上限的店铺,结账校验是 Shopify 上可用的最可靠方案。
延伸阅读
今天就启用服务端结账校验
从 Shopify App Store 安装 OrderRules — 结账校验在所有套餐(免费和 Pro)中均已包含。