杰瑞科技汇

微信开发教程 net

微信开发教程 (.NET Core / .NET Framework 版)

目录

  1. 准备工作:你需要什么?
    • 微信公众号/小程序/企业微信账号
    • 开发环境 (.NET SDK / Visual Studio)
    • 本地调试工具 (ngrok)
  2. 核心概念:服务器配置与消息接收
    • 服务器配置 (URL, Token, EncodingAESKey)
    • 消息签名验证 (核心安全机制)
    • 接收和回复文本/图片等消息
  3. 高级功能:API 调用与网页授权
    • 获取 Access Token (全局唯一票据)
    • 自定义菜单创建
    • 网页授权获取用户信息 (OAuth2.0)
  4. 实战项目:一个简单的自动回复机器人
    • 项目结构
    • 代码实现
    • 部署与发布
  5. 进阶与资源
    • 小程序开发简介
    • 微信支付
    • 推荐的 .NET 微信开发库

准备工作:你需要什么?

1 微信公众号账号

  • 订阅号:适合媒体、个人创作者,功能相对简单,认证后可拥有高级接口。
  • 服务号:适合企业、组织,功能强大,可获取用户信息、微信支付等。
  • 建议:初学者使用测试号进行开发,无需认证,功能齐全,访问 微信公众平台测试号申请

2 开发环境

  • .NET SDK: 安装最新版本的 .NET SDK (推荐 .NET 6/7/8)。
  • IDE: Visual Studio 2025 或 VS Code。
  • 项目模板: 创建一个 ASP.NET Core 空项目Web API 项目,我们以空项目为例,因为它更轻量。

3 本地调试工具

微信服务器需要通过公网 IP 访问你的服务,本地开发时,我们可以使用 ngrok 工具将本地的 localhost:5001 映射到一个公网 URL。

  • 下载: ngrok 官网
  • 使用:
    1. 启动你的 .NET 项目 (dotnet run)。
    2. 在命令行中运行: ngrok http 5001 (假设你的项目运行在 5001 端口)。
    3. ngrok 会生成一个类似 https://xxxxxxxx.ngrok.io 的公网地址,这个地址就是你用来配置微信服务器的 URL。

核心概念:服务器配置与消息接收

这是微信开发最基础也是最重要的一步。

1 服务器配置

  1. 登录 微信公众平台 -> 设置与开发 -> 基本配置。
  2. 点击“服务器配置” -> “修改配置”。
  3. 填写以下信息:
    • URL: 你部署在公网的服务器地址,https://xxxxxxxx.ngrok.io/api/wechat
    • Token: 可以任意填写,用于验证请求是否来自微信。
    • EncodingAESKey: 随机生成或填写,用于消息加解密(可选,先不填)。
    • 消息加解密方式: 选择 明文模式 (最简单)。

2 消息签名验证

当微信服务器向你的 URL 发送请求时,会带上几个参数:signature, timestamp, nonce, echostr,你需要验证 signature 是否正确,以确认请求来源是微信。

验证逻辑:

  1. 获取 token, timestamp, nonce 三个参数。
  2. 将它们按字典序排序。
  3. 将排序后的三个参数字符串拼接成一个字符串,并进行 SHA1 加密。
  4. 将加密后的字符串与微信传来的 signature 进行对比,如果相同,则验证通过。

3 接收和回复消息

微信服务器向你的 URL 发送的是 POST 请求,消息格式为 XML,你的服务器需要解析这个 XML,并根据内容返回一个符合规范的 XML 响应给微信服务器,微信服务器再将这个响应推送给用户。

消息类型:

  • 文本消息 (text)
  • 图片消息 (image)
  • 事件推送 (event,如关注、点击菜单等)

实战项目:一个简单的自动回复机器人

我们将创建一个 ASP.NET Core 项目,实现一个能接收文本消息并自动回复的机器人。

1 项目结构

WeChatDemo/
├── Controllers/
│   └── WeChatController.cs  // 处理微信所有请求的控制器
├── Models/
│   └── WeChatMessage.cs     // 微信消息的C#模型
├── Services/
│   └── WeChatService.cs    // 处理消息逻辑和验证逻辑
└── Program.cs

2 代码实现

安装 NuGet 包 我们使用一个强大的 .NET 微信开发库来简化开发:Senparc.Weixin。 在 NuGet 包管理器控制台中运行:

Install-Package Senparc.Weixin
Install-Package Senparc.Weixin.MP  // 微信公众号SDK
Install-Package Senparc.Weixin.Cache.Redis // 可选,用于分布式缓存

配置 WeChatService.cs 这个类负责处理验证和消息逻辑。

