一、微信支付方式介绍
微信提供了各种支付方式,试用于各种不同的支付场景,主要有如下几种:
1、刷卡支付
刷卡支付是用户展示微信钱包内的“刷卡条码/二维码”给商户系统扫描后直接完成支付的模式。主要应用线下面对面收银的场景。
2、扫码支付
扫码支付是商户系统按微信支付协议生成支付二维码,用户再用微信“扫一扫”完成支付的模式。该模式适用于PC网站支付、实体店单品或订单支付、媒体广告支付等场景。
3、公众号支付
公众号支付是用户在微信中打开商户的H5页面,商户在H5页面通过调用微信支付提供的JSAPI接口调起微信支付模块完成支付。应用场景有:
- ◆ 用户在微信公众账号内进入商家公众号,打开某个主页面,完成支付
- ◆ 用户的好友在朋友圈、聊天窗口等分享商家页面连接,用户点击链接打开商家页面,完成支付
- ◆ 将商户页面转换成二维码,用户扫描二维码后在微信浏览器中打开页面后完成支付
4、APP支付
APP支付又称移动端支付,是商户通过在移动端应用APP中集成开放SDK调起微信支付模块完成支付的模式。
5、H5支付
H5支付用于在手机端微信外浏览器进行支付,笔者的测试本支付方式在微信内不能使用。
本文主要讲解.net mvc实现扫码支付方法,具体代码如下:
二、调起支付Controller代码
/// <summary> /// 支付首页 /// </summary> /// <returns></returns> public ActionResult Index() { NativePay nativePay = new NativePay(); //总金额 int total_fee = 1; //生成订单 //判断是否有未支付订单 string productId = "产品ID"; decimal moeny = Convert.ToDecimal(1);//支付金额 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(10).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 = 0; qrCodeEncoder.QRCodeScale = 4; //将字符串生成二维码图片 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