首頁 微信小程式 微信開發 微信掃碼支付的Asp.Net MVC開發

微信掃碼支付的Asp.Net MVC開發

Mar 16, 2018 pm 01:47 PM
asp.net 開發 支付

這次帶給大家微信掃碼支付的Asp.Net MVC開發,微信掃碼支付Asp.Net MVC開發的注意事項有哪些,以下就是實戰案例,一起來看一下。

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

一、準備工作

使用的微信API中的統一下單方法,關鍵的參數是'#大眾帳號ID (appid)','商家號(mch_id)'和'商家支付金鑰(KEY)',所以首先要有一個審核過的公眾號,並開通支付功能,然後申請商戶,經過審核後得到商家號,也就是商家平台的登入名稱。商家支付密鑰是用來簽署的,確保url不會被竄改。進入商家平台後在API安全中設置,是32位元的字串

有這三個參數後,還有一點要注意的是交易起始時間交易結束時間的間隔應該在五分鐘以上2小時以內。不然獲取支付url的時候回報錯。

二、產生支付二維碼

有了上面的參數,接下來就是下載SDK: .net SDK及範例 。

可惜官方的這個範例一開始並不能運作正確。把相關dll引用MVC目錄下。並創建一個WxPayAPI資料夾把相關類別複製過來。

  

然後將WxPayConfig中的相關參數設定成自己的參數,再修改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", "北京分店");//附加数据
            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"));//交易结束时间
            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);//调用统一下单接口            Logger.Info(result.ToJson());            string url = result.GetValue("code_url").ToString();//获得统一下单接口返回的二维码链接
            Logger.Info("pay url:" + url);            return url;
        }
登入後複製

TradeNumber是呼叫WxPayApi.GenerateOutTradeNo() 方法產生的,notify_url是用戶支付之後微信通知的位址。金額的單位是分,只能傳int型或string型,decimal需要轉換一下。取得url成功後,在負責付款的控制器中建立一個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到内存流  
            MemoryStream ms = new MemoryStream();
            image.Save(ms, ImageFormat.Jpeg);            return File(ms.ToArray(), "image/jpeg");
        }
登入後複製

成功之後得到付款頁面:

掃碼後跳出支付頁面:

三、回呼

用戶付款之後,微信會給之前預留的介面(介面不能帶參數)發送訊息, 網站在收到訊息後進行驗證和確認,確定之後再給微信發一個訊息。詳細參數和文件請看官方API

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

  public ActionResult ResultNotify()
        {            //接收从微信后台POST过来的数据
            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);            //转换数据格式并验证签名
            WxPayData data = new WxPayData();            try
            {
                data.FromXml(builder.ToString());
            }            catch (WxPayException ex)
            {                //若签名错误,则立即返回结果给微信支付后台
                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;            //检查支付结果中transaction_id是否存在
            if (!notifyData.IsSet("transaction_id"))
            {                //若transaction_id不存在,则立即返回结果给微信支付后台
                WxPayData res = new WxPayData();
                res.SetValue("return_code", "FAIL");
                res.SetValue("return_msg", "支付结果中微信订单号不存在");
                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))
            {                //若订单查询失败,则立即返回结果给微信支付后台
                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();
            }
        }
登入後複製

收到確認後,我們要更新訂單的狀態:

  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+"成功更新状态为"+status);
            }
        }
登入後複製

然後在頁面上偵測訂單的狀態,確定成功後,跳到頁面。

在商家平台的後台,我們可以查詢到:

相信看了本文案例你已經掌握了方法,更多精彩請關注php中文網其它相關文章!

推薦閱讀:

微信支付的退款功能開發

#H5的影片播放庫video.js詳解

微信硬體H5開發之控制燈光

JS裡特別好用的輕量級日期外掛

#

以上是微信掃碼支付的Asp.Net MVC開發的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

百度地圖搭計程車如何支付 搭計程車的付款步驟介紹 百度地圖搭計程車如何支付 搭計程車的付款步驟介紹 Mar 13, 2024 am 10:04 AM

百度地圖APP現在已經都成為了超多用戶們首選的出行導航的軟體,那麼這裡的一些功能全面,都能夠免費的讓大家進行選擇操作哦,解決自己日常出行方面會遇到的一些問題,完全都能夠查詢到自己的一些出行的路線,規劃自己的一些出行的方案,查詢完對應的這一些路線,都能根據自己的需求,選擇合適的一些出行方式,那麼你們不管是選擇一些公共交通,騎行,步行或是搭計程車等,都能滿足你們的,有著對應的一些導航路線,成功的帶領你們去往某地,那麼大家選擇打車的話,都能感到更加的方便,超多的一些司機們都是會在線上接單,搭計程車變得超級