// Services/WeChatService.cs
using Microsoft.AspNetCore.Mvc;
using Senparc.Weixin.MP;
using Senparc.Weixin.MP.MessageHandlers;
using Senparc.Weixin.MP.Entities;
using Senparc.Weixin.MP.Entities.Request;
using System.IO;
using System.Threading.Tasks;
using Microsoft.Extensions.Options;
using Senparc.Weixin.MP.TenPay;
public class WeChatService
{
    private readonly string _token;
    private readonly string _appId;
    private readonly string _appSecret;
    // 从 appsettings.json 中读取配置
    public WeChatService(IOptions<WeChatOptions> options)
    {
        var weChatOptions = options.Value;
        _token = weChatOptions.Token;
        _appId = weChatOptions.AppId;
        _appSecret = weChatOptions.AppSecret;
    }
    // 处理请求的核心方法
    public async Task<string> HandleRequestAsync(Stream inputStream)
    {
        // 使用 Senparc.Weixin 提供的 MessageHandler 基类
        var messageHandler = new CustomMessageHandler(inputStream, _token, _appId, _appSecret);
        // Senparc.Weixin 会自动处理验证请求和消息解析
        await messageHandler.ExecuteAsync();
        // 返回处理结果(XML格式)
        return messageHandler.ExecuteResult();
    }
    // 自定义消息处理逻辑
    private class CustomMessageHandler : MessageHandler<CustomMessageContext>
    {
        public CustomMessageHandler(Stream inputStream, string token, string appId, string appSecret) 
            : base(inputStream, token, appId, appSecret)
        {
        }
        // 重写文本消息处理方法
        public override IResponseMessageBase OnTextRequest(RequestMessageText requestMessage)
        {
            // 获取用户发送的文本
            var receivedText = requestMessage.Content;
            // 根据关键词回复不同内容
            if (receivedText == "你好")
            {
                return new ResponseMessageText()
                {
                    Content = "你好,欢迎使用我们的服务!"
                };
            }
            else if (receivedText == "关于我们")
            {
                return new ResponseMessageNews()
                {
                    Articles = new[]
                    {
                        new Article()
                        {
                            Title = "关于我们",
                            Description = "我们是一个专注于 .NET 微信开发的小团队。",
                            PicUrl = "https://your-image-url.com/logo.png",
                            Url = "https://your-website.com/about"
                        }
                    }
                };
            }
            // 默认回复
            return new ResponseTextMessage("收到您的消息:" + receivedText);
        }
        // 其他消息类型的处理...
        public override IResponseMessageBase OnEventRequest(RequestMessageEventBase requestMessage)
        {
            // 处理关注事件
            if (requestMessage is RequestMessageEventSubscribe)
            {
                return new ResponseTextMessage("感谢您的关注!回复“你好”或“关于我们”试试看。");
            }
            return null;
        }
    }
}
// 用于存放微信配置的类
public class WeChatOptions
{
    public string Token { get; set; }
    public string AppId { get; set; }
    public string AppSecret { get; set; }
}

配置 appsettings.json

{
  "Logging": { ... },
  "AllowedHosts": "*",
  "WeChat": {
    "Token": "your_wechat_token", // 填写你在微信后台配置的Token
    "AppId": "your_app_id",       // 填写你的AppId
    "AppSecret": "your_app_secret" // 填写你的AppSecret
  }
}

Program.cs 中注册服务

// Program.cs
using Microsoft.Extensions.Options;
var builder = WebApplication.CreateBuilder(args);
// 1. 读取配置
builder.Services.Configure<WeChatOptions>(builder.Configuration.GetSection("WeChat"));
// 2. 注册 Senparc.Weixin 的全局配置
// 注意:实际项目中,Senparc.Weixin 的配置应该更复杂,这里简化处理
builder.Services.AddSingleton<WeChatOAuthAccessToken>(provider =>
{
    var weChatOptions = provider.GetRequiredService<IOptions<WeChatOptions>>().Value;
    return new WeChatOAuthAccessToken(weChatOptions.AppId, weChatOptions.AppSecret);
});
var app = builder.Build();
// 3. 创建中间件处理微信请求
app.MapPost("/api/wechat", async (context, weChatService) =>
{
    using var inputStream = context.Request.Body;
    var responseXml = await weChatService.HandleRequestAsync(inputStream);
    context.Response.ContentType = "text/xml; charset=utf-8";
    await context.Response.WriteAsync(responseXml);
});
// 注册 WeChatService 为单例
app.Services.AddSingleton<WeChatService>();
app.Run();

创建 WeChatController.cs (可选,但推荐)

// Controllers/WeChatController.cs
using Microsoft.AspNetCore.Mvc;
using System.IO;
using System.Threading.Tasks;
[ApiController]
[Route("api/[controller]")]
public class WeChatController : ControllerBase
{
    private readonly WeChatService _weChatService;
    public WeChatController(WeChatService weChatService)
    {
        _weChatService = weChatService;
    }
    [HttpPost]
    public async Task<IActionResult> Post()
    {
        // 请求体就是微信发来的XML
        using var reader = new StreamReader(Request.Body);
        var xmlContent = await reader.ReadToEndAsync();
        // 这里你可以添加日志记录 xmlContent
        // 调用服务处理
        var response = await _weChatService.HandleRequestAsync(Request.Body);
        return Content(response, "text/xml");
    }
}

