Paypal國際版網站集成

 

      前段時間接到一個外貿網站的項目,集成paypal支付接口的,對象是海外用戶,全部用US的信用卡結算。所以只能使用paypal國際版,還好paypal上的資料非常齊全,而 且還提供了開發者沙盒(sandbox),相比之下,國內流行的支付寶還有很長的路要走啊。

      主要分爲序言、支付按鈕、返回信息方式(IPN&PDT)、實例四部分組成


      首 先,你需要註冊一個paypal帳戶,帳戶類型分爲Personal(個人)、Premier(高級)和Business(商業),他們的差別對於開發者 來說主要是返回的信息,Personal的不能使用IPN和PDT等商家工具,即不能獲取交易信息,但是Personal帳戶收款無需手續 費;Premier和Business當然就提供了IPN和PDT功能,能夠在客戶支付成功後,將交易信息傳給指定的網站,用來二次使用。Premier 和Business使用上的差異我不是很清楚,應該是月收款額和手續費上的區別吧。
      這裏插進來介紹一下paypal sandbox,也就是沙盒,是paypal提供給開發者的一個工具,非常好用,你可以在https://developer.paypal.com/ 註冊和使用它。登錄以後可以新建帳戶,設置餘額和帳戶類型,有一點要注意,每次使用時必須先登錄sandbox才能使用新建的那些帳戶。Sndbox裏面有個測試工具,可以發送IPN的,以後會用到。

      接着上面的內容,註冊完帳戶以後,當然,一開始開發最好使用sandbox,不然資金轉來轉去手續費都扣光了,paypal的費率如下:
      
      比起國內的支付工具,paypal貴了好多,當然,和國情也有關係。
    
      接下來是按鈕的代碼,很簡單,就是一個普通的網頁表單代碼:

程序代碼 程序代碼
< form  action ="https://www.paypal.com/cgi-bin/webscr"  method ="post" >
   
< input  type ="hidden"  name ="cmd"  value ="_xclick" >
   
< input  type ="hidden"  name ="business"  value ="[email protected]" >
   
< input  type ="hidden"  name ="item_name"  
   value
="Item Name Goes Here" >
   
< input  type ="hidden"  name ="item_number"  
   value
="Item Number Goes Here" >
   
< input  type ="hidden"  name ="amount"  value ="100.00" >
   
< input  type ="hidden"  name ="no_shipping"  value ="2" >
   
< input  type ="hidden"  name ="no_note"  value ="1" >
   
< input  type ="hidden"  name ="currency_code"  value ="USD" >
   
< input  type ="hidden"  name ="bn"  value ="IC_Sample" >
   
< input  type ="image"  src ="https://www.paypal.com/
   en_US/i/btn/x-click-but23.gif"
 
   name
="submit"  alt ="Make payments with payPal - it's fast, 
   free and secure!"
>
   
< img  alt =""  
   src
="https://www.paypal.com/en_US/i/scr/pixel.gif"  
   width
="1"  height ="1" >
</ form >

asp.net 版本:

aspx: <asp:ImageButton ID="submit" runat="server" OnClick="submit_onclick" ImageUrl="~/Flow/images/paypal.jpg" />

cs:

protected void submit_onclick () {
// 存儲購物車的總額
decimal amount = Convert.ToDecimal(“280.00”);
// 存儲訂單ID
string orderId = “200810240101”;
// 獲取網站的名稱
string siteName = BalloonShopConfiguration.SiteName;
// 創建貝寶重定向的位置
string redirect = "";
redirect += "https://www.paypal.com/xclick/[email protected]";
redirect += "&item_name=" + siteName + " Order " + orderId;
redirect += "&item_number=" + orderId;
redirect += "&amount=" + String.Format("{0:0.00} ", amount);
redirect += "&currency=USD";
redirect += "&return=http://www." + siteName + ".com    //這裏是成功後返回的aspx頁面 ";
redirect += "&cancel_return=http://www." + siteName + ".com/Error.aspx";
   //如果失敗回到的頁面
// 重定向到付款頁面
Response.Redirect(redirect);
}


      如果使用sandbox,action地址改成https://www.sandbox.paypal.com/cgi-bin/webscr 即可,上面這段還是很容易理解的,看下name和value基本上就能知道每個值的含義了。
      
      保存用瀏覽器打開,就會看到一個paypal的按鈕,點擊過去按照提示操作,就能付款到business指定值的帳戶了。

      這就是一個最簡單的paypal支付按鈕。

      在付款成功之後,將信息返回到你的網站,大部分需求都是客戶完成付款後返回信息到網站的數據庫,記錄網站客服的交易信息

