WPF 从选品到扫码付 支付链路与 异步实践

📅 2026/6/22 3:09:45
WPF 从选品到扫码付 支付链路与 异步实践
引言自助零售柜的支付流程表层逻辑简洁仅包含选品、展示支付二维码、用户扫码支付三个步骤但实际落地过程中需应对订单创建异常、网络波动、用户中途离场、UI线程阻塞等各类终端场景问题。本文基于.NET 8 WPF架构的NLStar AISales自助购系统源码完整拆解购物车结算至支付完成的全链路流程详细阐述WPF框架下的异步调度机制与业务状态管理实战方案。整体支付时序在这里插入图片描述participant User as 用户 participant Home as 首页(HomePage) participant Cart as 购物车窗口 participant Pay as 支付页(PayPage) participant BLL as 业务层(ViewBll) participant API as 后端服务 User-Home: 商品选品、加入购物车 User-Home: 点击结算按钮 Home-Cart: 弹出购物车确认窗口 Cart--Home: 确认订单返回成功状态 Home-Pay: 页面跳转至支付页 Pay-BLL: 调用订单创建方法 BLL-API: 请求创建销售订单 API--BLL: 返回订单唯一标识(bill_id) Pay-BLL: 依据订单ID获取支付链接 BLL-API: 请求聚合支付地址接口 API--BLL: 返回支付URL Pay-Pay: 工具类生成支付二维码 loop 每5秒轮询最大12次 Pay-BLL: 校验当前订单支付状态 BLL-API: 查询订单支付日志 API--BLL: 返回交易流水号 end Pay-Home: 支付成功跳转回首页第一步购物车订单确认系统在首页视图模型的结算点击事件中优先弹出模态购物车窗口仅当用户主动确认订单后才会跳转至支付页面从源头规避无效订单创建减少接口资源浪费。shoppingCart new ShoppingCartWindow(); if (shoppingCart.ShowDialog() true) { UIController.Navigate(new PayPage()); }模态弹窗的交互方式可有效拦截用户误操作确保进入支付流程的订单信息完整、有效保障业务流程严谨性。第二步后台异步创建订单页面跳转至支付页并完成加载后通过页面加载命令在后台线程执行订单创建逻辑彻底规避耗时业务阻塞UI渲染的问题保证终端触控操作流畅度。Function.DoWork(() { var bill_id Global.viewBll.CreatePayOrder(); // 后续业务逻辑 });通用工具方法 DoWork 封装了标准化异步业务模板展示加载动画、执行核心业务逻辑、最终统一关闭加载状态是WPF自助终端场景下异步业务与加载状态联动的通用最佳实践。订单创建方法会遍历全局购物车商品集合组装商品明细、数量、金额等核心数据封装为请求参数后调用后端订单创建接口。foreach (var p in Global.ShoppingCartList) { l.Add(new { id p.ProductID, amount p.Count, fee p.Count * p.SellPrice, date, open_date date, model , }); } var data proxy.CreatePayOrder( Global.ShoppingCartData.Count, Global.ShoppingCartData.TotalSellPrice, Global.device.SN, l); return data.data.id.ToString();系统通过渠道标识定义自助购业务场景同时将设备唯一SN码写入订单信息便于后端完成订单归类、账务核对与问题溯源。第三步获取支付链接并渲染二维码成功获取订单ID后系统调用后端支付接口拉取聚合支付地址通过UI调度器切回主线程完成支付二维码的刷新与渲染严格遵循WPF跨线程UI更新规范。Application.Current.Dispatcher.Invoke(() { PayModel.QRCodeImg null; PayModel.QRCodeImg QRCodeHelper.CreateQRCode(url); PayModel.QRCodeLogo Function.UnicodeToFontStr(); // 微信图标 });二维码生成工具基于QRCoder组件实现位图生成同时适配WPF图像资源类型完成视图绑定项目集成ZXing.Net组件可灵活拓展条码解析、生成等拓展能力。支付页面支持微信、支付宝双支付渠道切换通过专属命令触发切换逻辑搭配图标字体实现二维码中心Logo与按钮高亮状态联动切换优化用户视觉感知。第四步定时轮询校验支付结果订单创建完成后系统启动后台循环轮询任务定时查询订单支付状态无需用户手动刷新。Task.Run(async () { for (int i 0; i 12; i) { await Task.Delay(5000); if (Global.viewBll.ChkPayOk(bill_id)) { Function.GoBack(); break; } } });支付状态校验接口以交易流水号是否存在作为支付成功的判定依据。轮询间隔5秒最大轮询12次整体超时时长60秒与支付页110秒的全局空闲超时机制形成互补适配网络延迟、用户扫码延迟等各类场景保障业务闭环。支付成功后系统自动跳转回首页若超时未完成支付页面空闲倒计时机制将自动触发页面复位避免终端页面卡死。支付页面状态管控机制系统通过全局状态变量与超时参数联动实现支付流程的状态锁定与终端自助复位规避重复下单、页面卡死等异常问题核心管控变量如下变量作用说明Global.IsPaying标记支付流程进行中拦截重复下单操作Global.MaxSecond / BackSecond控制支付页面110秒空闲超时复位逻辑Global.ShoppingCartData提供订单商品数量、总金额等核心数据来源进入支付页面时系统会初始化状态与超时参数将支付页空闲时长设置为110秒相较于首页90秒预留更长操作时间适配用户扫码、付款的操作耗时。Global.IsPaying true; Global.MaxSecond 110; Global.BackSecond 110;API通信层统一设计系统通过Proxy代理类统一封装后端REST接口调用所有请求基于设备本地配置的API域名动态拼接标准化接口请求格式{ApiUrl}/api/{controller}/{action}。GET请求通过通用工具方法自动拼接请求地址与参数依托反射机制匹配参数名称杜绝手工拼接参数导致的格式错误。string api_name pay/GetPayLogInfo; string url WPF.Common.Function.GetWebMethodUrl(Global.device.ApiUrl, api_name, new object[] { id }); dynamic ri Function.HttpGetRtnInfo(url);订单创建等写入类业务统一使用POST请求将参数序列化为JSON格式通过请求体传输。所有接口响应统一校验状态字段异常信息由全局异常捕获机制统一处理、记录日志并展示友好提示。同时通用工具层适配专网、内网场景完成HTTPS证书兼容处理保障设备端接口调用稳定性。WPF数据绑定与UI状态适配项目依托WPF值转换器实现数据与UI状态的自动联动无需冗余后台逻辑核心自定义转换器能力如下CountToVisibiltyConvert控制购物车商品数量角标显示与隐藏DecimalToVisibiltyConvert动态控制会员价、折扣价等差异化价格展示BoolToBackgroundConverter实现分类选项选中高亮状态切换商品列表采用集合视图数据源实现按分类分组展示适配长列表触控浏览场景点击左侧分类导航时自动滚动视图至对应商品分组位置优化终端操作体验。.NET 8 版本迁移适配要点项目从旧版本框架升级至.NET 8 WPF过程中核心适配要点如下可作为同类项目迁移参考框架配置指定目标框架为net8.0-windows保留WPF启用配置保障桌面控件正常兼容依赖适配统一校验QRCoder、Microsoft.Xaml.Behaviors.Wpf等核心NuGet包与.NET 8框架的兼容性完成版本适配网络请求原生HttpWebRequest可正常兼容长期迭代建议迁移至HttpClient依托连接池机制提升异步请求性能与稳定性异常日志.NET 8对全局未捕获异常的监听机制无变更原有日志捕获、异常处理逻辑无需改造优化改进方向与实践思考基于当前落地实现结合自助终端业务场景特性后续可从以下维度迭代优化提升系统稳定性与用户体验通信机制升级将客户端轮询改造为WebSocket服务端推送模式减少无效接口请求提升支付结果响应速度异常体验优化支付超时后增加明确的弹窗提示告知用户支付失败引导用户重新下单替代原有静默回退逻辑订单幂等优化新增订单幂等校验机制规避网络重试、重复点击导致的重复下单问题购物车数据持久化页面超时复位前增加二次确认支持保留当前购物车数据避免用户重新选品网络组件优化重构网络请求逻辑实现HttpClient单例复用替代传统同步请求方式提升并发能力与代码可维护性小结NLStar AISales自助购系统的支付链路采用「订单确认-异步下单-二维码渲染-状态轮询-页面复位」的标准化自助终端业务模式。通过工具类封装异步加载逻辑、UI调度器隔离界面与后台线程、业务层统一管控订单与支付接口、全局状态变量锁定支付流程实现了无人值守场景下的稳定可控运行。整套方案完全适配.NET 8 WPF技术栈架构轻量化、逻辑清晰、扩展性强可为同类自助终端、无人零售设备的支付模块开发提供成熟的实践参考。注部分内容可能由 AI 生成