4 部署与测试

  1. 本地测试: 使用 ngrok 启动项目,并将 https://xxxxxxxx.ngrok.io/api/wechat 填入微信后台。
  2. 微信后台配置: 保存配置,如果配置成功,微信服务器会向你发送一个 GET 请求用于验证,我们的代码会自动处理并返回 echostr
  3. 发送消息: 用微信关注你的测试号,发送消息 "你好",你应该能收到自动回复。

高级功能:API 调用与网页授权

1 获取 Access Token

Access Token 是调用微信接口的全局唯一票据,有效期 2 小时。

// 使用 Senparc.Weixin SDK 获取 Token
var accessToken = Senparc.Weixin.MP.CommonAPIs.CommonApi.GetAccessToken(appId, appSecret);
string token = accessToken.AccessToken;

最佳实践: 将 AccessToken 缓存起来,避免频繁调用。Senparc.Weixin 库已经内置了缓存机制,你只需正确配置即可。

2 自定义菜单创建

// 使用 SDK 创建菜单
var menu = new Menu
{
    button = new List<MenuButton>
    {
        new ClickButton()
        {
            name = "点击一下",
            key = "CLICK_KEY_1",
            type = "click"
        },
        new ViewButton()
        {
            name = "访问官网",
            url = "https://www.senparc.com",
            type = "view"
        }
    }
};
// 创建菜单
Senparc.Weixin.MP.CommonAPIs.CommonApi.CreateMenu(accessToken.AccessToken, menu);

3 网页授权获取用户信息 (OAuth2.0)

当用户在微信中点击一个链接,你想获取他的基本信息时,需要使用网页授权。

流程:

  1. 用户点击链接,重定向到微信授权服务器。
  2. 用户同意授权。
  3. 微信重定向回你指定的 redirect_uri,并带上 code
  4. 你用 code 换取 access_tokenopenid

实现:

// 在你的 Controller 中
[HttpGet("oauth")]
public async Task<IActionResult> OAuth()
{
    // 从配置中获取 AppId
    var appId = "your_app_id";
    var redirectUri = "https://yourdomain.com/wechat/callback"; // 授权成功后的回调地址
    var scope = "snsapi_userinfo"; // 获取用户信息
    var state = "random_state_123"; // 防止CSRF攻击
    // 构造微信授权URL
    var authUrl = OAuthApi.GetAuthorizeUrl(appId, redirectUri, state, scope);
    // 重定向到该URL
    return Redirect(authUrl);
}
[HttpGet("callback")]
public async Task<IActionResult> Callback(string code, string state)
{
    if (state != "random_state_123")
    {
        return BadRequest("Invalid state.");
    }
    var appId = "your_app_id";
    var appSecret = "your_app_secret";
    var redirectUri = "https://yourdomain.com/wechat/callback";
    // 使用 code 换取 access_token
    var result = OAuthApi.GetAccessToken(appId, appSecret, code, redirectUri);
    if (result.errcode == ReturnCode.请求成功)
    {
        // 使用 access_token 和 openid 获取用户信息
        var userInfo = OAuthApi.GetUserInfo(result.access_token, result.openid);
        // userInfo 中包含了用户的昵称、头像、性别等信息
        // 你可以在这里处理用户信息,比如登录、创建账户等
        return Content($"Hello, {userInfo.nickname}! 你的头像: <img src='{userInfo.headimgurl}' />");
    }
    return Content("授权失败。");
}

进阶与资源

1 小程序开发简介

小程序开发基于微信提供的 WXML (类似 HTML), WXSS (类似 CSS) 和 JavaScript,后端交互依然是调用微信 API,流程与公众号类似,但 AppID 不同,你可以使用 Senparc.Weixin.MP 中的 MiniProgram 相关命名空间来处理小程序的请求和消息。

2 微信支付

微信支付流程非常复杂,涉及下单、用户扫码、支付回调、签名验证等多个环节,强烈建议使用成熟的 SDK,如 Senparc.Weixin.TenPay,它封装了绝大多数支付场景。

3 推荐的 .NET 微信开发库

  • Senparc.Weixin: 强烈推荐,功能最全面、文档最完善、社区最活跃的 .NET 微信开发框架,支持公众号、小程序、企业微信、小游戏等,几乎所有功能都已为你封装好,可以节省大量开发时间。
  • Microsoft.Bot.Builder: 如果你的目标是构建更通用的聊天机器人,并且希望未来能扩展到其他平台 (如 Teams, Slack),可以考虑微软的 Bot Framework。

希望这份详细的教程能帮助你顺利入门 .NET 微信开发!祝你开发愉快!

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