四款值得推薦的AI輔助程式工具 四款值得推薦的AI輔助程式工具 Apr 22, 2024 pm 05:34 PM

這個AI輔助程式工具在這個AI快速發展的階段,挖掘出了一大批好用的AI輔助程式工具。 AI輔助程式設計工具能夠提升開發效率、提升程式碼品質、降低bug率,是現代軟體開發過程中的重要助手。今天大姚給大家分享4款AI輔助程式工具(而且都支援C#語言),希望對大家有幫助。 https://github.com/YSGStudyHards/DotNetGuide1.GitHubCopilotGitHubCopilot是一款AI編碼助手,可幫助你更快、更省力地編寫程式碼,從而將更多精力集中在問題解決和協作上。 Git

AI程式設計師哪家強?探索Devin、通靈靈碼和SWE-agent的潛力 AI程式設計師哪家強?探索Devin、通靈靈碼和SWE-agent的潛力 Apr 07, 2024 am 09:10 AM

2022年3月3日,距離世界首個AI程式設計師Devin誕生不足一個月,普林斯頓大學的NLP團隊開發了一個開源AI程式設計師SWE-agent。它利用GPT-4模型在GitHub儲存庫中自動解決問題。 SWE-agent在SWE-bench測試集上的表現與Devin相似,平均耗時93秒,解決了12.29%的問題。 SWE-agent透過與專用終端交互,可以開啟、搜尋文件內容,使用自動語法檢查、編輯特定行,以及編寫和執行測試。 (註:以上內容為原始內容微調,但保留了原文中的關鍵訊息,未超過指定字數限制。)SWE-A

學習如何利用Go語言開發行動應用程式 學習如何利用Go語言開發行動應用程式 Mar 28, 2024 pm 10:00 PM

Go語言開發行動應用程式教學隨著行動應用程式市場的不斷蓬勃發展,越來越多的開發者開始探索如何利用Go語言開發行動應用程式。作為一種簡潔高效的程式語言,Go語言在行動應用開發中也展現了強大的潛力。本文將詳細介紹如何利用Go語言開發行動應用程序,並附上具體的程式碼範例,幫助讀者快速入門並開始開發自己的行動應用程式。一、準備工作在開始之前,我們需要準備好開發環境和工具。首

五大熱門Go語言庫總表:開發必備利器 五大熱門Go語言庫總表:開發必備利器 Feb 22, 2024 pm 02:33 PM

五大熱門Go語言庫總結:開發必備利器,需要具體程式碼範例Go語言自從誕生以來,受到了廣泛的關注和應用。作為一門新興的高效、簡潔的程式語言,Go的快速發展離不開豐富的開源程式庫的支援。本文將介紹五大熱門的Go語言庫,這些庫在Go開發中扮演了至關重要的角色,為開發者提供了強大的功能和便利的開發體驗。同時,為了更好地理解這些庫的用途和功能,我們會結合具體的程式碼範例進行講

Android開發最適合的Linux發行版是哪一個? Android開發最適合的Linux發行版是哪一個? Mar 14, 2024 pm 12:30 PM

Android開發是一項繁忙而又令人興奮的工作,而選擇適合的Linux發行版來進行開發則顯得尤為重要。在眾多的Linux發行版中,究竟哪一個最適合Android開發呢?本文將從幾個方面來探討這個問題,並給出具體的程式碼範例。首先,我們來看看目前流行的幾個Linux發行版:Ubuntu、Fedora、Debian、CentOS等,它們都有各自的優點和特點。

Go語言前端技術探秘:前端開發新視野 Go語言前端技術探秘:前端開發新視野 Mar 28, 2024 pm 01:06 PM

Go語言作為一種快速、高效的程式語言,在後端開發領域廣受歡迎。然而,很少有人將Go語言與前端開發聯繫起來。事實上,使用Go語言進行前端開發不僅可以提高效率,還能為開發者帶來全新的視野。本文將探討使用Go語言進行前端開發的可能性,並提供具體的程式碼範例,幫助讀者更了解這一領域。在傳統的前端開發中,通常會使用JavaScript、HTML和CSS來建立使用者介面

了解VSCode:這款工具到底是用來做什麼的? 了解VSCode:這款工具到底是用來做什麼的? Mar 25, 2024 pm 03:06 PM

《了解VSCode:這款工具到底是用來做什麼的? 》身為程式設計師,無論是初學者或資深開發者,都離不開程式碼編輯工具的使用。在眾多編輯工具中,VisualStudioCode(簡稱VSCode)作為一款開源、輕量級、強大的程式碼編輯器備受開發者歡迎。那麼,VSCode到底是用來做什麼的呢?本文將深入探討VSCode的功能和用途,並提供具體的程式碼範例,以幫助讀者

See all articles