安裝 PayPal SDK,您還需要一些擴(kuò)展功能: PEAR、cURL 和 SSL。 盡管它們可以在
php.ini 中加載,但使用 PHP 編譯可得到最佳結(jié)果。
充分設(shè)置好環(huán)境后,您需要下載 PayPal PHP SDK,其中包括服務(wù)/ PayPal PEAR 程序包、 PayPal Web 控制臺(tái)、SDK 文檔和 PDF 信息文檔。 (參見(jiàn)下方“無(wú)法使用 Web 控制臺(tái)”部分中關(guān)于 Web 控制臺(tái)的重要注意事項(xiàng)。) 在下載和提取此文件后,您需要運(yùn)行一些命令行操作:
pear install --alldeps /Services_PayPal/package.xml
cp -r /WebConsole
此命令可以安裝一些其它的 PEAR 程序包,為您提供一個(gè)功能完善的 PayPal SDK。 在瀏覽器中訪問(wèn) http://localhost/WebConsole 頁(yè)面后, PayPal 配置文件管理工具將顯示一條問(wèn)候消息,您可以在此處檢查 PayPal SDK 的有效性。 常見(jiàn)問(wèn)題包括丟失 cURL 或 SSL 的安裝,通過(guò)修改 php.ini 或重新編譯 PHP,然后再次運(yùn)行 PEAR 命令,這些問(wèn)題將得到修復(fù)。 如果因?yàn)橥泄芟拗苹虬踩詥?wèn)題而無(wú)法安裝 PEAR 或某種必要的擴(kuò)展功能,您還可以使用下方描述的標(biāo)準(zhǔn)結(jié)帳。
采用穩(wěn)妥的方式……
通過(guò) SDK 使用 API 是使用 PayPal 功能的一種靈活、有效的方式。 API 支持的兩種支付方式包括:
直接付款:使用此方式可以收集網(wǎng)站上的詳細(xì)帳單,從用戶(hù)的信用卡收費(fèi),全 部工作在自己網(wǎng)站上完成。 這種方法適合擁有 https 安全應(yīng)用程序和基礎(chǔ)架構(gòu)(用于存儲(chǔ)客戶(hù)和購(gòu)物車(chē)信息)的大型機(jī)構(gòu)。
快速結(jié)帳:這種方式允許用戶(hù)使用 PayPal 帳戶(hù)信息和選擇發(fā)貨方式,不需要在網(wǎng)站上重新輸入信息,從而節(jié)省了時(shí)間。同時(shí), 這種方式不需要應(yīng)用程序存儲(chǔ)購(gòu)買(mǎi)者信息的本地副本,管理此方式時(shí)只需要最少的額外安全性基礎(chǔ)架構(gòu)。
其它 API 特性(文中并未完全涉及)包括:
慈善捐款:根據(jù)用戶(hù)的購(gòu)物情況,提供有關(guān) 慈善捐款的實(shí)時(shí)信息。
發(fā)貨:如果 銷(xiāo)售的是現(xiàn)實(shí)產(chǎn)品,則允許用戶(hù)選擇發(fā)貨商、發(fā)貨方式、保險(xiǎn)和其它屬性。 在用戶(hù)確實(shí)購(gòu)買(mǎi)貨物之前,您就可以向用戶(hù)提供發(fā)貨的成本,或者也可以使用此特性在產(chǎn)品顯示頁(yè)面提供更準(zhǔn)確的價(jià)格。
退款:提供向用戶(hù)退款的方法。
稅款:根據(jù)每件貨物或每個(gè)購(gòu)物車(chē)收稅,并適當(dāng)?shù)貙⒍惪铒@示在收據(jù)和發(fā)票 上。
訂閱: 靈活地定義現(xiàn)實(shí)貨物和數(shù)字貨物的循環(huán)訂閱。
SDK 還提供了廣泛的 eBay 支持,盡管其價(jià)值不在我們討論的范圍內(nèi)。
……或者采用簡(jiǎn)易方式
如果 SDK 的功能遠(yuǎn)遠(yuǎn)超出用戶(hù)的需求,在此情況下,PayPal 提供了另一種解決方案。 標(biāo)準(zhǔn)結(jié)帳不使用 SOAP,只依賴(lài)于在應(yīng)用程序與 PayPal 安全服務(wù)器間傳遞 HTML 表單值。 要使用標(biāo)準(zhǔn)結(jié)帳,您只需要生成一個(gè)表單,該表單可以提交適當(dāng)?shù)? POST 變量,如下面的示例所示:
<form action="https://sandbox.paypal.com/cgi-bin/webscr" method="post">
<input type="hidden" name="cmd" value="_cart">
<input type="hidden" name="upload" value="1">
<input type="hidden" name="business" value="sales@widgetco.com">
<input type="hidden" name="item_name_1" value="Big Widget">
<input type="hidden" name="amount_1" value="100.00">
<input type="hidden" name="item_name_2" value="Little Widget">
<input type="hidden" name="amount_2" value="1.00">
<input type="submit" value="PayPal">
</form>
提交表單后,用戶(hù)將進(jìn)入 PayPal 的服務(wù)器,輸入帳單信息。 在完成信息驗(yàn)證和帳單授權(quán)機(jī)制后,用戶(hù)將返回您在網(wǎng)站上定義的一個(gè)位置。 如果您僅僅是收集捐款,而不是銷(xiāo)售物品,那么您的工作已經(jīng)完成了! 然而,對(duì)于其它情況,用戶(hù)可使用大量的變量來(lái)定制功能、貨幣和顯示方面的體驗(yàn)。 (參見(jiàn)參考指南。)
使用帶有 notify_url 變量的即時(shí)付款通知 (IPN) 時(shí),一旦用戶(hù)在指定的地點(diǎn)完成付款,您的應(yīng)用程序就會(huì)得到通知 — 您可以使用定制的鏈接提供專(zhuān)用用戶(hù)標(biāo)識(shí),例如,允許對(duì)在線內(nèi)容進(jìn)行即時(shí)訪問(wèn)或觸發(fā)一個(gè)批發(fā)商的訂單。 另外,通過(guò)使用發(fā)票和定制變量,您可以創(chuàng)建一個(gè)機(jī)構(gòu),將 PayPal 的記錄限制在您自己的域中。 如果應(yīng)用程序已經(jīng)保存了用戶(hù)名和地址信息,您可以通過(guò)一組變量(包括 address1 、city 和 country)將這些信息傳遞給 PayPal ,以便預(yù)先填充相應(yīng)的字段。
標(biāo)準(zhǔn)結(jié)帳的基本方式 中也包含 API 為收集非盈利性資金而提供的許多特性, 例如,可以應(yīng)用到每個(gè)購(gòu)物車(chē)或每件貨物的稅款、處理和發(fā)貨變量。
cpp_ 系列變量(包括 cpp_header_image、cpp_headerback_color、cpp_headerborder_color 和 cs)允許您精確調(diào)整用戶(hù)在 PayPal 服務(wù)器上的體驗(yàn),這些變量用于設(shè)置支付頁(yè)面的背景顏色。 如果這種方法能夠滿(mǎn)足應(yīng)用程序的需求,標(biāo)準(zhǔn)結(jié)帳將是一種非常經(jīng)濟(jì)有效的解決方案。 與基于 API 的直接付款方式不同,標(biāo)準(zhǔn)結(jié)帳并不確定每月的費(fèi)用,并且實(shí)施期間的開(kāi)發(fā)工作非常少。
準(zhǔn)備付款
要使用 PayPal API,首先要熟悉開(kāi)發(fā)人員中心。 您將在開(kāi)發(fā)人員中心建立帳戶(hù),以便在 Sandbox 中創(chuàng)建買(mǎi)方與賣(mài)方的示例帳戶(hù)。 示例帳戶(hù)創(chuàng)建完畢后,使用該帳戶(hù)登錄到 Sandbox 將顯示擁有資金的有效 PayPal 帳戶(hù)。 您的買(mǎi)方可以從其他 Sandbox 帳戶(hù)購(gòu)買(mǎi)物品,您的賣(mài)方可以將貨款退還給其他 Sandbox 帳戶(hù),這些都不需要現(xiàn)金轉(zhuǎn)移,也不需要收費(fèi)代理。 PayPal 的集成中心提供了極好的逐步指南(注意,第 3 步是我在前面介紹的安裝過(guò)程),我將在此處提供該指南的概述。
首先,您需要在 developer.paypal.com 注冊(cè)一個(gè)帳戶(hù),此網(wǎng)頁(yè)是訪問(wèn)各種開(kāi)發(fā)人員資源的中心點(diǎn),用于創(chuàng)建 Sandbox 帳戶(hù)。 之后,您將在 developer.paypal.com 的 Sandbox 選項(xiàng)卡中創(chuàng)建一個(gè)買(mǎi)方示例和一個(gè)賣(mài)方示例。這項(xiàng)工作非常簡(jiǎn)單,為了使創(chuàng)建的內(nèi)容有意義,您只需要足夠的創(chuàng)造力。 例如,在提示您輸入銀行帳戶(hù)信息時(shí),為了方便使用,建議您將系統(tǒng)提供的虛擬帳戶(hù)號(hào)作為銀行的名稱(chēng)。 另外,您可以為買(mǎi)方帳戶(hù)和賣(mài)方帳戶(hù)使用相同的密碼,因?yàn)榇朔?wù)器發(fā)生密碼泄露的風(fēng)險(xiǎn)很低。 在 Sandbox 中學(xué)習(xí)的特性與生產(chǎn)時(shí)使用的特性完全相同,從而減少了培訓(xùn)和測(cè)試時(shí)間。
在 Sandbox 中最后一個(gè)重要的步驟是創(chuàng)建測(cè)試證書(shū),這是一個(gè)小型文本文件,其中包含將與每個(gè) API 調(diào)用一起使用的密鑰。 要?jiǎng)?chuàng)建一個(gè)證書(shū),您需要登錄到賣(mài)方 Sandbox 帳戶(hù),單擊 Profile,然后依次選擇 API Access 和 View or Remove Credentials。 記錄此文件和密碼;您將在配置應(yīng)用程序時(shí)用到它們。
回到 developer.paypal.com,您可以查看測(cè)試證書(shū)的信息,也可以從 Test Certificates 選項(xiàng)卡下載測(cè)試證書(shū)。 此處不能查看 API 密碼;要獲得此信息,您必須重新登錄到 http://www.sandbox.paypal.com,然后訪問(wèn)上述位置。
直接付款處理
與 PayPal 交互的最靈活的方式是通過(guò) SDK 來(lái)完成,SDK 會(huì)將基于 SOAP 的請(qǐng)求抽象成可管理的信息。 不同調(diào)用要完成的目標(biāo)不同,但執(zhí)行的步驟基本相同: 認(rèn)證、操作和響應(yīng)流程。 第一個(gè)步驟,認(rèn)證,來(lái)自 SDK 示例,同樣需要用在下方的快速結(jié)帳方法中。 顯示的值用于 Sandbox 測(cè)試: 需要為生產(chǎn)創(chuàng)建帶有認(rèn)證詳細(xì)信息的新證書(shū)。
$certfile = dirname(__FILE__) . '/sdk-seller_cert.pem';
$apiusername = '';
$apipassword = '';
$subject = null;
$environment = 'Sandbox';
$handler =& ProfileHandler_Array::getInstance(array(
'username' => $apiusername,
'certificateFile' => $certfile,
'subject' => $subject,
'environment' => $environment));
$profile =& APIProfile::getInstance($apiusername, $handler);
$profile->setAPIPassword($apipassword);
$caller =& Services_PayPal::getCallerServices($profile);
認(rèn)證完成后,應(yīng)用程序已經(jīng)準(zhǔn)備好處理 API 請(qǐng)求。 在直接付款時(shí),您的應(yīng)用程序必須有能力、有責(zé)任創(chuàng)建和存儲(chǔ)訂單的狀態(tài),并為訂單創(chuàng)建收據(jù): 在下一個(gè)示例中,我們將假定應(yīng)用程序已將所有相關(guān)信息存儲(chǔ)到以下表格中: Customer、Billing_Method、Order 和 Line_item。 本示例使用 PHP 數(shù)據(jù)對(duì)象 (PDO),在此情況下,傳統(tǒng)的 OCI8 方法同樣有效。
$db = new PDO('oci:', 'scott', 'tiger' 'HR', 'HR');
$dbcustomer = $dbh->query("SELECT * " .
"FROM customer " .
"WHERE customerid = '{$_SESSION'}");
$dborder = $dbh->query("SELECT * " .
"FROM order " .
"WHERE customerid = '{$_SESSION}' " .
"AND orderid = '{$_SESSION}'");
$dbbilling = $dbh->query("SELECT * " .
"FROM billing_method " .
"WHERE billingid = '{$dborder}'");
$dblineitemtotals = $dbh->query("SELECT sum(amount) total " .
"FROM line_item " .
"WHERE customerid = '{$_SESSION}' " .
"AND orderid = '{$_SESSION}'");
$name =& Services_PayPal::getType('PersonNameType');
$name->setFirstName($dbcustomer['fname']);
$name->setLastName($dbcustomer['lname']);
$address =& Services_PayPal::getType('AddressType');
$address->setStreet1($dbbilling['street1']);
$address->setCityName($dbbilling['city']);
$address->setStateOrProvince($dbbilling['state']);
$address->setCountry($dbbilling['country']);
$address->setPostalCode($dbbilling['zip']);
$payer =& Services_PayPal::getType('PayerInfoType');
$payer->setPayerName($name);
$payer->setPayerCountry('US');
$payer->setAddress($address);
$cc =& Services_PayPal::getType('CreditCardDetailsType');
$cc->setCreditCardType($dbbilling['cardtype']);
$cc->setCreditCardNumber($dbbilling['cardnumber']);
$cc->setExpMonth($dbbilling['expmonth']);
$cc->setExpYear($dbbilling['expyear']);
$cc->setCardOwner($payer);
$amount =& Services_PayPal::getType('BasicAmountType');
$amount->setval($dblineitemtotals['total']);
$amount->setattr('currencyID', 'USD');
$pdt =& Services_PayPal::getType('PaymentDetailsType');
$pdt->setOrderTotal($amount);
$details =& Services_PayPal::getType('DoDirectPaymentRequestDetailsType');
$details->setPaymentAction('Authorization');
$details->setPaymentDetails($pdt);
$details->setCreditCard($cc);
$details->setIPAddress('127.0.0.1');
$details->setMerchantSessionId('merchantId');
$ddp =& Services_PayPal::getType('DoDirectPaymentRequestType');
$ddp->setDoDirectPaymentRequestDetails($details);
此時(shí), PayPal 執(zhí)行請(qǐng)求的直接付款。 為了解發(fā)生的情況,現(xiàn)在,應(yīng)用程序會(huì)獲取第三步中的信息: 響應(yīng)處理。
$response = $caller->DoDirectPayment($ddp);
此響應(yīng)中返回的各種字段提供了有關(guān)事務(wù)成功的信息,以及事務(wù)的 ID。通過(guò)存儲(chǔ)此 ID 并將它提供給后面的 API 調(diào)用,應(yīng)用程序?qū)⒛軌颢@取有關(guān)事務(wù)的詳細(xì)信息,并將根據(jù)這些信息生成另一個(gè)表格。
$d =& Services_PayPal::getType('GetTransactionDetailsRequestType');
$d->setTransactionId('');
$response = $caller->GetTransactionDetails($d);
無(wú)法使用 Web 控制臺(tái)
在撰寫(xiě)本文時(shí),隨上述 SDK 下載一起提供的 Web 控制臺(tái)由于丟失了重要目錄而停止工作。 然而,此時(shí)可以下載包含所有必需文件的存檔。 控制臺(tái)能夠測(cè)試 API 調(diào)用,生成 PHP 代碼片斷,從而達(dá)成您的目標(biāo)。 通過(guò)本文和 SDK 參考中的一些調(diào)查,您可以通過(guò)瀏覽器方便地查看從 Sandbox 發(fā)出的所有 API 調(diào)用。
快速結(jié)帳流程
快速結(jié)帳方式介于強(qiáng)大的直接付款方式和簡(jiǎn)捷的標(biāo)準(zhǔn)結(jié)帳方式之間。 利用快速結(jié)帳和基于 API 的方法,用戶(hù)可以在您的網(wǎng)站完成訂單創(chuàng)建過(guò)程,然后轉(zhuǎn)至 PayPal 處理所有帳單和發(fā)貨信息。 在使用快速結(jié)帳時(shí),用戶(hù)只需為所有商品輸入一次帳戶(hù)信息,而您的應(yīng)用程序也不需要存儲(chǔ)這些信息 — 這在安全性和開(kāi)發(fā)方面具有明顯的優(yōu)勢(shì)。 同直接付款方式相同,通過(guò)存儲(chǔ)事務(wù) ID,應(yīng)用程序可以利用其他 API 調(diào)用獲取事物的詳細(xì)信息。 快速結(jié)帳可以利用上文中描述的 IPN,從而允許其它實(shí)時(shí)處理選項(xiàng)。 下面的代碼段來(lái)自 SDK 示例。
$amount =& Services_PayPal::getType('BasicAmountType');
$amount->setval();
$amount->setattr('currencyID', 'USD');
$ecd =& Services_PayPal::getType('SetExpressCheckoutRequestDetailsType');
$ecd->setOrderTotal($amount);
$ecd->setReturnURL('http://widgetco.com/return');
$ecd->setCancelURL('http://widgetco.com/cancel');
$ec =& Services_PayPal::getType('SetExpressCheckoutRequestType');
$ec->setSetExpressCheckoutRequestDetails($ecd);
$response = $caller->SetExpressCheckout($ec);
此調(diào)用的結(jié)果將提供一個(gè)令牌,您可以將其添加到一個(gè)鏈路,或者在網(wǎng)站上將其重定向到 PayPal 。 然后,用戶(hù)使用 PayPal 處理業(yè)務(wù)。在操作成功或失敗后,系統(tǒng)將用戶(hù)重定向到您的網(wǎng)站。 在本示例中,調(diào)用的頁(yè)面返回將向您的應(yīng)用程序發(fā)送以下 API 調(diào)用:
$ecd =& Services_PayPal::getType('GetExpressCheckoutDetailsRequestType');
$ecd->setToken('');
$response = $caller->GetExpressCheckoutDetails($ecd);
這里包含您需要的所有事務(wù)信息,但不包含信用卡號(hào)等敏感信息。 用戶(hù)在您的網(wǎng)站上對(duì)這些值進(jìn)行確認(rèn)后,由最終 API 調(diào)用處理資金事務(wù):
$amount =& Services_PayPal::getType('BasicAmountType');
$amount->setval();
$amount->setattr('currencyID', 'USD');
$pdt =& Services_PayPal::getType('PaymentDetailsType');
$pdt->setOrderTotal($amount);
$details =& Services_PayPal::getType('DoExpressCheckoutPaymentRequestDetailsType');
$details->setPaymentAction('Sale');
$details->setToken('');
$details->setPayerID('juser@jisp.com');
$details->setPaymentDetails($pdt);
$ecprt =& Services_PayPal::getType('DoExpressCheckoutPaymentRequestType');
$ecprt->setDoExpressCheckoutPaymentRequestDetails($details);
$response = $caller->DoExpressCheckoutPayment($ecprt);
同樣,在對(duì) updateChart 進(jìn)行連續(xù)調(diào)用時(shí),ChartData 將引發(fā) onResult 方法:
_root.chartData.onResult = function() {
_root.chart.throbber._visible = false;
drawChart(this);
}
快速結(jié)帳幾乎與直接付款具有相同的定制 性,同時(shí)還保持了標(biāo)準(zhǔn)結(jié)帳的保密和安全優(yōu)勢(shì)。
PayPal 支付處理的任何一種形式都提供了收集在線付款的有效方式。 由實(shí)施者決定哪種方式更加適合: 標(biāo)準(zhǔn)結(jié)帳為小型機(jī)構(gòu)提供了收集付款的能力,且不需要這些機(jī)構(gòu)投資其它安全體系結(jié)構(gòu);在與當(dāng)前的企業(yè)應(yīng)用程序集成時(shí),直接付款是理想的解決方案;而快速結(jié)帳 介于兩者之間,適合將其更改成第三方產(chǎn)品。 選擇靈活性、安全性和實(shí)施便捷性之間的平衡點(diǎn)將允許您利用現(xiàn)有的 Oracle 基礎(chǔ)架構(gòu)獲得在線支付功能。
充分設(shè)置好環(huán)境后,您需要下載 PayPal PHP SDK,其中包括服務(wù)/ PayPal PEAR 程序包、 PayPal Web 控制臺(tái)、SDK 文檔和 PDF 信息文檔。 (參見(jiàn)下方“無(wú)法使用 Web 控制臺(tái)”部分中關(guān)于 Web 控制臺(tái)的重要注意事項(xiàng)。) 在下載和提取此文件后,您需要運(yùn)行一些命令行操作:
pear install --alldeps /Services_PayPal/package.xml
cp -r /WebConsole
此命令可以安裝一些其它的 PEAR 程序包,為您提供一個(gè)功能完善的 PayPal SDK。 在瀏覽器中訪問(wèn) http://localhost/WebConsole 頁(yè)面后, PayPal 配置文件管理工具將顯示一條問(wèn)候消息,您可以在此處檢查 PayPal SDK 的有效性。 常見(jiàn)問(wèn)題包括丟失 cURL 或 SSL 的安裝,通過(guò)修改 php.ini 或重新編譯 PHP,然后再次運(yùn)行 PEAR 命令,這些問(wèn)題將得到修復(fù)。 如果因?yàn)橥泄芟拗苹虬踩詥?wèn)題而無(wú)法安裝 PEAR 或某種必要的擴(kuò)展功能,您還可以使用下方描述的標(biāo)準(zhǔn)結(jié)帳。
采用穩(wěn)妥的方式……
通過(guò) SDK 使用 API 是使用 PayPal 功能的一種靈活、有效的方式。 API 支持的兩種支付方式包括:
直接付款:使用此方式可以收集網(wǎng)站上的詳細(xì)帳單,從用戶(hù)的信用卡收費(fèi),全 部工作在自己網(wǎng)站上完成。 這種方法適合擁有 https 安全應(yīng)用程序和基礎(chǔ)架構(gòu)(用于存儲(chǔ)客戶(hù)和購(gòu)物車(chē)信息)的大型機(jī)構(gòu)。
快速結(jié)帳:這種方式允許用戶(hù)使用 PayPal 帳戶(hù)信息和選擇發(fā)貨方式,不需要在網(wǎng)站上重新輸入信息,從而節(jié)省了時(shí)間。同時(shí), 這種方式不需要應(yīng)用程序存儲(chǔ)購(gòu)買(mǎi)者信息的本地副本,管理此方式時(shí)只需要最少的額外安全性基礎(chǔ)架構(gòu)。
其它 API 特性(文中并未完全涉及)包括:
慈善捐款:根據(jù)用戶(hù)的購(gòu)物情況,提供有關(guān) 慈善捐款的實(shí)時(shí)信息。
發(fā)貨:如果 銷(xiāo)售的是現(xiàn)實(shí)產(chǎn)品,則允許用戶(hù)選擇發(fā)貨商、發(fā)貨方式、保險(xiǎn)和其它屬性。 在用戶(hù)確實(shí)購(gòu)買(mǎi)貨物之前,您就可以向用戶(hù)提供發(fā)貨的成本,或者也可以使用此特性在產(chǎn)品顯示頁(yè)面提供更準(zhǔn)確的價(jià)格。
退款:提供向用戶(hù)退款的方法。
稅款:根據(jù)每件貨物或每個(gè)購(gòu)物車(chē)收稅,并適當(dāng)?shù)貙⒍惪铒@示在收據(jù)和發(fā)票 上。
訂閱: 靈活地定義現(xiàn)實(shí)貨物和數(shù)字貨物的循環(huán)訂閱。
SDK 還提供了廣泛的 eBay 支持,盡管其價(jià)值不在我們討論的范圍內(nèi)。
……或者采用簡(jiǎn)易方式
如果 SDK 的功能遠(yuǎn)遠(yuǎn)超出用戶(hù)的需求,在此情況下,PayPal 提供了另一種解決方案。 標(biāo)準(zhǔn)結(jié)帳不使用 SOAP,只依賴(lài)于在應(yīng)用程序與 PayPal 安全服務(wù)器間傳遞 HTML 表單值。 要使用標(biāo)準(zhǔn)結(jié)帳,您只需要生成一個(gè)表單,該表單可以提交適當(dāng)?shù)? POST 變量,如下面的示例所示:
<form action="https://sandbox.paypal.com/cgi-bin/webscr" method="post">
<input type="hidden" name="cmd" value="_cart">
<input type="hidden" name="upload" value="1">
<input type="hidden" name="business" value="sales@widgetco.com">
<input type="hidden" name="item_name_1" value="Big Widget">
<input type="hidden" name="amount_1" value="100.00">
<input type="hidden" name="item_name_2" value="Little Widget">
<input type="hidden" name="amount_2" value="1.00">
<input type="submit" value="PayPal">
</form>
提交表單后,用戶(hù)將進(jìn)入 PayPal 的服務(wù)器,輸入帳單信息。 在完成信息驗(yàn)證和帳單授權(quán)機(jī)制后,用戶(hù)將返回您在網(wǎng)站上定義的一個(gè)位置。 如果您僅僅是收集捐款,而不是銷(xiāo)售物品,那么您的工作已經(jīng)完成了! 然而,對(duì)于其它情況,用戶(hù)可使用大量的變量來(lái)定制功能、貨幣和顯示方面的體驗(yàn)。 (參見(jiàn)參考指南。)
使用帶有 notify_url 變量的即時(shí)付款通知 (IPN) 時(shí),一旦用戶(hù)在指定的地點(diǎn)完成付款,您的應(yīng)用程序就會(huì)得到通知 — 您可以使用定制的鏈接提供專(zhuān)用用戶(hù)標(biāo)識(shí),例如,允許對(duì)在線內(nèi)容進(jìn)行即時(shí)訪問(wèn)或觸發(fā)一個(gè)批發(fā)商的訂單。 另外,通過(guò)使用發(fā)票和定制變量,您可以創(chuàng)建一個(gè)機(jī)構(gòu),將 PayPal 的記錄限制在您自己的域中。 如果應(yīng)用程序已經(jīng)保存了用戶(hù)名和地址信息,您可以通過(guò)一組變量(包括 address1 、city 和 country)將這些信息傳遞給 PayPal ,以便預(yù)先填充相應(yīng)的字段。
標(biāo)準(zhǔn)結(jié)帳的基本方式 中也包含 API 為收集非盈利性資金而提供的許多特性, 例如,可以應(yīng)用到每個(gè)購(gòu)物車(chē)或每件貨物的稅款、處理和發(fā)貨變量。
cpp_ 系列變量(包括 cpp_header_image、cpp_headerback_color、cpp_headerborder_color 和 cs)允許您精確調(diào)整用戶(hù)在 PayPal 服務(wù)器上的體驗(yàn),這些變量用于設(shè)置支付頁(yè)面的背景顏色。 如果這種方法能夠滿(mǎn)足應(yīng)用程序的需求,標(biāo)準(zhǔn)結(jié)帳將是一種非常經(jīng)濟(jì)有效的解決方案。 與基于 API 的直接付款方式不同,標(biāo)準(zhǔn)結(jié)帳并不確定每月的費(fèi)用,并且實(shí)施期間的開(kāi)發(fā)工作非常少。
準(zhǔn)備付款
要使用 PayPal API,首先要熟悉開(kāi)發(fā)人員中心。 您將在開(kāi)發(fā)人員中心建立帳戶(hù),以便在 Sandbox 中創(chuàng)建買(mǎi)方與賣(mài)方的示例帳戶(hù)。 示例帳戶(hù)創(chuàng)建完畢后,使用該帳戶(hù)登錄到 Sandbox 將顯示擁有資金的有效 PayPal 帳戶(hù)。 您的買(mǎi)方可以從其他 Sandbox 帳戶(hù)購(gòu)買(mǎi)物品,您的賣(mài)方可以將貨款退還給其他 Sandbox 帳戶(hù),這些都不需要現(xiàn)金轉(zhuǎn)移,也不需要收費(fèi)代理。 PayPal 的集成中心提供了極好的逐步指南(注意,第 3 步是我在前面介紹的安裝過(guò)程),我將在此處提供該指南的概述。
首先,您需要在 developer.paypal.com 注冊(cè)一個(gè)帳戶(hù),此網(wǎng)頁(yè)是訪問(wèn)各種開(kāi)發(fā)人員資源的中心點(diǎn),用于創(chuàng)建 Sandbox 帳戶(hù)。 之后,您將在 developer.paypal.com 的 Sandbox 選項(xiàng)卡中創(chuàng)建一個(gè)買(mǎi)方示例和一個(gè)賣(mài)方示例。這項(xiàng)工作非常簡(jiǎn)單,為了使創(chuàng)建的內(nèi)容有意義,您只需要足夠的創(chuàng)造力。 例如,在提示您輸入銀行帳戶(hù)信息時(shí),為了方便使用,建議您將系統(tǒng)提供的虛擬帳戶(hù)號(hào)作為銀行的名稱(chēng)。 另外,您可以為買(mǎi)方帳戶(hù)和賣(mài)方帳戶(hù)使用相同的密碼,因?yàn)榇朔?wù)器發(fā)生密碼泄露的風(fēng)險(xiǎn)很低。 在 Sandbox 中學(xué)習(xí)的特性與生產(chǎn)時(shí)使用的特性完全相同,從而減少了培訓(xùn)和測(cè)試時(shí)間。
在 Sandbox 中最后一個(gè)重要的步驟是創(chuàng)建測(cè)試證書(shū),這是一個(gè)小型文本文件,其中包含將與每個(gè) API 調(diào)用一起使用的密鑰。 要?jiǎng)?chuàng)建一個(gè)證書(shū),您需要登錄到賣(mài)方 Sandbox 帳戶(hù),單擊 Profile,然后依次選擇 API Access 和 View or Remove Credentials。 記錄此文件和密碼;您將在配置應(yīng)用程序時(shí)用到它們。
回到 developer.paypal.com,您可以查看測(cè)試證書(shū)的信息,也可以從 Test Certificates 選項(xiàng)卡下載測(cè)試證書(shū)。 此處不能查看 API 密碼;要獲得此信息,您必須重新登錄到 http://www.sandbox.paypal.com,然后訪問(wèn)上述位置。
直接付款處理
與 PayPal 交互的最靈活的方式是通過(guò) SDK 來(lái)完成,SDK 會(huì)將基于 SOAP 的請(qǐng)求抽象成可管理的信息。 不同調(diào)用要完成的目標(biāo)不同,但執(zhí)行的步驟基本相同: 認(rèn)證、操作和響應(yīng)流程。 第一個(gè)步驟,認(rèn)證,來(lái)自 SDK 示例,同樣需要用在下方的快速結(jié)帳方法中。 顯示的值用于 Sandbox 測(cè)試: 需要為生產(chǎn)創(chuàng)建帶有認(rèn)證詳細(xì)信息的新證書(shū)。
$certfile = dirname(__FILE__) . '/sdk-seller_cert.pem';
$apiusername = '';
$apipassword = '';
$subject = null;
$environment = 'Sandbox';
$handler =& ProfileHandler_Array::getInstance(array(
'username' => $apiusername,
'certificateFile' => $certfile,
'subject' => $subject,
'environment' => $environment));
$profile =& APIProfile::getInstance($apiusername, $handler);
$profile->setAPIPassword($apipassword);
$caller =& Services_PayPal::getCallerServices($profile);
認(rèn)證完成后,應(yīng)用程序已經(jīng)準(zhǔn)備好處理 API 請(qǐng)求。 在直接付款時(shí),您的應(yīng)用程序必須有能力、有責(zé)任創(chuàng)建和存儲(chǔ)訂單的狀態(tài),并為訂單創(chuàng)建收據(jù): 在下一個(gè)示例中,我們將假定應(yīng)用程序已將所有相關(guān)信息存儲(chǔ)到以下表格中: Customer、Billing_Method、Order 和 Line_item。 本示例使用 PHP 數(shù)據(jù)對(duì)象 (PDO),在此情況下,傳統(tǒng)的 OCI8 方法同樣有效。
$db = new PDO('oci:', 'scott', 'tiger' 'HR', 'HR');
$dbcustomer = $dbh->query("SELECT * " .
"FROM customer " .
"WHERE customerid = '{$_SESSION'}");
$dborder = $dbh->query("SELECT * " .
"FROM order " .
"WHERE customerid = '{$_SESSION}' " .
"AND orderid = '{$_SESSION}'");
$dbbilling = $dbh->query("SELECT * " .
"FROM billing_method " .
"WHERE billingid = '{$dborder}'");
$dblineitemtotals = $dbh->query("SELECT sum(amount) total " .
"FROM line_item " .
"WHERE customerid = '{$_SESSION}' " .
"AND orderid = '{$_SESSION}'");
$name =& Services_PayPal::getType('PersonNameType');
$name->setFirstName($dbcustomer['fname']);
$name->setLastName($dbcustomer['lname']);
$address =& Services_PayPal::getType('AddressType');
$address->setStreet1($dbbilling['street1']);
$address->setCityName($dbbilling['city']);
$address->setStateOrProvince($dbbilling['state']);
$address->setCountry($dbbilling['country']);
$address->setPostalCode($dbbilling['zip']);
$payer =& Services_PayPal::getType('PayerInfoType');
$payer->setPayerName($name);
$payer->setPayerCountry('US');
$payer->setAddress($address);
$cc =& Services_PayPal::getType('CreditCardDetailsType');
$cc->setCreditCardType($dbbilling['cardtype']);
$cc->setCreditCardNumber($dbbilling['cardnumber']);
$cc->setExpMonth($dbbilling['expmonth']);
$cc->setExpYear($dbbilling['expyear']);
$cc->setCardOwner($payer);
$amount =& Services_PayPal::getType('BasicAmountType');
$amount->setval($dblineitemtotals['total']);
$amount->setattr('currencyID', 'USD');
$pdt =& Services_PayPal::getType('PaymentDetailsType');
$pdt->setOrderTotal($amount);
$details =& Services_PayPal::getType('DoDirectPaymentRequestDetailsType');
$details->setPaymentAction('Authorization');
$details->setPaymentDetails($pdt);
$details->setCreditCard($cc);
$details->setIPAddress('127.0.0.1');
$details->setMerchantSessionId('merchantId');
$ddp =& Services_PayPal::getType('DoDirectPaymentRequestType');
$ddp->setDoDirectPaymentRequestDetails($details);
此時(shí), PayPal 執(zhí)行請(qǐng)求的直接付款。 為了解發(fā)生的情況,現(xiàn)在,應(yīng)用程序會(huì)獲取第三步中的信息: 響應(yīng)處理。
$response = $caller->DoDirectPayment($ddp);
此響應(yīng)中返回的各種字段提供了有關(guān)事務(wù)成功的信息,以及事務(wù)的 ID。通過(guò)存儲(chǔ)此 ID 并將它提供給后面的 API 調(diào)用,應(yīng)用程序?qū)⒛軌颢@取有關(guān)事務(wù)的詳細(xì)信息,并將根據(jù)這些信息生成另一個(gè)表格。
$d =& Services_PayPal::getType('GetTransactionDetailsRequestType');
$d->setTransactionId('');
$response = $caller->GetTransactionDetails($d);
無(wú)法使用 Web 控制臺(tái)
在撰寫(xiě)本文時(shí),隨上述 SDK 下載一起提供的 Web 控制臺(tái)由于丟失了重要目錄而停止工作。 然而,此時(shí)可以下載包含所有必需文件的存檔。 控制臺(tái)能夠測(cè)試 API 調(diào)用,生成 PHP 代碼片斷,從而達(dá)成您的目標(biāo)。 通過(guò)本文和 SDK 參考中的一些調(diào)查,您可以通過(guò)瀏覽器方便地查看從 Sandbox 發(fā)出的所有 API 調(diào)用。
快速結(jié)帳流程
快速結(jié)帳方式介于強(qiáng)大的直接付款方式和簡(jiǎn)捷的標(biāo)準(zhǔn)結(jié)帳方式之間。 利用快速結(jié)帳和基于 API 的方法,用戶(hù)可以在您的網(wǎng)站完成訂單創(chuàng)建過(guò)程,然后轉(zhuǎn)至 PayPal 處理所有帳單和發(fā)貨信息。 在使用快速結(jié)帳時(shí),用戶(hù)只需為所有商品輸入一次帳戶(hù)信息,而您的應(yīng)用程序也不需要存儲(chǔ)這些信息 — 這在安全性和開(kāi)發(fā)方面具有明顯的優(yōu)勢(shì)。 同直接付款方式相同,通過(guò)存儲(chǔ)事務(wù) ID,應(yīng)用程序可以利用其他 API 調(diào)用獲取事物的詳細(xì)信息。 快速結(jié)帳可以利用上文中描述的 IPN,從而允許其它實(shí)時(shí)處理選項(xiàng)。 下面的代碼段來(lái)自 SDK 示例。
$amount =& Services_PayPal::getType('BasicAmountType');
$amount->setval();
$amount->setattr('currencyID', 'USD');
$ecd =& Services_PayPal::getType('SetExpressCheckoutRequestDetailsType');
$ecd->setOrderTotal($amount);
$ecd->setReturnURL('http://widgetco.com/return');
$ecd->setCancelURL('http://widgetco.com/cancel');
$ec =& Services_PayPal::getType('SetExpressCheckoutRequestType');
$ec->setSetExpressCheckoutRequestDetails($ecd);
$response = $caller->SetExpressCheckout($ec);
此調(diào)用的結(jié)果將提供一個(gè)令牌,您可以將其添加到一個(gè)鏈路,或者在網(wǎng)站上將其重定向到 PayPal 。 然后,用戶(hù)使用 PayPal 處理業(yè)務(wù)。在操作成功或失敗后,系統(tǒng)將用戶(hù)重定向到您的網(wǎng)站。 在本示例中,調(diào)用的頁(yè)面返回將向您的應(yīng)用程序發(fā)送以下 API 調(diào)用:
$ecd =& Services_PayPal::getType('GetExpressCheckoutDetailsRequestType');
$ecd->setToken('');
$response = $caller->GetExpressCheckoutDetails($ecd);
這里包含您需要的所有事務(wù)信息,但不包含信用卡號(hào)等敏感信息。 用戶(hù)在您的網(wǎng)站上對(duì)這些值進(jìn)行確認(rèn)后,由最終 API 調(diào)用處理資金事務(wù):
$amount =& Services_PayPal::getType('BasicAmountType');
$amount->setval();
$amount->setattr('currencyID', 'USD');
$pdt =& Services_PayPal::getType('PaymentDetailsType');
$pdt->setOrderTotal($amount);
$details =& Services_PayPal::getType('DoExpressCheckoutPaymentRequestDetailsType');
$details->setPaymentAction('Sale');
$details->setToken('');
$details->setPayerID('juser@jisp.com');
$details->setPaymentDetails($pdt);
$ecprt =& Services_PayPal::getType('DoExpressCheckoutPaymentRequestType');
$ecprt->setDoExpressCheckoutPaymentRequestDetails($details);
$response = $caller->DoExpressCheckoutPayment($ecprt);
同樣,在對(duì) updateChart 進(jìn)行連續(xù)調(diào)用時(shí),ChartData 將引發(fā) onResult 方法:
_root.chartData.onResult = function() {
_root.chart.throbber._visible = false;
drawChart(this);
}
快速結(jié)帳幾乎與直接付款具有相同的定制 性,同時(shí)還保持了標(biāo)準(zhǔn)結(jié)帳的保密和安全優(yōu)勢(shì)。
PayPal 支付處理的任何一種形式都提供了收集在線付款的有效方式。 由實(shí)施者決定哪種方式更加適合: 標(biāo)準(zhǔn)結(jié)帳為小型機(jī)構(gòu)提供了收集付款的能力,且不需要這些機(jī)構(gòu)投資其它安全體系結(jié)構(gòu);在與當(dāng)前的企業(yè)應(yīng)用程序集成時(shí),直接付款是理想的解決方案;而快速結(jié)帳 介于兩者之間,適合將其更改成第三方產(chǎn)品。 選擇靈活性、安全性和實(shí)施便捷性之間的平衡點(diǎn)將允許您利用現(xiàn)有的 Oracle 基礎(chǔ)架構(gòu)獲得在線支付功能。
posted @ 2010-06-23 09:12 lina 閱讀(1225) | 評(píng)論 (0) | 編輯 收藏