引用內容 引用內容
什麼是即時付款通知IPN
當您收到新的付款交易或者已發生的付款交易的狀態發生變化時,PayPal都將異步(即不作爲網站付款流程的一部分) 發送付款詳細數據到您所指定的URL,以便您瞭解買家付款的具體情況並做出相應的響應。這個過程我們稱作即時付款通知(簡稱 IPN)。


      相 信大部分網站集成Paypal都希望能夠實現客戶支付完成後返回信息到自己的網站,然後處理這些信息。比如客戶在你的網站上購買了一個產品,通過 Paypal完成了支付,接着Paypal告訴你的網站客戶完成了支付以及支付信息,最後你的網站將這些信息記錄到你自己的數據庫中,並且將你的客戶訂單狀態設爲已支付,接着你就可以進行一系列的相關訂單的後續操作。
      IPN就能幫助我們實現這個功能,IPN示意圖如下(來自Paypal.com):
      

      當客戶完成支付,Paypal會在後臺通過post方式向你的服務器傳送交易數據,來實現網站集成的功能。
接下來我們就來看IPN的實現方法。
      第一步,你需要一個sandbox的帳號,這很重要,因爲它能讓你隨心所欲的進行測試,而不用擔心資金在天上飛。註冊地址:https://developer.paypal.com/
      第二步,登陸sandbox,新建一個商家帳號(賣方)和一個客戶賬號(買方),其中賣方帳號必須是Premier或者Business,不然無法使用IPN功能。
      

      新建買家帳號的時候記得在Account Balance中加上金額,不然你就沒錢買東西了,如果paypal.com的帳號也能這樣加錢多好。
      新建完兩個帳號:
      

      賣家帳號的test mode要設爲enabled。
      選中business帳號,點擊下面的Enter Sandbox Test Site進入sandbox Test Site,登錄,就像普通Paypal帳號的管理頁面一樣。
      

      點 擊Profile,在Selling Preferences中選擇Instant Payment Notification Preferences,點擊edit加入IPN信息返回的地址,記得勾上前面那個選項,我是用.net寫的接受文件,所以我的IPN地址是http://www.Test.org/ipn.aspx ,地址只要能在互聯網上訪問到就可以了。
      

      在 Profile -> Selling Preferences ->Website Payment Preferences選項中,有一個Auto Return的選項,將它設爲on,並且在下面的return地址中填入你希望的客戶支付完成後返回的地址:
      

       以上就完成了商家端的設置。

      接下來是你網站上ipn.aspx文件的編寫,這個是用來接收支付數據的,是非常關鍵的一個文件。
      文件環境,.net 2.0,語言C#。
      Ipn.aspx文件:此文件不用修改任何東西,代碼都在cs文件中。
      Ipn.aspx.cs文件:關鍵代碼

      定義一個VerifyIPN()函數:

程序代碼 程序代碼
bool  VerifyIPN()
{
        
string  strFormValues  =  Request.Form.ToString();
        
string  strNewValue;
        
string  strResponse;
        
string  serverURL  =   " https://www.sandbox.paypal.com/cgi-bin/webscr " ;

        HttpWebRequest req 
=  (HttpWebRequest)WebRequest.Create(serverURL);
        req.Method 
=   " POST " ;
        req.ContentType 
=   " application/x-www-form-urlencoded " ;
        strNewValue 
=  strFormValues  +   " &cmd=_notify-validate " ;
        req.ContentLength 
=  strNewValue.Length;

        StreamWriter stOut 
=   new  StreamWriter(req.GetRequestStream(), System.Text.Encoding.ASCII);
        stOut.Write(strNewValue);
        stOut.Close();

        StreamReader stIn 
=   new  StreamReader(req.GetResponse().GetResponseStream());
        strResponse 
=  stIn.ReadToEnd();
        stIn.Close();

        
return  strResponse  ==   " VERIFIED " ;
}


       這段代碼的作用是判斷IPN信息是否來自Pyapal,如果不進行判斷,那麼惡意用戶完全可以模擬一個信息post到你的網站上,讓你認爲訂單已經完成支付,所以,必須首先對接受到的信息進行驗證。

      代碼的基本原理,serverURL定義了驗證地址,sandbox爲:https://www.sandbox.paypal.com/cgi-bin/webscr ,Paypal.com就是https://www.paypal.com/cgi-bin/webscr
      將paypal發送過來的所有信息加上一個&cmd=_notify-validate參數,表示對這個信息進行驗證,全部發送回paypal驗證,如果信息確實存在,則返回VERIFIED字符串。
驗證成功後,就可以用如下形式獲得交易信息:

