核心概念:微信网站 vs. 微信公众号 vs. 微信小程序
在开始之前,必须明确这三者的区别,因为很多人会混淆它们。

| 特性 | 微信网站 | 微信公众号 | 微信小程序 |
|---|---|---|---|
| 本质 | 一个标准的、基于Web技术的网站(如ASP.NET MVC/Razor Pages)。 | 一个在微信内的应用平台,有粉丝、消息推送等能力。 | 一个运行在微信内的“轻量级”应用,无需下载安装。 |
| 访问方式 | 通过浏览器直接访问(URL),或通过公众号菜单、小程序内嵌页面跳转。 | 在微信内搜索、扫码或从公众号列表进入。 | 在微信内搜索、扫码或从发现页进入。 |
| 技术栈 | HTML, CSS, JavaScript, ASP.NET MVC/Razor Pages, Web API。 | 微信提供的API,用于获取用户信息、发送模板消息等。 | 微信官方提供的WXML, WXSS, JavaScript和一套组件库。 |
| 主要功能 | 品牌展示、产品销售、内容营销,可以集成微信登录、微信支付、微信分享等。 | 用户互动、内容推送、服务号,可以自定义菜单、自动回复、群发消息。 | 特定场景下的工具或服务,如点餐、打车、预约等。 |
| 部署方式 | 部署在传统的Web服务器(IIS)或云服务(Azure, 阿里云)上。 | 微信服务器管理。 | 微信服务器管理。 |
你想做的“微信网站”,大概率是指一个拥有微信登录、微信支付、微信分享等功能的ASP.NET网站,这个网站本身是独立的,但通过微信的开放能力,为微信用户提供最佳的体验。
技术架构与核心组件
一个典型的ASP.NET微信网站架构如下:
+-----------------------------------------------------+
| 用户浏览器 (微信内置浏览器) |
+-----------------------+-----------------------------+
| | |
| v |
| +-------------------------------------------+ |
| | 微信服务器 (处理OAuth2.0和JS-SDK) | |
| +-----------------------+-------------------+ |
| | |
| v |
| +----------------------+ | |
| | 你的ASP.NET网站 | <----+ (API调用) |
| | (部署在IIS/Azure) | |
| | | |
| | - ASP.NET MVC/Razor | |
| | - ASP.NET Web API | |
| | - Identity (身份认证)| |
| | - Entity Framework | |
| | - SignalR (实时通信)| |
| +----------------------+ |
| | |
| v |
| +-----------------------------------------------+ |
| | 数据库 (SQL Server / MySQL) | |
| +-----------------------------------------------+ |
+-----------------------------------------------------+
核心组件:
- ASP.NET Core / ASP.NET MVC / Razor Pages: 网站的后端框架,负责处理业务逻辑、渲染页面、提供API接口。
- ASP.NET Identity: 用于处理用户注册、登录、角色管理等,我们可以将其与微信登录打通。
- OWIN / Middleware: 用于处理微信的OAuth2.0授权流程。
- HttpClient: 用于调用微信官方提供的各种API(如获取用户信息、获取JS-SDK权限等)。
- JavaScript SDK: 微信官方提供的JS-SDK,用于在网页中调用微信的原生能力,如分享、扫一扫、拍照等。
关键功能实现
微信登录 (OAuth2.0 授权)
这是微信网站最核心的功能之一,让用户无需注册即可使用网站,并获取其微信昵称、头像等信息。

