.NET微信扫码支付接入的示例分析
发表于:2025-11-13 作者:千家信息网编辑
千家信息网最后更新 2025年11月13日,这篇文章主要介绍.NET微信扫码支付接入的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!Step1:肯定是产生商户订单号,然后传给微信后台,由微信去组成二维码字符串,然
千家信息网最后更新 2025年11月13日.NET微信扫码支付接入的示例分析
这篇文章主要介绍.NET微信扫码支付接入的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!
Step1:肯定是产生商户订单号,然后传给微信后台,由微信去组成二维码字符串,然后返给你,你再把字符串做成图片;
////// 获取二维码 /// /// ///public string GetCodeUrl(string orderNumber) { var result = string.Empty; if (!string.IsNullOrEmpty(orderNumber)) { var matchedItem = db.OrderInfoForProducts.FirstOrDefault(x => x.OrderNumber == orderNumber); if (matchedItem != null && matchedItem.IsPaid == false) { WxPayData data = new WxPayData(); data.SetValue("body", "productBody");//商品描述 data.SetValue("attach", "attach data");//附加数据 data.SetValue("out_trade_no", WxPayApi.GenerateOutTradeNo());//随机字符串 data.SetValue("total_fee", price);//总金额 data.SetValue("time_start", DateTime.Now.ToString("yyyyMMddHHmmss"));//交易起始时间 data.SetValue("time_expire", DateTime.Now.AddMinutes(10).ToString("yyyyMMddHHmmss"));//交易结束时间 data.SetValue("goods_tag", "tag");//商品标记 data.SetValue("trade_type", "NATIVE");//交易类型 data.SetValue("product_id", WxPayApi.GenerateOutTradeNo());//商品ID result = WxPayApi.UnifiedOrder(data).GetValue("code_url").ToString();//调用统一下单接口 } } return result; }
在这里,我是把公司的商户订单号放在了attach字段上,因为公司的商户订单号比较长,超过了32位。out_trade_no与product_id字段最多32位,请慎重!
微信中的价格不能带小数,所以0.01元要写成100。
Step2: 成功返回二维码字符串之后就可以在生成图片了,我这边使用了ThoughtWorks.QRCode.dll来生成图片:
////// 根据字符串得到相应的二维码 /// /// /// /// ///public static Image CreateQRCodeImage(string qrInfo, string productName, string version) { try { if (!string.IsNullOrEmpty(qrInfo)) { QRCodeEncoder encoder = new QRCodeEncoder { QRCodeEncodeMode = QRCodeEncoder.ENCODE_MODE.BYTE, QRCodeScale = 4, QRCodeVersion = 0, QRCodeErrorCorrect = QRCodeEncoder.ERROR_CORRECTION.M }; //编码方式(注意:BYTE能支持中文,ALPHA_NUMERIC扫描出来的都是数字) //大小(值越大生成的二维码图片像素越高) //版本(注意:设置为0主要是防止编码的字符串太长时发生错误) //错误效验、错误更正(有4个等级) Image image = encoder.Encode(qrInfo, Encoding.GetEncoding("utf-8")); string filename = $"{productName}_{version}.png"; var userLocalPath = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData); var docPath = Path.Combine(userLocalPath, @"Your Product\QRCode"); if (!Directory.Exists(docPath)) { Directory.CreateDirectory(docPath); } string filepath = Path.Combine(docPath, filename); using (FileStream fs = new FileStream(filepath, FileMode.OpenOrCreate, FileAccess.Write)) { image.Save(fs, System.Drawing.Imaging.ImageFormat.Png); fs.Close(); image.Dispose(); } return image; } } catch (Exception) { return null; } return null; }
Step3: 当用户扫完二维码之后,微信会发起回调,这时候我们就可以处理自己的业务逻辑了。这里我的UpdatePayStatus返回的是一个空页面
////// 回调函数 /// public ActionResult UpdatePayStatus() { //接收从微信后台POST过来的数据 System.IO.Stream s = Request.InputStream; int count = 0; byte[] buffer = new byte[1024]; StringBuilder builder = new StringBuilder(); while ((count = s.Read(buffer, 0, 1024)) > 0) { builder.Append(Encoding.UTF8.GetString(buffer, 0, count)); } s.Flush(); s.Close(); s.Dispose(); //转换数据格式并验证签名 WxPayData data = new WxPayData(); try { data.FromXml(builder.ToString()); } catch (WxPayException ex) { //若签名错误,则立即返回结果给微信支付后台 WxPayData res = new WxPayData(); res.SetValue("return_code", "FAIL"); res.SetValue("return_msg", ex.Message); LogEntity signErrorLog = new LogEntity(); signErrorLog.errorMessage = ex.Message; LogHelper.WriteLog(signErrorLog, null); Response.Write(res.ToXml()); Response.End(); } ProcessNotify(data); return View(); } ////// 处理回调数据 /// /// public void ProcessNotify(WxPayData data) { WxPayData notifyData = data; //检查支付结果中transaction_id是否存在 if (!notifyData.IsSet("transaction_id")) { //若transaction_id不存在,则立即返回结果给微信支付后台 WxPayData res = new WxPayData(); res.SetValue("return_code", "FAIL"); res.SetValue("return_msg", "支付结果中微信订单号不存在"); LogEntity orderLog = new LogEntity(); orderLog.errorMessage = "支付结果中微信订单号不存在"; LogHelper.WriteLog(orderLog, null); Response.Write(res.ToXml()); Response.End(); } string transaction_id = notifyData.GetValue("transaction_id").ToString(); //查询订单,判断订单真实性 if (!QueryOrder(transaction_id)) { //若订单查询失败,则立即返回结果给微信支付后台 WxPayData res = new WxPayData(); res.SetValue("return_code", "FAIL"); res.SetValue("return_msg", "订单查询失败"); LogEntity orderqueryLog = new LogEntity(); orderqueryLog.errorMessage = "订单查询失败"; LogHelper.WriteLog(orderqueryLog, null); Response.Write(res.ToXml()); Response.End(); } //查询订单成功 else { WxPayData res = new WxPayData(); res.SetValue("return_code", "SUCCESS"); res.SetValue("return_msg", "OK"); SetPaymentResult(data); //这里的参数是 data !!! 不是 res !!! Response.Write(res.ToXml()); Response.End(); } } ////// 商户后台更新 /// /// private void SetPaymentResult(WxPayData res) { var isSucessFlagOne = res.GetValue("return_code").ToString(); var isSuccessFlagTwo = res.GetValue("result_code").ToString(); if (isSucessFlagOne == "SUCCESS" && isSuccessFlagTwo == "SUCCESS") { //自己的业务逻辑 !!!! } } //查询订单 private bool QueryOrder(string transaction_id) { WxPayData req = new WxPayData(); req.SetValue("transaction_id", transaction_id); WxPayData res = WxPayApi.OrderQuery(req); if (res.GetValue("return_code").ToString() == "SUCCESS" && res.GetValue("result_code").ToString() == "SUCCESS") { return true; } else { return false; } }
以上是".NET微信扫码支付接入的示例分析"这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注行业资讯频道!
订单
支付
后台
字符
字符串
结果
二维
二维码
查询
订单号
商户
图片
数据
错误
商品
交易
示例
分析
接入
成功
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
筛选下拉框无数据库
虚拟服务器有什么意思
232串口联网服务器
亿联网络技术总监面试
产品经理对网络技术的定位
网络安全产品资质军b
杭州市安卡网络技术有限公司
服务器外带管理口描述
遗作下载软件开发
腾跃科技软件开发
软件开发考研专业课科目
镇府机关单位网络安全相关制度
冶金专业和网络安全专业哪个好
电梯服务器大全
崇明区上门软件开发厂家哪个好
数据库维度指的是什么
数据库主键自增语句
合肥企业软件开发公司
线美互联网科技
华为服务器怎么登陆
迁移服务器数据快不快
网络安全检查违规
汕头汽车软件开发收费
在数据库技术中的实体联系模型
司法局参与网络安全宣传
深圳白领神器网络技术
与服务器连接已断开
服务器内核调优
香港新世界电讯服务器
软件开发与云计算哪个就业好