天天看點

.Net線上付款---Paypal線上付款開發過程 .Net線上付款---Paypal線上付款開發過程

.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/

.Net線上付款---Paypal線上付款開發過程 .Net線上付款---Paypal線上付款開發過程

界面上要求你用Email Address和password來登入,和PayDollar不同的是paypal提供了測試環境的註冊帳號,如果你沒有帳號,可以點擊Sing Up Now註冊一個paypal的測試帳號.

註冊完成後,可以用剛註冊的帳號登錄,再點擊Test Account,然後再註冊一個Business帳號和一個personal帳號,分別用於模擬買家與賣家,或者叫做接款方和付款方.

在注冊business帳號和personal帳號時,會要求你和信用卡與借記卡關聯(這一些資訊都可以為假的!).

.Net線上付款---Paypal線上付款開發過程 .Net線上付款---Paypal線上付款開發過程

你可以進入官網了解或者百度一下,網上怎樣註冊帳號的資料很多.

二. 編寫一個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的測試付款頁面了

.Net線上付款---Paypal線上付款開發過程 .Net線上付款---Paypal線上付款開發過程

在這裏你就可以輸入你註冊的personal的帳號與密碼付款.

當你點選PayNow按鈕時,Paypal就會開始給你做付款操作.

.Net線上付款---Paypal線上付款開發過程 .Net線上付款---Paypal線上付款開發過程

三 提供一個頁面(paypalIPN.aspx)用于讓Paypal更新我們的Order系統

我們先來看看IPN文檔上怎麼定義IPN的含義:

在買家通過您的網站付款結束後,PayPal 将異步(即不作為網站付款流程的一部分) 發送付款詳細資料到您所指定的 URL,以便您了解買家付款的具體情況并做出相應的響應。 這個過程我們稱作即時付款通知 (簡稱 IPN)。示意圖如下:

.Net線上付款---Paypal線上付款開發過程 .Net線上付款---Paypal線上付款開發過程

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的帳號管理頁面

點用用戶資訊-更多選項

.Net線上付款---Paypal線上付款開發過程 .Net線上付款---Paypal線上付款開發過程

就會進入如下頁面:

.Net線上付款---Paypal線上付款開發過程 .Net線上付款---Paypal線上付款開發過程

更改即時付款通知習慣設定

.Net線上付款---Paypal線上付款開發過程 .Net線上付款---Paypal線上付款開發過程

在通告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 的流程示意圖如下所示:

.Net線上付款---Paypal線上付款開發過程 .Net線上付款---Paypal線上付款開發過程

1) 買家通過 PayPal 付款後根據事先設定的傳回 URL(return)傳回到您的網站;

2) PayPal 将在傳回的 URL 附加變量 tx,即 PayPal 的交易流水号;

3) 将收到的交易流水号 tx 和您的身份标記通過 POST 方式發回給 PayPal;

4) PayPal 接受請求後驗證身份标記及交易流水号後将付款明細發送回給網站;

5) 将接受到的付款明細處理後顯示在買家的網頁浏覽器中。

Paypal的付款結果頁面比paydollar的相對來說更複雜,我們首先要到你注冊的business賬号的管理頁面去設定一下PDT

.Net線上付款---Paypal線上付款開發過程 .Net線上付款---Paypal線上付款開發過程

進入網站付款習慣設定

.Net線上付款---Paypal線上付款開發過程 .Net線上付款---Paypal線上付款開發過程

将自動傳回設定成開啟

将傳回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賬号等等)