流程:
- 用户在你的网站上点击“微信登录”按钮。
- 你的网站将用户重定向到微信的授权URL。
- 用户在微信内确认授权。
- 微信将用户重定向回你网站预先设定的回调地址,并附带一个临时的
code。 - 你的网站后端使用这个
code,向微信服务器请求换取access_token。 - 使用
access_token获取用户的openid和基本信息(昵称、头像等)。 - 将用户信息存入你的数据库(或与ASP.NET Identity关联),并创建一个本地登录会话。
ASP.NET Core 后端实现示例 (Controller):
public class WeChatController : Controller
{
private readonly IHttpClientFactory _httpClientFactory;
private readonly string _appId = "你的AppID";
private readonly string _appSecret = "你的AppSecret";
public WeChatController(IHttpClientFactory httpClientFactory)
{
_httpClientFactory = httpClientFactory;
}
// 第1步:跳转到微信授权页面
public IActionResult Login()
{
var redirectUri = Url.Action("Callback", "WeChat", null, Request.Scheme);
var state = Guid.NewGuid().ToString("N"); // 用于防止CSRF攻击
// 将state存入Session或TempData
HttpContext.Session.SetString("WeChatState", state);
var authUrl = $"https://open.weixin.qq.com/connect/qrconnect?" +
$"appid={_appId}&" +
$"redirect_uri={Uri.EscapeDataString(redirectUri)}&" +
$"response_type=code&" +
$"scope=snsapi_login&" +
$"state={state}#wechat_redirect";
return Redirect(authUrl);
}
// 第5步:微信回调处理
public async Task<IActionResult> Callback(string code, string state)
{
// 验证state是否匹配,防止CSRF
var savedState = HttpContext.Session.GetString("WeChatState");
if (state != savedState)
{
return BadRequest("Invalid state.");
}
// 第6步:使用code换取access_token
var tokenUrl = $"https://api.weixin.qq.com/sns/oauth2/access_token?" +
$"appid={_appId}&" +
$"secret={_appSecret}&" +
$"code={code}&" +
$"grant_type=authorization_code";
var client = _httpClientFactory.CreateClient();
var tokenResponse = await client.GetStringAsync(tokenUrl);
var tokenResult = JsonConvert.DeserializeObject<WeChatTokenResult>(tokenResponse);
if (tokenResult.errcode != 0)
{
// 处理错误
return BadRequest("Failed to get token from WeChat.");
}
// 再次请求获取用户信息
var userInfoUrl = $"https://api.weixin.qq.com/sns/userinfo?access_token={tokenResult.access_token}&openid={tokenResult.openid}";
var userInfoResponse = await client.GetStringAsync(userInfoUrl);
var userInfo = JsonConvert.DeserializeObject<WeChatUserInfo>(userInfoResponse);
// 第7步:处理用户登录逻辑
// 1. 检查用户是否已存在(通过openid)
// 2. 如果不存在,则创建新用户(关联到ASP.NET Identity)
// 3. 如果存在,则直接登录
// ... 这里是具体的用户登录/注册代码 ...
return RedirectToAction("Index", "Home");
}
}
// 定义微信返回的数据模型
public class WeChatTokenResult
{
public string access_token { get; set; }
public string openid { get; set; }
public string unionid { get; set; }
public int expires_in { get; set; }
public int errcode { get; set; }
public string errmsg { get; set; }
}
public class WeChatUserInfo
{
public string openid { get; set; }
public string nickname { get; set; }
public int sex { get; set; }
public string province { get; set; }
public string city { get; set; }
public string country { get; set; }
public string headimgurl { get; set; }
public string privilege { get; set; }
}
微信分享 (JS-SDK)
想让用户将你的网站内容分享到微信好友或朋友圈,需要使用微信的JS-SDK。
流程:

