PayPal支付整合到自己Web網站

xuzm66發表於2016-07-12
PayPal如何整合到B2C網站?

因為網上實在找不到整合教程,我習慣性的google了一下相關資料,發現關於paypal介面的中文文件並不多,也不詳細,只好自己研究,還好paypal上的資料非常齊全,而且還提供了開發者沙盒(sandbox),相比之下,國內流行的支付寶還有很長的路要走啊。

整合結束的時候就有想法寫一篇網站整合paypal的簡易教程,方便以後的各位開發者,畢竟看長篇英文資料是很頭痛的事情,嘿嘿。整理了幾天才整理出這個教程,其實內容也不多,可能還算不上教程,只能算經驗吧。

主要分為序言、支付按鈕、返回資訊方式(IPN&PDT)、例項四部分組成,預計在三天內完成。

快速加入支付按鈕 
本篇主要介紹如何在你的網站上快速加入paypal支付按鈕,通過這個按鈕,人們可以方便快速的付款到你的paypal帳戶。
首先,你需要註冊一個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,不然資金轉來轉去手續費都扣光了。

接下來是按鈕的程式碼,很簡單,就是一個普通的網頁表單程式碼:

<form action="https://www.paypal.com/cgi-bin/webscr" method="post">
<input type="hidden" name="cmd" value="_xclick">
<input type="hidden" name="business" value="sample@sample.com">
<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>

如果使用sandbox,action地址改成https://www.sandbox.paypal.com/cgi-bin/webscr即可,上面這段還是很容易理解的,看下name和value基本上就能知道每個值的含義了。

儲存用瀏覽器開啟,就會看到一個paypal的按鈕,點選過去按照提示操作,就能付款到business指定值的帳戶了。

這就是一個最簡單的paypal支付按鈕。
再下一篇中會講一下如何在付款成功之後,將資訊返回到你的網站,大部分需求都是客戶完成付款後返回資訊到網站的資料庫,記錄網站客服的交易資訊。

最後稍微瞭解下為什麼海外使用者喜歡用自己的網站做生意,而不是像國內一樣用淘寶之類的C2C平臺。一開始我也很不理解,有免費的平臺為什麼要自己建設網站還要支付paypal的手續費,後來和客戶瞭解了一下,他們做的事網遊虛擬交易,國外最大的C2C平臺就是eBay,但只有德國可以售賣虛擬物品,並且eBay上的交易並不是免費的,收取的手續費遠遠高於paypal的費率,因此,更多的海外使用者選擇自己建設網站進行電子商務。

Paypal國際版網站整合簡易教程(三):IPN的使用

本文內容採用知識共享署名-非商業性使用-禁止演繹 2.5 中國大陸許可協議進行許可。

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

相信大部分網站整合Paypal都希望能夠實現客戶支付完成後返回資訊到自己的網站,然後處理這些資訊。比如客戶在你的網站上購買了一個產品,通過Paypal完成了支付,接著Paypal告訴你的網站客戶完成了支付以及支付資訊,最後你的網站將這些資訊記錄到你自己的資料庫中,並且將你的客戶訂單狀態設為已支付,接著你就可以進行一系列的相關訂單的後續操作。IPN就能幫助我們實現這個功能。

當客戶完成支付,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.chenchen.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也會返回一個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。
這篇文章寫得有些倉促,如有疑問可以傳送郵件到:chenchen[at]ndwork.com 用@替換[at]。
下一次我會講PDT方式,這個比IPN簡單很多

Paypal國際版網站整合簡易教程(四):PDT的使用
什麼是PDT
PDT是一個安全獲取付款明細的方式。在買家付完款後,賣家可以通過此方式即時獲取付款明細並顯示給買家看。

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

相關文章