• <label id="pxtpz"><meter id="pxtpz"></meter></label>
      1. <span id="pxtpz"><optgroup id="pxtpz"></optgroup></span>

        當前位置:雨林木風下載站 > 網(wǎng)絡(luò)軟件教程 > 詳細頁面

        微信掃碼支付的Asp.Net MVC開發(fā)

        微信掃碼支付的Asp.Net MVC開發(fā)

        更新時間:2025-09-20 文章作者:未知 信息來源:網(wǎng)絡(luò) 閱讀次數(shù):

        導(dǎo)微信(WeChat)是騰訊公司于2011年1月21日推出的一個為智能終端提供即時通訊服務(wù)的免費應(yīng)用程序,由張小龍所帶領(lǐng)的騰訊廣州研發(fā)中心產(chǎn)品團隊打造 [2] 。微信支持跨通信運營商、跨操作系統(tǒng)平臺...
        微信(WeChat)是騰訊公司于2011年1月21日推出的一個為智能終端提供即時通訊服務(wù)的免費應(yīng)用程序,由張小龍所帶領(lǐng)的騰訊廣州研發(fā)中心產(chǎn)品團隊打造 [2] 。微信支持跨通信運營商、跨操作系統(tǒng)平臺通過網(wǎng)絡(luò)快速發(fā)送免費(需消耗少量網(wǎng)絡(luò)流量)語音短信、視頻、圖片和文字,同時,也可以使用通過共享流媒體內(nèi)容的資料和基于位置的社交插件“搖一搖”、“漂流瓶”、“朋友圈”、”公眾平臺“、”語音記事本“等服務(wù)插件。
        這次給大家?guī)砦⑿艗叽a支付的Asp.Net MVC開發(fā),微信掃碼支付Asp.Net MVC開發(fā)的注意事項有哪些,下面就是實戰(zhàn)案例,一起來看一下。

        這里的掃碼支付指的是PC網(wǎng)站上面使用微信支付,也就是官方的模式二,網(wǎng)站是Asp.net MVC,整理如下。(demo在最下方)

        一、準備工作

        使用的微信API中的統(tǒng)一下單方法,關(guān)鍵的參數(shù)是‘公眾賬號ID(appid)’,‘商戶號(mch_id)’和’商戶支付密鑰(KEY)‘,所以首先要有一個審核過的公眾號,并開通支付功能,然后申請商戶,通過審核后得到商戶號,也就是商戶平臺的登錄名。商戶支付密鑰是用來簽名的,確保url不被篡改。進入商戶平臺后在API安全中設(shè)置,是一個32位的字符串

        微信掃碼支付的Asp.Net MVC開發(fā)

        有這三個參數(shù)后,還有一點要注意的是交易起始時間交易結(jié)束時間的間隔應(yīng)該在五分鐘以上2小時以內(nèi)。不然獲取支付url的時候回報錯。

        二、生成支付二維碼

        有了上面的參數(shù),接下來就是下載SDK: .net SDK及示例 。

        可惜官方的這個示例一開始并不能運行正確。把相關(guān)dll引用MVC目錄下。并創(chuàng)建一個WxPayAPI文件夾把相關(guān)類復(fù)制過來。

        微信掃碼支付的Asp.Net MVC開發(fā) 微信掃碼支付的Asp.Net MVC開發(fā)

        然后將WxPayConfig中的相關(guān)參數(shù)設(shè)置成自己的參數(shù),再修改GetPayUrl方法,

         public string GetPayUrl(Order order,string ip)
                {            if (order == null)
                    {                throw new ArgumentNullException("order");
                    }           
                    var product = order.OrderItems.First();
                    WxPayData data = new WxPayData();
                    data.SetValue("appid", WxPayConfig.APPID);
                    data.SetValue("mch_id", WxPayConfig.MCHID);            // data.SetValue("device_info", "iphone4s");
                    data.SetValue("nonce_str", WxPayApi.GenerateNonceStr());
                    data.SetValue("body", product.AttributeDescription);//商品描述
                    data.SetValue("detail", product.AttributeDescription);//商品描述
                    data.SetValue("attach", "北京分店");//附加數(shù)據(jù)
                    data.SetValue("out_trade_no", order.TradeNumber);//隨機字符串           // data.SetValue("total_fee", Convert.ToInt32(order.OrderTotal * 100));//總金額
                    data.SetValue("total_fee", 1);//總金額
                    data.SetValue("spbill_create_ip",ip);//總金額
                    data.SetValue("time_start", DateTime.Now.ToString("yyyyMMddHHmmss"));//交易起始時間
                    data.SetValue("time_expire", DateTime.Now.AddMinutes(30).ToString("yyyyMMddHHmmss"));//交易結(jié)束時間
                    data.SetValue("goods_tag", "智能嬰兒床");//商品標記
                    data.SetValue("notify_url", "http://www.xxxx.com/Checkout/ResultNotify");//通知地址
                    data.SetValue("trade_type", "NATIVE");//交易類型
                    data.SetValue("product_id", product.ProductId);//商品ID  
                    data.SetValue("sign", data.MakeSign());//簽名
                    Logger.Info("獲得簽名" + data.GetValue("sign"));
                    WxPayData result = WxPayApi.UnifiedOrder(data);//調(diào)用統(tǒng)一下單接口            Logger.Info(result.ToJson());            string url = result.GetValue("code_url").ToString();//獲得統(tǒng)一下單接口返回的二維碼鏈接
                    Logger.Info("pay url:" + url);            return url;
                }

        TradeNumber是調(diào)用WxPayApi.GenerateOutTradeNo() 方法生成的,notify_url是用戶支付之后微信通知的地址。金額的單位是分,只能傳int型或string型,decimal需要轉(zhuǎn)換一下。獲取url成功后,在負責支付的控制器中創(chuàng)建一個payment方法。用于顯示二維碼:

          ActionResult Payment((  ArgumentException( order = _orderService.GetOrderByGuid( user ==  url2 ==  +=

        這里只是返回了一個url,在頁面上:

        <img src="@ViewBag.QRCode" class="qrcode"  />

        后臺用的qrCodeEncoder生成二維碼。

          public FileResult MakeQRCode(string data)
                {            if (string.IsNullOrEmpty(data)) 
                        throw new ArgumentException("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(data, Encoding.Default);            //保存為PNG到內(nèi)存流  
                    MemoryStream ms = new MemoryStream();
                    image.Save(ms, ImageFormat.Jpeg);            return File(ms.ToArray(), "image/jpeg");
                }

        成功之后得到支付頁面:

        微信掃碼支付的Asp.Net MVC開發(fā)

        掃碼后跳出支付頁面:

        微信掃碼支付的Asp.Net MVC開發(fā)

        三、回調(diào)

        用戶支付之后,微信會給之前預(yù)留的接口(接口不能帶參數(shù))發(fā)消息, 網(wǎng)站在收到消息后進行驗證和確認,確定之后再給微信發(fā)一個消息。詳細參數(shù)和文檔請看官方API

        這里還是把demo中的方法稍作改動放到了控制器里面:

          public ActionResult ResultNotify()
                {            //接收從微信后臺POST過來的數(shù)據(jù)
                    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();
                    Logger.Info(this.GetType()+ "Receive data from WeChat : " + builder);            //轉(zhuǎn)換數(shù)據(jù)格式并驗證簽名
                    WxPayData data = new WxPayData();            try
                    {
                        data.FromXml(builder.ToString());
                    }            catch (WxPayException ex)
                    {                //若簽名錯誤,則立即返回結(jié)果給微信支付后臺
                        WxPayData res = new WxPayData();
                        res.SetValue("return_code", "FAIL");
                        res.SetValue("return_msg", ex.Message);
                        Log.Error(this.GetType().ToString(), "Sign check error : " + res.ToXml());
                        Response.Write(res.ToXml());
                        Response.End();
                    }
                    Logger.Info(this.GetType()+ "Check sign success");
                    ProcessNotify(data);            return View();
                }        public void ProcessNotify(WxPayData data)
                {
                    WxPayData notifyData = data;            //檢查支付結(jié)果中transaction_id是否存在
                    if (!notifyData.IsSet("transaction_id"))
                    {                //若transaction_id不存在,則立即返回結(jié)果給微信支付后臺
                        WxPayData res = new WxPayData();
                        res.SetValue("return_code", "FAIL");
                        res.SetValue("return_msg", "支付結(jié)果中微信訂單號不存在");
                        Logger.Error(this.GetType()+"The Pay result is error : " + res.ToXml());
                        Response.Write(res.ToXml());
                        Response.End();
                    }            string transaction_id = notifyData.GetValue("transaction_id").ToString();            //查詢訂單,判斷訂單真實性
                    if (!QueryOrder(transaction_id))
                    {                //若訂單查詢失敗,則立即返回結(jié)果給微信支付后臺
                        WxPayData res = new WxPayData();
                        res.SetValue("return_code", "FAIL");
                        res.SetValue("return_msg", "訂單查詢失敗");
                        Logger.Error(this.GetType()+"Order query failure : " + res.ToXml());
                        Response.Write(res.ToXml());
                        Response.End();
                    }            //查詢訂單成功
                    else
                    {
                        WxPayData res = new WxPayData();
                        res.SetValue("return_code", "SUCCESS");
                        res.SetValue("return_msg", "OK");
                        Logger.Info(this.GetType()+"order query success : " + res.ToXml());                SetPaymentResult(data.GetValue("out_trade_no").ToString(), PaymentStatus.Paid);
                        Response.Write(res.ToXml());
                        Response.End();
                    }
                }

        收到確認后,我們要更新訂單的狀態(tài):

          public void SetPaymentResult(string tradeno, PaymentStatus status)
                {
                    Logger.Info("訂單號:"+tradeno);            var order = _orderService.GetOrderByTradeNumber(tradeno);            if (order != null)
                    {
                        order.PaymentStatus = status;                if (status == PaymentStatus.Paid)
                        {
                            order.PaidDate = DateTime.Now;
                        }
                        _orderService.UpdateOrder(order);
                        Logger.Info("訂單:"+tradeno+"成功更新狀態(tài)為"+status);
                    }
                }

        然后在頁面上檢測訂單的狀態(tài),確定成功后,跳轉(zhuǎn)頁面。

        微信掃碼支付的Asp.Net MVC開發(fā)

        在商戶平臺的后臺,我們可以查詢到:

        微信掃碼支付的Asp.Net MVC開發(fā)

        相信看了本文案例你已經(jīng)掌握了方法,更多精彩請關(guān)注php中文網(wǎng)其它相關(guān)文章!

        推薦閱讀:

        微信支付的退款功能開發(fā)

        H5的視頻播放庫video.js詳解

        微信硬件H5開發(fā)之控制燈光

        JS里特別好用的輕量級日期插件

        以上就是微信掃碼支付的Asp.Net MVC開發(fā)的詳細內(nèi)容,更多請關(guān)注php中文網(wǎng)其它相關(guān)文章!


        微信提供公眾平臺、朋友圈、消息推送等功能,用戶可以通過“搖一搖”、“搜索號碼”、“附近的人”、掃二維碼方式添加好友和關(guān)注公眾平臺,同時微信將內(nèi)容分享給好友以及將用戶看到的精彩內(nèi)容分享到微信朋友圈。

        溫馨提示:喜歡本站的話,請收藏一下本站!

        本類教程下載

        系統(tǒng)下載排行

        主站蜘蛛池模板: 国产精品免费AV片在线观看| 大桥未久亚洲无av码在线 | 欧洲精品成人免费视频在线观看| 综合亚洲伊人午夜网 | 日本一区免费电影| 亚洲第一第二第三第四第五第六| 成人免费午夜无码视频| 亚洲国产av美女网站| 性xxxxx大片免费视频| 亚洲夜夜欢A∨一区二区三区| WWW免费视频在线观看播放| 国产AV无码专区亚洲AV漫画| 9i9精品国产免费久久| 亚洲AV无码第一区二区三区 | 四虎在线成人免费网站| 亚洲噜噜噜噜噜影院在线播放| 无码精品A∨在线观看免费| 亚洲欧美国产国产综合一区| 免费h黄肉动漫在线观看| 色视频在线观看免费| 国产自偷亚洲精品页65页| 最近中文字幕免费大全| 亚洲美女视频一区| 成年女人毛片免费视频| jizz在线免费观看| 久久亚洲AV无码精品色午夜麻| 免费人成网站在线观看10分钟| 亚洲精品日韩一区二区小说| 免费人成无码大片在线观看| 永久免费不卡在线观看黄网站| 亚洲成AV人综合在线观看| 好男人看视频免费2019中文| 日本在线观看免费高清| 伊人久久亚洲综合| 国产国产人免费视频成69堂| 黄页网站在线视频免费| 亚洲日韩区在线电影| 国产免费观看青青草原网站| 嫩草影院在线播放www免费观看| 中文有码亚洲制服av片| 亚洲人成色77777|