凌峰创科服务平台

ASP.NET微信网站如何开发与实现?

核心概念:微信网站 vs. 微信公众号 vs. 微信小程序

在开始之前,必须明确这三者的区别,因为很多人会混淆它们。

ASP.NET微信网站如何开发与实现?-图1
(图片来源网络,侵删)
特性 微信网站 微信公众号 微信小程序
本质 一个标准的、基于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)              | |
|  +-----------------------------------------------+ |
+-----------------------------------------------------+

核心组件:

  1. ASP.NET Core / ASP.NET MVC / Razor Pages: 网站的后端框架,负责处理业务逻辑、渲染页面、提供API接口。
  2. ASP.NET Identity: 用于处理用户注册、登录、角色管理等,我们可以将其与微信登录打通。
  3. OWIN / Middleware: 用于处理微信的OAuth2.0授权流程。
  4. HttpClient: 用于调用微信官方提供的各种API(如获取用户信息、获取JS-SDK权限等)。
  5. JavaScript SDK: 微信官方提供的JS-SDK,用于在网页中调用微信的原生能力,如分享、扫一扫、拍照等。

关键功能实现

微信登录 (OAuth2.0 授权)

这是微信网站最核心的功能之一,让用户无需注册即可使用网站,并获取其微信昵称、头像等信息。

ASP.NET微信网站如何开发与实现?-图2
(图片来源网络,侵删)

流程:

  1. 用户在你的网站上点击“微信登录”按钮。
  2. 你的网站将用户重定向到微信的授权URL。
  3. 用户在微信内确认授权。
  4. 微信将用户重定向回你网站预先设定的回调地址,并附带一个临时的code
  5. 你的网站后端使用这个code,向微信服务器请求换取access_token
  6. 使用access_token获取用户的openid和基本信息(昵称、头像等)。
  7. 将用户信息存入你的数据库(或与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微信网站如何开发与实现?-图3
(图片来源网络,侵删)
  1. 后端生成签名:你的ASP.NET后端需要根据微信官方算法,生成一个签名。
  2. 前端注入配置:后端将签名、AppID、时间戳等参数传递给前端页面。
  3. 前端调用API:页面加载后,JS-SDK的wx.config进行初始化,然后调用wx.updateAppMessageShareDatawx.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}&timestamp={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支付核心流程:

  1. 用户在你的网站(手机端)点击“立即购买”。
  2. 你的后端根据商品信息,生成一个统一的预支付交易单,并调用微信支付的统一下单接口。
  3. 微信支付接口返回一个prepay_id
  4. 你的后端使用prepay_id和你的密钥,生成一个支付签名
  5. 后端将appId, timeStamp, nonceStr, package, signTypepaySign等参数返回给前端。
  6. 前端调用微信内置的wx.chooseWXPay方法,调起微信支付界面。
  7. 用户输入密码完成支付,微信会根据你设置的回调地址通知你的服务器支付结果。

开发步骤总结

  1. 注册微信公众平台账号

    • 访问 微信公众平台,注册一个服务号(订阅号没有微信登录和支付权限)。
    • 获取AppIDAppSecret,这两个是调用微信API的凭证。
  2. 配置网站域名

    • 登录微信公众平台 -> 设置 -> 公众号设置 -> 功能设置 -> 网页授权域名。
    • 将你的ASP.NET网站域名添加进去,并验证,微信会向你的域名发送一个文件来验证所有权。
  3. 创建ASP.NET项目

    • 使用 Visual Studio 创建一个新的 ASP.NET Core MVC 或 Razor Pages 项目。
    • 推荐使用 .NET 6 或更高版本。
  4. 实现后端逻辑

    • 创建一个Controller(如WeChatController)来处理所有与微信相关的请求。
    • 实现微信登录的OAuth2.0流程。
    • 实现JS-SDK签名生成逻辑。
    • 实现微信支付的统一下单和回调处理逻辑。
  5. 实现前端交互

    • 在需要登录的页面,放置“微信登录”按钮,并链接到/WeChat/Login
    • 在需要分享的页面,引入微信JS-SDK,并调用后端接口获取配置,然后调用wx.ready和分享API。
  6. 部署与测试

    • 将你的ASP.NET网站部署到云服务器(如Azure, 阿里云, 腾讯云)上。
    • 重要:所有微信相关的功能(登录、分享、支付)必须在微信内置浏览器中测试,因为微信JS-SDK只在微信环境中有效。

最佳实践与注意事项

  • HTTPS是必须的:微信的所有API调用都要求使用HTTPS协议,你的网站必须配置SSL证书。
  • 域名配置:确保你的域名已在微信公众平台正确配置,否则微信授权和JS-SDK都会失败。
  • 安全性
    • 保护AppSecretAppSecret绝不能泄露,不要放在前端代码中,后端应妥善保管。
    • 使用State参数:在OAuth2.0流程中,务必使用state参数来防止CSRF攻击。
    • 验证支付回调:微信支付成功后,会异步通知你的服务器,你必须对通知中的签名进行验证,防止伪造的支付成功通知。
  • 用户体验
    • 在微信内打开的网站,要做成响应式设计,适配手机屏幕。
    • 考虑使用微信的UI风格,让用户感觉更亲切。
  • 官方文档:遇到任何问题,第一手资料永远是微信官方文档,尤其是公众号开发部分。

希望这份详细的指南能帮助你顺利开始你的ASP.NET微信网站项目!

分享:
扫描分享到社交APP
上一篇
下一篇