程序代碼 程序代碼
string  ppTx  =  Request.Form[ " txn_id " ].ToString();
string  ppStatus  =  Request.Form[ " payment_status " ].ToString();
string  ppDate  =  Request.Form[ " payment_date " ].ToString();
string  ppItem  =  Request.Form[ " item_name " ].ToString();
string  ppPrice  =  Request.Form[ " mc_gross " ].ToString();


      每個變量的解釋可以參考Paypal網站上的說明,我這裏就不再重複。

     .cs代碼結構如下:

程序代碼 程序代碼
public   partial   class  paypal_ipn : System.Web.UI.Page
{
    
protected   void  Page_Load( object  sender, EventArgs e)
    {
        
if  (VerifyIPN()) // 驗證成功
        {
            
string  ppTx  =  Request.Form[ " txn_id " ].ToString(); // 獲取post中的各項變量值
                …
            執行將數據寫入數據庫等操作
        }   
    }

    
bool  VerifyIPN()
{
        具體代碼見上。
    }
}

PayPal將回復該 POST,並在回覆的正文中包含一個單詞“VERIFIED ”或“INVALID”。當您收到 VERIFIED 回覆時,您需要在實施訂單之前執行若干檢查:

確認“payment_status”爲“Completed”,因爲系統也會爲其他結果(如“Pending”或“Failed”)發送 IPN。
檢查“txn_id”是否未重複,以防止欺詐者重複使用舊的已完成的交易。
驗證“receiver_email”是已在您的PayPal賬戶中註冊的電子郵件地址,以防止將付款發送到欺詐者的賬戶 。
檢查其他交易詳情(如物品號和價格),以確認價格未改變完成了以上檢查後,您可以使用 IPN 數據更新您的數據庫,並處理購物。

如果收到“無效”通知,則應將其視爲可疑通知,並應對其進行調查。


      這樣,就實現了將支付信息傳回網站的功能。注:當交易狀態發生改變時,paypal也會返回一個ipn,比如完成支付,退款等等。

      介紹一下sandbox中IPN測試工具,登陸sandbox主帳號,就是你在sandbox上註冊的那個,不是那些賣家/買家帳號。
      選擇Test Tools -> Instant Payment Notification (IPN) Simulator:

      輸入你的ipn接受文件地址,選擇ipn信息的方式,然後會讓你填具體信息內容,再點擊Send IPN,就能模擬一個ipn到你網站的頁面,可以用來測試IPN是否正常工作。
      
      
      不過這個工具有個小BUG,就是發送的IPN裏不包括contact_phone這個變量,但是實際的IPN裏是有的,這裏要注意一下。
      注: 可以在商家帳號的Profile -> Selling Preferences ->Website Payment Preferences中,選擇Contact Telephone Number這一欄,來確定是否需要發送買家聯繫電話。
      

      通過IPN,你的網站就開始從真正意義上的集成了Paypal。

PDT的介紹

引用內容 引用內容
什麼是PDT
PDT是一個安全獲取付款明細的方式。在買家付完款後,賣家可以通過此方式即時獲取付款明細並顯示給買家看。

      

      上圖是PDT的流程示意。
      1.首先買家付款後通過事先設定好的返回url(return)回到您的網站。
      2.接着paypal在返回url後面加上tx變量,即交易號。
      3.然後網站將收到的tx和您的令牌(paypal賬戶裏申請)發回paypal。
      4.paypal驗證令牌通過後,將交易明細發回網站。
      5.最後網站將交易明細顯示給客戶。


PayPal 提供附加變量,用於自定義您的 Form Post。所有可用變量如下(變量名稱必須用小寫 ):

可用變量

