2014年7月2日 星期三

線上信用卡授權程式撰寫方法

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" />
5    ...
6    <input type="hidden" name="Return" value="你自定的接收位址" />
7</form>

如果要使用 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" />
5    ...
6    <input type="hidden" name="Return" value="你自定的接收位址" runat="server" />
7    <asp:Button ID="Button1" runat="server" Text="Submit" PostBackUrl="https://銀行提供的位址" />
8</form>

到這裡為止,你應該已經可以成功的在畫面上顯示出銀行的授權畫面了。不過使用這種方法,你會面臨一個不太優雅的小問題,那就是你放在畫面上的那個 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>
3    ...
4</form>

並把 ShowSomething.aspx 網頁寫成如下:
1<form id="Form1" target="main" runat="server">
2    ...
3    <input type="hidden" name="MID" id="MID" value="0100804340" runat="server" />
4    <input type="hidden" name="TID" id="TID" value="70500125" runat="server" />
5    ...
6    <input type="hidden" name="Return" id="Return" value="你自定的接收位址" runat="server" />
7    <asp:Button ID="Button1" runat="server" Text="Server Click!" PostBackUrl="銀行提供的位址" />
8</form>

使用後面這種做法,在 main 這個 iframe 中一開始就帶出 ShowSomething.aspx 網頁中的內容,而當使用者按下其中的 Button1 按鈕後,就會自動帶出銀行的授權畫面,並且把 ShowSomething.aspx 整個覆蓋掉,也就解決了使用第一種方法所造成的問題。
不是每個銀行都採用這種寫法; 事實上愈來愈多銀行或金流業者已經逐漸採用更簡捷方便(也更安全)的寫法了。

沒有留言: