简介:一套基于ASP.NET的多用户微信商城分销直销平台源码,面向需要搭建或二次开发微信公众商城、实现分销/直销模式的开发人员。平台完整覆盖关注回复、自定义菜单、客服消息、客户管理及二维码链式推广,支持分销与直销两套商城模板,并集成微信支付V3.0;后台大管理端可查看所有商户子公众号,支持多商户计费运维。压缩包约67.24MB,共2000个文件:247个aspx页面和485个cs文件构成核心业务逻辑,127个js、105个css及大量jpg/png提供前端交互与界面素材,173个dll用于类库引用,另有sql数据库脚本与配置文件可供部署参考。目前已有652人学习这套源码。源码适合用于电商选型评估、毕业设计或中小商户公众号商城快速落地,可按实际商品与需求微调后投入运营,同时其中的订单打印、运单打印及BI智能图表分析功能也能为商城日常管理提供直接帮助。
1. 一套正经的 ASP.NET 微信商城源码:不是演示站,是多公众号分销系统的后端骨架
下载站里搜“微信商城源码”,十个里有八个是 PHP 生态的商城系统,真正能部署到自己服务器、还能按代运营需求改权限模型的 ASP.NET 版本反而少见。这套“ASPNET多用户微信商城分销直销平台源码”属于后者:标准的 Asp.Net WebForm + C# + SqlServer2008R2,微商城模块做得比较完整,微信端走公众号菜单、网页授权、客服消息,后台带商品、订单、客户、运单打印和 BI 图表分析,并且内置分销、直销两套商城模板。它不是什么扫码即开箱的演示程序,解压后要先配数据库、挂 IIS、填公众号参数才能跑起来。适合会折腾 IIS 和 SqlServer 的开发者、接公众号外包的小团队,以及对“源码可控”有硬要求的技术负责人。如果你要找的是微信小程序前端源码,那和这个资源是两个方向,这套是公众号商城后端。
2. 部署前先读源码:ashx 处理器、运行环境和 web.config 三件事
2.1 源码剖析从 ashx 开始:六个请求处理器是商城所有业务的入口
压缩包解开之后,先别急着丢进 IIS,先把根目录下那一排.ashx文件过一遍。这批文件不是摆设,它们是这套商城的业务接口层,前端页面上的异步操作基本都往这里发。
从输入的文件清单看,核心出口就这么几个:
centerusers_ajax.ashx:会员中心相关操作,客户资料、积分余额、收货地址这类请求走这里。payinfo.ashx:支付信息处理,重点是微信支付 V3.0 的支付通知回调,这是整个订单链路里最关键的入口。upload_ajax.ashx:图片上传入口,商品图、分销海报图、用户头像上传都会用到。verify_code.ashx:图形验证码生成,登录后台或某些表单提交时用来防机器操作。goods_ajax.ashx:商品展示、购物车、下单动作的异步接口。admin_ajax.ashx:后台管理增删改查的集中出口,商品分类、导航菜单、订单状态变更大概率都在这里。
这种用 ashx 写业务出口的架构,是早期 ASP.NET 商城里很典型的路数。相比 aspx 页面控件那一套,ashx 更轻量,请求进来直接进ProcessRequest方法,返回 JSON 或 XML,前端拿数据自己渲染。对二次开发来说这是好事:接口边界清楚,改一个功能不用牵动整个页面生命周期。想做源码剖析级阅读的,我建议你也按这个顺序来,先看 ashx 定义了哪些请求动作,再搜前端 JS 里怎么调用的,最后翻对应的数据访问类,比从头读 aspx 快太多。
至于业务逻辑层和数据层,常见的分层是App_Code目录下的类文件,或者独立的 BLL、DAL 目录,具体以压缩包实际结构为准。页面层是 aspx 和用户控件 ascx,接口层就是这批 ashx,数据库则是 SqlServer 2008R2。整个技术栈很纯粹,没有花哨的前后端分离,服务端渲染为主,适合在老项目基础上有针对性地改。
2.2 部署环境:SqlServer 2008R2、IIS 与 .NET 应用池的固定组合
这套源码的运行环境组合非常固定,Windows + IIS + SqlServer。我一般拿到这种类型的项目,会先按下面这张表把环境对齐,避免后面运行时报一堆版本问题。
| 环境项 | 建议配置 | 说明 |
|---|---|---|
| 操作系统 | Windows Server 2012 R2 / 2016 | Win10 也可以调试,但生产建议上 Server |
| Web 服务器 | IIS 7.5 及以上 | 需要启用 ASP.NET 功能模块 |
| 运行框架 | .NET Framework 4.x | IIS 应用池托管管道选 v4.0 |
| 数据库 | SqlServer 2008R2 或更高版本 | 2008R2 备份文件可还原到高版本 |
| 站点目录权限 | IIS_IUSRS 对 upload 等写入目录可写 | 否则商品图片上传会秒失败 |
部署步骤我按常见做法走一遍。第一,服务器上打开“添加角色和功能”,勾选 Web 服务器 IIS,并在“应用程序开发”里勾选 ASP.NET 4.x,这一步漏了的话,后面 ashx 接口会直接报错。第二,打开 IIS 管理器,在“应用程序池”里新建一个池,.NET CLR 版本选 v4.0,托管管道模式选“集成”。第三,添加网站,物理路径指到源码解压目录,应用程序池选刚才建的那个。第四,给站点目录添加 IIS_IUSRS 用户的读写权限,特别是upload相关目录,否则图片上传必挂。
提示:64 位系统下,应用池“允许 32 位应用程序”保持默认 False 即可。除非你确认源码里依赖了 32 位组件,否则不要随便打开,开了反而可能引入内存占用和性能问题。
2.3 web.config 改配:连接串和公众号默认参数一次改对
IIS 能打开页面之后,最关键的配置在web.config。连接字符串决定库能不能连上,appSettings 里则是公众号相关的默认参数。
<connectionStrings> <add name="SqlConn" connectionString="Data Source=.;Initial Catalog=WxMall;User ID=sa;Password=你的密码;MultipleActiveResultSets=true" providerName="System.Data.SqlClient"/> </connectionStrings> <appSettings> <add key="WxAppId" value="填公众号后台的AppId"/> <add key="WxAppSecret" value="填公众号后台的AppSecret"/> <add key="WxToken" value="填服务器配置里的Token"/> <add key="EncodingAESKey" value="填43位EncodingAESKey"/> </appSettings>这些参数的含义很直接:Data Source是数据库实例地址,本机就写.或localhost;Initial Catalog是库名,按你还原进去的库名改;User ID和Password是数据库登录账号,建议在 SqlServer 里单独建一个业务账号,别直接用 sa 上生产。公众号的四个参数对接的是微信公众平台后台的“基本配置”,其中 Token 和 EncodingAESKey 需要你自己在公众号后台设置并启用加密模式,前后保持一致。
有一点要注意,web.config里这些公众号参数通常只是种子账号用的。多用户商城真正跑起来之后,不同商户的公众号配置存在数据库表里,由大管理端在后台维护,而不是每次部署都改文件。所以配置完web.config能让系统登录进去,真正的公众号切换要去后台的公众号配置里做,这个模型在下一章细说。
3. 多用户多公众号:这套源码区别于单商户商城的核心模型
3.1 大管理端看全局,商户只看自己的公众号
普通商城后台只有一个管理员,一套商品数据,而这套系统的设计是“平台式”的,最上面是大管理端,能看到所有商户以及商户子公众号的信息。往下每个商户有自己的公众号配置、商城和订单数据,彼此隔离。
我画了一下它的组织关系,大概是四层:平台管理员 → 商户 → 公众号 → 子账号。每个商户可以绑定一个或多个公众号,每个公众号下面最多开 5 个子账号,分给运营、客服、仓管去登录后台干活。从数据库角度看,一般会有商户表、公众号配置表、子账号表和相关联的权限表。一次典型的后台数据查询,逻辑上类似这样:
-- 示意查询:看平台下有哪些商户、公众号和子账号 -- 表名以压缩包内 SQL 脚本为准,不同版本命名有差异 SELECT m.MerchantName, wa.AppId, sa.AccountName FROM MerchantInfo m LEFT JOIN WxAccountInfo wa ON m.MerchantId = wa.MerchantId LEFT JOIN SubAccountInfo sa ON wa.WxAccountId = sa.WxAccountId ORDER BY m.MerchantId这段 SQL 的逻辑很简单,就是从商户出发,把公众号和子账号信息带出来。实际源码里表名可能是Merchant、WxAccount、SubUser之类,拿到脚本后先替换成真实表名再执行。这里最重要的是理解一点:所有业务操作都要先判断当前登录者属于哪个商户,再去查对应的公众号和子账号数据,不能直接查全表。否则在多商户环境下,A 商户的运营人员能看见 B 商户的订单,那就是严重越权事故。
3.2 每个公众号五个子账号:菜单权限与控制粒度
“每个公众号可配置5个子账号”是摘要里明确写出来的能力,这个配额在落地时一般有两种实现方式:一种是在公众号配置表里加一个子账号数量字段,每次新增时统计校验是否超过 5;另一种是直接在子账号表里做公众号维度唯一约束,COUNT 超出就提示。无论哪种,都是防止一个公众号的经营权限被无限拆分。
子账号的权限控制,常见做法是按后台导航菜单授权。后台菜单不是写死在页面上的,而是通过后台菜单管理功能动态维护,每个菜单对应一个权限标识。子账号登录后台后,admin_ajax.ashx里处理菜单数据和操作请求时,都会校验当前登录账号是否有对应权限。示意代码如下:
// admin_ajax.ashx 里权限判断的通用逻辑(示意) int subAccountId = (int)HttpContext.Current.Session["SubAccountId"]; string menuIds = BLL.Account.GetMenuIdsBySubAccountId(subAccountId); int currentMenuId = Convert.ToInt32(context.Request["menuId"]); if (("," + menuIds + ",").IndexOf("," + currentMenuId + ",", StringComparison.Ordinal) < 0) { context.Response.Write("{\"code\":403,\"msg\":\"no permission\"}"); context.Response.End(); return; }这段代码是典型的逗号分隔 ID 集合权限判断。它的优点是简单直观,缺点是菜单数量大了以后字符串拼接不好维护,子账号权限变更要重新计算整个集合。实际源码里的实现可能是独立的权限关联表,也可能是位掩码,思路一样。你可以把这段当成阅读理解源码的辅助,先在admin_ajax.ashx里搜“menuId”或“Permission”关键词,就能定位到真实的校验逻辑。
3.3 大管理端计费运维:试用、正式、收费切换
大管理端除了看全局数据,还承担一个运营功能:计费运维。摘要里说得很清楚,“可在后台看见所有商户以及商户子公众号的信息,可开启计费运维,或者单为某个商户开账户也行”。这对接的是 SaaS 化运营场景:平台方部署一套源码,把商城能力租给多个商户用,需要收费的时候就开启计费,不需要就各自免费跑。
实际操作路径一般是:大管理端登录后进入商户管理,选择某个商户,设置账户状态为试用或正式。开启计费后,系统会记录该商户的订单量、销售额等数据,用于后续按周期结算,BI 图表分析在这个环节就能派上用场。给单独某个商户开账户,则是只创建该商户的登录账号和公众号绑定,不纳入全平台统一计费池。
这个模型对代运营公司尤其有价值。接一个新客户,不用重新部署一套源码,在大管理端创建一个商户账号,配置好客户的公众号 AppId 和 AppSecret,就能让客户自己维护商城。收回来的运维成本通过计费开关控制,账期到了把 BI 数据导出来就可以对账。
4. 分销与直销两套模板:二维码链式推广的完整链路
4.1 商城模板配置:先搞清楚客户要分销还是直销
这套源码不搞一套模板打天下,后台商城模板配置里直接区分“分销模板”和“直销模板”。客户找到你说要做微信商城,第一步不是写代码,而是问清楚他要不要做分销,这决定后续整个用户关系链怎么做。
两者的差别可以用一张表说清:
| 对比维度 | 分销模板 | 直销模板 |
|---|---|---|
| 购买流程 | 可直销购买,也可分享推广二维码发展下级 | 普通商品直接购买 |
| 返佣逻辑 | 下级付款后,上级按设置比例获得佣金 | 无返佣,无层级关系 |
| 客户关系 | 扫码关注即绑定上下级关系链 | 关注就是普通粉丝 |
| 适用场景 | 微商团队、社群分销、多级裂变 | 品牌自营、门店零售、企业官网商城 |
| 后台配置 | 需设置分销层级和返佣比例 | 只需配置商品和支付 |
摘要里提到的“直接性:购买者可直接购买细微修改即是成品的平台商品”,说的就是直销模式下商品上架后基本可以直接卖,不需要再开发。而分销模式下,系统要多管一套上下级绑定关系和佣金流水。所以如果你接的客户只是想开个网上商店,老老实实选直销模板,别一上来就上分销,维护成本差很多。
4.2 带参数二维码怎么绑定上下级:一个 handler 的示意逻辑
分销模板的核心是“二维码链式推广”。用户 C 扫了用户 A 的推广二维码,关注公众号后,系统要把 C 自动挂在 A 的名下,以后 C 下单,A 就有佣金。这个机制在微信生态里的标准做法是带参数二维码。
用户扫码关注时,微信服务器会把事件消息推送到你配置的 URL,消息里的EventKey带着二维码的参数值。最常见的做法是让这个参数值等于上级的粉丝 ID 或商户配置的推广 ID。处理逻辑一般写在公众号消息接收的 handler 里,示意如下:
// 关注事件回调:解析带参二维码的 EventKey,绑定上下级关系 public void HandleSubscribeEvent(string xml) { var doc = XDocument.Parse(xml); string fromUser = doc.Root.Element("FromUserName").Value; string eventKey = doc.Root.Element("EventKey").Value; int referrerId = 0; // 带参二维码的场景值前缀是 qrscene_ if (int.TryParse(eventKey.Replace("qrscene_", ""), out referrerId)) { bool ok = BLL.User.BindReferrer(fromUser, referrerId); ResponseText(ok ? "绑定成功,欢迎加入" : "你已经有上级了"); } }FromUserName是当前用户的 openId,EventKey是二维码携带的场景值,在这套逻辑里就是上级的粉丝 ID。BindReferrer方法内部必须做三个检查:一是这个 openId 之前是否已经绑定过,绑过就忽略;二是不能把自己设为自己的上级;三是绑定关系写入后要能支持后续订单返佣查询。返回给用户的内容可以用被动回复文本消息,也可以用图文消息,取决于系统里有没有配套的图文回复配置。
这里最容易翻车的是场景时序:用户先关注了公众号,再去扫别人的推广码,这时候不一定能触发带参二维码事件,因为微信号可能已经直接识别是普通扫码。我一般会在绑定逻辑里同时做个补救,在网页授权或菜单点击时再次校验当前 openId 有没有上级,没有则通过 URL 参数补绑。
4.3 goods_ajax.ashx 与下单链路:返佣在哪个节点写流水
二维码绑定关系只是第一步,真正让分销体系跑起来的是下单和返佣链路。整个流程在源码里大约是这样串的:
- 用户在小程序端或公众号内的商城浏览商品,加购物车,这些异步操作走
goods_ajax.ashx。 - 提交订单时创建订单主表和订单明细表,订单状态为“待支付”。
- 用户进入微信支付 V3.0,完成付款。
- 微信服务器异步通知
payinfo.ashx,验签通过后,更新订单状态为“已支付”。 - 在同一个事务里,根据下单用户的上级绑定关系,计算佣金并写入返佣流水表。
返佣一定要放在支付回调成功的节点,而不是用户点击支付成功的跳转页。因为回调是微信服务器到你的服务器,可信度更高;前端那个跳转页是可以伪造的。支付回调接口设计时要考虑幂等,同一个订单通知可能推送多次,所以“更新订单状态”和“写返佣流水”必须做防重处理。常见做法是在订单表加支付状态字段,只有待支付状态下才允许更新为已支付,更新成功才继续写返佣流水。返佣流水表也应有唯一约束,比如order_id + level联合唯一,避免重复入账。
5. 部署和联调阶段的高频问题:现象、原因和解法
5.1 部署阶段的坑:数据库和 IIS 配置
坑 1:数据库还原之后,网站一打开就报登录失败。
现象:SQL Server 还原备份文件正常,但站点访问时报“Cannot open database ... requested by the login”,或者提示用户登录失败。
原因:常见两个。一是备份文件本身是 2008R2 或 2012 的,还原到高版本实例没问题,但如果你的实例版本比备份版本还低,就会直接失败;二是连接串里用的登录名没有映射到这个库,或者 SqlServer 实例没有启用混合验证模式。
解决办法:先确认 SqlServer 实例版本不低于 2008R2,高版本还原低版本备份一般没问题。还原后在“安全性 → 登录名”新建登录名,默认数据库选成商城库,并在“用户映射”里勾选该库的角色db_owner。然后把web.config里的User ID和Password换成这个账号。用 sa 能通、业务账号不通,基本都是映射权限没给全,重新映射即可。
注意:连接串里
Integrated Security=true和User ID/password不能混着写。IIS 应用池默认身份是 ApplicationPoolIdentity,集成认证模式下经常没有数据库权限,不如直接建 SQL Server 账号走混合验证来得稳。
坑 2:IIS 部署后,页面能打开,但 ashx 接口全部 404 或报错。
现象:首页 aspx 正常显示,但页面里的商品列表、上传图片、登录操作全部失败,F12 看接口返回 404,或者 IIS 报错“处理程序 PageHandlerFactory-Integrated 在其模块列表中有一个错误模块”。
原因:IIS 没有启用 ASP.NET 功能,或者应用程序池选了错误的 .NET 版本、托管管道模式不对。ashx 是 HttpHandler,依赖 IIS 的 ASP.NET 模块注册。
解决办法:到“添加角色和功能”里确认已安装“.NET Framework 4.x 功能 → ASP.NET 4.x”。IIS 里右键应用程序池,把 .NET CLR 版本选为 v4.0,托管管道模式选“集成”,然后回收池。另外注意站点对应的处理程序映射里,*.ashx应由PageHandlerFactory处理,如果发现被禁用,运行一下aspnet_regiis.exe -i(用对应 .NET 版本路径)重新注册。
5.2 微信接口联调阶段的坑:支付和菜单
坑 3:微信支付 V3.0 回调payinfo.ashx验签失败,订单一直是未支付。
现象:用户在微信里付款成功,但商城后台订单状态不变,公众号支付记录里回调通知一直报失败。
原因:最常见的是回调地址没有配置成外网可访问的完整 HTTPS 地址,或者商户号、API 密钥和web.config、数据库配置不一致。V3.0 的签名机制对参数顺序敏感,一旦混入多余空格或编码不一致就会验签失败。
解决办法:到微信商户平台的支付回调地址配置里,填完整的 HTTPS 域名路径,直接指到payinfo.ashx,比如https://你的域名/payinfo.ashx。核对payinfo.ashx里读取的商户号和 API 密钥是否跟商户平台一致,特别注意密钥是不是有被复制到多余空格。建议在接口里临时记录原始请求报文和签名,先确认微信服务器确实推过来了,再逐段比对签名串。
坑 4:自定义菜单保存成功,但手机端菜单一直不更新。
现象:后台自定义菜单配置界面返回成功,但公众号菜单还是老样子,或者不同子账号保存互相影响。
原因:一是微信菜单接口本身有缓存,不会立刻全量刷新;二是多公众号环境下,access_token没有按公众号区分缓存,A 公众号保存菜单时用了 B 公众号的 token,结果写进了错误的账号。
解决办法:处理菜单的 handler 里,access_token的缓存键必须带上公众号 AppId,类似Cache["access_token_" + appId],有效时间按微信规定的 7200 秒预留余量,设 7000 秒以内。保存完菜单后,可以用“删除菜单”接口和“查询菜单”接口做一次自检,确认真实环境生效。
5.3 业务逻辑阶段的坑:分销返佣重复计算
坑 5:同一个订单,上级收到两次佣金。
现象:分销模式下,用户付完款,上级在佣金明细里看到两条相同订单的返佣流水,对账怎么都对不上。
原因:微信支付回调不止推一次,同一个支付通知在超时时间内会重复推送。源码里的返佣逻辑如果没做订单状态前置校验,每次回调进来都重新走一遍“更新订单 + 写返佣流水”,就会把佣金算两次。
解决办法:给订单表加支付状态字段,支付回调里先执行带条件的更新:UPDATE Orders SET PayStatus = 1 WHERE OrderId = @OrderId AND PayStatus = 0,如果影响行数为 0,说明订单已经处理过,直接返回成功不再往下执行。返佣流水表加order_id + level唯一索引,真写重了数据库也会直接拦下来。我一般还会在回调处理的事务里把返佣计算包进去,避免订单状态更新成功、返佣写入却失败的不一致场景。
6. 拿到源码后怎么验收:从自测清单到二次开发切口
6.1 用一个真实公众号跑通核心业务全流程
代码部署好、公众号参数配好之后,先别急着验收全部功能,按下面这张表跑一遍核心链路就够了。测试时建议用个人公众号或认证服务号,订阅号没有支付权限,支付环节会卡住。
| 测试项 | 预期结果 | 关注点 |
|---|---|---|
| 关注公众号 | 收到关注回复,验证菜单加载 | 验证公众号配置和 Token 是否生效 |
| 自定义菜单 | 菜单点击能跳转商城页面 | 验证菜单缓存和 token 隔离 |
| 商品上架 | 后台能新增商品,前台可见 | 验证admin_ajax.ashx和首页渲染 |
| 下单支付 | 生成订单,微信支付 V3.0 支付成功 | 验证payinfo.ashx回调 |
| 订单打印 | 后台订单可以打印订单和运单 | 验证打印模板和订单数据 |
| 分销绑定 | 扫推广二维码关注,绑定上下级 | 验证带参二维码和唯一约束 |
| 佣金计算 | 下级支付完成后上级出佣金流水 | 验证幂等处理 |
如果这套流程能在测试环境下完全走通,源码在你手里就是活的。接新客户时,只需要重新配一个公众号,把商户信息和分销比例设置好,就能直接交付使用。
6.2 二次开发最值得改的三处
我拿到这种源码,优先会改三个地方。第一是新增一个统计类 ashx 接口,比如销售排行或者分销佣金汇总,复制现有 handler 的结构返回 JSON,BI 图表分析就能与这个数据对接。示意代码很简单:
public void ProcessRequest(HttpContext context) { context.Response.ContentType = "application/json"; context.Response.Write(BLL.Report.GetSalesRank()); }第二是要换商城模板样式。分销模板和直销模板的页面风格通常在模板配置文件里维护,认准后台“商城模板配置”这个入口,对应的页面文件会集中在某个模板目录里,改的只是前端展示,不影响分销和支付逻辑。第三是运费或者打印模板,订单打印、运单打印的格式一般在打印相关页面里配置,接快递业务时要改的也就是这里。
从那以后,我每次拿到这类源码,第一件事就是改默认后台密码、删掉任何可访问的安装或示例目录、检查upload_ajax.ashx的上传文件白名单,然后完整还原一次数据库再开始改代码。安全边际先守住,后面接客户才不慌。这套资源能不能撑起你自己的项目,取决于你愿不愿意把这份外伤处理干净,源码本身的功能底子是够的,希望帮到你。
本文还有配套的精品资源,点击获取