一、微信支付方式介绍

微信提供了各种支付方式,试用于各种不同的支付场景,主要有如下几种:

1、刷卡支付

刷卡支付是用户展示微信钱包内的“刷卡条码/二维码”给商户系统扫描后直接完成支付的模式。主要应用线下面对面收银的场景。

2、扫码支付

扫码支付是商户系统按微信支付协议生成支付二维码,用户再用微信“扫一扫”完成支付的模式。该模式适用于PC网站支付、实体店单品或订单支付、媒体广告支付等场景。

3、公众号支付

公众号支付是用户在微信中打开商户的H5页面,商户在H5页面通过调用微信支付提供的JSAPI接口调起微信支付模块完成支付。应用场景有:

  1. ◆ 用户在微信公众账号内进入商家公众号,打开某个主页面,完成支付
  2. ◆ 用户的好友在朋友圈、聊天窗口等分享商家页面连接,用户点击链接打开商家页面,完成支付
  3. ◆ 将商户页面转换成二维码,用户扫描二维码后在微信浏览器中打开页面后完成支付

4、APP支付

APP支付又称移动端支付,是商户通过在移动端应用APP中集成开放SDK调起微信支付模块完成支付的模式。

5、H5支付

H5支付用于在手机端微信外浏览器进行支付,笔者的测试本支付方式在微信内不能使用。

本文主要讲解.net mvc实现扫码支付方法,具体代码如下:

二、调起支付Controller代码
  1. /// <summary>
  2. /// 支付首页
  3. /// </summary>
  4. /// <returns></returns>
  5. public ActionResult Index()
  6. {
  7. NativePay nativePay = new NativePay();
  8. //总金额
  9. int total_fee = ;
  10. //生成订单
  11. //判断是否有未支付订单
  12. string productId = "产品ID";
  13. decimal moeny = Convert.ToDecimal();//支付金额
  14. string orderId = "订单ID";
  15. //订单描述
  16. string body = "订单描述";
  17. //生成扫码支付模式二url
  18. WxPayData data = new WxPayData();
  19. data.SetValue("body", "商品描述");//商品描述
  20. data.SetValue("attach", body);//附加数据
  21. data.SetValue("out_trade_no", orderId);//随机字符串
  22. data.SetValue("total_fee", total_fee.ToString());//总金额
  23. data.SetValue("time_start", DateTime.Now.ToString("yyyyMMddHHmmss"));//交易起始时间
  24. data.SetValue("time_expire", DateTime.Now.AddMinutes().ToString("yyyyMMddHHmmss"));//交易结束时间
  25. data.SetValue("goods_tag", orderId);//商品标记
  26. data.SetValue("trade_type", "NATIVE");//交易类型
  27. data.SetValue("product_id", productId);//商品ID
  28. data.SetValue("notify_url", "http://www.*****.com.cn/Pay/ResultNotify");//支付成功返回调用
  29. WxPayData result = WxPayApi.UnifiedOrder(data);//调用统一下单接口
  30. ViewBag.ImageUrl2 = "/Pay/MakeQRCode?data=" + HttpUtility.UrlEncode(result.GetValue("code_url").ToString());
  31. return View();
  32. }
  33. /// <summary>
  34. /// 生成支付二维码图片
  35. /// </summary>
  36. /// <returns></returns>
  37. public ActionResult MakeQRCode()
  38. {
  39. if (!string.IsNullOrEmpty(Request.QueryString["data"]))
  40. {
  41. string str = Request.QueryString["data"];
  42.  
  43. //初始化二维码生成工具
  44. QRCodeEncoder qrCodeEncoder = new QRCodeEncoder();
  45. qrCodeEncoder.QRCodeEncodeMode = QRCodeEncoder.ENCODE_MODE.BYTE;
  46. qrCodeEncoder.QRCodeErrorCorrect = QRCodeEncoder.ERROR_CORRECTION.M;
  47. qrCodeEncoder.QRCodeVersion = ;
  48. qrCodeEncoder.QRCodeScale = ;
  49.  
  50. //将字符串生成二维码图片
  51. Bitmap image = qrCodeEncoder.Encode(str, Encoding.Default);
  52.  
  53. //保存为PNG到内存流
  54. MemoryStream ms = new MemoryStream();
  55. image.Save(ms, ImageFormat.Png);
  56.  
  57. //输出二维码图片
  58. return File(ms.GetBuffer(), @"image/png");
  59. //Response.BinaryWrite(ms.GetBuffer());
  60. //Response.End();
  61. }
  62. return Content("Error");
  63. }
