• asp.net mvc PC端二维码支付实例(微信二维码支付)


    一、微信支付方式介绍

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

    1、刷卡支付

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

    2、扫码支付

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

    3、公众号支付

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

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

    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

  • 相关阅读:
    CSS技巧(二):CSS hack
    CSS技巧(一):清除浮动总洁
    js中apply方法的使用
    call 方法
    正则表达式
    【js事件详解】js事件封装函数,js跨浏览器事件处理机制
    [BZOJ 4300] 绝世好题
    [SPOJ1557] Can you answer these queries II
    [Codeforces 877E] Danil and a Part-time Job
    [Codeforces 914D] Bash and a Tough Math Puzzle
  • 原文地址:https://www.cnblogs.com/kwstu/p/7797384.html
Copyright © 2020-2023  润新知