business 您的PayPal賬戶上的電子郵件地址
quantity 物品數量。大於 1 時,會與金額相乘
item_name 物品名稱(或購物車名稱)。必須是字母數字字符,最多爲 127 個字符
item_number 用於跟蹤付款的可選傳遞變量。必須是字母數字字符,最多爲 127 個字符
amount 物品的價格(購物車中所有物品的總價格)
shipping 該物品的運送成本
shipping2 每增加一件物品所需的運送成本
handling 手續費
tax 基於交易的稅額。如果使用該變量,傳遞值將覆蓋所有用戶信息稅收設置(不管買家所在位置)。
no_shipping 送貨地址。如果設爲 “1″,則不會要求您的客戶提供送貨地址。該變量爲可選項;如果省略或設爲 “0″,將提示您的客戶輸入送貨地址
cn 可選標籤,會在提示欄上顯示(最多 40 個字符)
no_note 爲付款加入提示。如果設爲 “1″,則不會提示您的客戶輸入提示。該變量爲可選項;如果省略或設爲 “0″,將提示您的客戶輸入提示。
on0 第一選項欄名稱。最多 64 個字符
os0 第一組選項值。最多 200 個字符。”on0″ 必須定義,以便識別 “os0″。
on1 第二選項欄名稱。最多 64 個字符
os1 第二組選項值。最多 200 個字符。”on1″ 必須定義,以便識別 “os1″。
custom 決不會向您的客戶顯示的可選轉遞變量。可用於跟蹤存貨
invoice 決不會向您的客戶顯示的可選轉遞變量。可用於跟蹤賬單號
notify_url 僅與 IPN 一起使用。發送 IPN Form Post 的互聯網 URL
return 您的客戶完成付款後將返回的互聯網 URL
cancel_return 您的客戶取消付款後將返回的互聯網 URL
image_url 您要用作圖標的圖片的互聯網 URL,圖片大小爲 150 X 50 像素
cs 設置您的付款頁面的背景色。如果設爲 “1″,背景色將爲黑色。該變量爲可選項;如果省略或設爲 “0″,背景色將爲白色

擴展變量

PayPal 允許您粘貼擴展變量,條件是將改變以下 “cmd” 值:<input type=”hidden” name=”cmd” value=”_xclick”> 到:

<input type=”hidden” name=”cmd” value=”_ext-enter”>
<input type=”hidden” name=”redirect_cmd” value=”_xclick”> 
 
通過上述 “cmd” 值修改,您還可使用以下變量:

擴展變量
email 客戶的電子郵件地址
first_name 客戶的名。必須是字母數字字符,最多爲 32 個字符
last_name 客戶的姓。必須是字母數字字符,最多爲 64 個字符
address1 客戶地址所在國家或地區。必須是字母數字字符,最多爲 100 個字符
address2 客戶地址第二行。必須是字母數字字符,最多爲 100 個字符
city 客戶地址所在城市。必須是字母數字字符,最多爲 100 個字符
state 客戶地址所在州。必須是正式的 2 個字母縮寫
zip 客戶地址的郵政編碼
night_phone_a 客戶夜間聯繫電話號碼的區號
night_phone_b 客戶夜間聯繫電話號碼前三位
day_phone_a 客戶白天聯繫電話號碼的區號
day_phone_b 客戶白天聯繫電話號碼前三位
   
提示:若要更改”用戶信息”中的默認運費和手續費設置,請轉至您的用戶信息,編輯您的運費計算,然後點擊”允許採用基於交易的運費”複選框。

將單個物品傳遞給PayPal

如果您的第三方購物車可設置成向PayPal傳遞單個物品,有關物品的信息將加入買家和賣家的記錄日誌和系統通知中。要加入該物品的信息,您需要將 HTML 格式元素粘貼至PayPal購物車流程的新版本。該過程與 #1 節”將總購物車數量傳遞給PayPal”描述的非常相似,不同之處在於:

將 “cmd” 變量設置到 “_cart”
更換必要的 HTML 行

<input type=”hidden” name=”cmd” value=”_xclick”> 與<input type=”hidden” name=”cmd” value=”_cart”>
 
添加稱爲 “upload” 的新變量
在 <表格> 和 </表格> 標籤之間新增以下行:<input type=”hidden” name=”upload” value=”1″>
 
定義物品明細
對於以下各特定物品參數,定義與通過您的合作商購物車購買的各物品對應的一組新值。將 “_x” 附加到變量名稱,其中 x 是物品號碼,從 1 開始,每加入一物品增加一。