三、支付成功后台处理方法
  1. /// <summary>
  2. /// 支付成功返回处理订单信息
  3. /// </summary>
  4. /// <returns></returns>
  5. public ActionResult ResultNotify()
  6. {
  7. WxPayData notifyData = GetNotifyData();
  8. //检查支付结果中transaction_id是否存在
  9. if (!notifyData.IsSet("transaction_id"))
  10. {
  11. //若transaction_id不存在,则立即返回结果给微信支付后台
  12. WxPayData res = new WxPayData();
  13. res.SetValue("return_code", "FAIL");
  14. res.SetValue("return_msg", "支付结果中微信订单号不存在");
  15. Log.Error(this.GetType().ToString(), "The Pay result is error : " + res.ToXml());
  16. return Content("支付结果中微信订单号不存在");
  17. }
  18.  
  19. string transaction_id = notifyData.GetValue("transaction_id").ToString();
  20. string trade_no = notifyData.GetValue("out_trade_no").ToString();
  21. //查询订单,判断订单真实性
  22. if (!QueryOrder(transaction_id))
  23. {
  24. //若订单查询失败,则立即返回结果给微信支付后台
  25. WxPayData res = new WxPayData();
  26. res.SetValue("return_code", "FAIL");
  27. res.SetValue("return_msg", "订单查询失败");
  28. Log.Error(this.GetType().ToString(), "Order query failure : " + res.ToXml());
  29. return Content("订单查询失败");
  30. }
  31. //查询订单成功
  32. else
  33. {
  34. WxPayData res = new WxPayData();
  35. res.SetValue("return_code", "SUCCESS");
  36. res.SetValue("return_msg", "OK");
  37. Log.Info(this.GetType().ToString(), "order query success : " + res.ToXml());
  38. //更新支付状态
  39.  
  40. return Content("支付成功" + res.ToXml());
  41. }
  42. }

四、源码下载:http://www.kwstu.com/ResourcesView/weixin_201710301127489173

咨询QQ:806693619

