Mud.Wechat.Channels
1.0.0
dotnet add package Mud.Wechat.Channels --version 1.0.0
NuGet\Install-Package Mud.Wechat.Channels -Version 1.0.0
<PackageReference Include="Mud.Wechat.Channels" Version="1.0.0" />
<PackageVersion Include="Mud.Wechat.Channels" Version="1.0.0" />
<PackageReference Include="Mud.Wechat.Channels" />
paket add Mud.Wechat.Channels --version 1.0.0
#r "nuget: Mud.Wechat.Channels, 1.0.0"
#:package Mud.Wechat.Channels@1.0.0
#addin nuget:?package=Mud.Wechat.Channels&version=1.0.0
#tool nuget:?package=Mud.Wechat.Channels&version=1.0.0
Mud.Wechat.Channels
微信小店 / 视频号(channels 生态)SDK 主包:29 个业务域、394 端点(设计方案 v1 §2.2 原规划 27 域 318 端点;缺失 API 域完善方案在同线新增 Promoter 域与 Talent 域并对既有域逐页补端点)的声明式 HTTP 客户端、模块注册器与 AOT JsonContext 合并。本线覆盖微信小店全部交易管理面(商品 / 订单 / 售后 / 物流 / 资金 / 营销 / 联盟 / 会员 / 代发 / 供货)与视频号内容运营面(直播 / 留资 / 橱窗 / 罗盘 / 带货助手),按分阶段交付推进。
交付状态(权威口径以
Tests/Mud.Wechat.Channels.Tests/ContractGuards/守卫为准)
- ✅ 全量落地:29 域 394 端点(P1 150:Basic 8 / Funds 16 / Product 43 / Order 27 / Aftersale 27 / Logistics 29;P2 199:Resource 8 / Shop 4 / HomePage 14 / Favorite 1 / Category 11 / Brand 8 / Qic 5 / Marketing 7 / Kf 2 / PlatformKf 4 / Vip 5 / MiniStore 10 / Warehouse 11 / League 41 / Delivery 23 / Wecom 1 / Window 9 / Locallife 6 / Subsidy 3 / Live 12 / Compass 14;缺失 API 域完善方案新增 45:Promoter 41 + Talent 4);
- ✅ P3 回调收口:
Mud.Wechat.Channels.Callback承载官方强制 JSON 安全模式回调(见其 README)。实际端点数与设计方案 v1 规划口径的差异(类目 11、橱窗+本地生活 9、券 6、会员 5、直播面 12 含
/channels/ec/finderlive/*双前缀、League 由规划 11 收敛为逐页核验后的 41、带货助手面另立 Talent 域 4(佣金单 2 + 达人橱窗 2,与 Window 域橱窗面是两套官方契约)等)均已按官方文档逐页核验后以逐域守卫定版。
能力面(P1 主干 6 域 150 端点,其余 23 域计数与路由表由 CH-R2 / 逐域守卫锁定)
模块(ChannelsModule) |
注册方法 | 端点 | 接口 |
|---|---|---|---|
Basic |
AddBasicApi() |
8 | IChannelsBasicService(8 端点:域名 IP / callback IP / callback check / clear_quota / clear_quota/v2(方法级 [Token(Disabled = true)] 免令牌应急逃生端点,A-7 合并)/ openapi quota get·clear / rid get;IChannelsBasicTokenFreeService 已 [Obsolete] 过渡保留一版) |
Funds |
AddFundsApi() |
16 | IChannelsFundsService(余额 / 结算账户 / 提现 3 + 流水 4 + 订单流水 + 银行·省市·支行 5 + 资金二维码 2;/shop/funds/* 历史前缀照抄官方原文) |
Product |
AddProductApi() |
43 | IChannelsProductService(商品增改查 / 上下架 / 审核策略与配额 25 + 库存 4 + 赠品 6 + 买赠活动 3 + 限时抢购 5) |
Order |
AddOrderApi() |
27 | IChannelsOrderService(订单查询 / 改价 / 改地址 / 改备注 / 换款 / 盲盒 / 生鲜质检 / 敏感信息解密 / 虚拟号·真实号 / 发货协商 / 用户预约 24 + 商家私密号实名认证 3) |
Aftersale |
AddAftersaleApi() |
27 | IChannelsAftersaleService(售后单 15(含原因 / 拒绝原因字典)+ 纠纷单 4 + 保障单 6 + 拒绝原因) |
Logistics |
AddLogisticsApi() |
29 | IChannelsLogisticsService(地址 5 + 运费模板 4 + 电子面单 17(含打印报文商家 / 供货商双路径)+ 订单发货 3) |
三个模块级入口之外还有 AddAllApis()(只注册已落地域)、AddModules(params ChannelsModule[]) 与 Build()(返回 IServiceCollection)。
用法
// ① 令牌与多小店底座(小店 AppID 独立,与公众号 / 小程序不互通)
builder.Services.AddChannelsApp(builder.Configuration, "ChannelsApps")
// ② 业务模块(增量交付期只注册已落地域;未落地域 fail-fast)
.AddWechatChannelsApi(b => b.AddAllApis());
var product = await productService.GetProductAsync(new ChannelsGetProductRequest
{
ProductId = productId,
DataType = 3, // 1 线上 / 2 草稿 / 3 双份
}, ct);
已踩陷阱与边界(改动前必读)
- MUD005 已知接受:官方契约强制令牌走 Query 参数
access_token,无法改用 Header;URL 遥测已由组件SensitiveUrlRedactor与WechatChannelsException构造期脱敏。 - AddModules 对未落地域 fail-fast:
ChannelsModule枚举成员先于实现全量声明,注册「有枚举值但无注册器」的域即抛InvalidOperationException(增量交付期防误装配静默吞)。当前 29 个成员均已配注册器(ChannelsServiceBuilderTestsT1 锁定),该分支只在未来新增枚举值而漏注册器时触发。 - 双前缀并存照抄官方原文:
/channels/ec/funds/*与/shop/funds/*同为官方在线前缀,禁止「对齐规范」改写(CH-R2 照录锁定)。 - 草稿 / 线上双份数据语义:
product/add|update只影响草稿,需上架 + 审核通过才覆盖线上数据(data_type区分读取面)。 - 同一路由只计 1:与视频号老清单重叠的 5 条商品路由与
aftersale/getaftersaleorder在域内只声明一次;order/get等与 SHIPINHAO 本地生活重叠路由同口径。 - 资金 ≠ 支付:本线
Funds是小店结算 / 提现 / 流水(小店access_token),与微信支付 APIv3(Mud.Wechat.Pay,商户私钥签名)、企微企业支付 / 收银台(Work 线)概念严格区分。 /wxa/vip/*6 端点归 MiniProgram 线:2026-10 逐页核对官方文档确认全部使用小程序 access_token(结论 A)——由小程序线IWxaVipService承载;CH-V1 锁定小店线不得跨线声明任何/wxa/路由。
原 Mud.Wechat.Channels.Abstractions 包面(2026-10 包合并并入本工程,命名空间不变)
微信小店 / 视频号线令牌与多应用基座包:独立令牌类型 Wechat.Channels.AccessToken、双通道签发(/cgi-bin/token + /cgi-bin/stable_token)、多小店管理器、配置面与统一异常。复用 Core 叶层(Mud.Wechat.Abstractions)的令牌存储端口、errcode 恢复链与 SSRF 白名单,零新增存储端口。
公开面
| 面 | 入口 | 说明 |
|---|---|---|
| 令牌类型 | ChannelsTokenTypes.AccessToken |
字面量 "Wechat.Channels.AccessToken",与 Wechat.AccessToken / Wechat.Mp.AccessToken 在共享注册表天然隔离(CH-T1 锁定,不得复用 MpTokenTypes) |
| 签发通道 | IChannelsAuthentication |
GET /cgi-bin/token + POST /cgi-bin/stable_token 双通道;默认稳定通道(ChannelsAppConfig.UseStableToken 切换) |
| 多小店 | AddChannelsApp / IChannelsAppManager / IChannelsAppContextSwitcher |
复用 Core 多应用基座按 AppKey 分槽;小店无「授权企业」scope 概念,不做 UseCorpScope |
| 配置 | ChannelsAppConfig(节 ChannelsApps) |
AppId + AppSecret 必填(Validate() 校验);UseStableToken / BaseUrl / AllowCustomBaseUrl / TimeoutSeconds / TokenRefreshThreshold / IsDefault 均有真实消费点(audit-config-keys 登记) |
| 令牌恢复 | ChannelsTokenInvalidationDetector |
子判定器身份(TryAddEnumerable)接入 Core 判定器追加集;失效码集 {40001, 40014, 42001};WechatTokenRecovery 配置节随 AddChannelsApp(IConfiguration) 绑定(对齐公众号线) |
| 异常 | WechatChannelsException |
继承企微 WechatWorkException 同一基类语义,ThrowIfFailed + 构造期剥离 query / userinfo |
用法
// 配置文件形态(ChannelsApps:0..N 数组)
builder.Services.AddChannelsApp(builder.Configuration, "ChannelsApps")
.AddWechatChannelsApi(b => b.AddAllApis());
// 代码形态(多小店一次性注册;重复 AddChannelsApp 注册期 fail-fast)
builder.Services.AddChannelsApp(configs);
已踩陷阱与边界(改动前必读)
- 令牌注入走 Query(官方契约,MUD005 已知接受):新增任何 Query 凭据参数必须「补齐脱敏词表 / 登记豁免」二选一。
- 配置绑定形态:
section.Bind(o)动作注册(源生成配置绑定器拦截),禁用Configure<T>(IConfiguration)反射重载;配置 DTO 禁required(CS9035)。 - DI 桥接不变量:
IChannelsAppContextSwitcher/IAppContextHolder/IAppContextSwitcher必须同实例且先于AddMudHttpClient注册(顺序颠倒 ⇒ 声明式[Token]客户端上下文恒 null)。 - AppKey 形状经 Core
WechatAppKeyValidator约束(禁:,防跨应用令牌串号)。 - errcode 判定面:签发面 40001 抛业务异常、业务面进恢复链——由
ShouldInspect白名单(WechatApiHosts+ 显式登记的自定义主机)预过滤,自定义BaseUrl必须登记WechatCustomBaseUrlRegistry,否则私有化部署静默失去令牌恢复能力。 - 不新建令牌管理器:普通 / 稳定两通道即两个管理器实现,按
UseStableToken注册期装配;不要为「多店」再拆管理器(多店靠 AppKey 分槽)。
原 Mud.Wechat.Channels.DataModels 包面(2026-10 包合并并入本工程,命名空间不变)
微信小店 / 视频号线官方 DTO 包:[HttpJsonSerializable] 标注的请求 / 响应 / 嵌套对象模型 + 生成物 Generated/*JsonContext.g.cs(AOT JSON 上下文)。零业务逻辑、零 HTTP 语义——接口声明在主包,序列化语义在生成上下文。
公开面
目录(本包 DataModels/ 之下,2026-10 源码归类:只动目录不动命名空间,AB-G10 校验) |
域 | 状态 |
|---|---|---|
Basic/ |
基础接口 | ✅ P1 |
Funds/ |
资金结算 | ✅ P1 |
Product/ |
商品管理(商品 / 库存 / 赠品 / 买赠 / 限时抢购) | ✅ P1 |
Order/ |
订单管理 | ✅ P1 |
Aftersale/ |
售后管理(售后单 / 纠纷单 / 保障单) | ✅ P1 |
Logistics/ |
物流发货(地址 / 运费模板 / 电子面单 / 发货) | ✅ P1 |
ChannelsResponse.cs |
基线响应(errcode/errmsg,实现 IWechatApiResponse) |
✅ |
DataModels/Generated/ |
31 个域 JsonContext(每业务域一个 + Common,internal,与本线类型同程序集;InternalsVisibleTo 只开放给测试工程) |
随域增长 |
P2 各域 DTO 随接口落地同批进入本包(命名空间 Mud.Wechat.Channels.DataModels.{域})。
- 文件布局:一类型一文件(文件名 == 类型名);域目录下的功能族子目录仅作组织、不入命名空间(命名空间恒为
...DataModels.{域},SerializerClassName仍取域段)。回调域按事件族建子目录(一份载荷族一目录,含 2 个类型也对称落位),其余域按端点族归组;不属于任何既有分组的类型留域根,不强行归族。
已踩陷阱与边界(改动前必读)
- 生成物勿手改:
Generated/*JsonContext.g.cs由scripts/GenerateJsonContext.ps1生成并提交版本控制;新增 / 修改 DTO 后必须重跑AddHttpJsonSerializable.ps1+GenerateJsonContext.ps1,并同批更新逐域守卫的登记计数断言。 - 官方参数名照抄:含官方历史拼写(如售后
USER_CANCELD、保障STATUS_WAIT_OP_COMFIRM),勿「顺手纠正」——逐域守卫以字面量锁定,改动即变红。 SerializerClassName= 命名空间域段(如Aftersale);常量类(static class+public const)不得标[HttpJsonSerializable](无序列化语义,逐域守卫锁定)。- 共用 DTO 裁决:字段集一致的端点共用请求 / 响应模型(如
ChannelsAftersaleReshipRequest三个发货端点共用),严禁同字段重复建模;两个独立官方端点参数表可独立演化时按端点分建(如纠纷留言 / 举证两请求)并在守卫记录裁决理由。 - 官方反直觉点:多数查询接口官方即 POST;
product/auditstrategy/get、getauditquota、aftersale/reason/get、rejectreason/get等为「POST + 空请求体」形态,不得人为造请求体 DTO。
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net5.0 was computed. net5.0-windows was computed. net6.0 is compatible. net6.0-android was computed. net6.0-ios was computed. net6.0-maccatalyst was computed. net6.0-macos was computed. net6.0-tvos was computed. net6.0-windows was computed. net7.0 was computed. net7.0-android was computed. net7.0-ios was computed. net7.0-maccatalyst was computed. net7.0-macos was computed. net7.0-tvos was computed. net7.0-windows was computed. net8.0 is compatible. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. net9.0 was computed. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. net10.0 is compatible. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
| .NET Core | netcoreapp2.0 was computed. netcoreapp2.1 was computed. netcoreapp2.2 was computed. netcoreapp3.0 was computed. netcoreapp3.1 was computed. |
| .NET Standard | netstandard2.0 is compatible. netstandard2.1 was computed. |
| .NET Framework | net461 was computed. net462 was computed. net463 was computed. net47 was computed. net471 was computed. net472 was computed. net48 was computed. net481 was computed. |
| MonoAndroid | monoandroid was computed. |
| MonoMac | monomac was computed. |
| MonoTouch | monotouch was computed. |
| Tizen | tizen40 was computed. tizen60 was computed. |
| Xamarin.iOS | xamarinios was computed. |
| Xamarin.Mac | xamarinmac was computed. |
| Xamarin.TVOS | xamarintvos was computed. |
| Xamarin.WatchOS | xamarinwatchos was computed. |
-
.NETStandard 2.0
- Microsoft.Extensions.Configuration.Binder (>= 10.0.12)
- Microsoft.Extensions.DependencyInjection.Abstractions (>= 10.0.12)
- Microsoft.Extensions.Hosting.Abstractions (>= 8.0.1)
- Microsoft.Extensions.Http (>= 8.0.1)
- Microsoft.Extensions.Logging.Abstractions (>= 10.0.12)
- Microsoft.Extensions.Options (>= 10.0.12)
- Mud.HttpUtils (>= 3.0.9)
- Mud.HttpUtils.Attributes (>= 3.0.9)
- Mud.Wechat.Abstractions (>= 1.0.0)
- System.Text.Json (>= 10.0.12)
-
net10.0
- Microsoft.Extensions.Configuration.Binder (>= 10.0.12)
- Microsoft.Extensions.DependencyInjection.Abstractions (>= 10.0.12)
- Microsoft.Extensions.Hosting.Abstractions (>= 10.0.9)
- Microsoft.Extensions.Http (>= 10.0.9)
- Microsoft.Extensions.Logging.Abstractions (>= 10.0.12)
- Microsoft.Extensions.Options (>= 10.0.12)
- Mud.HttpUtils (>= 3.0.9)
- Mud.HttpUtils.Attributes (>= 3.0.9)
- Mud.Wechat.Abstractions (>= 1.0.0)
-
net6.0
- Microsoft.Extensions.Configuration.Binder (>= 10.0.12)
- Microsoft.Extensions.DependencyInjection.Abstractions (>= 10.0.12)
- Microsoft.Extensions.Hosting.Abstractions (>= 8.0.1)
- Microsoft.Extensions.Http (>= 8.0.1)
- Microsoft.Extensions.Logging.Abstractions (>= 10.0.12)
- Microsoft.Extensions.Options (>= 10.0.12)
- Mud.HttpUtils (>= 3.0.9)
- Mud.HttpUtils.Attributes (>= 3.0.9)
- Mud.Wechat.Abstractions (>= 1.0.0)
-
net8.0
- Microsoft.Extensions.Configuration.Binder (>= 10.0.12)
- Microsoft.Extensions.DependencyInjection.Abstractions (>= 10.0.12)
- Microsoft.Extensions.Hosting.Abstractions (>= 10.0.9)
- Microsoft.Extensions.Http (>= 10.0.9)
- Microsoft.Extensions.Logging.Abstractions (>= 10.0.12)
- Microsoft.Extensions.Options (>= 10.0.12)
- Mud.HttpUtils (>= 3.0.9)
- Mud.HttpUtils.Attributes (>= 3.0.9)
- Mud.Wechat.Abstractions (>= 1.0.0)
NuGet packages (1)
Showing the top 1 NuGet packages that depend on Mud.Wechat.Channels:
| Package | Downloads |
|---|---|
|
Mud.Wechat.Channels.Callback
微信小店/视频号(channels 生态)SDK 回调接收包:URL 验证(GET echostr 回显)、msg_signature 验签、AES 解密(官方强制 JSON + 安全模式)、AppId 校验、抗重放指纹、事件分发(信封级 + 类型化处理器与拦截器,net8+ 类型化通道)的 HTTP 中间件与多应用路由;42 个官方回调事件键经 [ChannelsCallbackContract] 声明式登记。 |
GitHub repositories
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated |
|---|---|---|
| 1.0.0 | 72 | 10/29/2026 |