You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C# WinForms下TOTP原始URI转可显示二维码的实现求助

问题根因

你之前两种方案失败的核心原因是混淆了TOTP URI的协议类型:TOTP库返回的是otpauth://开头的自定义协议URI,本质是存储了TOTP密钥、账号、发行方信息的文本标识,不是HTTP/HTTPS协议的在线网页或图片地址,无论用WebClient发起网络请求,还是让WebBrowser直接导航到这个地址,都会因为系统没有对应协议的公网处理资源出现报错、空白页问题。


实现方案

优先推荐本地生成二维码的实现方式,无外部依赖、没有网络兼容性问题,同时满足显示、导出文件两个需求。

1. 最优方案:本地生成二维码(直接显示+导出文件)

使用纯.NET实现的二维码生成库直接在本地生成位图,不需要依赖任何在线服务:

  • 首先在项目中安装NuGet包QRCoder,该包兼容.NET Framework 4.0及以上版本,无额外运行时依赖。
  • 核心实现代码如下:
using QRCoder;
using System.Drawing;
using System.Drawing.Imaging;

// 替换为你从TOTP库获取的完整otpauth://开头的URI
string totpAuthUri = "你的TOTP URI内容";

using (QRCodeGenerator qrGenerator = new QRCodeGenerator())
using (QRCodeData qrData = qrGenerator.CreateQrCode(totpAuthUri, QRCodeGenerator.ECCLevel.Q))
using (QRCode qrCode = new QRCode(qrData))
{
    // 生成二维码位图:参数依次为单模块像素尺寸、二维码边距、前景色、背景色、是否绘制边距
    Bitmap qrBmp = qrCode.GetGraphic(20, Color.Black, Color.White, true);

    // 导出为PNG格式文件,需要BMP格式则替换为ImageFormat.Bmp即可
    qrBmp.Save(@"D:\output\totp-qrcode.png", ImageFormat.Png);

    // 界面显示优先推荐直接绑定到PictureBox控件,比WebBrowser轻量无兼容问题
    pictureBox_QrCode.Image = qrBmp;
}

2. 适配WebBrowser控件的显示方案

如果必须使用WebBrowser控件展示二维码,不需要导航到外部地址,直接将生成的二维码位图转成base64编码嵌入本地HTML,让WebBrowser加载静态HTML内容即可:

using System.IO;

// 沿用上述方法生成的二维码位图对象qrBmp
using (MemoryStream ms = new MemoryStream())
{
    qrBmp.Save(ms, ImageFormat.Png);
    string base64Qr = Convert.ToBase64String(ms.ToArray());
    string embedHtml = $@"
    <html>
    <body style='margin:0;height:100%;display:flex;align-items:center;justify-content:center;'>
        <img src='data:image/png;base64,{base64Qr}' />
    </body>
    </html>";
    // 直接加载内嵌HTML,无网络请求
    webBrowser1.DocumentText = embedHtml;
}

注意:如果你的WebBrowser控件默认渲染模式过低导致图片显示异常,可以在项目中添加注册表配置,强制WebBrowser使用当前系统安装的最高版IE内核渲染内容。


内容的提问来源于stack exchange,提问作者Multicoder

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 03:42:20