item_name_x (物品 #x 需要)購物車中物品 #x 的名稱。必須是字母數字字符,最多爲 127 個字符
item_number_x 與購物車中物品 #x 關聯的可選傳遞變量。必須是字母數字字符,最多爲 127 個字符
amount_x (物品 #x 需要)物品 #x 的價格
shipping_x 運送物品 #x 的第一件(數量 1)的成本
shipping2_x 每增加一件運送物品 #x(數量 2 或更多)所需的運送成本
handling_x 物品 #x 的處理成本
on0_x 物品 #x 的第一選項欄名稱。最多 64 個字符
os0_x 物品 #x 的第一組選項值。最多 200 個字符。”on0_x” 必須定義,以便識別 “os0_x”。
on1_x 物品 #x 的第二選項欄名稱。最多 64 個字符
os1_x 物品 #x 的第二組選項值。最多 200 個字符。”on1_x” 必須定義,以便識別 “os1_x”。 

爲購物車中每件物品重複此設定
爲您的買家購物車中的各物品加入以上表格中的一組必需的變量和任何選項變量。購物車中的第一物品必須用以 “_1″ 結束的參數定義,如 “item_name_1″、”amount_1″ 等。同樣,第二物品應用變量 “item_name_2″、”amount_2″ 等命名。提示:”_x” 值必須以一爲單位按序遞增,以便識別。如果從 item #1 跳到 item #3 而不定義 item #2,則第三個物品會被忽略。

要指定幣種:所有貨幣變量(金額、運費、運費 2、手續費、稅款)將以粘貼在付款上的 “currency_code” 變量指定的幣種顯示。因爲其不是隨物品不同的,無需向變量名稱附加 “_x”。如果沒有粘貼 “currency_code” 變量,我們將假定所有貨幣變量值爲美元。

PayPal提供了多個API接口供開發者使用。在使用API之前,你必須先申請一個高級個人賬戶或者企業賬戶,同時你必須獲取API 憑證供每次調用API 時使用。
一旦你獲取了API憑證,您就可以調用相關的API接口了。目前,我們提供兩種API接口方式,NVP和SOAP。一般來說我們推薦您使用 NVP 接口。
• Name-Value Pair(NVP)接口 – 請求和響應都是使用簡單的HTTP。該接口簡單易實現,適合於初級開發者和需要快速完成集成的人員;
• SOAP接口 – 請求和響應都是通過SOAP來完成。該接口適合於面向對象工程的開發;

PayPal API:NVP(名稱/值對)接口

通過NVP API接口, 您只需給PayPal發送一個HTTP請求,並通過“名稱=值”的形式指定請求參數,即可充分利用PayPal的API功能。

NVP API 是 PayPal 的業務功能、風險管理和業務邏輯的簡單接口。NVP API 最基本的使用方法是通過到 PayPal 服務器的 HTTPS 連接發送一個 NVP 字符串,然後處理響應(也是一個 NVP 字符串)。執行 NVP API 調用的基本步驟如下:

• 爲特定的 API 方法構造一個請求參數字符串。
• 通過 HTTPS 連接向 PayPal 服務器發送這個參數字符串。
• 處理服務器響應中的 NVP。

每個NVP API請求字符串包含有API用戶名、API密碼、所要調用API的名稱及用來標識交易的令牌,如: [email protected]&PWD=mypassword &METHOD=GetExpressCheckoutDetails&TOKEN=EC-23T233ZP3DFB…

成功的應答包含以下要素:ACK=Success ,以及一個用來標識交易的唯一令牌。 ACK=Success&TIMESTAMP=date/timeOfResponse &CORRELATIONID=debuggingToken&VERSION=2.300000&BUILD=buildNumber &TOKEN=EC-3DJ78083ES565113B&[email protected] &PAYERID=95HR9CM6D56Q2&PAYERSTATUS=verified &FIRSTNAME=John&LASTNAME=Smith…

您可以使用NVP API完成以下操作:
• 搜索已完成的交易記錄,以及查詢交易詳情;
• 自動化後端功能,例如,捕獲授權,以及處理退款等;

API Profile

進入商家賬號得到相應的APIProfile,如果是以中文語言查看,在-用戶信息-API 訪問-中得到,其中裏面申請API時,有兩個選項,第一個是用簽名的方式,第二種是以證書的方式來認證商家身份,當你選擇下載數字證時,可以到 www.paypaltech.com/tools/pem2p12.php轉換爲.p12文件,也可以採用OpenSSL的命令完成,一句話搞定,要輸 入密碼喔~。這裏的鏈接有詳細說明www.paypal.com/IntegrationCenter/ic_certificate.html

相應參考資料請參考連接www.paypal.com/IntegrationCenter/ic_expresscheckout.html 瞭解關於Express Checkout的原理;
在此基礎上,你可以訪問www.paypal.com/IntegrationCenter/ic_nvp.html 獲取相關測試代碼;
關於PayPal的測試環境你可以訪問www.paypal.com/IntegrationCenter/ic_sandbox.html,
API Reference https://www.paypal.com/IntegrationCenter/ic_api-reference.html

參考:

PayPal 集成資源

  PayPal Order Management Integration Guide (unknown, 17 hits)
You need to be a registered user to download this file.

  PayPal WebsitePaymentsStandard IntegrationGuide (unknown, 16 hits)
You need to be a registered user to download this file.

  PayPal-網站付款標準版集成指南 (unknown, 33 hits)
You need to be a registered user to download this file.

  PayPal-訂單管理集成指南 (unknown, 29 hits)
You need to be a registered user to download this file.

Download: PayPal PHP CLASS   PayPal PHP CLASS (13.5 KiB, 1,451 hits)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章