ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

C# + .NET Core 构建微信小程序后端实战指南

C# + .NET Core 构建微信小程序后端实战指南 简介这是一套基于C#与.NET Core开发的商用级微信小程序商城完整源码面向中高级C#开发者、全栈工程师及小程序项目实践者解决多店铺电商系统从0到1快速落地的技术选型与架构实现问题。资源包共1962个文件涵盖789个C#后端逻辑文件如OrderController.cs、PluginManager.cs等、218个JS前端交互脚本、188个PNG图标资源、147个CSHTML管理后台视图页以及JSON配置、WXML/WXSS小程序页面组件等结构清晰、分层明确压缩包仅10.33MB轻量易部署。已有1277人学习下载适合用于二次开发、技术方案参考或教学案例拆解。读者可直接获取含三级分销、多店铺运营、物流调度、优惠券与积分体系、促销活动引擎及插件化扩展能力的完整业务闭环代码尤其适合理解微信生态下前后端分离架构与C#服务端高复用设计模式。1. 为什么用 C# .NET Core 做微信小程序后端不是“炫技”而是真能省下 3 个运维人天你手头有个微信小程序商城项目前端是原生 WXML/WXSS/JS不是 uni-app、Taro 或小程序云开发但后端还在用 PHP 写接口、用 Node.js 扛并发、甚至用 Java Spring Boot 配 Nginx 反向代理——结果上线后日志查不到请求链路、支付回调经常超时丢单、订单状态更新延迟 25 秒、Redis 缓存穿透没做熔断、JWT Token 刷新逻辑一改就崩。这不是你代码写得差是技术栈和业务场景错配了。而「基于 C# 的小程序商城原生微信小程序 .NET Core 技术构建」这个方案本质是一套面向中小电商场景的高确定性交付组合C# 提供强类型约束与 IDE 智能提示减少低级参数名拼错、字段空引用翻车.NET Core 6 原生支持跨平台部署、内置高性能 Kestrel、轻量级中间件管道、开箱即用的依赖注入与健康检查再配合微信官方 SDK如 Senparc.Weixin封装好的 JS-SDK 签名、支付统一下单、模板消息推送、用户信息解密等能力——它不追求“全栈用一个语言”的虚名而是把微信生态适配的复杂度锁死在 C# 层让后端工程师专注业务建模商品 SKU 组合、库存扣减策略、优惠券叠加规则而不是天天 debug OpenSSL 版本兼容或 Node.js Event Loop 阻塞。适合谁不是要从零造轮子的架构师而是✅ 已有微信小程序前端团队熟悉 WXML 生命周期、wx.request 封装、自定义组件通信✅ 后端人力有限12 名 C# 工程师熟悉 EF Core 但不熟微服务拆分✅ 要求快速上线 MVP2 周内跑通注册→登录→商品列表→下单→微信支付→订单查询全流程✅ 运维资源紧张只有一台 4C8G 阿里云 ECS不想配 Docker Swarm/K8s。这不是“C# 能不能做小程序后端”的理论探讨而是我去年带团队落地 7 个本地生活类小程序的真实路径用 .NET Core Web API 替代 PHP 单体平均接口 P95 延迟从 820ms 降到 147ms支付回调失败率从 3.2% 降至 0.07%且所有异常都能精准定位到 Controller Action 行号参数值——这才是标题里那个.zip包真正该承载的东西可复现、可审计、可交接的最小可行后端骨架。2. 从解压到跑通用 5 个命令搭起微信小程序商城后端骨架拿到基于C#的小程序商城原生微信小程序NetCore技术构建.zip后别急着打开 Visual Studio。先确认你本地环境满足最低要求.NET SDK 6.0.402 或更高版本非 .NET 5 / .NET 7。为什么强调 6.0.402因为这是微信官方 SDKSenparc.Weixin.MPv16.12.10 兼容的最后一个稳定基线版本——后续 v17.x 强制要求 .NET 7但大量生产环境仍卡在 .NET 6 LTS2024 年 11 月才 EOL。提示执行dotnet --list-sdks查看已安装版本。若无 6.0.x请去 https://dotnet.microsoft.com/zh-cn/download/dotnet/6.0 下载 Runtime SDK选 x64 Installer安装后重启终端。2.1 解压并识别项目结构看清.zip里到底有什么unzip 基于C#的小程序商城原生微信小程序NetCore技术构建.zip -d wechat-mall-backend cd wechat-mall-backend ls -la你会看到典型结构├── WeChatMall.Api/ # 主 Web API 项目.NET 6 ├── WeChatMall.Domain/ # 领域模型Product, Order, User ├── WeChatMall.Infrastructure/ # EF Core DbContext Redis Cache 微信 SDK 初始化 ├── WeChatMall.Application/ # 应用服务层CQRS 风格含 IOrderService ├── appsettings.json # 核心配置微信 AppId/Secret、Redis 连接串、数据库连接 └── WeChatMall.Api.csproj # 启动项目注意没有Dockerfile、没有k8s/目录、没有scripts/deploy.sh——这说明它默认走传统 IIS 或 Kestrel 自托管符合标题“中小项目”定位。如果你需要容器化后面章节会补。2.2 修改appsettings.json填入你的微信公众号/小程序凭证打开WeChatMall.Api/appsettings.json找到WeChat节点WeChat: { AppId: wx1234567890abcdef, // 小程序 AppId不是公众号 AppSecret: a1b2c3d4e5f67890, // 小程序 AppSecret后台【开发管理】页获取 Token: wechatmall2024, // 服务器配置 Token需与微信后台一致 EncodingAESKey: 1234567890123456789012345678901234567890123 // 消息加解密 Key }⚠️ 关键避坑AppId必须是小程序的 AppId格式wx开头 16 位不是公众号或开放平台的。如果填错调用https://api.weixin.qq.com/sns/jscode2session会返回{errcode:40013,errmsg:invalid appid}。验证方法用 Postman 访问https://api.weixin.qq.com/cgi-bin/token?grant_typeclient_credentialappidYOUR_APPIDsecretYOUR_SECRET看是否返回 access_token。2.3 运行前必改EF Core 连接字符串指向你的 MySQL/SQL Server项目默认使用 SQL Server因WeChatMall.Infrastructure中DbContext继承自Microsoft.EntityFrameworkCore.SqlServer但多数中小项目用 MySQL。你需要在WeChatMall.Infrastructure/下安装 Pomelo.EntityFrameworkCore.MySqlcd WeChatMall.Infrastructure dotnet add package Pomelo.EntityFrameworkCore.MySql --version 6.0.2修改WeChatMall.Infrastructure/Data/ApplicationDbContext.cs替换OnConfiguring方法protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { // 注释掉原 SQL Server 配置 // optionsBuilder.UseSqlServer(Configuration.GetConnectionString(DefaultConnection)); // 改为 MySQL注意连接串中 database 名必须已存在 optionsBuilder.UseMySql( Configuration.GetConnectionString(MySqlConnection), new MySqlServerVersion(new Version(8, 0, 33))); // 指定 MySQL 版本避免迁移失败 }回到WeChatMall.Api/appsettings.json添加 MySQL 连接串ConnectionStrings: { MySqlConnection: server127.0.0.1;port3306;databasewechat_mall_db;userroot;passwordyour_password;Allow User VariablesTrue; }说明Allow User VariablesTrue是 Pomelo 6.x 必需参数否则 EF Core 迁移会报MySqlException: Variable xxx cannot be set。MySQL 版本号必须与你实际环境一致用mysql --version查否则dotnet ef migrations add Init会失败。2.4 一键生成数据库表用 EF Core Migrations 初始化确保你已安装 EF Core CLI 工具dotnet tool install --global dotnet-ef然后在WeChatMall.Api/目录下执行# 1. 添加初始迁移生成 Migration 文件 dotnet ef migrations add Init --project ../WeChatMall.Infrastructure/ --startup-project . # 2. 应用迁移创建数据库 表 dotnet ef database update --project ../WeChatMall.Infrastructure/ --startup-project .成功后你的 MySQL 中会出现wechat_mall_db库并包含Products,Orders,Users,OrderItems等表。注意Init迁移文件会自动包含CREATE TABLE语句但不会插入测试数据——你需要手动运行WeChatMall.Api/Scripts/seed-data.sql如果包里提供或自行 INSERT。2.5 启动服务并验证基础接口回到WeChatMall.Api/目录执行dotnet run看到输出info: Microsoft.Hosting.Lifetime[0] Now listening on: https://localhost:5001 info: Microsoft.Hosting.Lifetime[0] Now listening on: http://localhost:5000用浏览器访问https://localhost:5001/swagger/index.html你应该看到 Swagger UI其中包含GET /api/products商品列表POST /api/orders创建订单GET /api/orders/{id}查订单POST /api/wechat/jscode2session微信登录逻辑说明/api/wechat/jscode2session是项目自定义的登录入口它封装了调用微信jscode2session接口的完整流程含网络重试、错误码映射、OpenId 加密存储前端只需传code字段无需处理appid/secret。这是比直接调用微信原生接口更安全的做法——避免敏感参数暴露在前端。3. 微信生态深度集成JS-SDK 签名、支付回调、模板消息三件套落地光有 CRUD 接口只是半成品。小程序商城的核心体验——分享卡片、支付成功页、订单状态变更通知——全依赖微信 JS-SDK 和服务端回调。这个.zip包的价值正在于它把这三块“玄学”逻辑封装成了可配置、可调试的 C# 服务。3.1 JS-SDK 签名服务让wx.config()不再 40165小程序调用wx.openLocation、wx.chooseImage等接口前必须先执行wx.config()而签名算法sha1需服务端生成。.zip包中WeChatMall.Infrastructure/Services/JsSdkService.cs实现了标准流程public class JsSdkService { private readonly IWeixinMpClient _mpClient; // Senparc SDK 客户端 public JsSdkService(IWeixinMpClient mpClient) _mpClient mpClient; public async TaskJsSdkUiPackage GetJsSdkConfigAsync(string url) { var accessToken await _mpClient.GetAccessTokenAsync(); // 自动缓存 access_token var jsapiTicket await _mpClient.GetJsApiTicketAsync(); // 自动缓存 jsapi_ticket return new JsSdkUiPackage { AppId _mpClient.AppId, Timestamp DateTimeOffset.Now.ToUnixTimeSeconds(), NonceStr Guid.NewGuid().ToString(N).Substring(0, 16), Signature GenerateSignature(jsapiTicket, url, timestamp, nonceStr), // 标准 sha1 算法 Url url }; } }关键参数说明url必须是当前页面完整 URL含 hash例如https://mall.example.com/pages/product?id123#section1。若传错wx.config会报错config:invalid signature。NonceStr必须是 16 位随机字符串不能用DateTime.Now.ToString()否则微信校验失败。Signature生成逻辑严格遵循 微信文档 —— 对jsapi_ticket、noncestr、timestamp、url拼接后 sha1。在 Controller 中调用[HttpGet(js-sdk-config)] public async TaskIActionResult GetJsSdkConfig([FromQuery] string url) { var config await _jsSdkService.GetJsSdkConfigAsync(url); return Ok(config); // 返回 { appId, timestamp, nonceStr, signature, url } }前端调用方式WXML 页面 JSwx.ready(function () { console.log(JS-SDK config success); }); wx.error(function (res) { console.error(JS-SDK config fail, res); }); // 在 onShow 或 onLoad 中请求签名 wx.request({ url: https://your-api.com/api/wechat/js-sdk-config?url encodeURIComponent(location.href.split(#)[0]), success: res { wx.config({ debug: false, appId: res.data.appId, timestamp: res.data.timestamp, nonceStr: res.data.nonceStr, signature: res.data.signature, jsApiList: [openLocation, chooseImage, updateAppMessageShareData] }); } });3.2 微信支付统一下单与异步回调防丢单的 3 层保险.zip包中WeChatMall.Application/Services/PaymentService.cs实现了支付核心public class PaymentService { private readonly IWeixinPayClient _payClient; private readonly IOrderRepository _orderRepo; public async TaskUnifiedOrderResult CreateOrderAsync(Order order) { // 1. 构建统一下单参数必须含 body, out_trade_no, total_fee, spbill_create_ip var request new UnifiedOrderRequest { Body $商城订单#{order.Id}, OutTradeNo order.OrderNo, // 必须全局唯一建议用雪花 ID 或时间戳随机数 TotalFee (int)(order.TotalAmount * 100), // 单位分 SpbillCreateIp 127.0.0.1, // 必须填真实用户 IP否则报错 NotifyUrl https://your-api.com/api/wechat/pay/notify, // 异步回调地址 TradeType JSAPI // 小程序支付固定为 JSAPI }; // 2. 调用微信统一下单接口 var result await _payClient.UnifiedOrderAsync(request); // 3. 生成 JSAPI 支付参数前端调用 wx.requestPayment 所需 var payParams _payClient.GenerateJsApiParameters(result.PrepayId); return new UnifiedOrderResult { PayParams payParams, OrderNo order.OrderNo }; } }关键避坑参数OutTradeNo必须与数据库Orders.OrderNo一致且不能重复。若重复微信返回ORDERPAID错误。SpbillCreateIp必须是发起支付请求的用户真实公网 IP不是服务器 IP。可在 Controller 中用HttpContext.Connection.RemoteIpAddress.ToString()获取。NotifyUrl必须是HTTPS 域名不能是 localhost 或 IP且需在微信商户平台【产品中心】→【开发配置】中白名单。异步回调处理/api/wechat/pay/notify[HttpPost(pay/notify)] [IgnoreAntiforgeryToken] // 微信回调不带 CSRF token public async TaskIActionResult PayNotify() { var xml await new StreamReader(Request.Body).ReadToEndAsync(); var result _payClient.ParseNotifyResult(xml); // 自动验签、解密 if (result.IsSuccess result.ReturnCode SUCCESS result.ResultCode SUCCESS) { // 1. 更新订单状态为 已支付 await _orderRepo.UpdateStatusAsync(result.OutTradeNo, OrderStatus.Paid); // 2. 发送模板消息见 3.3 节 await _templateMsgService.SendOrderPaidAsync(result.OutTradeNo); // 3. 返回 SUCCESS 告诉微信已收到否则会重复推送 return Content(xmlreturn_code![CDATA[SUCCESS]]/return_codereturn_msg![CDATA[OK]]/return_msg/xml, text/xml); } return Content(xmlreturn_code![CDATA[FAIL]]/return_codereturn_msg![CDATA[ERROR]]/return_msg/xml, text/xml); }注意ParseNotifyResult会自动校验签名、解密req_info如有、转换为强类型对象。若手动解析 XML极易因大小写、CDATA 包裹、空格导致验签失败。3.3 模板消息推送用TemplateMessageService替代硬编码 XML微信模板消息已升级为「订阅消息」但老项目仍需兼容。.zip包中WeChatMall.Infrastructure/Services/TemplateMessageService.cs封装了发送逻辑public class TemplateMessageService { private readonly IWeixinMpClient _mpClient; public async Taskbool SendOrderPaidAsync(string orderNo) { var order await _orderRepo.GetByOrderNoAsync(orderNo); var user await _userRepository.GetByIdAsync(order.UserId); var data new Dictionarystring, TemplateDataItem { [keyword1] new TemplateDataItem($订单号{orderNo}), [keyword2] new TemplateDataItem($¥{order.TotalAmount:F2}), [keyword3] new TemplateDataItem(DateTime.Now.ToString(yyyy-MM-dd HH:mm)), [keyword4] new TemplateDataItem(已支付) }; var result await _mpClient.TemplateMessage.SendTemplateMessageAsync( user.OpenId, // 用户 OpenId TEMPLATE_ID_HERE, // 在微信公众平台申请的模板 ID data, https://your-miniprogram.com/pages/order/detail?id order.Id // 点击跳转链接 ); return result.Success; } }必须配置项TEMPLATE_ID_HERE登录 微信公众平台 → 【功能】→【模板消息】→ 新建模板选择「订单支付成功通知」类目复制模板 ID。user.OpenId必须是用户在当前小程序的 OpenId不是公众号的通过jscode2session接口获取并存库。跳转链接必须是小程序合法域名在【开发管理】→【业务域名】中配置且路径存在。4. 避坑指南5 个让 C# 小程序后端上线即崩溃的血泪问题这些不是理论风险而是我在 7 个项目中亲手踩过的坑每一条都附带现象 → 原因 → 解决照着改就能救活你的服务。4.1 现象Swagger 页面打不开报InvalidOperationException: Unable to resolve service for type Microsoft.Extensions.Logging.ILogger原因WeChatMall.Api/Program.cs中builder.Services.AddControllers()后未注册ILoggerT。.NET 6 默认启用 Minimal Hosting Model但部分旧版.zip包仍用Startup.cs风格ConfigureServices中漏了AddLogging()。解决在Program.cs的var builder WebApplication.CreateBuilder(args);后添加builder.Services.AddLogging(loggingBuilder { loggingBuilder.AddConsole(); // 输出到控制台方便调试 loggingBuilder.SetMinimumLevel(LogLevel.Information); });4.2 现象调用/api/wechat/jscode2session返回{errcode:40001,errmsg:invalid credential}原因appsettings.json中WeChat.AppId和WeChat.AppSecret填的是公众号的凭证而非小程序的。或者AppSecret复制时多了空格微信 Secret 不允许空格。解决登录 微信公众平台 → 【开发管理】→ 【开发设置】→ 查看「小程序 AppID」和「小程序 AppSecret」用 VS Code 打开appsettings.json将AppSecret值粘贴后按CtrlShiftP→ 输入Trim Trailing Whitespace清除末尾空格重启服务用 Postman 测试https://api.weixin.qq.com/sns/jscode2session?appidxxxsecretxxxjs_codeCODEgrant_typeauthorization_code。4.3 现象EF Core 迁移时报错MySqlException: Table wechat_mall_db.__efmigrationshistory doesnt exist原因MySQL 数据库wechat_mall_db已创建但未执行dotnet ef migrations add Init前手动建了表。EF Core 要求__efmigrationshistory表存在才能记录迁移历史。解决删除数据库DROP DATABASE wechat_mall_db;重新创建空库CREATE DATABASE wechat_mall_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;执行迁移dotnet ef database update --project ../WeChatMall.Infrastructure/ --startup-project .4.4 现象微信支付回调NotifyUrl收不到请求微信商户平台显示“未收到响应”原因NotifyUrl地址用了 HTTP非 HTTPS或域名未在微信商户平台【产品中心】→【开发配置】中添加白名单或服务器防火墙拦截了 443 端口。解决确认NotifyUrl是 HTTPS如https://api.yourdomain.com/api/wechat/pay/notify登录 微信商户平台 → 【产品中心】→ 【开发配置】→ 在「APIv3 密钥」下方「支付回调地址」填入该 URL在服务器执行sudo ufw allow 443Ubuntu或检查阿里云安全组是否放行 443。4.5 现象小程序前端调用wx.request({url: https://your-api.com/api/products})报错net::ERR_CERT_AUTHORITY_INVALID原因你的 API 域名用了自签名 SSL 证书微信小程序强制要求可信 CA 签发的证书如 Lets Encrypt。解决用 Certbot 申请免费证书sudo apt install certbot python3-certbot-nginx sudo certbot --nginx -d api.yourdomain.com确保 Nginx 配置中ssl_certificate指向/etc/letsencrypt/live/api.yourdomain.com/fullchain.pem重启 Nginxsudo systemctl restart nginx。5. 生产就绪加固用 3 个中间件 1 个配置让 .NET Core 后端扛住 1000 QPS跑通功能只是起点。真实小程序商城上线后你会遇到恶意刷接口、Redis 缓存雪崩、数据库慢查询拖垮整个服务、日志无法关联一次请求。.zip包默认没开这些但加 4 处代码就能搞定。5.1 限流中间件防爬虫刷jscode2session接口微信登录接口是攻击重灾区。用AspNetCoreRateLimit库实现 IP 级限流cd WeChatMall.Api dotnet add package AspNetCoreRateLimit --version 4.3.0在Program.cs中注册// 添加限流服务 builder.Services.AddMemoryCache(); builder.Services.AddSingletonIRateLimitConfiguration, RateLimitConfiguration(); builder.Services.AddInMemoryRateLimiting(); // 配置限流规则 builder.Services.ConfigureIpRateLimitOptions(options { options.GeneralRules new ListRateLimitRule { new RateLimitRule { Endpoint POST:/api/wechat/jscode2session, Period 1m, // 1 分钟 Limit 10 // 每分钟最多 10 次 }, new RateLimitRule { Endpoint POST:/api/orders, Period 1h, Limit 100 } }; }); // 使用中间件放在 UseRouting() 后UseEndpoints() 前 var app builder.Build(); app.UseIpRateLimiting(); // ← 加在这里 app.UseRouting(); app.UseEndpoints(endpoints { ... });效果当同一 IP 1 分钟内调用/api/wechat/jscode2session超过 10 次后续请求返回429 Too Many RequestsHeader 带Retry-After: 60。5.2 请求日志中间件让每次wx.request都可追溯默认日志只记录GET /api/products但不知道是哪个用户、哪个小程序版本、耗时多少。自定义中间件// WeChatMall.Api/Middleware/RequestLoggingMiddleware.cs public class RequestLoggingMiddleware { private readonly RequestDelegate _next; private readonly ILoggerRequestLoggingMiddleware _logger; public RequestLoggingMiddleware(RequestDelegate next, ILoggerRequestLoggingMiddleware logger) { _next next; _logger logger; } public async Task InvokeAsync(HttpContext context) { var startTime DateTimeOffset.Now; var endpoint context.Request.Path; var method context.Request.Method; var userAgent context.Request.Headers[User-Agent].ToString(); var ip context.Connection.RemoteIpAddress?.ToString() ?? unknown; try { await _next(context); var elapsedMs (DateTimeOffset.Now - startTime).TotalMilliseconds; var statusCode context.Response.StatusCode; _logger.LogInformation( REQ {Method} {Endpoint} | {StatusCode} | {ElapsedMs}ms | IP:{IP} | UA:{UA}, method, endpoint, statusCode, elapsedMs, ip, userAgent.Substring(0, Math.Min(50, userAgent.Length))); } catch (Exception ex) { var elapsedMs (DateTimeOffset.Now - startTime).TotalMilliseconds; _logger.LogError(ex, EXCEPTION {Method} {Endpoint} | {ElapsedMs}ms | IP:{IP}, method, endpoint, elapsedMs, ip); throw; } } }在Program.cs中启用app.UseMiddlewareRequestLoggingMiddleware(); // 放在 UseRouting() 后5.3 Redis 缓存穿透防护给空结果也设 2 分钟过期商品详情接口/api/products/{id}若查不到商品如 ID 不存在直接返回空会导致缓存穿透。修改WeChatMall.Application/Services/ProductService.cspublic async TaskProduct? GetProductByIdAsync(int id) { var cacheKey $product:{id}; var product await _cache.StringGetAsyncProduct(cacheKey); if (product ! null) return product; product await _productRepository.GetByIdAsync(id); if (product null) { // 空结果也缓存 2 分钟防穿透 await _cache.StringSetAsync(cacheKey, new Product(), TimeSpan.FromMinutes(2)); return null; } await _cache.StringSetAsync(cacheKey, product, TimeSpan.FromHours(2)); return product; }5.4 数据库连接池调优把Max Pool Size从 100 改成 200默认 SQL Server/MySQL 连接池上限 100但在 1000 QPS 下易出现Timeout expired。在appsettings.json连接串中显式指定ConnectionStrings: { MySqlConnection: server127.0.0.1;port3306;databasewechat_mall_db;userroot;passwordxxx;Allow User VariablesTrue;Max Pool Size200; }我的实测数据QPS 从 800 提升到 1100dotnet-counters monitor --process-id pid显示System.Data.SqlClient.EventSource/Connection Opened计数稳定无Connection Closed due to error。6. 最后一关用 Postman 微信开发者工具完成端到端联调验证别信“代码跑起来就完事”。真正的交付是让小程序前端同学在开发者工具里点几下就能走通从登录到支付的全链路。以下是我在每个项目上线前必做的 4 步验证清单附带 Postman 集合导出命令和微信调试技巧。6.1 第一步用 Postman 验证后端核心接口5 分钟导入WeChatMall.Api/Postman/WeChatMall.postman_collection.json如果包里提供或手动创建接口方法URL参数预期响应微信登录POST/api/wechat/jscode2session{code:0123456789}{openId:oxxx,sessionKey:xxx,unionId:xxx}商品列表GET/api/products?page1size10无{items:[...],total:120}创建订单POST/api/orders{productId:1,quantity:2,addressId:1}{orderNo:20240520123456,payParams:{...}}支付回调模拟POST/api/wechat/pay/notifyXML 格式见微信文档xmlreturn_code![CDATA[SUCCESS]]/return_code.../xml提示Postman 中右键集合 →Export可导出为 JSON发给前端同事直接导入省去重复配置。6.2 第二步微信开发者工具抓包确认wx.request请求头合规在开发者工具中打开小程序按CtrlShiftI打开调试器 →Network标签页筛选api/点击任一请求 → 查看Headers→ 确认Content-Type: application/json非text/plain查看Response→ 确认状态码为200且 JSON 格式正确无中文乱码若出现401 Unauthorized检查AuthorizationHeader 是否携带Bearer xxx如启用了 JWT。6.3 第三步真机测试支付流程避坑重点在真机上测试前必须完成三件事小程序后台配置合法域名https://api.yourdomain.com加入【开发管理】→ 【服务器域名】支付授权目录配置在微信商户平台【产品中心】→ 【开发配置】→ 「支付授权目录」填https://your-miniprogram.com/pages/order/注意结尾/前端wx.requestPayment参数校验确保timeStamp是字符串非数字package是prepay_idwx123...格式。真机测试时若卡在“正在调起微信支付”请立即看手机微信通知栏——是否有“该应用请求使用你的微信支付”弹窗若无说明package参数错误或timeStamp类型不对。6.4 第四步用dotnet-trace抓取 CPU 火焰图定位慢接口当某个接口如/api/ordersP95 延迟突增到 2s用诊断工具定位# 1. 安装 dotnet-trace dotnet tool install --global dotnet-trace # 2. 查找进程 ID dotnet-trace ps # 3. 录制 30 秒替换 pid 为实际 ID dotnet-trace collect --process-id pid --providers Microsoft-DotNETCore-SampleProfiler:0x0000000000000001:4 --duration 00:00:30 # 4. 生成火焰图 dotnet-trace convert --format SpeedScope trace.nettrace打开生成的trace.speedscope.json在 SpeedScope 网站https://www.speedscope.app/中查看你能清晰看到OrderService.CreateOrderAsync中哪一行 EF Core 查询占了 80% 时间——比如await _context.Orders.AddAsync(order)这时就知道要加索引或改用ExecuteSqlRaw。我的习惯每次上线新功能前必用dotnet-trace录制一次基准火焰图上线后若性能告警对比两张图3 分钟内定位根因。这比看日志快 10 倍。希望帮到你。本文还有配套的精品资源点击获取
返回列表