.NET微信扫码支付接入的示例分析
发表于:2025-01-20 作者:千家信息网编辑
千家信息网最后更新 2025年01月20日,这篇文章主要介绍.NET微信扫码支付接入的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!Step1:肯定是产生商户订单号,然后传给微信后台,由微信去组成二维码字符串,然
千家信息网最后更新 2025年01月20日.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安全错误
数据库的锁怎样保障安全
梦幻花园服务器异常
辅导软件开发定制
gis创建企业级地理数据库
属地互联网服务器
摩尔互联网科技诈骗
日照网络安全案件
数据库条件怎么去判断是否为空
审计机关网络安全知识培训内容
没备案的域名如何使用国内服务器
乌镇互联网黑科技
广东时间频率同步服务器
学软件开发现在就业怎样
如何搭建我的世界手游服务器网易
数据库commit语句
计算机网络技术.
数据库注册清理工具
网络技术与库存管理
使用模拟器配置网络安全
网络安全信息案例
有经验的软件开发工资待遇怎么样
内江软件开发必推青岗科技
软件开发年终报告总结ppt
合阳天气预报软件开发
私人数据库使用
中国十大软件开发的公司
可租用服务器都有哪些
外国网络安全设备
成都web前端软件开发有用吗
申请腾讯微信数据库
江门数字软件开发代理价格