- 后端生成签名:你的ASP.NET后端需要根据微信官方算法,生成一个签名。
- 前端注入配置:后端将签名、AppID、时间戳等参数传递给前端页面。
- 前端调用API:页面加载后,JS-SDK的
wx.config进行初始化,然后调用wx.updateAppMessageShareData或wx.updateTimelineShareData来设置分享内容。
ASP.NET Core 后端生成签名示例:
public class WeChatController : Controller
{
// ... 其他代码 ...
public IActionResult GetShareConfig(string url)
{
// 1. 获取access_token (通过公众号的AppID和Secret)
var accessToken = GetAccessToken(); // 你需要自己实现这个方法来获取access_token
// 2. 获取ticket
var ticketUrl = $"https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token={accessToken}&type=jsapi";
var client = _httpClientFactory.CreateClient();
var ticketResponse = await client.GetStringAsync(ticketUrl);
var ticketResult = JsonConvert.DeserializeObject<JsApiTicketResult>(ticketResponse);
// 3. 生成签名
var noncestr = Guid.NewGuid().ToString("N").Substring(0, 16);
var timestamp = DateTimeOffset.Now.ToUnixTimeSeconds().ToString();
// 注意:这里的url必须是当前页面的完整URL,并且要和前端页面JS里的url参数保持一致
var stringToSign = $"jsapi_ticket={ticketResult.ticket}&noncestr={noncestr}×tamp={timestamp}&url={url}";
var signature = Sha1Helper.GetSha1Hash(stringToSign);
var config = new
{
appId = _appId,
timestamp = timestamp,
nonceStr = noncestr,
signature = signature,
jsApiList = new[] { "updateAppMessageShareData", "updateTimelineShareData" }
};
return Json(config);
}
}
前端页面调用示例:
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no">微信分享测试</title>
<script src="https://res.wx.qq.com/open/js/jweixin-1.6.0.js"></script>
</head>
<body>
<h1>欢迎来到我的网站!</h1>
<button id="shareBtn">分享给朋友</button>
<script>
// 获取当前页面的URL
var currentUrl = window.location.href.split('#')[0];
// 从后端获取配置
fetch('/WeChat/GetShareConfig?url=' + encodeURIComponent(currentUrl))
.then(response => response.json())
.then(config => {
// 初始化JS-SDK
wx.config({
beta: true,
debug: false, // 开启调试模式
appId: config.appId,
timestamp: config.timestamp,
nonceStr: config.nonceStr,
signature: config.signature,
jsApiList: config.jsApiList
});
wx.ready(function () {
// 分享给朋友
wx.updateAppMessageShareData({
title: '我发现了超棒的ASP.NET网站!', // 分享标题
desc: '这个网站集成了微信登录和分享功能,非常强大!', // 分享描述
link: currentUrl, // 分享链接
imgUrl: 'https://your-website.com/images/logo.png', // 分享图标
success: function () {
// alert('分享成功');
}
});
// 分享到朋友圈
wx.updateTimelineShareData({
title: '我发现了超棒的ASP.NET网站!', // 分享标题
link: currentUrl, // 分享链接
imgUrl: 'https://your-website.com/images/logo.png', // 分享图标
success: function () {
// alert('分享到朋友圈成功');
}
});
});
wx.error(function (res) {
alert('JS-SDK初始化失败: ' + res.errMsg);
});
});
</script>
</body>
</html>
微信支付
微信支付流程相对复杂,通常用于电商网站,主要分为两种场景:
- H5支付:在手机浏览器(如微信内置浏览器)中调起微信支付。
- JSAPI支付:在公众号或小程序中调起支付。
H5支付核心流程:
- 用户在你的网站(手机端)点击“立即购买”。
- 你的后端根据商品信息,生成一个统一的预支付交易单,并调用微信支付的统一下单接口。
- 微信支付接口返回一个
prepay_id。 - 你的后端使用
prepay_id和你的密钥,生成一个支付签名。 - 后端将
appId,timeStamp,nonceStr,package,signType和paySign等参数返回给前端。 - 前端调用微信内置的
wx.chooseWXPay方法,调起微信支付界面。 - 用户输入密码完成支付,微信会根据你设置的回调地址通知你的服务器支付结果。
开发步骤总结
-
注册微信公众平台账号:
- 访问 微信公众平台,注册一个服务号(订阅号没有微信登录和支付权限)。
- 获取
AppID和AppSecret,这两个是调用微信API的凭证。
-
配置网站域名:
- 登录微信公众平台 -> 设置 -> 公众号设置 -> 功能设置 -> 网页授权域名。
- 将你的ASP.NET网站域名添加进去,并验证,微信会向你的域名发送一个文件来验证所有权。
-
创建ASP.NET项目:
- 使用 Visual Studio 创建一个新的 ASP.NET Core MVC 或 Razor Pages 项目。
- 推荐使用 .NET 6 或更高版本。
-
实现后端逻辑:
- 创建一个Controller(如
WeChatController)来处理所有与微信相关的请求。 - 实现微信登录的OAuth2.0流程。
- 实现JS-SDK签名生成逻辑。
- 实现微信支付的统一下单和回调处理逻辑。
- 创建一个Controller(如
-
实现前端交互:
- 在需要登录的页面,放置“微信登录”按钮,并链接到
/WeChat/Login。 - 在需要分享的页面,引入微信JS-SDK,并调用后端接口获取配置,然后调用
wx.ready和分享API。
- 在需要登录的页面,放置“微信登录”按钮,并链接到
-
部署与测试:
- 将你的ASP.NET网站部署到云服务器(如Azure, 阿里云, 腾讯云)上。
- 重要:所有微信相关的功能(登录、分享、支付)必须在微信内置浏览器中测试,因为微信JS-SDK只在微信环境中有效。
最佳实践与注意事项
- HTTPS是必须的:微信的所有API调用都要求使用HTTPS协议,你的网站必须配置SSL证书。
- 域名配置:确保你的域名已在微信公众平台正确配置,否则微信授权和JS-SDK都会失败。
- 安全性:
- 保护AppSecret:
AppSecret绝不能泄露,不要放在前端代码中,后端应妥善保管。 - 使用State参数:在OAuth2.0流程中,务必使用
state参数来防止CSRF攻击。 - 验证支付回调:微信支付成功后,会异步通知你的服务器,你必须对通知中的签名进行验证,防止伪造的支付成功通知。
- 保护AppSecret:
- 用户体验:
- 在微信内打开的网站,要做成响应式设计,适配手机屏幕。
- 考虑使用微信的UI风格,让用户感觉更亲切。
- 官方文档:遇到任何问题,第一手资料永远是微信官方文档,尤其是公众号开发部分。
希望这份详细的指南能帮助你顺利开始你的ASP.NET微信网站项目!
