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