微信小程序后台用 C# 完全可行,但要注意:微信官方 SDK 只提供 Java、Node.js、PHP 和 Python 版本,
没有官方 C# SDK。你得自己封装接口,或用社区维护的第三方库(如
Senparc.Weixin),否则容易在签名、解密、模板消息等环节翻车。
用 Senparc.Weixin 快速接入微信开放接口
这是目前最成熟的 C# 微信 SDK,支持公众号、小程序、开放平台,且持续更新。它把
code2Session、
getPhoneNumber、
sendTemplateMessage等高频接口都做了封装,也处理了 AES-128-CBC 解密、SHA256 签名等底层细节。
实操建议:
通过 NuGet 安装Senparc.Weixin.MP(小程序用这个包,不是
.SDK) 初始化时必须设置
AppId、
AppSecret和
Token(后者仅用于消息服务器校验,小程序后台通常不用) 调用
WxOpenApi.GetSessionInfoAsync()换取
openid和
session_key,注意传入的
code是前端
wx.login()返回的一次性临时码 别直接存
session_key—— 它有效期约 2 小时,且微信不允许多次使用;解密用户数据(如手机号、加密字段)后应立即用完丢弃
解密微信用户敏感数据(如手机号)的坑
前端调用
wx.getPhoneNumber()后拿到
encryptedData和
iv,后端需用
session_key解密。C# 默认的
AesCryptoServiceProvider容易出错,因为微信要求: 填充模式必须是
PKCS7(不是
None或
PKCS5) 块大小必须是
128位(即 16 字节)
iv是 base64 编码字符串,解密前要先
Convert.FromBase64String()
session_key本身也是 base64 编码,且长度固定为 24 字节(对应 192 位密钥)
用
Senparc.Weixin的
DecryptHelper.DecryptPhoneData()可绕过这些细节;自己写的话,务必核对
Aes.Mode = CipherMode.CBC和
Aes.Padding = PaddingMode.PKCS7。
HTTPS + 域名备案是硬门槛,本地调试得绕过
微信小程序强制要求所有后台接口走 HTTPS,且域名必须在「小程序后台 → 开发管理 → 服务器域名」中配置,且该域名需完成 ICP 备案(个人主体只能备案一个域名)。这意味着:
localhost / 127.0.0.1 / 内网 IP 全部无法直连,request:fail net::ERR_CONNECTION_REFUSED是常见报错 开发阶段可用
ngrok或
localtunnel映射本地端口到 HTTPS 地址(如
https://xxx.ngrok.io),再填进小程序后台 正式部署时,IIS 要绑定 SSL 证书,且确保
web.config中未禁用 TLS 1.2(微信服务器只支持 TLS 1.2+) C# Web API 若用 Kestrel,默认不支持 HTTPS 重定向,需在
Startup.Configure()加
app.UseHttpsRedirection()
模板消息已废弃,用订阅消息替代
微信在 2022 年全面下线模板消息接口(
sendTemplateMessage),现在统一用「订阅消息」,规则更严格: 用户必须主动点击按钮触发
openSetting或
requestSubscribeMessage,才能获得一次授权 后端调用的是新接口
https://api.weixin.qq.com/cgi-bin/message/subscribe/send,参数结构不同(比如用
template_id替代
template_id_short)
Senparc.Weixinv6.9.0+ 已支持
WxOpenApi.SendSubscribeMessageAsync(),但要注意返回的
errcode:-1 是系统繁忙,43101 是用户拒订,41028 是参数缺失 测试时用体验版无法触发订阅弹窗,必须用真机扫码「线上版本」或「开发版」
真正难的不是写代码,而是微信那些隐性规则:比如
session_key不能复用、解密失败不报具体错误、域名备案卡两周、订阅消息授权链路断一环就全白搭。留好日志,尤其记录
encryptedData、
iv、
session_key和时间戳,出问题时才有依据比对。
