.Net線上付款---Paypal線上付款開發過程
作者: 不高很瘦 來源: 部落格園 釋出時間:2011-08-02 10:55 閱讀:334 次 原文連結 [收藏]
最近在做一個Web訂單項目,項目有一個需求就是內建Paypal與Paydollar線上付款,一開始看到這個需求也是傻了眼,因為以前從來沒有做過線上付款的功能,于是打開百度,google狂搜一通,發現.net下面內建這兩種付款方式的介紹很不全面,沒有找到我心中想要的答案,沒有辦法,隻要老老實實的跟着網站上提供的文檔案來做,在項目快完成時,于是想将現在做的一些心得和步驟記錄下來,以備以後有用!
你可以進入https://www.paypal.com/了解Paypal的更多内容.
你可以進入https://www.paypal-biz.com/developer/ 下載相關的技術文檔
或者直接點擊下載本文相關的文檔:
即時付款通知指南
https://www.paypal-biz.com/development/documentation/PayPal_IPN&PDT_Guide_V1.0.pdf
網頁付款标準版內建指南
https://www.paypal-biz.com/development/documentation/PayPal_WPS_Guide_V1.0.pdf
Sandbox測試環境使用指南
https://www.paypal-biz.com/development/documentation/PayPal_Sandbox_Guide_V1.0.pdf
你在做asp.net內建Paypal線上付款需要以下的條件:
1. 需要有.net開發基礎(廢話).
2. 需要有一個在外網可以通路到的網址.
3. 需要仔細閱讀Paypal內建文檔,以備參考.
4. 需要注冊Paypal的正式賬号與測試賬号(本文以測試賬号為例).
假定我們現在的系統叫Order系統,需要內建線上付款,本文按照如下的流程來講述Paypal的開發過程:
1. 註冊Paypal的測試賬号.
2. 編寫一個HTML Form 将訂單的一些相關資訊POST到Paypal的頁面上去.
3. 提供一個頁面用于讓Paypal更新我們的Order系統.
4. 傳回到Order系統的提示頁面.
一 獲得Paypal的測試賬号
Paypal為我們提供一個可以測試的虛拟付款的付款網站:
http://www.sandbox.paypal.com/
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicGcq5SMwATZnFWbp9CXsFGc5FGcvwVehB3LcJXZ0Vmb09GZvwVbvN2Xzd2bsJmbj9CXt92YuM3ZvxmYuNmLzV2Zh1Wavw1LcpDc0RHaiojIsJye.jpg)
界面上要求你用Email Address和password來登入,和PayDollar不同的是paypal提供了測試環境的註冊帳號,如果你沒有帳號,可以點擊Sing Up Now註冊一個paypal的測試帳號.
註冊完成後,可以用剛註冊的帳號登錄,再點擊Test Account,然後再註冊一個Business帳號和一個personal帳號,分別用於模擬買家與賣家,或者叫做接款方和付款方.
在注冊business帳號和personal帳號時,會要求你和信用卡與借記卡關聯(這一些資訊都可以為假的!).
你可以進入官網了解或者百度一下,網上怎樣註冊帳號的資料很多.
二. 編寫一個HTML Form 将訂單的一些相關資訊POST到paypal的頁面上去.
View Code 1 < form id ="PayForm" method ="post" action ="https://www.sandbox.paypal.com/cgi-bin/webscr" >
2
3 < input type ="hidden" name ="cmd" value ="_xclick" />
4
5 < input type ="hidden" name ="business" value ="[email protected]" />
6
7 < input type ="hidden" name ="item_name" value ="OP0000055" />
8
9 < input type ="hidden" name ="amount" value ="480.00" />
10
11 < input type ="hidden" name ="rm" value ="2" />
12
13 < input type ="hidden" name ="currency_code" value ="HKD" />
14
15 < input type ="hidden" name ="on0" value ="ProductID" />
16
17 < input type ="hidden" name ="os0" value ="OP0000055" />
18
19 </ form >
學習過HTML的同學都會知道上面是什麼意思,以下是我對上面的一些參數含義的解釋,如果你需要更多的幫助,你可以閱讀Paypal內建指南的相關章節:
1. 請将form的method設定成POST 将action設定成https://www.sandbox.paypal.com/cgi-bin/webscr
如果要變成正式付款請将它設定成:
http://www.paypal.com/cgi-bin/webscr
2. business設定成Paypal提供給你的賬号,如果是正式環境釋出,就需要用正式的賬号
3. amout設定成你要付款的金額
4. item_name設定成你要付款的訂單号
5. paypal提供了在Form裏面設置IPN(Instant Payment Notification 即時付款通知)的方法,隻要你將下面的代碼加入Form中就可以設置
<input type=\"hidden\" name=\"notify_url\" value=”http://www.youdomain/PaypalIPN.aspx”/>,但本次開發中沒有使用這一種方法,我們會在paypal的business帳號的管理界面中設置好,下面的內容會介紹.
設置好這一些參數後,如果送出上去,就會實現這一個功能:將金額為:480.00訂單號為: OP0000055的訂單付款,收款方為[email protected](business帳號)
(如果你要更詳細的參數設定介紹,你可以檢視Paypal內建文檔在這裡我并不貼出Order系統的其它的代碼,我們隻要将這個Form的代碼生成好,動态替換裡面要改變的參數(比如amout,orderref等)送出上去就好了,就比如說,一個頁面上可以放兩個Form,一個Form用于顯示購物車裡面的資訊,另一個Form就可以放以上的代碼,隻要保證第二個Form送出了就OK了,悄悄的告訴你,我就是用StringBuilder這樣一條一條append上去的,遇到要替換的參數我就Replace一下,我相信你一定知道我是怎麼做的,哈哈,你信不信不要緊,反正我相信了!
當你将該Form送出後,你可以看到Order系統已跳轉到sandbox.paypal.com的測試付款頁面了
在這裏你就可以輸入你註冊的personal的帳號與密碼付款.
當你點選PayNow按鈕時,Paypal就會開始給你做付款操作.
三 提供一個頁面(paypalIPN.aspx)用于讓Paypal更新我們的Order系統
我們先來看看IPN文檔上怎麼定義IPN的含義:
在買家通過您的網站付款結束後,PayPal 将異步(即不作為網站付款流程的一部分) 發送付款詳細資料到您所指定的 URL,以便您了解買家付款的具體情況并做出相應的響應。 這個過程我們稱作即時付款通知 (簡稱 IPN)。示意圖如下:
1) 客戶點選“付款”按鈕向您的賬戶付款;
2) PayPal 接受到客戶的付款後,向您的伺服器指定的 URL 通過 POST 方式發送
IPN;
3) 在您的伺服器收到 IPN 之後,您必須将收到的 POST 資訊對原樣傳回給 PayPal 進行驗證,PayPal 通過此方法幫您防範欺騙或“中間人”攻擊;(對 IPN 資訊 的驗證過程我們稱之為通知确認,詳細的可參見 6.3)
4) PayPal 傳回驗證資訊,通過驗證為 VERIFIED,不通過則為 INVALD;
5) 根據驗證資訊處理付款明細。
【注】每次付款您可能收到多個 IPN 資訊,一般來說直到收到 IPN 資訊中的付款狀态 為 Completed 為止。
IPN 資料包含了整個付款過程的詳細資訊,通過擷取并分析它您可以:
„ 自定義網站對客戶購物進行實時回複:您可以以 EMAIL 或其他方式通知客戶 付款的狀态;
„ 自動履行相關操作:當收到 IPN 資料并确認付款狀态已經完成後,您就可以 立刻啟動向買家發貨的流程,也可以為買家進行虛拟貨币的充值或者以某種方 式将虛拟商品的卡号和密碼發送給買家;
„ 記錄交易資訊到您的資料庫中。
當Paypal在做付款操作時,paypal會将本次付款的資訊(如交易号,付款狀态等)Post回Order系統,以便Order系統更新自己的系統,比如說更新訂單的交易号與交易日期, 是以我們要提供一個頁面來接收這一些資料,這個頁面在Paypal裡面叫IPN(Instant Payment Notification 即時付款通知)頁面,(這個頁面我們取名為paypalIPN.aspx)如果你想了解更多IPN的知識,請閱讀即時付款通知指南
IPN可以在Form裏面設置也可以在Business帳號的管理頁面配置:
上sandbox裏選擇business帳號,然後點擊入business的帳號管理頁面
點用用戶資訊-更多選項
就會進入如下頁面:
更改即時付款通知習慣設定
在通告Url中填入IPN的頁面位址(需要可以在外網訪問的位址):
選擇接收即時付款通知消息(已啟用),然後按儲存.
paypalIPN.aspx的背景代碼如下:
View Code 1 private void Page_Load( object sender, System.EventArgs e)
2
3 {
4
5 // Put user code to initialize the page here
6
7 Response.Write( " 200 OK ");
8
9
10
11 string strResponse=ValidatePaypalInfo();
12
13 if(strResponse== " VERIFIED ")
14
15 {
16
17 string pay_status=Request.Form[ " payment_status "].ToString();
18
19 if(pay_status== " Completed ")
20
21 {
22
23 string payID=Request.Form[ " txn_id "].ToString();
24
25 // 獲取交易號
26
27 string orderID=Request.Form[ " item_name "].ToString();
28
29 // 獲取訂單號
30
31 OrderProvider provider= new OrderProvider();
32
33 service.SetOrderIsPay(payID,orderID);
34
35 }
36
37 }
38
39
40
41 }
42
43
44
45 private string ValidatePaypalInfo()
46
47 {
48
49 string strFormValues;
50
51 string strNewValues;
52
53 string strResponse;
54
55 HttpWebRequest req=(HttpWebRequest)WebRequest.Create(PayPaypal.FormPostAddress);
56
57 req.Method= " POST ";
58
59 req.ContentType= " application/x-www-form-urlencoded ";
60
61 byte[] param=HttpContext.Current.Request.BinaryRead(HttpContext.Current.Request.ContentLength);
62
63 strFormValues=Encoding.ASCII.GetString(param);
64
65 strNewValues=strFormValues+ " &cmd=_notify-validate ";
66
67 req.ContentLength=strNewValues.Length;
68
69
70
71 StreamWriter stout= new StreamWriter(req.GetRequestStream(),Encoding.ASCII);
72
73 stout.Write(strNewValues);
74
75 stout.Close();
76
77
78
79 StreamReader sr= new StreamReader(req.GetResponse().GetResponseStream());
80
81 strResponse=sr.ReadToEnd();
82
83 sr.Close();
84
85 return strResponse;
86
87 }
代碼主要是接收https://www.sandbox.paypal.com/cgi-bin/webscr的傳回值是否為VERIFIED,如果為true就可以用Request.form去獲取paypal傳回的數據去更新Order系統,如果你想了解更多,請詳細閱讀即時付款通知指南
個人體會:
1.我個人認為,paypal要求我們提供的IPN頁面隻能用于更新Order系統,不應該用于顯示界面(包括付款結果),不要將IPN頁面和Order系統付款結果頁面混為一談(IPN頁面隻是用來更新系統,不用於顯示,而付款結果頁面隻是用於顯示付款結果).
2.Order系統提供的IPN頁面,是一定要有外網上可以通路的,要不然會造成傳回參數接收不成功!我曾經在這個地方卡住很久,後來換成外網位址後就可以接收傳回參數.
四 傳回到Order系統的提示頁面
當paypal付款成功後,我們會一直停留在paypal的付款完成頁面,如果我們想要他自動傳回我們的Order系統的某個頁面,以顯示出付款結果(或有其它的操作),我們就要用使用PDT,我們先來看一下實時付款通知文檔裡面PDT的意義是什麼:
PDT 是一個安全擷取付款明細的方式。在買家付完款後,賣家可以通過此方式即時擷取付款明細并顯示給買家看。PDT 的流程示意圖如下所示:
1) 買家通過 PayPal 付款後根據事先設定的傳回 URL(return)傳回到您的網站;
2) PayPal 将在傳回的 URL 附加變量 tx,即 PayPal 的交易流水号;
3) 将收到的交易流水号 tx 和您的身份标記通過 POST 方式發回給 PayPal;
4) PayPal 接受請求後驗證身份标記及交易流水号後将付款明細發送回給網站;
5) 将接受到的付款明細處理後顯示在買家的網頁浏覽器中。
Paypal的付款結果頁面比paydollar的相對來說更複雜,我們首先要到你注冊的business賬号的管理頁面去設定一下PDT
進入網站付款習慣設定
将自動傳回設定成開啟
将傳回URL設定成你想要傳回的頁面位址
将付款資料傳輸設定為開啟
請記錄下你的身份标記,在以後的開發時用得上.
假定我們設定的PDT頁面為:paypalResult.aspx,那麼背景代碼和IPN頁面的代碼很相似:
View Code 1 protected System.Web.UI.WebControls.Label lab_message;
2
3 private void Page_Load( object sender, System.EventArgs e)
4
5 {
6
7 string result=GetPaypalPDTString();
8
9 switch(result)
10
11 {
12
13 case " SUCCESS ":
14
15 lab_message.Text=PayResultConst.PAY_SUCCESS_MESSAGE;
16
17 break;
18
19 case "":
20
21 lab_message.Text=PayResultConst.PAY_FAIL_MESSAGE;
22
23 break;
24
25 default:
26
27 lab_message.Text=PayResultConst.PAY_ORTHER_ERROR_MESSAGE;
28
29 break;
30
31 }
32
33 }
34
35
36
37 private string GetPaypalPDTString()
38
39 {
40
41 string strFormValues;
42
43 string strNewValues;
44
45 string strResponse;
46
47 string txToken=Request.QueryString[ " tx "].ToString();
48
49 string query= " cmd=_notify-synch&tx= " + txToken + " &at= " + PayPaypal.PDTToken;
50
51 // 請注意,請将PayPaypal.PDTToken設定為上文中你記錄下來的身份标記
52
53 HttpWebRequest req=(HttpWebRequest)WebRequest.Create(PayPaypal.FormPostAddress);
54
55 req.Method= " POST ";
56
57 req.ContentType= " application/x-www-form-urlencoded ";
58
59 byte[] param=HttpContext.Current.Request.BinaryRead(HttpContext.Current.Request.ContentLength);
60
61 strFormValues=Encoding.ASCII.GetString(param);
62
63 strNewValues=strFormValues+query;
64
65 // query附加上去一起發送給paypal
66
67 req.ContentLength=strNewValues.Length;
68
69
70
71 StreamWriter stout= new StreamWriter(req.GetRequestStream(),Encoding.ASCII);
72
73 stout.Write(strNewValues);
74
75 stout.Close();
76
77
78
79 StreamReader sr= new StreamReader(req.GetResponse().GetResponseStream());
80
81 strResponse=sr.ReadToEnd();
82
83 sr.Close();
84
85 return strResponse.Substring( 0,strResponse.IndexOf( " \n "));
86
87 }
88
89
當系統開發完成後,你的公司可能會向Paypal申請正式的賬号,這時你需要将Form的一些測試資訊更改成正式資訊(比如說action位址,business賬号等等)