很多团队在验收软件时,只确认"能打开、能点",然后开发商甩过来一个 setup.exe 或一个小程序二维码,这事就算完了。但exe / 二维码只是结果,真正决定你后续能不能改、能不能维护、出事能不能追责的,是它背后那一整套资产。
我做了多年 .NET 桌面端,也接小程序和 APP,下面这份跨平台交付清单,建议收藏,验收时逐条对。
桌面端(WPF / WinForms)必交 6 样
- 可安装包 / 自包含发布目录(不是散落 dll);
- 完整源码(
.csproj/.sln+ 依赖清单); - 数据库脚本(建表 / 初始数据 / 迁移);
- 配置与密钥(
appsettings.json、串口参数、接口地址,密钥用占位符); - 操作文档 + 部署文档;
- 授权 / 激活说明(按机器授权要把规则讲清)。
交付前必跑的自包含发布:
bash
dotnet publish -c Release -r win-x64 --self-contained true `
-p:PublishSingleFile=true -p:IncludeNativeLibrariesForSelfExtract=true
验收"缺件自检"小工具:
csharp
static readonly string[] Required = { "src", "db", "doc", "appsettings.json" };
public static void Check(string root)
{
var miss = Required.Where(r =>
!Directory.Exists(Path.Combine(root, r)) &&
!File.Exists(Path.Combine(root, r))).ToList();
Console.WriteLine(miss.Any() ? "缺:" + string.Join(",", miss) : "✅ 齐全");
}
小程序必交 6 样
- 前端源码(
pages/、app.js、app.json,开发者工具能完整打开); - 后端源码 + 部署说明(
code2session、订阅消息、支付 v3 服务端); - 已备案 HTTPS 域名(配进「服务器域名 → request 合法域名」);
- 管理员账号 + AppID(不移交,你永远是使用者);
- 微信支付商户号 + 证书(涉及支付时);
- 类目资质 + 小程序 ICP 备案。
后端换 openid 核心:
csharp
public async Task<string> Code2OpenId(string code)
{
var url = $"https://api.weixin.qq.com/sns/jscode2session" +
$"?appid={AppId}&secret={AppSecret}&js_code={code}&grant_type=authorization_code";
var j = await _http.GetFromJsonAsync<JsonNode>(url);
return j["openid"]?.GetValue<string>();
}
APP 必交 6 样
- 完整源码(Android / iOS / MAUI / Flutter 工程);
- 签名密钥 (Android
keystore丢了就无法更新,必须当面移交改密); - 软著证书(国内商店上架强制);
- 应用商店开发者账号;
- 隐私政策 + SDK 清单(各商店强制);
- ICP / 公安备案。
gradle
android {
signingConfigs {
release {
storeFile file("release.keystore")
storePassword "******" // 交接时务必改掉
keyAlias "myapp"
keyPassword "******"
}
}
buildTypes { release { signingConfig signingConfigs.release } }
}
通用清单(直接抄)
| 类别 | 桌面端 | 小程序 | APP |
|---|---|---|---|
| 产物 | 安装包 | 已发布小程序 | 上架包 |
| 源码 | 完整工程 | 前端+后端 | 工程+签名密钥 |
| 数据 | 脚本 | 表结构 | 表结构 |
| 账号 | --- | 管理员+AppID | 开发者账号 |
| 资质 | --- | 类目+备案 | 软著+备案+隐私 |
| 文档 | 部署+操作 | 部署+接口 | 上架+隐私 |
怎么判断给的是真源码还是假源码
清单对了还要防"假源码"------能打开但编译不过、缺依赖、缺迁移脚本,等于没给。三个实招:
- 清环境重编译 :在一台只装 SDK、没装第三方工具的干净机器上,源码
dotnet build/npm install && build一遍,跑不通就是缺东西。 - 对照构建来源:让开发商提供 exe / 小程序的构建提交号(git commit / tag),你能从同一份源码构建出功能一致的结果,才叫源码对应成品。
- 抽查迁移脚本:新建空库跑他的建表 + 初始数据脚本,能还原出你正在用的数据结构,才算数据可延续。
csharp
// 真源码的一个特征:版本号可从源码查到,对得上你拿到的 exe
var v = System.Reflection.Assembly.GetExecutingAssembly()
.GetName().Version.ToString();
Console.WriteLine("源码版本:" + v);
几个常见套路
- "源码涉及核心技术不能给"------买断定制开发的源码版权归甲方,这是合同范畴,不是技术范畴;
- "你拿源码也看不懂"------看不懂可以找人接手,前提是你得有;
- "先给 exe 用着,源码以后给"------以后往往就是没有以后。
把这份清单写进合同附件,比任何口头承诺都管用。
补充一句:源码交付和"开源"是两回事。你买断的是使用权 + 源码归属,不需要对方公开代码,但对方必须保证你能在自己手里重新构建、修改、找人接手。这一点写清楚,后续才不会被"核心技术"四个字拿捏。
验收与售后边界
验收以"清单逐项勾"为准,别口头"能用就行";售后写进合同:源码交付 ≠ 终身免费改,通常 1--3 个月免费 bug 修复,需求新增另算。
如果你是甲方、正在验收却只拿到一个 exe,或者手里有半成品想找人兜底,欢迎在评论区交流,或站内私信我帮你判断哪些东西本该是你的。关注我,后续聊更多"接单 / 交付 / 上架"的实踩经验。