.NET微信扫码支付接入(模式二-NATIVE)

 更新时间:2021年9月22日 10:03  点击:1811

一、前言

      经过两三天的琢磨总算完成了微信扫码支付功能,不得不感叹几句:

微信提供的DEMO不错,直接复制粘贴就可以跑起来了;
微信的配置平台我真是服了。公众平台、商户平台、开放平台,一个平台一套账户密码,大写的恶心
       DEMO地址:https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=11_1

       .NET版DEMO中的Lib文件夹是关键,直接复制到自己的代码里,或者打成dll随个人意愿。

二、正文

Step1:肯定是产生商户订单号,然后传给微信后台,由微信去组成二维码字符串,然后返给你,你再把字符串做成图片;

 /// <summary>
 /// 获取二维码
 /// </summary>
 /// <param name="orderNumber"></param>
 /// <returns></returns>
 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来生成图片:

 /// <summary>
 /// 根据字符串得到相应的二维码
 /// </summary>
 /// <param name="qrInfo"></param>
 /// <param name="productName"></param>
 /// <param name="version"></param>
 /// <returns></returns>
 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返回的是一个空页面

 /// <summary>
 /// 回调函数
 /// </summary>
 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();
 }


 /// <summary>
 /// 处理回调数据
 /// </summary>
 /// <param name="data"></param>
 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();
  }
 }

 /// <summary>
 /// 商户后台更新
 /// </summary>
 /// <param name="res"></param>
 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;
  }
 }

三、结尾

      做完支付宝与微信扫码支付发现支付宝的接入要比微信方便很多,还有一个同步请求。而且吐槽个其它的,微信开放平台的审批速度要比支付宝的审批慢很多。还有微信支付最后上线前不需要非得用沙箱测试,做完之后直接一分钱一分钱测试即可。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持猪先飞。

[!--infotagslink--]

相关文章

  • ASP.NET购物车实现过程详解

    这篇文章主要为大家详细介绍了ASP.NET购物车的实现过程,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-09-22
  • .NET Core下使用Kafka的方法步骤

    这篇文章主要介绍了.NET Core下使用Kafka的方法步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-09-22
  • 在ASP.NET 2.0中操作数据之七十二:调试存储过程

    在开发过程中,使用Visual Studio的断点调试功能可以很方便帮我们调试发现程序存在的错误,同样Visual Studio也支持对SQL Server里面的存储过程进行调试,下面就让我们看看具体的调试方法。...2021-09-22
  • Win10 IIS 安装.net 4.5的方法

    这篇文章主要介绍了Win10 IIS 安装及.net 4.5及Win10安装IIS并配置ASP.NET 4.0的方法,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下...2021-09-22
  • C#微信开发之发送模板消息

    这篇文章主要为大家详细介绍了C#微信开发之发送模板消息的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-06-25
  • PHP开发微信支付的代码分享

    微信支付,即便交了保证金,你还是处理测试阶段,不能正式发布。必须到你通过程序测试提交订单、发货通知等数据到微信的系统中,才能申请发布。然后,因为在微信中是通过JS方式调用API,必须在微信后台设置支付授权目录,而且要到...2014-05-31
  • iOS新版微信底部返回横条问题的解决

    这篇文章主要介绍了iOS新版微信底部返回横条问题的解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-06-30
  • 详解.NET Core 3.0 里新的JSON API

    这篇文章主要介绍了详解.NET Core 3.0 里新的JSON API,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-09-22
  • .net数据库操作框架SqlSugar的简单入门

    这篇文章主要介绍了.net数据库操作框架SqlSugar的简单入门,帮助大家更好的理解和学习使用.net技术,感兴趣的朋友可以了解下...2021-09-22
  • ASP.NET Core根据环境变量支持多个 appsettings.json配置文件

    这篇文章主要介绍了ASP.NET Core根据环境变量支持多个 appsettings.json配置文件,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-09-22
  • 记一次EFCore类型转换错误及解决方案

    这篇文章主要介绍了记一次EFCore类型转换错误及解决方案,帮助大家更好的理解和学习使用asp.net core,感兴趣的朋友可以了解下...2021-09-22
  • 基于C#实现微信支付宝扫码支付功能

    为公司系统业务需要,这几天了解了一下微信和支付宝扫码支付的接口,并用c#实现了微信和支付宝扫码支付的功能。需要的朋友跟随小编一起看看吧...2020-06-25
  • Python爬取微信小程序通用方法代码实例详解

    这篇文章主要介绍了Python爬取微信小程序通用方法代码实例详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-09-29
  • C#实现的微信网页授权操作逻辑封装示例

    这篇文章主要介绍了C#实现的微信网页授权操作逻辑封装,分析了微信网页授权操作的原理、步骤并给出了C#实现的网页授权操作逻辑封装类,需要的朋友可以参考下...2020-06-25
  • iOS新版微信底部工具栏遮挡问题完美解决

    这篇文章主要介绍了iOS新版微信底部工具栏遮挡问题完美解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-06-30
  • C#图像识别 微信跳一跳机器人

    这篇文章主要为大家详细介绍了C#图像识别,微信跳一跳机器人,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-06-25
  • 详解ASP.NET Core 中基于工厂的中间件激活的实现方法

    这篇文章主要介绍了ASP.NET Core 中基于工厂的中间件激活的实现方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-09-22
  • C#使用Ado.Net更新和添加数据到Excel表格的方法

    这篇文章主要介绍了C#使用Ado.Net更新和添加数据到Excel表格的方法,较为详细的分析了OLEDB的原理与使用技巧,可实现较为方便的操作Excel数据,需要的朋友可以参考下...2020-06-25
  • .NET C#利用ZXing生成、识别二维码/条形码

    ZXing是一个开放源码的,用Java实现的多种格式的1D/2D条码图像处理库,它包含了联系到其他语言的端口。这篇文章主要给大家介绍了.NET C#利用ZXing生成、识别二维码/条形码的方法,文中给出了详细的示例代码,有需要的朋友们可以参考借鉴。...2020-06-25
  • asp.net通过消息队列处理高并发请求(以抢小米手机为例)

    这篇文章主要介绍了asp.net通过消息队列处理高并发请求(以抢小米手机为例),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-09-22