侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

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

微信(小程序)  /  管理员 发布于 7年前   124

一、前言

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

微信提供的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;  } }

三、结尾

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

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


  • 上一条:
    .NET开发实现一个微信跳一跳的辅助程序
    下一条:
    微信语音上传 下载功能实例代码
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • 微信模板消息改版后发送规则记录(微信订阅消息参数值内容限制说明)(1个评论)
    • 微信支付v3对接所需工具及命令(0个评论)
    • 2023年9月1日起:微信小程序必须备案才能上线运营(0个评论)
    • 腾讯官方客服回应了:微信好友上限约10000个!(1个评论)
    • 2023年做微信小程序的老铁注意:新增收费项、微信小程序获取手机号也收费了(2个评论)
    • 近期文章
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 欧盟关于强迫劳动的规定的官方举报渠道及官方举报网站(0个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf文件功能(0个评论)
    • Laravel从Accel获得5700万美元A轮融资(0个评论)
    • 在go + gin中gorm实现指定搜索/区间搜索分页列表功能接口实例(0个评论)
    • 在go语言中实现IP/CIDR的ip和netmask互转及IP段形式互转及ip是否存在IP/CIDR(0个评论)
    • PHP 8.4 Alpha 1现已发布!(0个评论)
    • Laravel 11.15版本发布 - Eloquent Builder中添加的泛型(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2016-10
    • 2017-10
    • 2018-01
    • 2020-03
    • 2021-06
    • 2021-10
    • 2022-03
    • 2023-02
    • 2023-06
    • 2023-07
    • 2023-08
    • 2023-10
    • 2023-11
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客