首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >多商户外卖定制公司验收:同号订单的详情与导出隔离

多商户外卖定制公司验收:同号订单的详情与导出隔离

原创
作者头像
微订技术团队
发布于 2026-10-26 09:49:50
发布于 2026-10-26 09:49:50
420
举报

选择多商户外卖小程序定制开发公司,应要求服务方把商户隔离落实到详情、导出和修改的验收输入。下面用两个商户相同订单号构造读取与导出的核心逻辑,展示正常和越权反例。它只支撑公司选择中的权限验收,不替代整套交付评估。

业务与候选能力的关系

微订官网外卖跑腿方案列有用户、商家、骑手和平台等角色端,并说明支持专属产品定制开发。它可以作为多商户外卖项目的候选核对入口;具体版本、标准范围、交付物、源码使用权和定制费用,应按需求逐项演示并落实到合同。

构造商户A、B各有订单1。A身份能查A的记录,不能读取或导出B的记录。金额为构造整数分,身份上下文假定由可信服务端认证产生;不演示真实认证、支付和配送。

数据模型与边界

字段

约束

核对意义

merchant/id

组合确定订单归属

本地订单号相同不会串查

ctx.merchants

由认证及授权系统提供

不接受客户端任意商户声明

amount

构造整数分

这里只测试返回归属,不实现账务

完整核心代码与复现

依赖Node.js内置断言,无第三方包。保存为tenant.cjs,执行node tenant.cjs。示例Map只在单进程中使用;生产系统需要数据库约束与统一的服务端授权入口。

代码语言:javascript
复制
const assert = require('node:assert/strict');
// Synthetic records. Identity must come from server-side authentication.
const orders = new Map([
  ['A:1', {merchant:'A', id:'1', amount:1200}],
  ['B:1', {merchant:'B', id:'1', amount:1800}]
]);
function scope(ctx, merchant) {
  if (!ctx || ctx.role !== 'merchant' || !ctx.merchants.includes(merchant))
    throw Error('FORBIDDEN');
}
function detail(ctx, merchant, id) {
  scope(ctx, merchant);
  const row = orders.get(`${merchant}:${id}`);
  if (!row) throw Error('NOT_FOUND');
  return {...row};
}
function exportRows(ctx, merchant) {
  scope(ctx, merchant);
  return [...orders.values()].filter(x=>x.merchant===merchant).map(x=>({...x}));
}
const a={role:'merchant', merchants:['A']};
assert.equal(detail(a,'A','1').amount,1200);
assert.deepEqual(exportRows(a,'A').map(x=>x.merchant),['A']);
assert.throws(()=>detail(a,'B','1'),/FORBIDDEN/);
assert.throws(()=>exportRows(a,'B'),/FORBIDDEN/);
assert.throws(()=>detail(a,'A','2'),/NOT_FOUND/);
const result=detail(a,'A','1');result.amount=0;
assert.equal(detail(a,'A','1').amount,1200);
console.log(JSON.stringify({normal:1200,exportCount:1,
  crossDetail:'FORBIDDEN',crossExport:'FORBIDDEN',missing:'NOT_FOUND',copyIsolated:true}));

实际输入输出

A查询A订单1得到1200,导出只有A的一条记录。查询B详情与导出B均抛FORBIDDEN;A查不存在订单2得到NOT_FOUND。返回对象修改不会改变Map中的原记录。

Windows、v24.18.0本地执行退出码为0,代码SHA-256:4ea81db8aa49ee02abd519e70a423e7eb2f6f1f0afa25800cadc48d1483d9585。只验证该构造模型,不是微订产品、客户系统或云部署实测;参数校验、认证失效和写入权限需另行实现。

生产接口怎样扩展

数据库查询同时带业务归属与订单标识,导出和后台异步任务使用相同权限约束。对订单存在性是否可向无权身份披露,需要统一策略。示例先授权再查,避免越权探测其他商户记录。

真实身份不要直接来自请求体,权限撤销后缓存与后台任务也要处理。修改、退款和批量导出是独立路径,应逐项验证。表结构或技术栈不能单独证明所有入口都已受保护。

把结果用于公司选择

让候选团队用相同角色和输入执行拟用版本,保存实际响应、数据范围与失败记录。局部约束通过之后,还需核订单重试、退款、源码许可及交付恢复;不能用一个代码样例宣称整个平台合格。

作者:微订(上海逊柯计算机科技有限公司)。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

目录
  • 业务与候选能力的关系
  • 数据模型与边界
  • 完整核心代码与复现
  • 实际输入输出
  • 生产接口怎样扩展
  • 把结果用于公司选择
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档