http://www.dotblogs.com.tw/johnny/archive/2010/01/19/13129.aspx
有寫過線上信用卡授權程式的人應該都知道如何和對方的 Payment Gateway 溝通。基本上,這種溝通的協定不難理解,反正就是把必要的資訊藏在幾個 Hidden field 裡面,再使用 POST 方式傳到對方指定的網址。
一般來講,銀行端會提供的 HTML 程式碼如下:
1 | < form id = "HPP" action = "https://銀行提供的位址" method = "post" target = "mainFrame" > |
2 | < iframe name = "main" id = "main" frameborder = "0" ></ iframe > |
3 | < input type = "hidden" name = "MID" value = "12345" /> |
4 | < input type = "hidden" name = "TID" value = "12345" /> |
6 | < input type = "hidden" name = "Return" value = "你自定的接收位址" /> |
如果要使用 ASP.NET 來開發的話,我們會面臨的第一個問題,就是如何把像 MID, TID, Order 號碼等等動態資訊填到上述隱藏的欄位裡。不幸的是,一旦你在上面的 form 裡面加上 runat="server" 文字的話,無論如何,你在 action="..." 填入的網址總是無效,因為它一定只會跳回原來的網頁 (.aspx),而不會跳到授權銀行所指定的那個網頁。
現在,感謝 ASP.NET 2.0 之後所提供的 Cross-page postback 機制,你可以很簡單的在 form 裡面加上一個 Button 控制項,然後再加把銀行提供的那個網址寫在 PostBackUrl 裡面就可以了,如以下範例:
1 | < form method = "post" target = "main" runat = "server" > |
2 | < iframe name = "main" id = "main" frameborder = "0" ></ iframe > |
3 | < input type = "hidden" name = "MID" value = "12345" runat = "server" /> |
4 | < input type = "hidden" name = "TID" value = "12345" runat = "server" /> |
6 | < input type = "hidden" name = "Return" value = "你自定的接收位址" runat = "server" /> |
7 | < asp:Button ID = "Button1" runat = "server" Text = "Submit" PostBackUrl = "https://銀行提供的位址" /> |
到這裡為止,你應該已經可以成功的在畫面上顯示出銀行的授權畫面了。不過使用這種方法,你會面臨一個不太優雅的小問題,那就是你放在畫面上的那個 Button1 控制項,既沒有辦法寫 Server 端程式讓它變成不顯示 (顯然它不會 Postback 到原網頁),也沒有辦法寫 Client 端程式,以 OnClientClick=... 方法讓它不顯示 (因為會造成 PostBackUrl 沒作用),所以等於會在畫面上多了一個不知如何處理的按鈕物件。
我的解決辦法,就是不讓這個按鈕出現在這一頁上面,而是把它寫在另一頁上面。
所以我在網站中加上一頁,叫做 ShowSomething.aspx,並把原來的網頁改寫如下:
1 | < form id = "Form1" runat = "server" > |
2 | < iframe name = "main" title = "Authorization Page" id = "main" src = "ShowSomething.aspx" runat = "server" ></ iframe > |
並把 ShowSomething.aspx 網頁寫成如下:
1 | < form id = "Form1" target = "main" runat = "server" > |
3 | < input type = "hidden" name = "MID" id = "MID" value = "0100804340" runat = "server" /> |
4 | < input type = "hidden" name = "TID" id = "TID" value = "70500125" runat = "server" /> |
6 | < input type = "hidden" name = "Return" id = "Return" value = "你自定的接收位址" runat = "server" /> |
7 | < asp:Button ID = "Button1" runat = "server" Text = "Server Click!" PostBackUrl = "銀行提供的位址" /> |
使用後面這種做法,在 main 這個 iframe 中一開始就帶出 ShowSomething.aspx 網頁中的內容,而當使用者按下其中的 Button1 按鈕後,就會自動帶出銀行的授權畫面,並且把 ShowSomething.aspx 整個覆蓋掉,也就解決了使用第一種方法所造成的問題。
不是每個銀行都採用這種寫法; 事實上愈來愈多銀行或金流業者已經逐漸採用更簡捷方便(也更安全)的寫法了。
沒有留言:
張貼留言