asp.net mvc PC端二维码支付实例(微信二维码支付)的更多相关文章

  1. 基于ASP.NET MVC的热插拔模块式开发框架(OrchardNoCMS)介绍(二)

    基于ASP.NET MVC的热插拔模块式开发框架(OrchardNoCMS)介绍(二) 之前文章中给大家说明了下我这个小小的想法,发现还是有不少人的支持和关注.你们的鼓励是对我最大的支持. 我总结了了 ...

  2. ASP.NET MVC 4 插件化架构简单实现-实例篇

    先回顾一下上篇决定的做法: 1.定义程序集搜索目录(临时目录). 2.将要使用的各种程序集(插件)复制到该目录. 3.加载临时目录中的程序集. 4.定义模板引擎的搜索路径. 5.在模板引擎的查找页面方 ...

  3. asp.net mvc 之旅 —— 第六站 ActionFilter的应用及源码分析

    这篇文章我们开始看一下ActionFilter,从名字上其实就大概知道ActionFilter就是Action上的Filter,对吧,那么Action上的Filter大概有几个呢??? 这个问题其实还 ...

  4. ASP.NET MVC 3 Model【通过一简单实例一步一步的介绍】

    今天主要讲Model的两个方面: 1. ASP.Net MVC 3 Model 简介 通过一简单的事例一步一步的介绍 2. ASP.Net MVC 3 Model 的一些验证 MVC 中 Model ...

  5. 在phpWeChat里生成一个临时二维码(非微信二维码)

    phpWeChat作为支持Pc+H5开发的管理系统,内置一套二维码生成API,访问地址: 您的域名/api/qrcode/index.php?data=二维码数据 以下为使用示例 使用时有一点需要注意 ...

  6. asp.net+mvc+easyui+sqlite 简单用户系统学习之旅(二)—— easyui的简单实用

    下面开始在UserManager.Web中利用easyUI构建web. 1. 先删除自带的controllers.models和views(里面的shared和web.config可以保存)下面的文件 ...

  7. Asp.net MVC 服务端验证多语言错误

    服务端验证用户提交信息时为了实现多语言使用了资源文件,如: using System.ComponentModel.DataAnnotations; public class UserModel { ...

  8. asp.net mvc 注册中的邮箱激活功能实现(二)

    邮件发送功能封装 /// <summary>        /// 发送注册邮件        /// </summary>        /// <param name ...

  9. ASP.NET MVC中的路由IRouteConstraint方法应用实例

    在如下代码的写法中: public class RouteConfig { public static void RegisterRoutes(RouteCollection routes) { ro ...

随机推荐

  1. jQuery怎么选择两个class属性

    Jquery选择多个Class属性: $('.className1,.className2,.className4,.className5')

  2. Scala-Numbers

    Scala之Numbers 一.前言 前面已经学习了Scala中的String,接着学习Scala的Numbers. 二.Numbers 在Scala中,所有的数字类型,如Byte,Char,Doub ...

  3. WPF的逻辑树与视觉树(1)基本概念

    原文:WPF的逻辑树与视觉树(1)基本概念     一.摘要 逻辑树与视觉树属于WPF的基本概念,学过WPF或者Silverlight的朋友一定会对其有所耳闻,这篇文章将来探讨逻辑树与视觉树的特质以及 ...

  4. Qt 格式转换问题 记录(好多方法)

    用Qt经常头痛于一些格式不能通用的问题 在此记录备用 1 (20120112)QString转为Char * QString *str; char *a; str="hello word ! ...

  5. 开源|LightGBM:三天内收获GitHub 1000+ 星

    原创 2017-01-05 LightGBM 微软研究院AI头条 [导读]不久前微软DMTK(分布式机器学习工具包)团队在GitHub上开源了性能超越其他boosting工具的LightGBM,在三天 ...

  6. WPF中取得系统字体列表

    原文:WPF中取得系统字体列表 在GDI+中,我们可以通过如下方式取得系统所有字体: foreach(FontFamily f in FontFamily.Families){   // 处理代码} ...

  7. 优秀开源项目之四:CrashRptProbe,查询程序奔溃的利器

    1.背景: 在开发人员进行项目开发和调试代码时,有一个非常困扰的问题,就是程序在调试运行过程中会莫名其妙地异常退出.由于导致异常退出的问题非常多,因此在面对这种无任何提示的异常退出时,开发人员会非常无 ...

  8. 中国新超算彻底告别进口CPU 国产芯片已可与国外抗衡

    日前,飞腾已经完成FT-2000plus服务器CPU的研制工作,飞腾公司的合作伙伴正在积极研发相应的整机产品.FT-2000plus这款芯片是以FT2000为基础的改进版本,虽然在单核性能上和Inte ...

  9. 如何将任意文件固定在 Win10 的开始屏幕中

    虽然Wox和Launchy是我日常启动程序的主力方式,不过开始屏幕的图标方便归类,这是快速启动工具所不能提供的,因此我也会将最常用的程序在开始屏幕上分类固定. 最近需要将一个常用的批处理文件(*.ba ...

  10. IOS status bar

    从iOS7开始,该系统提供2样的管理风格状态栏 由UIViewController管理(每UIViewController我们可以有各自不同的状态栏) 由UIApplication管理(由其统一管理的 ...