asp.net mvc PC端二维码支付实例(微信二维码支付)
一、微信支付方式介绍
微信提供了各种支付方式,试用于各种不同的支付场景,主要有如下几种:
1、刷卡支付
刷卡支付是用户展示微信钱包内的“刷卡条码/二维码”给商户系统扫描后直接完成支付的模式。主要应用线下面对面收银的场景。
2、扫码支付
扫码支付是商户系统按微信支付协议生成支付二维码,用户再用微信“扫一扫”完成支付的模式。该模式适用于PC网站支付、实体店单品或订单支付、媒体广告支付等场景。
3、公众号支付
公众号支付是用户在微信中打开商户的H5页面,商户在H5页面通过调用微信支付提供的JSAPI接口调起微信支付模块完成支付。应用场景有:
- ◆ 用户在微信公众账号内进入商家公众号,打开某个主页面,完成支付
- ◆ 用户的好友在朋友圈、聊天窗口等分享商家页面连接,用户点击链接打开商家页面,完成支付
- ◆ 将商户页面转换成二维码,用户扫描二维码后在微信浏览器中打开页面后完成支付
4、APP支付
APP支付又称移动端支付,是商户通过在移动端应用APP中集成开放SDK调起微信支付模块完成支付的模式。
5、H5支付
H5支付用于在手机端微信外浏览器进行支付,笔者的测试本支付方式在微信内不能使用。
本文主要讲解.net mvc实现扫码支付方法,具体代码如下:
- /// <summary>
- /// 支付首页
- /// </summary>
- /// <returns></returns>
- public ActionResult Index()
- {
- NativePay nativePay = new NativePay();
- //总金额
- int total_fee = ;
- //生成订单
- //判断是否有未支付订单
- string productId = "产品ID";
- decimal moeny = Convert.ToDecimal();//支付金额
- string orderId = "订单ID";
- //订单描述
- string body = "订单描述";
- //生成扫码支付模式二url
- WxPayData data = new WxPayData();
- data.SetValue("body", "商品描述");//商品描述
- data.SetValue("attach", body);//附加数据
- data.SetValue("out_trade_no", orderId);//随机字符串
- data.SetValue("total_fee", total_fee.ToString());//总金额
- data.SetValue("time_start", DateTime.Now.ToString("yyyyMMddHHmmss"));//交易起始时间
- data.SetValue("time_expire", DateTime.Now.AddMinutes().ToString("yyyyMMddHHmmss"));//交易结束时间
- data.SetValue("goods_tag", orderId);//商品标记
- data.SetValue("trade_type", "NATIVE");//交易类型
- data.SetValue("product_id", productId);//商品ID
- data.SetValue("notify_url", "http://www.*****.com.cn/Pay/ResultNotify");//支付成功返回调用
- WxPayData result = WxPayApi.UnifiedOrder(data);//调用统一下单接口
- ViewBag.ImageUrl2 = "/Pay/MakeQRCode?data=" + HttpUtility.UrlEncode(result.GetValue("code_url").ToString());
- return View();
- }
- /// <summary>
- /// 生成支付二维码图片
- /// </summary>
- /// <returns></returns>
- public ActionResult MakeQRCode()
- {
- if (!string.IsNullOrEmpty(Request.QueryString["data"]))
- {
- string str = Request.QueryString["data"];
- //初始化二维码生成工具
- QRCodeEncoder qrCodeEncoder = new QRCodeEncoder();
- qrCodeEncoder.QRCodeEncodeMode = QRCodeEncoder.ENCODE_MODE.BYTE;
- qrCodeEncoder.QRCodeErrorCorrect = QRCodeEncoder.ERROR_CORRECTION.M;
- qrCodeEncoder.QRCodeVersion = ;
- qrCodeEncoder.QRCodeScale = ;
- //将字符串生成二维码图片
- Bitmap image = qrCodeEncoder.Encode(str, Encoding.Default);
- //保存为PNG到内存流
- MemoryStream ms = new MemoryStream();
- image.Save(ms, ImageFormat.Png);
- //输出二维码图片
- return File(ms.GetBuffer(), @"image/png");
- //Response.BinaryWrite(ms.GetBuffer());
- //Response.End();
- }
- return Content("Error");
- }
- /// <summary>
- /// 支付成功返回处理订单信息
- /// </summary>
- /// <returns></returns>
- public ActionResult ResultNotify()
- {
- WxPayData notifyData = GetNotifyData();
- //检查支付结果中transaction_id是否存在
- if (!notifyData.IsSet("transaction_id"))
- {
- //若transaction_id不存在,则立即返回结果给微信支付后台
- WxPayData res = new WxPayData();
- res.SetValue("return_code", "FAIL");
- res.SetValue("return_msg", "支付结果中微信订单号不存在");
- Log.Error(this.GetType().ToString(), "The Pay result is error : " + res.ToXml());
- return Content("支付结果中微信订单号不存在");
- }
- string transaction_id = notifyData.GetValue("transaction_id").ToString();
- string trade_no = notifyData.GetValue("out_trade_no").ToString();
- //查询订单,判断订单真实性
- if (!QueryOrder(transaction_id))
- {
- //若订单查询失败,则立即返回结果给微信支付后台
- WxPayData res = new WxPayData();
- res.SetValue("return_code", "FAIL");
- res.SetValue("return_msg", "订单查询失败");
- Log.Error(this.GetType().ToString(), "Order query failure : " + res.ToXml());
- return Content("订单查询失败");
- }
- //查询订单成功
- else
- {
- WxPayData res = new WxPayData();
- res.SetValue("return_code", "SUCCESS");
- res.SetValue("return_msg", "OK");
- Log.Info(this.GetType().ToString(), "order query success : " + res.ToXml());
- //更新支付状态
- return Content("支付成功" + res.ToXml());
- }
- }
四、源码下载:http://www.kwstu.com/ResourcesView/weixin_201710301127489173
咨询QQ:806693619
asp.net mvc PC端二维码支付实例(微信二维码支付)的更多相关文章
- 基于ASP.NET MVC的热插拔模块式开发框架(OrchardNoCMS)介绍(二)
基于ASP.NET MVC的热插拔模块式开发框架(OrchardNoCMS)介绍(二) 之前文章中给大家说明了下我这个小小的想法,发现还是有不少人的支持和关注.你们的鼓励是对我最大的支持. 我总结了了 ...
- ASP.NET MVC 4 插件化架构简单实现-实例篇
先回顾一下上篇决定的做法: 1.定义程序集搜索目录(临时目录). 2.将要使用的各种程序集(插件)复制到该目录. 3.加载临时目录中的程序集. 4.定义模板引擎的搜索路径. 5.在模板引擎的查找页面方 ...
- asp.net mvc 之旅 —— 第六站 ActionFilter的应用及源码分析
这篇文章我们开始看一下ActionFilter,从名字上其实就大概知道ActionFilter就是Action上的Filter,对吧,那么Action上的Filter大概有几个呢??? 这个问题其实还 ...
- ASP.NET MVC 3 Model【通过一简单实例一步一步的介绍】
今天主要讲Model的两个方面: 1. ASP.Net MVC 3 Model 简介 通过一简单的事例一步一步的介绍 2. ASP.Net MVC 3 Model 的一些验证 MVC 中 Model ...
- 在phpWeChat里生成一个临时二维码(非微信二维码)
phpWeChat作为支持Pc+H5开发的管理系统,内置一套二维码生成API,访问地址: 您的域名/api/qrcode/index.php?data=二维码数据 以下为使用示例 使用时有一点需要注意 ...
- asp.net+mvc+easyui+sqlite 简单用户系统学习之旅(二)—— easyui的简单实用
下面开始在UserManager.Web中利用easyUI构建web. 1. 先删除自带的controllers.models和views(里面的shared和web.config可以保存)下面的文件 ...
- Asp.net MVC 服务端验证多语言错误
服务端验证用户提交信息时为了实现多语言使用了资源文件,如: using System.ComponentModel.DataAnnotations; public class UserModel { ...
- asp.net mvc 注册中的邮箱激活功能实现(二)
邮件发送功能封装 /// <summary> /// 发送注册邮件 /// </summary> /// <param name ...
- ASP.NET MVC中的路由IRouteConstraint方法应用实例
在如下代码的写法中: public class RouteConfig { public static void RegisterRoutes(RouteCollection routes) { ro ...
随机推荐
- jQuery怎么选择两个class属性
Jquery选择多个Class属性: $('.className1,.className2,.className4,.className5')
- Scala-Numbers
Scala之Numbers 一.前言 前面已经学习了Scala中的String,接着学习Scala的Numbers. 二.Numbers 在Scala中,所有的数字类型,如Byte,Char,Doub ...
- WPF的逻辑树与视觉树(1)基本概念
原文:WPF的逻辑树与视觉树(1)基本概念 一.摘要 逻辑树与视觉树属于WPF的基本概念,学过WPF或者Silverlight的朋友一定会对其有所耳闻,这篇文章将来探讨逻辑树与视觉树的特质以及 ...
- Qt 格式转换问题 记录(好多方法)
用Qt经常头痛于一些格式不能通用的问题 在此记录备用 1 (20120112)QString转为Char * QString *str; char *a; str="hello word ! ...
- 开源|LightGBM:三天内收获GitHub 1000+ 星
原创 2017-01-05 LightGBM 微软研究院AI头条 [导读]不久前微软DMTK(分布式机器学习工具包)团队在GitHub上开源了性能超越其他boosting工具的LightGBM,在三天 ...
- WPF中取得系统字体列表
原文:WPF中取得系统字体列表 在GDI+中,我们可以通过如下方式取得系统所有字体: foreach(FontFamily f in FontFamily.Families){ // 处理代码} ...
- 优秀开源项目之四:CrashRptProbe,查询程序奔溃的利器
1.背景: 在开发人员进行项目开发和调试代码时,有一个非常困扰的问题,就是程序在调试运行过程中会莫名其妙地异常退出.由于导致异常退出的问题非常多,因此在面对这种无任何提示的异常退出时,开发人员会非常无 ...
- 中国新超算彻底告别进口CPU 国产芯片已可与国外抗衡
日前,飞腾已经完成FT-2000plus服务器CPU的研制工作,飞腾公司的合作伙伴正在积极研发相应的整机产品.FT-2000plus这款芯片是以FT2000为基础的改进版本,虽然在单核性能上和Inte ...
- 如何将任意文件固定在 Win10 的开始屏幕中
虽然Wox和Launchy是我日常启动程序的主力方式,不过开始屏幕的图标方便归类,这是快速启动工具所不能提供的,因此我也会将最常用的程序在开始屏幕上分类固定. 最近需要将一个常用的批处理文件(*.ba ...
- IOS status bar
从iOS7开始,该系统提供2样的管理风格状态栏 由UIViewController管理(每UIViewController我们可以有各自不同的状态栏) 由UIApplication管理(由其统一管理的 ...